From 3646eb4a1518c884785bf0963fcb51b06360da35 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Tue, 15 Aug 2023 09:37:54 -0400 Subject: [PATCH 001/165] pr env synchronize, ignore auth for pr --- .github/workflows/deploy-pr.yml | 38 +++++++++++++------ angular.json | 21 ++++++++++ package.json | 1 + src/app/core/guards/auth.guard.ts | 4 ++ .../group-card/group-card.component.html | 19 ++++++++++ src/app/features/groups/groups.module.ts | 15 +++++++- src/app/features/home/home.component.html | 13 +++++++ src/environments/environment.pr.ts | 9 +++++ src/environments/environment.prod.ts | 1 + src/environments/environment.ts | 1 + 10 files changed, 109 insertions(+), 13 deletions(-) create mode 100644 src/app/features/groups/components/group-card/group-card.component.html create mode 100644 src/environments/environment.pr.ts diff --git a/.github/workflows/deploy-pr.yml b/.github/workflows/deploy-pr.yml index c0814843..1f0484ce 100644 --- a/.github/workflows/deploy-pr.yml +++ b/.github/workflows/deploy-pr.yml @@ -4,7 +4,7 @@ name: Deploy PR on: pull_request: - types: [opened, reopened] + types: [opened, reopened, synchronize] branches: master env: @@ -30,7 +30,11 @@ jobs: with: azcliversion: 2.30.0 inlineScript: | - az deployment sub create -l ${{ env.LOCATION }} -f ./.bicep/pr-instance-setup.bicep --parameters prNumber=${{ github.event.number }} location=${{ env.LOCATION }} + if [[ ${{ github.event.action }} == "synchronize" ]]; then + az deployment sub create -l ${{ env.LOCATION }} -f ./.bicep/pr-instance-setup.bicep --parameters prNumber=${{ github.event.number }} location=${{ env.LOCATION }} + else + echo "This has already been deployed." + fi store: name: Store Publishing Profile @@ -45,8 +49,12 @@ jobs: - name: Get Publishing Profile id: get-publishing-profile run: | - profile=$(az webapp deployment list-publishing-profiles --resource-group ${{ env.AZURE_WEBAPP_NAME }} --name ${{ env.AZURE_WEBAPP_NAME }} --xml | sed -e 's|\"<|<|g' | sed -e 's|>\"|>|g' | sed -e 's|\\"|"|g' | sed -e 's|\\\\|\\|g') - echo "::set-output name=profile::$profile" + if [[ ${{ github.event.action }} == "synchronize" ]]; then + profile=$(az webapp deployment list-publishing-profiles --resource-group ${{ env.AZURE_WEBAPP_NAME }} --name ${{ env.AZURE_WEBAPP_NAME }} --xml | sed -e 's|\"<|<|g' | sed -e 's|>\"|>|g' | sed -e 's|\\"|"|g' | sed -e 's|\\\\|\\|g') + echo "::set-output name=profile::$profile" + else + echo "Publishing profile has already been retrieved." + fi - name: GitHub Auth Login shell: bash @@ -55,8 +63,12 @@ jobs: - uses: actions/checkout@master - name: Create Secret run: | - escaped_profile=$(printf "%q" "${{ env.PROFILE }}") - gh secret set "${{ env.SECRET_NAME }}" --body "$escaped_profile" + if [[ ${{ github.event.action }} == "synchronize" ]]; then + escaped_profile=$(printf "%q" "${{ env.PROFILE }}") + gh secret set "${{ env.SECRET_NAME }}" --body "$escaped_profile" + else + echo "Secret has already been stored." + fi env: PROFILE: ${{ steps.get-publishing-profile.outputs.profile }} @@ -68,10 +80,14 @@ jobs: - name: Create Environment shell: bash run: | - curl -X POST "https://api.github.com/repos/gctools-outilsgc/gccollab-frontend/environments" \ - -H "Authorization: token ${{ env.ACCESS_TOKEN }}" \ - -H "Accept: application/vnd.github.v3+json" \ - -d "{\"name\":\"PR ${{ github.event.number }}\"}" + if [[ ${{ github.event.action }} == "synchronize" ]]; then + curl -X POST "https://api.github.com/repos/gctools-outilsgc/gccollab-frontend/environments" \ + -H "Authorization: token ${{ env.ACCESS_TOKEN }}" \ + -H "Accept: application/vnd.github.v3+json" \ + -d "{\"name\":\"PR ${{ github.event.number }}\"}" + else + echo "Environment has already been created." + fi build-test-and-deploy: name: Build, Test and Deploy @@ -91,7 +107,7 @@ jobs: run: npm install - name: Build - run: npm run build-dev --if-present + run: npm run build-pr --if-present - name: Test run: npm run test --if-present -- --watch=false --browsers=ChromeHeadless diff --git a/angular.json b/angular.json index 3b6c948d..7ea82da3 100644 --- a/angular.json +++ b/angular.json @@ -72,6 +72,27 @@ "extractLicenses": false, "sourceMap": true, "namedChunks": true + }, + "pullrequest": { + "budgets": [ + { + "type": "initial", + "maximumWarning": "1mb", + "maximumError": "100mb" + } + ], + "buildOptimizer": false, + "optimization": false, + "vendorChunk": true, + "extractLicenses": false, + "sourceMap": true, + "namedChunks": true, + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + } + ] } }, "defaultConfiguration": "production" diff --git a/package.json b/package.json index 0bee33a8..795b82de 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@ "build": "ng build", "build-dev": "ng build --configuration development", "build-prod": "ng build --configuration production", + "build-pr": "ng build --configuration pullrequest", "watch": "ng build --watch --configuration development", "test": "ng test", "install-graphviz-linux": "sudo apt install graphviz", diff --git a/src/app/core/guards/auth.guard.ts b/src/app/core/guards/auth.guard.ts index 50906537..40315bf0 100644 --- a/src/app/core/guards/auth.guard.ts +++ b/src/app/core/guards/auth.guard.ts @@ -4,6 +4,7 @@ import { OidcSecurityService } from 'angular-auth-oidc-client'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; import { SessionStorageService } from '../services/session-storage.service'; +import { environment } from '../../../environments/environment' /** * A `CanActivate` route guard that ensured the user is authenticated. @@ -22,6 +23,9 @@ export class AuthGuard { canActivate( route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable | Promise | boolean | UrlTree { + if (!environment.authEnabled) + return true; + return this.oidcSecurityService.isAuthenticated$.pipe( map(({ isAuthenticated }) => { diff --git a/src/app/features/groups/components/group-card/group-card.component.html b/src/app/features/groups/components/group-card/group-card.component.html new file mode 100644 index 00000000..ce08410a --- /dev/null +++ b/src/app/features/groups/components/group-card/group-card.component.html @@ -0,0 +1,19 @@ + + + +
+ +
+ +
+ +
+ {{ model?.name }} +
+
+ {{ model?.groupStatus }} +
+ +
+
\ No newline at end of file diff --git a/src/app/features/groups/groups.module.ts b/src/app/features/groups/groups.module.ts index 6e414522..f1085cb0 100644 --- a/src/app/features/groups/groups.module.ts +++ b/src/app/features/groups/groups.module.ts @@ -3,14 +3,25 @@ import { CommonModule } from '@angular/common'; import { GroupsRoutingModule } from './groups-routing.module'; import { SharedModule } from 'src/app/shared/shared.module'; +import { GroupCardComponent } from './components/group-card/group-card.component'; +import { MatCardModule } from '@angular/material/card'; +import { GroupListComponent } from './components/group-list/group-list.component'; @NgModule({ - declarations: [], + declarations: [ + GroupCardComponent, + GroupListComponent + ], imports: [ CommonModule, GroupsRoutingModule, - SharedModule + SharedModule, + MatCardModule + ], + exports: [ + GroupCardComponent, + GroupListComponent ] }) export class GroupsModule { } diff --git a/src/app/features/home/home.component.html b/src/app/features/home/home.component.html index 6e3df822..45208960 100644 --- a/src/app/features/home/home.component.html +++ b/src/app/features/home/home.component.html @@ -43,6 +43,19 @@ + + +
+ + + + +
\ No newline at end of file diff --git a/src/environments/environment.pr.ts b/src/environments/environment.pr.ts new file mode 100644 index 00000000..fa632d46 --- /dev/null +++ b/src/environments/environment.pr.ts @@ -0,0 +1,9 @@ +export const environment = { + production: false, + authEnabled: false, // TODO: Switch this to true once we have OAuth working for PR + clientId: "429862", // TODO: Create client during workflow and insert here + baseUrl: "https://dev.account.gccollab.ca/api", + authUrl: "https://dev.account.gccollab.ca/openid", + authLogLevel: 0, + i18nFolder: "./assets/i18n/" +} \ No newline at end of file diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts index c5c17ab6..dd8036a4 100644 --- a/src/environments/environment.prod.ts +++ b/src/environments/environment.prod.ts @@ -1,6 +1,7 @@ // TODO: Update clientId, urls from dev to prod export const environment = { production: true, + authEnabled: true, clientId: "429862", baseUrl: "https://dev.account.gccollab.ca/api", authUrl: "https://dev.account.gccollab.ca/openid", diff --git a/src/environments/environment.ts b/src/environments/environment.ts index 666ec2ce..a5d67dd3 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.ts @@ -4,6 +4,7 @@ export const environment = { production: false, + authEnabled: true, clientId: "429862", baseUrl: "https://dev.account.gccollab.ca/api", //Devskim: ignore DS137138 authUrl: "https://dev.account.gccollab.ca/openid", From 585632f745bfdcc6255f4466d11d8a4865d97ff8 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Tue, 15 Aug 2023 09:48:41 -0400 Subject: [PATCH 002/165] minor --- .github/workflows/deploy-pr.yml | 8 ++++---- src/app/features/groups/groups.module.ts | 8 ++------ 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/.github/workflows/deploy-pr.yml b/.github/workflows/deploy-pr.yml index 1f0484ce..7ef7c554 100644 --- a/.github/workflows/deploy-pr.yml +++ b/.github/workflows/deploy-pr.yml @@ -30,7 +30,7 @@ jobs: with: azcliversion: 2.30.0 inlineScript: | - if [[ ${{ github.event.action }} == "synchronize" ]]; then + if [[ ${{ github.event.action }} != "synchronize" ]]; then az deployment sub create -l ${{ env.LOCATION }} -f ./.bicep/pr-instance-setup.bicep --parameters prNumber=${{ github.event.number }} location=${{ env.LOCATION }} else echo "This has already been deployed." @@ -49,7 +49,7 @@ jobs: - name: Get Publishing Profile id: get-publishing-profile run: | - if [[ ${{ github.event.action }} == "synchronize" ]]; then + if [[ ${{ github.event.action }} != "synchronize" ]]; then profile=$(az webapp deployment list-publishing-profiles --resource-group ${{ env.AZURE_WEBAPP_NAME }} --name ${{ env.AZURE_WEBAPP_NAME }} --xml | sed -e 's|\"<|<|g' | sed -e 's|>\"|>|g' | sed -e 's|\\"|"|g' | sed -e 's|\\\\|\\|g') echo "::set-output name=profile::$profile" else @@ -63,7 +63,7 @@ jobs: - uses: actions/checkout@master - name: Create Secret run: | - if [[ ${{ github.event.action }} == "synchronize" ]]; then + if [[ ${{ github.event.action }} != "synchronize" ]]; then escaped_profile=$(printf "%q" "${{ env.PROFILE }}") gh secret set "${{ env.SECRET_NAME }}" --body "$escaped_profile" else @@ -80,7 +80,7 @@ jobs: - name: Create Environment shell: bash run: | - if [[ ${{ github.event.action }} == "synchronize" ]]; then + if [[ ${{ github.event.action }} != "synchronize" ]]; then curl -X POST "https://api.github.com/repos/gctools-outilsgc/gccollab-frontend/environments" \ -H "Authorization: token ${{ env.ACCESS_TOKEN }}" \ -H "Accept: application/vnd.github.v3+json" \ diff --git a/src/app/features/groups/groups.module.ts b/src/app/features/groups/groups.module.ts index f1085cb0..b1a1e0e6 100644 --- a/src/app/features/groups/groups.module.ts +++ b/src/app/features/groups/groups.module.ts @@ -3,15 +3,12 @@ import { CommonModule } from '@angular/common'; import { GroupsRoutingModule } from './groups-routing.module'; import { SharedModule } from 'src/app/shared/shared.module'; -import { GroupCardComponent } from './components/group-card/group-card.component'; import { MatCardModule } from '@angular/material/card'; -import { GroupListComponent } from './components/group-list/group-list.component'; @NgModule({ declarations: [ - GroupCardComponent, - GroupListComponent + ], imports: [ CommonModule, @@ -20,8 +17,7 @@ import { GroupListComponent } from './components/group-list/group-list.component MatCardModule ], exports: [ - GroupCardComponent, - GroupListComponent + ] }) export class GroupsModule { } From d919191f42b8d795ce3781b744101dce43211589 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Tue, 15 Aug 2023 09:57:57 -0400 Subject: [PATCH 003/165] minor --- src/app/features/home/home.component.html | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/app/features/home/home.component.html b/src/app/features/home/home.component.html index 45208960..6e3df822 100644 --- a/src/app/features/home/home.component.html +++ b/src/app/features/home/home.component.html @@ -43,19 +43,6 @@ - - -
- - - - -
\ No newline at end of file From b62b62c555236699d4d1de7b33763408229125e6 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Tue, 15 Aug 2023 10:34:17 -0400 Subject: [PATCH 004/165] replace environment with pr environment on pr build --- angular.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/angular.json b/angular.json index 7ea82da3..b29e70bd 100644 --- a/angular.json +++ b/angular.json @@ -90,7 +90,7 @@ "fileReplacements": [ { "replace": "src/environments/environment.ts", - "with": "src/environments/environment.prod.ts" + "with": "src/environments/environment.pr.ts" } ] } From f69321ac22424e424537a202355fb4ade7e5e946 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Tue, 15 Aug 2023 13:11:13 -0400 Subject: [PATCH 005/165] minor --- .github/workflows/deploy-pr.yml | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/.github/workflows/deploy-pr.yml b/.github/workflows/deploy-pr.yml index 7ef7c554..80f3e4c4 100644 --- a/.github/workflows/deploy-pr.yml +++ b/.github/workflows/deploy-pr.yml @@ -33,7 +33,7 @@ jobs: if [[ ${{ github.event.action }} != "synchronize" ]]; then az deployment sub create -l ${{ env.LOCATION }} -f ./.bicep/pr-instance-setup.bicep --parameters prNumber=${{ github.event.number }} location=${{ env.LOCATION }} else - echo "This has already been deployed." + echo "The Azure resources have already been created." fi store: @@ -49,12 +49,8 @@ jobs: - name: Get Publishing Profile id: get-publishing-profile run: | - if [[ ${{ github.event.action }} != "synchronize" ]]; then - profile=$(az webapp deployment list-publishing-profiles --resource-group ${{ env.AZURE_WEBAPP_NAME }} --name ${{ env.AZURE_WEBAPP_NAME }} --xml | sed -e 's|\"<|<|g' | sed -e 's|>\"|>|g' | sed -e 's|\\"|"|g' | sed -e 's|\\\\|\\|g') - echo "::set-output name=profile::$profile" - else - echo "Publishing profile has already been retrieved." - fi + profile=$(az webapp deployment list-publishing-profiles --resource-group ${{ env.AZURE_WEBAPP_NAME }} --name ${{ env.AZURE_WEBAPP_NAME }} --xml | sed -e 's|\"<|<|g' | sed -e 's|>\"|>|g' | sed -e 's|\\"|"|g' | sed -e 's|\\\\|\\|g') + echo "::set-output name=profile::$profile" - name: GitHub Auth Login shell: bash @@ -63,12 +59,8 @@ jobs: - uses: actions/checkout@master - name: Create Secret run: | - if [[ ${{ github.event.action }} != "synchronize" ]]; then - escaped_profile=$(printf "%q" "${{ env.PROFILE }}") - gh secret set "${{ env.SECRET_NAME }}" --body "$escaped_profile" - else - echo "Secret has already been stored." - fi + escaped_profile=$(printf "%q" "${{ env.PROFILE }}") + gh secret set "${{ env.SECRET_NAME }}" --body "$escaped_profile" env: PROFILE: ${{ steps.get-publishing-profile.outputs.profile }} From 1ae80aa66d5b9617c0094098b7aa197499caf686 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Wed, 16 Aug 2023 09:39:49 -0400 Subject: [PATCH 006/165] minor --- .github/workflows/deploy-pr.yml | 2 +- angular.json | 3 +++ src/app/core/guards/auth.guard.ts | 2 +- src/environments/environment.pr.ts | 2 +- src/environments/environment.prod.ts | 2 +- src/environments/environment.ts | 2 +- 6 files changed, 8 insertions(+), 5 deletions(-) diff --git a/.github/workflows/deploy-pr.yml b/.github/workflows/deploy-pr.yml index 80f3e4c4..fd0041c6 100644 --- a/.github/workflows/deploy-pr.yml +++ b/.github/workflows/deploy-pr.yml @@ -4,7 +4,7 @@ name: Deploy PR on: pull_request: - types: [opened, reopened, synchronize] + types: [opened, reopened] # TODO: synchronize branches: master env: diff --git a/angular.json b/angular.json index b29e70bd..2ed31bb5 100644 --- a/angular.json +++ b/angular.json @@ -105,6 +105,9 @@ }, "development": { "browserTarget": "gccollab-frontend:build:development" + }, + "pullrequest": { + "browserTarget": "gccollab-frontend:build:pullrequest" } }, "defaultConfiguration": "development" diff --git a/src/app/core/guards/auth.guard.ts b/src/app/core/guards/auth.guard.ts index 40315bf0..13c1640f 100644 --- a/src/app/core/guards/auth.guard.ts +++ b/src/app/core/guards/auth.guard.ts @@ -23,7 +23,7 @@ export class AuthGuard { canActivate( route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable | Promise | boolean | UrlTree { - if (!environment.authEnabled) + if (!environment.authGuard) return true; return this.oidcSecurityService.isAuthenticated$.pipe( diff --git a/src/environments/environment.pr.ts b/src/environments/environment.pr.ts index fa632d46..8c3de47b 100644 --- a/src/environments/environment.pr.ts +++ b/src/environments/environment.pr.ts @@ -1,6 +1,6 @@ export const environment = { production: false, - authEnabled: false, // TODO: Switch this to true once we have OAuth working for PR + authGuard: false, // TODO: Switch this to true once we have OAuth working for PR clientId: "429862", // TODO: Create client during workflow and insert here baseUrl: "https://dev.account.gccollab.ca/api", authUrl: "https://dev.account.gccollab.ca/openid", diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts index dd8036a4..b1dcd125 100644 --- a/src/environments/environment.prod.ts +++ b/src/environments/environment.prod.ts @@ -1,7 +1,7 @@ // TODO: Update clientId, urls from dev to prod export const environment = { production: true, - authEnabled: true, + authGuard: true, clientId: "429862", baseUrl: "https://dev.account.gccollab.ca/api", authUrl: "https://dev.account.gccollab.ca/openid", diff --git a/src/environments/environment.ts b/src/environments/environment.ts index a5d67dd3..9e11493f 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.ts @@ -4,7 +4,7 @@ export const environment = { production: false, - authEnabled: true, + authGuard: true, clientId: "429862", baseUrl: "https://dev.account.gccollab.ca/api", //Devskim: ignore DS137138 authUrl: "https://dev.account.gccollab.ca/openid", From 98bd6cd7a54c57cbd5847757c746460f37514bcf Mon Sep 17 00:00:00 2001 From: Shea Date: Wed, 16 Aug 2023 13:47:36 +0000 Subject: [PATCH 007/165] Dependency Graph --- dependency-graph.svg | 3023 +++++++++++++++++++++--------------------- 1 file changed, 1519 insertions(+), 1504 deletions(-) diff --git a/dependency-graph.svg b/dependency-graph.svg index 06d93bb0..5d42eba1 100644 --- a/dependency-graph.svg +++ b/dependency-graph.svg @@ -4,357 +4,357 @@ - - + + dependency-cruiser output - + cluster_src - -src + +src cluster_src/app - -app + +app cluster_src/app/core - -core + +core cluster_src/app/core/auth - -auth + +auth cluster_src/app/core/constants - -constants + +constants cluster_src/app/core/guards - -guards + +guards cluster_src/app/core/helpers - -helpers + +helpers cluster_src/app/core/interceptors - -interceptors + +interceptors cluster_src/app/core/models - -models + +models cluster_src/app/core/services - -services + +services cluster_src/app/features - -features + +features cluster_src/app/features/about - -about + +about cluster_src/app/features/blog - -blog + +blog cluster_src/app/features/bookmarks - -bookmarks + +bookmarks cluster_src/app/features/dashboard - -dashboard + +dashboard cluster_src/app/features/events - -events + +events cluster_src/app/features/events/components - -components + +components cluster_src/app/features/events/components/event-card - -event-card + +event-card cluster_src/app/features/events/components/event-list - -event-list + +event-list cluster_src/app/features/events/models - -models + +models cluster_src/app/features/friends - -friends + +friends cluster_src/app/features/groups - -groups + +groups cluster_src/app/features/groups/components - -components + +components cluster_src/app/features/groups/components/group-card - -group-card + +group-card cluster_src/app/features/groups/components/group-list - -group-list + +group-list cluster_src/app/features/groups/models - -models + +models cluster_src/app/features/home - -home + +home cluster_src/app/features/invite - -invite + +invite cluster_src/app/features/login - -login + +login cluster_src/app/features/members - -members + +members cluster_src/app/features/messages - -messages + +messages cluster_src/app/features/missions - -missions + +missions cluster_src/app/features/news-feed - -news-feed + +news-feed cluster_src/app/features/news-feed/components - -components + +components cluster_src/app/features/news-feed/components/news-card - -news-card + +news-card cluster_src/app/features/news-feed/components/news-list - -news-list + +news-list cluster_src/app/features/news-feed/models - -models + +models cluster_src/app/features/privacy - -privacy + +privacy cluster_src/app/features/profile - -profile + +profile cluster_src/app/features/profile/components - -components + +components cluster_src/app/features/profile/components/profile-card - -profile-card + +profile-card cluster_src/app/features/profile/components/profile-list - -profile-list + +profile-list cluster_src/app/features/register - -register + +register cluster_src/app/features/search - -search + +search cluster_src/app/features/settings - -settings + +settings cluster_src/app/features/splash - -splash + +splash cluster_src/app/features/stats - -stats + +stats cluster_src/app/features/terms - -terms + +terms cluster_src/app/features/the-wire - -the-wire + +the-wire cluster_src/app/shared - -shared + +shared cluster_src/app/shared/components - -components + +components cluster_src/app/shared/components/banner - -banner + +banner cluster_src/app/shared/components/button - -button + +button cluster_src/app/shared/components/editor - -editor + +editor cluster_src/app/shared/components/footer - -footer + +footer cluster_src/app/shared/components/forbidden - -forbidden + +forbidden cluster_src/app/shared/components/header - -header + +header cluster_src/app/shared/components/input - -input + +input cluster_src/app/shared/components/language-selector - -language-selector + +language-selector cluster_src/app/shared/components/not-found - -not-found + +not-found cluster_src/app/shared/components/page-title - -page-title + +page-title cluster_src/app/shared/components/profile-pic - -profile-pic + +profile-pic cluster_src/app/shared/components/unauthorized - -unauthorized + +unauthorized cluster_src/app/shared/factories - -factories + +factories cluster_src/app/shared/models - -models + +models cluster_src/assets - -assets + +assets cluster_src/assets/i18n - -i18n + +i18n cluster_src/environments - -environments + +environments src/app/app-routing.module.ts - -app-routing.module.ts + +app-routing.module.ts @@ -362,1401 +362,1416 @@ src/app/core/constants/routes.constants.ts - -routes.constants.ts + +routes.constants.ts src/app/app-routing.module.ts->src/app/core/constants/routes.constants.ts - - + + src/app/core/guards/auth.guard.ts - -auth.guard.ts + +auth.guard.ts src/app/app-routing.module.ts->src/app/core/guards/auth.guard.ts - - + + src/app/core/guards/interceptor.guard.ts - -interceptor.guard.ts + +interceptor.guard.ts src/app/app-routing.module.ts->src/app/core/guards/interceptor.guard.ts - - + + src/app/core/guards/login.guard.ts - -login.guard.ts + +login.guard.ts src/app/app-routing.module.ts->src/app/core/guards/login.guard.ts - - + + src/app/core/guards/redirect.guard.ts - -redirect.guard.ts + +redirect.guard.ts src/app/app-routing.module.ts->src/app/core/guards/redirect.guard.ts - - + + src/app/core/services/translations.service.ts - -translations.service.ts + +translations.service.ts src/app/app-routing.module.ts->src/app/core/services/translations.service.ts - - + + src/app/features/about/about.module.ts - -about.module.ts + +about.module.ts src/app/app-routing.module.ts->src/app/features/about/about.module.ts - - - - + + + + src/app/features/blog/blog.module.ts - -blog.module.ts + +blog.module.ts src/app/app-routing.module.ts->src/app/features/blog/blog.module.ts - - - - + + + + src/app/features/bookmarks/bookmarks.module.ts - -bookmarks.module.ts + +bookmarks.module.ts src/app/app-routing.module.ts->src/app/features/bookmarks/bookmarks.module.ts - - - - + + + + src/app/features/dashboard/dashboard.module.ts - -dashboard.module.ts + +dashboard.module.ts src/app/app-routing.module.ts->src/app/features/dashboard/dashboard.module.ts - - - - + + + + src/app/features/events/events.module.ts - -events.module.ts + +events.module.ts src/app/app-routing.module.ts->src/app/features/events/events.module.ts - - - - + + + + src/app/features/friends/friends.module.ts - -friends.module.ts + +friends.module.ts src/app/app-routing.module.ts->src/app/features/friends/friends.module.ts - - - - + + + + src/app/features/groups/groups.module.ts - -groups.module.ts + +groups.module.ts src/app/app-routing.module.ts->src/app/features/groups/groups.module.ts - - - - + + + + src/app/features/home/home.module.ts - -home.module.ts + +home.module.ts src/app/app-routing.module.ts->src/app/features/home/home.module.ts - - - - + + + + src/app/features/invite/invite.module.ts - -invite.module.ts + +invite.module.ts src/app/app-routing.module.ts->src/app/features/invite/invite.module.ts - - - - + + + + src/app/features/login/login.module.ts - -login.module.ts + +login.module.ts src/app/app-routing.module.ts->src/app/features/login/login.module.ts - - - - + + + + src/app/features/members/members.module.ts - -members.module.ts + +members.module.ts src/app/app-routing.module.ts->src/app/features/members/members.module.ts - - - - + + + + src/app/features/messages/messages.module.ts - -messages.module.ts + +messages.module.ts src/app/app-routing.module.ts->src/app/features/messages/messages.module.ts - - - - + + + + src/app/features/missions/missions.module.ts - -missions.module.ts + +missions.module.ts src/app/app-routing.module.ts->src/app/features/missions/missions.module.ts - - - - + + + + src/app/features/news-feed/news-feed.module.ts - -news-feed.module.ts + +news-feed.module.ts src/app/app-routing.module.ts->src/app/features/news-feed/news-feed.module.ts - - - - + + + + src/app/features/privacy/privacy.module.ts - -privacy.module.ts + +privacy.module.ts src/app/app-routing.module.ts->src/app/features/privacy/privacy.module.ts - - - - + + + + src/app/features/profile/profile.module.ts - -profile.module.ts + +profile.module.ts src/app/app-routing.module.ts->src/app/features/profile/profile.module.ts - - - - + + + + src/app/features/register/register.module.ts - -register.module.ts + +register.module.ts src/app/app-routing.module.ts->src/app/features/register/register.module.ts - - - - + + + + src/app/features/search/search.module.ts - -search.module.ts + +search.module.ts src/app/app-routing.module.ts->src/app/features/search/search.module.ts - - - - + + + + src/app/features/settings/settings.module.ts - -settings.module.ts + +settings.module.ts src/app/app-routing.module.ts->src/app/features/settings/settings.module.ts - - - - + + + + src/app/features/splash/splash.module.ts - -splash.module.ts + +splash.module.ts src/app/app-routing.module.ts->src/app/features/splash/splash.module.ts - - - - + + + + src/app/features/stats/stats.module.ts - -stats.module.ts + +stats.module.ts src/app/app-routing.module.ts->src/app/features/stats/stats.module.ts - - - - + + + + src/app/features/terms/terms.module.ts - -terms.module.ts + +terms.module.ts src/app/app-routing.module.ts->src/app/features/terms/terms.module.ts - - - - + + + + src/app/features/the-wire/the-wire.module.ts - -the-wire.module.ts + +the-wire.module.ts src/app/app-routing.module.ts->src/app/features/the-wire/the-wire.module.ts - - - - + + + + src/app/shared/components/banner/banner.component.ts - -banner.component.ts + +banner.component.ts src/app/app-routing.module.ts->src/app/shared/components/banner/banner.component.ts - - + + src/app/shared/components/forbidden/forbidden.component.ts - -forbidden.component.ts + +forbidden.component.ts src/app/app-routing.module.ts->src/app/shared/components/forbidden/forbidden.component.ts - - + + src/app/shared/components/not-found/not-found.component.ts - -not-found.component.ts + +not-found.component.ts src/app/app-routing.module.ts->src/app/shared/components/not-found/not-found.component.ts - - + + src/app/shared/components/unauthorized/unauthorized.component.ts - -unauthorized.component.ts + +unauthorized.component.ts src/app/app-routing.module.ts->src/app/shared/components/unauthorized/unauthorized.component.ts - - + + src/app/core/services/session-storage.service.ts - -session-storage.service.ts + +session-storage.service.ts - + src/app/core/guards/auth.guard.ts->src/app/core/services/session-storage.service.ts - - + + + + + +src/environments/environment.ts + + +environment.ts + + + + + +src/app/core/guards/auth.guard.ts->src/environments/environment.ts + + - + src/app/core/guards/interceptor.guard.ts->src/app/core/services/session-storage.service.ts - - + + src/assets/i18n/translations.en.ts - -translations.en.ts + +translations.en.ts - + src/app/core/services/translations.service.ts->src/assets/i18n/translations.en.ts - - + + src/app/shared/shared.module.ts - -shared.module.ts + +shared.module.ts - + src/app/features/about/about.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/about/about-routing.module.ts - -about-routing.module.ts + +about-routing.module.ts - + src/app/features/about/about.module.ts->src/app/features/about/about-routing.module.ts - - + + src/app/features/about/about.component.ts - -about.component.ts + +about.component.ts - + src/app/features/about/about.module.ts->src/app/features/about/about.component.ts - - + + - + src/app/features/blog/blog.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/blog/blog-routing.module.ts - -blog-routing.module.ts + +blog-routing.module.ts - + src/app/features/blog/blog.module.ts->src/app/features/blog/blog-routing.module.ts - - + + - + src/app/features/bookmarks/bookmarks.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/bookmarks/bookmarks-routing.module.ts - -bookmarks-routing.module.ts + +bookmarks-routing.module.ts - + src/app/features/bookmarks/bookmarks.module.ts->src/app/features/bookmarks/bookmarks-routing.module.ts - - + + - + src/app/features/dashboard/dashboard.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/dashboard/dashboard-routing.module.ts - -dashboard-routing.module.ts + +dashboard-routing.module.ts - + src/app/features/dashboard/dashboard.module.ts->src/app/features/dashboard/dashboard-routing.module.ts - - + + - + src/app/features/events/events.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/events/components/event-card/event-card.component.ts - -event-card.component.ts + +event-card.component.ts - + src/app/features/events/events.module.ts->src/app/features/events/components/event-card/event-card.component.ts - - + + src/app/features/events/components/event-list/event-list.component.ts - -event-list.component.ts + +event-list.component.ts - + src/app/features/events/events.module.ts->src/app/features/events/components/event-list/event-list.component.ts - - + + src/app/features/events/events-routing.module.ts - -events-routing.module.ts + +events-routing.module.ts - + src/app/features/events/events.module.ts->src/app/features/events/events-routing.module.ts - - + + - + src/app/features/friends/friends.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/friends/friends-routing.module.ts - -friends-routing.module.ts + +friends-routing.module.ts - + src/app/features/friends/friends.module.ts->src/app/features/friends/friends-routing.module.ts - - + + - + src/app/features/groups/groups.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/groups/components/group-card/group-card.component.ts - -group-card.component.ts + +group-card.component.ts - + src/app/features/groups/groups.module.ts->src/app/features/groups/components/group-card/group-card.component.ts - - + + src/app/features/groups/components/group-list/group-list.component.ts - -group-list.component.ts + +group-list.component.ts - + src/app/features/groups/groups.module.ts->src/app/features/groups/components/group-list/group-list.component.ts - - + + src/app/features/groups/groups-routing.module.ts - -groups-routing.module.ts + +groups-routing.module.ts - + src/app/features/groups/groups.module.ts->src/app/features/groups/groups-routing.module.ts - - + + - + src/app/features/home/home.module.ts->src/app/features/events/events.module.ts - - - - + + + + - + src/app/features/home/home.module.ts->src/app/features/groups/groups.module.ts - - - - + + + + - + src/app/features/home/home.module.ts->src/app/features/news-feed/news-feed.module.ts - - - - + + + + - + src/app/features/home/home.module.ts->src/app/features/profile/profile.module.ts - - - - + + + + - + src/app/features/home/home.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/home/home-routing.module.ts - -home-routing.module.ts + +home-routing.module.ts - + src/app/features/home/home.module.ts->src/app/features/home/home-routing.module.ts - - + + src/app/features/home/home.component.ts - -home.component.ts + +home.component.ts - + src/app/features/home/home.module.ts->src/app/features/home/home.component.ts - - + + - + src/app/features/invite/invite.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/invite/invite-routing.module.ts - -invite-routing.module.ts + +invite-routing.module.ts - + src/app/features/invite/invite.module.ts->src/app/features/invite/invite-routing.module.ts - - + + - + src/app/features/login/login.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/login/login-routing.module.ts - -login-routing.module.ts + +login-routing.module.ts - + src/app/features/login/login.module.ts->src/app/features/login/login-routing.module.ts - - + + src/app/features/login/login.component.ts - -login.component.ts + +login.component.ts - + src/app/features/login/login.module.ts->src/app/features/login/login.component.ts - - + + - + src/app/features/members/members.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/members/members-routing.module.ts - -members-routing.module.ts + +members-routing.module.ts - + src/app/features/members/members.module.ts->src/app/features/members/members-routing.module.ts - - + + - + src/app/features/messages/messages.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/messages/messages-routing.module.ts - -messages-routing.module.ts + +messages-routing.module.ts - + src/app/features/messages/messages.module.ts->src/app/features/messages/messages-routing.module.ts - - + + - + src/app/features/missions/missions.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/missions/missions-routing.module.ts - -missions-routing.module.ts + +missions-routing.module.ts - + src/app/features/missions/missions.module.ts->src/app/features/missions/missions-routing.module.ts - - + + - + src/app/features/news-feed/news-feed.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/news-feed/components/news-card/news-card.component.ts - -news-card.component.ts + +news-card.component.ts - + src/app/features/news-feed/news-feed.module.ts->src/app/features/news-feed/components/news-card/news-card.component.ts - - + + src/app/features/news-feed/components/news-list/news-list.component.ts - -news-list.component.ts + +news-list.component.ts - + src/app/features/news-feed/news-feed.module.ts->src/app/features/news-feed/components/news-list/news-list.component.ts - - + + src/app/features/news-feed/news-feed-routing.module.ts - -news-feed-routing.module.ts + +news-feed-routing.module.ts - + src/app/features/news-feed/news-feed.module.ts->src/app/features/news-feed/news-feed-routing.module.ts - - + + - + src/app/features/privacy/privacy.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/privacy/privacy-routing.module.ts - -privacy-routing.module.ts + +privacy-routing.module.ts - + src/app/features/privacy/privacy.module.ts->src/app/features/privacy/privacy-routing.module.ts - - + + src/app/features/privacy/privacy.component.ts - -privacy.component.ts + +privacy.component.ts - + src/app/features/privacy/privacy.module.ts->src/app/features/privacy/privacy.component.ts - - + + - + src/app/features/profile/profile.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/profile/components/profile-card/profile-card.component.ts - -profile-card.component.ts + +profile-card.component.ts - + src/app/features/profile/profile.module.ts->src/app/features/profile/components/profile-card/profile-card.component.ts - - + + src/app/features/profile/components/profile-list/profile-list.component.ts - -profile-list.component.ts + +profile-list.component.ts - + src/app/features/profile/profile.module.ts->src/app/features/profile/components/profile-list/profile-list.component.ts - - + + src/app/features/profile/profile-routing.module.ts - -profile-routing.module.ts + +profile-routing.module.ts - + src/app/features/profile/profile.module.ts->src/app/features/profile/profile-routing.module.ts - - + + - + src/app/features/register/register.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/register/register-routing.module.ts - -register-routing.module.ts + +register-routing.module.ts - + src/app/features/register/register.module.ts->src/app/features/register/register-routing.module.ts - - + + src/app/features/register/register.component.ts - -register.component.ts + +register.component.ts - + src/app/features/register/register.module.ts->src/app/features/register/register.component.ts - - + + - + src/app/features/search/search.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/search/search-routing.module.ts - -search-routing.module.ts + +search-routing.module.ts - + src/app/features/search/search.module.ts->src/app/features/search/search-routing.module.ts - - + + - + src/app/features/settings/settings.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/settings/settings-routing.module.ts - -settings-routing.module.ts + +settings-routing.module.ts - + src/app/features/settings/settings.module.ts->src/app/features/settings/settings-routing.module.ts - - + + - + src/app/features/splash/splash.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/splash/splash-routing.module.ts - -splash-routing.module.ts + +splash-routing.module.ts - + src/app/features/splash/splash.module.ts->src/app/features/splash/splash-routing.module.ts - - + + src/app/features/splash/splash.component.ts - -splash.component.ts + +splash.component.ts - + src/app/features/splash/splash.module.ts->src/app/features/splash/splash.component.ts - - + + - + src/app/features/stats/stats.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/stats/stats-routing.module.ts - -stats-routing.module.ts + +stats-routing.module.ts - + src/app/features/stats/stats.module.ts->src/app/features/stats/stats-routing.module.ts - - + + src/app/features/stats/stats.component.ts - -stats.component.ts + +stats.component.ts - + src/app/features/stats/stats.module.ts->src/app/features/stats/stats.component.ts - - + + - + src/app/features/terms/terms.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/terms/terms-routing.module.ts - -terms-routing.module.ts + +terms-routing.module.ts - + src/app/features/terms/terms.module.ts->src/app/features/terms/terms-routing.module.ts - - + + src/app/features/terms/terms.component.ts - -terms.component.ts + +terms.component.ts - + src/app/features/terms/terms.module.ts->src/app/features/terms/terms.component.ts - - + + - + src/app/features/the-wire/the-wire.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/the-wire/the-wire-routing.module.ts - -the-wire-routing.module.ts + +the-wire-routing.module.ts - + src/app/features/the-wire/the-wire.module.ts->src/app/features/the-wire/the-wire-routing.module.ts - - + + - + src/app/shared/components/banner/banner.component.ts->src/app/core/services/translations.service.ts - - + + src/app/app.component.spec.ts - -app.component.spec.ts + +app.component.spec.ts @@ -1764,504 +1779,495 @@ src/app/app.component.ts - -app.component.ts + +app.component.ts src/app/app.component.spec.ts->src/app/app.component.ts - - + + src/app/core/auth/auth.module.ts - -auth.module.ts + +auth.module.ts src/app/app.component.spec.ts->src/app/core/auth/auth.module.ts - - + + src/app/core/helpers/typescript-loader.ts - -typescript-loader.ts + +typescript-loader.ts src/app/app.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/app.component.ts->src/app/core/constants/routes.constants.ts - - + + src/app/app.component.ts->src/app/core/services/translations.service.ts - - + + src/app/app.component.ts->src/app/shared/components/banner/banner.component.ts - - + + src/app/core/services/language-storage.service.ts - -language-storage.service.ts + +language-storage.service.ts src/app/app.component.ts->src/app/core/services/language-storage.service.ts - - + + src/app/core/auth/auth.module.ts->src/app/core/services/session-storage.service.ts - - - - - -src/environments/environment.ts - - -environment.ts - - + + src/app/core/auth/auth.module.ts->src/environments/environment.ts - - + + src/app/core/services/local-storage-ref.service.ts - -local-storage-ref.service.ts + +local-storage-ref.service.ts - + src/app/core/services/language-storage.service.ts->src/app/core/services/local-storage-ref.service.ts - - + + src/app/app.module.ts - -app.module.ts + +app.module.ts src/app/app.module.ts->src/app/app-routing.module.ts - - - - + + + + src/app/app.module.ts->src/app/app.component.ts - - + + src/app/app.module.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/core/core.module.ts - -core.module.ts + +core.module.ts src/app/app.module.ts->src/app/core/core.module.ts - - - - + + + + src/app/core/services/title.service.ts - -title.service.ts + +title.service.ts src/app/app.module.ts->src/app/core/services/title.service.ts - - + + src/app/features/events/events.component.ts - -events.component.ts + +events.component.ts src/app/app.module.ts->src/app/features/events/events.component.ts - - + + src/app/features/groups/groups.component.ts - -groups.component.ts + +groups.component.ts src/app/app.module.ts->src/app/features/groups/groups.component.ts - - + + src/app/app.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/core/core.module.ts->src/app/core/auth/auth.module.ts - - + + src/app/core/core.module.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/core/core.module.ts->src/app/app.module.ts - - - - + + + + - + src/app/shared/shared.module.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/shared.module.ts->src/app/shared/components/banner/banner.component.ts - - + + - + src/app/shared/shared.module.ts->src/app/shared/components/forbidden/forbidden.component.ts - - + + - + src/app/shared/shared.module.ts->src/app/shared/components/not-found/not-found.component.ts - - + + - + src/app/shared/shared.module.ts->src/app/shared/components/unauthorized/unauthorized.component.ts - - + + - + src/app/shared/shared.module.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/shared.module.ts->src/app/app.module.ts - - - - + + + + src/app/shared/components/button/button.component.ts - -button.component.ts + +button.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/button/button.component.ts - - + + src/app/shared/components/editor/editor.component.ts - -editor.component.ts + +editor.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/editor/editor.component.ts - - + + src/app/shared/factories/editor-config.factory.ts - -editor-config.factory.ts + +editor-config.factory.ts - + src/app/shared/shared.module.ts->src/app/shared/factories/editor-config.factory.ts - - + + src/app/shared/components/footer/footer.component.ts - -footer.component.ts + +footer.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/footer/footer.component.ts - - + + src/app/shared/components/header/header.component.ts - -header.component.ts + +header.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/header/header.component.ts - - + + src/app/shared/components/input/input.component.ts - -input.component.ts + +input.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/input/input.component.ts - - + + src/app/shared/components/language-selector/language-selector.component.ts - -language-selector.component.ts + +language-selector.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/language-selector/language-selector.component.ts - - + + src/app/shared/components/page-title/page-title.component.ts - -page-title.component.ts + +page-title.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/page-title/page-title.component.ts - - + + src/app/shared/components/profile-pic/profile-pic.component.ts - -profile-pic.component.ts + +profile-pic.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/profile-pic/profile-pic.component.ts - - + + - + src/app/core/services/session-storage.service.ts->src/app/core/services/local-storage-ref.service.ts - - + + src/app/core/guards/auth.guard.spec.ts - -auth.guard.spec.ts + +auth.guard.spec.ts src/app/core/guards/auth.guard.spec.ts->src/app/core/guards/auth.guard.ts - - + + src/app/core/guards/auth.guard.spec.ts->src/app/core/auth/auth.module.ts - - + + src/app/core/guards/auth.guard.spec.ts->src/app/core/services/session-storage.service.ts - - + + src/app/core/guards/interceptor.guard.spec.ts - -interceptor.guard.spec.ts + +interceptor.guard.spec.ts - + src/app/core/guards/interceptor.guard.spec.ts->src/app/core/guards/interceptor.guard.ts - - + + src/app/core/guards/login.guard.spec.ts - -login.guard.spec.ts + +login.guard.spec.ts - + src/app/core/guards/login.guard.spec.ts->src/app/core/guards/login.guard.ts - - + + - + src/app/core/guards/login.guard.spec.ts->src/app/core/auth/auth.module.ts - - + + src/app/core/guards/redirect.guard.spec.ts - -redirect.guard.spec.ts + +redirect.guard.spec.ts - + src/app/core/guards/redirect.guard.spec.ts->src/app/core/guards/redirect.guard.ts - - + + src/app/core/guards/role.guard.spec.ts - -role.guard.spec.ts + +role.guard.spec.ts @@ -2269,23 +2275,23 @@ src/app/core/guards/role.guard.ts - -role.guard.ts + +role.guard.ts - + src/app/core/guards/role.guard.spec.ts->src/app/core/guards/role.guard.ts - - + + src/app/core/interceptors/error.interceptor.spec.ts - -error.interceptor.spec.ts + +error.interceptor.spec.ts @@ -2293,23 +2299,23 @@ src/app/core/interceptors/error.interceptor.ts - -error.interceptor.ts + +error.interceptor.ts - + src/app/core/interceptors/error.interceptor.spec.ts->src/app/core/interceptors/error.interceptor.ts - - + + src/app/core/models/person.ts - -person.ts + +person.ts @@ -2317,8 +2323,8 @@ src/app/core/services/event.service.spec.ts - -event.service.spec.ts + +event.service.spec.ts @@ -2326,44 +2332,44 @@ src/app/core/services/event.service.ts - -event.service.ts + +event.service.ts - + src/app/core/services/event.service.spec.ts->src/app/core/services/event.service.ts - - + + src/app/features/events/models/event.ts - -event.ts + +event.ts - + src/app/core/services/event.service.ts->src/app/features/events/models/event.ts - - + + - + src/app/features/events/models/event.ts->src/app/core/models/person.ts - - + + src/app/core/services/group.service.spec.ts - -group.service.spec.ts + +group.service.spec.ts @@ -2371,68 +2377,68 @@ src/app/core/services/group.service.ts - -group.service.ts + +group.service.ts - + src/app/core/services/group.service.spec.ts->src/app/core/services/group.service.ts - - + + src/app/features/groups/models/group.ts - -group.ts + +group.ts - + src/app/core/services/group.service.ts->src/app/features/groups/models/group.ts - - + + src/app/core/services/language-storage.service.spec.ts - -language-storage.service.spec.ts + +language-storage.service.spec.ts - + src/app/core/services/language-storage.service.spec.ts->src/app/core/services/language-storage.service.ts - - + + src/app/core/services/local-storage-ref.service.spec.ts - -local-storage-ref.service.spec.ts + +local-storage-ref.service.spec.ts - + src/app/core/services/local-storage-ref.service.spec.ts->src/app/core/services/local-storage-ref.service.ts - - + + src/app/core/services/news.service.spec.ts - -news.service.spec.ts + +news.service.spec.ts @@ -2440,122 +2446,122 @@ src/app/core/services/news.service.ts - -news.service.ts + +news.service.ts - + src/app/core/services/news.service.spec.ts->src/app/core/services/news.service.ts - - + + - + src/app/core/services/news.service.ts->src/app/core/models/person.ts - - + + src/app/core/services/people.service.ts - -people.service.ts + +people.service.ts - + src/app/core/services/news.service.ts->src/app/core/services/people.service.ts - - + + src/app/features/news-feed/models/news-item.ts - -news-item.ts + +news-item.ts - + src/app/core/services/news.service.ts->src/app/features/news-feed/models/news-item.ts - - + + - + src/app/core/services/people.service.ts->src/app/core/models/person.ts - - + + - + src/app/features/news-feed/models/news-item.ts->src/app/core/models/person.ts - - + + src/app/core/services/people.service.spec.ts - -people.service.spec.ts + +people.service.spec.ts - + src/app/core/services/people.service.spec.ts->src/app/core/services/people.service.ts - - + + src/app/core/services/session-storage.service.spec.ts - -session-storage.service.spec.ts + +session-storage.service.spec.ts - + src/app/core/services/session-storage.service.spec.ts->src/app/core/services/session-storage.service.ts - - + + src/app/core/services/title.service.spec.ts - -title.service.spec.ts + +title.service.spec.ts - + src/app/core/services/title.service.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/core/services/title.service.spec.ts->src/app/core/services/title.service.ts - - + + src/app/core/services/user.service.spec.ts - -user.service.spec.ts + +user.service.spec.ts @@ -2563,1439 +2569,1448 @@ src/app/core/services/user.service.ts - -user.service.ts + +user.service.ts - + src/app/core/services/user.service.spec.ts->src/app/core/services/user.service.ts - - + + - + src/app/features/about/about-routing.module.ts->src/app/features/about/about.component.ts - - + + src/app/features/about/about.component.spec.ts - -about.component.spec.ts + +about.component.spec.ts - + src/app/features/about/about.component.spec.ts->src/app/features/about/about.component.ts - - + + src/app/features/blog/blog.component.ts - -blog.component.ts + +blog.component.ts - + src/app/features/blog/blog-routing.module.ts->src/app/features/blog/blog.component.ts - - + + src/app/features/blog/blog.component.spec.ts - -blog.component.spec.ts + +blog.component.spec.ts - + src/app/features/blog/blog.component.spec.ts->src/app/features/blog/blog.component.ts - - + + src/app/features/bookmarks/bookmarks.component.ts - -bookmarks.component.ts + +bookmarks.component.ts - + src/app/features/bookmarks/bookmarks-routing.module.ts->src/app/features/bookmarks/bookmarks.component.ts - - + + src/app/features/bookmarks/bookmarks.component.spec.ts - -bookmarks.component.spec.ts + +bookmarks.component.spec.ts - + src/app/features/bookmarks/bookmarks.component.spec.ts->src/app/features/bookmarks/bookmarks.component.ts - - + + src/app/features/dashboard/dashboard.component.ts - -dashboard.component.ts + +dashboard.component.ts - + src/app/features/dashboard/dashboard-routing.module.ts->src/app/features/dashboard/dashboard.component.ts - - + + src/app/features/dashboard/dashboard.component.spec.ts - -dashboard.component.spec.ts + +dashboard.component.spec.ts - + src/app/features/dashboard/dashboard.component.spec.ts->src/app/features/dashboard/dashboard.component.ts - - + + src/app/features/events/components/event-card/event-card.component.spec.ts - -event-card.component.spec.ts + +event-card.component.spec.ts - + src/app/features/events/components/event-card/event-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/events/components/event-card/event-card.component.spec.ts->src/app/features/events/components/event-card/event-card.component.ts - - + + - + src/app/features/events/components/event-card/event-card.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/features/events/components/event-card/event-card.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/events/components/event-card/event-card.component.ts->src/app/features/events/models/event.ts - - + + src/app/shared/models/material-button-type.ts - -material-button-type.ts + +material-button-type.ts - + src/app/features/events/components/event-card/event-card.component.ts->src/app/shared/models/material-button-type.ts - - + + src/app/shared/models/tooltip-direction.ts - -tooltip-direction.ts + +tooltip-direction.ts - + src/app/features/events/components/event-card/event-card.component.ts->src/app/shared/models/tooltip-direction.ts - - + + src/app/features/events/components/event-list/event-list.component.spec.ts - -event-list.component.spec.ts + +event-list.component.spec.ts - + src/app/features/events/components/event-list/event-list.component.spec.ts->src/app/features/events/components/event-list/event-list.component.ts - - + + - + src/app/features/events/components/event-list/event-list.component.ts->src/app/features/events/models/event.ts - - + + - + src/app/features/events/events-routing.module.ts->src/app/features/events/events.component.ts - - + + src/app/features/events/events.component.spec.ts - -events.component.spec.ts + +events.component.spec.ts - + src/app/features/events/events.component.spec.ts->src/app/features/events/events.component.ts - - + + src/app/features/friends/friends.component.ts - -friends.component.ts + +friends.component.ts - + src/app/features/friends/friends-routing.module.ts->src/app/features/friends/friends.component.ts - - + + src/app/features/friends/friends.component.spec.ts - -friends.component.spec.ts + +friends.component.spec.ts - + src/app/features/friends/friends.component.spec.ts->src/app/features/friends/friends.component.ts - - + + src/app/features/groups/components/group-card/group-card.component.spec.ts - -group-card.component.spec.ts + +group-card.component.spec.ts - + src/app/features/groups/components/group-card/group-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/groups/components/group-card/group-card.component.spec.ts->src/app/features/groups/components/group-card/group-card.component.ts - - + + - + src/app/features/groups/components/group-card/group-card.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/features/groups/components/group-card/group-card.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/groups/components/group-card/group-card.component.ts->src/app/features/groups/models/group.ts - - + + src/app/features/groups/components/group-list/group-list.component.spec.ts - -group-list.component.spec.ts + +group-list.component.spec.ts - + src/app/features/groups/components/group-list/group-list.component.spec.ts->src/app/features/groups/components/group-list/group-list.component.ts - - + + - + src/app/features/groups/components/group-list/group-list.component.ts->src/app/features/groups/models/group.ts - - + + - + src/app/features/groups/groups-routing.module.ts->src/app/features/groups/groups.component.ts - - + + src/app/features/groups/groups.component.spec.ts - -groups.component.spec.ts + +groups.component.spec.ts - + src/app/features/groups/groups.component.spec.ts->src/app/features/groups/groups.component.ts - - + + - + src/app/features/home/home-routing.module.ts->src/app/features/home/home.component.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/models/person.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/services/event.service.ts - - + + - + src/app/features/home/home.component.ts->src/app/features/events/models/event.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/services/group.service.ts - - + + - + src/app/features/home/home.component.ts->src/app/features/groups/models/group.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/services/news.service.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/services/people.service.ts - - + + - + src/app/features/home/home.component.ts->src/app/features/news-feed/models/news-item.ts - - + + src/app/shared/models/input-type.ts - -input-type.ts + +input-type.ts - + src/app/features/home/home.component.ts->src/app/shared/models/input-type.ts - - + + src/app/features/home/home.component.spec.ts - -home.component.spec.ts + +home.component.spec.ts - + src/app/features/home/home.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/home/home.component.spec.ts->src/app/features/home/home.component.ts - - + + src/app/features/invite/invite.component.ts - -invite.component.ts + +invite.component.ts - + src/app/features/invite/invite-routing.module.ts->src/app/features/invite/invite.component.ts - - + + src/app/features/invite/invite.component.spec.ts - -invite.component.spec.ts + +invite.component.spec.ts - + src/app/features/invite/invite.component.spec.ts->src/app/features/invite/invite.component.ts - - + + - + src/app/features/login/login-routing.module.ts->src/app/features/login/login.component.ts - - + + - + src/app/features/login/login.component.ts->src/app/core/services/translations.service.ts - - + + src/app/features/login/login.component.spec.ts - -login.component.spec.ts + +login.component.spec.ts - + src/app/features/login/login.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/login/login.component.spec.ts->src/app/features/login/login.component.ts - - + + src/app/features/members/members.component.ts - -members.component.ts + +members.component.ts - + src/app/features/members/members-routing.module.ts->src/app/features/members/members.component.ts - - + + src/app/features/members/members.component.spec.ts - -members.component.spec.ts + +members.component.spec.ts - + src/app/features/members/members.component.spec.ts->src/app/features/members/members.component.ts - - + + src/app/features/messages/messages.component.ts - -messages.component.ts + +messages.component.ts - + src/app/features/messages/messages-routing.module.ts->src/app/features/messages/messages.component.ts - - + + src/app/features/messages/messages.component.spec.ts - -messages.component.spec.ts + +messages.component.spec.ts - + src/app/features/messages/messages.component.spec.ts->src/app/features/messages/messages.component.ts - - + + src/app/features/missions/missions.component.ts - -missions.component.ts + +missions.component.ts - + src/app/features/missions/missions-routing.module.ts->src/app/features/missions/missions.component.ts - - + + src/app/features/missions/missions.component.spec.ts - -missions.component.spec.ts + +missions.component.spec.ts - + src/app/features/missions/missions.component.spec.ts->src/app/features/missions/missions.component.ts - - + + src/app/features/news-feed/components/news-card/news-card.component.spec.ts - -news-card.component.spec.ts + +news-card.component.spec.ts - + src/app/features/news-feed/components/news-card/news-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/news-feed/components/news-card/news-card.component.spec.ts->src/app/features/news-feed/components/news-card/news-card.component.ts - - + + - + src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/features/news-feed/models/news-item.ts - - + + - + src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/shared/models/material-button-type.ts - - + + src/app/features/news-feed/components/news-list/news-list.component.spec.ts - -news-list.component.spec.ts + +news-list.component.spec.ts - + src/app/features/news-feed/components/news-list/news-list.component.spec.ts->src/app/features/news-feed/components/news-list/news-list.component.ts - - + + - + src/app/features/news-feed/components/news-list/news-list.component.ts->src/app/features/news-feed/models/news-item.ts - - + + src/app/features/news-feed/news-feed.component.ts - -news-feed.component.ts + +news-feed.component.ts - + src/app/features/news-feed/news-feed-routing.module.ts->src/app/features/news-feed/news-feed.component.ts - - + + src/app/features/news-feed/news-feed.component.spec.ts - -news-feed.component.spec.ts + +news-feed.component.spec.ts - + src/app/features/news-feed/news-feed.component.spec.ts->src/app/features/news-feed/news-feed.component.ts - - + + - + src/app/features/privacy/privacy-routing.module.ts->src/app/features/privacy/privacy.component.ts - - + + src/app/features/privacy/privacy.component.spec.ts - -privacy.component.spec.ts + +privacy.component.spec.ts - + src/app/features/privacy/privacy.component.spec.ts->src/app/features/privacy/privacy.component.ts - - + + src/app/features/profile/components/profile-card/profile-card.component.spec.ts - -profile-card.component.spec.ts + +profile-card.component.spec.ts - + src/app/features/profile/components/profile-card/profile-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.spec.ts->src/app/features/profile/components/profile-card/profile-card.component.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/core/models/person.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/shared/models/tooltip-direction.ts - - + + src/app/features/profile/components/profile-list/profile-list.component.spec.ts - -profile-list.component.spec.ts + +profile-list.component.spec.ts - + src/app/features/profile/components/profile-list/profile-list.component.spec.ts->src/app/features/profile/components/profile-list/profile-list.component.ts - - + + - + src/app/features/profile/components/profile-list/profile-list.component.ts->src/app/core/models/person.ts - - + + src/app/features/profile/profile.component.ts - -profile.component.ts + +profile.component.ts - + src/app/features/profile/profile-routing.module.ts->src/app/features/profile/profile.component.ts - - + + src/app/features/profile/profile.component.spec.ts - -profile.component.spec.ts + +profile.component.spec.ts - + src/app/features/profile/profile.component.spec.ts->src/app/features/profile/profile.component.ts - - + + - + src/app/features/register/register-routing.module.ts->src/app/features/register/register.component.ts - - + + src/app/features/register/register.component.spec.ts - -register.component.spec.ts + +register.component.spec.ts - + src/app/features/register/register.component.spec.ts->src/app/features/register/register.component.ts - - + + src/app/features/search/search.component.ts - -search.component.ts + +search.component.ts - + src/app/features/search/search-routing.module.ts->src/app/features/search/search.component.ts - - + + src/app/features/search/search.component.spec.ts - -search.component.spec.ts + +search.component.spec.ts - + src/app/features/search/search.component.spec.ts->src/app/features/search/search.component.ts - - + + src/app/features/settings/settings.component.ts - -settings.component.ts + +settings.component.ts - + src/app/features/settings/settings-routing.module.ts->src/app/features/settings/settings.component.ts - - + + src/app/features/settings/settings.component.spec.ts - -settings.component.spec.ts + +settings.component.spec.ts - + src/app/features/settings/settings.component.spec.ts->src/app/features/settings/settings.component.ts - - + + - + src/app/features/splash/splash-routing.module.ts->src/app/features/splash/splash.component.ts - - + + src/app/features/splash/splash.component.spec.ts - -splash.component.spec.ts + +splash.component.spec.ts - + src/app/features/splash/splash.component.spec.ts->src/app/features/splash/splash.component.ts - - + + - + src/app/features/stats/stats-routing.module.ts->src/app/features/stats/stats.component.ts - - + + src/app/features/stats/stats.component.spec.ts - -stats.component.spec.ts + +stats.component.spec.ts - + src/app/features/stats/stats.component.spec.ts->src/app/features/stats/stats.component.ts - - + + - + src/app/features/terms/terms-routing.module.ts->src/app/features/terms/terms.component.ts - - + + src/app/features/terms/terms.component.spec.ts - -terms.component.spec.ts + +terms.component.spec.ts - + src/app/features/terms/terms.component.spec.ts->src/app/features/terms/terms.component.ts - - + + src/app/features/the-wire/the-wire.component.ts - -the-wire.component.ts + +the-wire.component.ts - + src/app/features/the-wire/the-wire-routing.module.ts->src/app/features/the-wire/the-wire.component.ts - - + + src/app/features/the-wire/the-wire.component.spec.ts - -the-wire.component.spec.ts + +the-wire.component.spec.ts - + src/app/features/the-wire/the-wire.component.spec.ts->src/app/features/the-wire/the-wire.component.ts - - + + src/app/shared/components/banner/banner.component.spec.ts - -banner.component.spec.ts + +banner.component.spec.ts - + src/app/shared/components/banner/banner.component.spec.ts->src/app/shared/components/banner/banner.component.ts - - + + - + src/app/shared/components/banner/banner.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/shared/components/button/button.component.spec.ts - -button.component.spec.ts + +button.component.spec.ts - + src/app/shared/components/button/button.component.spec.ts->src/app/shared/components/button/button.component.ts - - + + - + src/app/shared/components/button/button.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/shared/components/button/button.component.ts->src/app/shared/models/tooltip-direction.ts - - + + src/app/shared/models/button-type.ts - -button-type.ts + +button-type.ts - + src/app/shared/components/button/button.component.ts->src/app/shared/models/button-type.ts - - + + src/app/shared/models/material-color.ts - -material-color.ts + +material-color.ts - + src/app/shared/components/button/button.component.ts->src/app/shared/models/material-color.ts - - + + src/app/shared/components/editor/editor.component.spec.ts - -editor.component.spec.ts + +editor.component.spec.ts - + src/app/shared/components/editor/editor.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/editor/editor.component.spec.ts->src/app/shared/components/editor/editor.component.ts - - + + - + src/app/shared/components/editor/editor.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/editor/editor.component.ts->src/app/shared/factories/editor-config.factory.ts - - + + - + src/app/shared/factories/editor-config.factory.ts->src/app/core/services/translations.service.ts - - + + src/app/shared/components/footer/footer.component.spec.ts - -footer.component.spec.ts + +footer.component.spec.ts - + src/app/shared/components/footer/footer.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/footer/footer.component.spec.ts->src/app/shared/components/footer/footer.component.ts - - + + - + src/app/shared/components/footer/footer.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/shared/components/footer/footer.component.ts->src/app/core/services/translations.service.ts - - + + src/app/shared/components/forbidden/forbidden.component.spec.ts - -forbidden.component.spec.ts + +forbidden.component.spec.ts - + src/app/shared/components/forbidden/forbidden.component.spec.ts->src/app/shared/components/forbidden/forbidden.component.ts - - + + src/app/shared/components/header/header.component.spec.ts - -header.component.spec.ts + +header.component.spec.ts - + src/app/shared/components/header/header.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/header/header.component.spec.ts->src/app/shared/components/header/header.component.ts - - + + - + src/app/shared/components/header/header.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/shared/components/header/header.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/header/header.component.ts->src/app/core/models/person.ts - - + + - + src/app/shared/components/header/header.component.ts->src/app/shared/models/material-button-type.ts - - + + src/app/shared/components/input/input.component.spec.ts - -input.component.spec.ts + +input.component.spec.ts - + src/app/shared/components/input/input.component.spec.ts->src/app/shared/components/input/input.component.ts - - + + - + src/app/shared/components/input/input.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/input/input.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/shared/components/input/input.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/shared/components/input/input.component.ts->src/app/shared/models/input-type.ts - - + + src/app/shared/components/language-selector/language-selector.component.spec.ts - -language-selector.component.spec.ts + +language-selector.component.spec.ts - + src/app/shared/components/language-selector/language-selector.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.spec.ts->src/app/shared/components/language-selector/language-selector.component.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.ts->src/app/shared/models/material-button-type.ts - - + + src/app/shared/models/language.ts - -language.ts + +language.ts - + src/app/shared/components/language-selector/language-selector.component.ts->src/app/shared/models/language.ts - - + + src/app/shared/components/not-found/not-found.component.spec.ts - -not-found.component.spec.ts + +not-found.component.spec.ts - + src/app/shared/components/not-found/not-found.component.spec.ts->src/app/shared/components/not-found/not-found.component.ts - - + + src/app/shared/components/page-title/page-title.component.spec.ts - -page-title.component.spec.ts + +page-title.component.spec.ts - + src/app/shared/components/page-title/page-title.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/page-title/page-title.component.spec.ts->src/app/shared/components/page-title/page-title.component.ts - - + + src/app/shared/components/profile-pic/profile-pic.component.spec.ts - -profile-pic.component.spec.ts + +profile-pic.component.spec.ts - + src/app/shared/components/profile-pic/profile-pic.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.spec.ts->src/app/shared/components/profile-pic/profile-pic.component.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.ts->src/app/core/models/person.ts - - + + src/app/shared/components/unauthorized/unauthorized.component.spec.ts - -unauthorized.component.spec.ts + +unauthorized.component.spec.ts - + src/app/shared/components/unauthorized/unauthorized.component.spec.ts->src/app/shared/components/unauthorized/unauthorized.component.ts - - + + src/assets/i18n/translations.fr.ts - -translations.fr.ts + +translations.fr.ts - + src/assets/i18n/translations.fr.ts->src/assets/i18n/translations.en.ts - - + + - + +src/environments/environment.pr.ts + + +environment.pr.ts + + + + + src/environments/environment.prod.ts - - -environment.prod.ts + + +environment.prod.ts - + src/main.ts - - -main.ts + + +main.ts - + src/main.ts->src/app/app.module.ts - - + + - + src/main.ts->src/environments/environment.ts - - + + - + src/polyfills.ts - - -polyfills.ts + + +polyfills.ts - + src/test.ts - - -test.ts + + +test.ts From 9a44c141079347b1f74a80e22a25c73aa77260f1 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Thu, 17 Aug 2023 16:04:50 -0400 Subject: [PATCH 008/165] event page init --- src/app/app-routing.module.ts | 25 ++++++++----------- .../components/group/group.component.html | 1 + .../components/group/group.component.scss | 0 .../components/group/group.component.spec.ts | 21 ++++++++++++++++ .../components/group/group.component.ts | 11 ++++++++ .../features/groups/groups-routing.module.ts | 13 ++++++++++ src/app/features/groups/groups.module.ts | 5 ++-- src/assets/i18n/translations.en.ts | 1 + src/assets/i18n/translations.fr.ts | 1 + 9 files changed, 61 insertions(+), 17 deletions(-) create mode 100644 src/app/features/groups/components/group/group.component.html create mode 100644 src/app/features/groups/components/group/group.component.scss create mode 100644 src/app/features/groups/components/group/group.component.spec.ts create mode 100644 src/app/features/groups/components/group/group.component.ts diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 21e3b509..1cb2d164 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -110,7 +110,6 @@ const routes: Routes = [ path: CoreRoutes.Blog, title: translations.titles.blog, loadChildren: () => import('./features/blog/blog.module').then(m => m.BlogModule), - canActivate: [AuthGuard], data: { title: translations.titles.blog, breadcrumb: translations.titles.blog @@ -120,7 +119,7 @@ const routes: Routes = [ path: CoreRoutes.Bookmarks, title: translations.titles.bookmarks, loadChildren: () => import('./features/bookmarks/bookmarks.module').then(m => m.BookmarksModule), - canActivate: [AuthGuard], + canActivate: [AuthGuard, InterceptorGuard], data: { title: translations.titles.bookmarks, breadcrumb: translations.titles.bookmarks @@ -130,7 +129,7 @@ const routes: Routes = [ path: CoreRoutes.Dashboard, title: translations.titles.dashboards, loadChildren: () => import('./features/dashboard/dashboard.module').then(m => m.DashboardModule), - canActivate: [AuthGuard], + canActivate: [AuthGuard, InterceptorGuard], data: { title: translations.titles.dashboards, breadcrumb: translations.titles.dashboards @@ -145,7 +144,6 @@ const routes: Routes = [ path: CoreRoutes.Events, title: translations.titles.events, loadChildren: () => import('./features/events/events.module').then(m => m.EventsModule), - canActivate: [AuthGuard], data: { title: translations.titles.events, breadcrumb: translations.titles.events @@ -155,7 +153,7 @@ const routes: Routes = [ path: CoreRoutes.Friends, title: translations.titles.friends, loadChildren: () => import('./features/friends/friends.module').then(m => m.FriendsModule), - canActivate: [AuthGuard], + canActivate: [AuthGuard, InterceptorGuard], data: { title: translations.titles.friends, breadcrumb: translations.titles.friends @@ -165,7 +163,7 @@ const routes: Routes = [ path: CoreRoutes.Groups, title: translations.titles.groups, loadChildren: () => import('./features/groups/groups.module').then(m => m.GroupsModule), - canActivate: [AuthGuard], + canActivate: [AuthGuard, InterceptorGuard], data: { title: translations.titles.groups, breadcrumb: translations.titles.groups @@ -175,7 +173,7 @@ const routes: Routes = [ path: CoreRoutes.Invite, title: translations.titles.invite, loadChildren: () => import('./features/invite/invite.module').then(m => m.InviteModule), - canActivate: [AuthGuard], + canActivate: [AuthGuard, InterceptorGuard], data: { title: translations.titles.invite, breadcrumb: translations.titles.invite @@ -185,7 +183,7 @@ const routes: Routes = [ path: CoreRoutes.Members, title: translations.titles.members, loadChildren: () => import('./features/members/members.module').then(m => m.MembersModule), - canActivate: [AuthGuard], + canActivate: [AuthGuard, InterceptorGuard], data: { title: translations.titles.members, breadcrumb: translations.titles.members @@ -195,7 +193,7 @@ const routes: Routes = [ path: CoreRoutes.Messages, title: translations.titles.messages, loadChildren: () => import('./features/messages/messages.module').then(m => m.MessagesModule), - canActivate: [AuthGuard], + canActivate: [AuthGuard, InterceptorGuard], data: { title: translations.titles.messages, breadcrumb: translations.titles.messages @@ -205,7 +203,6 @@ const routes: Routes = [ path: CoreRoutes.Missions, title: translations.titles.missions, loadChildren: () => import('./features/missions/missions.module').then(m => m.MissionsModule), - canActivate: [AuthGuard], data: { title: translations.titles.missions, breadcrumb: translations.titles.missions @@ -215,7 +212,7 @@ const routes: Routes = [ path: CoreRoutes.NewsFeed, title: translations.titles.newsfeed, loadChildren: () => import('./features/news-feed/news-feed.module').then(m => m.NewsFeedModule), - canActivate: [AuthGuard], + canActivate: [AuthGuard, InterceptorGuard], data: { title: translations.titles.newsfeed, breadcrumb: translations.titles.newsfeed @@ -225,7 +222,7 @@ const routes: Routes = [ path: CoreRoutes.Profile, title: translations.titles.profile, loadChildren: () => import('./features/profile/profile.module').then(m => m.ProfileModule), - canActivate: [AuthGuard], + canActivate: [AuthGuard, InterceptorGuard], data: { title: translations.titles.profile, breadcrumb: translations.titles.profile @@ -235,7 +232,6 @@ const routes: Routes = [ path: CoreRoutes.Search, title: translations.titles.search, loadChildren: () => import('./features/search/search.module').then(m => m.SearchModule), - canActivate: [AuthGuard], data: { title: translations.titles.search, breadcrumb: translations.titles.search @@ -245,7 +241,7 @@ const routes: Routes = [ path: CoreRoutes.Settings, title: translations.titles.settings, loadChildren: () => import('./features/settings/settings.module').then(m => m.SettingsModule), - canActivate: [AuthGuard], + canActivate: [AuthGuard, InterceptorGuard], data: { title: translations.titles.settings, breadcrumb: translations.titles.settings @@ -255,7 +251,6 @@ const routes: Routes = [ path: CoreRoutes.TheWire, title: translations.titles.thewire, loadChildren: () => import('./features/the-wire/the-wire.module').then(m => m.TheWireModule), - canActivate: [AuthGuard], data: { title: translations.titles.thewire, breadcrumb: translations.titles.thewire diff --git a/src/app/features/groups/components/group/group.component.html b/src/app/features/groups/components/group/group.component.html new file mode 100644 index 00000000..f16d7f7f --- /dev/null +++ b/src/app/features/groups/components/group/group.component.html @@ -0,0 +1 @@ +

group works!

diff --git a/src/app/features/groups/components/group/group.component.scss b/src/app/features/groups/components/group/group.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/src/app/features/groups/components/group/group.component.spec.ts b/src/app/features/groups/components/group/group.component.spec.ts new file mode 100644 index 00000000..463a0617 --- /dev/null +++ b/src/app/features/groups/components/group/group.component.spec.ts @@ -0,0 +1,21 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { GroupComponent } from './group.component'; + +describe('GroupComponent', () => { + let component: GroupComponent; + let fixture: ComponentFixture; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [GroupComponent] + }); + fixture = TestBed.createComponent(GroupComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/features/groups/components/group/group.component.ts b/src/app/features/groups/components/group/group.component.ts new file mode 100644 index 00000000..e124d443 --- /dev/null +++ b/src/app/features/groups/components/group/group.component.ts @@ -0,0 +1,11 @@ +import { ChangeDetectionStrategy, Component } from '@angular/core'; + +@Component({ + selector: 'app-group', + templateUrl: './group.component.html', + styleUrls: ['./group.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class GroupComponent { + +} diff --git a/src/app/features/groups/groups-routing.module.ts b/src/app/features/groups/groups-routing.module.ts index 07147842..9664cdea 100644 --- a/src/app/features/groups/groups-routing.module.ts +++ b/src/app/features/groups/groups-routing.module.ts @@ -1,6 +1,10 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; import { GroupsComponent } from './groups.component'; +import { GroupComponent } from './components/group/group.component'; + +import { Translations } from 'src/app/core/services/translations.service'; +let translations = Translations.getInstance(); const routes: Routes = [ { @@ -8,6 +12,15 @@ const routes: Routes = [ pathMatch: 'full', component: GroupsComponent }, + { + path: ':groupId', + title: translations.titles.group, + component: GroupComponent, + data: { + title: translations.titles.group, + breadcrumb: translations.titles.group + } + }, { path: '**', redirectTo: '' diff --git a/src/app/features/groups/groups.module.ts b/src/app/features/groups/groups.module.ts index f1085cb0..0d4879d0 100644 --- a/src/app/features/groups/groups.module.ts +++ b/src/app/features/groups/groups.module.ts @@ -6,12 +6,14 @@ import { SharedModule } from 'src/app/shared/shared.module'; import { GroupCardComponent } from './components/group-card/group-card.component'; import { MatCardModule } from '@angular/material/card'; import { GroupListComponent } from './components/group-list/group-list.component'; +import { GroupComponent } from './components/group/group.component'; @NgModule({ declarations: [ GroupCardComponent, - GroupListComponent + GroupListComponent, + GroupComponent ], imports: [ CommonModule, @@ -20,7 +22,6 @@ import { GroupListComponent } from './components/group-list/group-list.component MatCardModule ], exports: [ - GroupCardComponent, GroupListComponent ] }) diff --git a/src/assets/i18n/translations.en.ts b/src/assets/i18n/translations.en.ts index 6ca33e0b..7aaf9e9b 100644 --- a/src/assets/i18n/translations.en.ts +++ b/src/assets/i18n/translations.en.ts @@ -47,6 +47,7 @@ export default { "events": "Events", "friends": "Friends", "groups": "Groups", + "group": "Group", "invite": "Invite", "members": "Members", "messages": "Messages", diff --git a/src/assets/i18n/translations.fr.ts b/src/assets/i18n/translations.fr.ts index a7ea9088..23f312a4 100644 --- a/src/assets/i18n/translations.fr.ts +++ b/src/assets/i18n/translations.fr.ts @@ -47,6 +47,7 @@ const fr: typeof import('./translations.en').default = { "events": "Événements", "friends": "Amis", "groups": "Groupes", + "group": "Groupe", "invite": "Inviter", "members": "Membres", "messages": "Messages", From 6974c4f9973df4a77264fc1c85600582ad075042 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Thu, 17 Aug 2023 16:12:40 -0400 Subject: [PATCH 009/165] event page init --- .../components/event/event.component.html | 1 + .../components/event/event.component.scss | 0 .../components/event/event.component.spec.ts | 21 +++++++++++++++++++ .../components/event/event.component.ts | 11 ++++++++++ .../features/events/events-routing.module.ts | 13 ++++++++++++ src/app/features/events/events.module.ts | 5 +++-- src/assets/i18n/translations.en.ts | 1 + src/assets/i18n/translations.fr.ts | 1 + 8 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 src/app/features/events/components/event/event.component.html create mode 100644 src/app/features/events/components/event/event.component.scss create mode 100644 src/app/features/events/components/event/event.component.spec.ts create mode 100644 src/app/features/events/components/event/event.component.ts diff --git a/src/app/features/events/components/event/event.component.html b/src/app/features/events/components/event/event.component.html new file mode 100644 index 00000000..8a7c90c2 --- /dev/null +++ b/src/app/features/events/components/event/event.component.html @@ -0,0 +1 @@ +

event works!

diff --git a/src/app/features/events/components/event/event.component.scss b/src/app/features/events/components/event/event.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/src/app/features/events/components/event/event.component.spec.ts b/src/app/features/events/components/event/event.component.spec.ts new file mode 100644 index 00000000..60d8a37b --- /dev/null +++ b/src/app/features/events/components/event/event.component.spec.ts @@ -0,0 +1,21 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { EventComponent } from './event.component'; + +describe('EventComponent', () => { + let component: EventComponent; + let fixture: ComponentFixture; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [EventComponent] + }); + fixture = TestBed.createComponent(EventComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/features/events/components/event/event.component.ts b/src/app/features/events/components/event/event.component.ts new file mode 100644 index 00000000..8583814b --- /dev/null +++ b/src/app/features/events/components/event/event.component.ts @@ -0,0 +1,11 @@ +import { ChangeDetectionStrategy, Component } from '@angular/core'; + +@Component({ + selector: 'app-event', + templateUrl: './event.component.html', + styleUrls: ['./event.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class EventComponent { + +} diff --git a/src/app/features/events/events-routing.module.ts b/src/app/features/events/events-routing.module.ts index 3d42dcbc..e5640ac4 100644 --- a/src/app/features/events/events-routing.module.ts +++ b/src/app/features/events/events-routing.module.ts @@ -2,12 +2,25 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; import { EventsComponent } from './events.component'; +import { Translations } from 'src/app/core/services/translations.service'; +import { EventComponent } from './components/event/event.component'; +let translations = Translations.getInstance(); + const routes: Routes = [ { path: '', pathMatch: 'full', component: EventsComponent }, + { + path: ':eventId', + title: translations.titles.event, + component: EventComponent, + data: { + title: translations.titles.event, + breadcrumb: translations.titles.event + } + }, { path: '**', redirectTo: '' diff --git a/src/app/features/events/events.module.ts b/src/app/features/events/events.module.ts index f1d42796..90c04564 100644 --- a/src/app/features/events/events.module.ts +++ b/src/app/features/events/events.module.ts @@ -6,11 +6,13 @@ import { SharedModule } from 'src/app/shared/shared.module'; import { EventCardComponent } from './components/event-card/event-card.component'; import { MatCardModule } from '@angular/material/card'; import { EventListComponent } from './components/event-list/event-list.component'; +import { EventComponent } from './components/event/event.component'; @NgModule({ declarations: [ EventCardComponent, - EventListComponent + EventListComponent, + EventComponent ], imports: [ CommonModule, @@ -19,7 +21,6 @@ import { EventListComponent } from './components/event-list/event-list.component MatCardModule ], exports: [ - EventCardComponent, EventListComponent ] }) diff --git a/src/assets/i18n/translations.en.ts b/src/assets/i18n/translations.en.ts index 7aaf9e9b..379b6aa1 100644 --- a/src/assets/i18n/translations.en.ts +++ b/src/assets/i18n/translations.en.ts @@ -45,6 +45,7 @@ export default { "bookmarks": "Bookmarks", "dashboards": "Dashboards", "events": "Events", + "event": "Event", "friends": "Friends", "groups": "Groups", "group": "Group", diff --git a/src/assets/i18n/translations.fr.ts b/src/assets/i18n/translations.fr.ts index 23f312a4..1072b07d 100644 --- a/src/assets/i18n/translations.fr.ts +++ b/src/assets/i18n/translations.fr.ts @@ -45,6 +45,7 @@ const fr: typeof import('./translations.en').default = { "bookmarks": "Signets", "dashboards": "Tableaux de bord", "events": "Événements", + "event": "Événement", "friends": "Amis", "groups": "Groupes", "group": "Groupe", From 0a22bbc93d03166581a624e330dd74eda821a69d Mon Sep 17 00:00:00 2001 From: Shea Date: Thu, 17 Aug 2023 20:17:09 +0000 Subject: [PATCH 010/165] Dependency Graph ignore-deploy --- dependency-graph.svg | 3462 ++++++++++++++++++++++-------------------- 1 file changed, 1778 insertions(+), 1684 deletions(-) diff --git a/dependency-graph.svg b/dependency-graph.svg index 5d42eba1..f3975faf 100644 --- a/dependency-graph.svg +++ b/dependency-graph.svg @@ -4,357 +4,367 @@ - - + + dependency-cruiser output - + cluster_src - -src + +src cluster_src/app - -app + +app cluster_src/app/core - -core + +core cluster_src/app/core/auth - -auth + +auth cluster_src/app/core/constants - -constants + +constants cluster_src/app/core/guards - -guards + +guards cluster_src/app/core/helpers - -helpers + +helpers cluster_src/app/core/interceptors - -interceptors + +interceptors cluster_src/app/core/models - -models + +models cluster_src/app/core/services - -services + +services cluster_src/app/features - -features + +features cluster_src/app/features/about - -about + +about cluster_src/app/features/blog - -blog + +blog cluster_src/app/features/bookmarks - -bookmarks + +bookmarks cluster_src/app/features/dashboard - -dashboard + +dashboard cluster_src/app/features/events - -events + +events cluster_src/app/features/events/components - -components + +components cluster_src/app/features/events/components/event-card - -event-card + +event-card cluster_src/app/features/events/components/event-list - -event-list + +event-list -cluster_src/app/features/events/models - -models +cluster_src/app/features/events/components/event + +event -cluster_src/app/features/friends - -friends +cluster_src/app/features/events/models + +models -cluster_src/app/features/groups - -groups +cluster_src/app/features/friends + +friends -cluster_src/app/features/groups/components - -components +cluster_src/app/features/groups + +groups -cluster_src/app/features/groups/components/group-card - -group-card +cluster_src/app/features/groups/components + +components -cluster_src/app/features/groups/components/group-list - -group-list +cluster_src/app/features/groups/components/group-card + +group-card -cluster_src/app/features/groups/models - -models +cluster_src/app/features/groups/components/group-list + +group-list -cluster_src/app/features/home - -home +cluster_src/app/features/groups/components/group + +group -cluster_src/app/features/invite - -invite +cluster_src/app/features/groups/models + +models -cluster_src/app/features/login - -login +cluster_src/app/features/home + +home -cluster_src/app/features/members - -members +cluster_src/app/features/invite + +invite -cluster_src/app/features/messages - -messages +cluster_src/app/features/login + +login -cluster_src/app/features/missions - -missions +cluster_src/app/features/members + +members -cluster_src/app/features/news-feed - -news-feed +cluster_src/app/features/messages + +messages -cluster_src/app/features/news-feed/components - -components +cluster_src/app/features/missions + +missions -cluster_src/app/features/news-feed/components/news-card - -news-card +cluster_src/app/features/news-feed + +news-feed -cluster_src/app/features/news-feed/components/news-list - -news-list +cluster_src/app/features/news-feed/components + +components -cluster_src/app/features/news-feed/models - -models +cluster_src/app/features/news-feed/components/news-card + +news-card -cluster_src/app/features/privacy - -privacy +cluster_src/app/features/news-feed/components/news-list + +news-list -cluster_src/app/features/profile - -profile +cluster_src/app/features/news-feed/models + +models -cluster_src/app/features/profile/components - -components +cluster_src/app/features/privacy + +privacy -cluster_src/app/features/profile/components/profile-card - -profile-card +cluster_src/app/features/profile + +profile -cluster_src/app/features/profile/components/profile-list - -profile-list +cluster_src/app/features/profile/components + +components -cluster_src/app/features/register - -register +cluster_src/app/features/profile/components/profile-card + +profile-card -cluster_src/app/features/search - -search +cluster_src/app/features/profile/components/profile-list + +profile-list -cluster_src/app/features/settings - -settings +cluster_src/app/features/register + +register -cluster_src/app/features/splash - -splash +cluster_src/app/features/search + +search -cluster_src/app/features/stats - -stats +cluster_src/app/features/settings + +settings -cluster_src/app/features/terms - -terms +cluster_src/app/features/splash + +splash -cluster_src/app/features/the-wire - -the-wire +cluster_src/app/features/stats + +stats -cluster_src/app/shared - -shared +cluster_src/app/features/terms + +terms -cluster_src/app/shared/components - -components +cluster_src/app/features/the-wire + +the-wire -cluster_src/app/shared/components/banner - -banner +cluster_src/app/shared + +shared -cluster_src/app/shared/components/button - -button +cluster_src/app/shared/components + +components -cluster_src/app/shared/components/editor - -editor +cluster_src/app/shared/components/banner + +banner -cluster_src/app/shared/components/footer - -footer +cluster_src/app/shared/components/button + +button -cluster_src/app/shared/components/forbidden - -forbidden +cluster_src/app/shared/components/editor + +editor -cluster_src/app/shared/components/header - -header +cluster_src/app/shared/components/footer + +footer -cluster_src/app/shared/components/input - -input +cluster_src/app/shared/components/forbidden + +forbidden -cluster_src/app/shared/components/language-selector - -language-selector +cluster_src/app/shared/components/header + +header -cluster_src/app/shared/components/not-found - -not-found +cluster_src/app/shared/components/input + +input -cluster_src/app/shared/components/page-title - -page-title +cluster_src/app/shared/components/language-selector + +language-selector -cluster_src/app/shared/components/profile-pic - -profile-pic +cluster_src/app/shared/components/not-found + +not-found -cluster_src/app/shared/components/unauthorized - -unauthorized +cluster_src/app/shared/components/page-title + +page-title -cluster_src/app/shared/factories - -factories +cluster_src/app/shared/components/profile-pic + +profile-pic -cluster_src/app/shared/models - -models +cluster_src/app/shared/components/unauthorized + +unauthorized -cluster_src/assets - -assets +cluster_src/app/shared/factories + +factories -cluster_src/assets/i18n - -i18n +cluster_src/app/shared/models + +models +cluster_src/assets + +assets + + +cluster_src/assets/i18n + +i18n + + cluster_src/environments - -environments + +environments src/app/app-routing.module.ts - -app-routing.module.ts + +app-routing.module.ts @@ -362,1416 +372,1446 @@ src/app/core/constants/routes.constants.ts - -routes.constants.ts + +routes.constants.ts src/app/app-routing.module.ts->src/app/core/constants/routes.constants.ts - - + + src/app/core/guards/auth.guard.ts - -auth.guard.ts + +auth.guard.ts src/app/app-routing.module.ts->src/app/core/guards/auth.guard.ts - - + + src/app/core/guards/interceptor.guard.ts - -interceptor.guard.ts + +interceptor.guard.ts src/app/app-routing.module.ts->src/app/core/guards/interceptor.guard.ts - - + + src/app/core/guards/login.guard.ts - -login.guard.ts + +login.guard.ts src/app/app-routing.module.ts->src/app/core/guards/login.guard.ts - - + + src/app/core/guards/redirect.guard.ts - -redirect.guard.ts + +redirect.guard.ts src/app/app-routing.module.ts->src/app/core/guards/redirect.guard.ts - - + + src/app/core/services/translations.service.ts - -translations.service.ts + +translations.service.ts src/app/app-routing.module.ts->src/app/core/services/translations.service.ts - - + + src/app/features/about/about.module.ts - -about.module.ts + +about.module.ts src/app/app-routing.module.ts->src/app/features/about/about.module.ts - - - - + + + + src/app/features/blog/blog.module.ts - -blog.module.ts + +blog.module.ts src/app/app-routing.module.ts->src/app/features/blog/blog.module.ts - - - - + + + + src/app/features/bookmarks/bookmarks.module.ts - -bookmarks.module.ts + +bookmarks.module.ts src/app/app-routing.module.ts->src/app/features/bookmarks/bookmarks.module.ts - - - - + + + + src/app/features/dashboard/dashboard.module.ts - -dashboard.module.ts + +dashboard.module.ts src/app/app-routing.module.ts->src/app/features/dashboard/dashboard.module.ts - - - - + + + + src/app/features/events/events.module.ts - -events.module.ts + +events.module.ts src/app/app-routing.module.ts->src/app/features/events/events.module.ts - - - - + + + + src/app/features/friends/friends.module.ts - -friends.module.ts + +friends.module.ts src/app/app-routing.module.ts->src/app/features/friends/friends.module.ts - - - - + + + + src/app/features/groups/groups.module.ts - -groups.module.ts + +groups.module.ts src/app/app-routing.module.ts->src/app/features/groups/groups.module.ts - - - - + + + + src/app/features/home/home.module.ts - -home.module.ts + +home.module.ts src/app/app-routing.module.ts->src/app/features/home/home.module.ts - - - - + + + + src/app/features/invite/invite.module.ts - -invite.module.ts + +invite.module.ts src/app/app-routing.module.ts->src/app/features/invite/invite.module.ts - - - - + + + + src/app/features/login/login.module.ts - -login.module.ts + +login.module.ts src/app/app-routing.module.ts->src/app/features/login/login.module.ts - - - - + + + + src/app/features/members/members.module.ts - -members.module.ts + +members.module.ts src/app/app-routing.module.ts->src/app/features/members/members.module.ts - - - - + + + + src/app/features/messages/messages.module.ts - -messages.module.ts + +messages.module.ts src/app/app-routing.module.ts->src/app/features/messages/messages.module.ts - - - - + + + + src/app/features/missions/missions.module.ts - -missions.module.ts + +missions.module.ts src/app/app-routing.module.ts->src/app/features/missions/missions.module.ts - - - - + + + + src/app/features/news-feed/news-feed.module.ts - -news-feed.module.ts + +news-feed.module.ts src/app/app-routing.module.ts->src/app/features/news-feed/news-feed.module.ts - - - - + + + + src/app/features/privacy/privacy.module.ts - -privacy.module.ts + +privacy.module.ts src/app/app-routing.module.ts->src/app/features/privacy/privacy.module.ts - - - - + + + + src/app/features/profile/profile.module.ts - -profile.module.ts + +profile.module.ts src/app/app-routing.module.ts->src/app/features/profile/profile.module.ts - - - - + + + + src/app/features/register/register.module.ts - -register.module.ts + +register.module.ts src/app/app-routing.module.ts->src/app/features/register/register.module.ts - - - - + + + + src/app/features/search/search.module.ts - -search.module.ts + +search.module.ts src/app/app-routing.module.ts->src/app/features/search/search.module.ts - - - - + + + + src/app/features/settings/settings.module.ts - -settings.module.ts + +settings.module.ts src/app/app-routing.module.ts->src/app/features/settings/settings.module.ts - - - - + + + + src/app/features/splash/splash.module.ts - -splash.module.ts + +splash.module.ts src/app/app-routing.module.ts->src/app/features/splash/splash.module.ts - - - - + + + + src/app/features/stats/stats.module.ts - -stats.module.ts + +stats.module.ts src/app/app-routing.module.ts->src/app/features/stats/stats.module.ts - - - - + + + + src/app/features/terms/terms.module.ts - -terms.module.ts + +terms.module.ts src/app/app-routing.module.ts->src/app/features/terms/terms.module.ts - - - - + + + + src/app/features/the-wire/the-wire.module.ts - -the-wire.module.ts + +the-wire.module.ts src/app/app-routing.module.ts->src/app/features/the-wire/the-wire.module.ts - - - - + + + + src/app/shared/components/banner/banner.component.ts - -banner.component.ts + +banner.component.ts src/app/app-routing.module.ts->src/app/shared/components/banner/banner.component.ts - - + + src/app/shared/components/forbidden/forbidden.component.ts - -forbidden.component.ts + +forbidden.component.ts src/app/app-routing.module.ts->src/app/shared/components/forbidden/forbidden.component.ts - - + + src/app/shared/components/not-found/not-found.component.ts - -not-found.component.ts + +not-found.component.ts src/app/app-routing.module.ts->src/app/shared/components/not-found/not-found.component.ts - - + + src/app/shared/components/unauthorized/unauthorized.component.ts - -unauthorized.component.ts + +unauthorized.component.ts src/app/app-routing.module.ts->src/app/shared/components/unauthorized/unauthorized.component.ts - - + + src/app/core/services/session-storage.service.ts - -session-storage.service.ts + +session-storage.service.ts src/app/core/guards/auth.guard.ts->src/app/core/services/session-storage.service.ts - - + + src/environments/environment.ts - -environment.ts + +environment.ts src/app/core/guards/auth.guard.ts->src/environments/environment.ts - - + + src/app/core/guards/interceptor.guard.ts->src/app/core/services/session-storage.service.ts - - + + src/assets/i18n/translations.en.ts - -translations.en.ts + +translations.en.ts src/app/core/services/translations.service.ts->src/assets/i18n/translations.en.ts - - + + src/app/shared/shared.module.ts - -shared.module.ts + +shared.module.ts src/app/features/about/about.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/about/about-routing.module.ts - -about-routing.module.ts + +about-routing.module.ts src/app/features/about/about.module.ts->src/app/features/about/about-routing.module.ts - - + + src/app/features/about/about.component.ts - -about.component.ts + +about.component.ts src/app/features/about/about.module.ts->src/app/features/about/about.component.ts - - + + src/app/features/blog/blog.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/blog/blog-routing.module.ts - -blog-routing.module.ts + +blog-routing.module.ts src/app/features/blog/blog.module.ts->src/app/features/blog/blog-routing.module.ts - - + + src/app/features/bookmarks/bookmarks.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/bookmarks/bookmarks-routing.module.ts - -bookmarks-routing.module.ts + +bookmarks-routing.module.ts src/app/features/bookmarks/bookmarks.module.ts->src/app/features/bookmarks/bookmarks-routing.module.ts - - + + src/app/features/dashboard/dashboard.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/dashboard/dashboard-routing.module.ts - -dashboard-routing.module.ts + +dashboard-routing.module.ts src/app/features/dashboard/dashboard.module.ts->src/app/features/dashboard/dashboard-routing.module.ts - - + + - + src/app/features/events/events.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/events/components/event-card/event-card.component.ts - -event-card.component.ts + +event-card.component.ts - + src/app/features/events/events.module.ts->src/app/features/events/components/event-card/event-card.component.ts - - + + src/app/features/events/components/event-list/event-list.component.ts - -event-list.component.ts + +event-list.component.ts - + src/app/features/events/events.module.ts->src/app/features/events/components/event-list/event-list.component.ts - - + + + + + +src/app/features/events/components/event/event.component.ts + + +event.component.ts + + + + + +src/app/features/events/events.module.ts->src/app/features/events/components/event/event.component.ts + + - + src/app/features/events/events-routing.module.ts - - -events-routing.module.ts + + +events-routing.module.ts - + src/app/features/events/events.module.ts->src/app/features/events/events-routing.module.ts - - + + - + src/app/features/friends/friends.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/friends/friends-routing.module.ts - - -friends-routing.module.ts + + +friends-routing.module.ts - + src/app/features/friends/friends.module.ts->src/app/features/friends/friends-routing.module.ts - - + + - + src/app/features/groups/groups.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/groups/components/group-card/group-card.component.ts - - -group-card.component.ts + + +group-card.component.ts - + src/app/features/groups/groups.module.ts->src/app/features/groups/components/group-card/group-card.component.ts - - + + - + src/app/features/groups/components/group-list/group-list.component.ts - - -group-list.component.ts + + +group-list.component.ts - + src/app/features/groups/groups.module.ts->src/app/features/groups/components/group-list/group-list.component.ts - - + + + + + +src/app/features/groups/components/group/group.component.ts + + +group.component.ts + + + + + +src/app/features/groups/groups.module.ts->src/app/features/groups/components/group/group.component.ts + + - + src/app/features/groups/groups-routing.module.ts - - -groups-routing.module.ts + + +groups-routing.module.ts - + src/app/features/groups/groups.module.ts->src/app/features/groups/groups-routing.module.ts - - + + - + src/app/features/home/home.module.ts->src/app/features/events/events.module.ts - - - - + + + + - + src/app/features/home/home.module.ts->src/app/features/groups/groups.module.ts - - - - + + + + - + src/app/features/home/home.module.ts->src/app/features/news-feed/news-feed.module.ts - - - - + + + + - + src/app/features/home/home.module.ts->src/app/features/profile/profile.module.ts - - - - + + + + - + src/app/features/home/home.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/home/home-routing.module.ts - - -home-routing.module.ts + + +home-routing.module.ts - + src/app/features/home/home.module.ts->src/app/features/home/home-routing.module.ts - - + + - + src/app/features/home/home.component.ts - - -home.component.ts + + +home.component.ts - + src/app/features/home/home.module.ts->src/app/features/home/home.component.ts - - + + - + src/app/features/invite/invite.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/invite/invite-routing.module.ts - - -invite-routing.module.ts + + +invite-routing.module.ts - + src/app/features/invite/invite.module.ts->src/app/features/invite/invite-routing.module.ts - - + + - + src/app/features/login/login.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/login/login-routing.module.ts - - -login-routing.module.ts + + +login-routing.module.ts - + src/app/features/login/login.module.ts->src/app/features/login/login-routing.module.ts - - + + - + src/app/features/login/login.component.ts - - -login.component.ts + + +login.component.ts - + src/app/features/login/login.module.ts->src/app/features/login/login.component.ts - - + + - + src/app/features/members/members.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/members/members-routing.module.ts - - -members-routing.module.ts + + +members-routing.module.ts - + src/app/features/members/members.module.ts->src/app/features/members/members-routing.module.ts - - + + - + src/app/features/messages/messages.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/messages/messages-routing.module.ts - - -messages-routing.module.ts + + +messages-routing.module.ts - + src/app/features/messages/messages.module.ts->src/app/features/messages/messages-routing.module.ts - - + + - + src/app/features/missions/missions.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/missions/missions-routing.module.ts - - -missions-routing.module.ts + + +missions-routing.module.ts - + src/app/features/missions/missions.module.ts->src/app/features/missions/missions-routing.module.ts - - + + - + src/app/features/news-feed/news-feed.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/news-feed/components/news-card/news-card.component.ts - - -news-card.component.ts + + +news-card.component.ts - + src/app/features/news-feed/news-feed.module.ts->src/app/features/news-feed/components/news-card/news-card.component.ts - - + + - + src/app/features/news-feed/components/news-list/news-list.component.ts - - -news-list.component.ts + + +news-list.component.ts - + src/app/features/news-feed/news-feed.module.ts->src/app/features/news-feed/components/news-list/news-list.component.ts - - + + - + src/app/features/news-feed/news-feed-routing.module.ts - - -news-feed-routing.module.ts + + +news-feed-routing.module.ts - + src/app/features/news-feed/news-feed.module.ts->src/app/features/news-feed/news-feed-routing.module.ts - - + + - + src/app/features/privacy/privacy.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/privacy/privacy-routing.module.ts - - -privacy-routing.module.ts + + +privacy-routing.module.ts - + src/app/features/privacy/privacy.module.ts->src/app/features/privacy/privacy-routing.module.ts - - + + - + src/app/features/privacy/privacy.component.ts - - -privacy.component.ts + + +privacy.component.ts - + src/app/features/privacy/privacy.module.ts->src/app/features/privacy/privacy.component.ts - - + + - + src/app/features/profile/profile.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/profile/components/profile-card/profile-card.component.ts - - -profile-card.component.ts + + +profile-card.component.ts - + src/app/features/profile/profile.module.ts->src/app/features/profile/components/profile-card/profile-card.component.ts - - + + - + src/app/features/profile/components/profile-list/profile-list.component.ts - - -profile-list.component.ts + + +profile-list.component.ts - + src/app/features/profile/profile.module.ts->src/app/features/profile/components/profile-list/profile-list.component.ts - - + + - + src/app/features/profile/profile-routing.module.ts - - -profile-routing.module.ts + + +profile-routing.module.ts - + src/app/features/profile/profile.module.ts->src/app/features/profile/profile-routing.module.ts - - + + - + src/app/features/register/register.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/register/register-routing.module.ts - - -register-routing.module.ts + + +register-routing.module.ts - + src/app/features/register/register.module.ts->src/app/features/register/register-routing.module.ts - - + + - + src/app/features/register/register.component.ts - - -register.component.ts + + +register.component.ts - + src/app/features/register/register.module.ts->src/app/features/register/register.component.ts - - + + - + src/app/features/search/search.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/search/search-routing.module.ts - - -search-routing.module.ts + + +search-routing.module.ts - + src/app/features/search/search.module.ts->src/app/features/search/search-routing.module.ts - - + + - + src/app/features/settings/settings.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/settings/settings-routing.module.ts - - -settings-routing.module.ts + + +settings-routing.module.ts - + src/app/features/settings/settings.module.ts->src/app/features/settings/settings-routing.module.ts - - + + - + src/app/features/splash/splash.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/splash/splash-routing.module.ts - - -splash-routing.module.ts + + +splash-routing.module.ts - + src/app/features/splash/splash.module.ts->src/app/features/splash/splash-routing.module.ts - - + + - + src/app/features/splash/splash.component.ts - - -splash.component.ts + + +splash.component.ts - + src/app/features/splash/splash.module.ts->src/app/features/splash/splash.component.ts - - + + - + src/app/features/stats/stats.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/stats/stats-routing.module.ts - - -stats-routing.module.ts + + +stats-routing.module.ts - + src/app/features/stats/stats.module.ts->src/app/features/stats/stats-routing.module.ts - - + + - + src/app/features/stats/stats.component.ts - - -stats.component.ts + + +stats.component.ts - + src/app/features/stats/stats.module.ts->src/app/features/stats/stats.component.ts - - + + - + src/app/features/terms/terms.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/terms/terms-routing.module.ts - - -terms-routing.module.ts + + +terms-routing.module.ts - + src/app/features/terms/terms.module.ts->src/app/features/terms/terms-routing.module.ts - - + + - + src/app/features/terms/terms.component.ts - - -terms.component.ts + + +terms.component.ts - + src/app/features/terms/terms.module.ts->src/app/features/terms/terms.component.ts - - + + - + src/app/features/the-wire/the-wire.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/the-wire/the-wire-routing.module.ts - - -the-wire-routing.module.ts + + +the-wire-routing.module.ts - + src/app/features/the-wire/the-wire.module.ts->src/app/features/the-wire/the-wire-routing.module.ts - - + + - + src/app/shared/components/banner/banner.component.ts->src/app/core/services/translations.service.ts - - + + src/app/app.component.spec.ts - -app.component.spec.ts + +app.component.spec.ts @@ -1779,495 +1819,495 @@ src/app/app.component.ts - -app.component.ts + +app.component.ts src/app/app.component.spec.ts->src/app/app.component.ts - - + + src/app/core/auth/auth.module.ts - -auth.module.ts + +auth.module.ts src/app/app.component.spec.ts->src/app/core/auth/auth.module.ts - - + + src/app/core/helpers/typescript-loader.ts - -typescript-loader.ts + +typescript-loader.ts src/app/app.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/app.component.ts->src/app/core/constants/routes.constants.ts - - + + src/app/app.component.ts->src/app/core/services/translations.service.ts - - + + src/app/app.component.ts->src/app/shared/components/banner/banner.component.ts - - + + src/app/core/services/language-storage.service.ts - -language-storage.service.ts + +language-storage.service.ts src/app/app.component.ts->src/app/core/services/language-storage.service.ts - - + + src/app/core/auth/auth.module.ts->src/app/core/services/session-storage.service.ts - - + + src/app/core/auth/auth.module.ts->src/environments/environment.ts - - + + src/app/core/services/local-storage-ref.service.ts - -local-storage-ref.service.ts + +local-storage-ref.service.ts src/app/core/services/language-storage.service.ts->src/app/core/services/local-storage-ref.service.ts - - + + src/app/app.module.ts - -app.module.ts + +app.module.ts src/app/app.module.ts->src/app/app-routing.module.ts - - - - + + + + src/app/app.module.ts->src/app/app.component.ts - - + + src/app/app.module.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/core/core.module.ts - -core.module.ts + +core.module.ts src/app/app.module.ts->src/app/core/core.module.ts - - - - + + + + src/app/core/services/title.service.ts - -title.service.ts + +title.service.ts src/app/app.module.ts->src/app/core/services/title.service.ts - - + + src/app/features/events/events.component.ts - -events.component.ts + +events.component.ts src/app/app.module.ts->src/app/features/events/events.component.ts - - + + src/app/features/groups/groups.component.ts - -groups.component.ts + +groups.component.ts src/app/app.module.ts->src/app/features/groups/groups.component.ts - - + + src/app/app.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/core/core.module.ts->src/app/core/auth/auth.module.ts - - + + src/app/core/core.module.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/core/core.module.ts->src/app/app.module.ts - - - - + + + + - + src/app/shared/shared.module.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/shared.module.ts->src/app/shared/components/banner/banner.component.ts - - + + - + src/app/shared/shared.module.ts->src/app/shared/components/forbidden/forbidden.component.ts - - + + - + src/app/shared/shared.module.ts->src/app/shared/components/not-found/not-found.component.ts - - + + - + src/app/shared/shared.module.ts->src/app/shared/components/unauthorized/unauthorized.component.ts - - + + - + src/app/shared/shared.module.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/shared.module.ts->src/app/app.module.ts - - - - + + + + - + src/app/shared/components/button/button.component.ts - - -button.component.ts + + +button.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/button/button.component.ts - - + + - + src/app/shared/components/editor/editor.component.ts - - -editor.component.ts + + +editor.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/editor/editor.component.ts - - + + - + src/app/shared/factories/editor-config.factory.ts - - -editor-config.factory.ts + + +editor-config.factory.ts - + src/app/shared/shared.module.ts->src/app/shared/factories/editor-config.factory.ts - - + + - + src/app/shared/components/footer/footer.component.ts - - -footer.component.ts + + +footer.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/footer/footer.component.ts - - + + - + src/app/shared/components/header/header.component.ts - - -header.component.ts + + +header.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/header/header.component.ts - - + + - + src/app/shared/components/input/input.component.ts - - -input.component.ts + + +input.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/input/input.component.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.ts - - -language-selector.component.ts + + +language-selector.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/language-selector/language-selector.component.ts - - + + - + src/app/shared/components/page-title/page-title.component.ts - - -page-title.component.ts + + +page-title.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/page-title/page-title.component.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.ts - - -profile-pic.component.ts + + +profile-pic.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/profile-pic/profile-pic.component.ts - - + + src/app/core/services/session-storage.service.ts->src/app/core/services/local-storage-ref.service.ts - - + + src/app/core/guards/auth.guard.spec.ts - -auth.guard.spec.ts + +auth.guard.spec.ts src/app/core/guards/auth.guard.spec.ts->src/app/core/guards/auth.guard.ts - - + + src/app/core/guards/auth.guard.spec.ts->src/app/core/auth/auth.module.ts - - + + src/app/core/guards/auth.guard.spec.ts->src/app/core/services/session-storage.service.ts - - + + src/app/core/guards/interceptor.guard.spec.ts - -interceptor.guard.spec.ts + +interceptor.guard.spec.ts src/app/core/guards/interceptor.guard.spec.ts->src/app/core/guards/interceptor.guard.ts - - + + src/app/core/guards/login.guard.spec.ts - -login.guard.spec.ts + +login.guard.spec.ts src/app/core/guards/login.guard.spec.ts->src/app/core/guards/login.guard.ts - - + + src/app/core/guards/login.guard.spec.ts->src/app/core/auth/auth.module.ts - - + + src/app/core/guards/redirect.guard.spec.ts - -redirect.guard.spec.ts + +redirect.guard.spec.ts src/app/core/guards/redirect.guard.spec.ts->src/app/core/guards/redirect.guard.ts - - + + src/app/core/guards/role.guard.spec.ts - -role.guard.spec.ts + +role.guard.spec.ts @@ -2275,23 +2315,23 @@ src/app/core/guards/role.guard.ts - -role.guard.ts + +role.guard.ts src/app/core/guards/role.guard.spec.ts->src/app/core/guards/role.guard.ts - - + + src/app/core/interceptors/error.interceptor.spec.ts - -error.interceptor.spec.ts + +error.interceptor.spec.ts @@ -2299,23 +2339,23 @@ src/app/core/interceptors/error.interceptor.ts - -error.interceptor.ts + +error.interceptor.ts src/app/core/interceptors/error.interceptor.spec.ts->src/app/core/interceptors/error.interceptor.ts - - + + src/app/core/models/person.ts - -person.ts + +person.ts @@ -2323,8 +2363,8 @@ src/app/core/services/event.service.spec.ts - -event.service.spec.ts + +event.service.spec.ts @@ -2332,44 +2372,44 @@ src/app/core/services/event.service.ts - -event.service.ts + +event.service.ts src/app/core/services/event.service.spec.ts->src/app/core/services/event.service.ts - - + + src/app/features/events/models/event.ts - -event.ts + +event.ts src/app/core/services/event.service.ts->src/app/features/events/models/event.ts - - + + - + src/app/features/events/models/event.ts->src/app/core/models/person.ts - - + + src/app/core/services/group.service.spec.ts - -group.service.spec.ts + +group.service.spec.ts @@ -2377,68 +2417,68 @@ src/app/core/services/group.service.ts - -group.service.ts + +group.service.ts src/app/core/services/group.service.spec.ts->src/app/core/services/group.service.ts - - + + src/app/features/groups/models/group.ts - -group.ts + +group.ts src/app/core/services/group.service.ts->src/app/features/groups/models/group.ts - - + + src/app/core/services/language-storage.service.spec.ts - -language-storage.service.spec.ts + +language-storage.service.spec.ts src/app/core/services/language-storage.service.spec.ts->src/app/core/services/language-storage.service.ts - - + + src/app/core/services/local-storage-ref.service.spec.ts - -local-storage-ref.service.spec.ts + +local-storage-ref.service.spec.ts src/app/core/services/local-storage-ref.service.spec.ts->src/app/core/services/local-storage-ref.service.ts - - + + src/app/core/services/news.service.spec.ts - -news.service.spec.ts + +news.service.spec.ts @@ -2446,122 +2486,122 @@ src/app/core/services/news.service.ts - -news.service.ts + +news.service.ts src/app/core/services/news.service.spec.ts->src/app/core/services/news.service.ts - - + + src/app/core/services/news.service.ts->src/app/core/models/person.ts - - + + src/app/core/services/people.service.ts - -people.service.ts + +people.service.ts src/app/core/services/news.service.ts->src/app/core/services/people.service.ts - - + + src/app/features/news-feed/models/news-item.ts - -news-item.ts + +news-item.ts src/app/core/services/news.service.ts->src/app/features/news-feed/models/news-item.ts - - + + src/app/core/services/people.service.ts->src/app/core/models/person.ts - - + + - + src/app/features/news-feed/models/news-item.ts->src/app/core/models/person.ts - - + + src/app/core/services/people.service.spec.ts - -people.service.spec.ts + +people.service.spec.ts src/app/core/services/people.service.spec.ts->src/app/core/services/people.service.ts - - + + src/app/core/services/session-storage.service.spec.ts - -session-storage.service.spec.ts + +session-storage.service.spec.ts src/app/core/services/session-storage.service.spec.ts->src/app/core/services/session-storage.service.ts - - + + src/app/core/services/title.service.spec.ts - -title.service.spec.ts + +title.service.spec.ts src/app/core/services/title.service.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/core/services/title.service.spec.ts->src/app/core/services/title.service.ts - - + + src/app/core/services/user.service.spec.ts - -user.service.spec.ts + +user.service.spec.ts @@ -2569,1448 +2609,1502 @@ src/app/core/services/user.service.ts - -user.service.ts + +user.service.ts src/app/core/services/user.service.spec.ts->src/app/core/services/user.service.ts - - + + src/app/features/about/about-routing.module.ts->src/app/features/about/about.component.ts - - + + src/app/features/about/about.component.spec.ts - -about.component.spec.ts + +about.component.spec.ts src/app/features/about/about.component.spec.ts->src/app/features/about/about.component.ts - - + + src/app/features/blog/blog.component.ts - -blog.component.ts + +blog.component.ts src/app/features/blog/blog-routing.module.ts->src/app/features/blog/blog.component.ts - - + + src/app/features/blog/blog.component.spec.ts - -blog.component.spec.ts + +blog.component.spec.ts src/app/features/blog/blog.component.spec.ts->src/app/features/blog/blog.component.ts - - + + src/app/features/bookmarks/bookmarks.component.ts - -bookmarks.component.ts + +bookmarks.component.ts src/app/features/bookmarks/bookmarks-routing.module.ts->src/app/features/bookmarks/bookmarks.component.ts - - + + src/app/features/bookmarks/bookmarks.component.spec.ts - -bookmarks.component.spec.ts + +bookmarks.component.spec.ts src/app/features/bookmarks/bookmarks.component.spec.ts->src/app/features/bookmarks/bookmarks.component.ts - - + + src/app/features/dashboard/dashboard.component.ts - -dashboard.component.ts + +dashboard.component.ts src/app/features/dashboard/dashboard-routing.module.ts->src/app/features/dashboard/dashboard.component.ts - - + + src/app/features/dashboard/dashboard.component.spec.ts - -dashboard.component.spec.ts + +dashboard.component.spec.ts src/app/features/dashboard/dashboard.component.spec.ts->src/app/features/dashboard/dashboard.component.ts - - + + src/app/features/events/components/event-card/event-card.component.spec.ts - -event-card.component.spec.ts + +event-card.component.spec.ts src/app/features/events/components/event-card/event-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/features/events/components/event-card/event-card.component.spec.ts->src/app/features/events/components/event-card/event-card.component.ts - - + + src/app/features/events/components/event-card/event-card.component.ts->src/app/core/constants/routes.constants.ts - - + + src/app/features/events/components/event-card/event-card.component.ts->src/app/core/services/translations.service.ts - - + + src/app/features/events/components/event-card/event-card.component.ts->src/app/features/events/models/event.ts - - + + src/app/shared/models/material-button-type.ts - -material-button-type.ts + +material-button-type.ts src/app/features/events/components/event-card/event-card.component.ts->src/app/shared/models/material-button-type.ts - - + + src/app/shared/models/tooltip-direction.ts - -tooltip-direction.ts + +tooltip-direction.ts src/app/features/events/components/event-card/event-card.component.ts->src/app/shared/models/tooltip-direction.ts - - + + src/app/features/events/components/event-list/event-list.component.spec.ts - -event-list.component.spec.ts + +event-list.component.spec.ts src/app/features/events/components/event-list/event-list.component.spec.ts->src/app/features/events/components/event-list/event-list.component.ts - - + + src/app/features/events/components/event-list/event-list.component.ts->src/app/features/events/models/event.ts - - + + - + + +src/app/features/events/components/event/event.component.spec.ts + + +event.component.spec.ts + + + + +src/app/features/events/components/event/event.component.spec.ts->src/app/features/events/components/event/event.component.ts + + + + + +src/app/features/events/events-routing.module.ts->src/app/core/services/translations.service.ts + + + + + src/app/features/events/events-routing.module.ts->src/app/features/events/events.component.ts - - + + + + + +src/app/features/events/events-routing.module.ts->src/app/features/events/components/event/event.component.ts + + - + src/app/features/events/events.component.spec.ts - - -events.component.spec.ts + + +events.component.spec.ts - + src/app/features/events/events.component.spec.ts->src/app/features/events/events.component.ts - - + + - + src/app/features/friends/friends.component.ts - - -friends.component.ts + + +friends.component.ts - + src/app/features/friends/friends-routing.module.ts->src/app/features/friends/friends.component.ts - - + + - + src/app/features/friends/friends.component.spec.ts - - -friends.component.spec.ts + + +friends.component.spec.ts - + src/app/features/friends/friends.component.spec.ts->src/app/features/friends/friends.component.ts - - + + - + src/app/features/groups/components/group-card/group-card.component.spec.ts - - -group-card.component.spec.ts + + +group-card.component.spec.ts - + src/app/features/groups/components/group-card/group-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/groups/components/group-card/group-card.component.spec.ts->src/app/features/groups/components/group-card/group-card.component.ts - - + + - + src/app/features/groups/components/group-card/group-card.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/features/groups/components/group-card/group-card.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/groups/components/group-card/group-card.component.ts->src/app/features/groups/models/group.ts - - + + - + src/app/features/groups/components/group-list/group-list.component.spec.ts - - -group-list.component.spec.ts + + +group-list.component.spec.ts - + src/app/features/groups/components/group-list/group-list.component.spec.ts->src/app/features/groups/components/group-list/group-list.component.ts - - + + - + src/app/features/groups/components/group-list/group-list.component.ts->src/app/features/groups/models/group.ts - - + + + + + +src/app/features/groups/components/group/group.component.spec.ts + + +group.component.spec.ts + + + + + +src/app/features/groups/components/group/group.component.spec.ts->src/app/features/groups/components/group/group.component.ts + + + + + +src/app/features/groups/groups-routing.module.ts->src/app/core/services/translations.service.ts + + - + src/app/features/groups/groups-routing.module.ts->src/app/features/groups/groups.component.ts - - + + + + + +src/app/features/groups/groups-routing.module.ts->src/app/features/groups/components/group/group.component.ts + + - + src/app/features/groups/groups.component.spec.ts - - -groups.component.spec.ts + + +groups.component.spec.ts - + src/app/features/groups/groups.component.spec.ts->src/app/features/groups/groups.component.ts - - + + - + src/app/features/home/home-routing.module.ts->src/app/features/home/home.component.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/models/person.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/services/event.service.ts - - + + - + src/app/features/home/home.component.ts->src/app/features/events/models/event.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/services/group.service.ts - - + + - + src/app/features/home/home.component.ts->src/app/features/groups/models/group.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/services/news.service.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/services/people.service.ts - - + + - + src/app/features/home/home.component.ts->src/app/features/news-feed/models/news-item.ts - - + + - + src/app/shared/models/input-type.ts - - -input-type.ts + + +input-type.ts - + src/app/features/home/home.component.ts->src/app/shared/models/input-type.ts - - + + - + src/app/features/home/home.component.spec.ts - - -home.component.spec.ts + + +home.component.spec.ts - + src/app/features/home/home.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/home/home.component.spec.ts->src/app/features/home/home.component.ts - - + + - + src/app/features/invite/invite.component.ts - - -invite.component.ts + + +invite.component.ts - + src/app/features/invite/invite-routing.module.ts->src/app/features/invite/invite.component.ts - - + + - + src/app/features/invite/invite.component.spec.ts - - -invite.component.spec.ts + + +invite.component.spec.ts - + src/app/features/invite/invite.component.spec.ts->src/app/features/invite/invite.component.ts - - + + - + src/app/features/login/login-routing.module.ts->src/app/features/login/login.component.ts - - + + - + src/app/features/login/login.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/login/login.component.spec.ts - - -login.component.spec.ts + + +login.component.spec.ts - + src/app/features/login/login.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/login/login.component.spec.ts->src/app/features/login/login.component.ts - - + + - + src/app/features/members/members.component.ts - - -members.component.ts + + +members.component.ts - + src/app/features/members/members-routing.module.ts->src/app/features/members/members.component.ts - - + + - + src/app/features/members/members.component.spec.ts - - -members.component.spec.ts + + +members.component.spec.ts - + src/app/features/members/members.component.spec.ts->src/app/features/members/members.component.ts - - + + - + src/app/features/messages/messages.component.ts - - -messages.component.ts + + +messages.component.ts - + src/app/features/messages/messages-routing.module.ts->src/app/features/messages/messages.component.ts - - + + - + src/app/features/messages/messages.component.spec.ts - - -messages.component.spec.ts + + +messages.component.spec.ts - + src/app/features/messages/messages.component.spec.ts->src/app/features/messages/messages.component.ts - - + + - + src/app/features/missions/missions.component.ts - - -missions.component.ts + + +missions.component.ts - + src/app/features/missions/missions-routing.module.ts->src/app/features/missions/missions.component.ts - - + + - + src/app/features/missions/missions.component.spec.ts - - -missions.component.spec.ts + + +missions.component.spec.ts - + src/app/features/missions/missions.component.spec.ts->src/app/features/missions/missions.component.ts - - + + - + src/app/features/news-feed/components/news-card/news-card.component.spec.ts - - -news-card.component.spec.ts + + +news-card.component.spec.ts - + src/app/features/news-feed/components/news-card/news-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/news-feed/components/news-card/news-card.component.spec.ts->src/app/features/news-feed/components/news-card/news-card.component.ts - - + + - + src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/features/news-feed/models/news-item.ts - - + + - + src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/features/news-feed/components/news-list/news-list.component.spec.ts - - -news-list.component.spec.ts + + +news-list.component.spec.ts - + src/app/features/news-feed/components/news-list/news-list.component.spec.ts->src/app/features/news-feed/components/news-list/news-list.component.ts - - + + - + src/app/features/news-feed/components/news-list/news-list.component.ts->src/app/features/news-feed/models/news-item.ts - - + + - + src/app/features/news-feed/news-feed.component.ts - - -news-feed.component.ts + + +news-feed.component.ts - + src/app/features/news-feed/news-feed-routing.module.ts->src/app/features/news-feed/news-feed.component.ts - - + + - + src/app/features/news-feed/news-feed.component.spec.ts - - -news-feed.component.spec.ts + + +news-feed.component.spec.ts - + src/app/features/news-feed/news-feed.component.spec.ts->src/app/features/news-feed/news-feed.component.ts - - + + - + src/app/features/privacy/privacy-routing.module.ts->src/app/features/privacy/privacy.component.ts - - + + - + src/app/features/privacy/privacy.component.spec.ts - - -privacy.component.spec.ts + + +privacy.component.spec.ts - + src/app/features/privacy/privacy.component.spec.ts->src/app/features/privacy/privacy.component.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.spec.ts - - -profile-card.component.spec.ts + + +profile-card.component.spec.ts - + src/app/features/profile/components/profile-card/profile-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.spec.ts->src/app/features/profile/components/profile-card/profile-card.component.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/core/models/person.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/features/profile/components/profile-list/profile-list.component.spec.ts - - -profile-list.component.spec.ts + + +profile-list.component.spec.ts - + src/app/features/profile/components/profile-list/profile-list.component.spec.ts->src/app/features/profile/components/profile-list/profile-list.component.ts - - + + - + src/app/features/profile/components/profile-list/profile-list.component.ts->src/app/core/models/person.ts - - + + - + src/app/features/profile/profile.component.ts - - -profile.component.ts + + +profile.component.ts - + src/app/features/profile/profile-routing.module.ts->src/app/features/profile/profile.component.ts - - + + - + src/app/features/profile/profile.component.spec.ts - - -profile.component.spec.ts + + +profile.component.spec.ts - + src/app/features/profile/profile.component.spec.ts->src/app/features/profile/profile.component.ts - - + + - + src/app/features/register/register-routing.module.ts->src/app/features/register/register.component.ts - - + + - + src/app/features/register/register.component.spec.ts - - -register.component.spec.ts + + +register.component.spec.ts - + src/app/features/register/register.component.spec.ts->src/app/features/register/register.component.ts - - + + - + src/app/features/search/search.component.ts - - -search.component.ts + + +search.component.ts - + src/app/features/search/search-routing.module.ts->src/app/features/search/search.component.ts - - + + - + src/app/features/search/search.component.spec.ts - - -search.component.spec.ts + + +search.component.spec.ts - + src/app/features/search/search.component.spec.ts->src/app/features/search/search.component.ts - - + + - + src/app/features/settings/settings.component.ts - - -settings.component.ts + + +settings.component.ts - + src/app/features/settings/settings-routing.module.ts->src/app/features/settings/settings.component.ts - - + + - + src/app/features/settings/settings.component.spec.ts - - -settings.component.spec.ts + + +settings.component.spec.ts - + src/app/features/settings/settings.component.spec.ts->src/app/features/settings/settings.component.ts - - + + - + src/app/features/splash/splash-routing.module.ts->src/app/features/splash/splash.component.ts - - + + - + src/app/features/splash/splash.component.spec.ts - - -splash.component.spec.ts + + +splash.component.spec.ts - + src/app/features/splash/splash.component.spec.ts->src/app/features/splash/splash.component.ts - - + + - + src/app/features/stats/stats-routing.module.ts->src/app/features/stats/stats.component.ts - - + + - + src/app/features/stats/stats.component.spec.ts - - -stats.component.spec.ts + + +stats.component.spec.ts - + src/app/features/stats/stats.component.spec.ts->src/app/features/stats/stats.component.ts - - + + - + src/app/features/terms/terms-routing.module.ts->src/app/features/terms/terms.component.ts - - + + - + src/app/features/terms/terms.component.spec.ts - - -terms.component.spec.ts + + +terms.component.spec.ts - + src/app/features/terms/terms.component.spec.ts->src/app/features/terms/terms.component.ts - - + + - + src/app/features/the-wire/the-wire.component.ts - - -the-wire.component.ts + + +the-wire.component.ts - + src/app/features/the-wire/the-wire-routing.module.ts->src/app/features/the-wire/the-wire.component.ts - - + + - + src/app/features/the-wire/the-wire.component.spec.ts - - -the-wire.component.spec.ts + + +the-wire.component.spec.ts - + src/app/features/the-wire/the-wire.component.spec.ts->src/app/features/the-wire/the-wire.component.ts - - + + - + src/app/shared/components/banner/banner.component.spec.ts - - -banner.component.spec.ts + + +banner.component.spec.ts - + src/app/shared/components/banner/banner.component.spec.ts->src/app/shared/components/banner/banner.component.ts - - + + - + src/app/shared/components/banner/banner.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/button/button.component.spec.ts - - -button.component.spec.ts + + +button.component.spec.ts - + src/app/shared/components/button/button.component.spec.ts->src/app/shared/components/button/button.component.ts - - + + - + src/app/shared/components/button/button.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/shared/components/button/button.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/shared/models/button-type.ts - - -button-type.ts + + +button-type.ts - + src/app/shared/components/button/button.component.ts->src/app/shared/models/button-type.ts - - + + - + src/app/shared/models/material-color.ts - - -material-color.ts + + +material-color.ts - + src/app/shared/components/button/button.component.ts->src/app/shared/models/material-color.ts - - + + - + src/app/shared/components/editor/editor.component.spec.ts - - -editor.component.spec.ts + + +editor.component.spec.ts - + src/app/shared/components/editor/editor.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/editor/editor.component.spec.ts->src/app/shared/components/editor/editor.component.ts - - + + - + src/app/shared/components/editor/editor.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/editor/editor.component.ts->src/app/shared/factories/editor-config.factory.ts - - + + - + src/app/shared/factories/editor-config.factory.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/footer/footer.component.spec.ts - - -footer.component.spec.ts + + +footer.component.spec.ts - + src/app/shared/components/footer/footer.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/footer/footer.component.spec.ts->src/app/shared/components/footer/footer.component.ts - - + + - + src/app/shared/components/footer/footer.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/shared/components/footer/footer.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/forbidden/forbidden.component.spec.ts - - -forbidden.component.spec.ts + + +forbidden.component.spec.ts - + src/app/shared/components/forbidden/forbidden.component.spec.ts->src/app/shared/components/forbidden/forbidden.component.ts - - + + - + src/app/shared/components/header/header.component.spec.ts - - -header.component.spec.ts + + +header.component.spec.ts - + src/app/shared/components/header/header.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/header/header.component.spec.ts->src/app/shared/components/header/header.component.ts - - + + - + src/app/shared/components/header/header.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/shared/components/header/header.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/header/header.component.ts->src/app/core/models/person.ts - - + + - + src/app/shared/components/header/header.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/shared/components/input/input.component.spec.ts - - -input.component.spec.ts + + +input.component.spec.ts - + src/app/shared/components/input/input.component.spec.ts->src/app/shared/components/input/input.component.ts - - + + - + src/app/shared/components/input/input.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/input/input.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/shared/components/input/input.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/shared/components/input/input.component.ts->src/app/shared/models/input-type.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.spec.ts - - -language-selector.component.spec.ts + + +language-selector.component.spec.ts - + src/app/shared/components/language-selector/language-selector.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.spec.ts->src/app/shared/components/language-selector/language-selector.component.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/shared/models/language.ts - - -language.ts + + +language.ts - + src/app/shared/components/language-selector/language-selector.component.ts->src/app/shared/models/language.ts - - + + - + src/app/shared/components/not-found/not-found.component.spec.ts - - -not-found.component.spec.ts + + +not-found.component.spec.ts - + src/app/shared/components/not-found/not-found.component.spec.ts->src/app/shared/components/not-found/not-found.component.ts - - + + - + src/app/shared/components/page-title/page-title.component.spec.ts - - -page-title.component.spec.ts + + +page-title.component.spec.ts - + src/app/shared/components/page-title/page-title.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/page-title/page-title.component.spec.ts->src/app/shared/components/page-title/page-title.component.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.spec.ts - - -profile-pic.component.spec.ts + + +profile-pic.component.spec.ts - + src/app/shared/components/profile-pic/profile-pic.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.spec.ts->src/app/shared/components/profile-pic/profile-pic.component.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.ts->src/app/core/models/person.ts - - + + - + src/app/shared/components/unauthorized/unauthorized.component.spec.ts - - -unauthorized.component.spec.ts + + +unauthorized.component.spec.ts - + src/app/shared/components/unauthorized/unauthorized.component.spec.ts->src/app/shared/components/unauthorized/unauthorized.component.ts - - + + - + src/assets/i18n/translations.fr.ts - - -translations.fr.ts + + +translations.fr.ts - + src/assets/i18n/translations.fr.ts->src/assets/i18n/translations.en.ts - - + + - + src/environments/environment.pr.ts - - -environment.pr.ts + + +environment.pr.ts - + src/environments/environment.prod.ts - - -environment.prod.ts + + +environment.prod.ts - + src/main.ts - - -main.ts + + +main.ts - + src/main.ts->src/app/app.module.ts - - + + - + src/main.ts->src/environments/environment.ts - - + + - + src/polyfills.ts - - -polyfills.ts + + +polyfills.ts - + src/test.ts - - -test.ts + + +test.ts From 512a6a6c63113960f67939bf93abd8396a19b5e6 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Tue, 22 Aug 2023 14:53:59 -0400 Subject: [PATCH 011/165] event page wip --- src/app/app.component.scss | 15 ++- .../components/event/event.component.html | 80 +++++++++++++- .../components/event/event.component.scss | 101 ++++++++++++++++++ .../components/event/event.component.ts | 25 +++++ .../features/events/events-routing.module.ts | 1 + src/app/features/events/models/event.ts | 1 + src/app/features/home/home.component.scss | 68 ++++-------- src/app/features/home/home.component.ts | 2 - .../components/banner/banner.component.scss | 2 + .../calendar-button.component.html | 17 +++ .../calendar-button.component.scss | 44 ++++++++ .../calendar-button.component.spec.ts | 21 ++++ .../calendar-button.component.ts | 34 ++++++ src/app/shared/shared.module.ts | 5 +- src/assets/i18n/translations.en.ts | 27 +++++ src/assets/i18n/translations.fr.ts | 27 +++++ 16 files changed, 417 insertions(+), 53 deletions(-) create mode 100644 src/app/shared/components/calendar-button/calendar-button.component.html create mode 100644 src/app/shared/components/calendar-button/calendar-button.component.scss create mode 100644 src/app/shared/components/calendar-button/calendar-button.component.spec.ts create mode 100644 src/app/shared/components/calendar-button/calendar-button.component.ts diff --git a/src/app/app.component.scss b/src/app/app.component.scss index dc54d5c9..edd972b1 100644 --- a/src/app/app.component.scss +++ b/src/app/app.component.scss @@ -1,5 +1,5 @@ @import '../assets//scss/partials/layout'; -@import "../assets/scss/partials/header"; +@import '../assets/scss/partials/header'; .gcc-main { flex: 1; @@ -14,4 +14,17 @@ .gcc-header-expanded { margin-top: $header-height-expanded-desktop; +} + +::ng-deep { + .page-container { + display: flex; + flex-direction: row; + min-height: 500px; + + .side-content { + width: 33%; + min-width: 300px; + } + } } \ No newline at end of file diff --git a/src/app/features/events/components/event/event.component.html b/src/app/features/events/components/event/event.component.html index 8a7c90c2..6119647d 100644 --- a/src/app/features/events/components/event/event.component.html +++ b/src/app/features/events/components/event/event.component.html @@ -1 +1,79 @@ -

event works!

+ + + +
+ +
+

GC Data Conference/Conférence sur les données du GC

+ +
+
+ + + + + + + +
+
+ + {{ translations.event.form.register | translate }} + +
+
+
+ +
+ + +
+

{{ translations.event.date_time | translate }}

+

April 17th, 2024

+

3 PM - 5 PM

+
+ + +
+

{{ translations.event.location | translate }}

+

90 Elgin Street

+

Ottawa, Ontario

+
+ + +
+

{{ translations.event.host | translate }}

+

CSPS

+

Group page link

+
+
+ + +
+

{{ translations.event.event_description | translate }}

+

+ The annual GC Data Conference, now in its seventh year, serves as the primary forum for public servants and data leaders to share awareness in order to advance Canada's commitments to provide higher-quality data, insights and services to all.
+ With a theme centred on "Leveraging Data to Advance Innovation", the GC Data Conference 2023 will explore key topics related to using data to expand innovative methods, integrating social and ethical practices, and enabling collective change. The event offers opportunities to exchange knowledge, engage in discussions and expand awareness of the opportunities and challenges around the use of data across the Government of Canada.
+ This event is delivered through a partnership between Innovation, Science and Economic Development Canada and the Canada School of Public Service, with the subject-matter support and expertise of the GC Data Community. +

+
+

{{ translations.event.event_program | translate }}

+

Le programme de la conférence et la liste complète des conférenciers et conférencières seront publiés sous peu.

+
+
+ + +
+

{{ translations.event.event_registration | translate }}

+
+ +
\ No newline at end of file diff --git a/src/app/features/events/components/event/event.component.scss b/src/app/features/events/components/event/event.component.scss index e69de29b..263cdd23 100644 --- a/src/app/features/events/components/event/event.component.scss +++ b/src/app/features/events/components/event/event.component.scss @@ -0,0 +1,101 @@ +@import '../../../../../assets/scss/partials/header'; +@import '../../../../../assets//scss/partials/layout'; +@import '../../../../../assets//scss/partials/colors'; + +$calendar-size: 120px; + +:host { + app-banner { + display: block; + width: calc(100vw - ($grid-gutter / 2) - 2px); + margin-left: -$gutter-desktop; + margin-top: -$padding-vertical; + + ::ng-deep { + .banner { + margin-top: 0; + } + } + } + + app-calendar-button { + position: relative; + width: $calendar-size; + height: $calendar-size; + margin-top: calc($calendar-size / -2); + z-index: 1; + + ::ng-deep { + .event-calendar { + box-shadow: 0px 4px 4px 0px rgba(0, 0, 0, 0.25); + } + } + } + + .page-container { + flex-direction: column; + + .title-row { + display: flex; + flex-direction: row; + justify-content: space-between; + + h1 { + margin: 45px 0; + } + + .title-actions { + .top { + font-size: x-large; + } + + .bottom { + padding-top: 10px; + + .enabled { + margin-left: 12px; + + ::ng-deep { + button { + background: $secondary-2-gradient; + color: $secondary-2-contrast; + } + } + } + .disabled { + margin-left: 12px; + + ::ng-deep { + button { + background: #9e9e9e; + color: $secondary-2-contrast; + } + } + } + } + } + } + + .event-info { + display: flex; + flex-direction: row; + width: 100%; + height: 140px; + + i { + color: $primary-2; + width: 28px; + margin-top: 2px; + } + + section { + flex-grow: 1; + + h3 { + color: $primary-2; + margin-top: 0; + } + } + } + } +} \ No newline at end of file diff --git a/src/app/features/events/components/event/event.component.ts b/src/app/features/events/components/event/event.component.ts index 8583814b..a2b4a6a5 100644 --- a/src/app/features/events/components/event/event.component.ts +++ b/src/app/features/events/components/event/event.component.ts @@ -1,4 +1,9 @@ import { ChangeDetectionStrategy, Component } from '@angular/core'; +import { Translations } from 'src/app/core/services/translations.service'; + +import { Banner } from 'src/app/shared/components/banner/banner.component'; +import { Event } from '../../models/event'; +import { MaterialButtonType } from 'src/app/shared/models/material-button-type'; @Component({ selector: 'app-event', @@ -8,4 +13,24 @@ import { ChangeDetectionStrategy, Component } from '@angular/core'; }) export class EventComponent { + model: Event | undefined; + banner: Banner | undefined; + loading: boolean = false; + bookmarked: boolean = false; + + materialButtonType = MaterialButtonType; + + constructor(public translations: Translations) { + this.banner = new Banner('https://s3-alpha-sig.figma.com/img/9986/772c/bad4dde06cf83ed41c61df1b17d1369a?Expires=1693785600&Signature=Mk0vcKtlQGC1NfcH0dBlpdPH-i5JMQSjJHiBxsVivkz6XbUMgo5Ul~T1ZUsd5gqSdBNfzmzp7lkO9qpVNlO8-A4GndxqBMpov3x3qwhzV1XJobTN40viIEkOjMwF~jMFLjFRL7Ya2zrsBOKmct95k6QiyVuzvgVkm3o6bcjRNM7DuWnMFbju73L4Y-qDphKeglfi83dYbf3qO074PUnB3ReGXGChQ23~NiykgTz8UDu4oszh09nTKlnPhi8ZxuBckc6W8CsIUbsjaaTP6p0lcukyKa49lGjB9aFJ~xvpf38YI3ssl6rLlpWP1ILo6HvmQQAF7wdZvhPH1edpaeWecw__&Key-Pair-Id=APKAQ4GOSFWCVNEHN3O4'); + + this.model = new Event(); + this.model.startDate = new Date('2024 04 27'); + } + + isPast(): boolean { + if (this.model?.startDate && this.model.startDate < new Date()) + return true; + + return false; + } } diff --git a/src/app/features/events/events-routing.module.ts b/src/app/features/events/events-routing.module.ts index e5640ac4..c7adc384 100644 --- a/src/app/features/events/events-routing.module.ts +++ b/src/app/features/events/events-routing.module.ts @@ -19,6 +19,7 @@ const routes: Routes = [ data: { title: translations.titles.event, breadcrumb: translations.titles.event + } }, { diff --git a/src/app/features/events/models/event.ts b/src/app/features/events/models/event.ts index 6cd4819a..8724f896 100644 --- a/src/app/features/events/models/event.ts +++ b/src/app/features/events/models/event.ts @@ -12,6 +12,7 @@ export class Event { author: Person | undefined; authoredDate: Date | undefined; canceled: boolean = false; + image: string | undefined; confirmed: boolean = false; declined: boolean = false; diff --git a/src/app/features/home/home.component.scss b/src/app/features/home/home.component.scss index 53bb3dad..e662fea9 100644 --- a/src/app/features/home/home.component.scss +++ b/src/app/features/home/home.component.scss @@ -2,63 +2,35 @@ @import '../../../assets/scss/partials/colors'; :host { - .page-title { - h1 { - margin-top: 0; - margin-bottom: 48px; + .news-container { + width: 66%; + padding-right: $grid-step; + + > div { + max-height: 100vh; + min-height: 100%; + overflow: auto; + padding: 0 22px 0 22px; } } - .page-container { - display: flex; - flex-direction: row; - min-height: 500px; - - .news-container { - width: 66%; - padding-right: $grid-step; + section { + .click-for-more { + text-align: center; + font-weight: 700; + padding: 10px 0; - > div { - max-height: 100vh; - min-height: 100%; - overflow: auto; - padding: 0 22px 0 22px; + a { + color: $primary-2; } - } - - .side-content { - width: 33%; - min-width: 300px; - - section { - .click-for-more { - text-align: center; - font-weight: 700; - padding: 10px 0; - - a { - color: $primary-2; - } - a:hover, a:focus { - text-decoration: underline; - } - } - } - - section:not(:last-child) { - padding-bottom: 44px; + a:hover, a:focus { + text-decoration: underline; } } } - .loading { - align-items: center; - display: flex; - - i { - margin: auto; - color: $primary-2; - } + section:not(:last-child) { + padding-bottom: 44px; } } \ No newline at end of file diff --git a/src/app/features/home/home.component.ts b/src/app/features/home/home.component.ts index c07ce812..d9c26285 100644 --- a/src/app/features/home/home.component.ts +++ b/src/app/features/home/home.component.ts @@ -1,11 +1,9 @@ import { Component, OnInit } from '@angular/core'; -import { TranslateService } from '@ngx-translate/core'; import { Translations } from 'src/app/core/services/translations.service'; import { InputType } from 'src/app/shared/models/input-type'; import { NewsItem } from '../news-feed/models/news-item'; import { NewsService } from 'src/app/core/services/news.service'; -import { Observable, Subscription } from 'rxjs'; import { Event } from '../events/models/event'; import { EventService } from 'src/app/core/services/event.service'; import { CoreRoutes } from 'src/app/core/constants/routes.constants'; diff --git a/src/app/shared/components/banner/banner.component.scss b/src/app/shared/components/banner/banner.component.scss index 79fa554b..e4639636 100644 --- a/src/app/shared/components/banner/banner.component.scss +++ b/src/app/shared/components/banner/banner.component.scss @@ -9,6 +9,8 @@ height: 25vw; min-height: 215px; max-height: 420px; + background-size: cover !important; + background-repeat: no-repeat !important; img { width: 100%; diff --git a/src/app/shared/components/calendar-button/calendar-button.component.html b/src/app/shared/components/calendar-button/calendar-button.component.html new file mode 100644 index 00000000..1f9df082 --- /dev/null +++ b/src/app/shared/components/calendar-button/calendar-button.component.html @@ -0,0 +1,17 @@ +
+
+ {{ model | date:'LLL' | uppercase }} +
+
+ {{ model | date:'dd' }} +
+
+ + \ No newline at end of file diff --git a/src/app/shared/components/calendar-button/calendar-button.component.scss b/src/app/shared/components/calendar-button/calendar-button.component.scss new file mode 100644 index 00000000..fae4dc2a --- /dev/null +++ b/src/app/shared/components/calendar-button/calendar-button.component.scss @@ -0,0 +1,44 @@ +@import "../../../../assets/scss/partials/colors"; + +:host { + display: block; + + .event-calendar { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + width: 100%; + height: 100%; + border-radius: 12px; + color: $secondary-2-contrast; + background: $secondary-2-gradient; + cursor: pointer; + + div:first-child { + font-weight: 400; + font-size: 36px; + } + + div:last-child { + font-weight: 700; + font-size: 52px; + } + } + + .event-calendar.canceled { + background: $error-red-gradient; + } + + .event-calendar.past { + background: $neutral-700 !important; + } + + .event-calendar-loading { + ::ng-deep >div { + width: 100%; + height: 100%; + border-radius: 12px; + } + } +} diff --git a/src/app/shared/components/calendar-button/calendar-button.component.spec.ts b/src/app/shared/components/calendar-button/calendar-button.component.spec.ts new file mode 100644 index 00000000..4231bab4 --- /dev/null +++ b/src/app/shared/components/calendar-button/calendar-button.component.spec.ts @@ -0,0 +1,21 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { CalendarButtonComponent } from './calendar-button.component'; + +describe('CalendarButtonComponent', () => { + let component: CalendarButtonComponent; + let fixture: ComponentFixture; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [CalendarButtonComponent] + }); + fixture = TestBed.createComponent(CalendarButtonComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/components/calendar-button/calendar-button.component.ts b/src/app/shared/components/calendar-button/calendar-button.component.ts new file mode 100644 index 00000000..3f96fc31 --- /dev/null +++ b/src/app/shared/components/calendar-button/calendar-button.component.ts @@ -0,0 +1,34 @@ +import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; +import { Translations } from 'src/app/core/services/translations.service'; +import { TooltipDirection } from 'src/app/shared/models/tooltip-direction'; + +@Component({ + selector: 'app-calendar-button', + templateUrl: './calendar-button.component.html', + styleUrls: ['./calendar-button.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class CalendarButtonComponent { + + @Input() model: Date | undefined; + @Input() tooltip: string = ''; + @Input() aria: string = ''; + @Input() canceled: boolean = false; + @Input() loading: boolean = false; + + tooltipDirection = TooltipDirection; + + constructor(public translations: Translations) + { } + + click() { + + } + + isPast(): boolean { + if (this.model && this.model < new Date()) + return true; + + return false; + } +} diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index bd5cf1d5..667bde37 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -32,6 +32,7 @@ import { MatInputModule } from '@angular/material/input'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { InfiniteScrollModule } from 'ngx-infinite-scroll'; import { ProfilePicComponent } from './components/profile-pic/profile-pic.component'; +import { CalendarButtonComponent } from './components/calendar-button/calendar-button.component'; @NgModule({ @@ -48,6 +49,7 @@ import { ProfilePicComponent } from './components/profile-pic/profile-pic.compon InputComponent, BannerComponent, ProfilePicComponent, + CalendarButtonComponent, ], imports: [ CommonModule, @@ -85,7 +87,8 @@ import { ProfilePicComponent } from './components/profile-pic/profile-pic.compon BannerComponent, NgxSkeletonLoaderModule, InfiniteScrollModule, - ProfilePicComponent + ProfilePicComponent, + CalendarButtonComponent ], providers: [ { diff --git a/src/assets/i18n/translations.en.ts b/src/assets/i18n/translations.en.ts index 379b6aa1..d22804d7 100644 --- a/src/assets/i18n/translations.en.ts +++ b/src/assets/i18n/translations.en.ts @@ -259,5 +259,32 @@ export default { }, "profile_pic": { "alt": "A profile picture" + }, + "event": { + "date_time": "Date & Time:", + "location": "Location:", + "host": "Host:", + "event_description": "Event Description", + "event_program": "Event Program", + "event_registration": "Event Registration", + "form": { + "full_name": "Full Name", + "email": "Email Address", + "email_confirm": "Confirm Email Address", + "occupation": "Occupation", + "add_calendar": "Add to my calendar", + "terms": "I agree with the terms and conditions", + "register": "REGISTER" + }, + "share": { + "tooltip": "Share", + "aria": "Click to share this event." + }, + "bookmark": { + "tooltip_on": "Bookmark", + "tooltip_off": "Bookmarked", + "aria_on": "Click to bookmark this event.", + "aria_off": "Click to remove this event from your bookmarks." + } } }; \ No newline at end of file diff --git a/src/assets/i18n/translations.fr.ts b/src/assets/i18n/translations.fr.ts index 1072b07d..c0cb7c39 100644 --- a/src/assets/i18n/translations.fr.ts +++ b/src/assets/i18n/translations.fr.ts @@ -260,6 +260,33 @@ const fr: typeof import('./translations.en').default = { }, "profile_pic": { "alt": "Une photo de profil" + }, + "event": { + "date_time": "Date & Heure :", + "location": "Emplacement:", + "host": "Hôte:", + "event_description": "Description de L'évenement", + "event_program": "Programme de L'événement", + "event_registration": "Inscription à L'événement", + "form": { + "full_name": "Nom et Prénom", + "email": "Adresse Email", + "email_confirm": "Confirmez votre Adresse Email", + "occupation": "Profession", + "add_calendar": "Ajouter à mon calendrier", + "terms": "Je suis d'accord avec les termes et conditions", + "register": "REGISTRE" + }, + "share": { + "tooltip": "Partager", + "aria": "Cliquez pour partager cet événement." + }, + "bookmark": { + "tooltip_on": "Signet", + "tooltip_off": "Favoris", + "aria_on": "Cliquez pour ajouter cet événement à vos favoris.", + "aria_off": "Cliquez pour supprimer cet événement de vos favoris." + } } }; export default fr; \ No newline at end of file From c61cedd8e3b92096da59ef66d8c89bdf0732c04e Mon Sep 17 00:00:00 2001 From: doug0102 Date: Wed, 23 Aug 2023 09:02:04 -0400 Subject: [PATCH 012/165] wip --- src/app/core/models/location.ts | 13 +++++++ src/app/core/models/person.ts | 3 ++ .../components/event/event.component.html | 36 +++++++++---------- .../components/event/event.component.scss | 8 +++++ .../components/event/event.component.ts | 9 ++++- src/app/features/events/models/event.ts | 3 +- .../calendar-button.component.html | 2 +- .../calendar-button.component.ts | 3 +- src/assets/i18n/translations.en.ts | 1 - src/assets/i18n/translations.fr.ts | 3 +- 10 files changed, 55 insertions(+), 26 deletions(-) create mode 100644 src/app/core/models/location.ts diff --git a/src/app/core/models/location.ts b/src/app/core/models/location.ts new file mode 100644 index 00000000..ebd5d91b --- /dev/null +++ b/src/app/core/models/location.ts @@ -0,0 +1,13 @@ +export class Location { + address: string; + city: string; + province: string; + country: string; + + constructor(address: string, city: string, province: string, country: string = "Canada") { + this.address = address; + this.city = city; + this.province = province; + this.country = country; + } +} \ No newline at end of file diff --git a/src/app/core/models/person.ts b/src/app/core/models/person.ts index a3372ce4..426882ba 100644 --- a/src/app/core/models/person.ts +++ b/src/app/core/models/person.ts @@ -1,7 +1,10 @@ +import { Location } from "./location"; + export class Person { id: string | undefined; firstName: string | undefined; lastName: string | undefined; jobTitle: string | undefined; profilePicture: string = 'https://img.freepik.com/free-icon/user_318-563642.jpg'; + address: Location | undefined; } \ No newline at end of file diff --git a/src/app/features/events/components/event/event.component.html b/src/app/features/events/components/event/event.component.html index 6119647d..c7b56b5b 100644 --- a/src/app/features/events/components/event/event.component.html +++ b/src/app/features/events/components/event/event.component.html @@ -1,24 +1,32 @@ - + +
-

GC Data Conference/Conférence sur les données du GC

+ +

{{ model?.title }}

+ (click)="loading ? '' : bookmarked = !bookmarked" + [ngClass]="bookmarked ? 'bookmarked' : ''"> @@ -38,15 +46,15 @@

GC Data Conference/Conférence sur les données du GC

{{ translations.event.date_time | translate }}

-

April 17th, 2024

-

3 PM - 5 PM

+

{{ model?.startDate | date: 'mediumDate' }}

+

{{ model?.startDate | date: 'h a' }} - {{ model?.endDate | date: 'h a' }}

{{ translations.event.location | translate }}

-

90 Elgin Street

-

Ottawa, Ontario

+

{{ model?.location?.address }}

+

{{ model?.location?.city }}, {{ model?.location?.province }}

@@ -60,15 +68,7 @@

{{ translations.event.host | translate }}

{{ translations.event.event_description | translate }}

-

- The annual GC Data Conference, now in its seventh year, serves as the primary forum for public servants and data leaders to share awareness in order to advance Canada's commitments to provide higher-quality data, insights and services to all.
- With a theme centred on "Leveraging Data to Advance Innovation", the GC Data Conference 2023 will explore key topics related to using data to expand innovative methods, integrating social and ethical practices, and enabling collective change. The event offers opportunities to exchange knowledge, engage in discussions and expand awareness of the opportunities and challenges around the use of data across the Government of Canada.
- This event is delivered through a partnership between Innovation, Science and Economic Development Canada and the Canada School of Public Service, with the subject-matter support and expertise of the GC Data Community. -

-
-

{{ translations.event.event_program | translate }}

-

Le programme de la conférence et la liste complète des conférenciers et conférencières seront publiés sous peu.

-
+

diff --git a/src/app/features/events/components/event/event.component.scss b/src/app/features/events/components/event/event.component.scss index 263cdd23..c8d9abe8 100644 --- a/src/app/features/events/components/event/event.component.scss +++ b/src/app/features/events/components/event/event.component.scss @@ -47,6 +47,14 @@ $calendar-size: 120px; .title-actions { .top { font-size: x-large; + + .bookmarked { + ::ng-deep { + button { + color: $primary-1; + } + } + } } .bottom { diff --git a/src/app/features/events/components/event/event.component.ts b/src/app/features/events/components/event/event.component.ts index a2b4a6a5..783b0427 100644 --- a/src/app/features/events/components/event/event.component.ts +++ b/src/app/features/events/components/event/event.component.ts @@ -4,6 +4,8 @@ import { Translations } from 'src/app/core/services/translations.service'; import { Banner } from 'src/app/shared/components/banner/banner.component'; import { Event } from '../../models/event'; import { MaterialButtonType } from 'src/app/shared/models/material-button-type'; +import { Location } from 'src/app/core/models/location'; +import { TooltipDirection } from 'src/app/shared/models/tooltip-direction'; @Component({ selector: 'app-event', @@ -19,12 +21,17 @@ export class EventComponent { bookmarked: boolean = false; materialButtonType = MaterialButtonType; + tooltipDirection = TooltipDirection; constructor(public translations: Translations) { this.banner = new Banner('https://s3-alpha-sig.figma.com/img/9986/772c/bad4dde06cf83ed41c61df1b17d1369a?Expires=1693785600&Signature=Mk0vcKtlQGC1NfcH0dBlpdPH-i5JMQSjJHiBxsVivkz6XbUMgo5Ul~T1ZUsd5gqSdBNfzmzp7lkO9qpVNlO8-A4GndxqBMpov3x3qwhzV1XJobTN40viIEkOjMwF~jMFLjFRL7Ya2zrsBOKmct95k6QiyVuzvgVkm3o6bcjRNM7DuWnMFbju73L4Y-qDphKeglfi83dYbf3qO074PUnB3ReGXGChQ23~NiykgTz8UDu4oszh09nTKlnPhi8ZxuBckc6W8CsIUbsjaaTP6p0lcukyKa49lGjB9aFJ~xvpf38YI3ssl6rLlpWP1ILo6HvmQQAF7wdZvhPH1edpaeWecw__&Key-Pair-Id=APKAQ4GOSFWCVNEHN3O4'); this.model = new Event(); - this.model.startDate = new Date('2024 04 27'); + this.model.title = "GC Data Conference/Conférence sur les données du GC"; + this.model.description = "The annual GC Data Conference, now in its seventh year, serves as the primary forum for public servants and data leaders to share awareness in order to advance Canada's commitments to provide higher-quality data, insights and services to all.
With a theme centred on \"Leveraging Data to Advance Innovation\", the GC Data Conference 2023 will explore key topics related to using data to expand innovative methods, integrating social and ethical practices, and enabling collective change. The event offers opportunities to exchange knowledge, engage in discussions and expand awareness of the opportunities and challenges around the use of data across the Government of Canada.
This event is delivered through a partnership between Innovation, Science and Economic Development Canada and the Canada School of Public Service, with the subject-matter support and expertise of the GC Data Community.

Event Program

Le programme de la conférence et la liste complète des conférenciers et conférencières seront publiés sous peu."; + this.model.location = new Location('90 Elgin Street', 'Ottawa', 'Ontario'); + this.model.startDate = new Date('2024 04 27 9:00'); + this.model.endDate = new Date('2024 04 27 17:00'); } isPast(): boolean { diff --git a/src/app/features/events/models/event.ts b/src/app/features/events/models/event.ts index 8724f896..8e4617f7 100644 --- a/src/app/features/events/models/event.ts +++ b/src/app/features/events/models/event.ts @@ -1,11 +1,12 @@ import { Person } from "src/app/core/models/person"; +import { Location } from "src/app/core/models/location"; export class Event { id: string | undefined; title: string | undefined; eventType: string | undefined; description: string | undefined; - location: string | undefined; + location: Location | undefined; tags: [string] | undefined; startDate: Date | undefined; endDate: Date | undefined; diff --git a/src/app/shared/components/calendar-button/calendar-button.component.html b/src/app/shared/components/calendar-button/calendar-button.component.html index 1f9df082..5b87eff1 100644 --- a/src/app/shared/components/calendar-button/calendar-button.component.html +++ b/src/app/shared/components/calendar-button/calendar-button.component.html @@ -2,7 +2,7 @@ *ngIf="!loading" [matTooltip]="tooltip | translate" [attr.aria-label]="aria | translate" - [matTooltipPosition]="tooltipDirection.Above" + [matTooltipPosition]="tooltipDirection" [ngClass]="canceled == true ? 'canceled' : isPast() ? 'past' : ''" (click)="click()" tabindex="0"> diff --git a/src/app/shared/components/calendar-button/calendar-button.component.ts b/src/app/shared/components/calendar-button/calendar-button.component.ts index 3f96fc31..748b4147 100644 --- a/src/app/shared/components/calendar-button/calendar-button.component.ts +++ b/src/app/shared/components/calendar-button/calendar-button.component.ts @@ -13,11 +13,10 @@ export class CalendarButtonComponent { @Input() model: Date | undefined; @Input() tooltip: string = ''; @Input() aria: string = ''; + @Input() tooltipDirection: TooltipDirection = TooltipDirection.Above; @Input() canceled: boolean = false; @Input() loading: boolean = false; - tooltipDirection = TooltipDirection; - constructor(public translations: Translations) { } diff --git a/src/assets/i18n/translations.en.ts b/src/assets/i18n/translations.en.ts index d22804d7..648ff153 100644 --- a/src/assets/i18n/translations.en.ts +++ b/src/assets/i18n/translations.en.ts @@ -265,7 +265,6 @@ export default { "location": "Location:", "host": "Host:", "event_description": "Event Description", - "event_program": "Event Program", "event_registration": "Event Registration", "form": { "full_name": "Full Name", diff --git a/src/assets/i18n/translations.fr.ts b/src/assets/i18n/translations.fr.ts index c0cb7c39..c345959a 100644 --- a/src/assets/i18n/translations.fr.ts +++ b/src/assets/i18n/translations.fr.ts @@ -262,11 +262,10 @@ const fr: typeof import('./translations.en').default = { "alt": "Une photo de profil" }, "event": { - "date_time": "Date & Heure :", + "date_time": "Date & Heure:", "location": "Emplacement:", "host": "Hôte:", "event_description": "Description de L'évenement", - "event_program": "Programme de L'événement", "event_registration": "Inscription à L'événement", "form": { "full_name": "Nom et Prénom", From b7938a998d0a060b2196d99170e2ba85a33bff2a Mon Sep 17 00:00:00 2001 From: doug0102 Date: Wed, 23 Aug 2023 09:11:14 -0400 Subject: [PATCH 013/165] rename master to main --- .github/workflows/dependency-graph.yml | 4 ++-- .github/workflows/deploy-dev.yml | 4 ++-- .github/workflows/deploy-pr.yml | 6 +++--- .github/workflows/destroy-pr.yml | 4 ++-- README.md | 6 +++--- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/dependency-graph.yml b/.github/workflows/dependency-graph.yml index 755c44ea..2835a3a8 100644 --- a/.github/workflows/dependency-graph.yml +++ b/.github/workflows/dependency-graph.yml @@ -1,4 +1,4 @@ -# This action will generate a new dependency graph for the project once a pull request is closed that targets master +# This action will generate a new dependency graph for the project once a pull request is closed that targets main name: Update Dependency Graph @@ -6,7 +6,7 @@ on: pull_request: types: - closed - branches: ["master"] + branches: ["main"] env: NODE_VERSION: '16.14.2' diff --git a/.github/workflows/deploy-dev.yml b/.github/workflows/deploy-dev.yml index c32480b3..d6cb730d 100644 --- a/.github/workflows/deploy-dev.yml +++ b/.github/workflows/deploy-dev.yml @@ -1,4 +1,4 @@ -# This action will deploy the app to the dev environment once new code is pushed on master. +# This action will deploy the app to the dev environment once new code is pushed on main. name: Deploy to Development @@ -6,7 +6,7 @@ name: Deploy to Development on: push: branches: - - master + - main workflow_dispatch: env: diff --git a/.github/workflows/deploy-pr.yml b/.github/workflows/deploy-pr.yml index fd0041c6..f6a31368 100644 --- a/.github/workflows/deploy-pr.yml +++ b/.github/workflows/deploy-pr.yml @@ -5,7 +5,7 @@ name: Deploy PR on: pull_request: types: [opened, reopened] # TODO: synchronize - branches: master + branches: main env: AZURE_WEBAPP_NAME: gccollab-dev-pr-${{ github.event.number }} @@ -20,7 +20,7 @@ jobs: name: Deploy Bicep runs-on: ubuntu-latest steps: - - uses: actions/checkout@master + - uses: actions/checkout@main - uses: azure/login@v1 with: creds: ${{ secrets.AZURE_CREDENTIALS }} @@ -56,7 +56,7 @@ jobs: shell: bash run: gh auth login --with-token <<< ${{ env.ACCESS_TOKEN }} - - uses: actions/checkout@master + - uses: actions/checkout@main - name: Create Secret run: | escaped_profile=$(printf "%q" "${{ env.PROFILE }}") diff --git a/.github/workflows/destroy-pr.yml b/.github/workflows/destroy-pr.yml index 56b79ea9..e24e6659 100644 --- a/.github/workflows/destroy-pr.yml +++ b/.github/workflows/destroy-pr.yml @@ -5,7 +5,7 @@ name: Destroy PR on: pull_request: types: [closed] - branches: master + branches: main env: AZURE_WEBAPP_NAME: gccollab-dev-pr-${{ github.event.number }} @@ -35,7 +35,7 @@ jobs: shell: bash run: gh auth login --with-token <<< ${{ env.ACCESS_TOKEN }} - - uses: actions/checkout@master + - uses: actions/checkout@main - name: Delete Secret run: gh secret delete "${{ env.SECRET_NAME }}" diff --git a/README.md b/README.md index 9c635cbf..837ec0dd 100644 --- a/README.md +++ b/README.md @@ -16,10 +16,10 @@ Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The appli ## Contributing -All development should be done in branches that branch off `master`. Any new dev work should include unit tests that are in a passing state. +All development should be done in branches that branch off `main`. Any new dev work should include unit tests that are in a passing state. -- Create **a new branch** for your work that branches off of `master`. -- Once your work is done, open a pull request to merge back into `master`. +- Create **a new branch** for your work that branches off of `main`. +- Once your work is done, open a pull request to merge back into `main`. - If the pull request has been approved you are free to merge and close your branch. ## Build From 7dd98532ba492a44164854c1cca690cdb76d9f8b Mon Sep 17 00:00:00 2001 From: doug0102 Date: Wed, 23 Aug 2023 14:28:45 -0400 Subject: [PATCH 014/165] basic event page done --- src/app/core/models/person.ts | 9 ++ src/app/core/services/group.service.ts | 9 +- src/app/core/services/people.service.ts | 29 ++-- .../components/event/event.component.html | 128 ++++++++++++++++-- .../components/event/event.component.scss | 51 ++++--- .../components/event/event.component.ts | 6 + src/app/features/events/models/event.ts | 2 + src/app/features/groups/models/group.ts | 7 + .../components/header/header.component.ts | 14 +- .../components/input/input.component.scss | 1 + src/app/shared/shared.module.ts | 5 +- src/theme.scss | 10 ++ 12 files changed, 218 insertions(+), 53 deletions(-) diff --git a/src/app/core/models/person.ts b/src/app/core/models/person.ts index 426882ba..082ea8cd 100644 --- a/src/app/core/models/person.ts +++ b/src/app/core/models/person.ts @@ -7,4 +7,13 @@ export class Person { jobTitle: string | undefined; profilePicture: string = 'https://img.freepik.com/free-icon/user_318-563642.jpg'; address: Location | undefined; + + constructor(id: string, firstName: string, lastName: string, jobTitle: string, address: Location, profilePicture: string = 'https://img.freepik.com/free-icon/user_318-563642.jpg') { + this.id = id; + this.firstName = firstName; + this.lastName = lastName; + this.jobTitle = jobTitle; + this.profilePicture = profilePicture; + this.address = address; + } } \ No newline at end of file diff --git a/src/app/core/services/group.service.ts b/src/app/core/services/group.service.ts index c48e8d45..1ecb049a 100644 --- a/src/app/core/services/group.service.ts +++ b/src/app/core/services/group.service.ts @@ -29,15 +29,8 @@ import { Group, GroupStatus } from 'src/app/features/groups/models/group'; } private generateRandomGroupItem(): Group { - const group = new Group(); - - group.id = this.id.toString(); - group.name = this.randomName(); - group.displayPicture = this.randomDisplayPicture(); - group.groupStatus = this.randomGroupStatus(); - + const group = new Group(this.id.toString(), this.randomName(), this.randomDisplayPicture(), this.randomGroupStatus()); this.id++; - return group; } diff --git a/src/app/core/services/people.service.ts b/src/app/core/services/people.service.ts index cae1a278..4ad9cb6c 100644 --- a/src/app/core/services/people.service.ts +++ b/src/app/core/services/people.service.ts @@ -1,6 +1,7 @@ import { Injectable } from '@angular/core'; import { Person } from '../models/person'; import { Observable } from 'rxjs'; +import { Location } from '../models/location'; @Injectable({ providedIn: 'root' @@ -29,16 +30,15 @@ export class PeopleService { } private generateRandomPerson(): Person { - const person = new Person(); - - person.id = this.id.toString(); - person.firstName = this.randomFirstName(); - person.lastName = this.randomLastName(); - person.jobTitle = this.randomJobTitle(); - person.profilePicture = this.randomProfilePic(); - + const person = new Person( + this.id.toString(), + this.randomFirstName(), + this.randomLastName(), + this.randomJobTitle(), + this.randomAddress(), + this.randomProfilePic() + ); this.id++; - return person; } @@ -105,4 +105,15 @@ export class PeopleService { ]; return urls[Math.floor(Math.random() * urls.length)]; } + + private randomAddress(): Location { + const addresses: Location[] = [ + new Location('2910 Woodroffe Ave', 'Ottawa', 'Ontario'), + new Location('4230 Innes Rd', 'Ottawa', 'Ontario'), + new Location('2440 Bank St', 'Ottawa', 'Ontario'), + new Location('464 Rideau St', 'Ottawa', 'Ontario'), + new Location('464 Bank St', 'Ottawa', 'Ontario') + ]; + return addresses[Math.floor(Math.random() * addresses.length)]; + } } diff --git a/src/app/features/events/components/event/event.component.html b/src/app/features/events/components/event/event.component.html index c7b56b5b..820ad4ca 100644 --- a/src/app/features/events/components/event/event.component.html +++ b/src/app/features/events/components/event/event.component.html @@ -9,10 +9,15 @@
-

{{ model?.title }}

+

+ {{ model?.title }} +

+
+ + {{ model?.title }} [disabled]="loading || isPast()"> + + {{ model?.title }}
+
+ + + [ngClass]="loading || isPast() ? 'disabled' : 'enabled'" + class="registerBtn"> {{ translations.event.form.register | translate }}
@@ -42,38 +53,127 @@

{{ model?.title }}

- + +
-

{{ translations.event.date_time | translate }}

-

{{ model?.startDate | date: 'mediumDate' }}

-

{{ model?.startDate | date: 'h a' }} - {{ model?.endDate | date: 'h a' }}

+

+ {{ translations.event.date_time | translate }} +

+

+ {{ model?.startDate | date: 'mediumDate' }} +

+

+ {{ model?.startDate | date: 'h a' }} - {{ model?.endDate | date: 'h a' }} +

+
-

{{ translations.event.location | translate }}

-

{{ model?.location?.address }}

-

{{ model?.location?.city }}, {{ model?.location?.province }}

+

+ {{ translations.event.location | translate }} +

+

+ {{ model?.location?.address }} +

+

+ {{ model?.location?.city }}, {{ model?.location?.province }} +

+
-

{{ translations.event.host | translate }}

-

CSPS

-

Group page link

+

+ {{ translations.event.host | translate }} +

+

+ {{ this.model?.author?.firstName }} {{ this.model?.author?.lastName }} +

+ + {{ this.model?.group?.name }} +
-

{{ translations.event.event_description | translate }}

+

+ {{ translations.event.event_description | translate }} +

- +

{{ translations.event.event_registration | translate }}

+ + + + + + + + + + + + + + + + + + + + Add to my calendar + + + + + I agree with the terms and conditions + + + + + {{ translations.event.form.register | translate }} +
\ No newline at end of file diff --git a/src/app/features/events/components/event/event.component.scss b/src/app/features/events/components/event/event.component.scss index c8d9abe8..adaec75a 100644 --- a/src/app/features/events/components/event/event.component.scss +++ b/src/app/features/events/components/event/event.component.scss @@ -60,25 +60,8 @@ $calendar-size: 120px; .bottom { padding-top: 10px; - .enabled { + .registerBtn { margin-left: 12px; - - ::ng-deep { - button { - background: $secondary-2-gradient; - color: $secondary-2-contrast; - } - } - } - .disabled { - margin-left: 12px; - - ::ng-deep { - button { - background: #9e9e9e; - color: $secondary-2-contrast; - } - } } } } @@ -105,5 +88,37 @@ $calendar-size: 120px; } } } + + .event-registration { + max-width: 50%; + min-width: 400px; + + mat-checkbox { + display: block; + } + + .registerBtn { + display: block; + padding-top: 17px; + } + } + } + + .registerBtn.enabled { + ::ng-deep { + button { + background: $secondary-2-gradient; + color: $secondary-2-contrast; + } + } + } + + .registerBtn.disabled { + ::ng-deep { + button { + background: #9e9e9e; + color: $secondary-2-contrast; + } + } } } \ No newline at end of file diff --git a/src/app/features/events/components/event/event.component.ts b/src/app/features/events/components/event/event.component.ts index 783b0427..9139b80a 100644 --- a/src/app/features/events/components/event/event.component.ts +++ b/src/app/features/events/components/event/event.component.ts @@ -6,6 +6,9 @@ import { Event } from '../../models/event'; import { MaterialButtonType } from 'src/app/shared/models/material-button-type'; import { Location } from 'src/app/core/models/location'; import { TooltipDirection } from 'src/app/shared/models/tooltip-direction'; +import { Group } from 'src/app/features/groups/models/group'; +import { Person } from 'src/app/core/models/person'; +import { InputType } from 'src/app/shared/models/input-type'; @Component({ selector: 'app-event', @@ -22,6 +25,7 @@ export class EventComponent { materialButtonType = MaterialButtonType; tooltipDirection = TooltipDirection; + inputType = InputType; constructor(public translations: Translations) { this.banner = new Banner('https://s3-alpha-sig.figma.com/img/9986/772c/bad4dde06cf83ed41c61df1b17d1369a?Expires=1693785600&Signature=Mk0vcKtlQGC1NfcH0dBlpdPH-i5JMQSjJHiBxsVivkz6XbUMgo5Ul~T1ZUsd5gqSdBNfzmzp7lkO9qpVNlO8-A4GndxqBMpov3x3qwhzV1XJobTN40viIEkOjMwF~jMFLjFRL7Ya2zrsBOKmct95k6QiyVuzvgVkm3o6bcjRNM7DuWnMFbju73L4Y-qDphKeglfi83dYbf3qO074PUnB3ReGXGChQ23~NiykgTz8UDu4oszh09nTKlnPhi8ZxuBckc6W8CsIUbsjaaTP6p0lcukyKa49lGjB9aFJ~xvpf38YI3ssl6rLlpWP1ILo6HvmQQAF7wdZvhPH1edpaeWecw__&Key-Pair-Id=APKAQ4GOSFWCVNEHN3O4'); @@ -32,6 +36,8 @@ export class EventComponent { this.model.location = new Location('90 Elgin Street', 'Ottawa', 'Ontario'); this.model.startDate = new Date('2024 04 27 9:00'); this.model.endDate = new Date('2024 04 27 17:00'); + this.model.group = new Group('1', 'CSPS', ''); + this.model.author = new Person('1', 'Shea', 'Dougherty-Gill', 'Web Developer', this.model.location); } isPast(): boolean { diff --git a/src/app/features/events/models/event.ts b/src/app/features/events/models/event.ts index 8e4617f7..2cfe832e 100644 --- a/src/app/features/events/models/event.ts +++ b/src/app/features/events/models/event.ts @@ -1,5 +1,6 @@ import { Person } from "src/app/core/models/person"; import { Location } from "src/app/core/models/location"; +import { Group } from "../../groups/models/group"; export class Event { id: string | undefined; @@ -14,6 +15,7 @@ export class Event { authoredDate: Date | undefined; canceled: boolean = false; image: string | undefined; + group: Group | undefined; confirmed: boolean = false; declined: boolean = false; diff --git a/src/app/features/groups/models/group.ts b/src/app/features/groups/models/group.ts index abc55ed3..8b3f49af 100644 --- a/src/app/features/groups/models/group.ts +++ b/src/app/features/groups/models/group.ts @@ -9,4 +9,11 @@ export class Group { name: string | undefined; displayPicture: string | undefined; groupStatus: GroupStatus | undefined; + + constructor(id: string, name: string, displayPicture: string, groupStatus: GroupStatus = GroupStatus.Open) { + this.id = id; + this.name = name; + this.displayPicture = displayPicture; + this.groupStatus = groupStatus; + } } \ No newline at end of file diff --git a/src/app/shared/components/header/header.component.ts b/src/app/shared/components/header/header.component.ts index b7f576ab..056edf21 100644 --- a/src/app/shared/components/header/header.component.ts +++ b/src/app/shared/components/header/header.component.ts @@ -4,6 +4,7 @@ import { TranslateService } from '@ngx-translate/core'; import { Translations } from 'src/app/core/services/translations.service'; import { MaterialButtonType } from '../../models/material-button-type'; import { Person } from 'src/app/core/models/person'; +import { PeopleService } from 'src/app/core/services/people.service'; @Component({ selector: 'app-header', @@ -18,11 +19,18 @@ export class HeaderComponent { routes = CoreRoutes; materialButtonType = MaterialButtonType; headerExpanded = false; + loadingProfile = false; - user: Person = new Person(); // TODO: Pass user from base component instead of header + user!: Person; // TODO: Pass user from base component instead of header - constructor(public translations: Translations) - { } + constructor(public translations: Translations, + peopleService: PeopleService) + { + peopleService.mockGetPeople(1, 0).subscribe((people: Person[]) => { + this.user = people[0]; + this.loadingProfile = false; + }); + } toggleSearch () { this.headerExpanded = !this.headerExpanded; diff --git a/src/app/shared/components/input/input.component.scss b/src/app/shared/components/input/input.component.scss index c3424fdd..1754056a 100644 --- a/src/app/shared/components/input/input.component.scss +++ b/src/app/shared/components/input/input.component.scss @@ -8,6 +8,7 @@ mat-label { font-size: 18px; font-weight: 600; display: inline-block; + padding-bottom: 10px; .required-star { display: inline-block; diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index 667bde37..6d931cd6 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -33,6 +33,7 @@ import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { InfiniteScrollModule } from 'ngx-infinite-scroll'; import { ProfilePicComponent } from './components/profile-pic/profile-pic.component'; import { CalendarButtonComponent } from './components/calendar-button/calendar-button.component'; +import { MatCheckboxModule } from '@angular/material/checkbox'; @NgModule({ @@ -71,6 +72,7 @@ import { CalendarButtonComponent } from './components/calendar-button/calendar-b MatToolbarModule, MatFormFieldModule, MatInputModule, + MatCheckboxModule, NgxSkeletonLoaderModule, InfiniteScrollModule ], @@ -88,7 +90,8 @@ import { CalendarButtonComponent } from './components/calendar-button/calendar-b NgxSkeletonLoaderModule, InfiniteScrollModule, ProfilePicComponent, - CalendarButtonComponent + CalendarButtonComponent, + MatCheckboxModule ], providers: [ { diff --git a/src/theme.scss b/src/theme.scss index 4909d73a..8c1d81dd 100644 --- a/src/theme.scss +++ b/src/theme.scss @@ -57,3 +57,13 @@ body { font-family: 'Inter'; } } +mat-checkbox { + label { + font-size: 16px; + font-style: normal; + font-weight: 400; + a { + color: $primary-1-dark; + } + } +} \ No newline at end of file From 222133fbfa75ec9742dd2e2ffc6cfb5c9f74b797 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Wed, 23 Aug 2023 14:47:39 -0400 Subject: [PATCH 015/165] translations for event registration form --- .../components/event/event.component.html | 30 +++++++++---------- src/assets/i18n/translations.en.ts | 11 +++++-- src/assets/i18n/translations.fr.ts | 11 +++++-- 3 files changed, 33 insertions(+), 19 deletions(-) diff --git a/src/app/features/events/components/event/event.component.html b/src/app/features/events/components/event/event.component.html index 820ad4ca..9bc72540 100644 --- a/src/app/features/events/components/event/event.component.html +++ b/src/app/features/events/components/event/event.component.html @@ -112,9 +112,9 @@

{{ translations.event.event_registration | translate }}

@@ -122,9 +122,9 @@

{{ translations.event.event_registration | translate }}

@@ -132,9 +132,9 @@

{{ translations.event.event_registration | translate }}

@@ -142,10 +142,10 @@

{{ translations.event.event_registration | translate }}

@@ -155,7 +155,7 @@

{{ translations.event.event_registration | translate }}

name="addToCalendar" [color]="'primary'" [disabled]="loading || isPast()"> - Add to my calendar + {{ translations.event.form.add_calendar | translate }} @@ -163,7 +163,7 @@

{{ translations.event.event_registration | translate }}

name="addToCalendar" [color]="'primary'" [disabled]="loading || isPast()"> - I agree with the terms and conditions + {{ translations.event.form.agree_with | translate }}{{ translations.event.form.terms_conditions | translate }} diff --git a/src/assets/i18n/translations.en.ts b/src/assets/i18n/translations.en.ts index 648ff153..ff16bbce 100644 --- a/src/assets/i18n/translations.en.ts +++ b/src/assets/i18n/translations.en.ts @@ -268,12 +268,19 @@ export default { "event_registration": "Event Registration", "form": { "full_name": "Full Name", + "full_name_error": "Your full name is required.", "email": "Email Address", + "email_error": "Your email address is required.", "email_confirm": "Confirm Email Address", + "email_confirm_error": "Your email must match.", "occupation": "Occupation", + "occupation_error": "Your occupation is required.", + "occupation_hint": "This would be your current job title.", "add_calendar": "Add to my calendar", - "terms": "I agree with the terms and conditions", - "register": "REGISTER" + "agree_with": "I agree with the ", + "terms_conditions": "terms and conditions", + "register": "REGISTER", + "placeholder": "Type here" }, "share": { "tooltip": "Share", diff --git a/src/assets/i18n/translations.fr.ts b/src/assets/i18n/translations.fr.ts index c345959a..db9fc729 100644 --- a/src/assets/i18n/translations.fr.ts +++ b/src/assets/i18n/translations.fr.ts @@ -269,12 +269,19 @@ const fr: typeof import('./translations.en').default = { "event_registration": "Inscription à L'événement", "form": { "full_name": "Nom et Prénom", + "full_name_error": "Votre nom complet est requis.", "email": "Adresse Email", + "email_error": "Votre adresse e-mail est nécessaire.", "email_confirm": "Confirmez votre Adresse Email", + "email_confirm_error": "Votre email doit correspondre.", "occupation": "Profession", + "occupation_error": "Votre profession est requise.", + "occupation_hint": "Ce serait votre titre de poste actuel.", "add_calendar": "Ajouter à mon calendrier", - "terms": "Je suis d'accord avec les termes et conditions", - "register": "REGISTRE" + "agree_with": "Je suis d'accord avec les ", + "terms_conditions": "termes et conditions", + "register": "REGISTRE", + "placeholder": "Écrivez ici" }, "share": { "tooltip": "Partager", From 30037acf2520dcccf75b88d7b63d265eaa0c613d Mon Sep 17 00:00:00 2001 From: doug0102 Date: Thu, 24 Aug 2023 14:14:41 -0400 Subject: [PATCH 016/165] resolver for event route. event flow --- src/app/core/services/event.service.ts | 106 ++++++++++++++++-- src/app/core/services/group.service.ts | 40 ++++++- src/app/core/services/people.service.ts | 39 ++++++- .../event-card/event-card.component.html | 2 +- .../components/event/event.component.html | 5 +- .../components/event/event.component.scss | 3 +- .../components/event/event.component.ts | 50 ++++++--- .../features/events/events-routing.module.ts | 11 +- .../events/resolvers/event.resolver.ts | 15 +++ .../components/header/header.component.scss | 1 + src/styles.scss | 1 + 11 files changed, 231 insertions(+), 42 deletions(-) create mode 100644 src/app/features/events/resolvers/event.resolver.ts diff --git a/src/app/core/services/event.service.ts b/src/app/core/services/event.service.ts index f508431f..7e4f44da 100644 --- a/src/app/core/services/event.service.ts +++ b/src/app/core/services/event.service.ts @@ -1,6 +1,11 @@ -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { Observable } from 'rxjs'; import { Event } from 'src/app/features/events/models/event'; +import { Location } from '../models/location'; +import { PeopleService } from './people.service'; + +import { LoremIpsum } from 'lorem-ipsum'; +import { GroupService } from './group.service'; @Injectable({ providedIn: 'root' @@ -8,17 +13,50 @@ import { Event } from 'src/app/features/events/models/event'; export class EventService { private id: number = 0; + private delay: number = 5000; + + private readonly peopleService: PeopleService = inject(PeopleService); + private readonly groupService: GroupService = inject(GroupService); + + private lorem = new LoremIpsum({ + sentencesPerParagraph: { + max: 8, + min: 4 + }, + wordsPerSentence: { + max: 16, + min: 4 + } + }); - constructor() { } + public events: Event[] = [ + this.generateRandomEventItem(), + this.generateRandomEventItem(), + this.generateRandomEventItem(), + this.generateRandomEventItem(), + this.generateRandomEventItem(), + this.generateRandomEventItem(), + this.generateRandomEventItem(), + this.generateRandomEventItem(), + this.generateRandomEventItem(), + this.generateRandomEventItem() + ]; - mockGetEvents(count: number = 10, delay: number = 5000): Observable { - let response: Event[] = []; + constructor() { - for (let i = 0; i < count; i++) { - response.push(this.generateRandomEventItem()); + } + + mockGetEvent(id: string | null, delay: number = this.delay): Observable { + let response: Event; + + for(let i = 0; i < this.events.length; i++) { + if (this.events[i].id == id) { + response = this.events[i]; + break; + } } - let observable: Observable = new Observable((subscriber) => { + let observable: Observable = new Observable((subscriber) => { setTimeout(() => { subscriber.next(response); subscriber.complete(); @@ -28,13 +66,31 @@ export class EventService { return observable; } + mockGetEvents(count: number = 10, delay: number = this.delay): Observable { + + let observable: Observable = new Observable((subscriber) => { + setTimeout(() => { + subscriber.next(this.events.slice(0, count > this.events.length ? this.events.length : count)); + subscriber.complete(); + }, delay); + }); + + return observable; + } + private generateRandomEventItem(): Event { const event = new Event(); event.id = this.id.toString(); event.title = this.randomTitle(); event.eventType = this.randomEventType(); + event.description = this.randomEventDescription(); + event.location = this.randomLocation(); + event.author = this.peopleService.people[this.id]; + event.group = this.groupService.groups[this.id]; event.startDate = this.randomDate(); + event.endDate = this.randomDate(); + event.image = this.randomImage(); this.id++; @@ -55,15 +111,29 @@ export class EventService { return titles[Math.floor(Math.random() * titles.length)]; } + private randomEventDescription(): string { + let description: string = ''; + let paragraphs = (Math.random() * 4) + 1; + + for (let i = 0; i < paragraphs; i++) { + description += this.lorem.generateSentences(Math.floor(Math.random() * 10) + 4); + + if (i != paragraphs - 1) + description += '

'; + } + + return description; + } + private randomEventType(): string { - const titles: string[] = [ + const eventTypes: string[] = [ 'In Person', 'Workshop', 'Conference', 'Roundtable', 'Charity Event' ]; - return titles[Math.floor(Math.random() * titles.length)]; + return eventTypes[Math.floor(Math.random() * eventTypes.length)]; } private randomDate() { @@ -72,4 +142,22 @@ export class EventService { return new Date(startDate.getTime() + Math.random() * (endDate.getTime() - startDate.getTime())); } + private randomLocation(): Location { + const addresses: Location[] = [ + new Location('2910 Woodroffe Ave', 'Ottawa', 'Ontario'), + new Location('4230 Innes Rd', 'Ottawa', 'Ontario'), + new Location('2440 Bank St', 'Ottawa', 'Ontario'), + new Location('464 Rideau St', 'Ottawa', 'Ontario'), + new Location('464 Bank St', 'Ottawa', 'Ontario') + ]; + return addresses[Math.floor(Math.random() * addresses.length)]; + } + + private randomImage() { + const images: string[] = [ + 'https://s3-alpha-sig.figma.com/img/9986/772c/bad4dde06cf83ed41c61df1b17d1369a?Expires=1693785600&Signature=Mk0vcKtlQGC1NfcH0dBlpdPH-i5JMQSjJHiBxsVivkz6XbUMgo5Ul~T1ZUsd5gqSdBNfzmzp7lkO9qpVNlO8-A4GndxqBMpov3x3qwhzV1XJobTN40viIEkOjMwF~jMFLjFRL7Ya2zrsBOKmct95k6QiyVuzvgVkm3o6bcjRNM7DuWnMFbju73L4Y-qDphKeglfi83dYbf3qO074PUnB3ReGXGChQ23~NiykgTz8UDu4oszh09nTKlnPhi8ZxuBckc6W8CsIUbsjaaTP6p0lcukyKa49lGjB9aFJ~xvpf38YI3ssl6rLlpWP1ILo6HvmQQAF7wdZvhPH1edpaeWecw__&Key-Pair-Id=APKAQ4GOSFWCVNEHN3O4' + ]; + return images[Math.floor(Math.random() * images.length)]; + } + } diff --git a/src/app/core/services/group.service.ts b/src/app/core/services/group.service.ts index 1ecb049a..468164e4 100644 --- a/src/app/core/services/group.service.ts +++ b/src/app/core/services/group.service.ts @@ -8,17 +8,34 @@ import { Group, GroupStatus } from 'src/app/features/groups/models/group'; export class GroupService { private id: number = 0; + private delay: number = 5000; - constructor() { } + public groups: Group[] = [ + this.generateRandomGroupItem(), + this.generateRandomGroupItem(), + this.generateRandomGroupItem(), + this.generateRandomGroupItem(), + this.generateRandomGroupItem(), + this.generateRandomGroupItem(), + this.generateRandomGroupItem(), + this.generateRandomGroupItem(), + this.generateRandomGroupItem(), + this.generateRandomGroupItem() + ]; - mockGetGroups(count: number = 10, delay: number = 5000): Observable { - let response: Group[] = []; + constructor() { } - for (let i = 0; i < count; i++) { - response.push(this.generateRandomGroupItem()); + mockGetGroup(id: string | null, delay: number = this.delay): Observable { + let response: Group; + + for(let i = 0; i < this.groups.length; i++) { + if (this.groups[i].id == id) { + response = this.groups[i]; + break; + } } - let observable: Observable = new Observable((subscriber) => { + let observable: Observable = new Observable((subscriber) => { setTimeout(() => { subscriber.next(response); subscriber.complete(); @@ -28,6 +45,17 @@ import { Group, GroupStatus } from 'src/app/features/groups/models/group'; return observable; } + mockGetGroups(count: number = 10, delay: number = this.delay): Observable { + let observable: Observable = new Observable((subscriber) => { + setTimeout(() => { + subscriber.next(this.groups.slice(0, count > this.groups.length ? this.groups.length : count)); + subscriber.complete(); + }, delay); + }); + + return observable; + } + private generateRandomGroupItem(): Group { const group = new Group(this.id.toString(), this.randomName(), this.randomDisplayPicture(), this.randomGroupStatus()); this.id++; diff --git a/src/app/core/services/people.service.ts b/src/app/core/services/people.service.ts index 4ad9cb6c..b34aba2d 100644 --- a/src/app/core/services/people.service.ts +++ b/src/app/core/services/people.service.ts @@ -9,17 +9,34 @@ import { Location } from '../models/location'; export class PeopleService { private id: number = 0; + private delay: number = 5000; + + public people: Person[] = [ + this.generateRandomPerson(), + this.generateRandomPerson(), + this.generateRandomPerson(), + this.generateRandomPerson(), + this.generateRandomPerson(), + this.generateRandomPerson(), + this.generateRandomPerson(), + this.generateRandomPerson(), + this.generateRandomPerson(), + this.generateRandomPerson() + ]; constructor() { } - mockGetPeople(count: number = 10, delay: number = 3000): Observable { - let response: Person[] = []; + mockGetPerson(id: string | null, delay: number = this.delay): Observable { + let response: Person; - for (let i = 0; i < count; i++) { - response.push(this.generateRandomPerson()); + for(let i = 0; i < this.people.length; i++) { + if (this.people[i].id == id) { + response = this.people[i]; + break; + } } - let observable: Observable = new Observable((subscriber) => { + let observable: Observable = new Observable((subscriber) => { setTimeout(() => { subscriber.next(response); subscriber.complete(); @@ -29,6 +46,18 @@ export class PeopleService { return observable; } + mockGetPeople(count: number = 10, delay: number = 3000): Observable { + + let observable: Observable = new Observable((subscriber) => { + setTimeout(() => { + subscriber.next(this.people.slice(0, count > this.people.length ? this.people.length : count)); + subscriber.complete(); + }, delay); + }); + + return observable; + } + private generateRandomPerson(): Person { const person = new Person( this.id.toString(), diff --git a/src/app/features/events/components/event-card/event-card.component.html b/src/app/features/events/components/event-card/event-card.component.html index b5e93be5..1789f66b 100644 --- a/src/app/features/events/components/event-card/event-card.component.html +++ b/src/app/features/events/components/event-card/event-card.component.html @@ -21,7 +21,7 @@
+ routerLink="{{ '/' + routes.Events + '/' + model?.id }}">
{{ model?.title }} diff --git a/src/app/features/events/components/event/event.component.html b/src/app/features/events/components/event/event.component.html index 9bc72540..955f3b89 100644 --- a/src/app/features/events/components/event/event.component.html +++ b/src/app/features/events/components/event/event.component.html @@ -1,4 +1,5 @@ - + + {{ translations.event.event_registration | translate }} name="addToCalendar" [color]="'primary'" [disabled]="loading || isPast()"> - {{ translations.event.form.agree_with | translate }}{{ translations.event.form.terms_conditions | translate }} + {{ translations.event.form.agree_with | translate }}{{ translations.event.form.terms_conditions | translate }} diff --git a/src/app/features/events/components/event/event.component.scss b/src/app/features/events/components/event/event.component.scss index adaec75a..3196a4aa 100644 --- a/src/app/features/events/components/event/event.component.scss +++ b/src/app/features/events/components/event/event.component.scss @@ -7,7 +7,7 @@ $calendar-size: 120px; :host { app-banner { display: block; - width: calc(100vw - ($grid-gutter / 2) - 2px); + width: 100vw; margin-left: -$gutter-desktop; margin-top: -$padding-vertical; @@ -62,6 +62,7 @@ $calendar-size: 120px; .registerBtn { margin-left: 12px; + padding-right: 12px; } } } diff --git a/src/app/features/events/components/event/event.component.ts b/src/app/features/events/components/event/event.component.ts index 9139b80a..ee14c723 100644 --- a/src/app/features/events/components/event/event.component.ts +++ b/src/app/features/events/components/event/event.component.ts @@ -1,4 +1,4 @@ -import { ChangeDetectionStrategy, Component } from '@angular/core'; +import { ChangeDetectionStrategy, Component, Input, OnInit, inject } from '@angular/core'; import { Translations } from 'src/app/core/services/translations.service'; import { Banner } from 'src/app/shared/components/banner/banner.component'; @@ -9,6 +9,8 @@ import { TooltipDirection } from 'src/app/shared/models/tooltip-direction'; import { Group } from 'src/app/features/groups/models/group'; import { Person } from 'src/app/core/models/person'; import { InputType } from 'src/app/shared/models/input-type'; +import { Observable, map, of } from 'rxjs'; +import { ActivatedRoute } from '@angular/router'; @Component({ selector: 'app-event', @@ -16,28 +18,46 @@ import { InputType } from 'src/app/shared/models/input-type'; styleUrls: ['./event.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush }) -export class EventComponent { +export class EventComponent implements OnInit { - model: Event | undefined; - banner: Banner | undefined; - loading: boolean = false; + @Input() model: Event | null = null; + event$: Observable = of(null); + + banner: Banner | null = null; + loading: boolean = true; bookmarked: boolean = false; materialButtonType = MaterialButtonType; tooltipDirection = TooltipDirection; inputType = InputType; + private readonly route: ActivatedRoute = inject(ActivatedRoute); + constructor(public translations: Translations) { - this.banner = new Banner('https://s3-alpha-sig.figma.com/img/9986/772c/bad4dde06cf83ed41c61df1b17d1369a?Expires=1693785600&Signature=Mk0vcKtlQGC1NfcH0dBlpdPH-i5JMQSjJHiBxsVivkz6XbUMgo5Ul~T1ZUsd5gqSdBNfzmzp7lkO9qpVNlO8-A4GndxqBMpov3x3qwhzV1XJobTN40viIEkOjMwF~jMFLjFRL7Ya2zrsBOKmct95k6QiyVuzvgVkm3o6bcjRNM7DuWnMFbju73L4Y-qDphKeglfi83dYbf3qO074PUnB3ReGXGChQ23~NiykgTz8UDu4oszh09nTKlnPhi8ZxuBckc6W8CsIUbsjaaTP6p0lcukyKa49lGjB9aFJ~xvpf38YI3ssl6rLlpWP1ILo6HvmQQAF7wdZvhPH1edpaeWecw__&Key-Pair-Id=APKAQ4GOSFWCVNEHN3O4'); - - this.model = new Event(); - this.model.title = "GC Data Conference/Conférence sur les données du GC"; - this.model.description = "The annual GC Data Conference, now in its seventh year, serves as the primary forum for public servants and data leaders to share awareness in order to advance Canada's commitments to provide higher-quality data, insights and services to all.
With a theme centred on \"Leveraging Data to Advance Innovation\", the GC Data Conference 2023 will explore key topics related to using data to expand innovative methods, integrating social and ethical practices, and enabling collective change. The event offers opportunities to exchange knowledge, engage in discussions and expand awareness of the opportunities and challenges around the use of data across the Government of Canada.
This event is delivered through a partnership between Innovation, Science and Economic Development Canada and the Canada School of Public Service, with the subject-matter support and expertise of the GC Data Community.

Event Program

Le programme de la conférence et la liste complète des conférenciers et conférencières seront publiés sous peu."; - this.model.location = new Location('90 Elgin Street', 'Ottawa', 'Ontario'); - this.model.startDate = new Date('2024 04 27 9:00'); - this.model.endDate = new Date('2024 04 27 17:00'); - this.model.group = new Group('1', 'CSPS', ''); - this.model.author = new Person('1', 'Shea', 'Dougherty-Gill', 'Web Developer', this.model.location); + + } + + ngOnInit(): void { + if (!this.model) { + this.event$ = this.route.data.pipe(map(({ event }) => event)); + + this.event$.subscribe((event: Event | null) => { + this.model = event; + this.banner = this.createBanner(this.model); + this.loading = false; + }); + } + else { + this.banner = this.createBanner(this.model); + this.loading = false; + } + } + + createBanner(event: Event | null) : Banner | null { + if (event?.image) { + return new Banner(event.image); + } + return null; } isPast(): boolean { diff --git a/src/app/features/events/events-routing.module.ts b/src/app/features/events/events-routing.module.ts index c7adc384..b437d452 100644 --- a/src/app/features/events/events-routing.module.ts +++ b/src/app/features/events/events-routing.module.ts @@ -4,6 +4,9 @@ import { EventsComponent } from './events.component'; import { Translations } from 'src/app/core/services/translations.service'; import { EventComponent } from './components/event/event.component'; +import { Banner } from 'src/app/shared/components/banner/banner.component'; +import { EventResolver } from './resolvers/event.resolver'; + let translations = Translations.getInstance(); const routes: Routes = [ @@ -13,13 +16,15 @@ const routes: Routes = [ component: EventsComponent }, { - path: ':eventId', + path: ':id', title: translations.titles.event, component: EventComponent, + resolve: { + event: EventResolver + }, data: { title: translations.titles.event, breadcrumb: translations.titles.event - } }, { @@ -32,4 +37,4 @@ const routes: Routes = [ imports: [RouterModule.forChild(routes)], exports: [RouterModule] }) -export class EventsRoutingModule { } +export class EventsRoutingModule { } \ No newline at end of file diff --git a/src/app/features/events/resolvers/event.resolver.ts b/src/app/features/events/resolvers/event.resolver.ts new file mode 100644 index 00000000..14ab539b --- /dev/null +++ b/src/app/features/events/resolvers/event.resolver.ts @@ -0,0 +1,15 @@ +import { inject } from '@angular/core'; +import { ActivatedRouteSnapshot, ResolveFn, RouterStateSnapshot } from '@angular/router'; +import { EventService } from 'src/app/core/services/event.service'; +import { Event } from '../models/event'; +import { Observable, filter, take } from 'rxjs'; + +export const EventResolver: ResolveFn = ( + route: ActivatedRouteSnapshot, + state: RouterStateSnapshot, + eventService: EventService = inject(EventService) +) : Observable => eventService.mockGetEvent(route.paramMap.get('id'), 0) +.pipe( + filter((event: Event) => !!event), + take(1) +); \ No newline at end of file diff --git a/src/app/shared/components/header/header.component.scss b/src/app/shared/components/header/header.component.scss index 80a2eb4e..deebc4a9 100644 --- a/src/app/shared/components/header/header.component.scss +++ b/src/app/shared/components/header/header.component.scss @@ -68,6 +68,7 @@ app-profile-pic { width: 52px; + height: 52px; line-height: 10px; } } diff --git a/src/styles.scss b/src/styles.scss index 8014e0d4..613d200e 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -8,6 +8,7 @@ body { margin: 0; font-family: 'Inter', 'Helvetica Neue', sans-serif; display: flex; + overflow-x: hidden; } app-root { From f081938d2269535d707f9feef49f9cc4a31093df Mon Sep 17 00:00:00 2001 From: doug0102 Date: Thu, 24 Aug 2023 16:04:00 -0400 Subject: [PATCH 017/165] event page loading --- src/app/app.component.ts | 2 +- src/app/core/services/news.service.ts | 52 ++++++++++++++----- src/app/core/services/people.service.ts | 4 +- .../components/event/event.component.html | 29 +++++++---- .../components/event/event.component.scss | 29 ++++++++++- .../components/event/event.component.ts | 17 +++--- .../features/events/events-routing.module.ts | 6 +-- .../events/resolvers/event.resolver.ts | 2 +- .../components/banner/banner.component.html | 1 + .../components/banner/banner.component.scss | 11 ++++ .../components/banner/banner.component.ts | 3 +- 11 files changed, 111 insertions(+), 45 deletions(-) diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 7326fcd0..45c981d2 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -22,7 +22,7 @@ export class AppComponent implements OnDestroy { showSearchBar: boolean = false; showBanner: boolean = false; activeRoute: string = CoreRoutes.Home; - banner: Banner | undefined; + banner: Banner | null = null; private checkAuthSub!: Subscription; private langChangeSub!: Subscription; diff --git a/src/app/core/services/news.service.ts b/src/app/core/services/news.service.ts index 30622e74..7c607be5 100644 --- a/src/app/core/services/news.service.ts +++ b/src/app/core/services/news.service.ts @@ -1,8 +1,7 @@ //import { HttpClient } from '@angular/common/http'; -import { Injectable } from '@angular/core'; +import { Injectable, inject } from '@angular/core'; import { Observable } from 'rxjs'; import { NewsItem } from 'src/app/features/news-feed/models/news-item'; -import { Person } from '../models/person'; import { PeopleService } from './people.service'; import { LoremIpsum } from 'lorem-ipsum'; @@ -13,6 +12,7 @@ import { LoremIpsum } from 'lorem-ipsum'; export class NewsService { private id: number = 0; + private delay: number = 3000; private lorem = new LoremIpsum({ sentencesPerParagraph: { max: 8, @@ -23,20 +23,36 @@ export class NewsService { min: 4 } }); - private peopleService: PeopleService; - constructor(peopleService: PeopleService) { - this.peopleService = peopleService; + private peopleService: PeopleService = inject(PeopleService); + + public newsItems: NewsItem[] = [ + this.generateRandomNewsItem(), + this.generateRandomNewsItem(), + this.generateRandomNewsItem(), + this.generateRandomNewsItem(), + this.generateRandomNewsItem(), + this.generateRandomNewsItem(), + this.generateRandomNewsItem(), + this.generateRandomNewsItem(), + this.generateRandomNewsItem(), + this.generateRandomNewsItem() + ]; + + constructor() { } - mockGetNewsItems(count: number = 10, delay: number = 5000): Observable { - let response: NewsItem[] = []; + mockGetNewsItem(id: string | null, delay: number = this.delay): Observable { + let response: NewsItem; - for(let i = 0; i < count; i++) { - response.push(this.generateRandomNewsItem()); + for(let i = 0; i < this.newsItems.length; i++) { + if (this.newsItems[i].id == id) { + response = this.newsItems[i]; + break; + } } - let observable: Observable = new Observable((subscriber) => { + let observable: Observable = new Observable((subscriber) => { setTimeout(() => { subscriber.next(response); subscriber.complete(); @@ -46,6 +62,17 @@ export class NewsService { return observable; } + mockGetNewsItems(count: number = 10, delay: number = 5000): Observable { + let observable: Observable = new Observable((subscriber) => { + setTimeout(() => { + subscriber.next(this.newsItems.slice(0, count > this.newsItems.length ? this.newsItems.length : count)); + subscriber.complete(); + }, delay); + }); + + return observable; + } + private generateRandomNewsItem(): NewsItem { const newsItem = new NewsItem(); @@ -54,10 +81,7 @@ export class NewsService { newsItem.content = this.lorem.generateParagraphs(Math.floor(Math.random() * 2) + 1); newsItem.comments = Math.floor(Math.random() * 199) + 1; newsItem.likes = Math.floor(Math.random() * 99) + 1; - - this.peopleService.mockGetPeople(1, 0).subscribe((person) => { - newsItem.author = person[0]; - }); + newsItem.author = this.peopleService.people[this.id]; this.id++; diff --git a/src/app/core/services/people.service.ts b/src/app/core/services/people.service.ts index b34aba2d..1fdc3ce4 100644 --- a/src/app/core/services/people.service.ts +++ b/src/app/core/services/people.service.ts @@ -9,7 +9,7 @@ import { Location } from '../models/location'; export class PeopleService { private id: number = 0; - private delay: number = 5000; + private delay: number = 3000; public people: Person[] = [ this.generateRandomPerson(), @@ -46,7 +46,7 @@ export class PeopleService { return observable; } - mockGetPeople(count: number = 10, delay: number = 3000): Observable { + mockGetPeople(count: number = 10, delay: number = this.delay): Observable { let observable: Observable = new Observable((subscriber) => { setTimeout(() => { diff --git a/src/app/features/events/components/event/event.component.html b/src/app/features/events/components/event/event.component.html index 955f3b89..e419926b 100644 --- a/src/app/features/events/components/event/event.component.html +++ b/src/app/features/events/components/event/event.component.html @@ -1,18 +1,21 @@ - + + [tooltipDirection]="tooltipDirection.Below" + [loading]="loading" + [ngClass]="loading? 'calendar-loading' : ''"> -
+
-

+

{{ model?.title }}

+
@@ -61,12 +64,13 @@

{{ translations.event.date_time | translate }}

-

+

{{ model?.startDate | date: 'mediumDate' }}

-

+

{{ model?.startDate | date: 'h a' }} - {{ model?.endDate | date: 'h a' }}

+ @@ -75,12 +79,13 @@

{{ translations.event.location | translate }}

-

+

{{ model?.location?.address }}

-

+

{{ model?.location?.city }}, {{ model?.location?.province }}

+ @@ -89,12 +94,13 @@

{{ translations.event.host | translate }}

-

+

{{ this.model?.author?.firstName }} {{ this.model?.author?.lastName }}

- + {{ this.model?.group?.name }} +
@@ -103,7 +109,8 @@

{{ translations.event.event_description | translate }}

-

+

+
diff --git a/src/app/features/events/components/event/event.component.scss b/src/app/features/events/components/event/event.component.scss index 3196a4aa..63b3d0cc 100644 --- a/src/app/features/events/components/event/event.component.scss +++ b/src/app/features/events/components/event/event.component.scss @@ -40,10 +40,23 @@ $calendar-size: 120px; flex-direction: row; justify-content: space-between; - h1 { + h1, .loading-title { margin: 45px 0; } + .loading-title { + width: 80%; + height: 40px; + } + + ngx-skeleton-loader { + ::ng-deep { + > div { + height: 100%; + } + } + } + .title-actions { .top { font-size: x-large; @@ -88,6 +101,11 @@ $calendar-size: 120px; margin-top: 0; } } + + ngx-skeleton-loader { + display: block; + width: 80%; + } } .event-registration { @@ -122,4 +140,13 @@ $calendar-size: 120px; } } } + + .loading { + .event-description, + .event-registration, + section h3, + i { + color: #9e9e9e !important + } + } } \ No newline at end of file diff --git a/src/app/features/events/components/event/event.component.ts b/src/app/features/events/components/event/event.component.ts index ee14c723..331521b1 100644 --- a/src/app/features/events/components/event/event.component.ts +++ b/src/app/features/events/components/event/event.component.ts @@ -4,24 +4,20 @@ import { Translations } from 'src/app/core/services/translations.service'; import { Banner } from 'src/app/shared/components/banner/banner.component'; import { Event } from '../../models/event'; import { MaterialButtonType } from 'src/app/shared/models/material-button-type'; -import { Location } from 'src/app/core/models/location'; import { TooltipDirection } from 'src/app/shared/models/tooltip-direction'; -import { Group } from 'src/app/features/groups/models/group'; -import { Person } from 'src/app/core/models/person'; import { InputType } from 'src/app/shared/models/input-type'; -import { Observable, map, of } from 'rxjs'; import { ActivatedRoute } from '@angular/router'; +import { EventService } from 'src/app/core/services/event.service'; @Component({ selector: 'app-event', templateUrl: './event.component.html', styleUrls: ['./event.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush + //changeDetection: ChangeDetectionStrategy.OnPush }) export class EventComponent implements OnInit { @Input() model: Event | null = null; - event$: Observable = of(null); banner: Banner | null = null; loading: boolean = true; @@ -32,6 +28,7 @@ export class EventComponent implements OnInit { inputType = InputType; private readonly route: ActivatedRoute = inject(ActivatedRoute); + private readonly eventService: EventService = inject(EventService); constructor(public translations: Translations) { @@ -39,15 +36,13 @@ export class EventComponent implements OnInit { ngOnInit(): void { if (!this.model) { - this.event$ = this.route.data.pipe(map(({ event }) => event)); - - this.event$.subscribe((event: Event | null) => { + this.eventService.mockGetEvent(this.route.snapshot.paramMap.get('id'), 1500) + .subscribe(event => { this.model = event; this.banner = this.createBanner(this.model); this.loading = false; }); - } - else { + } else { this.banner = this.createBanner(this.model); this.loading = false; } diff --git a/src/app/features/events/events-routing.module.ts b/src/app/features/events/events-routing.module.ts index b437d452..9dccce59 100644 --- a/src/app/features/events/events-routing.module.ts +++ b/src/app/features/events/events-routing.module.ts @@ -19,9 +19,9 @@ const routes: Routes = [ path: ':id', title: translations.titles.event, component: EventComponent, - resolve: { - event: EventResolver - }, + // resolve: { + // event: EventResolver + // }, data: { title: translations.titles.event, breadcrumb: translations.titles.event diff --git a/src/app/features/events/resolvers/event.resolver.ts b/src/app/features/events/resolvers/event.resolver.ts index 14ab539b..a0d12356 100644 --- a/src/app/features/events/resolvers/event.resolver.ts +++ b/src/app/features/events/resolvers/event.resolver.ts @@ -8,7 +8,7 @@ export const EventResolver: ResolveFn = ( route: ActivatedRouteSnapshot, state: RouterStateSnapshot, eventService: EventService = inject(EventService) -) : Observable => eventService.mockGetEvent(route.paramMap.get('id'), 0) +) : Observable => eventService.mockGetEvent(route.paramMap.get('id'), 1500) .pipe( filter((event: Event) => !!event), take(1) diff --git a/src/app/shared/components/banner/banner.component.html b/src/app/shared/components/banner/banner.component.html index d6964f42..e5711669 100644 --- a/src/app/shared/components/banner/banner.component.html +++ b/src/app/shared/components/banner/banner.component.html @@ -13,4 +13,5 @@
+
\ No newline at end of file diff --git a/src/app/shared/components/banner/banner.component.scss b/src/app/shared/components/banner/banner.component.scss index e4639636..21c2ac5b 100644 --- a/src/app/shared/components/banner/banner.component.scss +++ b/src/app/shared/components/banner/banner.component.scss @@ -46,6 +46,17 @@ top: 0; } } + + ngx-skeleton-loader { + display: block; + height: 100%; + + ::ng-deep { + >div { + height: 100%; + } + } + } } .gcc-header { diff --git a/src/app/shared/components/banner/banner.component.ts b/src/app/shared/components/banner/banner.component.ts index 30a3ab20..1cda8334 100644 --- a/src/app/shared/components/banner/banner.component.ts +++ b/src/app/shared/components/banner/banner.component.ts @@ -11,8 +11,9 @@ import { Translations } from 'src/app/core/services/translations.service'; export class BannerComponent { - @Input() model: Banner | undefined; + @Input() model: Banner | null = null; @Input() headerExpanded: boolean = false; + @Input() loading: boolean = false; constructor(public translations: Translations) {} From 3cd121481ef7f242ec920fe30cae52325ce596c8 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Fri, 25 Aug 2023 12:35:43 -0400 Subject: [PATCH 018/165] fix id issue for tests, update banner --- src/app/app-routing.module.ts | 5 +- src/app/app.component.html | 6 +- src/app/app.component.ts | 8 +- src/app/core/services/news.service.ts | 16 ++- .../components/event/event.component.html | 30 +++--- .../components/event/event.component.scss | 25 ++--- .../components/event/event.component.ts | 2 +- src/app/features/home/home.component.html | 1 + src/app/features/home/home.component.ts | 3 + .../news-card/news-card.component.html | 4 +- .../components/banner/banner.component.scss | 100 ++++++++++-------- .../components/banner/banner.component.ts | 4 +- .../components/button/button.component.html | 3 +- .../components/button/button.component.ts | 2 +- .../components/header/header.component.html | 58 +++++----- .../components/input/input.component.html | 3 +- .../components/input/input.component.ts | 2 +- .../language-selector.component.html | 2 +- .../page-title/page-title.component.scss | 2 +- 19 files changed, 146 insertions(+), 130 deletions(-) diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 1cb2d164..82df9820 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -11,8 +11,6 @@ import { UnauthorizedComponent } from './shared/components/unauthorized/unauthor import { ForbiddenComponent } from './shared/components/forbidden/forbidden.component'; import { Translations } from './core/services/translations.service'; -import { Banner } from './shared/components/banner/banner.component'; - let translations = Translations.getInstance(); const routes: Routes = [ @@ -38,8 +36,7 @@ const routes: Routes = [ canActivate: [InterceptorGuard], data: { title: translations.titles.home, - breadcrumb: translations.titles.home, - banner: new Banner('./assets/svg/banner.svg', translations.banner.welcome, translations.banner.gccollab) + breadcrumb: translations.titles.home } }, { diff --git a/src/app/app.component.html b/src/app/app.component.html index 7cf1d4b0..e8b190ce 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -2,16 +2,12 @@ (headerToggleEvent)="headerToggleEvent($event)" [activeRoute]="activeRoute"> - - -
+
diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 45c981d2..11f3097d 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -1,5 +1,5 @@ import { Component, OnDestroy } from '@angular/core'; -import { ActivatedRoute, NavigationEnd, NavigationStart, Router, RouterEvent }from '@angular/router'; +import { ActivatedRoute, NavigationEnd, Router, RouterEvent }from '@angular/router'; import { filter, Subscription } from 'rxjs'; import { CoreRoutes } from './core/constants/routes.constants'; @@ -8,7 +8,6 @@ import { OidcSecurityService } from 'angular-auth-oidc-client'; import { TranslateService } from "@ngx-translate/core"; import { LanguageStorageService } from './core/services/language-storage.service'; import { Translations } from './core/services/translations.service'; -import { Banner } from './shared/components/banner/banner.component'; @Component({ @@ -20,9 +19,7 @@ export class AppComponent implements OnDestroy { showHeaderFooter: boolean = true; showSearchBar: boolean = false; - showBanner: boolean = false; activeRoute: string = CoreRoutes.Home; - banner: Banner | null = null; private checkAuthSub!: Subscription; private langChangeSub!: Subscription; @@ -98,9 +95,6 @@ export class AppComponent implements OnDestroy { } this.activeRoute = url; - - this.banner = this.getRouteData('banner'); - this.showBanner = this.banner instanceof Banner; }); } diff --git a/src/app/core/services/news.service.ts b/src/app/core/services/news.service.ts index 7c607be5..5840a634 100644 --- a/src/app/core/services/news.service.ts +++ b/src/app/core/services/news.service.ts @@ -78,7 +78,7 @@ export class NewsService { newsItem.id = this.id.toString(); newsItem.date = new Date(); - newsItem.content = this.lorem.generateParagraphs(Math.floor(Math.random() * 2) + 1); + newsItem.content = this.randomContent(); newsItem.comments = Math.floor(Math.random() * 199) + 1; newsItem.likes = Math.floor(Math.random() * 99) + 1; newsItem.author = this.peopleService.people[this.id]; @@ -87,4 +87,18 @@ export class NewsService { return newsItem; } + + private randomContent(): string { + let content: string = ''; + let paragraphs = (Math.random() * 4) + 1; + + for (let i = 0; i < paragraphs; i++) { + content += this.lorem.generateSentences(Math.floor(Math.random() * 10) + 4); + + if (i != paragraphs - 1) + content += '

'; + } + + return content; + } } diff --git a/src/app/features/events/components/event/event.component.html b/src/app/features/events/components/event/event.component.html index e419926b..ea75b274 100644 --- a/src/app/features/events/components/event/event.component.html +++ b/src/app/features/events/components/event/event.component.html @@ -1,4 +1,7 @@ - + +
- -
- {{ translations.event.form.register | translate }} @@ -110,7 +116,7 @@

{{ translations.event.event_description | translate }}

- +
@@ -118,7 +124,7 @@

{{ translations.event.event_registration | translate }}

- {{ translations.event.event_registration | translate }} - {{ translations.event.event_registration | translate }} - {{ translations.event.event_registration | translate }} - {{ translations.event.event_registration | translate }} - @@ -167,7 +173,7 @@

{{ translations.event.event_registration | translate }}

- @@ -175,7 +181,7 @@

{{ translations.event.event_registration | translate }}

- div { + border: 1px solid white; + } + } + } + } } .page-container { @@ -45,7 +42,7 @@ $calendar-size: 120px; } .loading-title { - width: 80%; + width: 50%; height: 40px; } diff --git a/src/app/features/events/components/event/event.component.ts b/src/app/features/events/components/event/event.component.ts index 331521b1..fa2e19a8 100644 --- a/src/app/features/events/components/event/event.component.ts +++ b/src/app/features/events/components/event/event.component.ts @@ -36,7 +36,7 @@ export class EventComponent implements OnInit { ngOnInit(): void { if (!this.model) { - this.eventService.mockGetEvent(this.route.snapshot.paramMap.get('id'), 1500) + this.eventService.mockGetEvent(this.route.snapshot.paramMap.get('id'), 3000) .subscribe(event => { this.model = event; this.banner = this.createBanner(this.model); diff --git a/src/app/features/home/home.component.html b/src/app/features/home/home.component.html index 45208960..06f4adc8 100644 --- a/src/app/features/home/home.component.html +++ b/src/app/features/home/home.component.html @@ -1,3 +1,4 @@ +
diff --git a/src/app/features/home/home.component.ts b/src/app/features/home/home.component.ts index d9c26285..0efefa7d 100644 --- a/src/app/features/home/home.component.ts +++ b/src/app/features/home/home.component.ts @@ -11,6 +11,7 @@ import { Person } from 'src/app/core/models/person'; import { PeopleService } from 'src/app/core/services/people.service'; import { Group } from '../groups/models/group'; import { GroupService } from 'src/app/core/services/group.service'; +import { Banner } from 'src/app/shared/components/banner/banner.component'; @Component({ templateUrl: './home.component.html', @@ -18,6 +19,8 @@ import { GroupService } from 'src/app/core/services/group.service'; }) export class HomeComponent implements OnInit { + banner: Banner = new Banner('../../../assets/svg/banner.svg', this.translations.banner.welcome, this.translations.banner.gccollab); + inputType = InputType.Password; routes = CoreRoutes; diff --git a/src/app/features/news-feed/components/news-card/news-card.component.html b/src/app/features/news-feed/components/news-card/news-card.component.html index 7136db33..dc677605 100644 --- a/src/app/features/news-feed/components/news-card/news-card.component.html +++ b/src/app/features/news-feed/components/news-card/news-card.component.html @@ -25,9 +25,7 @@ -

- {{ model?.content }} -

+

div { - height: 50%; + height: 25vw; + min-height: 215px; + max-height: 420px; + background-size: cover !important; + background-repeat: no-repeat !important; + margin-top: 0; + + img { + width: 100%; } - - .top, .bottom { - position: relative; - padding-left: $gutter-desktop; - - div { - position: absolute; - } - } - - .top > div { - bottom: 0; - } - .bottom > div { + + .banner-text-container { + width: 100%; + height: 100%; + position: absolute; + color: $primary-1-contrast; + font-size: 68px; + font-weight: $bold; + cursor: default; top: 0; + + > div { + height: 50%; + } + + .top, .bottom { + position: relative; + padding-left: $gutter-desktop; + + div { + position: absolute; + } + } + + .top > div { + bottom: 0; + } + .bottom > div { + top: 0; + } } - } - - ngx-skeleton-loader { - display: block; - height: 100%; - - ::ng-deep { - >div { - height: 100%; + + ngx-skeleton-loader { + display: block; + height: 100%; + + ::ng-deep { + >div { + height: 100%; + } } } } diff --git a/src/app/shared/components/banner/banner.component.ts b/src/app/shared/components/banner/banner.component.ts index 1cda8334..6e0a5a0b 100644 --- a/src/app/shared/components/banner/banner.component.ts +++ b/src/app/shared/components/banner/banner.component.ts @@ -23,9 +23,9 @@ export class Banner { textTop: string; textBottom: string; - backgroundImage: string = '../../../../assets/svg/banner.svg'; + backgroundImage: string; - constructor(backgroundImage: string, textTop: string = '', textBottom: string = '') { + constructor(backgroundImage: string = '../../../../assets/svg/banner.svg', textTop: string = '', textBottom: string = '') { this.backgroundImage = backgroundImage; this.textTop = textTop; this.textBottom = textBottom; diff --git a/src/app/shared/components/button/button.component.html b/src/app/shared/components/button/button.component.html index ba6ac122..f1fc07d1 100644 --- a/src/app/shared/components/button/button.component.html +++ b/src/app/shared/components/button/button.component.html @@ -1,5 +1,5 @@ \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/app/shared/components/button/button.component.scss b/src/app/shared/components/button/button.component.scss index 11a2c4b3..4b2d5060 100644 --- a/src/app/shared/components/button/button.component.scss +++ b/src/app/shared/components/button/button.component.scss @@ -3,12 +3,14 @@ button { margin: 0; + padding: 0; } .gcc-button-inner { display: flex; flex-direction: row; justify-content: center; + align-items: center; gap: 5px; .mat-icon { @@ -21,5 +23,9 @@ .mat-mdc-button:not(:disabled) { color: inherit; } + + .mat-mdc-button .mdc-button__label, .mat-mdc-unelevated-button .mdc-button__label, .mat-mdc-raised-button .mdc-button__label, .mat-mdc-outlined-button .mdc-button__label { + padding: 0 16px 0 16px; + } } } \ No newline at end of file diff --git a/src/app/shared/components/button/button.component.ts b/src/app/shared/components/button/button.component.ts index 433ba6dd..5c40e28a 100644 --- a/src/app/shared/components/button/button.component.ts +++ b/src/app/shared/components/button/button.component.ts @@ -12,20 +12,22 @@ import { TooltipDirection } from '../../models/tooltip-direction'; }) export class ButtonComponent implements OnInit { - @Input() btnId: string = ''; - @Input() name: string = ''; - @Input() value: string = ''; - @Input() tooltip: string = ''; + @Input() btnId!: string; + @Input() name!: string; + @Input() value!: string; + @Input() tooltip!: string; @Input() tooltipDirection: TooltipDirection = TooltipDirection.Below; - @Input() ariaLabel: string = ''; - @Input() type: ButtonType = ButtonType.Button; - @Input() matButtonType: MaterialButtonType = MaterialButtonType.Raised; - @Input() matColor: MaterialColor = MaterialColor.Primary; // TODO: Implement this so it defaults to primary contrast + @Input() ariaLabel!: string; + @Input() type: ButtonType | string = ButtonType.Button; + @Input() matButtonType: MaterialButtonType | string = MaterialButtonType.Raised; + @Input() matColor: MaterialColor | string = ''; @Input() disabled: boolean = false; @Input() autofocus: boolean = false; - @Input() matIcon: string = ''; + @Input() matIcon!: string; @Input() fontSize: string = 'inherit'; + public materialButtonType = MaterialButtonType; + constructor() { } ngOnInit(): void { diff --git a/src/app/shared/components/calendar-button/calendar-button.component.scss b/src/app/shared/components/calendar-button/calendar-button.component.scss index fae4dc2a..1657ccd5 100644 --- a/src/app/shared/components/calendar-button/calendar-button.component.scss +++ b/src/app/shared/components/calendar-button/calendar-button.component.scss @@ -2,6 +2,8 @@ :host { display: block; + container-type: inline-size; + container-name: calendar; .event-calendar { display: flex; @@ -14,15 +16,29 @@ color: $secondary-2-contrast; background: $secondary-2-gradient; cursor: pointer; + + @container calendar (min-width: 65px) { + div:first-child { + font-weight: 400; + font-size: 20px; + } - div:first-child { - font-weight: 400; - font-size: 36px; + div:last-child { + font-weight: 700; + font-size: 24px; + } } - - div:last-child { - font-weight: 700; - font-size: 52px; + + @container calendar (min-width: 120px) { + div:first-child { + font-weight: 400; + font-size: 36px; + } + + div:last-child { + font-weight: 700; + font-size: 52px; + } } } @@ -35,10 +51,12 @@ } .event-calendar-loading { + ::ng-deep >div { width: 100%; height: 100%; border-radius: 12px; + margin: 0; } } } diff --git a/src/app/shared/components/footer/footer.component.scss b/src/app/shared/components/footer/footer.component.scss index 5bfeeece..fdccb079 100644 --- a/src/app/shared/components/footer/footer.component.scss +++ b/src/app/shared/components/footer/footer.component.scss @@ -2,6 +2,7 @@ @import "../../../../assets/scss/partials/layout"; footer { + width: 100vw; background: $primary-1-gradient; h3 { diff --git a/src/app/shared/components/header/header.component.html b/src/app/shared/components/header/header.component.html index 01ed5567..b4d24044 100644 --- a/src/app/shared/components/header/header.component.html +++ b/src/app/shared/components/header/header.component.html @@ -71,7 +71,8 @@ [tooltip]="translations.header.profile.tooltip | translate" [ariaLabel]="translations.header.profile.aria | translate" [routerLink]="[routes.Profile]" - [ngClass]="activeRoute == routes.Profile ? 'selected' : ''"> + [ngClass]="activeRoute == routes.Profile ? 'selected' : ''" + class="profile-btn"> Date: Mon, 28 Aug 2023 19:09:06 +0000 Subject: [PATCH 022/165] Dependency Graph ignore-deploy --- dependency-graph.svg | 4024 ++++++++++++++++++++++-------------------- 1 file changed, 2098 insertions(+), 1926 deletions(-) diff --git a/dependency-graph.svg b/dependency-graph.svg index f3975faf..aa0fe8ee 100644 --- a/dependency-graph.svg +++ b/dependency-graph.svg @@ -4,367 +4,377 @@ - - + + dependency-cruiser output - + cluster_src - -src + +src cluster_src/app - -app + +app cluster_src/app/core - -core + +core cluster_src/app/core/auth - -auth + +auth cluster_src/app/core/constants - -constants + +constants cluster_src/app/core/guards - -guards + +guards cluster_src/app/core/helpers - -helpers + +helpers cluster_src/app/core/interceptors - -interceptors + +interceptors cluster_src/app/core/models - -models + +models cluster_src/app/core/services - -services + +services cluster_src/app/features - -features + +features cluster_src/app/features/about - -about + +about cluster_src/app/features/blog - -blog + +blog cluster_src/app/features/bookmarks - -bookmarks + +bookmarks cluster_src/app/features/dashboard - -dashboard + +dashboard cluster_src/app/features/events - -events + +events cluster_src/app/features/events/components - -components + +components cluster_src/app/features/events/components/event-card - -event-card + +event-card cluster_src/app/features/events/components/event-list - -event-list + +event-list cluster_src/app/features/events/components/event - -event + +event cluster_src/app/features/events/models - -models + +models -cluster_src/app/features/friends - -friends +cluster_src/app/features/events/resolvers + +resolvers -cluster_src/app/features/groups - -groups +cluster_src/app/features/friends + +friends -cluster_src/app/features/groups/components - -components +cluster_src/app/features/groups + +groups -cluster_src/app/features/groups/components/group-card - -group-card +cluster_src/app/features/groups/components + +components -cluster_src/app/features/groups/components/group-list - -group-list +cluster_src/app/features/groups/components/group-card + +group-card -cluster_src/app/features/groups/components/group - -group +cluster_src/app/features/groups/components/group-list + +group-list -cluster_src/app/features/groups/models - -models +cluster_src/app/features/groups/components/group + +group -cluster_src/app/features/home - -home +cluster_src/app/features/groups/models + +models -cluster_src/app/features/invite - -invite +cluster_src/app/features/home + +home -cluster_src/app/features/login - -login +cluster_src/app/features/invite + +invite -cluster_src/app/features/members - -members +cluster_src/app/features/login + +login -cluster_src/app/features/messages - -messages +cluster_src/app/features/members + +members -cluster_src/app/features/missions - -missions +cluster_src/app/features/messages + +messages -cluster_src/app/features/news-feed - -news-feed +cluster_src/app/features/missions + +missions -cluster_src/app/features/news-feed/components - -components +cluster_src/app/features/news-feed + +news-feed -cluster_src/app/features/news-feed/components/news-card - -news-card +cluster_src/app/features/news-feed/components + +components -cluster_src/app/features/news-feed/components/news-list - -news-list +cluster_src/app/features/news-feed/components/news-card + +news-card -cluster_src/app/features/news-feed/models - -models +cluster_src/app/features/news-feed/components/news-list + +news-list -cluster_src/app/features/privacy - -privacy +cluster_src/app/features/news-feed/models + +models -cluster_src/app/features/profile - -profile +cluster_src/app/features/privacy + +privacy -cluster_src/app/features/profile/components - -components +cluster_src/app/features/profile + +profile -cluster_src/app/features/profile/components/profile-card - -profile-card +cluster_src/app/features/profile/components + +components -cluster_src/app/features/profile/components/profile-list - -profile-list +cluster_src/app/features/profile/components/profile-card + +profile-card -cluster_src/app/features/register - -register +cluster_src/app/features/profile/components/profile-list + +profile-list -cluster_src/app/features/search - -search +cluster_src/app/features/register + +register -cluster_src/app/features/settings - -settings +cluster_src/app/features/search + +search -cluster_src/app/features/splash - -splash +cluster_src/app/features/settings + +settings -cluster_src/app/features/stats - -stats +cluster_src/app/features/splash + +splash -cluster_src/app/features/terms - -terms +cluster_src/app/features/stats + +stats -cluster_src/app/features/the-wire - -the-wire +cluster_src/app/features/terms + +terms -cluster_src/app/shared - -shared +cluster_src/app/features/the-wire + +the-wire -cluster_src/app/shared/components - -components +cluster_src/app/shared + +shared -cluster_src/app/shared/components/banner - -banner +cluster_src/app/shared/components + +components -cluster_src/app/shared/components/button - -button +cluster_src/app/shared/components/banner + +banner -cluster_src/app/shared/components/editor - -editor +cluster_src/app/shared/components/button + +button -cluster_src/app/shared/components/footer - -footer +cluster_src/app/shared/components/calendar-button + +calendar-button -cluster_src/app/shared/components/forbidden - -forbidden +cluster_src/app/shared/components/editor + +editor -cluster_src/app/shared/components/header - -header +cluster_src/app/shared/components/footer + +footer -cluster_src/app/shared/components/input - -input +cluster_src/app/shared/components/forbidden + +forbidden -cluster_src/app/shared/components/language-selector - -language-selector +cluster_src/app/shared/components/header + +header -cluster_src/app/shared/components/not-found - -not-found +cluster_src/app/shared/components/input + +input -cluster_src/app/shared/components/page-title - -page-title +cluster_src/app/shared/components/language-selector + +language-selector -cluster_src/app/shared/components/profile-pic - -profile-pic +cluster_src/app/shared/components/not-found + +not-found -cluster_src/app/shared/components/unauthorized - -unauthorized +cluster_src/app/shared/components/page-title + +page-title -cluster_src/app/shared/factories - -factories +cluster_src/app/shared/components/profile-pic + +profile-pic -cluster_src/app/shared/models - -models +cluster_src/app/shared/components/unauthorized + +unauthorized -cluster_src/assets - -assets +cluster_src/app/shared/factories + +factories -cluster_src/assets/i18n - -i18n +cluster_src/app/shared/models + +models +cluster_src/assets + +assets + + +cluster_src/assets/i18n + +i18n + + cluster_src/environments - -environments + +environments src/app/app-routing.module.ts - -app-routing.module.ts + +app-routing.module.ts @@ -372,1999 +382,2011 @@ src/app/core/constants/routes.constants.ts - -routes.constants.ts + +routes.constants.ts src/app/app-routing.module.ts->src/app/core/constants/routes.constants.ts - - + + src/app/core/guards/auth.guard.ts - -auth.guard.ts + +auth.guard.ts src/app/app-routing.module.ts->src/app/core/guards/auth.guard.ts - - + + src/app/core/guards/interceptor.guard.ts - -interceptor.guard.ts + +interceptor.guard.ts src/app/app-routing.module.ts->src/app/core/guards/interceptor.guard.ts - - + + src/app/core/guards/login.guard.ts - -login.guard.ts + +login.guard.ts src/app/app-routing.module.ts->src/app/core/guards/login.guard.ts - - + + src/app/core/guards/redirect.guard.ts - -redirect.guard.ts + +redirect.guard.ts src/app/app-routing.module.ts->src/app/core/guards/redirect.guard.ts - - + + src/app/core/services/translations.service.ts - -translations.service.ts + +translations.service.ts src/app/app-routing.module.ts->src/app/core/services/translations.service.ts - - + + src/app/features/about/about.module.ts - -about.module.ts + +about.module.ts src/app/app-routing.module.ts->src/app/features/about/about.module.ts - - - - + + + + src/app/features/blog/blog.module.ts - -blog.module.ts + +blog.module.ts src/app/app-routing.module.ts->src/app/features/blog/blog.module.ts - - - - + + + + src/app/features/bookmarks/bookmarks.module.ts - -bookmarks.module.ts + +bookmarks.module.ts src/app/app-routing.module.ts->src/app/features/bookmarks/bookmarks.module.ts - - - - + + + + src/app/features/dashboard/dashboard.module.ts - -dashboard.module.ts + +dashboard.module.ts src/app/app-routing.module.ts->src/app/features/dashboard/dashboard.module.ts - - - - + + + + src/app/features/events/events.module.ts - -events.module.ts + +events.module.ts src/app/app-routing.module.ts->src/app/features/events/events.module.ts - - - - + + + + src/app/features/friends/friends.module.ts - -friends.module.ts + +friends.module.ts src/app/app-routing.module.ts->src/app/features/friends/friends.module.ts - - - - + + + + src/app/features/groups/groups.module.ts - -groups.module.ts + +groups.module.ts src/app/app-routing.module.ts->src/app/features/groups/groups.module.ts - - - - + + + + src/app/features/home/home.module.ts - -home.module.ts + +home.module.ts src/app/app-routing.module.ts->src/app/features/home/home.module.ts - - - - + + + + src/app/features/invite/invite.module.ts - -invite.module.ts + +invite.module.ts src/app/app-routing.module.ts->src/app/features/invite/invite.module.ts - - - - + + + + src/app/features/login/login.module.ts - -login.module.ts + +login.module.ts src/app/app-routing.module.ts->src/app/features/login/login.module.ts - - - - + + + + src/app/features/members/members.module.ts - -members.module.ts + +members.module.ts src/app/app-routing.module.ts->src/app/features/members/members.module.ts - - - - + + + + src/app/features/messages/messages.module.ts - -messages.module.ts + +messages.module.ts src/app/app-routing.module.ts->src/app/features/messages/messages.module.ts - - - - + + + + src/app/features/missions/missions.module.ts - -missions.module.ts + +missions.module.ts src/app/app-routing.module.ts->src/app/features/missions/missions.module.ts - - - - + + + + src/app/features/news-feed/news-feed.module.ts - -news-feed.module.ts + +news-feed.module.ts src/app/app-routing.module.ts->src/app/features/news-feed/news-feed.module.ts - - - - + + + + src/app/features/privacy/privacy.module.ts - -privacy.module.ts + +privacy.module.ts src/app/app-routing.module.ts->src/app/features/privacy/privacy.module.ts - - - - + + + + src/app/features/profile/profile.module.ts - -profile.module.ts + +profile.module.ts src/app/app-routing.module.ts->src/app/features/profile/profile.module.ts - - - - + + + + src/app/features/register/register.module.ts - -register.module.ts + +register.module.ts src/app/app-routing.module.ts->src/app/features/register/register.module.ts - - - - + + + + src/app/features/search/search.module.ts - -search.module.ts + +search.module.ts src/app/app-routing.module.ts->src/app/features/search/search.module.ts - - - - + + + + src/app/features/settings/settings.module.ts - -settings.module.ts + +settings.module.ts src/app/app-routing.module.ts->src/app/features/settings/settings.module.ts - - - - + + + + src/app/features/splash/splash.module.ts - -splash.module.ts + +splash.module.ts src/app/app-routing.module.ts->src/app/features/splash/splash.module.ts - - - - + + + + src/app/features/stats/stats.module.ts - -stats.module.ts + +stats.module.ts src/app/app-routing.module.ts->src/app/features/stats/stats.module.ts - - - - + + + + src/app/features/terms/terms.module.ts - -terms.module.ts + +terms.module.ts src/app/app-routing.module.ts->src/app/features/terms/terms.module.ts - - - - + + + + src/app/features/the-wire/the-wire.module.ts - -the-wire.module.ts + +the-wire.module.ts src/app/app-routing.module.ts->src/app/features/the-wire/the-wire.module.ts - - - - - - - -src/app/shared/components/banner/banner.component.ts - - -banner.component.ts - - - - - -src/app/app-routing.module.ts->src/app/shared/components/banner/banner.component.ts - - + + + + - + src/app/shared/components/forbidden/forbidden.component.ts - - -forbidden.component.ts + + +forbidden.component.ts - + src/app/app-routing.module.ts->src/app/shared/components/forbidden/forbidden.component.ts - - + + - + src/app/shared/components/not-found/not-found.component.ts - - -not-found.component.ts + + +not-found.component.ts - + src/app/app-routing.module.ts->src/app/shared/components/not-found/not-found.component.ts - - + + - + src/app/shared/components/unauthorized/unauthorized.component.ts - - -unauthorized.component.ts + + +unauthorized.component.ts - + src/app/app-routing.module.ts->src/app/shared/components/unauthorized/unauthorized.component.ts - - + + - + src/app/core/services/session-storage.service.ts - - -session-storage.service.ts + + +session-storage.service.ts - + src/app/core/guards/auth.guard.ts->src/app/core/services/session-storage.service.ts - - + + - + src/environments/environment.ts - - -environment.ts + + +environment.ts - + src/app/core/guards/auth.guard.ts->src/environments/environment.ts - - + + - + src/app/core/guards/interceptor.guard.ts->src/app/core/services/session-storage.service.ts - - + + src/assets/i18n/translations.en.ts - -translations.en.ts + +translations.en.ts - + src/app/core/services/translations.service.ts->src/assets/i18n/translations.en.ts - - + + - + src/app/shared/shared.module.ts - - -shared.module.ts + + +shared.module.ts - + src/app/features/about/about.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/about/about-routing.module.ts - -about-routing.module.ts + +about-routing.module.ts - + src/app/features/about/about.module.ts->src/app/features/about/about-routing.module.ts - - + + src/app/features/about/about.component.ts - -about.component.ts + +about.component.ts - + src/app/features/about/about.module.ts->src/app/features/about/about.component.ts - - + + - + src/app/features/blog/blog.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/blog/blog-routing.module.ts - -blog-routing.module.ts + +blog-routing.module.ts - + src/app/features/blog/blog.module.ts->src/app/features/blog/blog-routing.module.ts - - + + - + src/app/features/bookmarks/bookmarks.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/bookmarks/bookmarks-routing.module.ts - -bookmarks-routing.module.ts + +bookmarks-routing.module.ts - + src/app/features/bookmarks/bookmarks.module.ts->src/app/features/bookmarks/bookmarks-routing.module.ts - - + + - + src/app/features/dashboard/dashboard.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/dashboard/dashboard-routing.module.ts - -dashboard-routing.module.ts + +dashboard-routing.module.ts - + src/app/features/dashboard/dashboard.module.ts->src/app/features/dashboard/dashboard-routing.module.ts - - + + - + src/app/features/events/events.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/events/components/event-card/event-card.component.ts - -event-card.component.ts + +event-card.component.ts - + src/app/features/events/events.module.ts->src/app/features/events/components/event-card/event-card.component.ts - - + + src/app/features/events/components/event-list/event-list.component.ts - -event-list.component.ts + +event-list.component.ts - + src/app/features/events/events.module.ts->src/app/features/events/components/event-list/event-list.component.ts - - + + src/app/features/events/components/event/event.component.ts - -event.component.ts + +event.component.ts - + src/app/features/events/events.module.ts->src/app/features/events/components/event/event.component.ts - - + + - + src/app/features/events/events-routing.module.ts - - -events-routing.module.ts + + +events-routing.module.ts - + src/app/features/events/events.module.ts->src/app/features/events/events-routing.module.ts - - + + - + src/app/features/friends/friends.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/friends/friends-routing.module.ts - - -friends-routing.module.ts + + +friends-routing.module.ts - + src/app/features/friends/friends.module.ts->src/app/features/friends/friends-routing.module.ts - - + + - + src/app/features/groups/groups.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/groups/components/group-card/group-card.component.ts - - -group-card.component.ts + + +group-card.component.ts - + src/app/features/groups/groups.module.ts->src/app/features/groups/components/group-card/group-card.component.ts - - + + - + src/app/features/groups/components/group-list/group-list.component.ts - - -group-list.component.ts + + +group-list.component.ts - + src/app/features/groups/groups.module.ts->src/app/features/groups/components/group-list/group-list.component.ts - - + + - + src/app/features/groups/components/group/group.component.ts - - -group.component.ts + + +group.component.ts - + src/app/features/groups/groups.module.ts->src/app/features/groups/components/group/group.component.ts - - + + - + src/app/features/groups/groups-routing.module.ts - - -groups-routing.module.ts + + +groups-routing.module.ts - + src/app/features/groups/groups.module.ts->src/app/features/groups/groups-routing.module.ts - - + + - + src/app/features/home/home.module.ts->src/app/features/events/events.module.ts - - - - + + + + - + src/app/features/home/home.module.ts->src/app/features/groups/groups.module.ts - - - - + + + + - + src/app/features/home/home.module.ts->src/app/features/news-feed/news-feed.module.ts - - - - + + + + - + src/app/features/home/home.module.ts->src/app/features/profile/profile.module.ts - - - - + + + + - + src/app/features/home/home.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/home/home-routing.module.ts - - -home-routing.module.ts + + +home-routing.module.ts - + src/app/features/home/home.module.ts->src/app/features/home/home-routing.module.ts - - + + - + src/app/features/home/home.component.ts - - -home.component.ts + + +home.component.ts - + src/app/features/home/home.module.ts->src/app/features/home/home.component.ts - - + + - + src/app/features/invite/invite.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/invite/invite-routing.module.ts - - -invite-routing.module.ts + + +invite-routing.module.ts - + src/app/features/invite/invite.module.ts->src/app/features/invite/invite-routing.module.ts - - + + - + src/app/features/login/login.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/login/login-routing.module.ts - - -login-routing.module.ts + + +login-routing.module.ts - + src/app/features/login/login.module.ts->src/app/features/login/login-routing.module.ts - - + + - + src/app/features/login/login.component.ts - - -login.component.ts + + +login.component.ts - + src/app/features/login/login.module.ts->src/app/features/login/login.component.ts - - + + - + src/app/features/members/members.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/members/members-routing.module.ts - - -members-routing.module.ts + + +members-routing.module.ts - + src/app/features/members/members.module.ts->src/app/features/members/members-routing.module.ts - - + + - + src/app/features/messages/messages.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/messages/messages-routing.module.ts - - -messages-routing.module.ts + + +messages-routing.module.ts - + src/app/features/messages/messages.module.ts->src/app/features/messages/messages-routing.module.ts - - + + - + src/app/features/missions/missions.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/missions/missions-routing.module.ts - - -missions-routing.module.ts + + +missions-routing.module.ts - + src/app/features/missions/missions.module.ts->src/app/features/missions/missions-routing.module.ts - - + + - + src/app/features/news-feed/news-feed.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/news-feed/components/news-card/news-card.component.ts - - -news-card.component.ts + + +news-card.component.ts - + src/app/features/news-feed/news-feed.module.ts->src/app/features/news-feed/components/news-card/news-card.component.ts - - + + - + src/app/features/news-feed/components/news-list/news-list.component.ts - - -news-list.component.ts + + +news-list.component.ts - + src/app/features/news-feed/news-feed.module.ts->src/app/features/news-feed/components/news-list/news-list.component.ts - - + + - + src/app/features/news-feed/news-feed-routing.module.ts - - -news-feed-routing.module.ts + + +news-feed-routing.module.ts - + src/app/features/news-feed/news-feed.module.ts->src/app/features/news-feed/news-feed-routing.module.ts - - + + - + src/app/features/privacy/privacy.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/privacy/privacy-routing.module.ts - - -privacy-routing.module.ts + + +privacy-routing.module.ts - + src/app/features/privacy/privacy.module.ts->src/app/features/privacy/privacy-routing.module.ts - - + + - + src/app/features/privacy/privacy.component.ts - - -privacy.component.ts + + +privacy.component.ts - + src/app/features/privacy/privacy.module.ts->src/app/features/privacy/privacy.component.ts - - + + - + src/app/features/profile/profile.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/profile/components/profile-card/profile-card.component.ts - - -profile-card.component.ts + + +profile-card.component.ts - + src/app/features/profile/profile.module.ts->src/app/features/profile/components/profile-card/profile-card.component.ts - - + + - + src/app/features/profile/components/profile-list/profile-list.component.ts - - -profile-list.component.ts + + +profile-list.component.ts - + src/app/features/profile/profile.module.ts->src/app/features/profile/components/profile-list/profile-list.component.ts - - + + - + src/app/features/profile/profile-routing.module.ts - - -profile-routing.module.ts + + +profile-routing.module.ts - + src/app/features/profile/profile.module.ts->src/app/features/profile/profile-routing.module.ts - - + + - + src/app/features/register/register.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/register/register-routing.module.ts - - -register-routing.module.ts + + +register-routing.module.ts - + src/app/features/register/register.module.ts->src/app/features/register/register-routing.module.ts - - + + - + src/app/features/register/register.component.ts - - -register.component.ts + + +register.component.ts - + src/app/features/register/register.module.ts->src/app/features/register/register.component.ts - - + + - + src/app/features/search/search.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/search/search-routing.module.ts - - -search-routing.module.ts + + +search-routing.module.ts - + src/app/features/search/search.module.ts->src/app/features/search/search-routing.module.ts - - + + - + src/app/features/settings/settings.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/settings/settings-routing.module.ts - - -settings-routing.module.ts + + +settings-routing.module.ts - + src/app/features/settings/settings.module.ts->src/app/features/settings/settings-routing.module.ts - - + + - + src/app/features/splash/splash.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/splash/splash-routing.module.ts - - -splash-routing.module.ts + + +splash-routing.module.ts - + src/app/features/splash/splash.module.ts->src/app/features/splash/splash-routing.module.ts - - + + - + src/app/features/splash/splash.component.ts - - -splash.component.ts + + +splash.component.ts - + src/app/features/splash/splash.module.ts->src/app/features/splash/splash.component.ts - - + + - + src/app/features/stats/stats.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/stats/stats-routing.module.ts - - -stats-routing.module.ts + + +stats-routing.module.ts - + src/app/features/stats/stats.module.ts->src/app/features/stats/stats-routing.module.ts - - + + - + src/app/features/stats/stats.component.ts - - -stats.component.ts + + +stats.component.ts - + src/app/features/stats/stats.module.ts->src/app/features/stats/stats.component.ts - - + + - + src/app/features/terms/terms.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/terms/terms-routing.module.ts - - -terms-routing.module.ts + + +terms-routing.module.ts - + src/app/features/terms/terms.module.ts->src/app/features/terms/terms-routing.module.ts - - + + - + src/app/features/terms/terms.component.ts - - -terms.component.ts + + +terms.component.ts - + src/app/features/terms/terms.module.ts->src/app/features/terms/terms.component.ts - - + + - + src/app/features/the-wire/the-wire.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/the-wire/the-wire-routing.module.ts - - -the-wire-routing.module.ts + + +the-wire-routing.module.ts - + src/app/features/the-wire/the-wire.module.ts->src/app/features/the-wire/the-wire-routing.module.ts - - - - - -src/app/shared/components/banner/banner.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/app.component.spec.ts - - -app.component.spec.ts + + +app.component.spec.ts - + src/app/app.component.ts - - -app.component.ts + + +app.component.ts - + src/app/app.component.spec.ts->src/app/app.component.ts - - + + - + src/app/core/auth/auth.module.ts - - -auth.module.ts + + +auth.module.ts - + src/app/app.component.spec.ts->src/app/core/auth/auth.module.ts - - + + - + src/app/core/helpers/typescript-loader.ts - - -typescript-loader.ts + + +typescript-loader.ts - + src/app/app.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/app.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/app.component.ts->src/app/core/services/translations.service.ts - - - - - -src/app/app.component.ts->src/app/shared/components/banner/banner.component.ts - - + + - + src/app/core/services/language-storage.service.ts - - -language-storage.service.ts + + +language-storage.service.ts - + src/app/app.component.ts->src/app/core/services/language-storage.service.ts - - + + - + src/app/core/auth/auth.module.ts->src/app/core/services/session-storage.service.ts - - + + - + src/app/core/auth/auth.module.ts->src/environments/environment.ts - - + + - + src/app/core/services/local-storage-ref.service.ts - - -local-storage-ref.service.ts + + +local-storage-ref.service.ts - + src/app/core/services/language-storage.service.ts->src/app/core/services/local-storage-ref.service.ts - - + + - + src/app/app.module.ts - - -app.module.ts + + +app.module.ts - + src/app/app.module.ts->src/app/app-routing.module.ts - - - - + + + + - + src/app/app.module.ts->src/app/app.component.ts - - + + - + src/app/app.module.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/core/core.module.ts - - -core.module.ts + + +core.module.ts - + src/app/app.module.ts->src/app/core/core.module.ts - - - - + + + + - + src/app/core/services/title.service.ts - - -title.service.ts + + +title.service.ts - + src/app/app.module.ts->src/app/core/services/title.service.ts - - + + - + src/app/features/events/events.component.ts - - -events.component.ts + + +events.component.ts - + src/app/app.module.ts->src/app/features/events/events.component.ts - - + + - + src/app/features/groups/groups.component.ts - - -groups.component.ts + + +groups.component.ts - + src/app/app.module.ts->src/app/features/groups/groups.component.ts - - + + - + src/app/app.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/core/core.module.ts->src/app/core/auth/auth.module.ts - - + + - + src/app/core/core.module.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/core/core.module.ts->src/app/app.module.ts - - - - + + + + - + src/app/shared/shared.module.ts->src/app/core/services/translations.service.ts - - - - - -src/app/shared/shared.module.ts->src/app/shared/components/banner/banner.component.ts - - + + - + src/app/shared/shared.module.ts->src/app/shared/components/forbidden/forbidden.component.ts - - + + - + src/app/shared/shared.module.ts->src/app/shared/components/not-found/not-found.component.ts - - + + - + src/app/shared/shared.module.ts->src/app/shared/components/unauthorized/unauthorized.component.ts - - + + - + src/app/shared/shared.module.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/shared.module.ts->src/app/app.module.ts - - - - + + + + + + + +src/app/shared/components/banner/banner.component.ts + + +banner.component.ts + + + + + +src/app/shared/shared.module.ts->src/app/shared/components/banner/banner.component.ts + + - + src/app/shared/components/button/button.component.ts - - -button.component.ts + + +button.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/button/button.component.ts - - + + + + + +src/app/shared/components/calendar-button/calendar-button.component.ts + + +calendar-button.component.ts + + + + + +src/app/shared/shared.module.ts->src/app/shared/components/calendar-button/calendar-button.component.ts + + - + src/app/shared/components/editor/editor.component.ts - - -editor.component.ts + + +editor.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/editor/editor.component.ts - - + + - + src/app/shared/factories/editor-config.factory.ts - - -editor-config.factory.ts + + +editor-config.factory.ts - + src/app/shared/shared.module.ts->src/app/shared/factories/editor-config.factory.ts - - + + - + src/app/shared/components/footer/footer.component.ts - - -footer.component.ts + + +footer.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/footer/footer.component.ts - - + + - + src/app/shared/components/header/header.component.ts - - -header.component.ts + + +header.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/header/header.component.ts - - + + - + src/app/shared/components/input/input.component.ts - - -input.component.ts + + +input.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/input/input.component.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.ts - - -language-selector.component.ts + + +language-selector.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/language-selector/language-selector.component.ts - - + + - + src/app/shared/components/page-title/page-title.component.ts - - -page-title.component.ts + + +page-title.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/page-title/page-title.component.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.ts - - -profile-pic.component.ts + + +profile-pic.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/profile-pic/profile-pic.component.ts - - + + - + src/app/core/services/session-storage.service.ts->src/app/core/services/local-storage-ref.service.ts - - + + - + src/app/core/guards/auth.guard.spec.ts - - -auth.guard.spec.ts + + +auth.guard.spec.ts - + src/app/core/guards/auth.guard.spec.ts->src/app/core/guards/auth.guard.ts - - + + - + src/app/core/guards/auth.guard.spec.ts->src/app/core/auth/auth.module.ts - - + + - + src/app/core/guards/auth.guard.spec.ts->src/app/core/services/session-storage.service.ts - - + + - + src/app/core/guards/interceptor.guard.spec.ts - - -interceptor.guard.spec.ts + + +interceptor.guard.spec.ts - + src/app/core/guards/interceptor.guard.spec.ts->src/app/core/guards/interceptor.guard.ts - - + + - + src/app/core/guards/login.guard.spec.ts - - -login.guard.spec.ts + + +login.guard.spec.ts - + src/app/core/guards/login.guard.spec.ts->src/app/core/guards/login.guard.ts - - + + - + src/app/core/guards/login.guard.spec.ts->src/app/core/auth/auth.module.ts - - + + - + src/app/core/guards/redirect.guard.spec.ts - - -redirect.guard.spec.ts + + +redirect.guard.spec.ts - + src/app/core/guards/redirect.guard.spec.ts->src/app/core/guards/redirect.guard.ts - - + + - + src/app/core/guards/role.guard.spec.ts - - -role.guard.spec.ts + + +role.guard.spec.ts - + src/app/core/guards/role.guard.ts - - -role.guard.ts + + +role.guard.ts - + src/app/core/guards/role.guard.spec.ts->src/app/core/guards/role.guard.ts - - + + - + src/app/core/interceptors/error.interceptor.spec.ts - - -error.interceptor.spec.ts + + +error.interceptor.spec.ts - + src/app/core/interceptors/error.interceptor.ts - - -error.interceptor.ts + + +error.interceptor.ts - + src/app/core/interceptors/error.interceptor.spec.ts->src/app/core/interceptors/error.interceptor.ts - - + + + + + +src/app/core/models/location.ts + + +location.ts + + src/app/core/models/person.ts - -person.ts + +person.ts + + +src/app/core/models/person.ts->src/app/core/models/location.ts + + + src/app/core/services/event.service.spec.ts - -event.service.spec.ts + +event.service.spec.ts @@ -2372,236 +2394,266 @@ src/app/core/services/event.service.ts - -event.service.ts + +event.service.ts - + src/app/core/services/event.service.spec.ts->src/app/core/services/event.service.ts - - + + - + + +src/app/core/services/event.service.ts->src/app/core/models/location.ts + + + + -src/app/features/events/models/event.ts - - -event.ts +src/app/core/services/group.service.ts + + +group.service.ts - + -src/app/core/services/event.service.ts->src/app/features/events/models/event.ts - - - - - -src/app/features/events/models/event.ts->src/app/core/models/person.ts - - +src/app/core/services/event.service.ts->src/app/core/services/group.service.ts + + - + -src/app/core/services/group.service.spec.ts - - -group.service.spec.ts +src/app/core/services/people.service.ts + + +people.service.ts - + + +src/app/core/services/event.service.ts->src/app/core/services/people.service.ts + + + + -src/app/core/services/group.service.ts - - -group.service.ts +src/app/features/events/models/event.ts + + +event.ts - - -src/app/core/services/group.service.spec.ts->src/app/core/services/group.service.ts - - + + +src/app/core/services/event.service.ts->src/app/features/events/models/event.ts + + - + src/app/features/groups/models/group.ts - - -group.ts + + +group.ts - + src/app/core/services/group.service.ts->src/app/features/groups/models/group.ts - - + + + + + +src/app/core/services/people.service.ts->src/app/core/models/location.ts + + + + + +src/app/core/services/people.service.ts->src/app/core/models/person.ts + + + + + +src/app/features/events/models/event.ts->src/app/core/models/location.ts + + + + + +src/app/features/events/models/event.ts->src/app/core/models/person.ts + + + + + +src/app/features/events/models/event.ts->src/app/features/groups/models/group.ts + + + + + +src/app/core/services/group.service.spec.ts + + +group.service.spec.ts + + + + + +src/app/core/services/group.service.spec.ts->src/app/core/services/group.service.ts + + - + src/app/core/services/language-storage.service.spec.ts - - -language-storage.service.spec.ts + + +language-storage.service.spec.ts - + src/app/core/services/language-storage.service.spec.ts->src/app/core/services/language-storage.service.ts - - + + - + src/app/core/services/local-storage-ref.service.spec.ts - - -local-storage-ref.service.spec.ts + + +local-storage-ref.service.spec.ts - + src/app/core/services/local-storage-ref.service.spec.ts->src/app/core/services/local-storage-ref.service.ts - - + + - + src/app/core/services/news.service.spec.ts - - -news.service.spec.ts + + +news.service.spec.ts - + src/app/core/services/news.service.ts - - -news.service.ts + + +news.service.ts - + src/app/core/services/news.service.spec.ts->src/app/core/services/news.service.ts - - - - - -src/app/core/services/news.service.ts->src/app/core/models/person.ts - - - - - -src/app/core/services/people.service.ts - - -people.service.ts - - + + - + src/app/core/services/news.service.ts->src/app/core/services/people.service.ts - - + + src/app/features/news-feed/models/news-item.ts - -news-item.ts + +news-item.ts - + src/app/core/services/news.service.ts->src/app/features/news-feed/models/news-item.ts - - - - - -src/app/core/services/people.service.ts->src/app/core/models/person.ts - - + + - + src/app/features/news-feed/models/news-item.ts->src/app/core/models/person.ts - - + + src/app/core/services/people.service.spec.ts - -people.service.spec.ts + +people.service.spec.ts - + src/app/core/services/people.service.spec.ts->src/app/core/services/people.service.ts - - + + src/app/core/services/session-storage.service.spec.ts - -session-storage.service.spec.ts + +session-storage.service.spec.ts - + src/app/core/services/session-storage.service.spec.ts->src/app/core/services/session-storage.service.ts - - + + src/app/core/services/title.service.spec.ts - -title.service.spec.ts + +title.service.spec.ts - + src/app/core/services/title.service.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/core/services/title.service.spec.ts->src/app/core/services/title.service.ts - - + + src/app/core/services/user.service.spec.ts - -user.service.spec.ts + +user.service.spec.ts @@ -2609,1502 +2661,1622 @@ src/app/core/services/user.service.ts - -user.service.ts + +user.service.ts - + src/app/core/services/user.service.spec.ts->src/app/core/services/user.service.ts - - + + - + src/app/features/about/about-routing.module.ts->src/app/features/about/about.component.ts - - + + src/app/features/about/about.component.spec.ts - -about.component.spec.ts + +about.component.spec.ts - + src/app/features/about/about.component.spec.ts->src/app/features/about/about.component.ts - - + + src/app/features/blog/blog.component.ts - -blog.component.ts + +blog.component.ts - + src/app/features/blog/blog-routing.module.ts->src/app/features/blog/blog.component.ts - - + + src/app/features/blog/blog.component.spec.ts - -blog.component.spec.ts + +blog.component.spec.ts - + src/app/features/blog/blog.component.spec.ts->src/app/features/blog/blog.component.ts - - + + src/app/features/bookmarks/bookmarks.component.ts - -bookmarks.component.ts + +bookmarks.component.ts - + src/app/features/bookmarks/bookmarks-routing.module.ts->src/app/features/bookmarks/bookmarks.component.ts - - + + src/app/features/bookmarks/bookmarks.component.spec.ts - -bookmarks.component.spec.ts + +bookmarks.component.spec.ts - + src/app/features/bookmarks/bookmarks.component.spec.ts->src/app/features/bookmarks/bookmarks.component.ts - - + + src/app/features/dashboard/dashboard.component.ts - -dashboard.component.ts + +dashboard.component.ts - + src/app/features/dashboard/dashboard-routing.module.ts->src/app/features/dashboard/dashboard.component.ts - - + + src/app/features/dashboard/dashboard.component.spec.ts - -dashboard.component.spec.ts + +dashboard.component.spec.ts - + src/app/features/dashboard/dashboard.component.spec.ts->src/app/features/dashboard/dashboard.component.ts - - + + src/app/features/events/components/event-card/event-card.component.spec.ts - -event-card.component.spec.ts + +event-card.component.spec.ts - + src/app/features/events/components/event-card/event-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/events/components/event-card/event-card.component.spec.ts->src/app/features/events/components/event-card/event-card.component.ts - - + + - + src/app/features/events/components/event-card/event-card.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/features/events/components/event-card/event-card.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/events/components/event-card/event-card.component.ts->src/app/features/events/models/event.ts - - + + src/app/shared/models/material-button-type.ts - -material-button-type.ts + +material-button-type.ts - + src/app/features/events/components/event-card/event-card.component.ts->src/app/shared/models/material-button-type.ts - - + + src/app/shared/models/tooltip-direction.ts - -tooltip-direction.ts + +tooltip-direction.ts - + src/app/features/events/components/event-card/event-card.component.ts->src/app/shared/models/tooltip-direction.ts - - + + src/app/features/events/components/event-list/event-list.component.spec.ts - -event-list.component.spec.ts + +event-list.component.spec.ts - + src/app/features/events/components/event-list/event-list.component.spec.ts->src/app/features/events/components/event-list/event-list.component.ts - - + + - + src/app/features/events/components/event-list/event-list.component.ts->src/app/features/events/models/event.ts - - + + src/app/features/events/components/event/event.component.spec.ts - -event.component.spec.ts + +event.component.spec.ts + + +src/app/features/events/components/event/event.component.spec.ts->src/app/core/helpers/typescript-loader.ts + + + - + src/app/features/events/components/event/event.component.spec.ts->src/app/features/events/components/event/event.component.ts - - + + + + + +src/app/features/events/components/event/event.component.ts->src/app/core/constants/routes.constants.ts + + + + + +src/app/features/events/components/event/event.component.ts->src/app/core/services/translations.service.ts + + + + + +src/app/features/events/components/event/event.component.ts->src/app/core/services/event.service.ts + + + + + +src/app/features/events/components/event/event.component.ts->src/app/features/events/models/event.ts + + + + + +src/app/features/events/components/event/event.component.ts->src/app/shared/models/material-button-type.ts + + + + + +src/app/features/events/components/event/event.component.ts->src/app/shared/models/tooltip-direction.ts + + + + + +src/app/features/events/components/event/event.component.ts->src/app/shared/components/banner/banner.component.ts + + + + + +src/app/shared/models/input-type.ts + + +input-type.ts + + + + + +src/app/features/events/components/event/event.component.ts->src/app/shared/models/input-type.ts + + - + src/app/features/events/events-routing.module.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/events/events-routing.module.ts->src/app/features/events/events.component.ts - - + + - + src/app/features/events/events-routing.module.ts->src/app/features/events/components/event/event.component.ts - - + + + + + +src/app/features/events/events-routing.module.ts->src/app/shared/components/banner/banner.component.ts + + + + + +src/app/features/events/resolvers/event.resolver.ts + + +event.resolver.ts + + + + + +src/app/features/events/events-routing.module.ts->src/app/features/events/resolvers/event.resolver.ts + + + + + +src/app/features/events/resolvers/event.resolver.ts->src/app/core/services/event.service.ts + + + + + +src/app/features/events/resolvers/event.resolver.ts->src/app/features/events/models/event.ts + + - + src/app/features/events/events.component.spec.ts - - -events.component.spec.ts + + +events.component.spec.ts - + src/app/features/events/events.component.spec.ts->src/app/features/events/events.component.ts - - + + - + src/app/features/friends/friends.component.ts - - -friends.component.ts + + +friends.component.ts - + src/app/features/friends/friends-routing.module.ts->src/app/features/friends/friends.component.ts - - + + - + src/app/features/friends/friends.component.spec.ts - - -friends.component.spec.ts + + +friends.component.spec.ts - + src/app/features/friends/friends.component.spec.ts->src/app/features/friends/friends.component.ts - - + + - + src/app/features/groups/components/group-card/group-card.component.spec.ts - - -group-card.component.spec.ts + + +group-card.component.spec.ts - + src/app/features/groups/components/group-card/group-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/groups/components/group-card/group-card.component.spec.ts->src/app/features/groups/components/group-card/group-card.component.ts - - + + - + src/app/features/groups/components/group-card/group-card.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/features/groups/components/group-card/group-card.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/groups/components/group-card/group-card.component.ts->src/app/features/groups/models/group.ts - - + + - + src/app/features/groups/components/group-list/group-list.component.spec.ts - - -group-list.component.spec.ts + + +group-list.component.spec.ts - + src/app/features/groups/components/group-list/group-list.component.spec.ts->src/app/features/groups/components/group-list/group-list.component.ts - - + + - + src/app/features/groups/components/group-list/group-list.component.ts->src/app/features/groups/models/group.ts - - + + - + src/app/features/groups/components/group/group.component.spec.ts - - -group.component.spec.ts + + +group.component.spec.ts - + src/app/features/groups/components/group/group.component.spec.ts->src/app/features/groups/components/group/group.component.ts - - + + - + src/app/features/groups/groups-routing.module.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/groups/groups-routing.module.ts->src/app/features/groups/groups.component.ts - - + + - + src/app/features/groups/groups-routing.module.ts->src/app/features/groups/components/group/group.component.ts - - + + - + src/app/features/groups/groups.component.spec.ts - - -groups.component.spec.ts + + +groups.component.spec.ts - + src/app/features/groups/groups.component.spec.ts->src/app/features/groups/groups.component.ts - - + + - + src/app/features/home/home-routing.module.ts->src/app/features/home/home.component.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/models/person.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/services/event.service.ts - - - - - -src/app/features/home/home.component.ts->src/app/features/events/models/event.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/services/group.service.ts - - + + + + + +src/app/features/home/home.component.ts->src/app/core/services/people.service.ts + + + + + +src/app/features/home/home.component.ts->src/app/features/events/models/event.ts + + - + src/app/features/home/home.component.ts->src/app/features/groups/models/group.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/services/news.service.ts - - - - - -src/app/features/home/home.component.ts->src/app/core/services/people.service.ts - - + + - + src/app/features/home/home.component.ts->src/app/features/news-feed/models/news-item.ts - - - - - -src/app/shared/models/input-type.ts - - -input-type.ts - - + + - + src/app/features/home/home.component.ts->src/app/shared/models/input-type.ts - - + + - + src/app/features/home/home.component.spec.ts - - -home.component.spec.ts + + +home.component.spec.ts - + src/app/features/home/home.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/home/home.component.spec.ts->src/app/features/home/home.component.ts - - + + - + src/app/features/invite/invite.component.ts - - -invite.component.ts + + +invite.component.ts - + src/app/features/invite/invite-routing.module.ts->src/app/features/invite/invite.component.ts - - + + - + src/app/features/invite/invite.component.spec.ts - - -invite.component.spec.ts + + +invite.component.spec.ts - + src/app/features/invite/invite.component.spec.ts->src/app/features/invite/invite.component.ts - - + + - + src/app/features/login/login-routing.module.ts->src/app/features/login/login.component.ts - - + + - + src/app/features/login/login.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/login/login.component.spec.ts - - -login.component.spec.ts + + +login.component.spec.ts - + src/app/features/login/login.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/login/login.component.spec.ts->src/app/features/login/login.component.ts - - + + - + src/app/features/members/members.component.ts - - -members.component.ts + + +members.component.ts - + src/app/features/members/members-routing.module.ts->src/app/features/members/members.component.ts - - + + - + src/app/features/members/members.component.spec.ts - - -members.component.spec.ts + + +members.component.spec.ts - + src/app/features/members/members.component.spec.ts->src/app/features/members/members.component.ts - - + + - + src/app/features/messages/messages.component.ts - - -messages.component.ts + + +messages.component.ts - + src/app/features/messages/messages-routing.module.ts->src/app/features/messages/messages.component.ts - - + + - + src/app/features/messages/messages.component.spec.ts - - -messages.component.spec.ts + + +messages.component.spec.ts - + src/app/features/messages/messages.component.spec.ts->src/app/features/messages/messages.component.ts - - + + - + src/app/features/missions/missions.component.ts - - -missions.component.ts + + +missions.component.ts - + src/app/features/missions/missions-routing.module.ts->src/app/features/missions/missions.component.ts - - + + - + src/app/features/missions/missions.component.spec.ts - - -missions.component.spec.ts + + +missions.component.spec.ts - + src/app/features/missions/missions.component.spec.ts->src/app/features/missions/missions.component.ts - - + + - + src/app/features/news-feed/components/news-card/news-card.component.spec.ts - - -news-card.component.spec.ts + + +news-card.component.spec.ts - + src/app/features/news-feed/components/news-card/news-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/news-feed/components/news-card/news-card.component.spec.ts->src/app/features/news-feed/components/news-card/news-card.component.ts - - + + - + src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/features/news-feed/models/news-item.ts - - + + - + src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/features/news-feed/components/news-list/news-list.component.spec.ts - - -news-list.component.spec.ts + + +news-list.component.spec.ts - + src/app/features/news-feed/components/news-list/news-list.component.spec.ts->src/app/features/news-feed/components/news-list/news-list.component.ts - - + + - + src/app/features/news-feed/components/news-list/news-list.component.ts->src/app/features/news-feed/models/news-item.ts - - + + - + src/app/features/news-feed/news-feed.component.ts - - -news-feed.component.ts + + +news-feed.component.ts - + src/app/features/news-feed/news-feed-routing.module.ts->src/app/features/news-feed/news-feed.component.ts - - + + - + src/app/features/news-feed/news-feed.component.spec.ts - - -news-feed.component.spec.ts + + +news-feed.component.spec.ts - + src/app/features/news-feed/news-feed.component.spec.ts->src/app/features/news-feed/news-feed.component.ts - - + + - + src/app/features/privacy/privacy-routing.module.ts->src/app/features/privacy/privacy.component.ts - - + + - + src/app/features/privacy/privacy.component.spec.ts - - -privacy.component.spec.ts + + +privacy.component.spec.ts - + src/app/features/privacy/privacy.component.spec.ts->src/app/features/privacy/privacy.component.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.spec.ts - - -profile-card.component.spec.ts + + +profile-card.component.spec.ts - + src/app/features/profile/components/profile-card/profile-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.spec.ts->src/app/features/profile/components/profile-card/profile-card.component.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/core/models/person.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/features/profile/components/profile-list/profile-list.component.spec.ts - - -profile-list.component.spec.ts + + +profile-list.component.spec.ts - + src/app/features/profile/components/profile-list/profile-list.component.spec.ts->src/app/features/profile/components/profile-list/profile-list.component.ts - - + + - + src/app/features/profile/components/profile-list/profile-list.component.ts->src/app/core/models/person.ts - - + + - + src/app/features/profile/profile.component.ts - - -profile.component.ts + + +profile.component.ts - + src/app/features/profile/profile-routing.module.ts->src/app/features/profile/profile.component.ts - - + + - + src/app/features/profile/profile.component.spec.ts - - -profile.component.spec.ts + + +profile.component.spec.ts - + src/app/features/profile/profile.component.spec.ts->src/app/features/profile/profile.component.ts - - + + - + src/app/features/register/register-routing.module.ts->src/app/features/register/register.component.ts - - + + - + src/app/features/register/register.component.spec.ts - - -register.component.spec.ts + + +register.component.spec.ts - + src/app/features/register/register.component.spec.ts->src/app/features/register/register.component.ts - - + + - + src/app/features/search/search.component.ts - - -search.component.ts + + +search.component.ts - + src/app/features/search/search-routing.module.ts->src/app/features/search/search.component.ts - - + + - + src/app/features/search/search.component.spec.ts - - -search.component.spec.ts + + +search.component.spec.ts - + src/app/features/search/search.component.spec.ts->src/app/features/search/search.component.ts - - + + - + src/app/features/settings/settings.component.ts - - -settings.component.ts + + +settings.component.ts - + src/app/features/settings/settings-routing.module.ts->src/app/features/settings/settings.component.ts - - + + - + src/app/features/settings/settings.component.spec.ts - - -settings.component.spec.ts + + +settings.component.spec.ts - + src/app/features/settings/settings.component.spec.ts->src/app/features/settings/settings.component.ts - - + + - + src/app/features/splash/splash-routing.module.ts->src/app/features/splash/splash.component.ts - - + + - + src/app/features/splash/splash.component.spec.ts - - -splash.component.spec.ts + + +splash.component.spec.ts - + src/app/features/splash/splash.component.spec.ts->src/app/features/splash/splash.component.ts - - + + - + src/app/features/stats/stats-routing.module.ts->src/app/features/stats/stats.component.ts - - + + - + src/app/features/stats/stats.component.spec.ts - - -stats.component.spec.ts + + +stats.component.spec.ts - + src/app/features/stats/stats.component.spec.ts->src/app/features/stats/stats.component.ts - - + + - + src/app/features/terms/terms-routing.module.ts->src/app/features/terms/terms.component.ts - - + + - + src/app/features/terms/terms.component.spec.ts - - -terms.component.spec.ts + + +terms.component.spec.ts - + src/app/features/terms/terms.component.spec.ts->src/app/features/terms/terms.component.ts - - + + - + src/app/features/the-wire/the-wire.component.ts - - -the-wire.component.ts + + +the-wire.component.ts - + src/app/features/the-wire/the-wire-routing.module.ts->src/app/features/the-wire/the-wire.component.ts - - + + - + src/app/features/the-wire/the-wire.component.spec.ts - - -the-wire.component.spec.ts + + +the-wire.component.spec.ts - + src/app/features/the-wire/the-wire.component.spec.ts->src/app/features/the-wire/the-wire.component.ts - - + + - + src/app/shared/components/banner/banner.component.spec.ts - - -banner.component.spec.ts + + +banner.component.spec.ts - + src/app/shared/components/banner/banner.component.spec.ts->src/app/shared/components/banner/banner.component.ts - - - - - -src/app/shared/components/banner/banner.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/button/button.component.spec.ts - - -button.component.spec.ts + + +button.component.spec.ts - + src/app/shared/components/button/button.component.spec.ts->src/app/shared/components/button/button.component.ts - - + + - + src/app/shared/components/button/button.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/shared/components/button/button.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/shared/models/button-type.ts - - -button-type.ts + + +button-type.ts - + src/app/shared/components/button/button.component.ts->src/app/shared/models/button-type.ts - - + + - + src/app/shared/models/material-color.ts - - -material-color.ts + + +material-color.ts - + src/app/shared/components/button/button.component.ts->src/app/shared/models/material-color.ts - - + + + + + +src/app/shared/components/calendar-button/calendar-button.component.spec.ts + + +calendar-button.component.spec.ts + + + + + +src/app/shared/components/calendar-button/calendar-button.component.spec.ts->src/app/core/helpers/typescript-loader.ts + + + + + +src/app/shared/components/calendar-button/calendar-button.component.spec.ts->src/app/shared/components/calendar-button/calendar-button.component.ts + + + + + +src/app/shared/components/calendar-button/calendar-button.component.ts->src/app/core/services/translations.service.ts + + + + + +src/app/shared/components/calendar-button/calendar-button.component.ts->src/app/shared/models/tooltip-direction.ts + + - + src/app/shared/components/editor/editor.component.spec.ts - - -editor.component.spec.ts + + +editor.component.spec.ts - + src/app/shared/components/editor/editor.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/editor/editor.component.spec.ts->src/app/shared/components/editor/editor.component.ts - - + + - + src/app/shared/components/editor/editor.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/editor/editor.component.ts->src/app/shared/factories/editor-config.factory.ts - - + + - + src/app/shared/factories/editor-config.factory.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/footer/footer.component.spec.ts - - -footer.component.spec.ts + + +footer.component.spec.ts - + src/app/shared/components/footer/footer.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/footer/footer.component.spec.ts->src/app/shared/components/footer/footer.component.ts - - + + - + src/app/shared/components/footer/footer.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/shared/components/footer/footer.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/forbidden/forbidden.component.spec.ts - - -forbidden.component.spec.ts + + +forbidden.component.spec.ts - + src/app/shared/components/forbidden/forbidden.component.spec.ts->src/app/shared/components/forbidden/forbidden.component.ts - - + + - + src/app/shared/components/header/header.component.spec.ts - - -header.component.spec.ts + + +header.component.spec.ts - + src/app/shared/components/header/header.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/header/header.component.spec.ts->src/app/shared/components/header/header.component.ts - - + + - + src/app/shared/components/header/header.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/shared/components/header/header.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/header/header.component.ts->src/app/core/models/person.ts - - + + + + + +src/app/shared/components/header/header.component.ts->src/app/core/services/people.service.ts + + - + src/app/shared/components/header/header.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/shared/components/input/input.component.spec.ts - - -input.component.spec.ts + + +input.component.spec.ts - + src/app/shared/components/input/input.component.spec.ts->src/app/shared/components/input/input.component.ts - - + + - + src/app/shared/components/input/input.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/input/input.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/shared/components/input/input.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/shared/components/input/input.component.ts->src/app/shared/models/input-type.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.spec.ts - - -language-selector.component.spec.ts + + +language-selector.component.spec.ts - + src/app/shared/components/language-selector/language-selector.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.spec.ts->src/app/shared/components/language-selector/language-selector.component.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/shared/models/language.ts - - -language.ts + + +language.ts - + src/app/shared/components/language-selector/language-selector.component.ts->src/app/shared/models/language.ts - - + + - + src/app/shared/components/not-found/not-found.component.spec.ts - - -not-found.component.spec.ts + + +not-found.component.spec.ts - + src/app/shared/components/not-found/not-found.component.spec.ts->src/app/shared/components/not-found/not-found.component.ts - - + + - + src/app/shared/components/page-title/page-title.component.spec.ts - - -page-title.component.spec.ts + + +page-title.component.spec.ts - + src/app/shared/components/page-title/page-title.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/page-title/page-title.component.spec.ts->src/app/shared/components/page-title/page-title.component.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.spec.ts - - -profile-pic.component.spec.ts + + +profile-pic.component.spec.ts - + src/app/shared/components/profile-pic/profile-pic.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.spec.ts->src/app/shared/components/profile-pic/profile-pic.component.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.ts->src/app/core/models/person.ts - - + + - + src/app/shared/components/unauthorized/unauthorized.component.spec.ts - - -unauthorized.component.spec.ts + + +unauthorized.component.spec.ts - + src/app/shared/components/unauthorized/unauthorized.component.spec.ts->src/app/shared/components/unauthorized/unauthorized.component.ts - - + + - + src/assets/i18n/translations.fr.ts - - -translations.fr.ts + + +translations.fr.ts - + src/assets/i18n/translations.fr.ts->src/assets/i18n/translations.en.ts - - + + - + src/environments/environment.pr.ts - - -environment.pr.ts + + +environment.pr.ts - + src/environments/environment.prod.ts - - -environment.prod.ts + + +environment.prod.ts - + src/main.ts - - -main.ts + + +main.ts - + src/main.ts->src/app/app.module.ts - - + + - + src/main.ts->src/environments/environment.ts - - + + - + src/polyfills.ts - - -polyfills.ts + + +polyfills.ts - + src/test.ts - - -test.ts + + +test.ts From de059ddca8b1a31e4847aac88896be356d25b3a5 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Wed, 30 Aug 2023 09:26:51 -0400 Subject: [PATCH 023/165] event page - section separator --- .../features/events/components/event/event.component.html | 4 ++++ .../features/events/components/event/event.component.scss | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/src/app/features/events/components/event/event.component.html b/src/app/features/events/components/event/event.component.html index c64289a3..ff3324f2 100644 --- a/src/app/features/events/components/event/event.component.html +++ b/src/app/features/events/components/event/event.component.html @@ -79,6 +79,8 @@

+
+
@@ -94,6 +96,8 @@

+
+
diff --git a/src/app/features/events/components/event/event.component.scss b/src/app/features/events/components/event/event.component.scss index 2df8ad01..cd35b84e 100644 --- a/src/app/features/events/components/event/event.component.scss +++ b/src/app/features/events/components/event/event.component.scss @@ -102,6 +102,13 @@ $calendar-size: 120px; } } + .section-separator { + height: 40px; + margin-top: 30px; + flex-grow: 0.5; + border-left: 2px solid $neutral-300; + } + ngx-skeleton-loader { display: block; width: 80%; From 988f93d9dc7a1d3de03dee469e8e0354e2fe5865 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Wed, 30 Aug 2023 10:00:27 -0400 Subject: [PATCH 024/165] ignore pr workflow based on pr title --- .github/workflows/deploy-pr.yml | 5 +++++ .github/workflows/destroy-pr.yml | 3 +++ src/app/features/events/events-routing.module.ts | 5 ----- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/.github/workflows/deploy-pr.yml b/.github/workflows/deploy-pr.yml index fd0041c6..29b8c2be 100644 --- a/.github/workflows/deploy-pr.yml +++ b/.github/workflows/deploy-pr.yml @@ -6,6 +6,7 @@ on: pull_request: types: [opened, reopened] # TODO: synchronize branches: master + env: AZURE_WEBAPP_NAME: gccollab-dev-pr-${{ github.event.number }} @@ -19,6 +20,7 @@ jobs: setup: name: Deploy Bicep runs-on: ubuntu-latest + if: ${{ !contains(github.event.pull_request.title, vars.IGNORE_DEPLOY) }} steps: - uses: actions/checkout@master - uses: azure/login@v1 @@ -40,6 +42,7 @@ jobs: name: Store Publishing Profile runs-on: ubuntu-latest needs: setup + if: ${{ !contains(github.event.pull_request.title, vars.IGNORE_DEPLOY) }} steps: - name: Azure Login uses: azure/login@v1 @@ -68,6 +71,7 @@ jobs: name: Create Environment runs-on: ubuntu-latest needs: [setup, store] + if: ${{ !contains(github.event.pull_request.title, vars.IGNORE_DEPLOY) }} steps: - name: Create Environment shell: bash @@ -85,6 +89,7 @@ jobs: name: Build, Test and Deploy runs-on: windows-latest needs: [setup, store, create-environment] + if: ${{ !contains(github.event.pull_request.title, vars.IGNORE_DEPLOY) }} environment: name: PR ${{ github.event.number }} url: https://${{ env.AZURE_WEBAPP_NAME }}.azurewebsites.net/ diff --git a/.github/workflows/destroy-pr.yml b/.github/workflows/destroy-pr.yml index 56b79ea9..1bab7f33 100644 --- a/.github/workflows/destroy-pr.yml +++ b/.github/workflows/destroy-pr.yml @@ -16,6 +16,7 @@ jobs: azure: name: Delete Azure Resources runs-on: ubuntu-latest + if: ${{ !contains(github.event.pull_request.title, vars.IGNORE_DEPLOY) }} steps: - uses: azure/login@v1 with: @@ -30,6 +31,7 @@ jobs: secret: name: Delete GitHub Secret runs-on: ubuntu-latest + if: ${{ !contains(github.event.pull_request.title, vars.IGNORE_DEPLOY) }} steps: - name: GitHub Auth Login shell: bash @@ -42,6 +44,7 @@ jobs: environment: name: Delete GitHub Environment runs-on: ubuntu-latest + if: ${{ !contains(github.event.pull_request.title, vars.IGNORE_DEPLOY) }} steps: - name: Delete Environment shell: bash diff --git a/src/app/features/events/events-routing.module.ts b/src/app/features/events/events-routing.module.ts index 9dccce59..8236f73d 100644 --- a/src/app/features/events/events-routing.module.ts +++ b/src/app/features/events/events-routing.module.ts @@ -4,8 +4,6 @@ import { EventsComponent } from './events.component'; import { Translations } from 'src/app/core/services/translations.service'; import { EventComponent } from './components/event/event.component'; -import { Banner } from 'src/app/shared/components/banner/banner.component'; -import { EventResolver } from './resolvers/event.resolver'; let translations = Translations.getInstance(); @@ -19,9 +17,6 @@ const routes: Routes = [ path: ':id', title: translations.titles.event, component: EventComponent, - // resolve: { - // event: EventResolver - // }, data: { title: translations.titles.event, breadcrumb: translations.titles.event From 78aa7a1e0afc8540c04e36174fcf656c4beac184 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Wed, 30 Aug 2023 14:08:18 -0400 Subject: [PATCH 025/165] workflow update --- .github/workflows/dependency-graph.yml | 2 +- .github/workflows/deploy-dev.yml | 2 +- .github/workflows/deploy-pr.yml | 6 +++--- .github/workflows/destroy-pr.yml | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/dependency-graph.yml b/.github/workflows/dependency-graph.yml index 755c44ea..25348c59 100644 --- a/.github/workflows/dependency-graph.yml +++ b/.github/workflows/dependency-graph.yml @@ -6,7 +6,7 @@ on: pull_request: types: - closed - branches: ["master"] + branches: ["main"] env: NODE_VERSION: '16.14.2' diff --git a/.github/workflows/deploy-dev.yml b/.github/workflows/deploy-dev.yml index c32480b3..f974ee8a 100644 --- a/.github/workflows/deploy-dev.yml +++ b/.github/workflows/deploy-dev.yml @@ -6,7 +6,7 @@ name: Deploy to Development on: push: branches: - - master + - main workflow_dispatch: env: diff --git a/.github/workflows/deploy-pr.yml b/.github/workflows/deploy-pr.yml index 29b8c2be..f8dfe9e0 100644 --- a/.github/workflows/deploy-pr.yml +++ b/.github/workflows/deploy-pr.yml @@ -5,7 +5,7 @@ name: Deploy PR on: pull_request: types: [opened, reopened] # TODO: synchronize - branches: master + branches: main env: @@ -22,7 +22,7 @@ jobs: runs-on: ubuntu-latest if: ${{ !contains(github.event.pull_request.title, vars.IGNORE_DEPLOY) }} steps: - - uses: actions/checkout@master + - uses: actions/checkout@v3 - uses: azure/login@v1 with: creds: ${{ secrets.AZURE_CREDENTIALS }} @@ -59,7 +59,7 @@ jobs: shell: bash run: gh auth login --with-token <<< ${{ env.ACCESS_TOKEN }} - - uses: actions/checkout@master + - uses: actions/checkout@v3 - name: Create Secret run: | escaped_profile=$(printf "%q" "${{ env.PROFILE }}") diff --git a/.github/workflows/destroy-pr.yml b/.github/workflows/destroy-pr.yml index 1bab7f33..e95439fb 100644 --- a/.github/workflows/destroy-pr.yml +++ b/.github/workflows/destroy-pr.yml @@ -5,7 +5,7 @@ name: Destroy PR on: pull_request: types: [closed] - branches: master + branches: main env: AZURE_WEBAPP_NAME: gccollab-dev-pr-${{ github.event.number }} @@ -37,7 +37,7 @@ jobs: shell: bash run: gh auth login --with-token <<< ${{ env.ACCESS_TOKEN }} - - uses: actions/checkout@master + - uses: actions/checkout@v3 - name: Delete Secret run: gh secret delete "${{ env.SECRET_NAME }}" From 25e71213edb54cb611de60d720f6ada0177eaf11 Mon Sep 17 00:00:00 2001 From: Shea Date: Wed, 30 Aug 2023 18:49:30 +0000 Subject: [PATCH 026/165] Dependency Graph ignore-deploy --- dependency-graph.svg | 3078 +++++++++++++++++++++--------------------- 1 file changed, 1533 insertions(+), 1545 deletions(-) diff --git a/dependency-graph.svg b/dependency-graph.svg index aa0fe8ee..a7211834 100644 --- a/dependency-graph.svg +++ b/dependency-graph.svg @@ -4,365 +4,365 @@ - - + + dependency-cruiser output - + cluster_src - -src + +src cluster_src/app - -app + +app cluster_src/app/core - -core + +core cluster_src/app/core/auth - -auth + +auth cluster_src/app/core/constants - -constants + +constants cluster_src/app/core/guards - -guards + +guards cluster_src/app/core/helpers - -helpers + +helpers cluster_src/app/core/interceptors - -interceptors + +interceptors cluster_src/app/core/models - -models + +models cluster_src/app/core/services - -services + +services cluster_src/app/features - -features + +features cluster_src/app/features/about - -about + +about cluster_src/app/features/blog - -blog + +blog cluster_src/app/features/bookmarks - -bookmarks + +bookmarks cluster_src/app/features/dashboard - -dashboard + +dashboard cluster_src/app/features/events - -events + +events cluster_src/app/features/events/components - -components + +components cluster_src/app/features/events/components/event-card - -event-card + +event-card cluster_src/app/features/events/components/event-list - -event-list + +event-list cluster_src/app/features/events/components/event - -event + +event cluster_src/app/features/events/models - -models + +models cluster_src/app/features/events/resolvers - -resolvers + +resolvers cluster_src/app/features/friends - -friends + +friends cluster_src/app/features/groups - -groups + +groups cluster_src/app/features/groups/components - -components + +components cluster_src/app/features/groups/components/group-card - -group-card + +group-card cluster_src/app/features/groups/components/group-list - -group-list + +group-list cluster_src/app/features/groups/components/group - -group + +group cluster_src/app/features/groups/models - -models + +models cluster_src/app/features/home - -home + +home cluster_src/app/features/invite - -invite + +invite cluster_src/app/features/login - -login + +login cluster_src/app/features/members - -members + +members cluster_src/app/features/messages - -messages + +messages cluster_src/app/features/missions - -missions + +missions cluster_src/app/features/news-feed - -news-feed + +news-feed cluster_src/app/features/news-feed/components - -components + +components cluster_src/app/features/news-feed/components/news-card - -news-card + +news-card cluster_src/app/features/news-feed/components/news-list - -news-list + +news-list cluster_src/app/features/news-feed/models - -models + +models cluster_src/app/features/privacy - -privacy + +privacy cluster_src/app/features/profile - -profile + +profile cluster_src/app/features/profile/components - -components + +components cluster_src/app/features/profile/components/profile-card - -profile-card + +profile-card cluster_src/app/features/profile/components/profile-list - -profile-list + +profile-list cluster_src/app/features/register - -register + +register cluster_src/app/features/search - -search + +search cluster_src/app/features/settings - -settings + +settings cluster_src/app/features/splash - -splash + +splash cluster_src/app/features/stats - -stats + +stats cluster_src/app/features/terms - -terms + +terms cluster_src/app/features/the-wire - -the-wire + +the-wire cluster_src/app/shared - -shared + +shared cluster_src/app/shared/components - -components + +components cluster_src/app/shared/components/banner - -banner + +banner cluster_src/app/shared/components/button - -button + +button cluster_src/app/shared/components/calendar-button - -calendar-button + +calendar-button cluster_src/app/shared/components/editor - -editor + +editor cluster_src/app/shared/components/footer - -footer + +footer cluster_src/app/shared/components/forbidden - -forbidden + +forbidden cluster_src/app/shared/components/header - -header + +header cluster_src/app/shared/components/input - -input + +input cluster_src/app/shared/components/language-selector - -language-selector + +language-selector cluster_src/app/shared/components/not-found - -not-found + +not-found cluster_src/app/shared/components/page-title - -page-title + +page-title cluster_src/app/shared/components/profile-pic - -profile-pic + +profile-pic cluster_src/app/shared/components/unauthorized - -unauthorized + +unauthorized cluster_src/app/shared/factories - -factories + +factories cluster_src/app/shared/models - -models + +models cluster_src/assets - -assets + +assets cluster_src/assets/i18n - -i18n + +i18n cluster_src/environments @@ -373,8 +373,8 @@ src/app/app-routing.module.ts - -app-routing.module.ts + +app-routing.module.ts @@ -382,542 +382,542 @@ src/app/core/constants/routes.constants.ts - -routes.constants.ts + +routes.constants.ts src/app/app-routing.module.ts->src/app/core/constants/routes.constants.ts - - + + src/app/core/guards/auth.guard.ts - -auth.guard.ts + +auth.guard.ts src/app/app-routing.module.ts->src/app/core/guards/auth.guard.ts - - + + src/app/core/guards/interceptor.guard.ts - -interceptor.guard.ts + +interceptor.guard.ts src/app/app-routing.module.ts->src/app/core/guards/interceptor.guard.ts - - + + src/app/core/guards/login.guard.ts - -login.guard.ts + +login.guard.ts src/app/app-routing.module.ts->src/app/core/guards/login.guard.ts - - + + src/app/core/guards/redirect.guard.ts - -redirect.guard.ts + +redirect.guard.ts src/app/app-routing.module.ts->src/app/core/guards/redirect.guard.ts - - + + src/app/core/services/translations.service.ts - -translations.service.ts + +translations.service.ts src/app/app-routing.module.ts->src/app/core/services/translations.service.ts - - + + src/app/features/about/about.module.ts - -about.module.ts + +about.module.ts src/app/app-routing.module.ts->src/app/features/about/about.module.ts - - - - + + + + src/app/features/blog/blog.module.ts - -blog.module.ts + +blog.module.ts src/app/app-routing.module.ts->src/app/features/blog/blog.module.ts - - - - + + + + src/app/features/bookmarks/bookmarks.module.ts - -bookmarks.module.ts + +bookmarks.module.ts src/app/app-routing.module.ts->src/app/features/bookmarks/bookmarks.module.ts - - - - + + + + src/app/features/dashboard/dashboard.module.ts - -dashboard.module.ts + +dashboard.module.ts src/app/app-routing.module.ts->src/app/features/dashboard/dashboard.module.ts - - - - + + + + src/app/features/events/events.module.ts - -events.module.ts + +events.module.ts src/app/app-routing.module.ts->src/app/features/events/events.module.ts - - - - + + + + src/app/features/friends/friends.module.ts - -friends.module.ts + +friends.module.ts src/app/app-routing.module.ts->src/app/features/friends/friends.module.ts - - - - + + + + src/app/features/groups/groups.module.ts - -groups.module.ts + +groups.module.ts src/app/app-routing.module.ts->src/app/features/groups/groups.module.ts - - - - + + + + src/app/features/home/home.module.ts - -home.module.ts + +home.module.ts src/app/app-routing.module.ts->src/app/features/home/home.module.ts - - - - + + + + src/app/features/invite/invite.module.ts - -invite.module.ts + +invite.module.ts src/app/app-routing.module.ts->src/app/features/invite/invite.module.ts - - - - + + + + src/app/features/login/login.module.ts - -login.module.ts + +login.module.ts src/app/app-routing.module.ts->src/app/features/login/login.module.ts - - - - + + + + src/app/features/members/members.module.ts - -members.module.ts + +members.module.ts src/app/app-routing.module.ts->src/app/features/members/members.module.ts - - - - + + + + src/app/features/messages/messages.module.ts - -messages.module.ts + +messages.module.ts src/app/app-routing.module.ts->src/app/features/messages/messages.module.ts - - - - + + + + src/app/features/missions/missions.module.ts - -missions.module.ts + +missions.module.ts src/app/app-routing.module.ts->src/app/features/missions/missions.module.ts - - - - + + + + src/app/features/news-feed/news-feed.module.ts - -news-feed.module.ts + +news-feed.module.ts src/app/app-routing.module.ts->src/app/features/news-feed/news-feed.module.ts - - - - + + + + src/app/features/privacy/privacy.module.ts - -privacy.module.ts + +privacy.module.ts src/app/app-routing.module.ts->src/app/features/privacy/privacy.module.ts - - - - + + + + src/app/features/profile/profile.module.ts - -profile.module.ts + +profile.module.ts src/app/app-routing.module.ts->src/app/features/profile/profile.module.ts - - - - + + + + src/app/features/register/register.module.ts - -register.module.ts + +register.module.ts src/app/app-routing.module.ts->src/app/features/register/register.module.ts - - - - + + + + src/app/features/search/search.module.ts - -search.module.ts + +search.module.ts src/app/app-routing.module.ts->src/app/features/search/search.module.ts - - - - + + + + src/app/features/settings/settings.module.ts - -settings.module.ts + +settings.module.ts src/app/app-routing.module.ts->src/app/features/settings/settings.module.ts - - - - + + + + src/app/features/splash/splash.module.ts - -splash.module.ts + +splash.module.ts src/app/app-routing.module.ts->src/app/features/splash/splash.module.ts - - - - + + + + src/app/features/stats/stats.module.ts - -stats.module.ts + +stats.module.ts src/app/app-routing.module.ts->src/app/features/stats/stats.module.ts - - - - + + + + src/app/features/terms/terms.module.ts - -terms.module.ts + +terms.module.ts src/app/app-routing.module.ts->src/app/features/terms/terms.module.ts - - - - + + + + src/app/features/the-wire/the-wire.module.ts - -the-wire.module.ts + +the-wire.module.ts src/app/app-routing.module.ts->src/app/features/the-wire/the-wire.module.ts - - - - + + + + src/app/shared/components/forbidden/forbidden.component.ts - -forbidden.component.ts + +forbidden.component.ts src/app/app-routing.module.ts->src/app/shared/components/forbidden/forbidden.component.ts - - + + src/app/shared/components/not-found/not-found.component.ts - -not-found.component.ts + +not-found.component.ts src/app/app-routing.module.ts->src/app/shared/components/not-found/not-found.component.ts - - + + src/app/shared/components/unauthorized/unauthorized.component.ts - -unauthorized.component.ts + +unauthorized.component.ts src/app/app-routing.module.ts->src/app/shared/components/unauthorized/unauthorized.component.ts - - + + src/app/core/services/session-storage.service.ts - -session-storage.service.ts + +session-storage.service.ts src/app/core/guards/auth.guard.ts->src/app/core/services/session-storage.service.ts - - + + @@ -931,876 +931,876 @@ src/app/core/guards/auth.guard.ts->src/environments/environment.ts - - + + src/app/core/guards/interceptor.guard.ts->src/app/core/services/session-storage.service.ts - - + + src/assets/i18n/translations.en.ts - -translations.en.ts + +translations.en.ts src/app/core/services/translations.service.ts->src/assets/i18n/translations.en.ts - - + + src/app/shared/shared.module.ts - -shared.module.ts + +shared.module.ts src/app/features/about/about.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/about/about-routing.module.ts - -about-routing.module.ts + +about-routing.module.ts src/app/features/about/about.module.ts->src/app/features/about/about-routing.module.ts - - + + src/app/features/about/about.component.ts - -about.component.ts + +about.component.ts src/app/features/about/about.module.ts->src/app/features/about/about.component.ts - - + + src/app/features/blog/blog.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/blog/blog-routing.module.ts - -blog-routing.module.ts + +blog-routing.module.ts src/app/features/blog/blog.module.ts->src/app/features/blog/blog-routing.module.ts - - + + src/app/features/bookmarks/bookmarks.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/bookmarks/bookmarks-routing.module.ts - -bookmarks-routing.module.ts + +bookmarks-routing.module.ts src/app/features/bookmarks/bookmarks.module.ts->src/app/features/bookmarks/bookmarks-routing.module.ts - - + + src/app/features/dashboard/dashboard.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/dashboard/dashboard-routing.module.ts - -dashboard-routing.module.ts + +dashboard-routing.module.ts src/app/features/dashboard/dashboard.module.ts->src/app/features/dashboard/dashboard-routing.module.ts - - + + - + src/app/features/events/events.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/events/components/event-card/event-card.component.ts - -event-card.component.ts + +event-card.component.ts - + src/app/features/events/events.module.ts->src/app/features/events/components/event-card/event-card.component.ts - - + + src/app/features/events/components/event-list/event-list.component.ts - -event-list.component.ts + +event-list.component.ts - + src/app/features/events/events.module.ts->src/app/features/events/components/event-list/event-list.component.ts - - + + src/app/features/events/components/event/event.component.ts - -event.component.ts + +event.component.ts - + src/app/features/events/events.module.ts->src/app/features/events/components/event/event.component.ts - - + + src/app/features/events/events-routing.module.ts - -events-routing.module.ts + +events-routing.module.ts - + src/app/features/events/events.module.ts->src/app/features/events/events-routing.module.ts - - + + - + src/app/features/friends/friends.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/friends/friends-routing.module.ts - -friends-routing.module.ts + +friends-routing.module.ts - + src/app/features/friends/friends.module.ts->src/app/features/friends/friends-routing.module.ts - - + + - + src/app/features/groups/groups.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/groups/components/group-card/group-card.component.ts - -group-card.component.ts + +group-card.component.ts - + src/app/features/groups/groups.module.ts->src/app/features/groups/components/group-card/group-card.component.ts - - + + src/app/features/groups/components/group-list/group-list.component.ts - -group-list.component.ts + +group-list.component.ts - + src/app/features/groups/groups.module.ts->src/app/features/groups/components/group-list/group-list.component.ts - - + + src/app/features/groups/components/group/group.component.ts - -group.component.ts + +group.component.ts - + src/app/features/groups/groups.module.ts->src/app/features/groups/components/group/group.component.ts - - + + src/app/features/groups/groups-routing.module.ts - -groups-routing.module.ts + +groups-routing.module.ts - + src/app/features/groups/groups.module.ts->src/app/features/groups/groups-routing.module.ts - - + + - + src/app/features/home/home.module.ts->src/app/features/events/events.module.ts - - - - + + + + - + src/app/features/home/home.module.ts->src/app/features/groups/groups.module.ts - - - - + + + + - + src/app/features/home/home.module.ts->src/app/features/news-feed/news-feed.module.ts - - - - + + + + - + src/app/features/home/home.module.ts->src/app/features/profile/profile.module.ts - - - - + + + + - + src/app/features/home/home.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/home/home-routing.module.ts - -home-routing.module.ts + +home-routing.module.ts - + src/app/features/home/home.module.ts->src/app/features/home/home-routing.module.ts - - + + src/app/features/home/home.component.ts - -home.component.ts + +home.component.ts - + src/app/features/home/home.module.ts->src/app/features/home/home.component.ts - - + + - + src/app/features/invite/invite.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/invite/invite-routing.module.ts - -invite-routing.module.ts + +invite-routing.module.ts - + src/app/features/invite/invite.module.ts->src/app/features/invite/invite-routing.module.ts - - + + - + src/app/features/login/login.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/login/login-routing.module.ts - -login-routing.module.ts + +login-routing.module.ts - + src/app/features/login/login.module.ts->src/app/features/login/login-routing.module.ts - - + + src/app/features/login/login.component.ts - -login.component.ts + +login.component.ts - + src/app/features/login/login.module.ts->src/app/features/login/login.component.ts - - + + - + src/app/features/members/members.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/members/members-routing.module.ts - -members-routing.module.ts + +members-routing.module.ts - + src/app/features/members/members.module.ts->src/app/features/members/members-routing.module.ts - - + + - + src/app/features/messages/messages.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/messages/messages-routing.module.ts - -messages-routing.module.ts + +messages-routing.module.ts - + src/app/features/messages/messages.module.ts->src/app/features/messages/messages-routing.module.ts - - + + - + src/app/features/missions/missions.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/missions/missions-routing.module.ts - -missions-routing.module.ts + +missions-routing.module.ts - + src/app/features/missions/missions.module.ts->src/app/features/missions/missions-routing.module.ts - - + + - + src/app/features/news-feed/news-feed.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/news-feed/components/news-card/news-card.component.ts - -news-card.component.ts + +news-card.component.ts - + src/app/features/news-feed/news-feed.module.ts->src/app/features/news-feed/components/news-card/news-card.component.ts - - + + src/app/features/news-feed/components/news-list/news-list.component.ts - -news-list.component.ts + +news-list.component.ts - + src/app/features/news-feed/news-feed.module.ts->src/app/features/news-feed/components/news-list/news-list.component.ts - - + + src/app/features/news-feed/news-feed-routing.module.ts - -news-feed-routing.module.ts + +news-feed-routing.module.ts - + src/app/features/news-feed/news-feed.module.ts->src/app/features/news-feed/news-feed-routing.module.ts - - + + - + src/app/features/privacy/privacy.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/privacy/privacy-routing.module.ts - -privacy-routing.module.ts + +privacy-routing.module.ts - + src/app/features/privacy/privacy.module.ts->src/app/features/privacy/privacy-routing.module.ts - - + + src/app/features/privacy/privacy.component.ts - -privacy.component.ts + +privacy.component.ts - + src/app/features/privacy/privacy.module.ts->src/app/features/privacy/privacy.component.ts - - + + - + src/app/features/profile/profile.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/profile/components/profile-card/profile-card.component.ts - -profile-card.component.ts + +profile-card.component.ts - + src/app/features/profile/profile.module.ts->src/app/features/profile/components/profile-card/profile-card.component.ts - - + + src/app/features/profile/components/profile-list/profile-list.component.ts - -profile-list.component.ts + +profile-list.component.ts - + src/app/features/profile/profile.module.ts->src/app/features/profile/components/profile-list/profile-list.component.ts - - + + src/app/features/profile/profile-routing.module.ts - -profile-routing.module.ts + +profile-routing.module.ts - + src/app/features/profile/profile.module.ts->src/app/features/profile/profile-routing.module.ts - - + + - + src/app/features/register/register.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/register/register-routing.module.ts - -register-routing.module.ts + +register-routing.module.ts - + src/app/features/register/register.module.ts->src/app/features/register/register-routing.module.ts - - + + src/app/features/register/register.component.ts - -register.component.ts + +register.component.ts - + src/app/features/register/register.module.ts->src/app/features/register/register.component.ts - - + + - + src/app/features/search/search.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/search/search-routing.module.ts - -search-routing.module.ts + +search-routing.module.ts - + src/app/features/search/search.module.ts->src/app/features/search/search-routing.module.ts - - + + - + src/app/features/settings/settings.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/settings/settings-routing.module.ts - -settings-routing.module.ts + +settings-routing.module.ts - + src/app/features/settings/settings.module.ts->src/app/features/settings/settings-routing.module.ts - - + + - + src/app/features/splash/splash.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/splash/splash-routing.module.ts - -splash-routing.module.ts + +splash-routing.module.ts - + src/app/features/splash/splash.module.ts->src/app/features/splash/splash-routing.module.ts - - + + src/app/features/splash/splash.component.ts - -splash.component.ts + +splash.component.ts - + src/app/features/splash/splash.module.ts->src/app/features/splash/splash.component.ts - - + + - + src/app/features/stats/stats.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/stats/stats-routing.module.ts - -stats-routing.module.ts + +stats-routing.module.ts - + src/app/features/stats/stats.module.ts->src/app/features/stats/stats-routing.module.ts - - + + src/app/features/stats/stats.component.ts - -stats.component.ts + +stats.component.ts - + src/app/features/stats/stats.module.ts->src/app/features/stats/stats.component.ts - - + + - + src/app/features/terms/terms.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/terms/terms-routing.module.ts - -terms-routing.module.ts + +terms-routing.module.ts - + src/app/features/terms/terms.module.ts->src/app/features/terms/terms-routing.module.ts - - + + src/app/features/terms/terms.component.ts - -terms.component.ts + +terms.component.ts - + src/app/features/terms/terms.module.ts->src/app/features/terms/terms.component.ts - - + + - + src/app/features/the-wire/the-wire.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/the-wire/the-wire-routing.module.ts - -the-wire-routing.module.ts + +the-wire-routing.module.ts - + src/app/features/the-wire/the-wire.module.ts->src/app/features/the-wire/the-wire-routing.module.ts - - + + src/app/app.component.spec.ts - -app.component.spec.ts + +app.component.spec.ts @@ -1808,513 +1808,513 @@ src/app/app.component.ts - -app.component.ts + +app.component.ts src/app/app.component.spec.ts->src/app/app.component.ts - - + + src/app/core/auth/auth.module.ts - -auth.module.ts + +auth.module.ts src/app/app.component.spec.ts->src/app/core/auth/auth.module.ts - - + + src/app/core/helpers/typescript-loader.ts - -typescript-loader.ts + +typescript-loader.ts src/app/app.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/app.component.ts->src/app/core/constants/routes.constants.ts - - + + src/app/app.component.ts->src/app/core/services/translations.service.ts - - + + src/app/core/services/language-storage.service.ts - -language-storage.service.ts + +language-storage.service.ts src/app/app.component.ts->src/app/core/services/language-storage.service.ts - - + + src/app/core/auth/auth.module.ts->src/app/core/services/session-storage.service.ts - - + + src/app/core/auth/auth.module.ts->src/environments/environment.ts - - + + src/app/core/services/local-storage-ref.service.ts - -local-storage-ref.service.ts + +local-storage-ref.service.ts src/app/core/services/language-storage.service.ts->src/app/core/services/local-storage-ref.service.ts - - + + src/app/app.module.ts - -app.module.ts + +app.module.ts src/app/app.module.ts->src/app/app-routing.module.ts - - - - + + + + src/app/app.module.ts->src/app/app.component.ts - - + + src/app/app.module.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/core/core.module.ts - -core.module.ts + +core.module.ts src/app/app.module.ts->src/app/core/core.module.ts - - - - + + + + src/app/core/services/title.service.ts - -title.service.ts + +title.service.ts src/app/app.module.ts->src/app/core/services/title.service.ts - - + + src/app/features/events/events.component.ts - -events.component.ts + +events.component.ts src/app/app.module.ts->src/app/features/events/events.component.ts - - + + src/app/features/groups/groups.component.ts - -groups.component.ts + +groups.component.ts src/app/app.module.ts->src/app/features/groups/groups.component.ts - - + + src/app/app.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/core/core.module.ts->src/app/core/auth/auth.module.ts - - + + src/app/core/core.module.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/core/core.module.ts->src/app/app.module.ts - - - - + + + + - + src/app/shared/shared.module.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/shared.module.ts->src/app/shared/components/forbidden/forbidden.component.ts - - + + - + src/app/shared/shared.module.ts->src/app/shared/components/not-found/not-found.component.ts - - + + - + src/app/shared/shared.module.ts->src/app/shared/components/unauthorized/unauthorized.component.ts - - + + - + src/app/shared/shared.module.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/shared.module.ts->src/app/app.module.ts - - - - + + + + src/app/shared/components/banner/banner.component.ts - -banner.component.ts + +banner.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/banner/banner.component.ts - - + + src/app/shared/components/button/button.component.ts - -button.component.ts + +button.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/button/button.component.ts - - + + src/app/shared/components/calendar-button/calendar-button.component.ts - -calendar-button.component.ts + +calendar-button.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/calendar-button/calendar-button.component.ts - - + + src/app/shared/components/editor/editor.component.ts - -editor.component.ts + +editor.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/editor/editor.component.ts - - + + src/app/shared/factories/editor-config.factory.ts - -editor-config.factory.ts + +editor-config.factory.ts - + src/app/shared/shared.module.ts->src/app/shared/factories/editor-config.factory.ts - - + + src/app/shared/components/footer/footer.component.ts - -footer.component.ts + +footer.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/footer/footer.component.ts - - + + src/app/shared/components/header/header.component.ts - -header.component.ts + +header.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/header/header.component.ts - - + + src/app/shared/components/input/input.component.ts - -input.component.ts + +input.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/input/input.component.ts - - + + src/app/shared/components/language-selector/language-selector.component.ts - -language-selector.component.ts + +language-selector.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/language-selector/language-selector.component.ts - - + + src/app/shared/components/page-title/page-title.component.ts - -page-title.component.ts + +page-title.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/page-title/page-title.component.ts - - + + src/app/shared/components/profile-pic/profile-pic.component.ts - -profile-pic.component.ts + +profile-pic.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/profile-pic/profile-pic.component.ts - - + + src/app/core/services/session-storage.service.ts->src/app/core/services/local-storage-ref.service.ts - - + + src/app/core/guards/auth.guard.spec.ts - -auth.guard.spec.ts + +auth.guard.spec.ts src/app/core/guards/auth.guard.spec.ts->src/app/core/guards/auth.guard.ts - - + + src/app/core/guards/auth.guard.spec.ts->src/app/core/auth/auth.module.ts - - + + src/app/core/guards/auth.guard.spec.ts->src/app/core/services/session-storage.service.ts - - + + src/app/core/guards/interceptor.guard.spec.ts - -interceptor.guard.spec.ts + +interceptor.guard.spec.ts src/app/core/guards/interceptor.guard.spec.ts->src/app/core/guards/interceptor.guard.ts - - + + src/app/core/guards/login.guard.spec.ts - -login.guard.spec.ts + +login.guard.spec.ts src/app/core/guards/login.guard.spec.ts->src/app/core/guards/login.guard.ts - - + + src/app/core/guards/login.guard.spec.ts->src/app/core/auth/auth.module.ts - - + + src/app/core/guards/redirect.guard.spec.ts - -redirect.guard.spec.ts + +redirect.guard.spec.ts src/app/core/guards/redirect.guard.spec.ts->src/app/core/guards/redirect.guard.ts - - + + src/app/core/guards/role.guard.spec.ts - -role.guard.spec.ts + +role.guard.spec.ts @@ -2322,23 +2322,23 @@ src/app/core/guards/role.guard.ts - -role.guard.ts + +role.guard.ts src/app/core/guards/role.guard.spec.ts->src/app/core/guards/role.guard.ts - - + + src/app/core/interceptors/error.interceptor.spec.ts - -error.interceptor.spec.ts + +error.interceptor.spec.ts @@ -2346,23 +2346,23 @@ src/app/core/interceptors/error.interceptor.ts - -error.interceptor.ts + +error.interceptor.ts src/app/core/interceptors/error.interceptor.spec.ts->src/app/core/interceptors/error.interceptor.ts - - + + src/app/core/models/location.ts - -location.ts + +location.ts @@ -2370,23 +2370,23 @@ src/app/core/models/person.ts - -person.ts + +person.ts src/app/core/models/person.ts->src/app/core/models/location.ts - - + + src/app/core/services/event.service.spec.ts - -event.service.spec.ts + +event.service.spec.ts @@ -2394,164 +2394,164 @@ src/app/core/services/event.service.ts - -event.service.ts + +event.service.ts src/app/core/services/event.service.spec.ts->src/app/core/services/event.service.ts - - + + src/app/core/services/event.service.ts->src/app/core/models/location.ts - - + + src/app/core/services/group.service.ts - -group.service.ts + +group.service.ts src/app/core/services/event.service.ts->src/app/core/services/group.service.ts - - + + src/app/core/services/people.service.ts - -people.service.ts + +people.service.ts src/app/core/services/event.service.ts->src/app/core/services/people.service.ts - - + + src/app/features/events/models/event.ts - -event.ts + +event.ts src/app/core/services/event.service.ts->src/app/features/events/models/event.ts - - + + src/app/features/groups/models/group.ts - -group.ts + +group.ts src/app/core/services/group.service.ts->src/app/features/groups/models/group.ts - - + + src/app/core/services/people.service.ts->src/app/core/models/location.ts - - + + src/app/core/services/people.service.ts->src/app/core/models/person.ts - - + + - + src/app/features/events/models/event.ts->src/app/core/models/location.ts - - + + - + src/app/features/events/models/event.ts->src/app/core/models/person.ts - - + + - + src/app/features/events/models/event.ts->src/app/features/groups/models/group.ts - - + + src/app/core/services/group.service.spec.ts - -group.service.spec.ts + +group.service.spec.ts src/app/core/services/group.service.spec.ts->src/app/core/services/group.service.ts - - + + src/app/core/services/language-storage.service.spec.ts - -language-storage.service.spec.ts + +language-storage.service.spec.ts src/app/core/services/language-storage.service.spec.ts->src/app/core/services/language-storage.service.ts - - + + src/app/core/services/local-storage-ref.service.spec.ts - -local-storage-ref.service.spec.ts + +local-storage-ref.service.spec.ts src/app/core/services/local-storage-ref.service.spec.ts->src/app/core/services/local-storage-ref.service.ts - - + + src/app/core/services/news.service.spec.ts - -news.service.spec.ts + +news.service.spec.ts @@ -2559,101 +2559,101 @@ src/app/core/services/news.service.ts - -news.service.ts + +news.service.ts src/app/core/services/news.service.spec.ts->src/app/core/services/news.service.ts - - + + src/app/core/services/news.service.ts->src/app/core/services/people.service.ts - - + + src/app/features/news-feed/models/news-item.ts - -news-item.ts + +news-item.ts src/app/core/services/news.service.ts->src/app/features/news-feed/models/news-item.ts - - + + - + src/app/features/news-feed/models/news-item.ts->src/app/core/models/person.ts - - + + src/app/core/services/people.service.spec.ts - -people.service.spec.ts + +people.service.spec.ts src/app/core/services/people.service.spec.ts->src/app/core/services/people.service.ts - - + + src/app/core/services/session-storage.service.spec.ts - -session-storage.service.spec.ts + +session-storage.service.spec.ts src/app/core/services/session-storage.service.spec.ts->src/app/core/services/session-storage.service.ts - - + + src/app/core/services/title.service.spec.ts - -title.service.spec.ts + +title.service.spec.ts src/app/core/services/title.service.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/core/services/title.service.spec.ts->src/app/core/services/title.service.ts - - + + src/app/core/services/user.service.spec.ts - -user.service.spec.ts + +user.service.spec.ts @@ -2661,1567 +2661,1555 @@ src/app/core/services/user.service.ts - -user.service.ts + +user.service.ts src/app/core/services/user.service.spec.ts->src/app/core/services/user.service.ts - - + + src/app/features/about/about-routing.module.ts->src/app/features/about/about.component.ts - - + + src/app/features/about/about.component.spec.ts - -about.component.spec.ts + +about.component.spec.ts src/app/features/about/about.component.spec.ts->src/app/features/about/about.component.ts - - + + src/app/features/blog/blog.component.ts - -blog.component.ts + +blog.component.ts src/app/features/blog/blog-routing.module.ts->src/app/features/blog/blog.component.ts - - + + src/app/features/blog/blog.component.spec.ts - -blog.component.spec.ts + +blog.component.spec.ts src/app/features/blog/blog.component.spec.ts->src/app/features/blog/blog.component.ts - - + + src/app/features/bookmarks/bookmarks.component.ts - -bookmarks.component.ts + +bookmarks.component.ts src/app/features/bookmarks/bookmarks-routing.module.ts->src/app/features/bookmarks/bookmarks.component.ts - - + + src/app/features/bookmarks/bookmarks.component.spec.ts - -bookmarks.component.spec.ts + +bookmarks.component.spec.ts src/app/features/bookmarks/bookmarks.component.spec.ts->src/app/features/bookmarks/bookmarks.component.ts - - + + src/app/features/dashboard/dashboard.component.ts - -dashboard.component.ts + +dashboard.component.ts src/app/features/dashboard/dashboard-routing.module.ts->src/app/features/dashboard/dashboard.component.ts - - + + src/app/features/dashboard/dashboard.component.spec.ts - -dashboard.component.spec.ts + +dashboard.component.spec.ts src/app/features/dashboard/dashboard.component.spec.ts->src/app/features/dashboard/dashboard.component.ts - - + + src/app/features/events/components/event-card/event-card.component.spec.ts - -event-card.component.spec.ts + +event-card.component.spec.ts src/app/features/events/components/event-card/event-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/features/events/components/event-card/event-card.component.spec.ts->src/app/features/events/components/event-card/event-card.component.ts - - + + src/app/features/events/components/event-card/event-card.component.ts->src/app/core/constants/routes.constants.ts - - + + src/app/features/events/components/event-card/event-card.component.ts->src/app/core/services/translations.service.ts - - + + src/app/features/events/components/event-card/event-card.component.ts->src/app/features/events/models/event.ts - - + + src/app/shared/models/material-button-type.ts - -material-button-type.ts + +material-button-type.ts src/app/features/events/components/event-card/event-card.component.ts->src/app/shared/models/material-button-type.ts - - + + src/app/shared/models/tooltip-direction.ts - -tooltip-direction.ts + +tooltip-direction.ts src/app/features/events/components/event-card/event-card.component.ts->src/app/shared/models/tooltip-direction.ts - - + + src/app/features/events/components/event-list/event-list.component.spec.ts - -event-list.component.spec.ts + +event-list.component.spec.ts src/app/features/events/components/event-list/event-list.component.spec.ts->src/app/features/events/components/event-list/event-list.component.ts - - + + src/app/features/events/components/event-list/event-list.component.ts->src/app/features/events/models/event.ts - - + + src/app/features/events/components/event/event.component.spec.ts - -event.component.spec.ts + +event.component.spec.ts src/app/features/events/components/event/event.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/features/events/components/event/event.component.spec.ts->src/app/features/events/components/event/event.component.ts - - + + src/app/features/events/components/event/event.component.ts->src/app/core/constants/routes.constants.ts - - + + src/app/features/events/components/event/event.component.ts->src/app/core/services/translations.service.ts - - + + src/app/features/events/components/event/event.component.ts->src/app/core/services/event.service.ts - - + + src/app/features/events/components/event/event.component.ts->src/app/features/events/models/event.ts - - + + src/app/features/events/components/event/event.component.ts->src/app/shared/models/material-button-type.ts - - + + src/app/features/events/components/event/event.component.ts->src/app/shared/models/tooltip-direction.ts - - + + src/app/features/events/components/event/event.component.ts->src/app/shared/components/banner/banner.component.ts - - + + src/app/shared/models/input-type.ts - -input-type.ts + +input-type.ts src/app/features/events/components/event/event.component.ts->src/app/shared/models/input-type.ts - - + + - + src/app/features/events/events-routing.module.ts->src/app/core/services/translations.service.ts - - + + src/app/features/events/events-routing.module.ts->src/app/features/events/events.component.ts - - + + src/app/features/events/events-routing.module.ts->src/app/features/events/components/event/event.component.ts - - + + - - -src/app/features/events/events-routing.module.ts->src/app/shared/components/banner/banner.component.ts - - + + +src/app/features/events/events.component.spec.ts + + +events.component.spec.ts + + + + + +src/app/features/events/events.component.spec.ts->src/app/features/events/events.component.ts + + - + src/app/features/events/resolvers/event.resolver.ts - - -event.resolver.ts + + +event.resolver.ts - - -src/app/features/events/events-routing.module.ts->src/app/features/events/resolvers/event.resolver.ts - - - - + src/app/features/events/resolvers/event.resolver.ts->src/app/core/services/event.service.ts - - + + - + src/app/features/events/resolvers/event.resolver.ts->src/app/features/events/models/event.ts - - - - - -src/app/features/events/events.component.spec.ts - - -events.component.spec.ts - - - - - -src/app/features/events/events.component.spec.ts->src/app/features/events/events.component.ts - - + + src/app/features/friends/friends.component.ts - -friends.component.ts + +friends.component.ts - + src/app/features/friends/friends-routing.module.ts->src/app/features/friends/friends.component.ts - - + + src/app/features/friends/friends.component.spec.ts - -friends.component.spec.ts + +friends.component.spec.ts - + src/app/features/friends/friends.component.spec.ts->src/app/features/friends/friends.component.ts - - + + src/app/features/groups/components/group-card/group-card.component.spec.ts - -group-card.component.spec.ts + +group-card.component.spec.ts - + src/app/features/groups/components/group-card/group-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/groups/components/group-card/group-card.component.spec.ts->src/app/features/groups/components/group-card/group-card.component.ts - - + + - + src/app/features/groups/components/group-card/group-card.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/features/groups/components/group-card/group-card.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/groups/components/group-card/group-card.component.ts->src/app/features/groups/models/group.ts - - + + src/app/features/groups/components/group-list/group-list.component.spec.ts - -group-list.component.spec.ts + +group-list.component.spec.ts - + src/app/features/groups/components/group-list/group-list.component.spec.ts->src/app/features/groups/components/group-list/group-list.component.ts - - + + - + src/app/features/groups/components/group-list/group-list.component.ts->src/app/features/groups/models/group.ts - - + + src/app/features/groups/components/group/group.component.spec.ts - -group.component.spec.ts + +group.component.spec.ts - + src/app/features/groups/components/group/group.component.spec.ts->src/app/features/groups/components/group/group.component.ts - - + + - + src/app/features/groups/groups-routing.module.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/groups/groups-routing.module.ts->src/app/features/groups/groups.component.ts - - + + - + src/app/features/groups/groups-routing.module.ts->src/app/features/groups/components/group/group.component.ts - - + + src/app/features/groups/groups.component.spec.ts - -groups.component.spec.ts + +groups.component.spec.ts - + src/app/features/groups/groups.component.spec.ts->src/app/features/groups/groups.component.ts - - + + - + src/app/features/home/home-routing.module.ts->src/app/features/home/home.component.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/models/person.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/services/event.service.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/services/group.service.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/services/people.service.ts - - + + - + src/app/features/home/home.component.ts->src/app/features/events/models/event.ts - - + + - + src/app/features/home/home.component.ts->src/app/features/groups/models/group.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/services/news.service.ts - - + + - + src/app/features/home/home.component.ts->src/app/features/news-feed/models/news-item.ts - - + + - + src/app/features/home/home.component.ts->src/app/shared/models/input-type.ts - - + + src/app/features/home/home.component.spec.ts - -home.component.spec.ts + +home.component.spec.ts - + src/app/features/home/home.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/home/home.component.spec.ts->src/app/features/home/home.component.ts - - + + src/app/features/invite/invite.component.ts - -invite.component.ts + +invite.component.ts - + src/app/features/invite/invite-routing.module.ts->src/app/features/invite/invite.component.ts - - + + src/app/features/invite/invite.component.spec.ts - -invite.component.spec.ts + +invite.component.spec.ts - + src/app/features/invite/invite.component.spec.ts->src/app/features/invite/invite.component.ts - - + + - + src/app/features/login/login-routing.module.ts->src/app/features/login/login.component.ts - - + + - + src/app/features/login/login.component.ts->src/app/core/services/translations.service.ts - - + + src/app/features/login/login.component.spec.ts - -login.component.spec.ts + +login.component.spec.ts - + src/app/features/login/login.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/login/login.component.spec.ts->src/app/features/login/login.component.ts - - + + src/app/features/members/members.component.ts - -members.component.ts + +members.component.ts - + src/app/features/members/members-routing.module.ts->src/app/features/members/members.component.ts - - + + src/app/features/members/members.component.spec.ts - -members.component.spec.ts + +members.component.spec.ts - + src/app/features/members/members.component.spec.ts->src/app/features/members/members.component.ts - - + + src/app/features/messages/messages.component.ts - -messages.component.ts + +messages.component.ts - + src/app/features/messages/messages-routing.module.ts->src/app/features/messages/messages.component.ts - - + + src/app/features/messages/messages.component.spec.ts - -messages.component.spec.ts + +messages.component.spec.ts - + src/app/features/messages/messages.component.spec.ts->src/app/features/messages/messages.component.ts - - + + src/app/features/missions/missions.component.ts - -missions.component.ts + +missions.component.ts - + src/app/features/missions/missions-routing.module.ts->src/app/features/missions/missions.component.ts - - + + src/app/features/missions/missions.component.spec.ts - -missions.component.spec.ts + +missions.component.spec.ts - + src/app/features/missions/missions.component.spec.ts->src/app/features/missions/missions.component.ts - - + + src/app/features/news-feed/components/news-card/news-card.component.spec.ts - -news-card.component.spec.ts + +news-card.component.spec.ts - + src/app/features/news-feed/components/news-card/news-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/news-feed/components/news-card/news-card.component.spec.ts->src/app/features/news-feed/components/news-card/news-card.component.ts - - + + - + src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/features/news-feed/models/news-item.ts - - + + - + src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/shared/models/material-button-type.ts - - + + src/app/features/news-feed/components/news-list/news-list.component.spec.ts - -news-list.component.spec.ts + +news-list.component.spec.ts - + src/app/features/news-feed/components/news-list/news-list.component.spec.ts->src/app/features/news-feed/components/news-list/news-list.component.ts - - + + - + src/app/features/news-feed/components/news-list/news-list.component.ts->src/app/features/news-feed/models/news-item.ts - - + + src/app/features/news-feed/news-feed.component.ts - -news-feed.component.ts + +news-feed.component.ts - + src/app/features/news-feed/news-feed-routing.module.ts->src/app/features/news-feed/news-feed.component.ts - - + + src/app/features/news-feed/news-feed.component.spec.ts - -news-feed.component.spec.ts + +news-feed.component.spec.ts - + src/app/features/news-feed/news-feed.component.spec.ts->src/app/features/news-feed/news-feed.component.ts - - + + - + src/app/features/privacy/privacy-routing.module.ts->src/app/features/privacy/privacy.component.ts - - + + src/app/features/privacy/privacy.component.spec.ts - -privacy.component.spec.ts + +privacy.component.spec.ts - + src/app/features/privacy/privacy.component.spec.ts->src/app/features/privacy/privacy.component.ts - - + + src/app/features/profile/components/profile-card/profile-card.component.spec.ts - -profile-card.component.spec.ts + +profile-card.component.spec.ts - + src/app/features/profile/components/profile-card/profile-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.spec.ts->src/app/features/profile/components/profile-card/profile-card.component.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/core/models/person.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/shared/models/tooltip-direction.ts - - + + src/app/features/profile/components/profile-list/profile-list.component.spec.ts - -profile-list.component.spec.ts + +profile-list.component.spec.ts - + src/app/features/profile/components/profile-list/profile-list.component.spec.ts->src/app/features/profile/components/profile-list/profile-list.component.ts - - + + - + src/app/features/profile/components/profile-list/profile-list.component.ts->src/app/core/models/person.ts - - + + src/app/features/profile/profile.component.ts - -profile.component.ts + +profile.component.ts - + src/app/features/profile/profile-routing.module.ts->src/app/features/profile/profile.component.ts - - + + src/app/features/profile/profile.component.spec.ts - -profile.component.spec.ts + +profile.component.spec.ts - + src/app/features/profile/profile.component.spec.ts->src/app/features/profile/profile.component.ts - - + + - + src/app/features/register/register-routing.module.ts->src/app/features/register/register.component.ts - - + + src/app/features/register/register.component.spec.ts - -register.component.spec.ts + +register.component.spec.ts - + src/app/features/register/register.component.spec.ts->src/app/features/register/register.component.ts - - + + src/app/features/search/search.component.ts - -search.component.ts + +search.component.ts - + src/app/features/search/search-routing.module.ts->src/app/features/search/search.component.ts - - + + src/app/features/search/search.component.spec.ts - -search.component.spec.ts + +search.component.spec.ts - + src/app/features/search/search.component.spec.ts->src/app/features/search/search.component.ts - - + + src/app/features/settings/settings.component.ts - -settings.component.ts + +settings.component.ts - + src/app/features/settings/settings-routing.module.ts->src/app/features/settings/settings.component.ts - - + + src/app/features/settings/settings.component.spec.ts - -settings.component.spec.ts + +settings.component.spec.ts - + src/app/features/settings/settings.component.spec.ts->src/app/features/settings/settings.component.ts - - + + - + src/app/features/splash/splash-routing.module.ts->src/app/features/splash/splash.component.ts - - + + src/app/features/splash/splash.component.spec.ts - -splash.component.spec.ts + +splash.component.spec.ts - + src/app/features/splash/splash.component.spec.ts->src/app/features/splash/splash.component.ts - - + + - + src/app/features/stats/stats-routing.module.ts->src/app/features/stats/stats.component.ts - - + + src/app/features/stats/stats.component.spec.ts - -stats.component.spec.ts + +stats.component.spec.ts - + src/app/features/stats/stats.component.spec.ts->src/app/features/stats/stats.component.ts - - + + - + src/app/features/terms/terms-routing.module.ts->src/app/features/terms/terms.component.ts - - + + src/app/features/terms/terms.component.spec.ts - -terms.component.spec.ts + +terms.component.spec.ts - + src/app/features/terms/terms.component.spec.ts->src/app/features/terms/terms.component.ts - - + + src/app/features/the-wire/the-wire.component.ts - -the-wire.component.ts + +the-wire.component.ts - + src/app/features/the-wire/the-wire-routing.module.ts->src/app/features/the-wire/the-wire.component.ts - - + + src/app/features/the-wire/the-wire.component.spec.ts - -the-wire.component.spec.ts + +the-wire.component.spec.ts - + src/app/features/the-wire/the-wire.component.spec.ts->src/app/features/the-wire/the-wire.component.ts - - + + src/app/shared/components/banner/banner.component.spec.ts - -banner.component.spec.ts + +banner.component.spec.ts - + src/app/shared/components/banner/banner.component.spec.ts->src/app/shared/components/banner/banner.component.ts - - + + src/app/shared/components/button/button.component.spec.ts - -button.component.spec.ts + +button.component.spec.ts - + src/app/shared/components/button/button.component.spec.ts->src/app/shared/components/button/button.component.ts - - + + - + src/app/shared/components/button/button.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/shared/components/button/button.component.ts->src/app/shared/models/tooltip-direction.ts - - + + src/app/shared/models/button-type.ts - -button-type.ts + +button-type.ts - + src/app/shared/components/button/button.component.ts->src/app/shared/models/button-type.ts - - + + src/app/shared/models/material-color.ts - -material-color.ts + +material-color.ts - + src/app/shared/components/button/button.component.ts->src/app/shared/models/material-color.ts - - + + src/app/shared/components/calendar-button/calendar-button.component.spec.ts - -calendar-button.component.spec.ts + +calendar-button.component.spec.ts - + src/app/shared/components/calendar-button/calendar-button.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/calendar-button/calendar-button.component.spec.ts->src/app/shared/components/calendar-button/calendar-button.component.ts - - + + - + src/app/shared/components/calendar-button/calendar-button.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/calendar-button/calendar-button.component.ts->src/app/shared/models/tooltip-direction.ts - - + + src/app/shared/components/editor/editor.component.spec.ts - -editor.component.spec.ts + +editor.component.spec.ts - + src/app/shared/components/editor/editor.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/editor/editor.component.spec.ts->src/app/shared/components/editor/editor.component.ts - - + + - + src/app/shared/components/editor/editor.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/editor/editor.component.ts->src/app/shared/factories/editor-config.factory.ts - - + + - + src/app/shared/factories/editor-config.factory.ts->src/app/core/services/translations.service.ts - - + + src/app/shared/components/footer/footer.component.spec.ts - -footer.component.spec.ts + +footer.component.spec.ts - + src/app/shared/components/footer/footer.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/footer/footer.component.spec.ts->src/app/shared/components/footer/footer.component.ts - - + + - + src/app/shared/components/footer/footer.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/shared/components/footer/footer.component.ts->src/app/core/services/translations.service.ts - - + + src/app/shared/components/forbidden/forbidden.component.spec.ts - -forbidden.component.spec.ts + +forbidden.component.spec.ts - + src/app/shared/components/forbidden/forbidden.component.spec.ts->src/app/shared/components/forbidden/forbidden.component.ts - - + + src/app/shared/components/header/header.component.spec.ts - -header.component.spec.ts + +header.component.spec.ts - + src/app/shared/components/header/header.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/header/header.component.spec.ts->src/app/shared/components/header/header.component.ts - - + + - + src/app/shared/components/header/header.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/shared/components/header/header.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/header/header.component.ts->src/app/core/models/person.ts - - + + - + src/app/shared/components/header/header.component.ts->src/app/core/services/people.service.ts - - + + - + src/app/shared/components/header/header.component.ts->src/app/shared/models/material-button-type.ts - - + + src/app/shared/components/input/input.component.spec.ts - -input.component.spec.ts + +input.component.spec.ts - + src/app/shared/components/input/input.component.spec.ts->src/app/shared/components/input/input.component.ts - - + + - + src/app/shared/components/input/input.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/input/input.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/shared/components/input/input.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/shared/components/input/input.component.ts->src/app/shared/models/input-type.ts - - + + src/app/shared/components/language-selector/language-selector.component.spec.ts - -language-selector.component.spec.ts + +language-selector.component.spec.ts - + src/app/shared/components/language-selector/language-selector.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.spec.ts->src/app/shared/components/language-selector/language-selector.component.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.ts->src/app/shared/models/material-button-type.ts - - + + src/app/shared/models/language.ts - -language.ts + +language.ts - + src/app/shared/components/language-selector/language-selector.component.ts->src/app/shared/models/language.ts - - + + src/app/shared/components/not-found/not-found.component.spec.ts - -not-found.component.spec.ts + +not-found.component.spec.ts - + src/app/shared/components/not-found/not-found.component.spec.ts->src/app/shared/components/not-found/not-found.component.ts - - + + src/app/shared/components/page-title/page-title.component.spec.ts - -page-title.component.spec.ts + +page-title.component.spec.ts - + src/app/shared/components/page-title/page-title.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/page-title/page-title.component.spec.ts->src/app/shared/components/page-title/page-title.component.ts - - + + src/app/shared/components/profile-pic/profile-pic.component.spec.ts - -profile-pic.component.spec.ts + +profile-pic.component.spec.ts - + src/app/shared/components/profile-pic/profile-pic.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.spec.ts->src/app/shared/components/profile-pic/profile-pic.component.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.ts->src/app/core/models/person.ts - - + + src/app/shared/components/unauthorized/unauthorized.component.spec.ts - -unauthorized.component.spec.ts + +unauthorized.component.spec.ts - + src/app/shared/components/unauthorized/unauthorized.component.spec.ts->src/app/shared/components/unauthorized/unauthorized.component.ts - - + + src/assets/i18n/translations.fr.ts - -translations.fr.ts + +translations.fr.ts - + src/assets/i18n/translations.fr.ts->src/assets/i18n/translations.en.ts - - + + @@ -4245,29 +4233,29 @@ src/main.ts - -main.ts + +main.ts - + src/main.ts->src/app/app.module.ts - - + + - + src/main.ts->src/environments/environment.ts - + src/polyfills.ts - -polyfills.ts + +polyfills.ts @@ -4275,8 +4263,8 @@ src/test.ts - -test.ts + +test.ts From 746931857b8d75f178fc0fb7e605f8155f26f03b Mon Sep 17 00:00:00 2001 From: doug0102 Date: Wed, 30 Aug 2023 15:57:46 -0400 Subject: [PATCH 027/165] feedback from design meeting --- .../event-card/event-card.component.html | 2 +- .../components/event-card/event-card.component.ts | 1 + .../events/components/event/event.component.html | 4 ++-- .../events/components/event/event.component.scss | 10 +++++++++- .../components/news-card/news-card.component.html | 14 +++++--------- .../components/news-card/news-card.component.scss | 6 +----- src/assets/scss/partials/_palettes.scss | 2 +- src/theme.scss | 2 +- 8 files changed, 21 insertions(+), 20 deletions(-) diff --git a/src/app/features/events/components/event-card/event-card.component.html b/src/app/features/events/components/event-card/event-card.component.html index b4d31cfd..9c3e6021 100644 --- a/src/app/features/events/components/event-card/event-card.component.html +++ b/src/app/features/events/components/event-card/event-card.component.html @@ -1,4 +1,4 @@ - +
diff --git a/src/app/features/events/components/event-card/event-card.component.ts b/src/app/features/events/components/event-card/event-card.component.ts index 89aa937f..d1b39a0a 100644 --- a/src/app/features/events/components/event-card/event-card.component.ts +++ b/src/app/features/events/components/event-card/event-card.component.ts @@ -17,6 +17,7 @@ export class EventCardComponent { @Input() loading: boolean = false; @Output() confirm = new EventEmitter(); @Output() decline = new EventEmitter(); + @Input() view: String = 'small'; materialButtonType = MaterialButtonType; tooltipDirection = TooltipDirection; diff --git a/src/app/features/events/components/event/event.component.html b/src/app/features/events/components/event/event.component.html index ff3324f2..48ecd687 100644 --- a/src/app/features/events/components/event/event.component.html +++ b/src/app/features/events/components/event/event.component.html @@ -116,9 +116,9 @@

-

+

{{ translations.event.event_description | translate }} -

+

diff --git a/src/app/features/events/components/event/event.component.scss b/src/app/features/events/components/event/event.component.scss index cd35b84e..90a8dec2 100644 --- a/src/app/features/events/components/event/event.component.scss +++ b/src/app/features/events/components/event/event.component.scss @@ -86,6 +86,8 @@ $calendar-size: 120px; flex-direction: row; width: 100%; height: 140px; + font-size: 20px; + padding: 35px 0; i { color: $primary-2; @@ -104,7 +106,7 @@ $calendar-size: 120px; .section-separator { height: 40px; - margin-top: 30px; + margin-top: 45px; flex-grow: 0.5; border-left: 2px solid $neutral-300; } @@ -115,6 +117,12 @@ $calendar-size: 120px; } } + .event-description { + p { + font-size: 20px; + } + } + .event-registration { max-width: 50%; min-width: 400px; diff --git a/src/app/features/news-feed/components/news-card/news-card.component.html b/src/app/features/news-feed/components/news-card/news-card.component.html index f7dffd73..3006e786 100644 --- a/src/app/features/news-feed/components/news-card/news-card.component.html +++ b/src/app/features/news-feed/components/news-card/news-card.component.html @@ -36,7 +36,8 @@
- - - -
{{ model ? (model.likes > 0 ? model.likes + (liked ? 1 : 0) : '') : ''}} -
+ - + {{ model?.comments }} -
- {{ model?.comments ? model?.comments : '' }} -
div { display: flex; width: 50%; + align-items: center; } .right-actions { @@ -60,11 +61,6 @@ $title-padding: 90px; color: $primary-2; } - .action-count { - display: flex; - align-items: center; - } - .right-actions { flex-direction: row-reverse; } diff --git a/src/assets/scss/partials/_palettes.scss b/src/assets/scss/partials/_palettes.scss index 5238745b..0cfe5717 100644 --- a/src/assets/scss/partials/_palettes.scss +++ b/src/assets/scss/partials/_palettes.scss @@ -4,7 +4,7 @@ $primary-palette: ( 200: #d493e7, 300: #c266de, 400: #b440d6, - 500: #a612ce, + 500: #6C0DBA, //#a612ce 600: #9612c8, 700: #800fc1, 800: #6c0dba, diff --git a/src/theme.scss b/src/theme.scss index 8c1d81dd..71e651aa 100644 --- a/src/theme.scss +++ b/src/theme.scss @@ -32,7 +32,7 @@ $theme: mat.define-light-theme(( // Custom Overrides body { background-color: $background; - color: $neutral-900; + color: #000; } //Component Overrides From 0c6fdcf9ae81e92fee6863c031fd146916f017c6 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Wed, 30 Aug 2023 15:59:46 -0400 Subject: [PATCH 028/165] minor --- .../events/components/event-card/event-card.component.html | 2 +- .../events/components/event-card/event-card.component.ts | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/app/features/events/components/event-card/event-card.component.html b/src/app/features/events/components/event-card/event-card.component.html index 9c3e6021..b4d31cfd 100644 --- a/src/app/features/events/components/event-card/event-card.component.html +++ b/src/app/features/events/components/event-card/event-card.component.html @@ -1,4 +1,4 @@ - +
diff --git a/src/app/features/events/components/event-card/event-card.component.ts b/src/app/features/events/components/event-card/event-card.component.ts index d1b39a0a..89aa937f 100644 --- a/src/app/features/events/components/event-card/event-card.component.ts +++ b/src/app/features/events/components/event-card/event-card.component.ts @@ -17,7 +17,6 @@ export class EventCardComponent { @Input() loading: boolean = false; @Output() confirm = new EventEmitter(); @Output() decline = new EventEmitter(); - @Input() view: String = 'small'; materialButtonType = MaterialButtonType; tooltipDirection = TooltipDirection; From 00e06cee5c9a1d29bfb8fa3214a8a617af519ec4 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Fri, 1 Sep 2023 11:34:04 -0400 Subject: [PATCH 029/165] adjust input hint button --- .../components/input/input.component.html | 26 +++++++------------ .../components/input/input.component.scss | 12 +++++++++ 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/src/app/shared/components/input/input.component.html b/src/app/shared/components/input/input.component.html index 4af7a044..652ffe23 100644 --- a/src/app/shared/components/input/input.component.html +++ b/src/app/shared/components/input/input.component.html @@ -1,23 +1,17 @@
- - + {{ label }} -
- * -
+
*
+ +
- - - - Date: Fri, 1 Sep 2023 14:52:39 -0400 Subject: [PATCH 030/165] url encode the routes in typescript loader --- src/app/core/helpers/typescript-loader.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/app/core/helpers/typescript-loader.ts b/src/app/core/helpers/typescript-loader.ts index 70e7a901..caeb9126 100644 --- a/src/app/core/helpers/typescript-loader.ts +++ b/src/app/core/helpers/typescript-loader.ts @@ -16,6 +16,11 @@ export class TypescriptLoader implements TranslateLoader { map(response => { let obj = response.substring(response.indexOf('{'), response.lastIndexOf('}') + 1); const translations = eval(JSON.parse(obj)); + + for (const [key, value] of Object.entries(translations.routes)) { + translations.routes[key] = encodeURIComponent(`${value}`); + } + return translations.default || translations; }) ); From 8a1789787be17741635e0c6d29348d514ea8f540 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Tue, 5 Sep 2023 13:43:46 -0400 Subject: [PATCH 031/165] news list scroll --- src/app/app.module.ts | 3 ++- src/app/features/home/home.component.scss | 3 --- .../news-list/news-list.component.html | 6 +---- .../news-list/news-list.component.scss | 25 ------------------- .../news-list/news-list.component.ts | 2 +- 5 files changed, 4 insertions(+), 35 deletions(-) diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 7082bbb1..cd8a5b3b 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -42,7 +42,8 @@ import { GroupsComponent } from './features/groups/groups.component'; }), NgxTranslateRoutesModule.forRoot({ enableRouteTranslate: true, - enableTitleTranslate: false + enableTitleTranslate: false, + }), BrowserAnimationsModule ], diff --git a/src/app/features/home/home.component.scss b/src/app/features/home/home.component.scss index e662fea9..1b7039b9 100644 --- a/src/app/features/home/home.component.scss +++ b/src/app/features/home/home.component.scss @@ -7,9 +7,6 @@ padding-right: $grid-step; > div { - max-height: 100vh; - min-height: 100%; - overflow: auto; padding: 0 22px 0 22px; } } diff --git a/src/app/features/news-feed/components/news-list/news-list.component.html b/src/app/features/news-feed/components/news-list/news-list.component.html index 7221a8c7..339bce35 100644 --- a/src/app/features/news-feed/components/news-list/news-list.component.html +++ b/src/app/features/news-feed/components/news-list/news-list.component.html @@ -1,19 +1,15 @@
-
-
- -
There is nothing to display.
-
+
diff --git a/src/app/features/news-feed/components/news-list/news-list.component.scss b/src/app/features/news-feed/components/news-list/news-list.component.scss index f3688918..5b3d9e8a 100644 --- a/src/app/features/news-feed/components/news-list/news-list.component.scss +++ b/src/app/features/news-feed/components/news-list/news-list.component.scss @@ -18,30 +18,5 @@ font-size: 18px; font-weight: 600; } - - .fade-list-top { - width: calc(100% + 22px + 2px); - height: 44px; - margin-left: -22px; - margin-top: -22px; - position: sticky; - top: 0; - z-index: 2; - background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(255 255 255)), to(rgba(0, 0, 0, 0))); - pointer-events: none; - } - - .fade-list-bottom { - width: 100%; - height: 44px; - position: sticky; - margin-left: -22px; - margin-top: -22px; - z-index: 2; - bottom: 0; - width: calc(100% + 22px); - background-image: -webkit-gradient(linear, left bottom, left top, from(rgb(255 255 255)), to(rgba(0, 0, 0, 0))); - pointer-events: none; - } } } \ No newline at end of file diff --git a/src/app/features/news-feed/components/news-list/news-list.component.ts b/src/app/features/news-feed/components/news-list/news-list.component.ts index e18311d4..e2a2819a 100644 --- a/src/app/features/news-feed/components/news-list/news-list.component.ts +++ b/src/app/features/news-feed/components/news-list/news-list.component.ts @@ -10,7 +10,7 @@ import { NewsItem } from '../../models/news-item'; export class NewsListComponent { @Input() model?: NewsItem[]; @Input() isLoading: boolean = false; - @Input() loadingCount: number = 3; + @Input() loadingCount: number = 5; loadingItems: number[]; From ff94ae013848081f35572985efee770b7514cb5b Mon Sep 17 00:00:00 2001 From: doug0102 Date: Fri, 8 Sep 2023 13:35:58 -0400 Subject: [PATCH 032/165] pre-quill wip --- .../components/event/event.component.html | 15 +++++++- .../components/event/event.component.ts | 18 +++++++++ src/app/features/events/events.module.ts | 2 +- src/app/features/home/home.component.html | 3 ++ src/app/features/home/home.component.scss | 5 +++ src/app/features/home/home.component.ts | 2 +- .../news-list/news-list.component.html | 4 +- .../news-list/news-list.component.scss | 10 +---- .../news-list/news-list.component.ts | 4 +- src/app/features/profile/profile.module.ts | 7 +++- .../components/editor/editor.component.html | 12 ++++-- .../components/editor/editor.component.scss | 23 +++++++++++ .../components/editor/editor.component.ts | 38 +++++++++++++++++-- .../components/input/input.component.html | 2 + .../components/input/input.component.scss | 15 ++++++++ .../components/input/input.component.ts | 4 +- src/app/shared/shared.module.ts | 5 ++- 17 files changed, 141 insertions(+), 28 deletions(-) diff --git a/src/app/features/events/components/event/event.component.html b/src/app/features/events/components/event/event.component.html index 48ecd687..f05319f0 100644 --- a/src/app/features/events/components/event/event.component.html +++ b/src/app/features/events/components/event/event.component.html @@ -124,7 +124,7 @@

-
+

{{ translations.event.event_registration | translate }}

@@ -134,26 +134,34 @@

{{ translations.event.event_registration | translate }}

[placeholder]="translations.event.form.placeholder | translate" [errorMessage]="translations.event.form.full_name_error | translate" [required]="true" + [formControl]="nameFormControl" + [errorStateMatcher]="matcher" [disabled]="loading || isPast()"> @@ -165,6 +173,8 @@

{{ translations.event.event_registration | translate }}

[errorMessage]="translations.event.form.occupation_error | translate" [hint]="translations.event.form.occupation_hint | translate" [required]="true" + [formControl]="occupationFormControl" + [errorStateMatcher]="matcher" [disabled]="loading || isPast()"> @@ -179,6 +189,7 @@

{{ translations.event.event_registration | translate }}

{{ translations.event.form.agree_with | translate }} @@ -196,6 +207,6 @@

{{ translations.event.event_registration | translate }}

class="registerBtn"> {{ translations.event.form.register | translate }} -
+
\ No newline at end of file diff --git a/src/app/features/events/components/event/event.component.ts b/src/app/features/events/components/event/event.component.ts index 11482095..61a9d094 100644 --- a/src/app/features/events/components/event/event.component.ts +++ b/src/app/features/events/components/event/event.component.ts @@ -10,6 +10,8 @@ import { InputType } from 'src/app/shared/models/input-type'; import { ActivatedRoute } from '@angular/router'; import { EventService } from 'src/app/core/services/event.service'; import { CoreRoutes } from 'src/app/core/constants/routes.constants'; +import { FormControl, FormGroupDirective, NgForm, Validators } from '@angular/forms'; +import { ErrorStateMatcher } from '@angular/material/core'; @Component({ selector: 'app-event', @@ -24,6 +26,7 @@ export class EventComponent implements OnInit { banner: Banner | null = null; loading: boolean = true; bookmarked: boolean = false; + agreeToTerms: boolean = false; registerFormId: string = 'gcc-event-register-form'; @@ -35,6 +38,13 @@ export class EventComponent implements OnInit { private readonly route: ActivatedRoute = inject(ActivatedRoute); private readonly eventService: EventService = inject(EventService); + nameFormControl = new FormControl('', [Validators.required]); + emailFormControl = new FormControl('', [Validators.required, Validators.email]); + emailConfirmFormControl = new FormControl('', [Validators.required, Validators.email]); + occupationFormControl = new FormControl('', [Validators.required]); + + matcher = new MyErrorStateMatcher(); + constructor(public translations: Translations, private viewportScroller: ViewportScroller ) { @@ -72,3 +82,11 @@ export class EventComponent implements OnInit { this.viewportScroller.scrollToAnchor(this.registerFormId); } } + +/** Error when invalid control is dirty, touched, or submitted. */ +export class MyErrorStateMatcher implements ErrorStateMatcher { + isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean { + const isSubmitted = form && form.submitted; + return !!(control && control.invalid && (control.dirty || control.touched || isSubmitted)); + } +} diff --git a/src/app/features/events/events.module.ts b/src/app/features/events/events.module.ts index 90c04564..9ff2d6c3 100644 --- a/src/app/features/events/events.module.ts +++ b/src/app/features/events/events.module.ts @@ -18,7 +18,7 @@ import { EventComponent } from './components/event/event.component'; CommonModule, EventsRoutingModule, SharedModule, - MatCardModule + MatCardModule, ], exports: [ EventListComponent diff --git a/src/app/features/home/home.component.html b/src/app/features/home/home.component.html index 0233de7a..71793468 100644 --- a/src/app/features/home/home.component.html +++ b/src/app/features/home/home.component.html @@ -21,6 +21,9 @@ [infiniteScrollDistance]="2" [infiniteScrollThrottle]="1000" (scrolled)="onNewsScroll()"> + + + diff --git a/src/app/features/home/home.component.scss b/src/app/features/home/home.component.scss index 1b7039b9..10d13d1a 100644 --- a/src/app/features/home/home.component.scss +++ b/src/app/features/home/home.component.scss @@ -6,6 +6,11 @@ width: 66%; padding-right: $grid-step; + app-post { + display: block; + padding-bottom: 40px; + } + > div { padding: 0 22px 0 22px; } diff --git a/src/app/features/home/home.component.ts b/src/app/features/home/home.component.ts index d9c26285..fad313d2 100644 --- a/src/app/features/home/home.component.ts +++ b/src/app/features/home/home.component.ts @@ -74,7 +74,7 @@ export class HomeComponent implements OnInit { onNewsScroll(): void { this.loadingNews = true; - this.newsService.mockGetNewsItems(10, 3000).subscribe((newsItems: NewsItem[]) => { + this.newsService.mockGetNewsItems(10, 30000).subscribe((newsItems: NewsItem[]) => { this.newsItems.push(...newsItems); this.loadingNews = false; }); diff --git a/src/app/features/news-feed/components/news-list/news-list.component.html b/src/app/features/news-feed/components/news-list/news-list.component.html index 339bce35..281b1ab4 100644 --- a/src/app/features/news-feed/components/news-list/news-list.component.html +++ b/src/app/features/news-feed/components/news-list/news-list.component.html @@ -8,8 +8,8 @@ There is nothing to display.
-
-
+
+
diff --git a/src/app/features/news-feed/components/news-list/news-list.component.scss b/src/app/features/news-feed/components/news-list/news-list.component.scss index 5b3d9e8a..a068ce5c 100644 --- a/src/app/features/news-feed/components/news-list/news-list.component.scss +++ b/src/app/features/news-feed/components/news-list/news-list.component.scss @@ -3,15 +3,7 @@ overflow: visible; .news-card-wrapper { - padding: 20px 0; - } - - .news-card-wrapper:first-child { - padding-top: 0; - } - - .news-card-wrapper:last-child { - padding-bottom: 0; + padding-bottom: 40px; } > div:not(.news-card-wrapper) { diff --git a/src/app/features/news-feed/components/news-list/news-list.component.ts b/src/app/features/news-feed/components/news-list/news-list.component.ts index e2a2819a..a2c0c79b 100644 --- a/src/app/features/news-feed/components/news-list/news-list.component.ts +++ b/src/app/features/news-feed/components/news-list/news-list.component.ts @@ -8,9 +8,9 @@ import { NewsItem } from '../../models/news-item'; changeDetection: ChangeDetectionStrategy.OnPush }) export class NewsListComponent { - @Input() model?: NewsItem[]; + @Input() model: NewsItem[] = []; @Input() isLoading: boolean = false; - @Input() loadingCount: number = 5; + @Input() loadingCount: number = 3; loadingItems: number[]; diff --git a/src/app/features/profile/profile.module.ts b/src/app/features/profile/profile.module.ts index aa1205f5..f201b95f 100644 --- a/src/app/features/profile/profile.module.ts +++ b/src/app/features/profile/profile.module.ts @@ -6,12 +6,14 @@ import { SharedModule } from 'src/app/shared/shared.module'; import { ProfileCardComponent } from './components/profile-card/profile-card.component'; import { MatCardModule } from '@angular/material/card'; import { ProfileListComponent } from './components/profile-list/profile-list.component'; +import { PostComponent } from './components/post/post.component'; @NgModule({ declarations: [ ProfileCardComponent, - ProfileListComponent + ProfileListComponent, + PostComponent ], imports: [ CommonModule, @@ -21,7 +23,8 @@ import { ProfileListComponent } from './components/profile-list/profile-list.com ], exports: [ ProfileCardComponent, - ProfileListComponent + ProfileListComponent, + PostComponent ] }) export class ProfileModule { } diff --git a/src/app/shared/components/editor/editor.component.html b/src/app/shared/components/editor/editor.component.html index 021f0e11..af32ec53 100644 --- a/src/app/shared/components/editor/editor.component.html +++ b/src/app/shared/components/editor/editor.component.html @@ -1,12 +1,18 @@
+ [toolbar]="toolbar" + [customMenuRef]="customMenu" + [disabled]="disabled"> -
\ No newline at end of file +
+ + + + \ No newline at end of file diff --git a/src/app/shared/components/editor/editor.component.scss b/src/app/shared/components/editor/editor.component.scss index 1bb9f615..24ee4ca0 100644 --- a/src/app/shared/components/editor/editor.component.scss +++ b/src/app/shared/components/editor/editor.component.scss @@ -1,3 +1,5 @@ +@import "../../../../assets/scss/partials/colors"; + :host { display: block; width: 100%; @@ -6,5 +8,26 @@ position: relative; max-width: 100%; max-height: 100%; + border-radius: 10px; + border: 2px solid $neutral-300; + + ngx-editor-menu { + ::ng-deep { + .NgxEditor__MenuBar { + border-top-left-radius: 10px; + border-top-right-radius: 10px; + border-bottom: 2px solid $neutral-300; + } + } + } + + ngx-editor { + ::ng-deep { + .NgxEditor { + border-bottom-left-radius: 10px; + border-bottom-right-radius: 10px; + } + } + } } } \ No newline at end of file diff --git a/src/app/shared/components/editor/editor.component.ts b/src/app/shared/components/editor/editor.component.ts index 2cc4634f..fe5e846c 100644 --- a/src/app/shared/components/editor/editor.component.ts +++ b/src/app/shared/components/editor/editor.component.ts @@ -1,4 +1,4 @@ -import { Component, OnDestroy, OnInit } from '@angular/core'; +import { AfterViewInit, Component, ElementRef, Input, OnDestroy, OnInit, ViewChild } from '@angular/core'; import { TranslateService } from '@ngx-translate/core'; import { Editor, NgxEditorService, Toolbar } from 'ngx-editor'; import { ngxEditorLocals } from '../../factories/editor-config.factory'; @@ -11,7 +11,12 @@ import { Translations } from 'src/app/core/services/translations.service'; templateUrl: './editor.component.html', styleUrls: ['./editor.component.scss'] }) -export class EditorComponent implements OnInit, OnDestroy { +export class EditorComponent implements OnInit, OnDestroy, AfterViewInit { + + @Input() disabled: boolean = false; + + @ViewChild('[title="Bold"]') el!:ElementRef; + editor: Editor; toolbar: Toolbar = [ ['bold', 'italic'], @@ -28,12 +33,17 @@ export class EditorComponent implements OnInit, OnDestroy { private langChangeSub!: Subscription; - constructor(private translateService: TranslateService, private ngxEditorService: NgxEditorService, public translations: Translations ) { - this.editor = new Editor(); + constructor(private translateService: TranslateService, private ngxEditorService: NgxEditorService, public translations: Translations, private elementRef: ElementRef ) { + this.editor = new Editor({ + history: true, + keyboardShortcuts: true, + inputRules: true, + }); this.langChangeSub = this.translateService.onLangChange.subscribe(() => { this.onLangChange(); }); + } ngOnInit(): void { @@ -41,6 +51,10 @@ export class EditorComponent implements OnInit, OnDestroy { this.editor = new Editor(); } + ngAfterViewInit() { + this.applyAccessibility(); + } + ngOnDestroy(): void { if (this.editor) this.editor.destroy(); @@ -51,9 +65,25 @@ export class EditorComponent implements OnInit, OnDestroy { onLangChange(): void { this.ngxEditorService.config.locals = ngxEditorLocals(this.translateService, this.translations); + this.applyAccessibility(); } placeholderText(): string { return this.translateService.instant(this.translations.editor.placeholder) } + + applyAccessibility(): void { + let bold = this.elementRef.nativeElement.querySelectorAll('[title="' + this.translateService.instant(this.translations.editor.bold) + '"]')[0]; + bold.setAttribute('tabIndex', '0'); + bold.setAttribute('ariaLabel', this.translateService.instant(this.translations.editor.bold)); + bold.addEventListener('click', (event: KeyboardEvent) => { + console.log('clicked'); + }); + bold.addEventListener('keydown', (event: KeyboardEvent) => { + if (event.key == "Enter") { + bold.dispatchEvent(new Event('click',)); + //bold.click(); + } + }); + } } diff --git a/src/app/shared/components/input/input.component.html b/src/app/shared/components/input/input.component.html index 652ffe23..187c3fdc 100644 --- a/src/app/shared/components/input/input.component.html +++ b/src/app/shared/components/input/input.component.html @@ -26,6 +26,8 @@ [disabled]="disabled" [readonly]="readonly" [autofocus]="autofocus" + [formControl]="formControl" + [errorStateMatcher]="errorStateMatcher" > Date: Thu, 14 Sep 2023 15:51:26 -0400 Subject: [PATCH 033/165] wip --- .../event-card/event-card.component.html | 123 ++++++++++-------- .../event-card/event-card.component.scss | 10 ++ .../event-card/event-card.component.ts | 1 + 3 files changed, 78 insertions(+), 56 deletions(-) diff --git a/src/app/features/events/components/event-card/event-card.component.html b/src/app/features/events/components/event-card/event-card.component.html index b4d31cfd..34052977 100644 --- a/src/app/features/events/components/event-card/event-card.component.html +++ b/src/app/features/events/components/event-card/event-card.component.html @@ -1,60 +1,71 @@ - - - -
- - -
- -
- -
- {{ model?.title }} + + + + +
+ +
-
- {{ model?.eventType }} +
+ +
+ {{ model?.title }} +
+ +
+ {{ model?.eventType }} +
+ +
- -
- -
- - - - - - - - - - - -
-
-
\ No newline at end of file +
+ + + + + + + + + + + +
+ + +
+ + + + + + + + + \ No newline at end of file diff --git a/src/app/features/events/components/event-card/event-card.component.scss b/src/app/features/events/components/event-card/event-card.component.scss index 67af1611..3fbe979e 100644 --- a/src/app/features/events/components/event-card/event-card.component.scss +++ b/src/app/features/events/components/event-card/event-card.component.scss @@ -132,4 +132,14 @@ } } } + + // Small View + mat-card.event-card-small { + display: block; // placeholders + } + + // Large View + mat-card.event-card-large { + display: block; // placeholders + } } \ No newline at end of file diff --git a/src/app/features/events/components/event-card/event-card.component.ts b/src/app/features/events/components/event-card/event-card.component.ts index 89aa937f..d235eb02 100644 --- a/src/app/features/events/components/event-card/event-card.component.ts +++ b/src/app/features/events/components/event-card/event-card.component.ts @@ -15,6 +15,7 @@ import { TooltipDirection } from 'src/app/shared/models/tooltip-direction'; export class EventCardComponent { @Input() model?: Event; @Input() loading: boolean = false; + @Input() view: string = 'small'; @Output() confirm = new EventEmitter(); @Output() decline = new EventEmitter(); From 0c2d25f2008fb2d105c85cb4202deff364576967 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Mon, 18 Sep 2023 13:58:59 -0400 Subject: [PATCH 034/165] keyboard accessible editor --- src/app/app.module.ts | 2 +- src/app/core/services/event.service.ts | 2 +- .../components/post/post.component.html | 48 +++++ .../components/post/post.component.scss | 84 +++++++++ .../components/post/post.component.spec.ts | 21 +++ .../profile/components/post/post.component.ts | 20 ++ .../components/banner/banner.component.ts | 2 +- .../components/editor/editor.component.html | 12 +- .../components/editor/editor.component.scss | 30 +++ .../components/editor/editor.component.ts | 178 +++++++++++++++--- .../editor-menu/editor-menu.component.html | 7 + .../editor-menu/editor-menu.component.scss | 0 .../editor-menu/editor-menu.component.spec.ts | 21 +++ .../menu/editor-menu/editor-menu.component.ts | 59 ++++++ src/app/shared/shared.module.ts | 6 +- src/assets/i18n/translations.en.ts | 3 +- src/assets/i18n/translations.fr.ts | 7 +- src/assets/{svg => image}/banner.svg | 0 src/assets/image/group-banner.png | Bin 0 -> 247907 bytes tsconfig.json | 1 + 20 files changed, 471 insertions(+), 32 deletions(-) create mode 100644 src/app/features/profile/components/post/post.component.html create mode 100644 src/app/features/profile/components/post/post.component.scss create mode 100644 src/app/features/profile/components/post/post.component.spec.ts create mode 100644 src/app/features/profile/components/post/post.component.ts create mode 100644 src/app/shared/components/editor/menu/editor-menu/editor-menu.component.html create mode 100644 src/app/shared/components/editor/menu/editor-menu/editor-menu.component.scss create mode 100644 src/app/shared/components/editor/menu/editor-menu/editor-menu.component.spec.ts create mode 100644 src/app/shared/components/editor/menu/editor-menu/editor-menu.component.ts rename src/assets/{svg => image}/banner.svg (100%) create mode 100644 src/assets/image/group-banner.png diff --git a/src/app/app.module.ts b/src/app/app.module.ts index cd8a5b3b..59313b1d 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -45,7 +45,7 @@ import { GroupsComponent } from './features/groups/groups.component'; enableTitleTranslate: false, }), - BrowserAnimationsModule + BrowserAnimationsModule, ], providers: [ { diff --git a/src/app/core/services/event.service.ts b/src/app/core/services/event.service.ts index 7e4f44da..d30d23f5 100644 --- a/src/app/core/services/event.service.ts +++ b/src/app/core/services/event.service.ts @@ -155,7 +155,7 @@ export class EventService { private randomImage() { const images: string[] = [ - 'https://s3-alpha-sig.figma.com/img/9986/772c/bad4dde06cf83ed41c61df1b17d1369a?Expires=1693785600&Signature=Mk0vcKtlQGC1NfcH0dBlpdPH-i5JMQSjJHiBxsVivkz6XbUMgo5Ul~T1ZUsd5gqSdBNfzmzp7lkO9qpVNlO8-A4GndxqBMpov3x3qwhzV1XJobTN40viIEkOjMwF~jMFLjFRL7Ya2zrsBOKmct95k6QiyVuzvgVkm3o6bcjRNM7DuWnMFbju73L4Y-qDphKeglfi83dYbf3qO074PUnB3ReGXGChQ23~NiykgTz8UDu4oszh09nTKlnPhi8ZxuBckc6W8CsIUbsjaaTP6p0lcukyKa49lGjB9aFJ~xvpf38YI3ssl6rLlpWP1ILo6HvmQQAF7wdZvhPH1edpaeWecw__&Key-Pair-Id=APKAQ4GOSFWCVNEHN3O4' + '../assets/image/group-banner.png' ]; return images[Math.floor(Math.random() * images.length)]; } diff --git a/src/app/features/profile/components/post/post.component.html b/src/app/features/profile/components/post/post.component.html new file mode 100644 index 00000000..af203b55 --- /dev/null +++ b/src/app/features/profile/components/post/post.component.html @@ -0,0 +1,48 @@ + + +
+ +
+ +
+ + + + +
+ + + + {{ profile.firstName + ' ' + profile.lastName }} + + + {{ profile.jobTitle }} + + + + +

+ + + + + +
+ + +
+ +
+ +
+ +
+
+
\ No newline at end of file diff --git a/src/app/features/profile/components/post/post.component.scss b/src/app/features/profile/components/post/post.component.scss new file mode 100644 index 00000000..13fa229b --- /dev/null +++ b/src/app/features/profile/components/post/post.component.scss @@ -0,0 +1,84 @@ +@import "../../../../../assets//scss/partials/colors"; +@import "../../../../../assets//scss/partials/font-weights"; + +$title-padding: 90px; + +:host { + mat-card { + border: 1px solid $neutral-300; + box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25); + border-radius: 10px; + padding: 0 10px; + + .profile-wrapper { + position: absolute; + left: -20px; + top: -20px; + width: 100px; + height: 100px; + border-radius: 50%; + background-color: $background; + padding: 5px; + box-shadow: 0px 2px 4px 1px rgba(0, 0, 0, 0.25); + } + + mat-card-header { + padding: 32px 0 0 calc(16px + $title-padding); + + mat-card-title { + font-size: 20px; + font-weight: $bold; + } + + mat-card-subtitle { + font-size: 16px; + } + } + + mat-card-content { + padding-top: 15px; + padding-bottom: 10px; + } + + mat-card-actions { + padding-bottom: 10px; + padding-left: 0; + padding-right: 0; + + > div { + display: flex; + width: 50%; + align-items: center; + } + + .right-actions { + app-button { + float: right; + } + } + + i.fa-solid { + color: $primary-2; + } + + .right-actions { + flex-direction: row-reverse; + } + } + + .loading-header { + padding: 32px 0 0 calc(16px + $title-padding); + + ngx-skeleton-loader { + display: block; + width: 50%; + } + } + } + + ::ng-deep button:focus { + color: $primary-1; + } +} + +// https://stackoverflow.com/a/57759753/6479757 \ No newline at end of file diff --git a/src/app/features/profile/components/post/post.component.spec.ts b/src/app/features/profile/components/post/post.component.spec.ts new file mode 100644 index 00000000..e287e703 --- /dev/null +++ b/src/app/features/profile/components/post/post.component.spec.ts @@ -0,0 +1,21 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { PostComponent } from './post.component'; + +describe('PostComponent', () => { + let component: PostComponent; + let fixture: ComponentFixture; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [PostComponent] + }); + fixture = TestBed.createComponent(PostComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/features/profile/components/post/post.component.ts b/src/app/features/profile/components/post/post.component.ts new file mode 100644 index 00000000..727b65bb --- /dev/null +++ b/src/app/features/profile/components/post/post.component.ts @@ -0,0 +1,20 @@ +import { Component, Input } from '@angular/core'; +import { Person } from 'src/app/core/models/person'; +import { NewsItem } from 'src/app/features/news-feed/models/news-item'; + +@Component({ + selector: 'app-post', + templateUrl: './post.component.html', + styleUrls: ['./post.component.scss'] +}) +export class PostComponent { + + @Input() profile!: Person; + @Input() model!: NewsItem; // TODO: Create models for each post type + @Input() loading: boolean = false; + + constructor() { + + } + +} diff --git a/src/app/shared/components/banner/banner.component.ts b/src/app/shared/components/banner/banner.component.ts index d06c2560..9fffb503 100644 --- a/src/app/shared/components/banner/banner.component.ts +++ b/src/app/shared/components/banner/banner.component.ts @@ -22,7 +22,7 @@ export class BannerComponent { export class Banner { backgroundImage: string; - constructor(backgroundImage: string = '../../../../assets/svg/banner.svg') { + constructor(backgroundImage: string = '../../../../assets/image/banner.svg') { this.backgroundImage = backgroundImage; } } \ No newline at end of file diff --git a/src/app/shared/components/editor/editor.component.html b/src/app/shared/components/editor/editor.component.html index af32ec53..3b99812b 100644 --- a/src/app/shared/components/editor/editor.component.html +++ b/src/app/shared/components/editor/editor.component.html @@ -2,7 +2,6 @@
+ + + - \ No newline at end of file + + + + + + + \ No newline at end of file diff --git a/src/app/shared/components/editor/editor.component.scss b/src/app/shared/components/editor/editor.component.scss index 24ee4ca0..88bcd624 100644 --- a/src/app/shared/components/editor/editor.component.scss +++ b/src/app/shared/components/editor/editor.component.scss @@ -17,6 +17,36 @@ border-top-left-radius: 10px; border-top-right-radius: 10px; border-bottom: 2px solid $neutral-300; + + ngx-toggle-command { + svg { + pointer-events: none; + } + } + + ngx-dropdown { + .NgxEditor__Dropdown--Item { + font-weight: bold; + } + .NgxEditor__Dropdown--Item:nth-child(1) { + font-size: 2em; + } + .NgxEditor__Dropdown--Item:nth-child(2) { + font-size: 1.5em; + } + .NgxEditor__Dropdown--Item:nth-child(3) { + font-size: 1.33em; + } + .NgxEditor__Dropdown--Item:nth-child(4) { + font-size: 1.17em; + } + .NgxEditor__Dropdown--Item:nth-child(5) { + font-size: 0.83em; + } + .NgxEditor__Dropdown--Item:nth-child(6) { + font-size: 0.67em; + } + } } } } diff --git a/src/app/shared/components/editor/editor.component.ts b/src/app/shared/components/editor/editor.component.ts index fe5e846c..99e3e08a 100644 --- a/src/app/shared/components/editor/editor.component.ts +++ b/src/app/shared/components/editor/editor.component.ts @@ -13,10 +13,9 @@ import { Translations } from 'src/app/core/services/translations.service'; }) export class EditorComponent implements OnInit, OnDestroy, AfterViewInit { + @Input() html!: string; @Input() disabled: boolean = false; - - @ViewChild('[title="Bold"]') el!:ElementRef; - + editor: Editor; toolbar: Toolbar = [ ['bold', 'italic'], @@ -25,13 +24,15 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit { ['ordered_list', 'bullet_list'], [ { heading: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'] }], ['link', 'image'], - ['text_color', 'background_color'], + ['align_left', 'align_center', 'align_right', 'align_justify'], ['horizontal_rule', 'format_clear'], - ] - html: string = ''; + ]; private langChangeSub!: Subscription; + private keydownRef = this.handleKeyDown.bind(this); + private ariaRef = this.toggleAria.bind(this); + private dropdownRef = this.handleDropDown.bind(this); constructor(private translateService: TranslateService, private ngxEditorService: NgxEditorService, public translations: Translations, private elementRef: ElementRef ) { this.editor = new Editor({ @@ -43,16 +44,18 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit { this.langChangeSub = this.translateService.onLangChange.subscribe(() => { this.onLangChange(); }); - } ngOnInit(): void { if (!this.editor) this.editor = new Editor(); + + if (!this.html) + this.html = ''; } ngAfterViewInit() { - this.applyAccessibility(); + this.onLangChange(); } ngOnDestroy(): void { @@ -65,25 +68,158 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit { onLangChange(): void { this.ngxEditorService.config.locals = ngxEditorLocals(this.translateService, this.translations); - this.applyAccessibility(); + + setTimeout(() => { + this.addAccessibility( + '[title="' + this.translateService.instant(this.translations.editor.bold) + '"]', + this.translateService.instant(this.translations.editor.bold) + ); + this.addAccessibility( + '[title="' + this.translateService.instant(this.translations.editor.italic) + '"]', + this.translateService.instant(this.translations.editor.italic) + ); + this.addAccessibility( + '[title="' + this.translateService.instant(this.translations.editor.underline) + '"]', + this.translateService.instant(this.translations.editor.underline) + ); + this.addAccessibility( + '[title="' + this.translateService.instant(this.translations.editor.strike) + '"]', + this.translateService.instant(this.translations.editor.strike) + ); + this.addAccessibility( + '[title="' + this.translateService.instant(this.translations.editor.code) + '"]', + this.translateService.instant(this.translations.editor.code) + ); + this.addAccessibility( + '[title="' + this.translateService.instant(this.translations.editor.blockquote) + '"]', + this.translateService.instant(this.translations.editor.blockquote) + ); + this.addAccessibility( + '[title="' + this.translateService.instant(this.translations.editor.orderedlist) + '"]', + this.translateService.instant(this.translations.editor.orderedlist) + ); + this.addAccessibility( + '[title="' + this.translateService.instant(this.translations.editor.bulletlist) + '"]', + this.translateService.instant(this.translations.editor.bulletlist) + ); + this.addAccessibility( + '[title="' + this.translateService.instant(this.translations.editor.linkinsert) + '"]', + this.translateService.instant(this.translations.editor.linkinsert) + ); + this.addAccessibility( + '[title="' + this.translateService.instant(this.translations.editor.imginsert) + '"]', + this.translateService.instant(this.translations.editor.imginsert) + ); + this.addAccessibility( + '[title="' + this.translateService.instant(this.translations.editor.alignleft) + '"]', + this.translateService.instant(this.translations.editor.alignleft) + ); + this.addAccessibility( + '[title="' + this.translateService.instant(this.translations.editor.aligncenter) + '"]', + this.translateService.instant(this.translations.editor.aligncenter) + ); + this.addAccessibility( + '[title="' + this.translateService.instant(this.translations.editor.alignright) + '"]', + this.translateService.instant(this.translations.editor.alignright) + ); + this.addAccessibility( + '[title="' + this.translateService.instant(this.translations.editor.alignjustify) + '"]', + this.translateService.instant(this.translations.editor.alignjustify) + ); + this.addAccessibility( + '[title="' + this.translateService.instant(this.translations.editor.horizontalrule) + '"]', + this.translateService.instant(this.translations.editor.horizontalrule) + ); + this.addAccessibility( + '[title="' + this.translateService.instant(this.translations.editor.formatclear) + '"]', + this.translateService.instant(this.translations.editor.formatclear) + ); + this.addAccessibility( + '.NgxEditor__Dropdown .NgxEditor__Dropdown--Text', + this.translateService.instant(this.translations.editor.title) + ); + }, 500); } placeholderText(): string { return this.translateService.instant(this.translations.editor.placeholder) } - applyAccessibility(): void { - let bold = this.elementRef.nativeElement.querySelectorAll('[title="' + this.translateService.instant(this.translations.editor.bold) + '"]')[0]; - bold.setAttribute('tabIndex', '0'); - bold.setAttribute('ariaLabel', this.translateService.instant(this.translations.editor.bold)); - bold.addEventListener('click', (event: KeyboardEvent) => { - console.log('clicked'); - }); - bold.addEventListener('keydown', (event: KeyboardEvent) => { - if (event.key == "Enter") { - bold.dispatchEvent(new Event('click',)); - //bold.click(); + addAccessibility(selector: string, ariaLabel: string): void { + let el: HTMLElement = this.elementRef.nativeElement.querySelectorAll(selector)[0]; + + if (el) { + el.removeEventListener('keydown', this.keydownRef); + el.removeEventListener('click', this.ariaRef); + + if (el.className == 'NgxEditor__Dropdown--Text') { + el.removeEventListener('keydown', this.dropdownRef); + el.removeEventListener('click', this.dropdownRef); } - }); + + el.setAttribute('tabIndex', '0'); + el.setAttribute('ariaLabel', el.classList.contains('NgxEditor__MenuItem--Active') ? ariaLabel + this.translateService.instant(this.translations.editor.enabled) : ariaLabel); + + el.addEventListener('keydown', this.keydownRef); + el.addEventListener('click', this.ariaRef); + + if (el.className == 'NgxEditor__Dropdown--Text') { + el.addEventListener('keydown', this.dropdownRef); + el.addEventListener('click', this.dropdownRef); + } + } else + console.warn(selector + " not found."); + } + + handleDropDown(event: Event): void { + if (event instanceof KeyboardEvent && event.key != 'Enter') + return; + + setTimeout(() => { + if (event.target instanceof HTMLElement && + event.target.className.includes('NgxEditor__Dropdown--Selected') && + event.target.nextSibling) { + + event.target.nextSibling.childNodes.forEach((el) => { + if (el instanceof HTMLElement) + el.setAttribute('tabIndex', '0'); + el.addEventListener('keydown', (event) => { + + if (event instanceof KeyboardEvent && event.key == 'Enter') { + event.target?.dispatchEvent(new MouseEvent('mousedown')); + event.target?.dispatchEvent(new MouseEvent('mouseup')); + } + }); + }); + } + }, 0); + } + + handleKeyDown(event: KeyboardEvent) { + if (event.key == 'Enter') { + event.target?.dispatchEvent(new MouseEvent('mousedown')); + event.target?.dispatchEvent(new MouseEvent('mouseup')); + this.toggleAria(event); + } + } + + toggleAria(event: Event) { + setTimeout(() => { + if (event.target instanceof HTMLElement) { + if (event.target.classList.contains('NgxEditor__MenuItem--Active') || event.target.classList.contains('NgxEditor__Dropdown--Active')) { + event.target.setAttribute('ariaLabel', this.cleanAriaLable(event.target) + this.translateService.instant(this.translations.editor.enabled)); + } else { + event.target.setAttribute('ariaLabel', this.cleanAriaLable(event.target)); + } + } + }, 250); + } + + cleanAriaLable(el: HTMLElement): string { + let ariaLabel = el.getAttribute('ariaLabel'); + if (ariaLabel) { + return ariaLabel.replaceAll(this.translateService.instant(this.translations.editor.enabled), ''); + } + return ''; } } diff --git a/src/app/shared/components/editor/menu/editor-menu/editor-menu.component.html b/src/app/shared/components/editor/menu/editor-menu/editor-menu.component.html new file mode 100644 index 00000000..f523a01a --- /dev/null +++ b/src/app/shared/components/editor/menu/editor-menu/editor-menu.component.html @@ -0,0 +1,7 @@ +
+
+ CodeMirror +
\ No newline at end of file diff --git a/src/app/shared/components/editor/menu/editor-menu/editor-menu.component.scss b/src/app/shared/components/editor/menu/editor-menu/editor-menu.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/src/app/shared/components/editor/menu/editor-menu/editor-menu.component.spec.ts b/src/app/shared/components/editor/menu/editor-menu/editor-menu.component.spec.ts new file mode 100644 index 00000000..0ec0b775 --- /dev/null +++ b/src/app/shared/components/editor/menu/editor-menu/editor-menu.component.spec.ts @@ -0,0 +1,21 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { EditorMenuComponent } from './editor-menu.component'; + +describe('EditorMenuComponent', () => { + let component: EditorMenuComponent; + let fixture: ComponentFixture; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [EditorMenuComponent] + }); + fixture = TestBed.createComponent(EditorMenuComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/components/editor/menu/editor-menu/editor-menu.component.ts b/src/app/shared/components/editor/menu/editor-menu/editor-menu.component.ts new file mode 100644 index 00000000..59d441c4 --- /dev/null +++ b/src/app/shared/components/editor/menu/editor-menu/editor-menu.component.ts @@ -0,0 +1,59 @@ +import { Component, Input, OnInit } from '@angular/core'; +import { setBlockType } from 'prosemirror-commands'; +import { EditorState, Plugin, PluginKey, Transaction } from 'prosemirror-state'; +import { EditorView } from 'prosemirror-view'; + +import { Editor } from 'ngx-editor'; +import { isNodeActive } from 'ngx-editor/helpers'; + +@Component({ + selector: 'app-editor-menu', + templateUrl: './editor-menu.component.html', + styleUrls: ['./editor-menu.component.scss'] +}) +export class EditorMenuComponent { + constructor() {} + + @Input() editor!: Editor; + @Input() disabled: boolean = false; + isActive = false; + isDisabled = false; + + onClick(e: MouseEvent): void { + e.preventDefault(); + const { state, dispatch } = this.editor.view; + this.execute(state, dispatch); + console.log(state); + console.log(dispatch); + } + + execute(state: EditorState, dispatch?: (tr: Transaction) => void): boolean { + const { schema } = state; + if (this.isActive) { + return setBlockType(schema.nodes['paragraph'])(state, dispatch); + } + + return setBlockType(schema.nodes['bold'])(state, dispatch); + } + + update = (view: EditorView) => { + const { state } = view; + const { schema } = state; + this.isActive = isNodeActive(state, schema.nodes['bold']); + this.disabled = !this.execute(state, undefined); // returns true if executable + }; + + ngOnInit(): void { + const plugin = new Plugin({ + key: new PluginKey(`custom-menu-codemirror`), + view: () => { + return { + update: this.update, + }; + }, + }); + + this.editor.registerPlugin(plugin); + } + +} diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index abd3e8d7..0c266d49 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -68,7 +68,9 @@ import { EditorMenuComponent } from './components/editor/menu/editor-menu/editor isolate: false, extend: true }), - NgxEditorModule.forChild(), + NgxEditorModule.forChild({ + + }), MatButtonModule, MatIconModule, MatTooltipModule, @@ -77,7 +79,7 @@ import { EditorMenuComponent } from './components/editor/menu/editor-menu/editor MatInputModule, MatCheckboxModule, NgxSkeletonLoaderModule, - InfiniteScrollModule + InfiniteScrollModule, ], exports: [ TranslateModule, diff --git a/src/assets/i18n/translations.en.ts b/src/assets/i18n/translations.en.ts index ff16bbce..387316dc 100644 --- a/src/assets/i18n/translations.en.ts +++ b/src/assets/i18n/translations.en.ts @@ -173,7 +173,8 @@ export default { "title": "Title", "remove": "Remove", "horizontalrule": "Horizontal Rule", - "formatclear": "Clear Formatting" + "formatclear": "Clear Formatting", + "enabled": " enabled" }, "input": { "hint": { diff --git a/src/assets/i18n/translations.fr.ts b/src/assets/i18n/translations.fr.ts index db9fc729..6dd6c6cb 100644 --- a/src/assets/i18n/translations.fr.ts +++ b/src/assets/i18n/translations.fr.ts @@ -145,8 +145,8 @@ const fr: typeof import('./translations.en').default = { "bold": "Gras", "italic": "Italique", "code": "Code", - "underline": "Underline", - "strike": "Souligner", + "underline": "Souligner", + "strike": "Grève", "blockquote": "Citation en bloc", "bulletlist": "Liste à puces", "orderedlist": "Liste ordonnée", @@ -174,7 +174,8 @@ const fr: typeof import('./translations.en').default = { "title": "Titre", "remove": "Retirer", "horizontalrule": "La règle horizontale", - "formatclear": "Supprimer le formattage" + "formatclear": "Supprimer le formattage", + "enabled": " activé" }, "input": { "hint": { diff --git a/src/assets/svg/banner.svg b/src/assets/image/banner.svg similarity index 100% rename from src/assets/svg/banner.svg rename to src/assets/image/banner.svg diff --git a/src/assets/image/group-banner.png b/src/assets/image/group-banner.png new file mode 100644 index 0000000000000000000000000000000000000000..1d0a36b3bb4407463b30ca3884848c9e8a3ad135 GIT binary patch literal 247907 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 BHhlm9 literal 0 HcmV?d00001 diff --git a/tsconfig.json b/tsconfig.json index 0eb21cfc..8ede62ed 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -20,6 +20,7 @@ "module": "es2020", "lib": [ "es2020", + "ES2021.String", "dom" ], "resolveJsonModule": true, From 4b5e5b8172cd3e9d59a871062c8075b606321df1 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Tue, 19 Sep 2023 13:11:37 -0400 Subject: [PATCH 035/165] refactor news card --- src/app/core/models/blog.model.ts | 13 ++++ .../models/{location.ts => location.model.ts} | 0 .../models/{person.ts => person.model.ts} | 2 +- src/app/core/models/poll.model.ts | 13 ++++ src/app/core/models/post.model.ts | 13 ++++ src/app/core/services/event.service.ts | 2 +- src/app/core/services/news.service.ts | 60 ++++++++++++++----- src/app/core/services/people.service.ts | 4 +- src/app/features/events/models/event.ts | 4 +- src/app/features/home/home.component.ts | 10 ++-- .../news-card/news-card.component.html | 16 ++++- .../news-card/news-card.component.ts | 20 ++++++- .../news-list/news-list.component.ts | 4 +- .../features/news-feed/models/INewsItem.ts | 10 ++++ .../features/news-feed/models/news-item.ts | 10 ---- .../features/news-feed/news-feed.module.ts | 2 +- .../profile/components/post/post.component.ts | 7 ++- .../profile-card/profile-card.component.ts | 2 +- .../profile-list/profile-list.component.ts | 2 +- .../components/header/header.component.ts | 2 +- .../profile-pic/profile-pic.component.ts | 2 +- 21 files changed, 149 insertions(+), 49 deletions(-) create mode 100644 src/app/core/models/blog.model.ts rename src/app/core/models/{location.ts => location.model.ts} (100%) rename src/app/core/models/{person.ts => person.model.ts} (91%) create mode 100644 src/app/core/models/poll.model.ts create mode 100644 src/app/core/models/post.model.ts create mode 100644 src/app/features/news-feed/models/INewsItem.ts delete mode 100644 src/app/features/news-feed/models/news-item.ts diff --git a/src/app/core/models/blog.model.ts b/src/app/core/models/blog.model.ts new file mode 100644 index 00000000..5fdfa939 --- /dev/null +++ b/src/app/core/models/blog.model.ts @@ -0,0 +1,13 @@ +import { INewsItem } from "src/app/features/news-feed/models/INewsItem"; +import { Person } from "./person.model"; + +export class Blog implements INewsItem { + constructor( + public id: string, + public author: Person, + public authoredDate: Date, + public content: string, + public comments: number, + public likes: number + ) {} +} \ No newline at end of file diff --git a/src/app/core/models/location.ts b/src/app/core/models/location.model.ts similarity index 100% rename from src/app/core/models/location.ts rename to src/app/core/models/location.model.ts diff --git a/src/app/core/models/person.ts b/src/app/core/models/person.model.ts similarity index 91% rename from src/app/core/models/person.ts rename to src/app/core/models/person.model.ts index 082ea8cd..e70626c5 100644 --- a/src/app/core/models/person.ts +++ b/src/app/core/models/person.model.ts @@ -1,4 +1,4 @@ -import { Location } from "./location"; +import { Location } from "./location.model"; export class Person { id: string | undefined; diff --git a/src/app/core/models/poll.model.ts b/src/app/core/models/poll.model.ts new file mode 100644 index 00000000..6f0cf8fd --- /dev/null +++ b/src/app/core/models/poll.model.ts @@ -0,0 +1,13 @@ +import { INewsItem } from "src/app/features/news-feed/models/INewsItem"; +import { Person } from "./person.model"; + +export class Poll implements INewsItem { + constructor( + public id: string, + public author: Person, + public authoredDate: Date, + public content: string, + public comments: number, + public likes: number + ) {} +} \ No newline at end of file diff --git a/src/app/core/models/post.model.ts b/src/app/core/models/post.model.ts new file mode 100644 index 00000000..cc67c2e8 --- /dev/null +++ b/src/app/core/models/post.model.ts @@ -0,0 +1,13 @@ +import { INewsItem } from "src/app/features/news-feed/models/INewsItem"; +import { Person } from "./person.model"; + +export class Post implements INewsItem { + constructor( + public id: string, + public author: Person, + public authoredDate: Date, + public content: string, + public comments: number, + public likes: number + ) {} +} \ No newline at end of file diff --git a/src/app/core/services/event.service.ts b/src/app/core/services/event.service.ts index d30d23f5..84904849 100644 --- a/src/app/core/services/event.service.ts +++ b/src/app/core/services/event.service.ts @@ -1,7 +1,7 @@ import { Injectable, inject } from '@angular/core'; import { Observable } from 'rxjs'; import { Event } from 'src/app/features/events/models/event'; -import { Location } from '../models/location'; +import { Location } from '../models/location.model'; import { PeopleService } from './people.service'; import { LoremIpsum } from 'lorem-ipsum'; diff --git a/src/app/core/services/news.service.ts b/src/app/core/services/news.service.ts index 5840a634..619c355b 100644 --- a/src/app/core/services/news.service.ts +++ b/src/app/core/services/news.service.ts @@ -1,7 +1,10 @@ //import { HttpClient } from '@angular/common/http'; import { Injectable, inject } from '@angular/core'; import { Observable } from 'rxjs'; -import { NewsItem } from 'src/app/features/news-feed/models/news-item'; +import { INewsItem } from 'src/app/features/news-feed/models/INewsItem'; +import { Post } from '../models/post.model'; +import { Blog } from '../models/blog.model'; +import { Poll } from '../models/poll.model'; import { PeopleService } from './people.service'; import { LoremIpsum } from 'lorem-ipsum'; @@ -26,7 +29,7 @@ export class NewsService { private peopleService: PeopleService = inject(PeopleService); - public newsItems: NewsItem[] = [ + public newsItems: INewsItem[] = [ this.generateRandomNewsItem(), this.generateRandomNewsItem(), this.generateRandomNewsItem(), @@ -42,8 +45,8 @@ export class NewsService { constructor() { } - mockGetNewsItem(id: string | null, delay: number = this.delay): Observable { - let response: NewsItem; + mockGetNewsItem(id: string | null, delay: number = this.delay): Observable { + let response: INewsItem; for(let i = 0; i < this.newsItems.length; i++) { if (this.newsItems[i].id == id) { @@ -52,7 +55,7 @@ export class NewsService { } } - let observable: Observable = new Observable((subscriber) => { + let observable: Observable = new Observable((subscriber) => { setTimeout(() => { subscriber.next(response); subscriber.complete(); @@ -62,8 +65,8 @@ export class NewsService { return observable; } - mockGetNewsItems(count: number = 10, delay: number = 5000): Observable { - let observable: Observable = new Observable((subscriber) => { + mockGetNewsItems(count: number = 10, delay: number = 5000): Observable { + let observable: Observable = new Observable((subscriber) => { setTimeout(() => { subscriber.next(this.newsItems.slice(0, count > this.newsItems.length ? this.newsItems.length : count)); subscriber.complete(); @@ -73,15 +76,42 @@ export class NewsService { return observable; } - private generateRandomNewsItem(): NewsItem { - const newsItem = new NewsItem(); + private generateRandomNewsItem(): INewsItem { - newsItem.id = this.id.toString(); - newsItem.date = new Date(); - newsItem.content = this.randomContent(); - newsItem.comments = Math.floor(Math.random() * 199) + 1; - newsItem.likes = Math.floor(Math.random() * 99) + 1; - newsItem.author = this.peopleService.people[this.id]; + let newsItem: INewsItem = {}; + + switch(Math.floor(Math.random() * 3)) { + case 0: + newsItem = new Post( + this.id.toString(), + this.peopleService.people[this.id], + new Date(), + this.randomContent(), + Math.floor(Math.random() * 199) + 1, + Math.floor(Math.random() * 99) + 1 + ); + break; + case 1: + newsItem = new Blog( + this.id.toString(), + this.peopleService.people[this.id], + new Date(), + this.randomContent(), + Math.floor(Math.random() * 199) + 1, + Math.floor(Math.random() * 99) + 1 + ); + break; + case 2: + newsItem = new Poll( + this.id.toString(), + this.peopleService.people[this.id], + new Date(), + this.randomContent(), + Math.floor(Math.random() * 199) + 1, + Math.floor(Math.random() * 99) + 1 + ); + break; + } this.id++; diff --git a/src/app/core/services/people.service.ts b/src/app/core/services/people.service.ts index 1fdc3ce4..f6df44b8 100644 --- a/src/app/core/services/people.service.ts +++ b/src/app/core/services/people.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; -import { Person } from '../models/person'; +import { Person } from '../models/person.model'; import { Observable } from 'rxjs'; -import { Location } from '../models/location'; +import { Location } from '../models/location.model'; @Injectable({ providedIn: 'root' diff --git a/src/app/features/events/models/event.ts b/src/app/features/events/models/event.ts index 2cfe832e..55d7bcb5 100644 --- a/src/app/features/events/models/event.ts +++ b/src/app/features/events/models/event.ts @@ -1,5 +1,5 @@ -import { Person } from "src/app/core/models/person"; -import { Location } from "src/app/core/models/location"; +import { Person } from "src/app/core/models/person.model"; +import { Location } from "src/app/core/models/location.model"; import { Group } from "../../groups/models/group"; export class Event { diff --git a/src/app/features/home/home.component.ts b/src/app/features/home/home.component.ts index fad313d2..aa01e1c9 100644 --- a/src/app/features/home/home.component.ts +++ b/src/app/features/home/home.component.ts @@ -2,12 +2,12 @@ import { Component, OnInit } from '@angular/core'; import { Translations } from 'src/app/core/services/translations.service'; import { InputType } from 'src/app/shared/models/input-type'; -import { NewsItem } from '../news-feed/models/news-item'; +import { INewsItem } from '../news-feed/models/INewsItem'; import { NewsService } from 'src/app/core/services/news.service'; import { Event } from '../events/models/event'; import { EventService } from 'src/app/core/services/event.service'; import { CoreRoutes } from 'src/app/core/constants/routes.constants'; -import { Person } from 'src/app/core/models/person'; +import { Person } from 'src/app/core/models/person.model'; import { PeopleService } from 'src/app/core/services/people.service'; import { Group } from '../groups/models/group'; import { GroupService } from 'src/app/core/services/group.service'; @@ -22,7 +22,7 @@ export class HomeComponent implements OnInit { routes = CoreRoutes; // News - newsItems: NewsItem[] = []; + newsItems: INewsItem[] = []; newsPage: number = 1; loadingNews: boolean = true; @@ -50,7 +50,7 @@ export class HomeComponent implements OnInit { } ngOnInit(): void { - this.newsService.mockGetNewsItems(10, 5000).subscribe((newsItems: NewsItem[]) => { + this.newsService.mockGetNewsItems(10, 5000).subscribe((newsItems: INewsItem[]) => { this.newsItems = newsItems; this.loadingNews = false; }); @@ -74,7 +74,7 @@ export class HomeComponent implements OnInit { onNewsScroll(): void { this.loadingNews = true; - this.newsService.mockGetNewsItems(10, 30000).subscribe((newsItems: NewsItem[]) => { + this.newsService.mockGetNewsItems(10, 30000).subscribe((newsItems: INewsItem[]) => { this.newsItems.push(...newsItems); this.loadingNews = false; }); diff --git a/src/app/features/news-feed/components/news-card/news-card.component.html b/src/app/features/news-feed/components/news-card/news-card.component.html index 3006e786..28d6a7c9 100644 --- a/src/app/features/news-feed/components/news-card/news-card.component.html +++ b/src/app/features/news-feed/components/news-card/news-card.component.html @@ -25,7 +25,21 @@ -

+ + + +

+
+ + +

+
+ + +

+
+
+ Date: Fri, 22 Sep 2023 11:57:32 -0400 Subject: [PATCH 036/165] make a post wip --- src/app/features/home/home.component.ts | 2 +- .../components/post/post.component.html | 40 ++++++- .../components/post/post.component.scss | 105 ++++++++++++++++++ .../profile/components/post/post.component.ts | 10 ++ src/app/features/profile/profile.module.ts | 4 +- .../blog-form/blog-form.component.html | 1 + .../blog-form/blog-form.component.scss | 0 .../blog-form/blog-form.component.spec.ts | 21 ++++ .../blog-form/blog-form.component.ts | 10 ++ .../components/button/button.component.scss | 11 ++ .../components/editor/editor.component.html | 14 +++ .../components/editor/editor.component.scss | 24 ++++ .../components/editor/editor.component.ts | 16 +-- .../event-form/event-form.component.html | 1 + .../event-form/event-form.component.scss | 0 .../event-form/event-form.component.spec.ts | 21 ++++ .../event-form/event-form.component.ts | 10 ++ .../poll-form/poll-form.component.html | 1 + .../poll-form/poll-form.component.scss | 0 .../poll-form/poll-form.component.spec.ts | 21 ++++ .../poll-form/poll-form.component.ts | 10 ++ .../post-form/post-form.component.html | 8 ++ .../post-form/post-form.component.scss | 12 ++ .../post-form/post-form.component.spec.ts | 21 ++++ .../post-form/post-form.component.ts | 10 ++ src/app/shared/shared.module.ts | 14 ++- 26 files changed, 373 insertions(+), 14 deletions(-) create mode 100644 src/app/shared/components/blog-form/blog-form.component.html create mode 100644 src/app/shared/components/blog-form/blog-form.component.scss create mode 100644 src/app/shared/components/blog-form/blog-form.component.spec.ts create mode 100644 src/app/shared/components/blog-form/blog-form.component.ts create mode 100644 src/app/shared/components/event-form/event-form.component.html create mode 100644 src/app/shared/components/event-form/event-form.component.scss create mode 100644 src/app/shared/components/event-form/event-form.component.spec.ts create mode 100644 src/app/shared/components/event-form/event-form.component.ts create mode 100644 src/app/shared/components/poll-form/poll-form.component.html create mode 100644 src/app/shared/components/poll-form/poll-form.component.scss create mode 100644 src/app/shared/components/poll-form/poll-form.component.spec.ts create mode 100644 src/app/shared/components/poll-form/poll-form.component.ts create mode 100644 src/app/shared/components/post-form/post-form.component.html create mode 100644 src/app/shared/components/post-form/post-form.component.scss create mode 100644 src/app/shared/components/post-form/post-form.component.spec.ts create mode 100644 src/app/shared/components/post-form/post-form.component.ts diff --git a/src/app/features/home/home.component.ts b/src/app/features/home/home.component.ts index aa01e1c9..d2b48338 100644 --- a/src/app/features/home/home.component.ts +++ b/src/app/features/home/home.component.ts @@ -74,7 +74,7 @@ export class HomeComponent implements OnInit { onNewsScroll(): void { this.loadingNews = true; - this.newsService.mockGetNewsItems(10, 30000).subscribe((newsItems: INewsItem[]) => { + this.newsService.mockGetNewsItems(10, 3000).subscribe((newsItems: INewsItem[]) => { this.newsItems.push(...newsItems); this.loadingNews = false; }); diff --git a/src/app/features/profile/components/post/post.component.html b/src/app/features/profile/components/post/post.component.html index af203b55..d25571bd 100644 --- a/src/app/features/profile/components/post/post.component.html +++ b/src/app/features/profile/components/post/post.component.html @@ -25,9 +25,37 @@ -

- +
+ + Type here +
+ + + + + + + + + + + + + + + + + + +
- +
- + + Post +
\ No newline at end of file diff --git a/src/app/features/profile/components/post/post.component.scss b/src/app/features/profile/components/post/post.component.scss index 13fa229b..be3d1e54 100644 --- a/src/app/features/profile/components/post/post.component.scss +++ b/src/app/features/profile/components/post/post.component.scss @@ -4,6 +4,111 @@ $title-padding: 90px; :host { + mat-card { + mat-card-content { + .gcc-post-placeholder { + display: flex; + padding: 12px 17px; + border: 2px solid $neutral-300; + border-radius: 10px; + align-items: center; + margin-bottom: 16px; + cursor: pointer; + + i { + padding-right: 16px; + } + + i,span { + color: $neutral-900; + } + } + + ::ng-deep { + mat-tab-header { + margin-right: 65px; + + .mat-mdc-tab-labels { + gap: 20px; + + .mdc-tab__text-label { + font-size: large; + font-weight: 600; + } + } + + .mdc-tab { + height: 40px; + border: 3px solid $primary-1; + border-radius: 10px; + + .mdc-tab__text-label { + color: #000; + transition: none; + } + } + + .mdc-tab--active { + background-color: $primary-1; + + .mdc-tab__text-label { + color: $primary-1-contrast; + } + } + + .mdc-tab--active:hover, .mdc-tab--active:focus { + background-color: $primary-2; + border-color: $primary-2; + } + + .mdc-tab-indicator { + display: none; + } + } + + .mat-mdc-tab-body-wrapper { + padding-top: 30px; + } + } + + .gcc-cancel-editing { + position: absolute; + top: 94px; + right: 26px; + + ::ng-deep { + color: $primary-1; + } + } + } + + mat-card-actions { + padding: 0px 16px 24px 16px !important; + + .right-actions { + ::ng-deep { + button { + background: $secondary-2-gradient; + color: $secondary-2-contrast; + } + + app-button.disabled { + button { + background: #9e9e9e; + color: $secondary-2-contrast; + } + } + } + } + } + } + + + + + + + mat-card { border: 1px solid $neutral-300; box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25); diff --git a/src/app/features/profile/components/post/post.component.ts b/src/app/features/profile/components/post/post.component.ts index 1c35ae09..08a95378 100644 --- a/src/app/features/profile/components/post/post.component.ts +++ b/src/app/features/profile/components/post/post.component.ts @@ -12,10 +12,20 @@ export class PostComponent { @Input() profile!: Person; @Input() model!: INewsItem; // TODO: Create models for each post type @Input() loading: boolean = false; + @Input() editing: boolean = false; constructor() { } + toggleEditing(event: Event) { + if ((event instanceof KeyboardEvent && (event.key == 'Enter' || event.key == 'Space')) || event instanceof KeyboardEvent == false) + this.editing = !this.editing; + } + + formReady(): boolean { + return true; + } + } diff --git a/src/app/features/profile/profile.module.ts b/src/app/features/profile/profile.module.ts index f201b95f..b0d848e9 100644 --- a/src/app/features/profile/profile.module.ts +++ b/src/app/features/profile/profile.module.ts @@ -5,6 +5,7 @@ import { ProfileRoutingModule } from './profile-routing.module'; import { SharedModule } from 'src/app/shared/shared.module'; import { ProfileCardComponent } from './components/profile-card/profile-card.component'; import { MatCardModule } from '@angular/material/card'; +import { MatTabsModule } from '@angular/material/tabs'; import { ProfileListComponent } from './components/profile-list/profile-list.component'; import { PostComponent } from './components/post/post.component'; @@ -19,7 +20,8 @@ import { PostComponent } from './components/post/post.component'; CommonModule, ProfileRoutingModule, SharedModule, - MatCardModule + MatCardModule, + MatTabsModule, ], exports: [ ProfileCardComponent, diff --git a/src/app/shared/components/blog-form/blog-form.component.html b/src/app/shared/components/blog-form/blog-form.component.html new file mode 100644 index 00000000..57f5c8fc --- /dev/null +++ b/src/app/shared/components/blog-form/blog-form.component.html @@ -0,0 +1 @@ +

blog-form works!

diff --git a/src/app/shared/components/blog-form/blog-form.component.scss b/src/app/shared/components/blog-form/blog-form.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/src/app/shared/components/blog-form/blog-form.component.spec.ts b/src/app/shared/components/blog-form/blog-form.component.spec.ts new file mode 100644 index 00000000..9de2cbbc --- /dev/null +++ b/src/app/shared/components/blog-form/blog-form.component.spec.ts @@ -0,0 +1,21 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BlogFormComponent } from './blog-form.component'; + +describe('BlogFormComponent', () => { + let component: BlogFormComponent; + let fixture: ComponentFixture; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [BlogFormComponent] + }); + fixture = TestBed.createComponent(BlogFormComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/components/blog-form/blog-form.component.ts b/src/app/shared/components/blog-form/blog-form.component.ts new file mode 100644 index 00000000..e4888540 --- /dev/null +++ b/src/app/shared/components/blog-form/blog-form.component.ts @@ -0,0 +1,10 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-blog-form', + templateUrl: './blog-form.component.html', + styleUrls: ['./blog-form.component.scss'] +}) +export class BlogFormComponent { + +} diff --git a/src/app/shared/components/button/button.component.scss b/src/app/shared/components/button/button.component.scss index 4b2d5060..bded031a 100644 --- a/src/app/shared/components/button/button.component.scss +++ b/src/app/shared/components/button/button.component.scss @@ -1,3 +1,5 @@ +@import "../../../../assets/scss/partials/colors"; + :host { position: sticky; @@ -27,5 +29,14 @@ .mat-mdc-button .mdc-button__label, .mat-mdc-unelevated-button .mdc-button__label, .mat-mdc-raised-button .mdc-button__label, .mat-mdc-outlined-button .mdc-button__label { padding: 0 16px 0 16px; } + + .mat-stroked-button { + border: 3px solid $primary-1 !important; + border-radius: 10px; + + i { + color: $primary-1; + } + } } } \ No newline at end of file diff --git a/src/app/shared/components/editor/editor.component.html b/src/app/shared/components/editor/editor.component.html index 3b99812b..e075c4b9 100644 --- a/src/app/shared/components/editor/editor.component.html +++ b/src/app/shared/components/editor/editor.component.html @@ -1,3 +1,17 @@ +
+ +
+ + + {{ label }} +
*
+ + +
+ +
{ @@ -184,11 +189,8 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit { if (el instanceof HTMLElement) el.setAttribute('tabIndex', '0'); el.addEventListener('keydown', (event) => { - - if (event instanceof KeyboardEvent && event.key == 'Enter') { - event.target?.dispatchEvent(new MouseEvent('mousedown')); - event.target?.dispatchEvent(new MouseEvent('mouseup')); - } + if (event instanceof KeyboardEvent) + this.handleKeyDown(event); }); }); } @@ -196,7 +198,7 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit { } handleKeyDown(event: KeyboardEvent) { - if (event.key == 'Enter') { + if (event.key == 'Enter' || event.key == 'Space') { event.target?.dispatchEvent(new MouseEvent('mousedown')); event.target?.dispatchEvent(new MouseEvent('mouseup')); this.toggleAria(event); diff --git a/src/app/shared/components/event-form/event-form.component.html b/src/app/shared/components/event-form/event-form.component.html new file mode 100644 index 00000000..9b4e3a54 --- /dev/null +++ b/src/app/shared/components/event-form/event-form.component.html @@ -0,0 +1 @@ +

event-form works!

diff --git a/src/app/shared/components/event-form/event-form.component.scss b/src/app/shared/components/event-form/event-form.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/src/app/shared/components/event-form/event-form.component.spec.ts b/src/app/shared/components/event-form/event-form.component.spec.ts new file mode 100644 index 00000000..60417b82 --- /dev/null +++ b/src/app/shared/components/event-form/event-form.component.spec.ts @@ -0,0 +1,21 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { EventFormComponent } from './event-form.component'; + +describe('EventFormComponent', () => { + let component: EventFormComponent; + let fixture: ComponentFixture; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [EventFormComponent] + }); + fixture = TestBed.createComponent(EventFormComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/components/event-form/event-form.component.ts b/src/app/shared/components/event-form/event-form.component.ts new file mode 100644 index 00000000..bff651c7 --- /dev/null +++ b/src/app/shared/components/event-form/event-form.component.ts @@ -0,0 +1,10 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-event-form', + templateUrl: './event-form.component.html', + styleUrls: ['./event-form.component.scss'] +}) +export class EventFormComponent { + +} diff --git a/src/app/shared/components/poll-form/poll-form.component.html b/src/app/shared/components/poll-form/poll-form.component.html new file mode 100644 index 00000000..c58e802d --- /dev/null +++ b/src/app/shared/components/poll-form/poll-form.component.html @@ -0,0 +1 @@ +

poll-form works!

diff --git a/src/app/shared/components/poll-form/poll-form.component.scss b/src/app/shared/components/poll-form/poll-form.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/src/app/shared/components/poll-form/poll-form.component.spec.ts b/src/app/shared/components/poll-form/poll-form.component.spec.ts new file mode 100644 index 00000000..6cd64de7 --- /dev/null +++ b/src/app/shared/components/poll-form/poll-form.component.spec.ts @@ -0,0 +1,21 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { PollFormComponent } from './poll-form.component'; + +describe('PollFormComponent', () => { + let component: PollFormComponent; + let fixture: ComponentFixture; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [PollFormComponent] + }); + fixture = TestBed.createComponent(PollFormComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/components/poll-form/poll-form.component.ts b/src/app/shared/components/poll-form/poll-form.component.ts new file mode 100644 index 00000000..8145ff76 --- /dev/null +++ b/src/app/shared/components/poll-form/poll-form.component.ts @@ -0,0 +1,10 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-poll-form', + templateUrl: './poll-form.component.html', + styleUrls: ['./poll-form.component.scss'] +}) +export class PollFormComponent { + +} diff --git a/src/app/shared/components/post-form/post-form.component.html b/src/app/shared/components/post-form/post-form.component.html new file mode 100644 index 00000000..721f76f8 --- /dev/null +++ b/src/app/shared/components/post-form/post-form.component.html @@ -0,0 +1,8 @@ + + + + + Add a photo + \ No newline at end of file diff --git a/src/app/shared/components/post-form/post-form.component.scss b/src/app/shared/components/post-form/post-form.component.scss new file mode 100644 index 00000000..c3318489 --- /dev/null +++ b/src/app/shared/components/post-form/post-form.component.scss @@ -0,0 +1,12 @@ +:host { + app-button { + ::ng-deep { + button { + margin: 30px 0; + } + .gcc-button-inner { + letter-spacing: 1px; + } + } + } +} \ No newline at end of file diff --git a/src/app/shared/components/post-form/post-form.component.spec.ts b/src/app/shared/components/post-form/post-form.component.spec.ts new file mode 100644 index 00000000..17caa061 --- /dev/null +++ b/src/app/shared/components/post-form/post-form.component.spec.ts @@ -0,0 +1,21 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { PostFormComponent } from './post-form.component'; + +describe('PostFormComponent', () => { + let component: PostFormComponent; + let fixture: ComponentFixture; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [PostFormComponent] + }); + fixture = TestBed.createComponent(PostFormComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/components/post-form/post-form.component.ts b/src/app/shared/components/post-form/post-form.component.ts new file mode 100644 index 00000000..fd5f742f --- /dev/null +++ b/src/app/shared/components/post-form/post-form.component.ts @@ -0,0 +1,10 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-post-form', + templateUrl: './post-form.component.html', + styleUrls: ['./post-form.component.scss'] +}) +export class PostFormComponent { + +} diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index 0c266d49..c93c4b99 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -35,6 +35,10 @@ import { ProfilePicComponent } from './components/profile-pic/profile-pic.compon import { CalendarButtonComponent } from './components/calendar-button/calendar-button.component'; import { MatCheckboxModule } from '@angular/material/checkbox'; import { EditorMenuComponent } from './components/editor/menu/editor-menu/editor-menu.component'; +import { PostFormComponent } from './components/post-form/post-form.component'; +import { BlogFormComponent } from './components/blog-form/blog-form.component'; +import { EventFormComponent } from './components/event-form/event-form.component'; +import { PollFormComponent } from './components/poll-form/poll-form.component'; @NgModule({ @@ -53,6 +57,10 @@ import { EditorMenuComponent } from './components/editor/menu/editor-menu/editor ProfilePicComponent, CalendarButtonComponent, EditorMenuComponent, + PostFormComponent, + BlogFormComponent, + EventFormComponent, + PollFormComponent, ], imports: [ CommonModule, @@ -96,7 +104,11 @@ import { EditorMenuComponent } from './components/editor/menu/editor-menu/editor InfiniteScrollModule, ProfilePicComponent, CalendarButtonComponent, - MatCheckboxModule + MatCheckboxModule, + PostFormComponent, + BlogFormComponent, + EventFormComponent, + PollFormComponent, ], providers: [ { From 926ed0d0f688194e88e0dec6323ce8b47a68109a Mon Sep 17 00:00:00 2001 From: doug0102 Date: Tue, 3 Oct 2023 09:44:31 -0400 Subject: [PATCH 037/165] wip pre-formly --- .../components/post/post.component.html | 28 +++++++++----- .../components/post/post.component.scss | 16 +++----- .../profile/components/post/post.component.ts | 5 ++- .../components/button/button.component.scss | 25 ++++++++++++- .../components/editor/editor.component.ts | 11 ++++-- .../poll-form/poll-form.component.html | 36 +++++++++++++++++- .../poll-form/poll-form.component.scss | 37 +++++++++++++++++++ .../poll-form/poll-form.component.ts | 34 ++++++++++++++++- .../post-form/post-form.component.html | 3 +- src/app/shared/shared.module.ts | 1 - src/assets/i18n/translations.en.ts | 2 + src/assets/i18n/translations.fr.ts | 2 + 12 files changed, 168 insertions(+), 32 deletions(-) diff --git a/src/app/features/profile/components/post/post.component.html b/src/app/features/profile/components/post/post.component.html index d25571bd..e0dfb48a 100644 --- a/src/app/features/profile/components/post/post.component.html +++ b/src/app/features/profile/components/post/post.component.html @@ -42,18 +42,26 @@ - - - + + + + + - - + + + + - - + + + + - - + + + + @@ -73,7 +81,7 @@ - Post + {{ translations.titles.post | translate }}
diff --git a/src/app/features/profile/components/post/post.component.scss b/src/app/features/profile/components/post/post.component.scss index be3d1e54..d54baa15 100644 --- a/src/app/features/profile/components/post/post.component.scss +++ b/src/app/features/profile/components/post/post.component.scss @@ -6,6 +6,8 @@ $title-padding: 90px; :host { mat-card { mat-card-content { + padding-top: 30px; + .gcc-post-placeholder { display: flex; padding: 12px 17px; @@ -27,6 +29,7 @@ $title-padding: 90px; ::ng-deep { mat-tab-header { margin-right: 65px; + padding-bottom: 30px; .mat-mdc-tab-labels { gap: 20px; @@ -39,7 +42,7 @@ $title-padding: 90px; .mdc-tab { height: 40px; - border: 3px solid $primary-1; + border: 2px solid $primary-1; border-radius: 10px; .mdc-tab__text-label { @@ -65,15 +68,11 @@ $title-padding: 90px; display: none; } } - - .mat-mdc-tab-body-wrapper { - padding-top: 30px; - } } .gcc-cancel-editing { position: absolute; - top: 94px; + top: 112px; right: 26px; ::ng-deep { @@ -140,11 +139,6 @@ $title-padding: 90px; } } - mat-card-content { - padding-top: 15px; - padding-bottom: 10px; - } - mat-card-actions { padding-bottom: 10px; padding-left: 0; diff --git a/src/app/features/profile/components/post/post.component.ts b/src/app/features/profile/components/post/post.component.ts index 08a95378..79ae565f 100644 --- a/src/app/features/profile/components/post/post.component.ts +++ b/src/app/features/profile/components/post/post.component.ts @@ -1,6 +1,7 @@ import { Component, Input } from '@angular/core'; import { Person } from 'src/app/core/models/person.model'; import { INewsItem } from 'src/app/features/news-feed/models/INewsItem'; +import { Translations } from 'src/app/core/services/translations.service'; @Component({ selector: 'app-post', @@ -14,8 +15,8 @@ export class PostComponent { @Input() loading: boolean = false; @Input() editing: boolean = false; - constructor() { - + constructor(public translations: Translations) { + } toggleEditing(event: Event) { diff --git a/src/app/shared/components/button/button.component.scss b/src/app/shared/components/button/button.component.scss index bded031a..c09f2c09 100644 --- a/src/app/shared/components/button/button.component.scss +++ b/src/app/shared/components/button/button.component.scss @@ -26,14 +26,37 @@ color: inherit; } + .mat-mdc-outlined-button[disabled][disabled] { + border-color: $neutral-300 !important; + + .gcc-button-inner { + color: $neutral-300; + + i { + color: $neutral-300; + } + } + } + .mat-mdc-button .mdc-button__label, .mat-mdc-unelevated-button .mdc-button__label, .mat-mdc-raised-button .mdc-button__label, .mat-mdc-outlined-button .mdc-button__label { padding: 0 16px 0 16px; } + .mat-mdc-button .mat-mdc-button-touch-target, + .mat-mdc-unelevated-button .mat-mdc-button-touch-target, + .mat-mdc-raised-button .mat-mdc-button-touch-target, + .mat-mdc-outlined-button .mat-mdc-button-touch-target { + height: 100%; + } + .mat-stroked-button { - border: 3px solid $primary-1 !important; + border: 2px solid $primary-1 !important; border-radius: 10px; + .gcc-button-inner { + color: #000; + } + i { color: $primary-1; } diff --git a/src/app/shared/components/editor/editor.component.ts b/src/app/shared/components/editor/editor.component.ts index c3f5527d..4d9abd31 100644 --- a/src/app/shared/components/editor/editor.component.ts +++ b/src/app/shared/components/editor/editor.component.ts @@ -1,4 +1,4 @@ -import { AfterViewInit, Component, ElementRef, Input, OnDestroy, OnInit, ViewChild } from '@angular/core'; +import { AfterViewInit, Component, ElementRef, Input, OnDestroy, OnInit } from '@angular/core'; import { TranslateService } from '@ngx-translate/core'; import { Editor, NgxEditorService, Toolbar } from 'ngx-editor'; import { ngxEditorLocals } from '../../factories/editor-config.factory'; @@ -18,6 +18,7 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit { @Input() required: boolean = false; @Input() label!: string; @Input() hint!: string; + @Input() autofocus: boolean = false; editor: Editor; toolbar: Toolbar = [ @@ -60,6 +61,9 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit { ngAfterViewInit() { this.onLangChange(); + + if (this.autofocus) + this.editor.commands.focus(); } ngOnDestroy(): void { @@ -177,7 +181,7 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit { // TODO: Aria labels for drop down (enabled/disabled) handleDropDown(event: Event): void { - if (event instanceof KeyboardEvent && (event.key != 'Enter' && event.key != 'Space')) + if (event instanceof KeyboardEvent && (event.key != 'Enter' && event.key != ' ')) return; setTimeout(() => { @@ -198,7 +202,8 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit { } handleKeyDown(event: KeyboardEvent) { - if (event.key == 'Enter' || event.key == 'Space') { + if (event.key == 'Enter' || event.key == ' ') { + event.preventDefault(); event.target?.dispatchEvent(new MouseEvent('mousedown')); event.target?.dispatchEvent(new MouseEvent('mouseup')); this.toggleAria(event); diff --git a/src/app/shared/components/poll-form/poll-form.component.html b/src/app/shared/components/poll-form/poll-form.component.html index c58e802d..276ad2e0 100644 --- a/src/app/shared/components/poll-form/poll-form.component.html +++ b/src/app/shared/components/poll-form/poll-form.component.html @@ -1 +1,35 @@ -

poll-form works!

+ + + +
+ + + + + +
+ +
+ + + Add an option + + + + + Add a photo + +
diff --git a/src/app/shared/components/poll-form/poll-form.component.scss b/src/app/shared/components/poll-form/poll-form.component.scss index e69de29b..3ed60e49 100644 --- a/src/app/shared/components/poll-form/poll-form.component.scss +++ b/src/app/shared/components/poll-form/poll-form.component.scss @@ -0,0 +1,37 @@ +:host { + app-editor { + padding-bottom: 30px; + } + + .option-wrapper { + display: flex; + flex-direction: row; + align-items: center; + + app-button { + flex-basis: 0; + padding-left: 10px + } + + app-input { + flex-basis: 100%; + } + } + + .form-actions { + padding: 15px 0 30px 0; + + app-button { + display: table; + + ::ng-deep { + .gcc-button-inner { + letter-spacing: 1px; + } + } + } + app-button:not(:first-child) { + padding-top: 30px + } + } +} \ No newline at end of file diff --git a/src/app/shared/components/poll-form/poll-form.component.ts b/src/app/shared/components/poll-form/poll-form.component.ts index 8145ff76..92a4484b 100644 --- a/src/app/shared/components/poll-form/poll-form.component.ts +++ b/src/app/shared/components/poll-form/poll-form.component.ts @@ -1,10 +1,40 @@ -import { Component } from '@angular/core'; +import { Component, Input, OnInit } from '@angular/core'; +import { TooltipDirection } from '../../models/tooltip-direction'; @Component({ selector: 'app-poll-form', templateUrl: './poll-form.component.html', styleUrls: ['./poll-form.component.scss'] }) -export class PollFormComponent { +export class PollFormComponent implements OnInit { + @Input() model: IPollForm = { + description: '', + options: ['', ''], + photo: '' + } + maxOptions: number = 10; + tooltipDirection = TooltipDirection; + + ngOnInit(): void { + + } + + addOption(): void { + if (this.model.options.length < this.maxOptions) + this.model.options.push(''); + } + + removeOption(index: number): void { + if (this.model.options.length <= 2) + return; + + this.model.options.splice(index, 1); + } } + +export interface IPollForm { + description: string; + options: string[]; + photo: string; +} \ No newline at end of file diff --git a/src/app/shared/components/post-form/post-form.component.html b/src/app/shared/components/post-form/post-form.component.html index 721f76f8..c7f8e4bd 100644 --- a/src/app/shared/components/post-form/post-form.component.html +++ b/src/app/shared/components/post-form/post-form.component.html @@ -1,6 +1,7 @@ + [hint]="'Start writing'" + [autofocus]="true"> diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index c93c4b99..045babe6 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -16,7 +16,6 @@ import { TypescriptLoader } from '../core/helpers/typescript-loader'; import { Translations } from '../core/services/translations.service'; import { ButtonComponent } from './components/button/button.component'; - import { MatButtonModule} from '@angular/material/button'; import { MatIconModule } from '@angular/material/icon'; import { MatTooltipModule } from '@angular/material/tooltip'; diff --git a/src/assets/i18n/translations.en.ts b/src/assets/i18n/translations.en.ts index 387316dc..90668d46 100644 --- a/src/assets/i18n/translations.en.ts +++ b/src/assets/i18n/translations.en.ts @@ -54,6 +54,8 @@ export default { "messages": "Messages", "missions": "Careers", "newsfeed": "Newsfeed", + "poll": "Poll", + "post": "Post", "profile": "Profile", "search": "Search", "settings": "Settings", diff --git a/src/assets/i18n/translations.fr.ts b/src/assets/i18n/translations.fr.ts index 6dd6c6cb..6934b122 100644 --- a/src/assets/i18n/translations.fr.ts +++ b/src/assets/i18n/translations.fr.ts @@ -54,6 +54,8 @@ const fr: typeof import('./translations.en').default = { "messages": "Messages", "missions": "Carrières", "newsfeed": "Fil d'actualité", + "poll": "Sondage", + "post": "Poste", "profile": "Profil", "search": "Chercher", "settings": "Réglages", From 9aa052a8f4dee46033588de6f7d7c61cf8a890b0 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Fri, 13 Oct 2023 13:30:27 -0400 Subject: [PATCH 038/165] make a post wip --- .../components/event/event.component.html | 24 ++-- .../components/event/event.component.ts | 26 +++-- .../components/post/post.component.html | 26 +++-- .../components/post/post.component.scss | 16 --- .../profile/components/post/post.component.ts | 39 ++++++- .../blog-form/blog-form.component.html | 4 +- .../blog-form/blog-form.component.ts | 32 +++++- .../components/button/button.component.html | 35 ++++-- .../components/button/button.component.scss | 105 +++++++++++++----- .../components/button/button.component.ts | 3 + .../components/editor/editor.component.html | 35 ++++-- .../components/editor/editor.component.scss | 42 +++++++ .../components/editor/editor.component.ts | 77 +++++++++++-- .../event-form/event-form.component.ts | 22 +++- .../components/input/input.component.html | 25 +++-- .../components/input/input.component.ts | 61 +++++++--- .../poll-form/poll-form.component.html | 73 ++++++------ .../poll-form/poll-form.component.ts | 66 ++++++++++- .../post-form/post-form.component.html | 21 ++-- .../post-form/post-form.component.ts | 35 +++++- 20 files changed, 592 insertions(+), 175 deletions(-) diff --git a/src/app/features/events/components/event/event.component.html b/src/app/features/events/components/event/event.component.html index f05319f0..3b922e1b 100644 --- a/src/app/features/events/components/event/event.component.html +++ b/src/app/features/events/components/event/event.component.html @@ -129,52 +129,56 @@

{{ translations.event.event_registration | translate }}

@@ -202,8 +206,8 @@

{{ translations.event.event_registration | translate }}

{{ translations.event.form.register | translate }} diff --git a/src/app/features/events/components/event/event.component.ts b/src/app/features/events/components/event/event.component.ts index 61a9d094..2a52a87f 100644 --- a/src/app/features/events/components/event/event.component.ts +++ b/src/app/features/events/components/event/event.component.ts @@ -10,7 +10,7 @@ import { InputType } from 'src/app/shared/models/input-type'; import { ActivatedRoute } from '@angular/router'; import { EventService } from 'src/app/core/services/event.service'; import { CoreRoutes } from 'src/app/core/constants/routes.constants'; -import { FormControl, FormGroupDirective, NgForm, Validators } from '@angular/forms'; +import { FormControl, FormGroup, FormGroupDirective, NgForm, Validators } from '@angular/forms'; import { ErrorStateMatcher } from '@angular/material/core'; @Component({ @@ -38,17 +38,29 @@ export class EventComponent implements OnInit { private readonly route: ActivatedRoute = inject(ActivatedRoute); private readonly eventService: EventService = inject(EventService); - nameFormControl = new FormControl('', [Validators.required]); - emailFormControl = new FormControl('', [Validators.required, Validators.email]); - emailConfirmFormControl = new FormControl('', [Validators.required, Validators.email]); - occupationFormControl = new FormControl('', [Validators.required]); + formModel = { + name: '', + email: '', + emailConfirm: '', + occupation: '' + } + + nameFormControl = new FormControl(this.formModel.name, [Validators.required]); + emailFormControl = new FormControl(this.formModel.email, [Validators.required, Validators.email]); + emailConfirmFormControl = new FormControl(this.formModel.emailConfirm, [Validators.required, Validators.email]); + occupationFormControl = new FormControl(this.formModel.occupation, [Validators.required]); + + formGroup = new FormGroup({}); matcher = new MyErrorStateMatcher(); constructor(public translations: Translations, private viewportScroller: ViewportScroller ) { - - } + this.formGroup.addControl('name', this.nameFormControl); + this.formGroup.addControl('email', this.emailFormControl); + this.formGroup.addControl('emailConfirm', this.emailConfirmFormControl); + this.formGroup.addControl('occupation', this.occupationFormControl); + } ngOnInit(): void { if (!this.model) { diff --git a/src/app/features/profile/components/post/post.component.html b/src/app/features/profile/components/post/post.component.html index e0dfb48a..b29d4d5d 100644 --- a/src/app/features/profile/components/post/post.component.html +++ b/src/app/features/profile/components/post/post.component.html @@ -1,5 +1,4 @@ -
@@ -42,25 +41,28 @@
- + - + - + - + - + @@ -73,14 +75,14 @@
-
- -
- +
+ type="submit" + [ngClass]="formReady(selectedForm) ? 'enabled' : 'disabled'" + [disabled]="!formReady(selectedForm)" + theme="secondary-2" + [onClick]="submitCallback"> {{ translations.titles.post | translate }}
diff --git a/src/app/features/profile/components/post/post.component.scss b/src/app/features/profile/components/post/post.component.scss index d54baa15..d92dd7c1 100644 --- a/src/app/features/profile/components/post/post.component.scss +++ b/src/app/features/profile/components/post/post.component.scss @@ -83,22 +83,6 @@ $title-padding: 90px; mat-card-actions { padding: 0px 16px 24px 16px !important; - - .right-actions { - ::ng-deep { - button { - background: $secondary-2-gradient; - color: $secondary-2-contrast; - } - - app-button.disabled { - button { - background: #9e9e9e; - color: $secondary-2-contrast; - } - } - } - } } } diff --git a/src/app/features/profile/components/post/post.component.ts b/src/app/features/profile/components/post/post.component.ts index 79ae565f..02554297 100644 --- a/src/app/features/profile/components/post/post.component.ts +++ b/src/app/features/profile/components/post/post.component.ts @@ -1,31 +1,62 @@ -import { Component, Input } from '@angular/core'; +import { Component, Input, OnInit } from '@angular/core'; import { Person } from 'src/app/core/models/person.model'; import { INewsItem } from 'src/app/features/news-feed/models/INewsItem'; import { Translations } from 'src/app/core/services/translations.service'; +import { FormGroup } from '@angular/forms'; +import { MatTabChangeEvent } from '@angular/material/tabs'; @Component({ selector: 'app-post', templateUrl: './post.component.html', styleUrls: ['./post.component.scss'] }) -export class PostComponent { +export class PostComponent implements OnInit { @Input() profile!: Person; @Input() model!: INewsItem; // TODO: Create models for each post type @Input() loading: boolean = false; @Input() editing: boolean = false; + formGroups: FormGroup[] = [ + new FormGroup({}), + new FormGroup({}), + new FormGroup({}), + new FormGroup({}) + ]; + + submitCallback: Function = this.submit.bind(this); + selectedForm: FormGroup = this.formGroups[0]; + constructor(public translations: Translations) { } + public ngOnInit() { + + } + + onTabChange(event: MatTabChangeEvent): void { + this.selectedForm = this.formGroups[event.index]; + } + toggleEditing(event: Event) { if ((event instanceof KeyboardEvent && (event.key == 'Enter' || event.key == 'Space')) || event instanceof KeyboardEvent == false) this.editing = !this.editing; } - formReady(): boolean { - return true; + formReady(formGroup: FormGroup): boolean { + let allControlsValid = true; + for (const name in formGroup.controls) { + if (formGroup.controls[name].invalid) { + allControlsValid = false; + break; + } + } + return allControlsValid; + } + + submit(): void { + console.log(this.profile); } } diff --git a/src/app/shared/components/blog-form/blog-form.component.html b/src/app/shared/components/blog-form/blog-form.component.html index 57f5c8fc..f877630a 100644 --- a/src/app/shared/components/blog-form/blog-form.component.html +++ b/src/app/shared/components/blog-form/blog-form.component.html @@ -1 +1,3 @@ -

blog-form works!

+
+ +
\ No newline at end of file diff --git a/src/app/shared/components/blog-form/blog-form.component.ts b/src/app/shared/components/blog-form/blog-form.component.ts index e4888540..1de5ff2b 100644 --- a/src/app/shared/components/blog-form/blog-form.component.ts +++ b/src/app/shared/components/blog-form/blog-form.component.ts @@ -1,10 +1,38 @@ -import { Component } from '@angular/core'; +import { Component, Input } from '@angular/core'; +import { FormControl, FormGroup, Validators } from '@angular/forms'; @Component({ selector: 'app-blog-form', templateUrl: './blog-form.component.html', - styleUrls: ['./blog-form.component.scss'] + styleUrls: ['./blog-form.component.scss'], }) export class BlogFormComponent { + @Input() form: FormGroup = new FormGroup({}); + @Input() model: IBlogForm = { + name: '', + publisher: '', + coverPhoto: '', + coverPhotoAlt: '', + description: '' + } + ngOnInit(): void { + if (Object.keys(this.form.controls).length === 0) { + for (const [key, value] of Object.entries(this.model)) { + console.log(`${key}: ${value}`); + this.form.addControl( + key, + new FormControl(value, [Validators.required]) + ); + } + } + } +} + +export interface IBlogForm { + name: string; + publisher: string; + coverPhoto: string; + coverPhotoAlt: string; + description: string; } diff --git a/src/app/shared/components/button/button.component.html b/src/app/shared/components/button/button.component.html index c465c17c..b439118b 100644 --- a/src/app/shared/components/button/button.component.html +++ b/src/app/shared/components/button/button.component.html @@ -4,6 +4,7 @@ [attr.name]="name" [attr.value]="value" [attr.type]="type" + [attr.form]="form" [class]="matButtonType" [disabled]="disabled" [autofocus]="autofocus" @@ -11,7 +12,9 @@ [matTooltipPosition]="tooltipDirection" [attr.ariaLabel]="ariaLabel" [color]="matColor" - [ngStyle]="{ 'font-size': fontSize }"> + [ngStyle]="{ 'font-size': fontSize }" + [attr.theme]="theme" + (attr.click)="onClick()">
+ [ngStyle]="{ 'font-size': fontSize }" + [attr.theme]="theme" + (attr.click)="onClick()">
+ [ngStyle]="{ 'font-size': fontSize }" + [attr.theme]="theme" + (attr.click)="onClick()">
+ [ngStyle]="{ 'font-size': fontSize }" + [attr.theme]="theme" + (attr.click)="onClick()">
+ [ngStyle]="{ 'font-size': fontSize }" + [attr.theme]="theme" + (attr.click)="onClick()">
+ [ngStyle]="{ 'font-size': fontSize }" + [attr.theme]="theme" + (attr.click)="onClick()">
+ [ngStyle]="{ 'font-size': fontSize }" + [attr.theme]="theme" + (attr.click)="onClick()">
- -
- {{ label }}
*
- + tabindex="0" + [ngClass]="{'fa-circle-xmark' : showHint, 'fa-circle-question' : !showHint}" class="fa-regular" + [matTooltip]="showHint ? (translations.input.hint.hide.text | translate) : translations.input.hint.show.text | translate" + [attr.aria-label]="showHint ? (translations.input.hint.hide.aria | translate) : translations.input.hint.show.aria | translate" + [matTooltipPosition]="tooltipDirection.Right" + (click)="showHint = !showHint"> +
- -
+
+ [placeholder]="this.translations.editor.placeholder | translate" + (ngModelChange)="updateCharacterCount($event)" + [attr.formControl]="formControl" + [attr.formControlName]="formControlName"> +
+ {{ characterCount }} / {{ maxCharacters }} +
+ + {{ hint }} + + diff --git a/src/app/shared/components/editor/editor.component.scss b/src/app/shared/components/editor/editor.component.scss index 11683d1e..f47358d6 100644 --- a/src/app/shared/components/editor/editor.component.scss +++ b/src/app/shared/components/editor/editor.component.scss @@ -59,6 +59,42 @@ } } } + + .character-count { + text-align: right; + margin: 0 10px 4px 0; + color: $neutral-500; + pointer-events: none; + } + } + + .NgxEditor__Wrapper.focus { + border-color: $primary-1; + + ngx-editor-menu { + ::ng-deep { + .NgxEditor__MenuBar { + border-color: $primary-1; + } + } + } + } + + .NgxEditor__Wrapper.error { + border-color: $error-red; + + ngx-editor-menu { + ::ng-deep { + .NgxEditor__MenuBar { + border-color: $error-red; + } + } + } + + .character-count { + color: #e92020; + font-weight: 500; + } } mat-label { @@ -84,4 +120,10 @@ color: $neutral-300 !important; } } + + mat-hint { + font-size: smaller; + font-style: italic; + color: #757575; + } } \ No newline at end of file diff --git a/src/app/shared/components/editor/editor.component.ts b/src/app/shared/components/editor/editor.component.ts index 4d9abd31..fb4c460a 100644 --- a/src/app/shared/components/editor/editor.component.ts +++ b/src/app/shared/components/editor/editor.component.ts @@ -1,17 +1,26 @@ -import { AfterViewInit, Component, ElementRef, Input, OnDestroy, OnInit } from '@angular/core'; +import { AfterViewInit, Component, ElementRef, EventEmitter, Input, OnDestroy, OnInit, Output, ViewChild, forwardRef } from '@angular/core'; import { TranslateService } from '@ngx-translate/core'; import { Editor, NgxEditorService, Toolbar } from 'ngx-editor'; import { ngxEditorLocals } from '../../factories/editor-config.factory'; import { Subscription } from 'rxjs/internal/Subscription'; import { Translations } from 'src/app/core/services/translations.service'; +import { ControlValueAccessor, FormControl, NG_VALUE_ACCESSOR } from '@angular/forms'; +import { TooltipDirection } from '../../models/tooltip-direction'; // https://sibiraj-s.github.io/ngx-editor/en/introduction/ @Component({ selector: 'app-editor', templateUrl: './editor.component.html', - styleUrls: ['./editor.component.scss'] + styleUrls: ['./editor.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => EditorComponent), + multi: true, + }, + ], }) -export class EditorComponent implements OnInit, OnDestroy, AfterViewInit { +export class EditorComponent implements OnInit, OnDestroy, AfterViewInit, ControlValueAccessor { @Input() html!: string; @Input() disabled: boolean = false; @@ -19,6 +28,14 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit { @Input() label!: string; @Input() hint!: string; @Input() autofocus: boolean = false; + @Input() minCharacters: number = 0; + @Input() maxCharacters: number = Number.MAX_VALUE; + @Input() formControl!: FormControl; + @Input() formControlName!: string; + + @Output() htmlChange = new EventEmitter(); + + @ViewChild('gccEditor') editorViewChild!: ElementRef; editor: Editor; toolbar: Toolbar = [ @@ -32,8 +49,17 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit { ['align_left', 'align_center', 'align_right', 'align_justify'], ['horizontal_rule', 'format_clear'], ]; + showHint: boolean = false; + hasFocus: boolean = false; + characterCount: number = 0; + Number = Number; + focusChange!: MutationObserver; + tooltipDirection = TooltipDirection; + onChange = (_: any) => {}; + onTouched = () => {}; + private langChangeSub!: Subscription; private keydownRef = this.handleKeyDown.bind(this); private ariaRef = this.toggleAria.bind(this); @@ -55,12 +81,27 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit { if (!this.editor) this.editor = new Editor(); - if (!this.html) + if (!this.html) { this.html = ''; + } else { + this.characterCount = this.html.length; + } } ngAfterViewInit() { this.onLangChange(); + + this.focusChange = new MutationObserver((mutations: MutationRecord[]) => { + mutations.forEach((mutation: MutationRecord) => { + let classList = this.editorViewChild.nativeElement.children[1].children[0].children[0].classList; + this.hasFocus = Array.from(classList).includes('ProseMirror-focused') ? true : false; + console.log("Has focus: " + this.hasFocus); + }); + }); + + this.focusChange.observe(this.editorViewChild.nativeElement.children[1].children[0].children[0], { + attributeFilter: ['class'], + }) if (this.autofocus) this.editor.commands.focus(); @@ -74,6 +115,10 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit { this.langChangeSub.unsubscribe(); } + updateCharacterCount(content: string) { + this.characterCount = content.length; + } + onLangChange(): void { this.ngxEditorService.config.locals = ngxEditorLocals(this.translateService, this.translations); @@ -149,10 +194,6 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit { }, 500); } - placeholderText(): string { - return this.translateService.instant(this.translations.editor.placeholder) - } - addAccessibility(selector: string, ariaLabel: string): void { let el: HTMLElement = this.elementRef.nativeElement.querySelectorAll(selector)[0]; @@ -229,4 +270,24 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit { } return ''; } + + writeValue(html: string): void { + if (html !== undefined) { + this.html = html; + } + } + + registerOnChange(fn: any): void { + this.onChange = fn; + } + + registerOnTouched(fn: any): void { + this.onTouched = fn; + } + + onInputChange(value: string) { + this.html = value; + this.onChange(this.html); + this.htmlChange.emit(this.html); + } } diff --git a/src/app/shared/components/event-form/event-form.component.ts b/src/app/shared/components/event-form/event-form.component.ts index bff651c7..5cafe6d1 100644 --- a/src/app/shared/components/event-form/event-form.component.ts +++ b/src/app/shared/components/event-form/event-form.component.ts @@ -1,4 +1,5 @@ -import { Component } from '@angular/core'; +import { Component, Input } from '@angular/core'; +import { FormControl, FormGroup, Validators } from '@angular/forms'; @Component({ selector: 'app-event-form', @@ -6,5 +7,24 @@ import { Component } from '@angular/core'; styleUrls: ['./event-form.component.scss'] }) export class EventFormComponent { + @Input() form: FormGroup = new FormGroup({}); + @Input() model: IEventForm = { + description: '' + } + ngOnInit(): void { + if (Object.keys(this.form.controls).length === 0) { + for (const [key, value] of Object.entries(this.model)) { + console.log(`${key}: ${value}`); + this.form.addControl( + key, + new FormControl(value, [Validators.required]) + ); + } + } + } } + +export interface IEventForm { + description: string; +} \ No newline at end of file diff --git a/src/app/shared/components/input/input.component.html b/src/app/shared/components/input/input.component.html index 187c3fdc..7eb0391c 100644 --- a/src/app/shared/components/input/input.component.html +++ b/src/app/shared/components/input/input.component.html @@ -14,20 +14,23 @@ - + {{ translations.input.error.email | translate }} - + {{ label }} {{ translations.input.error.required | translate }} diff --git a/src/app/shared/components/input/input.component.ts b/src/app/shared/components/input/input.component.ts index 9c2b61b2..5cbcd739 100644 --- a/src/app/shared/components/input/input.component.ts +++ b/src/app/shared/components/input/input.component.ts @@ -1,6 +1,6 @@ -import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; +import { Component, EventEmitter, Input, Output, forwardRef } from '@angular/core'; import { InputType } from '../../models/input-type'; -import { FormControl } from '@angular/forms'; +import { ControlValueAccessor, FormControl, NG_VALUE_ACCESSOR } from '@angular/forms'; import { MaterialButtonType } from '../../models/material-button-type'; import { Translations } from 'src/app/core/services/translations.service'; import { TranslateService } from '@ngx-translate/core'; @@ -11,24 +11,31 @@ import { ErrorStateMatcher } from '@angular/material/core'; selector: 'app-input', templateUrl: './input.component.html', styleUrls: ['./input.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => InputComponent), + multi: true, + }, + ], }) -export class InputComponent { +export class InputComponent implements ControlValueAccessor { - @Input() inputId: string = ''; - @Input() name: string = ''; + @Input() inputId!: string; + @Input({required:true}) name!: string; @Input() type: InputType | string = InputType.Text; - @Input() formControl!: FormControl; - @Input() errorStateMatcher!: ErrorStateMatcher; + @Input() control!: FormControl; + @Input() controlName!: string; + @Input() errorMatcher!: ErrorStateMatcher; - @Input() value: string = ''; - @Input() label!: string; + @Input({required:true}) value!: string; + @Input({required:true}) label!: string; @Input() placeholder!: string; @Input() hint!: string; @Input() errorMessage!: string; - @Input() maxLength: number = 524288; - @Input() minLength: number = 0; + @Input() maxLength!: number; + @Input() minLength!: number; @Input() pattern!: string; @Input() required: boolean = false; @@ -36,14 +43,40 @@ export class InputComponent { @Input() readonly: boolean = false; @Input() autofocus: boolean = false; + @Output() valueChange = new EventEmitter(); + materialButtonType = MaterialButtonType; tooltipDirection = TooltipDirection; inputType = InputType; showPassword = false; showHint = false; - constructor(public translations: Translations) - { } + onChange = (_: any) => {}; + onTouched = () => {}; + + constructor(public translations: Translations) { + + } + + writeValue(value: any): void { + if (value !== undefined) { + this.value = value; + } + } + + registerOnChange(fn: any): void { + this.onChange = fn; + } + + registerOnTouched(fn: any): void { + this.onTouched = fn; + } + + onInputChange(value: string) { + this.value = value; + this.onChange(this.value); + this.valueChange.emit(this.value); + } toggleShowPassword(): void { this.showPassword = !this.showPassword; diff --git a/src/app/shared/components/poll-form/poll-form.component.html b/src/app/shared/components/poll-form/poll-form.component.html index 276ad2e0..9df1228d 100644 --- a/src/app/shared/components/poll-form/poll-form.component.html +++ b/src/app/shared/components/poll-form/poll-form.component.html @@ -1,35 +1,44 @@ - - +
+ + -
- - - - - -
+
+ + + + + +
-
- - - Add an option - +
+ + + Add an option + + + + + Add a photo + +
+ - - - Add a photo - -
diff --git a/src/app/shared/components/poll-form/poll-form.component.ts b/src/app/shared/components/poll-form/poll-form.component.ts index 92a4484b..794f9310 100644 --- a/src/app/shared/components/poll-form/poll-form.component.ts +++ b/src/app/shared/components/poll-form/poll-form.component.ts @@ -1,5 +1,7 @@ import { Component, Input, OnInit } from '@angular/core'; import { TooltipDirection } from '../../models/tooltip-direction'; +import { FormControl, FormGroup, FormGroupDirective, NgForm, Validators } from '@angular/forms'; +import { ErrorStateMatcher } from '@angular/material/core'; @Component({ selector: 'app-poll-form', @@ -7,34 +9,90 @@ import { TooltipDirection } from '../../models/tooltip-direction'; styleUrls: ['./poll-form.component.scss'] }) export class PollFormComponent implements OnInit { + @Input() form: FormGroup = new FormGroup({}); @Input() model: IPollForm = { description: '', - options: ['', ''], + options: [ + { id: 0, value: '' }, + { id: 1, value: '' } + ], photo: '' } maxOptions: number = 10; + minLength: number = 1; + maxLength: number = 240; tooltipDirection = TooltipDirection; + errorStateMatcher = new MyErrorStateMatcher(); ngOnInit(): void { + this.form.addControl( + 'description', + new FormControl( + this.model.description, + [ + Validators.required, + Validators.minLength(this.minLength), + Validators.maxLength(this.maxLength), + ] + ) + ); + for (let i = 0; i < this.model.options.length; i++) { + this.form.addControl( + 'option' + i, + new FormControl( + this.model.options[i].value, + [ + Validators.required, + Validators.minLength(this.minLength), + Validators.maxLength(this.maxLength) + ] + ) + ); + } } addOption(): void { - if (this.model.options.length < this.maxOptions) - this.model.options.push(''); + if (this.model.options.length < this.maxOptions) { + this.model.options.push({id: this.model.options.length, value: ''}); + this.form.addControl( + 'option' + (this.model.options.length - 1), + new FormControl( + this.model.options[this.model.options.length - 1].value, + [ + Validators.required, + Validators.minLength(this.minLength), + Validators.maxLength(this.maxLength), + ] + ) + ); + } } removeOption(index: number): void { if (this.model.options.length <= 2) return; + this.form.removeControl('option' + index); this.model.options.splice(index, 1); } } +export class MyErrorStateMatcher implements ErrorStateMatcher { + isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean { + const isSubmitted = form && form.submitted; + return !!(control && control.invalid && (control.dirty || control.touched || isSubmitted)); + } +} + export interface IPollForm { description: string; - options: string[]; + options: IPollOption[]; photo: string; +} + +export interface IPollOption { + id: number, + value: string } \ No newline at end of file diff --git a/src/app/shared/components/post-form/post-form.component.html b/src/app/shared/components/post-form/post-form.component.html index c7f8e4bd..7d188b24 100644 --- a/src/app/shared/components/post-form/post-form.component.html +++ b/src/app/shared/components/post-form/post-form.component.html @@ -1,9 +1,14 @@ - - +
+ + - - Add a photo - \ No newline at end of file + + Add a photo + +
\ No newline at end of file diff --git a/src/app/shared/components/post-form/post-form.component.ts b/src/app/shared/components/post-form/post-form.component.ts index fd5f742f..de3cda4d 100644 --- a/src/app/shared/components/post-form/post-form.component.ts +++ b/src/app/shared/components/post-form/post-form.component.ts @@ -1,4 +1,5 @@ -import { Component } from '@angular/core'; +import { Component, Input } from '@angular/core'; +import { FormControl, FormGroup, Validators } from '@angular/forms'; @Component({ selector: 'app-post-form', @@ -6,5 +7,37 @@ import { Component } from '@angular/core'; styleUrls: ['./post-form.component.scss'] }) export class PostFormComponent { + @Input() form: FormGroup = new FormGroup({}); + @Input() model: IPostForm = { + description: '' + } + minLength: number = 1; + maxLength: number = 240; + + constructor() { + + } + + ngOnInit(): void { + this.form.addControl( + 'description', + new FormControl( + this.model.description, + [ + Validators.required, + Validators.minLength(this.minLength), + Validators.maxLength(this.maxLength), + ] + ) + ); + } + + onSubmit() { + console.log(this.form.value); + } +} + +export interface IPostForm { + description: string; } From 956ad74ace4ed43d86073aaf3161810b9dfdba46 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Tue, 17 Oct 2023 10:13:15 -0400 Subject: [PATCH 039/165] debouncer service, editor form controls, poll form control --- .../core/services/debounce.service.spec.ts | 16 ++++ src/app/core/services/debounce.service.ts | 23 ++++++ .../blog-form/blog-form.component.ts | 6 +- .../components/button/button.component.html | 14 ++-- .../components/button/button.component.ts | 2 +- .../components/editor/editor.component.html | 22 ++++-- .../components/editor/editor.component.scss | 25 ++++-- .../components/editor/editor.component.ts | 76 +++++++++++++++---- .../event-form/event-form.component.ts | 6 +- .../components/input/input.component.html | 14 +++- .../poll-form/poll-form.component.html | 4 +- .../poll-form/poll-form.component.ts | 38 ++++------ src/assets/i18n/translations.en.ts | 4 +- src/assets/i18n/translations.fr.ts | 4 +- 14 files changed, 182 insertions(+), 72 deletions(-) create mode 100644 src/app/core/services/debounce.service.spec.ts create mode 100644 src/app/core/services/debounce.service.ts diff --git a/src/app/core/services/debounce.service.spec.ts b/src/app/core/services/debounce.service.spec.ts new file mode 100644 index 00000000..4ca5b957 --- /dev/null +++ b/src/app/core/services/debounce.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { DebounceService } from './debounce.service'; + +describe('DebounceService', () => { + let service: DebounceService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(DebounceService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/core/services/debounce.service.ts b/src/app/core/services/debounce.service.ts new file mode 100644 index 00000000..39065a24 --- /dev/null +++ b/src/app/core/services/debounce.service.ts @@ -0,0 +1,23 @@ +import { Injectable } from '@angular/core'; +import { Observable, Subject, debounceTime } from 'rxjs'; + +@Injectable({ + providedIn: 'root' +}) +export class DebounceService { + + private debounceSubject = new Subject(); + + constructor() { } + + debounce(fn: Function, delay: number): void { + this.debounceSubject.next(fn); + this.debounceSubject.pipe(debounceTime(delay)).subscribe((func) => { + func(); + }); + } + + getDebouncedObservable(delay: number): Observable { + return this.debounceSubject.pipe(debounceTime(delay)); + } +} diff --git a/src/app/shared/components/blog-form/blog-form.component.ts b/src/app/shared/components/blog-form/blog-form.component.ts index 1de5ff2b..c6227dfe 100644 --- a/src/app/shared/components/blog-form/blog-form.component.ts +++ b/src/app/shared/components/blog-form/blog-form.component.ts @@ -19,11 +19,7 @@ export class BlogFormComponent { ngOnInit(): void { if (Object.keys(this.form.controls).length === 0) { for (const [key, value] of Object.entries(this.model)) { - console.log(`${key}: ${value}`); - this.form.addControl( - key, - new FormControl(value, [Validators.required]) - ); + this.form.addControl(key, new FormControl(value, [Validators.required])); } } } diff --git a/src/app/shared/components/button/button.component.html b/src/app/shared/components/button/button.component.html index b439118b..9417ce9f 100644 --- a/src/app/shared/components/button/button.component.html +++ b/src/app/shared/components/button/button.component.html @@ -14,7 +14,7 @@ [color]="matColor" [ngStyle]="{ 'font-size': fontSize }" [attr.theme]="theme" - (attr.click)="onClick()"> + (click)="onClick()">
+ (click)="onClick()">
+ (click)="onClick()">
+ (click)="onClick()">
+ (click)="onClick()">
+ (click)="onClick()">
+ (click)="onClick()">
{}; public materialButtonType = MaterialButtonType; diff --git a/src/app/shared/components/editor/editor.component.html b/src/app/shared/components/editor/editor.component.html index c6bab6ba..b76206fd 100644 --- a/src/app/shared/components/editor/editor.component.html +++ b/src/app/shared/components/editor/editor.component.html @@ -12,7 +12,7 @@
+ [ngClass]="{focus: hasFocus, error: control && control.hasError('required') || (characterCount > maxCharacters) || (characterCount < minCharacters)}"> + [attr.formControl]="control" + [attr.formControlName]="controlName" + [required]="required">
+ + {{ translations.input.error.minLength | translate }} {{ control.errors!['minlength'].requiredLength }} + + + + {{ translations.input.error.maxLength | translate }} {{ control.errors!['maxlength'].requiredLength }} + + + + {{ label }} {{ translations.input.error.required | translate }} + + diff --git a/src/app/shared/components/editor/editor.component.scss b/src/app/shared/components/editor/editor.component.scss index f47358d6..4bec350a 100644 --- a/src/app/shared/components/editor/editor.component.scss +++ b/src/app/shared/components/editor/editor.component.scss @@ -66,6 +66,11 @@ color: $neutral-500; pointer-events: none; } + + .character-count.error { + color: #e92020; + font-weight: 500; + } } .NgxEditor__Wrapper.focus { @@ -90,11 +95,6 @@ } } } - - .character-count { - color: #e92020; - font-weight: 500; - } } mat-label { @@ -125,5 +125,20 @@ font-size: smaller; font-style: italic; color: #757575; + padding: 0 16px; + } + + mat-error { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: var(--mdc-typography-caption-font-family, var(--mdc-typography-font-family, Inter)); + font-size: var(--mdc-typography-caption-font-size, 12px); + line-height: var(--mdc-typography-caption-line-height, 20px); + font-weight: var(--mdc-typography-caption-font-weight, 400); + letter-spacing: var(--mdc-typography-caption-letter-spacing, 0.0333333333em); + -webkit-text-decoration: var(--mdc-typography-caption-text-decoration, inherit); + text-decoration: var(--mdc-typography-caption-text-decoration, inherit); + text-transform: var(--mdc-typography-caption-text-transform, none); + padding: 0 16px; } } \ No newline at end of file diff --git a/src/app/shared/components/editor/editor.component.ts b/src/app/shared/components/editor/editor.component.ts index fb4c460a..f0848d0f 100644 --- a/src/app/shared/components/editor/editor.component.ts +++ b/src/app/shared/components/editor/editor.component.ts @@ -1,11 +1,12 @@ -import { AfterViewInit, Component, ElementRef, EventEmitter, Input, OnDestroy, OnInit, Output, ViewChild, forwardRef } from '@angular/core'; +import { AfterContentInit, AfterViewInit, Component, ElementRef, EventEmitter, Input, OnDestroy, OnInit, Output, ViewChild, forwardRef } from '@angular/core'; import { TranslateService } from '@ngx-translate/core'; import { Editor, NgxEditorService, Toolbar } from 'ngx-editor'; import { ngxEditorLocals } from '../../factories/editor-config.factory'; import { Subscription } from 'rxjs/internal/Subscription'; import { Translations } from 'src/app/core/services/translations.service'; -import { ControlValueAccessor, FormControl, NG_VALUE_ACCESSOR } from '@angular/forms'; +import { ControlValueAccessor, FormControl, NG_VALUE_ACCESSOR, Validators } from '@angular/forms'; import { TooltipDirection } from '../../models/tooltip-direction'; +import { DebounceService } from 'src/app/core/services/debounce.service'; // https://sibiraj-s.github.io/ngx-editor/en/introduction/ @Component({ @@ -20,7 +21,7 @@ import { TooltipDirection } from '../../models/tooltip-direction'; }, ], }) -export class EditorComponent implements OnInit, OnDestroy, AfterViewInit, ControlValueAccessor { +export class EditorComponent implements OnInit, OnDestroy, AfterViewInit, AfterContentInit, ControlValueAccessor { @Input() html!: string; @Input() disabled: boolean = false; @@ -30,8 +31,8 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit, Contro @Input() autofocus: boolean = false; @Input() minCharacters: number = 0; @Input() maxCharacters: number = Number.MAX_VALUE; - @Input() formControl!: FormControl; - @Input() formControlName!: string; + @Input() control!: FormControl; + @Input() controlName!: string; @Output() htmlChange = new EventEmitter(); @@ -45,7 +46,6 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit, Contro ['ordered_list', 'bullet_list'], [ { heading: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'] }], ['link', 'image'], - ['align_left', 'align_center', 'align_right', 'align_justify'], ['horizontal_rule', 'format_clear'], ]; @@ -56,6 +56,7 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit, Contro Number = Number; focusChange!: MutationObserver; tooltipDirection = TooltipDirection; + hasRequiredValidator = false; onChange = (_: any) => {}; onTouched = () => {}; @@ -65,7 +66,13 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit, Contro private ariaRef = this.toggleAria.bind(this); private dropdownRef = this.handleDropDown.bind(this); - constructor(private translateService: TranslateService, private ngxEditorService: NgxEditorService, public translations: Translations, private elementRef: ElementRef ) { + constructor( + public translations: Translations, + private translateService: TranslateService, + private ngxEditorService: NgxEditorService, + private elementRef: ElementRef, + private debounceService: DebounceService + ) { this.editor = new Editor({ history: true, keyboardShortcuts: true, @@ -88,21 +95,38 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit, Contro } } + // TODO + ngAfterContentInit(): void { + if (this.control && this.control.hasValidator(Validators.required)) { + this.control.removeValidators([Validators.required]); + this.control.clearValidators(); + this.control.updateValueAndValidity(); + this.hasRequiredValidator = true; + } + } + ngAfterViewInit() { this.onLangChange(); this.focusChange = new MutationObserver((mutations: MutationRecord[]) => { mutations.forEach((mutation: MutationRecord) => { - let classList = this.editorViewChild.nativeElement.children[1].children[0].children[0].classList; - this.hasFocus = Array.from(classList).includes('ProseMirror-focused') ? true : false; - console.log("Has focus: " + this.hasFocus); + let classList = this.editorViewChild.nativeElement.children[1]?.children[0]?.children[0]?.classList; + if (classList) { + this.hasFocus = Array.from(classList).includes('ProseMirror-focused') ? true : false; + + // TODO + if (this.control && this.hasRequiredValidator && !this.hasFocus) { + this.control.addValidators([Validators.required]); + this.control.updateValueAndValidity(); + } + } }); }); this.focusChange.observe(this.editorViewChild.nativeElement.children[1].children[0].children[0], { attributeFilter: ['class'], - }) - + }); + if (this.autofocus) this.editor.commands.focus(); } @@ -113,10 +137,19 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit, Contro if (this.langChangeSub) this.langChangeSub.unsubscribe(); + + if (this.focusChange) + this.focusChange.disconnect(); } updateCharacterCount(content: string) { - this.characterCount = content.length; + this.debounceService.debounce(() => { + this.characterCount = this.countCharactersInsideHTML(content); + if (this.characterCount === 0) { + this.html = ''; + this.onInputChange(this.html); + } + }, 250); } onLangChange(): void { @@ -271,6 +304,23 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit, Contro return ''; } + countCharactersInsideHTML(html: string): number { + let count = 0; + let insideTag = false; + + for (let i = 0; i < html.length; i++) { + if (html[i] === '<') { + insideTag = true; + } else if (html[i] === '>') { + insideTag = false; + } else if (!insideTag) { + count++; + } + } + + return count; + } + writeValue(html: string): void { if (html !== undefined) { this.html = html; diff --git a/src/app/shared/components/event-form/event-form.component.ts b/src/app/shared/components/event-form/event-form.component.ts index 5cafe6d1..45c6b25c 100644 --- a/src/app/shared/components/event-form/event-form.component.ts +++ b/src/app/shared/components/event-form/event-form.component.ts @@ -15,11 +15,7 @@ export class EventFormComponent { ngOnInit(): void { if (Object.keys(this.form.controls).length === 0) { for (const [key, value] of Object.entries(this.model)) { - console.log(`${key}: ${value}`); - this.form.addControl( - key, - new FormControl(value, [Validators.required]) - ); + this.form.addControl(key, new FormControl(value, [Validators.required])); } } } diff --git a/src/app/shared/components/input/input.component.html b/src/app/shared/components/input/input.component.html index 7eb0391c..9d9b81d6 100644 --- a/src/app/shared/components/input/input.component.html +++ b/src/app/shared/components/input/input.component.html @@ -18,8 +18,8 @@ (ngModelChange)="onInputChange($event)" [attr.id]="inputId" [attr.name]="name" - [attr.type]="type === inputType.Password ? (showPassword ? inputType.Text : type) : type" - [attr.value]="value" + [value]="value" + [type]="type === inputType.Password ? (showPassword ? inputType.Text : type) : type" [placeholder]="placeholder" [attr.minLength]="minLength" [attr.maxLength]="maxLength" @@ -45,10 +45,18 @@ {{ hint }} - + {{ translations.input.error.email | translate }} + + {{ translations.input.error.minLength | translate }} {{ control.errors!['minlength'].requiredLength }}. + + + + {{ translations.input.error.maxLength | translate }} {{ control.errors!['maxlength'].requiredLength }}. + + {{ label }} {{ translations.input.error.required | translate }} diff --git a/src/app/shared/components/poll-form/poll-form.component.html b/src/app/shared/components/poll-form/poll-form.component.html index 9df1228d..93b2407e 100644 --- a/src/app/shared/components/poll-form/poll-form.component.html +++ b/src/app/shared/components/poll-form/poll-form.component.html @@ -5,13 +5,15 @@ [required]="true" [autofocus]="true" [maxCharacters]="maxLength" - formControlName="description"> + formControlName="description" + [control]="$any(form).controls['description']">
Date: Tue, 17 Oct 2023 17:26:57 -0400 Subject: [PATCH 040/165] make a post - blog --- .../profile/components/post/post.component.ts | 2 +- .../blog-form/blog-form.component.html | 60 ++++++++++++++++- .../blog-form/blog-form.component.scss | 36 ++++++++++ .../blog-form/blog-form.component.ts | 66 ++++++++++++++++++- .../components/editor/editor.component.ts | 34 +++++++--- .../poll-form/poll-form.component.ts | 2 +- .../post-form/post-form.component.html | 4 +- 7 files changed, 190 insertions(+), 14 deletions(-) diff --git a/src/app/features/profile/components/post/post.component.ts b/src/app/features/profile/components/post/post.component.ts index 02554297..466f4bb7 100644 --- a/src/app/features/profile/components/post/post.component.ts +++ b/src/app/features/profile/components/post/post.component.ts @@ -56,7 +56,7 @@ export class PostComponent implements OnInit { } submit(): void { - console.log(this.profile); + console.log(this.selectedForm); } } diff --git a/src/app/shared/components/blog-form/blog-form.component.html b/src/app/shared/components/blog-form/blog-form.component.html index f877630a..0463455d 100644 --- a/src/app/shared/components/blog-form/blog-form.component.html +++ b/src/app/shared/components/blog-form/blog-form.component.html @@ -1,3 +1,61 @@
- + + + + + + + +
+ + + {{ coverPhoto ? coverPhoto.name : 'Upload a cover photo'}} + +
+ + + {{ coverPhotoError }} + + + + A cover photo is required. + + + + + + + + +
\ No newline at end of file diff --git a/src/app/shared/components/blog-form/blog-form.component.scss b/src/app/shared/components/blog-form/blog-form.component.scss index e69de29b..f979b6f6 100644 --- a/src/app/shared/components/blog-form/blog-form.component.scss +++ b/src/app/shared/components/blog-form/blog-form.component.scss @@ -0,0 +1,36 @@ +@import "../../../../assets/scss/partials/colors"; + +:host { + .cover-photo-upload { + display: flex; + align-items: center; + justify-content: center; + height: 200px; + border: 2px solid $neutral-300; + border-radius: 10px; + margin-bottom: 16px; + } + + .cover-photo-upload.error { + border-color: $error-red; + } + + mat-error { + position: absolute; + padding-left: 16px; + margin-top: -16px; + -webkit-font-smoothing: antialiased; + font-family: var(--mdc-typography-caption-font-family, var(--mdc-typography-font-family, Inter)); + font-size: var(--mdc-typography-caption-font-size, 12px); + line-height: var(--mdc-typography-caption-line-height, 20px); + font-weight: var(--mdc-typography-caption-font-weight, 400); + letter-spacing: var(--mdc-typography-caption-letter-spacing, 0.0333333333em); + -webkit-text-decoration: var(--mdc-typography-caption-text-decoration, inherit); + text-decoration: var(--mdc-typography-caption-text-decoration, inherit); + text-transform: var(--mdc-typography-caption-text-transform, none); + } + + app-editor { + padding-bottom: 16px; + } +} \ No newline at end of file diff --git a/src/app/shared/components/blog-form/blog-form.component.ts b/src/app/shared/components/blog-form/blog-form.component.ts index c6227dfe..fa8104eb 100644 --- a/src/app/shared/components/blog-form/blog-form.component.ts +++ b/src/app/shared/components/blog-form/blog-form.component.ts @@ -1,5 +1,6 @@ -import { Component, Input } from '@angular/core'; -import { FormControl, FormGroup, Validators } from '@angular/forms'; +import { Component, ElementRef, Input, ViewChild } from '@angular/core'; +import { FormControl, FormGroup, FormGroupDirective, NgForm, Validators } from '@angular/forms'; +import { ErrorStateMatcher } from '@angular/material/core'; @Component({ selector: 'app-blog-form', @@ -16,6 +17,14 @@ export class BlogFormComponent { description: '' } + @ViewChild('gccBlogCoverPhotoInput') fileInput!: ElementRef; + errorStateMatcher = new MyErrorStateMatcher(); + + coverPhoto: File | undefined; + coverPhotoError: string | undefined; + maxCoverPhotoSize: number = 3145728; + maxBlogLength: number = 2000; + ngOnInit(): void { if (Object.keys(this.form.controls).length === 0) { for (const [key, value] of Object.entries(this.model)) { @@ -23,6 +32,51 @@ export class BlogFormComponent { } } } + + openFilePicker() { + this.fileInput.nativeElement.click(); + this.form.controls['coverPhoto'].markAsTouched(); + } + + onFileSelected(event: any): void { + const selectedFile: File = event.target.files[0]; + + if (selectedFile) { + if (selectedFile.size <= this.maxCoverPhotoSize) { + this.displaySelectedImage(selectedFile).then((dataURL) => { + this.coverPhoto = selectedFile; + this.model.coverPhoto = dataURL; + this.form.controls['coverPhoto'].setValue(this.model.coverPhoto); + this.coverPhotoError = undefined; + }).catch((error) => { + this.coverPhotoError = "Error reading the image." + error; + console.error(error); + }); + } + else { + this.coverPhoto = undefined; + this.model.coverPhoto = ''; + this.form.controls['coverPhoto'].setValue(this.model.coverPhoto); + this.coverPhotoError = "Photo is too large. Maximum size allowed is " + this.maxCoverPhotoSize / 1024 + " KB."; + } + } + + this.form.controls['coverPhoto'].markAsTouched(); + } + + displaySelectedImage(file: File): Promise { + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.onload = (event) => { + const dataURL = event.target?.result as string; + resolve(dataURL); + }; + reader.onerror = (error) => { + reject(error); + }; + reader.readAsDataURL(file); + }); + } } export interface IBlogForm { @@ -32,3 +86,11 @@ export interface IBlogForm { coverPhotoAlt: string; description: string; } + + +class MyErrorStateMatcher implements ErrorStateMatcher { + isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean { + const isSubmitted = form && form.submitted; + return !!(control && control.invalid && (control.dirty || control.touched || isSubmitted)); + } +} diff --git a/src/app/shared/components/editor/editor.component.ts b/src/app/shared/components/editor/editor.component.ts index f0848d0f..16bf4764 100644 --- a/src/app/shared/components/editor/editor.component.ts +++ b/src/app/shared/components/editor/editor.component.ts @@ -95,7 +95,7 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit, AfterC } } - // TODO + // TODO: Handle min/max ngAfterContentInit(): void { if (this.control && this.control.hasValidator(Validators.required)) { this.control.removeValidators([Validators.required]); @@ -115,9 +115,10 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit, AfterC this.hasFocus = Array.from(classList).includes('ProseMirror-focused') ? true : false; // TODO - if (this.control && this.hasRequiredValidator && !this.hasFocus) { + if (!this.hasFocus && this.control && !this.control.hasValidator(Validators.required) && this.hasRequiredValidator) { this.control.addValidators([Validators.required]); this.control.updateValueAndValidity(); + this.updateCharacterCount(this.html); } } }); @@ -143,13 +144,30 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit, AfterC } updateCharacterCount(content: string) { - this.debounceService.debounce(() => { - this.characterCount = this.countCharactersInsideHTML(content); - if (this.characterCount === 0) { - this.html = ''; - this.onInputChange(this.html); + this.characterCount = this.countCharactersInsideHTML(content); + + if (this.characterCount === 0) { + this.html = ''; + this.onInputChange(this.html); + } + + if (this.control) { + if (this.characterCount > this.maxCharacters){ + this.control.setErrors({ + maxlength: { + requiredLength: this.maxCharacters + } + }); + this.control.markAsTouched(); + } else if (this.characterCount < this.minCharacters) { + this.control.setErrors({ + minlength: { + requiredLength: this.minCharacters + } + }); + this.control.markAsTouched(); } - }, 250); + } } onLangChange(): void { diff --git a/src/app/shared/components/poll-form/poll-form.component.ts b/src/app/shared/components/poll-form/poll-form.component.ts index 00fc024c..444172aa 100644 --- a/src/app/shared/components/poll-form/poll-form.component.ts +++ b/src/app/shared/components/poll-form/poll-form.component.ts @@ -67,7 +67,7 @@ export class PollFormComponent implements OnInit { } } -export class MyErrorStateMatcher implements ErrorStateMatcher { +class MyErrorStateMatcher implements ErrorStateMatcher { isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean { const isSubmitted = form && form.submitted; return !!(control && control.invalid && (control.dirty || control.touched || isSubmitted)); diff --git a/src/app/shared/components/post-form/post-form.component.html b/src/app/shared/components/post-form/post-form.component.html index 7d188b24..3ad45dbe 100644 --- a/src/app/shared/components/post-form/post-form.component.html +++ b/src/app/shared/components/post-form/post-form.component.html @@ -1,11 +1,13 @@
+ + formControlName="description" + [control]="$any(form).controls['description']"> From 303fa02876a1d03bd0932339870c2f946584bfc9 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Thu, 19 Oct 2023 12:23:02 -0400 Subject: [PATCH 041/165] - update form validation in blog-form - created focus tracking service - added blur to app-button --- src/app/app.component.ts | 1 - .../services/focus-tracking.service.spec.ts | 16 ++++++++ .../core/services/focus-tracking.service.ts | 23 +++++++++++ .../blog-form/blog-form.component.html | 4 +- .../blog-form/blog-form.component.scss | 4 ++ .../blog-form/blog-form.component.ts | 39 ++++++++++++++++--- .../components/button/button.component.html | 21 ++++++---- .../components/button/button.component.ts | 4 +- .../components/editor/editor.component.html | 4 +- .../post-form/post-form.component.ts | 2 +- src/app/shared/models/theme.ts | 7 ++++ 11 files changed, 107 insertions(+), 18 deletions(-) create mode 100644 src/app/core/services/focus-tracking.service.spec.ts create mode 100644 src/app/core/services/focus-tracking.service.ts create mode 100644 src/app/shared/models/theme.ts diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 11f3097d..68991706 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -9,7 +9,6 @@ import { TranslateService } from "@ngx-translate/core"; import { LanguageStorageService } from './core/services/language-storage.service'; import { Translations } from './core/services/translations.service'; - @Component({ selector: 'app-root', templateUrl: './app.component.html', diff --git a/src/app/core/services/focus-tracking.service.spec.ts b/src/app/core/services/focus-tracking.service.spec.ts new file mode 100644 index 00000000..977df303 --- /dev/null +++ b/src/app/core/services/focus-tracking.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { FocusTrackingService } from './focus-tracking.service'; + +describe('FocusTrackingService', () => { + let service: FocusTrackingService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(FocusTrackingService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/core/services/focus-tracking.service.ts b/src/app/core/services/focus-tracking.service.ts new file mode 100644 index 00000000..13cf8d97 --- /dev/null +++ b/src/app/core/services/focus-tracking.service.ts @@ -0,0 +1,23 @@ +import { Injectable } from '@angular/core'; +import { Observable, Subject } from 'rxjs'; + +@Injectable({ + providedIn: 'root' +}) +export class FocusTrackingService { + private appFocusSubject = new Subject(); + + constructor() { + this.setupFocusListener(); + } + + private setupFocusListener() { + window.addEventListener('focus', () => { + this.appFocusSubject.next(true); + }); + } + + getAppFocusObservable(): Observable { + return this.appFocusSubject.asObservable(); + } +} diff --git a/src/app/shared/components/blog-form/blog-form.component.html b/src/app/shared/components/blog-form/blog-form.component.html index 0463455d..17d44c35 100644 --- a/src/app/shared/components/blog-form/blog-form.component.html +++ b/src/app/shared/components/blog-form/blog-form.component.html @@ -24,9 +24,11 @@
+ [onClick]="clickCallback" + [onBlur]="blurCallback"> {{ coverPhoto ? coverPhoto.name : 'Upload a cover photo'}} + *
diff --git a/src/app/shared/components/blog-form/blog-form.component.scss b/src/app/shared/components/blog-form/blog-form.component.scss index f979b6f6..13ee2fac 100644 --- a/src/app/shared/components/blog-form/blog-form.component.scss +++ b/src/app/shared/components/blog-form/blog-form.component.scss @@ -15,6 +15,10 @@ border-color: $error-red; } + .required-star { + color: $error-red; + } + mat-error { position: absolute; padding-left: 16px; diff --git a/src/app/shared/components/blog-form/blog-form.component.ts b/src/app/shared/components/blog-form/blog-form.component.ts index fa8104eb..87ce92a9 100644 --- a/src/app/shared/components/blog-form/blog-form.component.ts +++ b/src/app/shared/components/blog-form/blog-form.component.ts @@ -1,13 +1,15 @@ -import { Component, ElementRef, Input, ViewChild } from '@angular/core'; +import { Component, ElementRef, Input, OnDestroy, OnInit, ViewChild } from '@angular/core'; import { FormControl, FormGroup, FormGroupDirective, NgForm, Validators } from '@angular/forms'; import { ErrorStateMatcher } from '@angular/material/core'; +import { Subscription } from 'rxjs'; +import { FocusTrackingService } from 'src/app/core/services/focus-tracking.service'; @Component({ selector: 'app-blog-form', templateUrl: './blog-form.component.html', styleUrls: ['./blog-form.component.scss'], }) -export class BlogFormComponent { +export class BlogFormComponent implements OnInit, OnDestroy { @Input() form: FormGroup = new FormGroup({}); @Input() model: IBlogForm = { name: '', @@ -25,17 +27,45 @@ export class BlogFormComponent { maxCoverPhotoSize: number = 3145728; maxBlogLength: number = 2000; + clickCallback: Function = this.openFilePicker.bind(this); + blurCallback: Function = this.onPhotoBlur.bind(this); + filePickerHasOpened: boolean = false; + appInFocus: boolean = true; + + private focusSub!: Subscription; + + constructor(private focusTrackingService: FocusTrackingService) { + + } + ngOnInit(): void { if (Object.keys(this.form.controls).length === 0) { for (const [key, value] of Object.entries(this.model)) { this.form.addControl(key, new FormControl(value, [Validators.required])); } } + + this.focusSub = this.focusTrackingService.getAppFocusObservable().subscribe((isInFocus) => { + this.appInFocus = isInFocus; + if (isInFocus && this.filePickerHasOpened) { + this.form.controls['coverPhoto'].markAsTouched(); + } + }); + } + + ngOnDestroy(): void { + if (this.focusSub) + this.focusSub.unsubscribe(); } - openFilePicker() { + openFilePicker(): void { + this.filePickerHasOpened = true; this.fileInput.nativeElement.click(); - this.form.controls['coverPhoto'].markAsTouched(); + } + + onPhotoBlur(): void { + if (this.appInFocus && !this.filePickerHasOpened) + this.form.controls['coverPhoto'].markAsTouched(); } onFileSelected(event: any): void { @@ -87,7 +117,6 @@ export interface IBlogForm { description: string; } - class MyErrorStateMatcher implements ErrorStateMatcher { isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean { const isSubmitted = form && form.submitted; diff --git a/src/app/shared/components/button/button.component.html b/src/app/shared/components/button/button.component.html index 9417ce9f..02ba4955 100644 --- a/src/app/shared/components/button/button.component.html +++ b/src/app/shared/components/button/button.component.html @@ -14,7 +14,8 @@ [color]="matColor" [ngStyle]="{ 'font-size': fontSize }" [attr.theme]="theme" - (click)="onClick()"> + (click)="onClick()" + (blur)="onBlur()">
+ (click)="onClick()" + (blur)="onBlur()">
+ (click)="onClick()" + (blur)="onBlur()">
+ (click)="onClick()" + (blur)="onBlur()">
+ (click)="onClick()" + (blur)="onBlur()">
+ (click)="onClick()" + (blur)="onBlur()">
+ (click)="onClick()" + (blur)="onBlur()">
{}; + @Input() onBlur: Function = () => {}; public materialButtonType = MaterialButtonType; diff --git a/src/app/shared/components/editor/editor.component.html b/src/app/shared/components/editor/editor.component.html index b76206fd..73d95c77 100644 --- a/src/app/shared/components/editor/editor.component.html +++ b/src/app/shared/components/editor/editor.component.html @@ -40,11 +40,11 @@ - {{ translations.input.error.minLength | translate }} {{ control.errors!['minlength'].requiredLength }} + {{ translations.input.error.minLength | translate }} {{ control.errors!['minlength'].requiredLength }}. - {{ translations.input.error.maxLength | translate }} {{ control.errors!['maxlength'].requiredLength }} + {{ translations.input.error.maxLength | translate }} {{ control.errors!['maxlength'].requiredLength }}. diff --git a/src/app/shared/components/post-form/post-form.component.ts b/src/app/shared/components/post-form/post-form.component.ts index de3cda4d..855022a4 100644 --- a/src/app/shared/components/post-form/post-form.component.ts +++ b/src/app/shared/components/post-form/post-form.component.ts @@ -12,7 +12,7 @@ export class PostFormComponent { description: '' } - minLength: number = 1; + minLength: number = 3; maxLength: number = 240; constructor() { diff --git a/src/app/shared/models/theme.ts b/src/app/shared/models/theme.ts new file mode 100644 index 00000000..39aa4259 --- /dev/null +++ b/src/app/shared/models/theme.ts @@ -0,0 +1,7 @@ +export enum Theme { + Primary1 = 'primary-1', + Primary2 = 'primary-2', + Secondary1 = 'secondary-1', + Secondary2 = 'secondary-2', + Error = 'error' +} \ No newline at end of file From 2975f9a37ffc41d8813c276648cdfed27f519527 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Thu, 19 Oct 2023 13:12:06 -0400 Subject: [PATCH 042/165] file truncate pipe --- src/app/core/core.module.ts | 1 - .../blog-form/blog-form.component.html | 2 +- .../pipes/truncate-file-name.pipe.spec.ts | 8 +++++++ .../shared/pipes/truncate-file-name.pipe.ts | 21 +++++++++++++++++++ src/app/shared/shared.module.ts | 4 ++++ 5 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 src/app/shared/pipes/truncate-file-name.pipe.spec.ts create mode 100644 src/app/shared/pipes/truncate-file-name.pipe.ts diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts index 20a210eb..395625c9 100644 --- a/src/app/core/core.module.ts +++ b/src/app/core/core.module.ts @@ -9,7 +9,6 @@ import { HttpClient } from '@angular/common/http'; import { TypescriptLoader } from './helpers/typescript-loader'; @NgModule({ - declarations: [], imports: [ CommonModule, AuthConfigModule, diff --git a/src/app/shared/components/blog-form/blog-form.component.html b/src/app/shared/components/blog-form/blog-form.component.html index 17d44c35..34ade716 100644 --- a/src/app/shared/components/blog-form/blog-form.component.html +++ b/src/app/shared/components/blog-form/blog-form.component.html @@ -27,7 +27,7 @@ [onClick]="clickCallback" [onBlur]="blurCallback"> - {{ coverPhoto ? coverPhoto.name : 'Upload a cover photo'}} + {{ coverPhoto ? (coverPhoto.name | truncateFileName: 18) : 'Upload a cover photo'}} *
diff --git a/src/app/shared/pipes/truncate-file-name.pipe.spec.ts b/src/app/shared/pipes/truncate-file-name.pipe.spec.ts new file mode 100644 index 00000000..f998c713 --- /dev/null +++ b/src/app/shared/pipes/truncate-file-name.pipe.spec.ts @@ -0,0 +1,8 @@ +import { TruncateFileNamePipe } from './truncate-file-name.pipe'; + +describe('TruncateFileNamePipe', () => { + it('create an instance', () => { + const pipe = new TruncateFileNamePipe(); + expect(pipe).toBeTruthy(); + }); +}); diff --git a/src/app/shared/pipes/truncate-file-name.pipe.ts b/src/app/shared/pipes/truncate-file-name.pipe.ts new file mode 100644 index 00000000..9ba826a2 --- /dev/null +++ b/src/app/shared/pipes/truncate-file-name.pipe.ts @@ -0,0 +1,21 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +@Pipe({ + name: 'truncateFileName' +}) +export class TruncateFileNamePipe implements PipeTransform { + transform(fileName: string, maxLength: number): string { + const extension = fileName.split('.').pop(); + + if (extension) { + if (fileName.length - extension.length <= maxLength) { + return fileName; + } + const truncatedName = fileName.substring(0, maxLength); + + return `${truncatedName}...${extension}`; + } + + return fileName; + } +} diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index 045babe6..60f68b61 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -39,6 +39,8 @@ import { BlogFormComponent } from './components/blog-form/blog-form.component'; import { EventFormComponent } from './components/event-form/event-form.component'; import { PollFormComponent } from './components/poll-form/poll-form.component'; +import { TruncateFileNamePipe } from './pipes/truncate-file-name.pipe'; + @NgModule({ declarations: [ @@ -60,6 +62,7 @@ import { PollFormComponent } from './components/poll-form/poll-form.component'; BlogFormComponent, EventFormComponent, PollFormComponent, + TruncateFileNamePipe ], imports: [ CommonModule, @@ -108,6 +111,7 @@ import { PollFormComponent } from './components/poll-form/poll-form.component'; BlogFormComponent, EventFormComponent, PollFormComponent, + TruncateFileNamePipe ], providers: [ { From 75c773eca0ca35b19b28fd0af53e109885199d0e Mon Sep 17 00:00:00 2001 From: doug0102 Date: Thu, 19 Oct 2023 13:18:46 -0400 Subject: [PATCH 043/165] reset forms on destroy --- .../shared/components/blog-form/blog-form.component.ts | 2 ++ .../shared/components/event-form/event-form.component.ts | 8 ++++++-- .../shared/components/poll-form/poll-form.component.ts | 8 ++++++-- .../shared/components/post-form/post-form.component.ts | 8 ++++++-- 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/app/shared/components/blog-form/blog-form.component.ts b/src/app/shared/components/blog-form/blog-form.component.ts index 87ce92a9..b4310596 100644 --- a/src/app/shared/components/blog-form/blog-form.component.ts +++ b/src/app/shared/components/blog-form/blog-form.component.ts @@ -56,6 +56,8 @@ export class BlogFormComponent implements OnInit, OnDestroy { ngOnDestroy(): void { if (this.focusSub) this.focusSub.unsubscribe(); + + this.form.reset(); } openFilePicker(): void { diff --git a/src/app/shared/components/event-form/event-form.component.ts b/src/app/shared/components/event-form/event-form.component.ts index 45c6b25c..5cfee9d8 100644 --- a/src/app/shared/components/event-form/event-form.component.ts +++ b/src/app/shared/components/event-form/event-form.component.ts @@ -1,4 +1,4 @@ -import { Component, Input } from '@angular/core'; +import { Component, Input, OnDestroy, OnInit } from '@angular/core'; import { FormControl, FormGroup, Validators } from '@angular/forms'; @Component({ @@ -6,7 +6,7 @@ import { FormControl, FormGroup, Validators } from '@angular/forms'; templateUrl: './event-form.component.html', styleUrls: ['./event-form.component.scss'] }) -export class EventFormComponent { +export class EventFormComponent implements OnInit, OnDestroy { @Input() form: FormGroup = new FormGroup({}); @Input() model: IEventForm = { description: '' @@ -19,6 +19,10 @@ export class EventFormComponent { } } } + + ngOnDestroy(): void { + this.form.reset(); + } } export interface IEventForm { diff --git a/src/app/shared/components/poll-form/poll-form.component.ts b/src/app/shared/components/poll-form/poll-form.component.ts index 444172aa..3507d988 100644 --- a/src/app/shared/components/poll-form/poll-form.component.ts +++ b/src/app/shared/components/poll-form/poll-form.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, OnInit } from '@angular/core'; +import { Component, Input, OnDestroy, OnInit } from '@angular/core'; import { TooltipDirection } from '../../models/tooltip-direction'; import { FormControl, FormGroup, FormGroupDirective, NgForm, Validators } from '@angular/forms'; import { ErrorStateMatcher } from '@angular/material/core'; @@ -8,7 +8,7 @@ import { ErrorStateMatcher } from '@angular/material/core'; templateUrl: './poll-form.component.html', styleUrls: ['./poll-form.component.scss'] }) -export class PollFormComponent implements OnInit { +export class PollFormComponent implements OnInit, OnDestroy { @Input() form: FormGroup = new FormGroup({}); @Input() model: IPollForm = { description: '', @@ -48,6 +48,10 @@ export class PollFormComponent implements OnInit { } } + ngOnDestroy(): void { + this.form.reset(); + } + addOption(): void { if (this.model.options.length < this.maxOptions) { this.model.options.push({id: this.model.options.length, value: ''}); diff --git a/src/app/shared/components/post-form/post-form.component.ts b/src/app/shared/components/post-form/post-form.component.ts index 855022a4..467ab9ff 100644 --- a/src/app/shared/components/post-form/post-form.component.ts +++ b/src/app/shared/components/post-form/post-form.component.ts @@ -1,4 +1,4 @@ -import { Component, Input } from '@angular/core'; +import { Component, Input, OnDestroy, OnInit } from '@angular/core'; import { FormControl, FormGroup, Validators } from '@angular/forms'; @Component({ @@ -6,7 +6,7 @@ import { FormControl, FormGroup, Validators } from '@angular/forms'; templateUrl: './post-form.component.html', styleUrls: ['./post-form.component.scss'] }) -export class PostFormComponent { +export class PostFormComponent implements OnInit, OnDestroy { @Input() form: FormGroup = new FormGroup({}); @Input() model: IPostForm = { description: '' @@ -33,6 +33,10 @@ export class PostFormComponent { ); } + ngOnDestroy(): void { + this.form.reset(); + } + onSubmit() { console.log(this.form.value); } From 30667ca8fdd3251d23fa9ae2354b11276ffbc4f0 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Thu, 19 Oct 2023 16:11:55 -0400 Subject: [PATCH 044/165] photo dimensions validation for blog cover photo --- .../blog-form/blog-form.component.ts | 81 +++++++++++++++---- .../components/editor/editor.component.ts | 20 ++--- .../poll-form/poll-form.component.ts | 2 +- 3 files changed, 76 insertions(+), 27 deletions(-) diff --git a/src/app/shared/components/blog-form/blog-form.component.ts b/src/app/shared/components/blog-form/blog-form.component.ts index b4310596..6064d4a8 100644 --- a/src/app/shared/components/blog-form/blog-form.component.ts +++ b/src/app/shared/components/blog-form/blog-form.component.ts @@ -26,6 +26,8 @@ export class BlogFormComponent implements OnInit, OnDestroy { coverPhotoError: string | undefined; maxCoverPhotoSize: number = 3145728; maxBlogLength: number = 2000; + maxPhotoWidth: number = 1200; + maxPhotoHeight: number = 800; clickCallback: Function = this.openFilePicker.bind(this); blurCallback: Function = this.onPhotoBlur.bind(this); @@ -74,29 +76,35 @@ export class BlogFormComponent implements OnInit, OnDestroy { const selectedFile: File = event.target.files[0]; if (selectedFile) { - if (selectedFile.size <= this.maxCoverPhotoSize) { - this.displaySelectedImage(selectedFile).then((dataURL) => { - this.coverPhoto = selectedFile; - this.model.coverPhoto = dataURL; - this.form.controls['coverPhoto'].setValue(this.model.coverPhoto); - this.coverPhotoError = undefined; - }).catch((error) => { - this.coverPhotoError = "Error reading the image." + error; - console.error(error); - }); + if (!this.isImage(selectedFile.name)) { + this.setImageError("The file selected doesn't have an accepted image extension."); + } + else if (selectedFile.size > this.maxCoverPhotoSize) { + this.setImageError("Photo is too large. Maximum size allowed is " + this.maxCoverPhotoSize / 1024 + " KB."); } else { - this.coverPhoto = undefined; - this.model.coverPhoto = ''; - this.form.controls['coverPhoto'].setValue(this.model.coverPhoto); - this.coverPhotoError = "Photo is too large. Maximum size allowed is " + this.maxCoverPhotoSize / 1024 + " KB."; + this.isCorrectDimensions(selectedFile, this.maxPhotoWidth, this.maxPhotoHeight).then((valid) => { + + if (!valid) + return this.setImageError("Photo dimensions have a maximum of " + this.maxPhotoWidth + "x" + this.maxPhotoHeight + "."); + + this.loadImage(selectedFile).then((dataURL) => { + this.coverPhoto = selectedFile; + this.model.coverPhoto = dataURL; + this.form.controls['coverPhoto'].setValue(this.model.coverPhoto); + this.coverPhotoError = undefined; + }).catch((error) => { + this.setImageError("Error reading the image." + error); + console.error(error); + }); + }); } } - + this.form.controls['coverPhoto'].markAsTouched(); } - displaySelectedImage(file: File): Promise { + private loadImage(file: File): Promise { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onload = (event) => { @@ -109,6 +117,43 @@ export class BlogFormComponent implements OnInit, OnDestroy { reader.readAsDataURL(file); }); } + + private isImage(fileName: string): boolean { + const fileExtension = fileName.split('.').pop(); + + if (!fileExtension) + return false; + + const imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'tiff', 'svg']; + return imageExtensions.includes(fileExtension.toLowerCase()); + } + + private isCorrectDimensions(file: File, maxWidth: number, maxHeight: number): Promise { + return new Promise((resolve) => { + const img = new Image(); + + img.onload = () => { + debugger; + const width = img.width; + const height = img.height; + + if (width <= maxWidth && height <= maxHeight) { + resolve(true); + } else { + resolve(false); + } + }; + + img.src = URL.createObjectURL(file); + }); + } + + private setImageError(error: string): void { + this.coverPhoto = undefined; + this.model.coverPhoto = ''; + this.form.controls['coverPhoto'].setValue(this.model.coverPhoto); + this.coverPhotoError = error; + } } export interface IBlogForm { @@ -125,3 +170,7 @@ class MyErrorStateMatcher implements ErrorStateMatcher { return !!(control && control.invalid && (control.dirty || control.touched || isSubmitted)); } } +function resolve(arg0: boolean) { + throw new Error('Function not implemented.'); +} + diff --git a/src/app/shared/components/editor/editor.component.ts b/src/app/shared/components/editor/editor.component.ts index 16bf4764..1ec07d6f 100644 --- a/src/app/shared/components/editor/editor.component.ts +++ b/src/app/shared/components/editor/editor.component.ts @@ -6,7 +6,6 @@ import { Subscription } from 'rxjs/internal/Subscription'; import { Translations } from 'src/app/core/services/translations.service'; import { ControlValueAccessor, FormControl, NG_VALUE_ACCESSOR, Validators } from '@angular/forms'; import { TooltipDirection } from '../../models/tooltip-direction'; -import { DebounceService } from 'src/app/core/services/debounce.service'; // https://sibiraj-s.github.io/ngx-editor/en/introduction/ @Component({ @@ -70,8 +69,7 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit, AfterC public translations: Translations, private translateService: TranslateService, private ngxEditorService: NgxEditorService, - private elementRef: ElementRef, - private debounceService: DebounceService + private elementRef: ElementRef ) { this.editor = new Editor({ history: true, @@ -326,13 +324,15 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit, AfterC let count = 0; let insideTag = false; - for (let i = 0; i < html.length; i++) { - if (html[i] === '<') { - insideTag = true; - } else if (html[i] === '>') { - insideTag = false; - } else if (!insideTag) { - count++; + if (html) { + for (let i = 0; i < html.length; i++) { + if (html[i] === '<') { + insideTag = true; + } else if (html[i] === '>') { + insideTag = false; + } else if (!insideTag) { + count++; + } } } diff --git a/src/app/shared/components/poll-form/poll-form.component.ts b/src/app/shared/components/poll-form/poll-form.component.ts index 3507d988..3278e936 100644 --- a/src/app/shared/components/poll-form/poll-form.component.ts +++ b/src/app/shared/components/poll-form/poll-form.component.ts @@ -33,7 +33,7 @@ export class PollFormComponent implements OnInit, OnDestroy { this.model.description, [ Validators.required, - Validators.minLength(this.minLength), + //Validators.minLength(this.minLength), Validators.maxLength(this.maxLength), ] ) From 745dcd3b46f893e8a85a56bb55ed05a386f79910 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Thu, 19 Oct 2023 16:17:22 -0400 Subject: [PATCH 045/165] remove debugger --- .../blog-form/blog-form.component.ts | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/src/app/shared/components/blog-form/blog-form.component.ts b/src/app/shared/components/blog-form/blog-form.component.ts index 6064d4a8..17fc1658 100644 --- a/src/app/shared/components/blog-form/blog-form.component.ts +++ b/src/app/shared/components/blog-form/blog-form.component.ts @@ -24,18 +24,19 @@ export class BlogFormComponent implements OnInit, OnDestroy { coverPhoto: File | undefined; coverPhotoError: string | undefined; - maxCoverPhotoSize: number = 3145728; maxBlogLength: number = 2000; - maxPhotoWidth: number = 1200; - maxPhotoHeight: number = 800; clickCallback: Function = this.openFilePicker.bind(this); blurCallback: Function = this.onPhotoBlur.bind(this); - filePickerHasOpened: boolean = false; - appInFocus: boolean = true; + private filePickerHasOpened: boolean = false; + private appInFocus: boolean = true; private focusSub!: Subscription; + private maxCoverPhotoSize: number = 3145728; + private coverPhotoMaxWidth: number = 1200; + private coverPhotoMaxHeight: number = 800; + constructor(private focusTrackingService: FocusTrackingService) { } @@ -83,10 +84,10 @@ export class BlogFormComponent implements OnInit, OnDestroy { this.setImageError("Photo is too large. Maximum size allowed is " + this.maxCoverPhotoSize / 1024 + " KB."); } else { - this.isCorrectDimensions(selectedFile, this.maxPhotoWidth, this.maxPhotoHeight).then((valid) => { + this.isCorrectDimensions(selectedFile, this.coverPhotoMaxWidth, this.coverPhotoMaxHeight).then((valid) => { if (!valid) - return this.setImageError("Photo dimensions have a maximum of " + this.maxPhotoWidth + "x" + this.maxPhotoHeight + "."); + return this.setImageError("Photo dimensions have a maximum of " + this.coverPhotoMaxWidth + "x" + this.coverPhotoMaxHeight + "."); this.loadImage(selectedFile).then((dataURL) => { this.coverPhoto = selectedFile; @@ -133,7 +134,6 @@ export class BlogFormComponent implements OnInit, OnDestroy { const img = new Image(); img.onload = () => { - debugger; const width = img.width; const height = img.height; @@ -170,7 +170,3 @@ class MyErrorStateMatcher implements ErrorStateMatcher { return !!(control && control.invalid && (control.dirty || control.touched || isSubmitted)); } } -function resolve(arg0: boolean) { - throw new Error('Function not implemented.'); -} - From f6a06bed34f9cddc47c1d0879d3ef333d2aced47 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Fri, 20 Oct 2023 12:13:32 -0400 Subject: [PATCH 046/165] save feature for make a post --- .../components/post/post.component.html | 11 ++- .../profile/components/post/post.component.ts | 81 ++++++++++++++++--- .../blog-form/blog-form.component.html | 4 +- .../blog-form/blog-form.component.ts | 7 +- .../components/input/input.component.html | 2 +- 5 files changed, 86 insertions(+), 19 deletions(-) diff --git a/src/app/features/profile/components/post/post.component.html b/src/app/features/profile/components/post/post.component.html index b29d4d5d..ca4af2ee 100644 --- a/src/app/features/profile/components/post/post.component.html +++ b/src/app/features/profile/components/post/post.component.html @@ -43,7 +43,7 @@ @@ -75,7 +75,14 @@ -
+
+ + Save + +
{ + this.formChanges.push(false); + this.formWatchSubs.push( + formGroup.valueChanges.subscribe(() =>{ + this.formChanges[this.selectedIndex] = true; + }) + ); + }); + } + + ngOnDestroy(): void { + this.formWatchSubs.forEach(formWatch => { + if (formWatch) + formWatch.unsubscribe(); + }); } onTabChange(event: MatTabChangeEvent): void { - this.selectedForm = this.formGroups[event.index]; + this.selectedIndex = event.index; + this.selectedForm = this.formGroups[this.selectedIndex]; } toggleEditing(event: Event) { - if ((event instanceof KeyboardEvent && (event.key == 'Enter' || event.key == 'Space')) || event instanceof KeyboardEvent == false) + if ((event instanceof KeyboardEvent && (event.key == 'Enter' || event.key == 'Space')) || event instanceof KeyboardEvent == false) { this.editing = !this.editing; + this.selectedIndex = 0; + this.selectedForm = this.formGroups[this.selectedIndex]; + } + } + + formHasValues(formGroup: FormGroup): boolean { + return Object.keys(formGroup.value).some(k => !!formGroup.value[k]); } formReady(formGroup: FormGroup): boolean { @@ -55,9 +82,41 @@ export class PostComponent implements OnInit { return allControlsValid; } + save(): void { + const formGroupJSON = JSON.stringify(this.formGroups[this.selectedIndex].value); + this.sessionStorageService.write('gccollab-make-a-' + this.getTypeFromIndex(this.selectedIndex), formGroupJSON); + this.formChanges[this.selectedIndex] = false; + } + + load(): void { + const savedFormGroupJSON = this.sessionStorageService.read('gccollab-make-a-' + this.getTypeFromIndex(this.selectedIndex)); + if (savedFormGroupJSON) { + const savedFormData = JSON.parse(savedFormGroupJSON); + for (const [key] of Object.entries(this.selectedForm.controls)) { + this.selectedForm.controls[key].setValue(savedFormData[key]); + } + this.formChanges[this.selectedIndex] = false; + } + } + submit(): void { - console.log(this.selectedForm); + this.sessionStorageService.remove('gccollab-make-a-' + this.getTypeFromIndex(this.selectedIndex)); + this.toggleEditing(new Event('')); } + private getTypeFromIndex(index: number): string { + switch(index) { + case 0: + return "post"; + case 1: + return "blog"; + case 2: + return "event"; + case 3: + return "poll"; + default: + return "error"; + } + } } diff --git a/src/app/shared/components/blog-form/blog-form.component.html b/src/app/shared/components/blog-form/blog-form.component.html index 34ade716..18d98be5 100644 --- a/src/app/shared/components/blog-form/blog-form.component.html +++ b/src/app/shared/components/blog-form/blog-form.component.html @@ -27,8 +27,8 @@ [onClick]="clickCallback" [onBlur]="blurCallback"> - {{ coverPhoto ? (coverPhoto.name | truncateFileName: 18) : 'Upload a cover photo'}} - * + {{ $any(form).controls['coverPhoto'].value ? ($any(form).controls['coverPhotoName'].value | truncateFileName: 18) :'Upload a cover photo'}} + *
diff --git a/src/app/shared/components/blog-form/blog-form.component.ts b/src/app/shared/components/blog-form/blog-form.component.ts index 17fc1658..01a08877 100644 --- a/src/app/shared/components/blog-form/blog-form.component.ts +++ b/src/app/shared/components/blog-form/blog-form.component.ts @@ -15,6 +15,7 @@ export class BlogFormComponent implements OnInit, OnDestroy { name: '', publisher: '', coverPhoto: '', + coverPhotoName: '', coverPhotoAlt: '', description: '' } @@ -22,7 +23,6 @@ export class BlogFormComponent implements OnInit, OnDestroy { @ViewChild('gccBlogCoverPhotoInput') fileInput!: ElementRef; errorStateMatcher = new MyErrorStateMatcher(); - coverPhoto: File | undefined; coverPhotoError: string | undefined; maxBlogLength: number = 2000; @@ -90,9 +90,9 @@ export class BlogFormComponent implements OnInit, OnDestroy { return this.setImageError("Photo dimensions have a maximum of " + this.coverPhotoMaxWidth + "x" + this.coverPhotoMaxHeight + "."); this.loadImage(selectedFile).then((dataURL) => { - this.coverPhoto = selectedFile; this.model.coverPhoto = dataURL; this.form.controls['coverPhoto'].setValue(this.model.coverPhoto); + this.form.controls['coverPhotoName'].setValue(selectedFile.name); this.coverPhotoError = undefined; }).catch((error) => { this.setImageError("Error reading the image." + error); @@ -149,9 +149,9 @@ export class BlogFormComponent implements OnInit, OnDestroy { } private setImageError(error: string): void { - this.coverPhoto = undefined; this.model.coverPhoto = ''; this.form.controls['coverPhoto'].setValue(this.model.coverPhoto); + this.form.controls['coverPhotoName'].setValue(''); this.coverPhotoError = error; } } @@ -160,6 +160,7 @@ export interface IBlogForm { name: string; publisher: string; coverPhoto: string; + coverPhotoName: string; coverPhotoAlt: string; description: string; } diff --git a/src/app/shared/components/input/input.component.html b/src/app/shared/components/input/input.component.html index 9d9b81d6..1c55251e 100644 --- a/src/app/shared/components/input/input.component.html +++ b/src/app/shared/components/input/input.component.html @@ -1,5 +1,5 @@
- + {{ label }}
*
Date: Wed, 25 Oct 2023 17:13:49 -0400 Subject: [PATCH 047/165] wip --- src/app/core/services/event.service.ts | 28 +++++++++++ .../event-card/event-card.component.html | 46 +++++++++++++++++-- .../event-card/event-card.component.scss | 35 +++++++++++++- src/app/features/events/models/event.ts | 2 + 4 files changed, 106 insertions(+), 5 deletions(-) diff --git a/src/app/core/services/event.service.ts b/src/app/core/services/event.service.ts index 7e4f44da..ba6275eb 100644 --- a/src/app/core/services/event.service.ts +++ b/src/app/core/services/event.service.ts @@ -91,6 +91,8 @@ export class EventService { event.startDate = this.randomDate(); event.endDate = this.randomDate(); event.image = this.randomImage(); + event.displayPicture = this.randomDisplayPicture(); + event.organizer = this.randomOrganizer(); this.id++; @@ -160,4 +162,30 @@ export class EventService { return images[Math.floor(Math.random() * images.length)]; } + private randomDisplayPicture(): string { + const urls: string[] = [ + 'https://images.unsplash.com/photo-1540573133985-87b6da6d54a9?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1476&q=80', + 'https://images.unsplash.com/photo-1593871075120-982e042088d8?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1471&q=80', + 'https://images.unsplash.com/photo-1551884831-bbf3cdc6469e?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1274&q=80', + 'https://images.unsplash.com/photo-1556997685-309989c1aa82?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxzZWFyY2h8Nnx8ZnVubnklMjBhbmltYWxzfGVufDB8fDB8fHww&auto=format&fit=crop&w=900&q=60', + 'https://images.unsplash.com/photo-1522435229388-6f7a422cd95b?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1470&q=80', + 'https://images.unsplash.com/photo-1636370395847-e0781efa45e6?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1494&q=80', + 'https://images.unsplash.com/photo-1587920149371-ac728dd20da4?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1872&q=80', + 'https://images.unsplash.com/photo-1597237154674-1a0d2274cef4?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1374&q=80', + 'https://images.unsplash.com/photo-1504006833117-8886a355efbf?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1470&q=80', + 'https://images.unsplash.com/photo-1546807742-e44ac98e1e4b?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1470&q=80' + ]; + return urls[Math.floor(Math.random() * urls.length)]; + } + + private randomOrganizer(): string { + const organizers: string[] = [ + 'TBS', + 'ESDC', + 'CRA', + 'SSC', + 'NRCC' + ]; + return organizers[Math.floor(Math.random() * organizers.length)]; + } } diff --git a/src/app/features/events/components/event-card/event-card.component.html b/src/app/features/events/components/event-card/event-card.component.html index 34052977..4bbd6883 100644 --- a/src/app/features/events/components/event-card/event-card.component.html +++ b/src/app/features/events/components/event-card/event-card.component.html @@ -61,11 +61,51 @@ - - + + + +
+ + +
+ +
+
+
+ + +
+
+
+ +
+ {{ model?.title }} +
+ +
+ Organizer: {{ model?.organizer }} +
+ +
+ Location: {{ model?.location?.address }} +
+ +
+
-
\ No newline at end of file +
+ + + + \ No newline at end of file diff --git a/src/app/features/events/components/event-card/event-card.component.scss b/src/app/features/events/components/event-card/event-card.component.scss index 3fbe979e..bf3c02da 100644 --- a/src/app/features/events/components/event-card/event-card.component.scss +++ b/src/app/features/events/components/event-card/event-card.component.scss @@ -7,6 +7,33 @@ box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25); border-radius: 10px; + mat-card-header { + .event-image-wrapper { + width: 100%; + height: 140px; + border-radius: 20px; + display: flex; + justify-content: center; + align-items: center; + overflow: hidden; + + img { + width: 100%; + height: 100%; + object-position: center; + object-fit: cover; + } + + ngx-skeleton-loader { + width: 100%; + height: 100%; + + ::ng-deep > div { + height: 100%; + } + } + } + } mat-card-content { display: flex; padding: 20px 12px; @@ -135,11 +162,15 @@ // Small View mat-card.event-card-small { - display: block; // placeholders + display: block; // placeholders } // Large View mat-card.event-card-large { - display: block; // placeholders + .event-content { + .title-larger-text { + font-size: 20px; + } + } } } \ No newline at end of file diff --git a/src/app/features/events/models/event.ts b/src/app/features/events/models/event.ts index 2cfe832e..e30881b9 100644 --- a/src/app/features/events/models/event.ts +++ b/src/app/features/events/models/event.ts @@ -16,6 +16,8 @@ export class Event { canceled: boolean = false; image: string | undefined; group: Group | undefined; + displayPicture: string | undefined; + organizer: string | undefined; confirmed: boolean = false; declined: boolean = false; From 64353875d911ced8af722dff8b40417afcb76712 Mon Sep 17 00:00:00 2001 From: Adi Makkar Date: Wed, 25 Oct 2023 17:15:31 -0400 Subject: [PATCH 048/165] wip --- .../events/components/event-card/event-card.component.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/features/events/components/event-card/event-card.component.scss b/src/app/features/events/components/event-card/event-card.component.scss index bf3c02da..85ccf7cb 100644 --- a/src/app/features/events/components/event-card/event-card.component.scss +++ b/src/app/features/events/components/event-card/event-card.component.scss @@ -169,7 +169,7 @@ mat-card.event-card-large { .event-content { .title-larger-text { - font-size: 20px; + font-size: 18px; } } } From 4cdb403ade1d62dd345b86ddf18a7f3e47ab8daf Mon Sep 17 00:00:00 2001 From: doug0102 Date: Thu, 26 Oct 2023 09:18:14 -0400 Subject: [PATCH 049/165] wip --- src/app/features/profile/components/post/post.component.ts | 2 ++ src/app/shared/components/blog-form/blog-form.component.ts | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/app/features/profile/components/post/post.component.ts b/src/app/features/profile/components/post/post.component.ts index 4d8705ca..ec57e78a 100644 --- a/src/app/features/profile/components/post/post.component.ts +++ b/src/app/features/profile/components/post/post.component.ts @@ -38,7 +38,9 @@ export class PostComponent { ngOnInit(): void { this.formGroups.forEach(formGroup => { + // Create a boolean to track when a FormGroup value has changed this.formChanges.push(false); + // Create a subscription that watches each FormGroup for changes this.formWatchSubs.push( formGroup.valueChanges.subscribe(() =>{ this.formChanges[this.selectedIndex] = true; diff --git a/src/app/shared/components/blog-form/blog-form.component.ts b/src/app/shared/components/blog-form/blog-form.component.ts index 01a08877..f3112c2a 100644 --- a/src/app/shared/components/blog-form/blog-form.component.ts +++ b/src/app/shared/components/blog-form/blog-form.component.ts @@ -101,8 +101,8 @@ export class BlogFormComponent implements OnInit, OnDestroy { }); } } - - this.form.controls['coverPhoto'].markAsTouched(); + else + this.form.controls['coverPhoto'].markAsTouched(); } private loadImage(file: File): Promise { @@ -153,6 +153,7 @@ export class BlogFormComponent implements OnInit, OnDestroy { this.form.controls['coverPhoto'].setValue(this.model.coverPhoto); this.form.controls['coverPhotoName'].setValue(''); this.coverPhotoError = error; + this.form.controls['coverPhoto'].markAsTouched(); } } From 349d6f3bcc3be478b7815b78983664e5460447bf Mon Sep 17 00:00:00 2001 From: doug0102 Date: Thu, 26 Oct 2023 12:58:51 -0400 Subject: [PATCH 050/165] space for errors on blog form --- .../shared/components/blog-form/blog-form.component.scss | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/app/shared/components/blog-form/blog-form.component.scss b/src/app/shared/components/blog-form/blog-form.component.scss index 13ee2fac..8f95e9d6 100644 --- a/src/app/shared/components/blog-form/blog-form.component.scss +++ b/src/app/shared/components/blog-form/blog-form.component.scss @@ -9,6 +9,7 @@ border: 2px solid $neutral-300; border-radius: 10px; margin-bottom: 16px; + margin-top: 5px; } .cover-photo-upload.error { @@ -19,6 +20,14 @@ color: $error-red; } + input + app-input { + ::ng-deep { + .gcc-input-wrapper { + padding-top: 5px; + } + } + } + mat-error { position: absolute; padding-left: 16px; From 06e1525f770f21caebe0b6543259d540b9a8b600 Mon Sep 17 00:00:00 2001 From: Adi Makkar Date: Fri, 27 Oct 2023 09:22:17 -0400 Subject: [PATCH 051/165] wip --- .../event-card/event-card.component.html | 22 +++++++++---------- .../event-card/event-card.component.scss | 8 +++++++ 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/app/features/events/components/event-card/event-card.component.html b/src/app/features/events/components/event-card/event-card.component.html index 4bbd6883..125eed1a 100644 --- a/src/app/features/events/components/event-card/event-card.component.html +++ b/src/app/features/events/components/event-card/event-card.component.html @@ -69,19 +69,17 @@
-
-
- - -
+ + +
- Organizer: {{ model?.organizer }} + Organizer: {{ model?.organizer }}
- Location: {{ model?.location?.address }} + Location: {{ model?.location?.address }}
diff --git a/src/app/features/events/components/event-card/event-card.component.scss b/src/app/features/events/components/event-card/event-card.component.scss index 85ccf7cb..97744139 100644 --- a/src/app/features/events/components/event-card/event-card.component.scss +++ b/src/app/features/events/components/event-card/event-card.component.scss @@ -171,6 +171,14 @@ .title-larger-text { font-size: 18px; } + + .organizer-text { + font-weight: 450; + } + + .location-text { + font-weight: 450; + } } } } \ No newline at end of file From 6d7900f9ca791036bc3b4f2ca6895df798957c36 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Fri, 27 Oct 2023 13:56:59 -0400 Subject: [PATCH 052/165] event form wip --- .../components/post/post.component.html | 4 +- .../profile/components/post/post.component.ts | 8 +- .../components/editor/editor.component.ts | 4 +- .../event-form/event-form.component.html | 163 +++++++++++++++++- .../event-form/event-form.component.scss | 28 +++ .../event-form/event-form.component.ts | 140 ++++++++++++++- src/app/shared/shared.module.ts | 16 +- 7 files changed, 347 insertions(+), 16 deletions(-) diff --git a/src/app/features/profile/components/post/post.component.html b/src/app/features/profile/components/post/post.component.html index ca4af2ee..ef0831f3 100644 --- a/src/app/features/profile/components/post/post.component.html +++ b/src/app/features/profile/components/post/post.component.html @@ -76,7 +76,7 @@
- @@ -84,7 +84,7 @@
- event-form works!

+ + + Type of event +
*
+
+ + + + In-person + + + Hybrid + + + Online + + + + + + + + + + + Language of event/Langue de l'événement +
*
+
+ + + + English + + + French + + + Bilingual + + + + + + + + + + + + + + Event Duration +
*
+
+ + + + One day event + + + Multi-day event + + + +
+ + + + + +
+ +
+ + + + + +
+ + diff --git a/src/app/shared/components/event-form/event-form.component.scss b/src/app/shared/components/event-form/event-form.component.scss index e69de29b..bd463aa5 100644 --- a/src/app/shared/components/event-form/event-form.component.scss +++ b/src/app/shared/components/event-form/event-form.component.scss @@ -0,0 +1,28 @@ +@import "../../../../assets/scss/partials/colors"; + +mat-label { + font-size: 18px; + font-weight: 600; + display: inline-block; + padding-bottom: 8px; + + .required-star { + display: inline-block; + color: $error-red; + } +} + +mat-radio-group { + display: block; + margin-bottom: 16px; +} + +app-editor { + margin-bottom: 16px; +} + +.gcc-date-time-picker { + display: flex; + align-items: flex-end; + gap: 50px; +} \ No newline at end of file diff --git a/src/app/shared/components/event-form/event-form.component.ts b/src/app/shared/components/event-form/event-form.component.ts index 5cfee9d8..5be9275d 100644 --- a/src/app/shared/components/event-form/event-form.component.ts +++ b/src/app/shared/components/event-form/event-form.component.ts @@ -1,5 +1,6 @@ import { Component, Input, OnDestroy, OnInit } from '@angular/core'; -import { FormControl, FormGroup, Validators } from '@angular/forms'; +import { FormControl, FormGroup, FormGroupDirective, NgForm, Validators } from '@angular/forms'; +import { ErrorStateMatcher } from '@angular/material/core'; @Component({ selector: 'app-event-form', @@ -9,9 +10,23 @@ import { FormControl, FormGroup, Validators } from '@angular/forms'; export class EventFormComponent implements OnInit, OnDestroy { @Input() form: FormGroup = new FormGroup({}); @Input() model: IEventForm = { - description: '' + eventType: 'Hybrid', + eventOrganizerName: '', + eventName: '', + eventLanguage: 'Bilingual', + eventDescription: '', + eventLocation: '', + eventOnlinePlatform: '', + eventDuration: '', + eventStartDate: '', + eventEndDate: '' } + eventType = EventType; + eventLanguage = EventLanguage; + eventDuration = EventDuration; + errorStateMatcher = new MyErrorStateMatcher(); + ngOnInit(): void { if (Object.keys(this.form.controls).length === 0) { for (const [key, value] of Object.entries(this.model)) { @@ -20,11 +35,128 @@ export class EventFormComponent implements OnInit, OnDestroy { } } + ngAfterContentInit(): void { + this.onEventTypeChange(); + this.onEventDurationChange(); + } + ngOnDestroy(): void { this.form.reset(); } + + onEventTypeChange(): void { + switch (this.model.eventType) { + case EventType.InPerson: + this.form.controls['eventOnlinePlatform'].removeValidators(Validators.required); + this.form.controls['eventOnlinePlatform'].clearValidators(); + this.form.controls['eventOnlinePlatform'].updateValueAndValidity(); + this.form.controls['eventLocation'].addValidators(Validators.required); + this.form.controls['eventLocation'].clearValidators(); + this.form.controls['eventLocation'].updateValueAndValidity() + break; + case EventType.Online: + this.form.controls['eventLocation'].removeValidators(Validators.required); + this.form.controls['eventLocation'].updateValueAndValidity() + this.form.controls['eventOnlinePlatform'].addValidators(Validators.required); + this.form.controls['eventOnlinePlatform'].clearValidators(); + this.form.controls['eventOnlinePlatform'].updateValueAndValidity(); + break; + case EventType.Hybrid: + this.form.controls['eventLocation'].addValidators(Validators.required); + this.form.controls['eventLocation'].clearValidators(); + this.form.controls['eventLocation'].updateValueAndValidity() + this.form.controls['eventOnlinePlatform'].addValidators(Validators.required); + this.form.controls['eventOnlinePlatform'].clearValidators(); + this.form.controls['eventOnlinePlatform'].updateValueAndValidity(); + break; + } + } + + onEventDurationChange(): void { + switch (this.model.eventDuration) { + case EventDuration.Single: + this.form.controls['eventEndDate'].removeValidators(Validators.required); + this.form.controls['eventEndDate'].clearValidators(); + this.form.controls['eventEndDate'].updateValueAndValidity(); + break; + case EventDuration.Multi: + this.form.controls['eventEndDate'].addValidators(Validators.required); + this.form.controls['eventEndDate'].clearValidators(); + this.form.controls['eventEndDate'].updateValueAndValidity(); + break; + } + } +} + +class MyErrorStateMatcher implements ErrorStateMatcher { + isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean { + const isSubmitted = form && form.submitted; + return !!(control && control.invalid && (control.dirty || control.touched || isSubmitted)); + } } export interface IEventForm { - description: string; -} \ No newline at end of file + eventType: EventType | string, + eventOrganizerName: string, + eventName: string, + eventLanguage: EventLanguage | string, + eventDescription: string, + eventLocation: string, + eventOnlinePlatform: string, + eventDuration: EventDuration | string, + eventStartDate: string, + eventEndDate: string +} + +enum EventType { + InPerson = "In Person", + Hybrid = "Hybrid", + Online = "Online" +} + +enum EventDuration { + Single = "Single", + Multi = "Multi" +} + +enum EventLanguage { + English = "English", + French = "French", + Bilingual = "Bilingual" +} + +// IN PERSON +// Name of Organizer +// Name of Event +// Language of Event +// Event Description +// Location +// One/Multi Day event +// One Day: Start Date/Time +// Multi: Start & End Date/Time + +// HYBRID +// Same as in person +// Add Online Streaming Platform link + +// ONLINE +// Same as in person +// Remove location +// Replace with Online Streaming Platform link + +// id: string | undefined; +// title: string | undefined; +// eventType: string | undefined; +// description: string | undefined; +// location: Location | undefined; +// tags: [string] | undefined; +// startDate: Date | undefined; +// endDate: Date | undefined; +// author: Person | undefined; +// authoredDate: Date | undefined; +// canceled: boolean = false; +// image: string | undefined; +// group: Group | undefined; + +// confirmed: boolean = false; +// declined: boolean = false; \ No newline at end of file diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index 60f68b61..a20307db 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -33,6 +33,9 @@ import { InfiniteScrollModule } from 'ngx-infinite-scroll'; import { ProfilePicComponent } from './components/profile-pic/profile-pic.component'; import { CalendarButtonComponent } from './components/calendar-button/calendar-button.component'; import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MAT_RADIO_DEFAULT_OPTIONS, MatRadioModule } from '@angular/material/radio'; +import { MatDatepickerModule } from '@angular/material/datepicker'; +import { MatAutocompleteModule } from '@angular/material/autocomplete'; import { EditorMenuComponent } from './components/editor/menu/editor-menu/editor-menu.component'; import { PostFormComponent } from './components/post-form/post-form.component'; import { BlogFormComponent } from './components/blog-form/blog-form.component'; @@ -88,6 +91,9 @@ import { TruncateFileNamePipe } from './pipes/truncate-file-name.pipe'; MatFormFieldModule, MatInputModule, MatCheckboxModule, + MatRadioModule, + MatDatepickerModule, + MatAutocompleteModule, NgxSkeletonLoaderModule, InfiniteScrollModule, ], @@ -121,10 +127,12 @@ import { TruncateFileNamePipe } from './pipes/truncate-file-name.pipe'; }, { provide: MAT_FORM_FIELD_DEFAULT_OPTIONS, - useValue: { - appearance: 'outline' - } - } + useValue: { appearance: 'outline' } + }, + { + provide: MAT_RADIO_DEFAULT_OPTIONS, + useValue: { color: 'primary' }, + } ] }) export class SharedModule { From bc534927611130e8b6df518280e35004a299eec8 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Fri, 27 Oct 2023 15:39:04 -0400 Subject: [PATCH 053/165] translations for make a post --- .../blog-form/blog-form.component.ts | 9 +-- .../event-form/event-form.component.ts | 56 +++++-------------- .../poll-form/poll-form.component.ts | 34 ++++++----- src/assets/i18n/translations.en.ts | 39 +++++++++++++ src/assets/i18n/translations.fr.ts | 39 +++++++++++++ 5 files changed, 113 insertions(+), 64 deletions(-) diff --git a/src/app/shared/components/blog-form/blog-form.component.ts b/src/app/shared/components/blog-form/blog-form.component.ts index f3112c2a..7364cbc1 100644 --- a/src/app/shared/components/blog-form/blog-form.component.ts +++ b/src/app/shared/components/blog-form/blog-form.component.ts @@ -42,10 +42,11 @@ export class BlogFormComponent implements OnInit, OnDestroy { } ngOnInit(): void { - if (Object.keys(this.form.controls).length === 0) { - for (const [key, value] of Object.entries(this.model)) { + for (const [key, value] of Object.entries(this.model)) { + if (!this.form.controls[key]) this.form.addControl(key, new FormControl(value, [Validators.required])); - } + else + console.warn('Duplicate FormControl detected.'); } this.focusSub = this.focusTrackingService.getAppFocusObservable().subscribe((isInFocus) => { @@ -95,7 +96,7 @@ export class BlogFormComponent implements OnInit, OnDestroy { this.form.controls['coverPhotoName'].setValue(selectedFile.name); this.coverPhotoError = undefined; }).catch((error) => { - this.setImageError("Error reading the image." + error); + this.setImageError("Error reading the image."); console.error(error); }); }); diff --git a/src/app/shared/components/event-form/event-form.component.ts b/src/app/shared/components/event-form/event-form.component.ts index 5be9275d..0e32ec5e 100644 --- a/src/app/shared/components/event-form/event-form.component.ts +++ b/src/app/shared/components/event-form/event-form.component.ts @@ -10,10 +10,10 @@ import { ErrorStateMatcher } from '@angular/material/core'; export class EventFormComponent implements OnInit, OnDestroy { @Input() form: FormGroup = new FormGroup({}); @Input() model: IEventForm = { - eventType: 'Hybrid', + eventType: '', eventOrganizerName: '', eventName: '', - eventLanguage: 'Bilingual', + eventLanguage: '', eventDescription: '', eventLocation: '', eventOnlinePlatform: '', @@ -28,10 +28,11 @@ export class EventFormComponent implements OnInit, OnDestroy { errorStateMatcher = new MyErrorStateMatcher(); ngOnInit(): void { - if (Object.keys(this.form.controls).length === 0) { - for (const [key, value] of Object.entries(this.model)) { + for (const [key, value] of Object.entries(this.model)) { + if (!this.form.controls[key]) this.form.addControl(key, new FormControl(value, [Validators.required])); - } + else + console.warn('Duplicate FormControl detected.'); } } @@ -50,21 +51,27 @@ export class EventFormComponent implements OnInit, OnDestroy { this.form.controls['eventOnlinePlatform'].removeValidators(Validators.required); this.form.controls['eventOnlinePlatform'].clearValidators(); this.form.controls['eventOnlinePlatform'].updateValueAndValidity(); + this.form.controls['eventLocation'].addValidators(Validators.required); this.form.controls['eventLocation'].clearValidators(); this.form.controls['eventLocation'].updateValueAndValidity() break; + case EventType.Online: this.form.controls['eventLocation'].removeValidators(Validators.required); - this.form.controls['eventLocation'].updateValueAndValidity() + this.form.controls['eventLocation'].clearValidators(); + this.form.controls['eventLocation'].updateValueAndValidity(); + this.form.controls['eventOnlinePlatform'].addValidators(Validators.required); this.form.controls['eventOnlinePlatform'].clearValidators(); this.form.controls['eventOnlinePlatform'].updateValueAndValidity(); break; + case EventType.Hybrid: this.form.controls['eventLocation'].addValidators(Validators.required); this.form.controls['eventLocation'].clearValidators(); this.form.controls['eventLocation'].updateValueAndValidity() + this.form.controls['eventOnlinePlatform'].addValidators(Validators.required); this.form.controls['eventOnlinePlatform'].clearValidators(); this.form.controls['eventOnlinePlatform'].updateValueAndValidity(); @@ -79,6 +86,7 @@ export class EventFormComponent implements OnInit, OnDestroy { this.form.controls['eventEndDate'].clearValidators(); this.form.controls['eventEndDate'].updateValueAndValidity(); break; + case EventDuration.Multi: this.form.controls['eventEndDate'].addValidators(Validators.required); this.form.controls['eventEndDate'].clearValidators(); @@ -124,39 +132,3 @@ enum EventLanguage { French = "French", Bilingual = "Bilingual" } - -// IN PERSON -// Name of Organizer -// Name of Event -// Language of Event -// Event Description -// Location -// One/Multi Day event -// One Day: Start Date/Time -// Multi: Start & End Date/Time - -// HYBRID -// Same as in person -// Add Online Streaming Platform link - -// ONLINE -// Same as in person -// Remove location -// Replace with Online Streaming Platform link - -// id: string | undefined; -// title: string | undefined; -// eventType: string | undefined; -// description: string | undefined; -// location: Location | undefined; -// tags: [string] | undefined; -// startDate: Date | undefined; -// endDate: Date | undefined; -// author: Person | undefined; -// authoredDate: Date | undefined; -// canceled: boolean = false; -// image: string | undefined; -// group: Group | undefined; - -// confirmed: boolean = false; -// declined: boolean = false; \ No newline at end of file diff --git a/src/app/shared/components/poll-form/poll-form.component.ts b/src/app/shared/components/poll-form/poll-form.component.ts index 3278e936..14ea36b9 100644 --- a/src/app/shared/components/poll-form/poll-form.component.ts +++ b/src/app/shared/components/poll-form/poll-form.component.ts @@ -26,25 +26,23 @@ export class PollFormComponent implements OnInit, OnDestroy { errorStateMatcher = new MyErrorStateMatcher(); ngOnInit(): void { - if (Object.keys(this.form.controls).length === 0) { + this.form.addControl( + 'description', + new FormControl( + this.model.description, + [ + Validators.required, + //Validators.minLength(this.minLength), + Validators.maxLength(this.maxLength), + ] + ) + ); + + for (let i = 0; i < this.model.options.length; i++) { this.form.addControl( - 'description', - new FormControl( - this.model.description, - [ - Validators.required, - //Validators.minLength(this.minLength), - Validators.maxLength(this.maxLength), - ] - ) - ); - - for (let i = 0; i < this.model.options.length; i++) { - this.form.addControl( - 'option' + i, - new FormControl(this.model.options[i].value, [Validators.required] - )); - } + 'option' + i, + new FormControl(this.model.options[i].value, [Validators.required] + )); } } diff --git a/src/assets/i18n/translations.en.ts b/src/assets/i18n/translations.en.ts index 86faa575..9b1c0a9f 100644 --- a/src/assets/i18n/translations.en.ts +++ b/src/assets/i18n/translations.en.ts @@ -297,5 +297,44 @@ export default { "aria_on": "Click to bookmark this event.", "aria_off": "Click to remove this event from your bookmarks." } + }, + "forms": { + "placeholder": "Type here", + "post": { + "post": "Post" + }, + "blog": { + "name_of_blog": "Name of Blog", + "name_of_publisher": "Name of publisher", + "upload_cover_photo": "Upload a cover photo", + "cover_photo_alt": "Cover photo alt text", + "body": "Body" + }, + "event": { + "type_of_event": "Type of event", + "in-person": "In-person", + "hybrid": "Hybrid", + "online": "Online", + "name_of_organizer": "Name of organizer", + "name_of_event": "Name of event", + "event_language": "Language of event", + "english": "English", + "french": "French", + "bilingual": "Bilingual", + "body": "Body", + "location": "Location", + "platform": "Online streaming platform", + "duration": "Event duration", + "single_day": "One day event", + "multi_day": "Multi-day event", + "start_date": "Start date", + "end_date": "End date" + }, + "poll": { + "description": "Poll description / question", + "option": "Option", + "option_add": "Add an option", + "option_remove": "Remove option" + } } }; \ No newline at end of file diff --git a/src/assets/i18n/translations.fr.ts b/src/assets/i18n/translations.fr.ts index 98fa2e9e..31c801ce 100644 --- a/src/assets/i18n/translations.fr.ts +++ b/src/assets/i18n/translations.fr.ts @@ -298,6 +298,45 @@ const fr: typeof import('./translations.en').default = { "aria_on": "Cliquez pour ajouter cet événement à vos favoris.", "aria_off": "Cliquez pour supprimer cet événement de vos favoris." } + }, + "forms": { + "placeholder": "Type here", + "post": { + "post": "Poste" + }, + "blog": { + "name_of_blog": "Nom du blog", + "name_of_publisher": "Nom de l'éditeur", + "upload_cover_photo": "Téléchargez une photo de couverture", + "cover_photo_alt": "Texte alternatif de la photo de couverture", + "body": "Corps" + }, + "event": { + "type_of_event": "Type d'événement", + "in-person": "En personne", + "hybrid": "Hybride", + "online": "En ligne", + "name_of_organizer": "Nom de l'organisateur", + "name_of_event": "Nom de l'événement", + "event_language": "Langue de l'événement", + "english": "Anglaise", + "french": "Français", + "bilingual": "Bilingue", + "body": "Corps", + "location": "Emplacement", + "platform": "Plateforme de streaming en ligne", + "duration": "Durée de l'événement", + "single_day": "Événement d'une journée", + "multi_day": "Événement sur plusieurs jours", + "start_date": "Date de début", + "end_date": "Date de fin" + }, + "poll": { + "description": "Description/question du sondage", + "option": "Option", + "option_add": "Ajouter une option", + "option_remove": "Supprimer l'option" + } } }; export default fr; \ No newline at end of file From 13568aeae301e41dff4a70dd7f598ca6c7885a33 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Mon, 30 Oct 2023 11:42:13 -0400 Subject: [PATCH 054/165] make a post translations --- .../blog-form/blog-form.component.html | 18 +++---- .../blog-form/blog-form.component.ts | 5 +- .../event-form/event-form.component.html | 52 +++++++++---------- .../event-form/event-form.component.ts | 10 +++- .../poll-form/poll-form.component.html | 18 +++---- .../poll-form/poll-form.component.ts | 6 +++ .../post-form/post-form.component.html | 9 +--- .../post-form/post-form.component.ts | 4 +- src/assets/i18n/translations.en.ts | 8 ++- src/assets/i18n/translations.fr.ts | 10 +++- 10 files changed, 79 insertions(+), 61 deletions(-) diff --git a/src/app/shared/components/blog-form/blog-form.component.html b/src/app/shared/components/blog-form/blog-form.component.html index 18d98be5..de81f3ba 100644 --- a/src/app/shared/components/blog-form/blog-form.component.html +++ b/src/app/shared/components/blog-form/blog-form.component.html @@ -4,8 +4,8 @@ [name]="'name'" formControlName="name" [control]="$any(form).controls['name']" - [label]="'Name of Blog'" - [placeholder]="'Type here'" + [label]="translations.forms.blog.name_of_blog | translate" + [placeholder]="translations.forms.placeholder | translate" [errorMatcher]="errorStateMatcher" [autofocus]="true" [required]="true"> @@ -15,8 +15,8 @@ [name]="'publisher'" formControlName="publisher" [control]="$any(form).controls['publisher']" - [label]="'Name of publisher'" - [placeholder]="'Type here'" + [label]="translations.forms.blog.name_of_publisher | translate" + [placeholder]="translations.forms.placeholder | translate" [errorMatcher]="errorStateMatcher" [required]="true"> @@ -27,7 +27,7 @@ [onClick]="clickCallback" [onBlur]="blurCallback"> - {{ $any(form).controls['coverPhoto'].value ? ($any(form).controls['coverPhotoName'].value | truncateFileName: 18) :'Upload a cover photo'}} + {{ $any(form).controls['coverPhoto'].value ? ($any(form).controls['coverPhotoName'].value | truncateFileName: 18) : translations.forms.blog.upload_cover_photo | translate }} *
@@ -46,14 +46,14 @@ [name]="'coverPhotoAlt'" formControlName="coverPhotoAlt" [control]="$any(form).controls['coverPhotoAlt']" - [label]="'Cover photo alt text'" - [placeholder]="'Type here'" + [label]="translations.forms.blog.cover_photo_alt | translate" + [placeholder]="translations.forms.placeholder | translate" [errorMatcher]="errorStateMatcher" [required]="true"> - - Type of event + {{ translations.forms.event.type_of_event | translate }}
*
- In-person + {{ translations.forms.event.in_person | translate }} - Hybrid + {{ translations.forms.event.hybrid | translate }} - Online + {{ translations.forms.event.online | translate }} @@ -25,8 +25,8 @@ [name]="'eventOrganizerName'" formControlName="eventOrganizerName" [control]="$any(form).controls['eventOrganizerName']" - [label]="'Name of organizer/Nom de l\'organisteur'" - [placeholder]="'Type here'" + [label]="translations.forms.event.name_of_organizer | translate" + [placeholder]="translations.forms.placeholder | translate" [errorMatcher]="errorStateMatcher" [autofocus]="true" [required]="true"> @@ -36,35 +36,35 @@ [name]="'eventName'" formControlName="eventName" [control]="$any(form).controls['eventName']" - [label]="'Name of event/Nom de l\'événement'" - [placeholder]="'Type here'" + [label]="translations.forms.event.name_of_event | translate" + [placeholder]="translations.forms.placeholder | translate" [errorMatcher]="errorStateMatcher" [required]="true"> - Language of event/Langue de l'événement + {{ translations.forms.event.event_language | translate }}
*
- English + {{ translations.forms.event.english | translate }} - French + {{ translations.forms.event.french | translate }} - Bilingual + {{ translations.forms.event.bilingual | translate }} - @@ -88,28 +88,28 @@ [name]="'eventOnlinePlatform'" formControlName="eventOnlinePlatform" [control]="$any(form).controls['eventOnlinePlatform']" - [label]="'Online streaming platform'" - [placeholder]="'Type here'" + [label]="translations.forms.event.platform | translate" + [placeholder]="translations.forms.placeholder | translate" [errorMatcher]="errorStateMatcher" [required]="true"> - Event Duration + {{ translations.forms.event.duration | translate }}
*
- One day event + {{ translations.forms.event.single_day | translate }} - Multi-day event + {{ translations.forms.event.multi_day | translate }} @@ -119,7 +119,7 @@ [name]="'eventStartDate'" formControlName="eventStartDate" [control]="$any(form).controls['eventStartDate']" - [label]="'Start date'" + [label]="translations.forms.event.start_date | translate" [placeholder]="'MM/DD/YYYY'" [errorMatcher]="errorStateMatcher" [required]="true"> @@ -142,7 +142,7 @@ [name]="'eventEndDate'" formControlName="eventEndDate" [control]="$any(form).controls['eventEndDate']" - [label]="'End date'" + [label]="translations.forms.event.end_date | translate" [placeholder]="'MM/DD/YYYY'" [errorMatcher]="errorStateMatcher" [required]="true"> diff --git a/src/app/shared/components/event-form/event-form.component.ts b/src/app/shared/components/event-form/event-form.component.ts index 0e32ec5e..716c4698 100644 --- a/src/app/shared/components/event-form/event-form.component.ts +++ b/src/app/shared/components/event-form/event-form.component.ts @@ -1,6 +1,8 @@ import { Component, Input, OnDestroy, OnInit } from '@angular/core'; import { FormControl, FormGroup, FormGroupDirective, NgForm, Validators } from '@angular/forms'; import { ErrorStateMatcher } from '@angular/material/core'; +import { TranslateService } from '@ngx-translate/core'; +import { Translations } from 'src/app/core/services/translations.service'; @Component({ selector: 'app-event-form', @@ -10,10 +12,10 @@ import { ErrorStateMatcher } from '@angular/material/core'; export class EventFormComponent implements OnInit, OnDestroy { @Input() form: FormGroup = new FormGroup({}); @Input() model: IEventForm = { - eventType: '', + eventType: EventType.Hybrid, eventOrganizerName: '', eventName: '', - eventLanguage: '', + eventLanguage: EventLanguage.Bilingual, eventDescription: '', eventLocation: '', eventOnlinePlatform: '', @@ -27,6 +29,10 @@ export class EventFormComponent implements OnInit, OnDestroy { eventDuration = EventDuration; errorStateMatcher = new MyErrorStateMatcher(); + constructor(public translations: Translations) { + + } + ngOnInit(): void { for (const [key, value] of Object.entries(this.model)) { if (!this.form.controls[key]) diff --git a/src/app/shared/components/poll-form/poll-form.component.html b/src/app/shared/components/poll-form/poll-form.component.html index 93b2407e..0436dad0 100644 --- a/src/app/shared/components/poll-form/poll-form.component.html +++ b/src/app/shared/components/poll-form/poll-form.component.html @@ -1,6 +1,6 @@
- @@ -34,12 +33,7 @@ [disabled]="model.options.length >= maxOptions" (click)="addOption()"> - Add an option - - - - - Add a photo + {{ translations.forms.poll.option_add | translate }}
diff --git a/src/app/shared/components/poll-form/poll-form.component.ts b/src/app/shared/components/poll-form/poll-form.component.ts index 14ea36b9..49bd8fb1 100644 --- a/src/app/shared/components/poll-form/poll-form.component.ts +++ b/src/app/shared/components/poll-form/poll-form.component.ts @@ -2,6 +2,8 @@ import { Component, Input, OnDestroy, OnInit } from '@angular/core'; import { TooltipDirection } from '../../models/tooltip-direction'; import { FormControl, FormGroup, FormGroupDirective, NgForm, Validators } from '@angular/forms'; import { ErrorStateMatcher } from '@angular/material/core'; +import { TranslateService } from '@ngx-translate/core'; +import { Translations } from 'src/app/core/services/translations.service'; @Component({ selector: 'app-poll-form', @@ -25,6 +27,10 @@ export class PollFormComponent implements OnInit, OnDestroy { tooltipDirection = TooltipDirection; errorStateMatcher = new MyErrorStateMatcher(); + constructor(public translations: Translations) { + + } + ngOnInit(): void { this.form.addControl( 'description', diff --git a/src/app/shared/components/post-form/post-form.component.html b/src/app/shared/components/post-form/post-form.component.html index 3ad45dbe..f4f0c637 100644 --- a/src/app/shared/components/post-form/post-form.component.html +++ b/src/app/shared/components/post-form/post-form.component.html @@ -1,7 +1,6 @@
- - - - - Add a photo -
\ No newline at end of file diff --git a/src/app/shared/components/post-form/post-form.component.ts b/src/app/shared/components/post-form/post-form.component.ts index 467ab9ff..13c47fe7 100644 --- a/src/app/shared/components/post-form/post-form.component.ts +++ b/src/app/shared/components/post-form/post-form.component.ts @@ -1,5 +1,7 @@ import { Component, Input, OnDestroy, OnInit } from '@angular/core'; import { FormControl, FormGroup, Validators } from '@angular/forms'; +import { TranslateService } from '@ngx-translate/core'; +import { Translations } from 'src/app/core/services/translations.service'; @Component({ selector: 'app-post-form', @@ -15,7 +17,7 @@ export class PostFormComponent implements OnInit, OnDestroy { minLength: number = 3; maxLength: number = 240; - constructor() { + constructor(public translations: Translations) { } diff --git a/src/assets/i18n/translations.en.ts b/src/assets/i18n/translations.en.ts index 9b1c0a9f..6fd0ba59 100644 --- a/src/assets/i18n/translations.en.ts +++ b/src/assets/i18n/translations.en.ts @@ -300,6 +300,8 @@ export default { }, "forms": { "placeholder": "Type here", + "save": "Save", + "create": "Create", "post": { "post": "Post" }, @@ -312,19 +314,23 @@ export default { }, "event": { "type_of_event": "Type of event", - "in-person": "In-person", + "type_of_event_aria" : "Select an event type", + "in_person": "In-person", "hybrid": "Hybrid", "online": "Online", "name_of_organizer": "Name of organizer", "name_of_event": "Name of event", "event_language": "Language of event", + "event_language_aria": "Select a language for your event", "english": "English", "french": "French", "bilingual": "Bilingual", "body": "Body", + "body_hint": "Start writing.", "location": "Location", "platform": "Online streaming platform", "duration": "Event duration", + "duration_aria": "Select a duration for your event", "single_day": "One day event", "multi_day": "Multi-day event", "start_date": "Start date", diff --git a/src/assets/i18n/translations.fr.ts b/src/assets/i18n/translations.fr.ts index 31c801ce..7acc33f0 100644 --- a/src/assets/i18n/translations.fr.ts +++ b/src/assets/i18n/translations.fr.ts @@ -300,7 +300,9 @@ const fr: typeof import('./translations.en').default = { } }, "forms": { - "placeholder": "Type here", + "placeholder": "Écrivez ici", + "save": "Sauvegarder", + "create": "Créer", "post": { "post": "Poste" }, @@ -313,19 +315,23 @@ const fr: typeof import('./translations.en').default = { }, "event": { "type_of_event": "Type d'événement", - "in-person": "En personne", + "type_of_event_aria" : "Sélectionnez un type d'événement", + "in_person": "En personne", "hybrid": "Hybride", "online": "En ligne", "name_of_organizer": "Nom de l'organisateur", "name_of_event": "Nom de l'événement", "event_language": "Langue de l'événement", + "event_language_aria": "Sélectionnez une langue pour votre événement", "english": "Anglaise", "french": "Français", "bilingual": "Bilingue", "body": "Corps", + "body_hint": "Commencez à écrire.", "location": "Emplacement", "platform": "Plateforme de streaming en ligne", "duration": "Durée de l'événement", + "duration_aria": "Sélectionnez une durée pour votre événement", "single_day": "Événement d'une journée", "multi_day": "Événement sur plusieurs jours", "start_date": "Date de début", From 5426411ff5cbbb8b1f43d927d3d96bab51718356 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Mon, 30 Oct 2023 12:24:08 -0400 Subject: [PATCH 055/165] posting animation, disable all forms --- .../components/post/post.component.html | 32 ++++++++++--------- .../components/post/post.component.scss | 6 ++++ .../profile/components/post/post.component.ts | 13 +++++--- .../blog-form/blog-form.component.html | 17 ++++++---- .../blog-form/blog-form.component.ts | 1 + .../components/editor/editor.component.scss | 1 + .../event-form/event-form.component.html | 16 ++++++++-- .../event-form/event-form.component.ts | 1 + .../poll-form/poll-form.component.html | 11 ++++--- .../poll-form/poll-form.component.ts | 1 + .../post-form/post-form.component.html | 5 +-- .../post-form/post-form.component.scss | 4 +++ .../post-form/post-form.component.ts | 5 +-- 13 files changed, 76 insertions(+), 37 deletions(-) diff --git a/src/app/features/profile/components/post/post.component.html b/src/app/features/profile/components/post/post.component.html index ef0831f3..1fc7dc08 100644 --- a/src/app/features/profile/components/post/post.component.html +++ b/src/app/features/profile/components/post/post.component.html @@ -31,38 +31,39 @@ (keydown)="toggleEditing($event)" tabindex="0"> - Type here + {{ translations.forms.placeholder | translate }}
+ (click)="toggleEditing($event)" + [disabled]="creating"> - - + - + - + - + - + - + - + - + @@ -77,20 +78,21 @@
- Save + {{ translations.forms.save | translate }}
- {{ translations.titles.post | translate }} +
{{ translations.forms.create | translate }}
+
diff --git a/src/app/features/profile/components/post/post.component.scss b/src/app/features/profile/components/post/post.component.scss index d92dd7c1..069178da 100644 --- a/src/app/features/profile/components/post/post.component.scss +++ b/src/app/features/profile/components/post/post.component.scss @@ -83,6 +83,12 @@ $title-padding: 90px; mat-card-actions { padding: 0px 16px 24px 16px !important; + + .right-actions { + i { + color: $primary-1-contrast; + } + } } } diff --git a/src/app/features/profile/components/post/post.component.ts b/src/app/features/profile/components/post/post.component.ts index 28c70fbd..b73d739d 100644 --- a/src/app/features/profile/components/post/post.component.ts +++ b/src/app/features/profile/components/post/post.component.ts @@ -30,6 +30,7 @@ export class PostComponent { saveCallback: Function = this.save.bind(this); submitCallback: Function = this.submit.bind(this); selectedForm: FormGroup = this.formGroups[this.selectedIndex]; + creating: boolean = false; constructor(public translations: Translations, private sessionStorageService: SessionStorageService) { @@ -62,7 +63,7 @@ export class PostComponent { } toggleEditing(event: Event) { - if ((event instanceof KeyboardEvent && (event.key == 'Enter' || event.key == 'Space')) || event instanceof KeyboardEvent == false) { + if (!this.creating && (event instanceof KeyboardEvent && (event.key == 'Enter' || event.key == 'Space')) || event instanceof KeyboardEvent == false) { this.editing = !this.editing; this.selectedIndex = 0; this.selectedForm = this.formGroups[this.selectedIndex]; @@ -103,10 +104,14 @@ export class PostComponent { submit(): void { if (this.selectedForm.status === 'VALID') { + this.creating = true; this.sessionStorageService.remove('gccollab-make-a-' + this.getTypeFromIndex(this.selectedIndex)); - console.log(this.selectedForm); - debugger; - this.toggleEditing(new Event('')); + + // TODO: Setup mock service for posting forms + setTimeout(() => { + this.creating = false; + this.toggleEditing(new Event('')); + }, 3000); } } diff --git a/src/app/shared/components/blog-form/blog-form.component.html b/src/app/shared/components/blog-form/blog-form.component.html index de81f3ba..a1c1bd20 100644 --- a/src/app/shared/components/blog-form/blog-form.component.html +++ b/src/app/shared/components/blog-form/blog-form.component.html @@ -1,4 +1,4 @@ -
+ + [required]="true" + [disabled]="disabled"> + [required]="true" + [disabled]="disabled">
+ [onBlur]="blurCallback" + [disabled]="disabled"> {{ $any(form).controls['coverPhoto'].value ? ($any(form).controls['coverPhotoName'].value | truncateFileName: 18) : translations.forms.blog.upload_cover_photo | translate }} * @@ -49,7 +52,8 @@ [label]="translations.forms.blog.cover_photo_alt | translate" [placeholder]="translations.forms.placeholder | translate" [errorMatcher]="errorStateMatcher" - [required]="true"> + [required]="true" + [disabled]="disabled"> + [control]="$any(form).controls['description']" + [disabled]="disabled"> \ No newline at end of file diff --git a/src/app/shared/components/blog-form/blog-form.component.ts b/src/app/shared/components/blog-form/blog-form.component.ts index 9dd9a3cc..18f9fffe 100644 --- a/src/app/shared/components/blog-form/blog-form.component.ts +++ b/src/app/shared/components/blog-form/blog-form.component.ts @@ -21,6 +21,7 @@ export class BlogFormComponent implements OnInit, OnDestroy { coverPhotoAlt: '', description: '' } + @Input() disabled: boolean = false; @ViewChild('gccBlogCoverPhotoInput') fileInput!: ElementRef; errorStateMatcher = new MyErrorStateMatcher(); diff --git a/src/app/shared/components/editor/editor.component.scss b/src/app/shared/components/editor/editor.component.scss index 4bec350a..a02cb1d1 100644 --- a/src/app/shared/components/editor/editor.component.scss +++ b/src/app/shared/components/editor/editor.component.scss @@ -126,6 +126,7 @@ font-style: italic; color: #757575; padding: 0 16px; + display: block; } mat-error { diff --git a/src/app/shared/components/event-form/event-form.component.html b/src/app/shared/components/event-form/event-form.component.html index 591de7da..5e52133e 100644 --- a/src/app/shared/components/event-form/event-form.component.html +++ b/src/app/shared/components/event-form/event-form.component.html @@ -1,4 +1,4 @@ -
+ {{ translations.forms.event.type_of_event | translate }}
*
@@ -9,6 +9,7 @@ [ariaLabel]="translations.forms.event.type_of_event_aria | translate" formControlName="eventType" [formControl]="$any(form).controls['eventType']" + [disabled]="disabled" required="true"> {{ translations.forms.event.in_person | translate }} @@ -28,6 +29,7 @@ [label]="translations.forms.event.name_of_organizer | translate" [placeholder]="translations.forms.placeholder | translate" [errorMatcher]="errorStateMatcher" + [disabled]="disabled" [autofocus]="true" [required]="true"> @@ -39,6 +41,7 @@ [label]="translations.forms.event.name_of_event | translate" [placeholder]="translations.forms.placeholder | translate" [errorMatcher]="errorStateMatcher" + [disabled]="disabled" [required]="true"> @@ -51,6 +54,7 @@ [ariaLabel]="translations.forms.event.event_language_aria | translate" formControlName="eventLanguage" [formControl]="$any(form).controls['eventLanguage']" + [disabled]="disabled" required="true"> {{ translations.forms.event.english | translate }} @@ -69,7 +73,8 @@ [required]="true" [maxCharacters]="240" formControlName="eventDescription" - [control]="$any(form).controls['eventDescription']"> + [control]="$any(form).controls['eventDescription']" + [disabled]="disabled"> @@ -91,6 +97,7 @@ [label]="translations.forms.event.platform | translate" [placeholder]="translations.forms.placeholder | translate" [errorMatcher]="errorStateMatcher" + [disabled]="disabled" [required]="true"> @@ -104,6 +111,7 @@ [ariaLabel]="translations.forms.event.duration_aria | translate" formControlName="eventDuration" [formControl]="$any(form).controls['eventDuration']" + [disabled]="disabled" required="true"> {{ translations.forms.event.single_day | translate }} @@ -122,6 +130,7 @@ [label]="translations.forms.event.start_date | translate" [placeholder]="'MM/DD/YYYY'" [errorMatcher]="errorStateMatcher" + [disabled]="disabled" [required]="true"> @@ -133,6 +142,7 @@ [label]="''" [placeholder]="'00:00 AM'" [errorMatcher]="errorStateMatcher" + [disabled]="disabled" [required]="true">
@@ -145,6 +155,7 @@ [label]="translations.forms.event.end_date | translate" [placeholder]="'MM/DD/YYYY'" [errorMatcher]="errorStateMatcher" + [disabled]="disabled" [required]="true"> @@ -155,6 +166,7 @@ [label]="''" [placeholder]="'00:00 AM'" [errorMatcher]="errorStateMatcher" + [disabled]="disabled" [required]="true">
diff --git a/src/app/shared/components/event-form/event-form.component.ts b/src/app/shared/components/event-form/event-form.component.ts index 716c4698..53ebeadf 100644 --- a/src/app/shared/components/event-form/event-form.component.ts +++ b/src/app/shared/components/event-form/event-form.component.ts @@ -23,6 +23,7 @@ export class EventFormComponent implements OnInit, OnDestroy { eventStartDate: '', eventEndDate: '' } + @Input() disabled: boolean = false; eventType = EventType; eventLanguage = EventLanguage; diff --git a/src/app/shared/components/poll-form/poll-form.component.html b/src/app/shared/components/poll-form/poll-form.component.html index 0436dad0..97b3dbb3 100644 --- a/src/app/shared/components/poll-form/poll-form.component.html +++ b/src/app/shared/components/poll-form/poll-form.component.html @@ -1,4 +1,4 @@ - + + [control]="$any(form).controls['description']" + [disabled]="disabled">
@@ -17,12 +18,14 @@ [label]="(translations.forms.poll.option | translate) + ' #' + (i + 1)" [placeholder]="translations.forms.placeholder | translate" [errorMatcher]="errorStateMatcher" - [required]="true"> + [required]="true" + [disabled]="disabled"> @@ -30,7 +33,7 @@
{{ translations.forms.poll.option_add | translate }} diff --git a/src/app/shared/components/poll-form/poll-form.component.ts b/src/app/shared/components/poll-form/poll-form.component.ts index 49bd8fb1..6e675948 100644 --- a/src/app/shared/components/poll-form/poll-form.component.ts +++ b/src/app/shared/components/poll-form/poll-form.component.ts @@ -20,6 +20,7 @@ export class PollFormComponent implements OnInit, OnDestroy { ], photo: '' } + @Input() disabled: boolean = false; maxOptions: number = 10; minLength: number = 1; diff --git a/src/app/shared/components/post-form/post-form.component.html b/src/app/shared/components/post-form/post-form.component.html index f4f0c637..df97db16 100644 --- a/src/app/shared/components/post-form/post-form.component.html +++ b/src/app/shared/components/post-form/post-form.component.html @@ -1,4 +1,4 @@ - + + [control]="$any(form).controls['description']" + [disabled]="disabled"> \ No newline at end of file diff --git a/src/app/shared/components/post-form/post-form.component.scss b/src/app/shared/components/post-form/post-form.component.scss index c3318489..9fc2cf1e 100644 --- a/src/app/shared/components/post-form/post-form.component.scss +++ b/src/app/shared/components/post-form/post-form.component.scss @@ -9,4 +9,8 @@ } } } + + app-editor { + padding-bottom: 16px; + } } \ No newline at end of file diff --git a/src/app/shared/components/post-form/post-form.component.ts b/src/app/shared/components/post-form/post-form.component.ts index 13c47fe7..9c5f85dd 100644 --- a/src/app/shared/components/post-form/post-form.component.ts +++ b/src/app/shared/components/post-form/post-form.component.ts @@ -13,6 +13,7 @@ export class PostFormComponent implements OnInit, OnDestroy { @Input() model: IPostForm = { description: '' } + @Input() disabled: boolean = false; minLength: number = 3; maxLength: number = 240; @@ -38,10 +39,6 @@ export class PostFormComponent implements OnInit, OnDestroy { ngOnDestroy(): void { this.form.reset(); } - - onSubmit() { - console.log(this.form.value); - } } export interface IPostForm { From 1d3936fab03ece374373600c7ba580b701569f87 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Mon, 30 Oct 2023 13:24:36 -0400 Subject: [PATCH 056/165] make a post init tests --- .../components/post/post.component.html | 6 ++-- .../components/post/post.component.spec.ts | 28 +++++++++++++++++-- .../blog-form/blog-form.component.html | 4 +-- .../blog-form/blog-form.component.spec.ts | 28 +++++++++++++++++-- .../components/button/button.component.html | 28 +++++++++---------- .../components/button/button.component.ts | 4 +-- .../components/editor/editor.component.ts | 11 +++++--- .../editor-menu/editor-menu.component.spec.ts | 21 -------------- .../event-form/event-form.component.spec.ts | 26 ++++++++++++++++- .../poll-form/poll-form.component.spec.ts | 26 ++++++++++++++++- .../post-form/post-form.component.spec.ts | 26 ++++++++++++++++- 11 files changed, 155 insertions(+), 53 deletions(-) delete mode 100644 src/app/shared/components/editor/menu/editor-menu/editor-menu.component.spec.ts diff --git a/src/app/features/profile/components/post/post.component.html b/src/app/features/profile/components/post/post.component.html index 1fc7dc08..db3c1d15 100644 --- a/src/app/features/profile/components/post/post.component.html +++ b/src/app/features/profile/components/post/post.component.html @@ -14,7 +14,7 @@
- + {{ profile.firstName + ' ' + profile.lastName }} @@ -80,7 +80,7 @@ + [clickFunc]="saveCallback"> {{ translations.forms.save | translate }}
@@ -90,7 +90,7 @@ [ngClass]="formReady(selectedForm) ? 'enabled' : 'disabled'" [disabled]="!formReady(selectedForm) || creating" theme="secondary-2" - [onClick]="submitCallback"> + [clickFunc]="submitCallback">
{{ translations.forms.create | translate }}
diff --git a/src/app/features/profile/components/post/post.component.spec.ts b/src/app/features/profile/components/post/post.component.spec.ts index e287e703..b9a20dd9 100644 --- a/src/app/features/profile/components/post/post.component.spec.ts +++ b/src/app/features/profile/components/post/post.component.spec.ts @@ -1,21 +1,45 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { PostComponent } from './post.component'; +import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core'; +import { HttpClient, HttpClientModule } from '@angular/common/http'; +import { TypescriptLoader } from 'src/app/core/helpers/typescript-loader'; +import { RouterTestingModule } from '@angular/router/testing'; describe('PostComponent', () => { let component: PostComponent; + let translateService: TranslateService; let fixture: ComponentFixture; beforeEach(() => { TestBed.configureTestingModule({ - declarations: [PostComponent] + declarations: [PostComponent], + imports: [ + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), + deps: [ HttpClient ] + } + }), + HttpClientModule, + RouterTestingModule + ], + providers: [ TranslateService, HttpClient ] }); fixture = TestBed.createComponent(PostComponent); component = fixture.componentInstance; fixture.detectChanges(); }); + beforeEach(() => { + translateService = TestBed.inject(TranslateService); + fixture = TestBed.createComponent(PostComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + it('should create', () => { expect(component).toBeTruthy(); }); -}); +}); \ No newline at end of file diff --git a/src/app/shared/components/blog-form/blog-form.component.html b/src/app/shared/components/blog-form/blog-form.component.html index a1c1bd20..6dc9c653 100644 --- a/src/app/shared/components/blog-form/blog-form.component.html +++ b/src/app/shared/components/blog-form/blog-form.component.html @@ -26,8 +26,8 @@
{{ $any(form).controls['coverPhoto'].value ? ($any(form).controls['coverPhotoName'].value | truncateFileName: 18) : translations.forms.blog.upload_cover_photo | translate }} diff --git a/src/app/shared/components/blog-form/blog-form.component.spec.ts b/src/app/shared/components/blog-form/blog-form.component.spec.ts index 9de2cbbc..7fad4d0d 100644 --- a/src/app/shared/components/blog-form/blog-form.component.spec.ts +++ b/src/app/shared/components/blog-form/blog-form.component.spec.ts @@ -1,20 +1,44 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { BlogFormComponent } from './blog-form.component'; - +import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core'; +import { HttpClient, HttpClientModule } from '@angular/common/http'; +import { TypescriptLoader } from 'src/app/core/helpers/typescript-loader'; +import { RouterTestingModule } from '@angular/router/testing'; +import { TruncateFileNamePipe } from '../../pipes/truncate-file-name.pipe'; describe('BlogFormComponent', () => { let component: BlogFormComponent; + let translateService: TranslateService; let fixture: ComponentFixture; beforeEach(() => { TestBed.configureTestingModule({ - declarations: [BlogFormComponent] + declarations: [BlogFormComponent, TruncateFileNamePipe], + imports: [ + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), + deps: [ HttpClient ] + } + }), + HttpClientModule, + RouterTestingModule + ], + providers: [ TranslateService, HttpClient ] }); fixture = TestBed.createComponent(BlogFormComponent); component = fixture.componentInstance; fixture.detectChanges(); }); + beforeEach(() => { + translateService = TestBed.inject(TranslateService); + fixture = TestBed.createComponent(BlogFormComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + it('should create', () => { expect(component).toBeTruthy(); }); diff --git a/src/app/shared/components/button/button.component.html b/src/app/shared/components/button/button.component.html index 02ba4955..85cb2d3a 100644 --- a/src/app/shared/components/button/button.component.html +++ b/src/app/shared/components/button/button.component.html @@ -14,8 +14,8 @@ [color]="matColor" [ngStyle]="{ 'font-size': fontSize }" [attr.theme]="theme" - (click)="onClick()" - (blur)="onBlur()"> + (click)="clickFunc()" + (blur)="blurFunc()">
+ (click)="clickFunc()" + (blur)="blurFunc()">
+ (click)="clickFunc()" + (blur)="blurFunc()">
+ (click)="clickFunc()" + (blur)="blurFunc()">
+ (click)="clickFunc()" + (blur)="blurFunc()">
+ (click)="clickFunc()" + (blur)="blurFunc()">
+ (click)="clickFunc()" + (blur)="blurFunc()">
{}; - @Input() onBlur: Function = () => {}; + @Input() clickFunc: Function = () => {}; + @Input() blurFunc: Function = () => {}; public materialButtonType = MaterialButtonType; diff --git a/src/app/shared/components/editor/editor.component.ts b/src/app/shared/components/editor/editor.component.ts index 81ea254d..27516ae7 100644 --- a/src/app/shared/components/editor/editor.component.ts +++ b/src/app/shared/components/editor/editor.component.ts @@ -107,7 +107,7 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit, AfterC this.focusChange = new MutationObserver((mutations: MutationRecord[]) => { mutations.forEach((mutation: MutationRecord) => { - let classList = this.editorViewChild.nativeElement.children[1]?.children[0]?.children[0]?.classList; + let classList = this.editorViewChild.nativeElement?.children[1]?.children[0]?.children[0]?.classList; if (classList) { this.hasFocus = Array.from(classList).includes('ProseMirror-focused') ? true : false; @@ -121,9 +121,12 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit, AfterC }); }); - this.focusChange.observe(this.editorViewChild.nativeElement.children[1].children[0].children[0], { - attributeFilter: ['class'], - }); + const node = this.editorViewChild.nativeElement?.children[1]?.children[0]?.children[0]; + if (node instanceof Node) { + this.focusChange.observe(node, { + attributeFilter: ['class'], + }); + } if (this.autofocus) this.editor.commands.focus(); diff --git a/src/app/shared/components/editor/menu/editor-menu/editor-menu.component.spec.ts b/src/app/shared/components/editor/menu/editor-menu/editor-menu.component.spec.ts deleted file mode 100644 index 0ec0b775..00000000 --- a/src/app/shared/components/editor/menu/editor-menu/editor-menu.component.spec.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { EditorMenuComponent } from './editor-menu.component'; - -describe('EditorMenuComponent', () => { - let component: EditorMenuComponent; - let fixture: ComponentFixture; - - beforeEach(() => { - TestBed.configureTestingModule({ - declarations: [EditorMenuComponent] - }); - fixture = TestBed.createComponent(EditorMenuComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/shared/components/event-form/event-form.component.spec.ts b/src/app/shared/components/event-form/event-form.component.spec.ts index 60417b82..cf4d32bb 100644 --- a/src/app/shared/components/event-form/event-form.component.spec.ts +++ b/src/app/shared/components/event-form/event-form.component.spec.ts @@ -1,20 +1,44 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { EventFormComponent } from './event-form.component'; +import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core'; +import { HttpClient, HttpClientModule } from '@angular/common/http'; +import { TypescriptLoader } from 'src/app/core/helpers/typescript-loader'; +import { RouterTestingModule } from '@angular/router/testing'; describe('EventFormComponent', () => { let component: EventFormComponent; + let translateService: TranslateService; let fixture: ComponentFixture; beforeEach(() => { TestBed.configureTestingModule({ - declarations: [EventFormComponent] + declarations: [EventFormComponent], + imports: [ + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), + deps: [ HttpClient ] + } + }), + HttpClientModule, + RouterTestingModule + ], + providers: [ TranslateService, HttpClient ] }); fixture = TestBed.createComponent(EventFormComponent); component = fixture.componentInstance; fixture.detectChanges(); }); + beforeEach(() => { + translateService = TestBed.inject(TranslateService); + fixture = TestBed.createComponent(EventFormComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + it('should create', () => { expect(component).toBeTruthy(); }); diff --git a/src/app/shared/components/poll-form/poll-form.component.spec.ts b/src/app/shared/components/poll-form/poll-form.component.spec.ts index 6cd64de7..4830ddda 100644 --- a/src/app/shared/components/poll-form/poll-form.component.spec.ts +++ b/src/app/shared/components/poll-form/poll-form.component.spec.ts @@ -1,20 +1,44 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { PollFormComponent } from './poll-form.component'; +import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core'; +import { HttpClient, HttpClientModule } from '@angular/common/http'; +import { TypescriptLoader } from 'src/app/core/helpers/typescript-loader'; +import { RouterTestingModule } from '@angular/router/testing'; describe('PollFormComponent', () => { let component: PollFormComponent; + let translateService: TranslateService; let fixture: ComponentFixture; beforeEach(() => { TestBed.configureTestingModule({ - declarations: [PollFormComponent] + declarations: [PollFormComponent], + imports: [ + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), + deps: [ HttpClient ] + } + }), + HttpClientModule, + RouterTestingModule + ], + providers: [ TranslateService, HttpClient ] }); fixture = TestBed.createComponent(PollFormComponent); component = fixture.componentInstance; fixture.detectChanges(); }); + beforeEach(() => { + translateService = TestBed.inject(TranslateService); + fixture = TestBed.createComponent(PollFormComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + it('should create', () => { expect(component).toBeTruthy(); }); diff --git a/src/app/shared/components/post-form/post-form.component.spec.ts b/src/app/shared/components/post-form/post-form.component.spec.ts index 17caa061..b5830457 100644 --- a/src/app/shared/components/post-form/post-form.component.spec.ts +++ b/src/app/shared/components/post-form/post-form.component.spec.ts @@ -1,20 +1,44 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { PostFormComponent } from './post-form.component'; +import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core'; +import { HttpClient, HttpClientModule } from '@angular/common/http'; +import { TypescriptLoader } from 'src/app/core/helpers/typescript-loader'; +import { RouterTestingModule } from '@angular/router/testing'; describe('PostFormComponent', () => { let component: PostFormComponent; + let translateService: TranslateService; let fixture: ComponentFixture; beforeEach(() => { TestBed.configureTestingModule({ - declarations: [PostFormComponent] + declarations: [PostFormComponent], + imports: [ + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), + deps: [ HttpClient ] + } + }), + HttpClientModule, + RouterTestingModule + ], + providers: [ TranslateService, HttpClient ] }); fixture = TestBed.createComponent(PostFormComponent); component = fixture.componentInstance; fixture.detectChanges(); }); + beforeEach(() => { + translateService = TestBed.inject(TranslateService); + fixture = TestBed.createComponent(PostFormComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + it('should create', () => { expect(component).toBeTruthy(); }); From dbd3f2e4892b8c301aab7135487a6ccd7fdfd1d3 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Mon, 30 Oct 2023 13:59:16 -0400 Subject: [PATCH 057/165] time and date input, added icon prop for input --- .../event-form/event-form.component.html | 107 ++++++++++-------- .../event-form/event-form.component.ts | 16 ++- .../components/input/input.component.html | 3 + .../components/input/input.component.scss | 11 ++ .../components/input/input.component.ts | 1 + src/app/shared/models/input-type.ts | 4 +- 6 files changed, 92 insertions(+), 50 deletions(-) diff --git a/src/app/shared/components/event-form/event-form.component.html b/src/app/shared/components/event-form/event-form.component.html index 5e52133e..b5abfd27 100644 --- a/src/app/shared/components/event-form/event-form.component.html +++ b/src/app/shared/components/event-form/event-form.component.html @@ -121,54 +121,67 @@ -
- - - - - +
+
+ + + + + + +
+ +
+ + + + + +
-
- - - - - -
+ diff --git a/src/app/shared/components/event-form/event-form.component.ts b/src/app/shared/components/event-form/event-form.component.ts index 53ebeadf..f4643010 100644 --- a/src/app/shared/components/event-form/event-form.component.ts +++ b/src/app/shared/components/event-form/event-form.component.ts @@ -19,9 +19,11 @@ export class EventFormComponent implements OnInit, OnDestroy { eventDescription: '', eventLocation: '', eventOnlinePlatform: '', - eventDuration: '', + eventDuration: EventDuration.Single, eventStartDate: '', - eventEndDate: '' + eventStartTime: '12:00', + eventEndDate: '', + eventEndTime: '13:00' } @Input() disabled: boolean = false; @@ -92,12 +94,20 @@ export class EventFormComponent implements OnInit, OnDestroy { this.form.controls['eventEndDate'].removeValidators(Validators.required); this.form.controls['eventEndDate'].clearValidators(); this.form.controls['eventEndDate'].updateValueAndValidity(); + + this.form.controls['eventEndTime'].removeValidators(Validators.required); + this.form.controls['eventEndTime'].clearValidators(); + this.form.controls['eventEndTime'].updateValueAndValidity(); break; case EventDuration.Multi: this.form.controls['eventEndDate'].addValidators(Validators.required); this.form.controls['eventEndDate'].clearValidators(); this.form.controls['eventEndDate'].updateValueAndValidity(); + + this.form.controls['eventEndTime'].addValidators(Validators.required); + this.form.controls['eventEndTime'].clearValidators(); + this.form.controls['eventEndTime'].updateValueAndValidity(); break; } } @@ -120,7 +130,9 @@ export interface IEventForm { eventOnlinePlatform: string, eventDuration: EventDuration | string, eventStartDate: string, + eventStartTime: string, eventEndDate: string + eventEndTime: string } enum EventType { diff --git a/src/app/shared/components/input/input.component.html b/src/app/shared/components/input/input.component.html index 1c55251e..769753d7 100644 --- a/src/app/shared/components/input/input.component.html +++ b/src/app/shared/components/input/input.component.html @@ -31,8 +31,11 @@ [attr.formControl]="control" [attr.formControlName]="controlName" [attr.errorStateMatcher]="errorMatcher" + [ngClass]="{icon: icon}" > + + Date: Mon, 30 Oct 2023 18:10:09 +0000 Subject: [PATCH 058/165] Dependency Graph ignore-deploy --- dependency-graph.svg | 4373 +++++++++++++++++++++++------------------- 1 file changed, 2433 insertions(+), 1940 deletions(-) diff --git a/dependency-graph.svg b/dependency-graph.svg index a7211834..22bf761e 100644 --- a/dependency-graph.svg +++ b/dependency-graph.svg @@ -4,367 +4,407 @@ - - + + dependency-cruiser output - + cluster_src - -src + +src cluster_src/app - -app + +app cluster_src/app/core - -core + +core cluster_src/app/core/auth - -auth + +auth cluster_src/app/core/constants - -constants + +constants cluster_src/app/core/guards - -guards + +guards cluster_src/app/core/helpers - -helpers + +helpers cluster_src/app/core/interceptors - -interceptors + +interceptors cluster_src/app/core/models - -models + +models cluster_src/app/core/services - -services + +services cluster_src/app/features - -features + +features cluster_src/app/features/about - -about + +about cluster_src/app/features/blog - -blog + +blog cluster_src/app/features/bookmarks - -bookmarks + +bookmarks cluster_src/app/features/dashboard - -dashboard + +dashboard cluster_src/app/features/events - -events + +events cluster_src/app/features/events/components - -components + +components cluster_src/app/features/events/components/event-card - -event-card + +event-card cluster_src/app/features/events/components/event-list - -event-list + +event-list cluster_src/app/features/events/components/event - -event + +event cluster_src/app/features/events/models - -models + +models cluster_src/app/features/events/resolvers - -resolvers + +resolvers cluster_src/app/features/friends - -friends + +friends cluster_src/app/features/groups - -groups + +groups cluster_src/app/features/groups/components - -components + +components cluster_src/app/features/groups/components/group-card - -group-card + +group-card cluster_src/app/features/groups/components/group-list - -group-list + +group-list cluster_src/app/features/groups/components/group - -group + +group cluster_src/app/features/groups/models - -models + +models cluster_src/app/features/home - -home + +home cluster_src/app/features/invite - -invite + +invite cluster_src/app/features/login - -login + +login cluster_src/app/features/members - -members + +members cluster_src/app/features/messages - -messages + +messages cluster_src/app/features/missions - -missions + +missions cluster_src/app/features/news-feed - -news-feed + +news-feed cluster_src/app/features/news-feed/components - -components + +components cluster_src/app/features/news-feed/components/news-card - -news-card + +news-card cluster_src/app/features/news-feed/components/news-list - -news-list + +news-list cluster_src/app/features/news-feed/models - -models + +models cluster_src/app/features/privacy - -privacy + +privacy cluster_src/app/features/profile - -profile + +profile cluster_src/app/features/profile/components - -components + +components -cluster_src/app/features/profile/components/profile-card - -profile-card +cluster_src/app/features/profile/components/post + +post -cluster_src/app/features/profile/components/profile-list - -profile-list +cluster_src/app/features/profile/components/profile-card + +profile-card -cluster_src/app/features/register - -register +cluster_src/app/features/profile/components/profile-list + +profile-list -cluster_src/app/features/search - -search +cluster_src/app/features/register + +register -cluster_src/app/features/settings - -settings +cluster_src/app/features/search + +search -cluster_src/app/features/splash - -splash +cluster_src/app/features/settings + +settings -cluster_src/app/features/stats - -stats +cluster_src/app/features/splash + +splash -cluster_src/app/features/terms - -terms +cluster_src/app/features/stats + +stats -cluster_src/app/features/the-wire - -the-wire +cluster_src/app/features/terms + +terms -cluster_src/app/shared - -shared +cluster_src/app/features/the-wire + +the-wire -cluster_src/app/shared/components - -components +cluster_src/app/shared + +shared -cluster_src/app/shared/components/banner - -banner +cluster_src/app/shared/components + +components -cluster_src/app/shared/components/button - -button +cluster_src/app/shared/components/banner + +banner -cluster_src/app/shared/components/calendar-button - -calendar-button +cluster_src/app/shared/components/blog-form + +blog-form -cluster_src/app/shared/components/editor - -editor +cluster_src/app/shared/components/button + +button -cluster_src/app/shared/components/footer - -footer +cluster_src/app/shared/components/calendar-button + +calendar-button -cluster_src/app/shared/components/forbidden - -forbidden +cluster_src/app/shared/components/editor + +editor -cluster_src/app/shared/components/header - -header +cluster_src/app/shared/components/editor/menu + +menu -cluster_src/app/shared/components/input - -input +cluster_src/app/shared/components/editor/menu/editor-menu + +editor-menu -cluster_src/app/shared/components/language-selector - -language-selector +cluster_src/app/shared/components/event-form + +event-form -cluster_src/app/shared/components/not-found - -not-found +cluster_src/app/shared/components/footer + +footer -cluster_src/app/shared/components/page-title - -page-title +cluster_src/app/shared/components/forbidden + +forbidden -cluster_src/app/shared/components/profile-pic - -profile-pic +cluster_src/app/shared/components/header + +header -cluster_src/app/shared/components/unauthorized - -unauthorized +cluster_src/app/shared/components/input + +input -cluster_src/app/shared/factories - -factories +cluster_src/app/shared/components/language-selector + +language-selector -cluster_src/app/shared/models - -models +cluster_src/app/shared/components/not-found + +not-found -cluster_src/assets - -assets +cluster_src/app/shared/components/page-title + +page-title -cluster_src/assets/i18n - -i18n +cluster_src/app/shared/components/poll-form + +poll-form +cluster_src/app/shared/components/post-form + +post-form + + +cluster_src/app/shared/components/profile-pic + +profile-pic + + +cluster_src/app/shared/components/unauthorized + +unauthorized + + +cluster_src/app/shared/factories + +factories + + +cluster_src/app/shared/models + +models + + +cluster_src/app/shared/pipes + +pipes + + +cluster_src/assets + +assets + + +cluster_src/assets/i18n + +i18n + + cluster_src/environments environments @@ -373,8 +413,8 @@ src/app/app-routing.module.ts - -app-routing.module.ts + +app-routing.module.ts @@ -382,542 +422,542 @@ src/app/core/constants/routes.constants.ts - -routes.constants.ts + +routes.constants.ts src/app/app-routing.module.ts->src/app/core/constants/routes.constants.ts - - + + src/app/core/guards/auth.guard.ts - -auth.guard.ts + +auth.guard.ts src/app/app-routing.module.ts->src/app/core/guards/auth.guard.ts - - + + src/app/core/guards/interceptor.guard.ts - -interceptor.guard.ts + +interceptor.guard.ts src/app/app-routing.module.ts->src/app/core/guards/interceptor.guard.ts - - + + src/app/core/guards/login.guard.ts - -login.guard.ts + +login.guard.ts src/app/app-routing.module.ts->src/app/core/guards/login.guard.ts - - + + src/app/core/guards/redirect.guard.ts - -redirect.guard.ts + +redirect.guard.ts src/app/app-routing.module.ts->src/app/core/guards/redirect.guard.ts - - + + src/app/core/services/translations.service.ts - -translations.service.ts + +translations.service.ts src/app/app-routing.module.ts->src/app/core/services/translations.service.ts - - + + src/app/features/about/about.module.ts - -about.module.ts + +about.module.ts src/app/app-routing.module.ts->src/app/features/about/about.module.ts - - - - + + + + src/app/features/blog/blog.module.ts - -blog.module.ts + +blog.module.ts src/app/app-routing.module.ts->src/app/features/blog/blog.module.ts - - - - + + + + src/app/features/bookmarks/bookmarks.module.ts - -bookmarks.module.ts + +bookmarks.module.ts src/app/app-routing.module.ts->src/app/features/bookmarks/bookmarks.module.ts - - - - + + + + src/app/features/dashboard/dashboard.module.ts - -dashboard.module.ts + +dashboard.module.ts src/app/app-routing.module.ts->src/app/features/dashboard/dashboard.module.ts - - - - + + + + src/app/features/events/events.module.ts - -events.module.ts + +events.module.ts src/app/app-routing.module.ts->src/app/features/events/events.module.ts - - - - + + + + src/app/features/friends/friends.module.ts - -friends.module.ts + +friends.module.ts src/app/app-routing.module.ts->src/app/features/friends/friends.module.ts - - - - + + + + src/app/features/groups/groups.module.ts - -groups.module.ts + +groups.module.ts src/app/app-routing.module.ts->src/app/features/groups/groups.module.ts - - - - + + + + src/app/features/home/home.module.ts - -home.module.ts + +home.module.ts src/app/app-routing.module.ts->src/app/features/home/home.module.ts - - - - + + + + src/app/features/invite/invite.module.ts - -invite.module.ts + +invite.module.ts src/app/app-routing.module.ts->src/app/features/invite/invite.module.ts - - - - + + + + src/app/features/login/login.module.ts - -login.module.ts + +login.module.ts src/app/app-routing.module.ts->src/app/features/login/login.module.ts - - - - + + + + src/app/features/members/members.module.ts - -members.module.ts + +members.module.ts src/app/app-routing.module.ts->src/app/features/members/members.module.ts - - - - + + + + src/app/features/messages/messages.module.ts - -messages.module.ts + +messages.module.ts src/app/app-routing.module.ts->src/app/features/messages/messages.module.ts - - - - + + + + src/app/features/missions/missions.module.ts - -missions.module.ts + +missions.module.ts src/app/app-routing.module.ts->src/app/features/missions/missions.module.ts - - - - + + + + src/app/features/news-feed/news-feed.module.ts - -news-feed.module.ts + +news-feed.module.ts src/app/app-routing.module.ts->src/app/features/news-feed/news-feed.module.ts - - - - + + + + src/app/features/privacy/privacy.module.ts - -privacy.module.ts + +privacy.module.ts src/app/app-routing.module.ts->src/app/features/privacy/privacy.module.ts - - - - + + + + src/app/features/profile/profile.module.ts - -profile.module.ts + +profile.module.ts src/app/app-routing.module.ts->src/app/features/profile/profile.module.ts - - - - + + + + src/app/features/register/register.module.ts - -register.module.ts + +register.module.ts src/app/app-routing.module.ts->src/app/features/register/register.module.ts - - - - + + + + src/app/features/search/search.module.ts - -search.module.ts + +search.module.ts src/app/app-routing.module.ts->src/app/features/search/search.module.ts - - - - + + + + src/app/features/settings/settings.module.ts - -settings.module.ts + +settings.module.ts src/app/app-routing.module.ts->src/app/features/settings/settings.module.ts - - - - + + + + src/app/features/splash/splash.module.ts - -splash.module.ts + +splash.module.ts src/app/app-routing.module.ts->src/app/features/splash/splash.module.ts - - - - + + + + src/app/features/stats/stats.module.ts - -stats.module.ts + +stats.module.ts src/app/app-routing.module.ts->src/app/features/stats/stats.module.ts - - - - + + + + src/app/features/terms/terms.module.ts - -terms.module.ts + +terms.module.ts src/app/app-routing.module.ts->src/app/features/terms/terms.module.ts - - - - + + + + src/app/features/the-wire/the-wire.module.ts - -the-wire.module.ts + +the-wire.module.ts src/app/app-routing.module.ts->src/app/features/the-wire/the-wire.module.ts - - - - + + + + src/app/shared/components/forbidden/forbidden.component.ts - -forbidden.component.ts + +forbidden.component.ts src/app/app-routing.module.ts->src/app/shared/components/forbidden/forbidden.component.ts - - + + src/app/shared/components/not-found/not-found.component.ts - -not-found.component.ts + +not-found.component.ts src/app/app-routing.module.ts->src/app/shared/components/not-found/not-found.component.ts - - + + src/app/shared/components/unauthorized/unauthorized.component.ts - -unauthorized.component.ts + +unauthorized.component.ts src/app/app-routing.module.ts->src/app/shared/components/unauthorized/unauthorized.component.ts - - + + src/app/core/services/session-storage.service.ts - -session-storage.service.ts + +session-storage.service.ts src/app/core/guards/auth.guard.ts->src/app/core/services/session-storage.service.ts - - + + @@ -931,876 +971,891 @@ src/app/core/guards/auth.guard.ts->src/environments/environment.ts - - + + src/app/core/guards/interceptor.guard.ts->src/app/core/services/session-storage.service.ts - - + + - + src/assets/i18n/translations.en.ts - - -translations.en.ts + + +translations.en.ts - + src/app/core/services/translations.service.ts->src/assets/i18n/translations.en.ts - - + + src/app/shared/shared.module.ts - -shared.module.ts + +shared.module.ts - + src/app/features/about/about.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/about/about-routing.module.ts - - -about-routing.module.ts + + +about-routing.module.ts - + src/app/features/about/about.module.ts->src/app/features/about/about-routing.module.ts - - + + - + src/app/features/about/about.component.ts - - -about.component.ts + + +about.component.ts - + src/app/features/about/about.module.ts->src/app/features/about/about.component.ts - - + + - + src/app/features/blog/blog.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/blog/blog-routing.module.ts - - -blog-routing.module.ts + + +blog-routing.module.ts - + src/app/features/blog/blog.module.ts->src/app/features/blog/blog-routing.module.ts - - + + - + src/app/features/bookmarks/bookmarks.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/bookmarks/bookmarks-routing.module.ts - - -bookmarks-routing.module.ts + + +bookmarks-routing.module.ts - + src/app/features/bookmarks/bookmarks.module.ts->src/app/features/bookmarks/bookmarks-routing.module.ts - - + + - + src/app/features/dashboard/dashboard.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/dashboard/dashboard-routing.module.ts - - -dashboard-routing.module.ts + + +dashboard-routing.module.ts - + src/app/features/dashboard/dashboard.module.ts->src/app/features/dashboard/dashboard-routing.module.ts - - + + - + src/app/features/events/events.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/events/components/event-card/event-card.component.ts - - -event-card.component.ts + + +event-card.component.ts - + src/app/features/events/events.module.ts->src/app/features/events/components/event-card/event-card.component.ts - - + + - + src/app/features/events/components/event-list/event-list.component.ts - - -event-list.component.ts + + +event-list.component.ts - + src/app/features/events/events.module.ts->src/app/features/events/components/event-list/event-list.component.ts - - + + - + src/app/features/events/components/event/event.component.ts - - -event.component.ts + + +event.component.ts - + src/app/features/events/events.module.ts->src/app/features/events/components/event/event.component.ts - - + + - + src/app/features/events/events-routing.module.ts - - -events-routing.module.ts + + +events-routing.module.ts - + src/app/features/events/events.module.ts->src/app/features/events/events-routing.module.ts - - + + - + src/app/features/friends/friends.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/friends/friends-routing.module.ts - - -friends-routing.module.ts + + +friends-routing.module.ts - + src/app/features/friends/friends.module.ts->src/app/features/friends/friends-routing.module.ts - - + + - + src/app/features/groups/groups.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/groups/components/group-card/group-card.component.ts - - -group-card.component.ts + + +group-card.component.ts - + src/app/features/groups/groups.module.ts->src/app/features/groups/components/group-card/group-card.component.ts - - + + - + src/app/features/groups/components/group-list/group-list.component.ts - - -group-list.component.ts + + +group-list.component.ts - + src/app/features/groups/groups.module.ts->src/app/features/groups/components/group-list/group-list.component.ts - - + + - + src/app/features/groups/components/group/group.component.ts - - -group.component.ts + + +group.component.ts - + src/app/features/groups/groups.module.ts->src/app/features/groups/components/group/group.component.ts - - + + - + src/app/features/groups/groups-routing.module.ts - - -groups-routing.module.ts + + +groups-routing.module.ts - + src/app/features/groups/groups.module.ts->src/app/features/groups/groups-routing.module.ts - - + + - + src/app/features/home/home.module.ts->src/app/features/events/events.module.ts - - - - + + + + - + src/app/features/home/home.module.ts->src/app/features/groups/groups.module.ts - - - - + + + + - + src/app/features/home/home.module.ts->src/app/features/news-feed/news-feed.module.ts - - - - + + + + - + src/app/features/home/home.module.ts->src/app/features/profile/profile.module.ts - - - - + + + + - + src/app/features/home/home.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/home/home-routing.module.ts - - -home-routing.module.ts + + +home-routing.module.ts - + src/app/features/home/home.module.ts->src/app/features/home/home-routing.module.ts - - + + - + src/app/features/home/home.component.ts - - -home.component.ts + + +home.component.ts - + src/app/features/home/home.module.ts->src/app/features/home/home.component.ts - - + + - + src/app/features/invite/invite.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/invite/invite-routing.module.ts - - -invite-routing.module.ts + + +invite-routing.module.ts - + src/app/features/invite/invite.module.ts->src/app/features/invite/invite-routing.module.ts - - + + - + src/app/features/login/login.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/login/login-routing.module.ts - - -login-routing.module.ts + + +login-routing.module.ts - + src/app/features/login/login.module.ts->src/app/features/login/login-routing.module.ts - - + + - + src/app/features/login/login.component.ts - - -login.component.ts + + +login.component.ts - + src/app/features/login/login.module.ts->src/app/features/login/login.component.ts - - + + - + src/app/features/members/members.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/members/members-routing.module.ts - - -members-routing.module.ts + + +members-routing.module.ts - + src/app/features/members/members.module.ts->src/app/features/members/members-routing.module.ts - - + + - + src/app/features/messages/messages.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/messages/messages-routing.module.ts - - -messages-routing.module.ts + + +messages-routing.module.ts - + src/app/features/messages/messages.module.ts->src/app/features/messages/messages-routing.module.ts - - + + - + src/app/features/missions/missions.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/missions/missions-routing.module.ts - - -missions-routing.module.ts + + +missions-routing.module.ts - + src/app/features/missions/missions.module.ts->src/app/features/missions/missions-routing.module.ts - - + + - + src/app/features/news-feed/news-feed.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/news-feed/components/news-card/news-card.component.ts - - -news-card.component.ts + + +news-card.component.ts - + src/app/features/news-feed/news-feed.module.ts->src/app/features/news-feed/components/news-card/news-card.component.ts - - + + - + src/app/features/news-feed/components/news-list/news-list.component.ts - - -news-list.component.ts + + +news-list.component.ts - + src/app/features/news-feed/news-feed.module.ts->src/app/features/news-feed/components/news-list/news-list.component.ts - - + + - + src/app/features/news-feed/news-feed-routing.module.ts - - -news-feed-routing.module.ts + + +news-feed-routing.module.ts - + src/app/features/news-feed/news-feed.module.ts->src/app/features/news-feed/news-feed-routing.module.ts - - + + - + src/app/features/privacy/privacy.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/privacy/privacy-routing.module.ts - - -privacy-routing.module.ts + + +privacy-routing.module.ts - + src/app/features/privacy/privacy.module.ts->src/app/features/privacy/privacy-routing.module.ts - - + + - + src/app/features/privacy/privacy.component.ts - - -privacy.component.ts + + +privacy.component.ts - + src/app/features/privacy/privacy.module.ts->src/app/features/privacy/privacy.component.ts - - + + - + src/app/features/profile/profile.module.ts->src/app/shared/shared.module.ts - - - - + + + + + + + +src/app/features/profile/components/post/post.component.ts + + +post.component.ts + + + + + +src/app/features/profile/profile.module.ts->src/app/features/profile/components/post/post.component.ts + + - + src/app/features/profile/components/profile-card/profile-card.component.ts - - -profile-card.component.ts + + +profile-card.component.ts - + src/app/features/profile/profile.module.ts->src/app/features/profile/components/profile-card/profile-card.component.ts - - + + - + src/app/features/profile/components/profile-list/profile-list.component.ts - - -profile-list.component.ts + + +profile-list.component.ts - + src/app/features/profile/profile.module.ts->src/app/features/profile/components/profile-list/profile-list.component.ts - - + + - + src/app/features/profile/profile-routing.module.ts - - -profile-routing.module.ts + + +profile-routing.module.ts - + src/app/features/profile/profile.module.ts->src/app/features/profile/profile-routing.module.ts - - + + - + src/app/features/register/register.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/register/register-routing.module.ts - - -register-routing.module.ts + + +register-routing.module.ts - + src/app/features/register/register.module.ts->src/app/features/register/register-routing.module.ts - - + + - + src/app/features/register/register.component.ts - - -register.component.ts + + +register.component.ts - + src/app/features/register/register.module.ts->src/app/features/register/register.component.ts - - + + - + src/app/features/search/search.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/search/search-routing.module.ts - - -search-routing.module.ts + + +search-routing.module.ts - + src/app/features/search/search.module.ts->src/app/features/search/search-routing.module.ts - - + + - + src/app/features/settings/settings.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/settings/settings-routing.module.ts - - -settings-routing.module.ts + + +settings-routing.module.ts - + src/app/features/settings/settings.module.ts->src/app/features/settings/settings-routing.module.ts - - + + - + src/app/features/splash/splash.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/splash/splash-routing.module.ts - - -splash-routing.module.ts + + +splash-routing.module.ts - + src/app/features/splash/splash.module.ts->src/app/features/splash/splash-routing.module.ts - - + + - + src/app/features/splash/splash.component.ts - - -splash.component.ts + + +splash.component.ts - + src/app/features/splash/splash.module.ts->src/app/features/splash/splash.component.ts - - + + - + src/app/features/stats/stats.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/stats/stats-routing.module.ts - - -stats-routing.module.ts + + +stats-routing.module.ts - + src/app/features/stats/stats.module.ts->src/app/features/stats/stats-routing.module.ts - - + + - + src/app/features/stats/stats.component.ts - - -stats.component.ts + + +stats.component.ts - + src/app/features/stats/stats.module.ts->src/app/features/stats/stats.component.ts - - + + - + src/app/features/terms/terms.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/terms/terms-routing.module.ts - - -terms-routing.module.ts + + +terms-routing.module.ts - + src/app/features/terms/terms.module.ts->src/app/features/terms/terms-routing.module.ts - - + + - + src/app/features/terms/terms.component.ts - - -terms.component.ts + + +terms.component.ts - + src/app/features/terms/terms.module.ts->src/app/features/terms/terms.component.ts - - + + - + src/app/features/the-wire/the-wire.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/the-wire/the-wire-routing.module.ts - - -the-wire-routing.module.ts + + +the-wire-routing.module.ts - + src/app/features/the-wire/the-wire.module.ts->src/app/features/the-wire/the-wire-routing.module.ts - - + + src/app/app.component.spec.ts - -app.component.spec.ts + +app.component.spec.ts @@ -1808,513 +1863,603 @@ src/app/app.component.ts - -app.component.ts + +app.component.ts src/app/app.component.spec.ts->src/app/app.component.ts - - + + src/app/core/auth/auth.module.ts - -auth.module.ts + +auth.module.ts src/app/app.component.spec.ts->src/app/core/auth/auth.module.ts - - + + src/app/core/helpers/typescript-loader.ts - -typescript-loader.ts + +typescript-loader.ts src/app/app.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/app.component.ts->src/app/core/constants/routes.constants.ts - - + + src/app/app.component.ts->src/app/core/services/translations.service.ts - - + + src/app/core/services/language-storage.service.ts - -language-storage.service.ts + +language-storage.service.ts src/app/app.component.ts->src/app/core/services/language-storage.service.ts - - + + src/app/core/auth/auth.module.ts->src/app/core/services/session-storage.service.ts - - + + src/app/core/auth/auth.module.ts->src/environments/environment.ts - - + + - + src/app/core/services/local-storage-ref.service.ts - - -local-storage-ref.service.ts + + +local-storage-ref.service.ts - + src/app/core/services/language-storage.service.ts->src/app/core/services/local-storage-ref.service.ts - - + + src/app/app.module.ts - -app.module.ts + +app.module.ts src/app/app.module.ts->src/app/app-routing.module.ts - - - - + + + + src/app/app.module.ts->src/app/app.component.ts - - + + src/app/app.module.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/core/core.module.ts - -core.module.ts + +core.module.ts src/app/app.module.ts->src/app/core/core.module.ts - - - - + + + + src/app/core/services/title.service.ts - -title.service.ts + +title.service.ts src/app/app.module.ts->src/app/core/services/title.service.ts - - + + src/app/features/events/events.component.ts - -events.component.ts + +events.component.ts src/app/app.module.ts->src/app/features/events/events.component.ts - - + + src/app/features/groups/groups.component.ts - -groups.component.ts + +groups.component.ts src/app/app.module.ts->src/app/features/groups/groups.component.ts - - + + src/app/app.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/core/core.module.ts->src/app/core/auth/auth.module.ts - - + + src/app/core/core.module.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/core/core.module.ts->src/app/app.module.ts - - - - + + + + - + src/app/shared/shared.module.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/shared.module.ts->src/app/shared/components/forbidden/forbidden.component.ts - - + + - + src/app/shared/shared.module.ts->src/app/shared/components/not-found/not-found.component.ts - - + + - + src/app/shared/shared.module.ts->src/app/shared/components/unauthorized/unauthorized.component.ts - - + + - + src/app/shared/shared.module.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/shared.module.ts->src/app/app.module.ts - - - - + + + + - + src/app/shared/components/banner/banner.component.ts - - -banner.component.ts + + +banner.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/banner/banner.component.ts - - + + + + + +src/app/shared/pipes/truncate-file-name.pipe.ts + + +truncate-file-name.pipe.ts + + + + + +src/app/shared/shared.module.ts->src/app/shared/pipes/truncate-file-name.pipe.ts + + + + + +src/app/shared/components/blog-form/blog-form.component.ts + + +blog-form.component.ts + + + + + +src/app/shared/shared.module.ts->src/app/shared/components/blog-form/blog-form.component.ts + + - + src/app/shared/components/button/button.component.ts - - -button.component.ts + + +button.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/button/button.component.ts - - + + - + src/app/shared/components/calendar-button/calendar-button.component.ts - - -calendar-button.component.ts + + +calendar-button.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/calendar-button/calendar-button.component.ts - - + + - + src/app/shared/components/editor/editor.component.ts - - -editor.component.ts + + +editor.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/editor/editor.component.ts - - + + - + src/app/shared/factories/editor-config.factory.ts - - -editor-config.factory.ts + + +editor-config.factory.ts - + src/app/shared/shared.module.ts->src/app/shared/factories/editor-config.factory.ts - - + + + + + +src/app/shared/components/editor/menu/editor-menu/editor-menu.component.ts + + +editor-menu.component.ts + + + + + +src/app/shared/shared.module.ts->src/app/shared/components/editor/menu/editor-menu/editor-menu.component.ts + + + + + +src/app/shared/components/event-form/event-form.component.ts + + +event-form.component.ts + + + + + +src/app/shared/shared.module.ts->src/app/shared/components/event-form/event-form.component.ts + + - + src/app/shared/components/footer/footer.component.ts - - -footer.component.ts + + +footer.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/footer/footer.component.ts - - + + - + src/app/shared/components/header/header.component.ts - - -header.component.ts + + +header.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/header/header.component.ts - - + + - + src/app/shared/components/input/input.component.ts - - -input.component.ts + + +input.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/input/input.component.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.ts - - -language-selector.component.ts + + +language-selector.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/language-selector/language-selector.component.ts - - + + - + src/app/shared/components/page-title/page-title.component.ts - - -page-title.component.ts + + +page-title.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/page-title/page-title.component.ts - - + + + + + +src/app/shared/components/poll-form/poll-form.component.ts + + +poll-form.component.ts + + + + + +src/app/shared/shared.module.ts->src/app/shared/components/poll-form/poll-form.component.ts + + + + + +src/app/shared/components/post-form/post-form.component.ts + + +post-form.component.ts + + + + + +src/app/shared/shared.module.ts->src/app/shared/components/post-form/post-form.component.ts + + - + src/app/shared/components/profile-pic/profile-pic.component.ts - - -profile-pic.component.ts + + +profile-pic.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/profile-pic/profile-pic.component.ts - - + + - + src/app/core/services/session-storage.service.ts->src/app/core/services/local-storage-ref.service.ts - - + + src/app/core/guards/auth.guard.spec.ts - -auth.guard.spec.ts + +auth.guard.spec.ts src/app/core/guards/auth.guard.spec.ts->src/app/core/guards/auth.guard.ts - - + + src/app/core/guards/auth.guard.spec.ts->src/app/core/auth/auth.module.ts - - + + src/app/core/guards/auth.guard.spec.ts->src/app/core/services/session-storage.service.ts - - + + src/app/core/guards/interceptor.guard.spec.ts - -interceptor.guard.spec.ts + +interceptor.guard.spec.ts src/app/core/guards/interceptor.guard.spec.ts->src/app/core/guards/interceptor.guard.ts - - + + src/app/core/guards/login.guard.spec.ts - -login.guard.spec.ts + +login.guard.spec.ts src/app/core/guards/login.guard.spec.ts->src/app/core/guards/login.guard.ts - - + + src/app/core/guards/login.guard.spec.ts->src/app/core/auth/auth.module.ts - - + + src/app/core/guards/redirect.guard.spec.ts - -redirect.guard.spec.ts + +redirect.guard.spec.ts src/app/core/guards/redirect.guard.spec.ts->src/app/core/guards/redirect.guard.ts - - + + src/app/core/guards/role.guard.spec.ts - -role.guard.spec.ts + +role.guard.spec.ts @@ -2322,23 +2467,23 @@ src/app/core/guards/role.guard.ts - -role.guard.ts + +role.guard.ts src/app/core/guards/role.guard.spec.ts->src/app/core/guards/role.guard.ts - - + + src/app/core/interceptors/error.interceptor.spec.ts - -error.interceptor.spec.ts + +error.interceptor.spec.ts @@ -2346,1925 +2491,2273 @@ src/app/core/interceptors/error.interceptor.ts - -error.interceptor.ts + +error.interceptor.ts src/app/core/interceptors/error.interceptor.spec.ts->src/app/core/interceptors/error.interceptor.ts - - + + - + -src/app/core/models/location.ts - - -location.ts +src/app/core/models/blog.model.ts + + +blog.model.ts - + -src/app/core/models/person.ts - - -person.ts +src/app/core/models/person.model.ts + + +person.model.ts - + -src/app/core/models/person.ts->src/app/core/models/location.ts - - +src/app/core/models/blog.model.ts->src/app/core/models/person.model.ts + + - + +src/app/features/news-feed/models/INewsItem.ts + + +INewsItem.ts + + + + + +src/app/core/models/blog.model.ts->src/app/features/news-feed/models/INewsItem.ts + + + + + +src/app/core/models/location.model.ts + + +location.model.ts + + + + + +src/app/core/models/person.model.ts->src/app/core/models/location.model.ts + + + + + +src/app/features/news-feed/models/INewsItem.ts->src/app/core/models/person.model.ts + + + + + +src/app/core/models/poll.model.ts + + +poll.model.ts + + + + + +src/app/core/models/poll.model.ts->src/app/core/models/person.model.ts + + + + + +src/app/core/models/poll.model.ts->src/app/features/news-feed/models/INewsItem.ts + + + + + +src/app/core/models/post.model.ts + + +post.model.ts + + + + + +src/app/core/models/post.model.ts->src/app/core/models/person.model.ts + + + + + +src/app/core/models/post.model.ts->src/app/features/news-feed/models/INewsItem.ts + + + + + +src/app/core/services/debounce.service.spec.ts + + +debounce.service.spec.ts + + + + + +src/app/core/services/debounce.service.ts + + +debounce.service.ts + + + + + +src/app/core/services/debounce.service.spec.ts->src/app/core/services/debounce.service.ts + + + + + src/app/core/services/event.service.spec.ts - - -event.service.spec.ts + + +event.service.spec.ts - + src/app/core/services/event.service.ts - - -event.service.ts + + +event.service.ts - + src/app/core/services/event.service.spec.ts->src/app/core/services/event.service.ts - - + + - - -src/app/core/services/event.service.ts->src/app/core/models/location.ts - - + + +src/app/core/services/event.service.ts->src/app/core/models/location.model.ts + + - + src/app/core/services/group.service.ts - - -group.service.ts + + +group.service.ts - + src/app/core/services/event.service.ts->src/app/core/services/group.service.ts - - + + - + src/app/core/services/people.service.ts - - -people.service.ts + + +people.service.ts - + src/app/core/services/event.service.ts->src/app/core/services/people.service.ts - - + + - + src/app/features/events/models/event.ts - - -event.ts + + +event.ts - + src/app/core/services/event.service.ts->src/app/features/events/models/event.ts - - + + - + src/app/features/groups/models/group.ts - - -group.ts + + +group.ts - + src/app/core/services/group.service.ts->src/app/features/groups/models/group.ts - - + + - - -src/app/core/services/people.service.ts->src/app/core/models/location.ts - - + + +src/app/core/services/people.service.ts->src/app/core/models/person.model.ts + + - - -src/app/core/services/people.service.ts->src/app/core/models/person.ts - - + + +src/app/core/services/people.service.ts->src/app/core/models/location.model.ts + + - - -src/app/features/events/models/event.ts->src/app/core/models/location.ts - - + + +src/app/features/events/models/event.ts->src/app/core/models/person.model.ts + + - - -src/app/features/events/models/event.ts->src/app/core/models/person.ts - - + + +src/app/features/events/models/event.ts->src/app/core/models/location.model.ts + + - + src/app/features/events/models/event.ts->src/app/features/groups/models/group.ts - - + + + + + +src/app/core/services/focus-tracking.service.spec.ts + + +focus-tracking.service.spec.ts + + + + + +src/app/core/services/focus-tracking.service.ts + + +focus-tracking.service.ts + + + + + +src/app/core/services/focus-tracking.service.spec.ts->src/app/core/services/focus-tracking.service.ts + + - + src/app/core/services/group.service.spec.ts - - -group.service.spec.ts + + +group.service.spec.ts - + src/app/core/services/group.service.spec.ts->src/app/core/services/group.service.ts - - + + - + src/app/core/services/language-storage.service.spec.ts - - -language-storage.service.spec.ts + + +language-storage.service.spec.ts - + src/app/core/services/language-storage.service.spec.ts->src/app/core/services/language-storage.service.ts - - + + - + src/app/core/services/local-storage-ref.service.spec.ts - - -local-storage-ref.service.spec.ts + + +local-storage-ref.service.spec.ts - + src/app/core/services/local-storage-ref.service.spec.ts->src/app/core/services/local-storage-ref.service.ts - - + + - + src/app/core/services/news.service.spec.ts - - -news.service.spec.ts + + +news.service.spec.ts - + src/app/core/services/news.service.ts - - -news.service.ts + + +news.service.ts - + src/app/core/services/news.service.spec.ts->src/app/core/services/news.service.ts - - + + - - -src/app/core/services/news.service.ts->src/app/core/services/people.service.ts - - + + +src/app/core/services/news.service.ts->src/app/core/models/blog.model.ts + + - - -src/app/features/news-feed/models/news-item.ts - - -news-item.ts - + + +src/app/core/services/news.service.ts->src/app/features/news-feed/models/INewsItem.ts + + + + +src/app/core/services/news.service.ts->src/app/core/models/poll.model.ts + + - - -src/app/core/services/news.service.ts->src/app/features/news-feed/models/news-item.ts - - + + +src/app/core/services/news.service.ts->src/app/core/models/post.model.ts + + - - -src/app/features/news-feed/models/news-item.ts->src/app/core/models/person.ts - - + + +src/app/core/services/news.service.ts->src/app/core/services/people.service.ts + + - + src/app/core/services/people.service.spec.ts - - -people.service.spec.ts + + +people.service.spec.ts - + src/app/core/services/people.service.spec.ts->src/app/core/services/people.service.ts - - + + - + src/app/core/services/session-storage.service.spec.ts - - -session-storage.service.spec.ts + + +session-storage.service.spec.ts - + src/app/core/services/session-storage.service.spec.ts->src/app/core/services/session-storage.service.ts - - + + - + src/app/core/services/title.service.spec.ts - - -title.service.spec.ts + + +title.service.spec.ts - + src/app/core/services/title.service.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/core/services/title.service.spec.ts->src/app/core/services/title.service.ts - - + + - + src/app/core/services/user.service.spec.ts - - -user.service.spec.ts + + +user.service.spec.ts - + src/app/core/services/user.service.ts - - -user.service.ts + + +user.service.ts - + src/app/core/services/user.service.spec.ts->src/app/core/services/user.service.ts - - + + - + src/app/features/about/about-routing.module.ts->src/app/features/about/about.component.ts - - + + - + src/app/features/about/about.component.spec.ts - - -about.component.spec.ts + + +about.component.spec.ts - + src/app/features/about/about.component.spec.ts->src/app/features/about/about.component.ts - - + + - + src/app/features/blog/blog.component.ts - - -blog.component.ts + + +blog.component.ts - + src/app/features/blog/blog-routing.module.ts->src/app/features/blog/blog.component.ts - - + + - + src/app/features/blog/blog.component.spec.ts - - -blog.component.spec.ts + + +blog.component.spec.ts - + src/app/features/blog/blog.component.spec.ts->src/app/features/blog/blog.component.ts - - + + - + src/app/features/bookmarks/bookmarks.component.ts - - -bookmarks.component.ts + + +bookmarks.component.ts - + src/app/features/bookmarks/bookmarks-routing.module.ts->src/app/features/bookmarks/bookmarks.component.ts - - + + - + src/app/features/bookmarks/bookmarks.component.spec.ts - - -bookmarks.component.spec.ts + + +bookmarks.component.spec.ts - + src/app/features/bookmarks/bookmarks.component.spec.ts->src/app/features/bookmarks/bookmarks.component.ts - - + + - + src/app/features/dashboard/dashboard.component.ts - - -dashboard.component.ts + + +dashboard.component.ts - + src/app/features/dashboard/dashboard-routing.module.ts->src/app/features/dashboard/dashboard.component.ts - - + + - + src/app/features/dashboard/dashboard.component.spec.ts - - -dashboard.component.spec.ts + + +dashboard.component.spec.ts - + src/app/features/dashboard/dashboard.component.spec.ts->src/app/features/dashboard/dashboard.component.ts - - + + - + src/app/features/events/components/event-card/event-card.component.spec.ts - - -event-card.component.spec.ts + + +event-card.component.spec.ts - + src/app/features/events/components/event-card/event-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/events/components/event-card/event-card.component.spec.ts->src/app/features/events/components/event-card/event-card.component.ts - - + + - + src/app/features/events/components/event-card/event-card.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/features/events/components/event-card/event-card.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/events/components/event-card/event-card.component.ts->src/app/features/events/models/event.ts - - + + - + src/app/shared/models/material-button-type.ts - - -material-button-type.ts + + +material-button-type.ts - + src/app/features/events/components/event-card/event-card.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/shared/models/tooltip-direction.ts - - -tooltip-direction.ts + + +tooltip-direction.ts - + src/app/features/events/components/event-card/event-card.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/features/events/components/event-list/event-list.component.spec.ts - - -event-list.component.spec.ts + + +event-list.component.spec.ts - + src/app/features/events/components/event-list/event-list.component.spec.ts->src/app/features/events/components/event-list/event-list.component.ts - - + + - + src/app/features/events/components/event-list/event-list.component.ts->src/app/features/events/models/event.ts - - + + - + src/app/features/events/components/event/event.component.spec.ts - - -event.component.spec.ts + + +event.component.spec.ts - + src/app/features/events/components/event/event.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/events/components/event/event.component.spec.ts->src/app/features/events/components/event/event.component.ts - - + + - + src/app/features/events/components/event/event.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/features/events/components/event/event.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/events/components/event/event.component.ts->src/app/core/services/event.service.ts - - + + - + src/app/features/events/components/event/event.component.ts->src/app/features/events/models/event.ts - - + + - + src/app/features/events/components/event/event.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/features/events/components/event/event.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/features/events/components/event/event.component.ts->src/app/shared/components/banner/banner.component.ts - - + + - + src/app/shared/models/input-type.ts - - -input-type.ts + + +input-type.ts - + src/app/features/events/components/event/event.component.ts->src/app/shared/models/input-type.ts - - + + - + src/app/features/events/events-routing.module.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/events/events-routing.module.ts->src/app/features/events/events.component.ts - - + + - + src/app/features/events/events-routing.module.ts->src/app/features/events/components/event/event.component.ts - - + + - + src/app/features/events/events.component.spec.ts - - -events.component.spec.ts + + +events.component.spec.ts - + src/app/features/events/events.component.spec.ts->src/app/features/events/events.component.ts - - + + - + src/app/features/events/resolvers/event.resolver.ts - - -event.resolver.ts + + +event.resolver.ts - + src/app/features/events/resolvers/event.resolver.ts->src/app/core/services/event.service.ts - - + + - + src/app/features/events/resolvers/event.resolver.ts->src/app/features/events/models/event.ts - - + + - + src/app/features/friends/friends.component.ts - - -friends.component.ts + + +friends.component.ts - + src/app/features/friends/friends-routing.module.ts->src/app/features/friends/friends.component.ts - - + + - + src/app/features/friends/friends.component.spec.ts - - -friends.component.spec.ts + + +friends.component.spec.ts - + src/app/features/friends/friends.component.spec.ts->src/app/features/friends/friends.component.ts - - + + - + src/app/features/groups/components/group-card/group-card.component.spec.ts - - -group-card.component.spec.ts + + +group-card.component.spec.ts - + src/app/features/groups/components/group-card/group-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/groups/components/group-card/group-card.component.spec.ts->src/app/features/groups/components/group-card/group-card.component.ts - - + + - + src/app/features/groups/components/group-card/group-card.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/features/groups/components/group-card/group-card.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/groups/components/group-card/group-card.component.ts->src/app/features/groups/models/group.ts - - + + - + src/app/features/groups/components/group-list/group-list.component.spec.ts - - -group-list.component.spec.ts + + +group-list.component.spec.ts - + src/app/features/groups/components/group-list/group-list.component.spec.ts->src/app/features/groups/components/group-list/group-list.component.ts - - + + - + src/app/features/groups/components/group-list/group-list.component.ts->src/app/features/groups/models/group.ts - - + + - + src/app/features/groups/components/group/group.component.spec.ts - - -group.component.spec.ts + + +group.component.spec.ts - + src/app/features/groups/components/group/group.component.spec.ts->src/app/features/groups/components/group/group.component.ts - - + + - + src/app/features/groups/groups-routing.module.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/groups/groups-routing.module.ts->src/app/features/groups/groups.component.ts - - + + - + src/app/features/groups/groups-routing.module.ts->src/app/features/groups/components/group/group.component.ts - - + + - + src/app/features/groups/groups.component.spec.ts - - -groups.component.spec.ts + + +groups.component.spec.ts - + src/app/features/groups/groups.component.spec.ts->src/app/features/groups/groups.component.ts - - + + - + src/app/features/home/home-routing.module.ts->src/app/features/home/home.component.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/services/translations.service.ts - - + + - - -src/app/features/home/home.component.ts->src/app/core/models/person.ts - - + + +src/app/features/home/home.component.ts->src/app/core/models/person.model.ts + + + + + +src/app/features/home/home.component.ts->src/app/features/news-feed/models/INewsItem.ts + + - + src/app/features/home/home.component.ts->src/app/core/services/event.service.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/services/group.service.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/services/people.service.ts - - + + - + src/app/features/home/home.component.ts->src/app/features/events/models/event.ts - - + + - + src/app/features/home/home.component.ts->src/app/features/groups/models/group.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/services/news.service.ts - - - - - -src/app/features/home/home.component.ts->src/app/features/news-feed/models/news-item.ts - - + + - + src/app/features/home/home.component.ts->src/app/shared/models/input-type.ts - - + + - + src/app/features/home/home.component.spec.ts - - -home.component.spec.ts + + +home.component.spec.ts - + src/app/features/home/home.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/home/home.component.spec.ts->src/app/features/home/home.component.ts - - + + - + src/app/features/invite/invite.component.ts - - -invite.component.ts + + +invite.component.ts - + src/app/features/invite/invite-routing.module.ts->src/app/features/invite/invite.component.ts - - + + - + src/app/features/invite/invite.component.spec.ts - - -invite.component.spec.ts + + +invite.component.spec.ts - + src/app/features/invite/invite.component.spec.ts->src/app/features/invite/invite.component.ts - - + + - + src/app/features/login/login-routing.module.ts->src/app/features/login/login.component.ts - - + + - + src/app/features/login/login.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/login/login.component.spec.ts - - -login.component.spec.ts + + +login.component.spec.ts - + src/app/features/login/login.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/login/login.component.spec.ts->src/app/features/login/login.component.ts - - + + - + src/app/features/members/members.component.ts - - -members.component.ts + + +members.component.ts - + src/app/features/members/members-routing.module.ts->src/app/features/members/members.component.ts - - + + - + src/app/features/members/members.component.spec.ts - - -members.component.spec.ts + + +members.component.spec.ts - + src/app/features/members/members.component.spec.ts->src/app/features/members/members.component.ts - - + + - + src/app/features/messages/messages.component.ts - - -messages.component.ts + + +messages.component.ts - + src/app/features/messages/messages-routing.module.ts->src/app/features/messages/messages.component.ts - - + + - + src/app/features/messages/messages.component.spec.ts - - -messages.component.spec.ts + + +messages.component.spec.ts - + src/app/features/messages/messages.component.spec.ts->src/app/features/messages/messages.component.ts - - + + - + src/app/features/missions/missions.component.ts - - -missions.component.ts + + +missions.component.ts - + src/app/features/missions/missions-routing.module.ts->src/app/features/missions/missions.component.ts - - + + - + src/app/features/missions/missions.component.spec.ts - - -missions.component.spec.ts + + +missions.component.spec.ts - + src/app/features/missions/missions.component.spec.ts->src/app/features/missions/missions.component.ts - - + + - + src/app/features/news-feed/components/news-card/news-card.component.spec.ts - - -news-card.component.spec.ts + + +news-card.component.spec.ts - + src/app/features/news-feed/components/news-card/news-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/news-feed/components/news-card/news-card.component.spec.ts->src/app/features/news-feed/components/news-card/news-card.component.ts - - + + - + src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/core/services/translations.service.ts - - + + - - -src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/features/news-feed/models/news-item.ts - - + + +src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/core/models/blog.model.ts + + + + + +src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/features/news-feed/models/INewsItem.ts + + + + + +src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/core/models/poll.model.ts + + + + + +src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/core/models/post.model.ts + + - + src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/features/news-feed/components/news-list/news-list.component.spec.ts - - -news-list.component.spec.ts + + +news-list.component.spec.ts - + src/app/features/news-feed/components/news-list/news-list.component.spec.ts->src/app/features/news-feed/components/news-list/news-list.component.ts - - + + - - -src/app/features/news-feed/components/news-list/news-list.component.ts->src/app/features/news-feed/models/news-item.ts - - + + +src/app/features/news-feed/components/news-list/news-list.component.ts->src/app/features/news-feed/models/INewsItem.ts + + - + src/app/features/news-feed/news-feed.component.ts - - -news-feed.component.ts + + +news-feed.component.ts - + src/app/features/news-feed/news-feed-routing.module.ts->src/app/features/news-feed/news-feed.component.ts - - + + - + src/app/features/news-feed/news-feed.component.spec.ts - - -news-feed.component.spec.ts + + +news-feed.component.spec.ts - + src/app/features/news-feed/news-feed.component.spec.ts->src/app/features/news-feed/news-feed.component.ts - - + + - + src/app/features/privacy/privacy-routing.module.ts->src/app/features/privacy/privacy.component.ts - - + + - + src/app/features/privacy/privacy.component.spec.ts - - -privacy.component.spec.ts + + +privacy.component.spec.ts - + src/app/features/privacy/privacy.component.spec.ts->src/app/features/privacy/privacy.component.ts - - + + + + + +src/app/features/profile/components/post/post.component.spec.ts + + +post.component.spec.ts + + + + + +src/app/features/profile/components/post/post.component.spec.ts->src/app/core/helpers/typescript-loader.ts + + + + + +src/app/features/profile/components/post/post.component.spec.ts->src/app/features/profile/components/post/post.component.ts + + + + + +src/app/features/profile/components/post/post.component.ts->src/app/core/services/translations.service.ts + + + + + +src/app/features/profile/components/post/post.component.ts->src/app/core/services/session-storage.service.ts + + + + + +src/app/features/profile/components/post/post.component.ts->src/app/core/models/person.model.ts + + - + src/app/features/profile/components/profile-card/profile-card.component.spec.ts - - -profile-card.component.spec.ts + + +profile-card.component.spec.ts - + src/app/features/profile/components/profile-card/profile-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.spec.ts->src/app/features/profile/components/profile-card/profile-card.component.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/core/services/translations.service.ts - - + + - - -src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/core/models/person.ts - - + + +src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/core/models/person.model.ts + + - + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/features/profile/components/profile-list/profile-list.component.spec.ts - - -profile-list.component.spec.ts + + +profile-list.component.spec.ts - + src/app/features/profile/components/profile-list/profile-list.component.spec.ts->src/app/features/profile/components/profile-list/profile-list.component.ts - - + + - - -src/app/features/profile/components/profile-list/profile-list.component.ts->src/app/core/models/person.ts - - + + +src/app/features/profile/components/profile-list/profile-list.component.ts->src/app/core/models/person.model.ts + + - + src/app/features/profile/profile.component.ts - - -profile.component.ts + + +profile.component.ts - + src/app/features/profile/profile-routing.module.ts->src/app/features/profile/profile.component.ts - - + + - + src/app/features/profile/profile.component.spec.ts - - -profile.component.spec.ts + + +profile.component.spec.ts - + src/app/features/profile/profile.component.spec.ts->src/app/features/profile/profile.component.ts - - + + - + src/app/features/register/register-routing.module.ts->src/app/features/register/register.component.ts - - + + - + src/app/features/register/register.component.spec.ts - - -register.component.spec.ts + + +register.component.spec.ts - + src/app/features/register/register.component.spec.ts->src/app/features/register/register.component.ts - - + + - + src/app/features/search/search.component.ts - - -search.component.ts + + +search.component.ts - + src/app/features/search/search-routing.module.ts->src/app/features/search/search.component.ts - - + + - + src/app/features/search/search.component.spec.ts - - -search.component.spec.ts + + +search.component.spec.ts - + src/app/features/search/search.component.spec.ts->src/app/features/search/search.component.ts - - + + - + src/app/features/settings/settings.component.ts - - -settings.component.ts + + +settings.component.ts - + src/app/features/settings/settings-routing.module.ts->src/app/features/settings/settings.component.ts - - + + - + src/app/features/settings/settings.component.spec.ts - - -settings.component.spec.ts + + +settings.component.spec.ts - + src/app/features/settings/settings.component.spec.ts->src/app/features/settings/settings.component.ts - - + + - + src/app/features/splash/splash-routing.module.ts->src/app/features/splash/splash.component.ts - - + + - + src/app/features/splash/splash.component.spec.ts - - -splash.component.spec.ts + + +splash.component.spec.ts - + src/app/features/splash/splash.component.spec.ts->src/app/features/splash/splash.component.ts - - + + - + src/app/features/stats/stats-routing.module.ts->src/app/features/stats/stats.component.ts - - + + - + src/app/features/stats/stats.component.spec.ts - - -stats.component.spec.ts + + +stats.component.spec.ts - + src/app/features/stats/stats.component.spec.ts->src/app/features/stats/stats.component.ts - - + + - + src/app/features/terms/terms-routing.module.ts->src/app/features/terms/terms.component.ts - - + + - + src/app/features/terms/terms.component.spec.ts - - -terms.component.spec.ts + + +terms.component.spec.ts - + src/app/features/terms/terms.component.spec.ts->src/app/features/terms/terms.component.ts - - + + - + src/app/features/the-wire/the-wire.component.ts - - -the-wire.component.ts + + +the-wire.component.ts - + src/app/features/the-wire/the-wire-routing.module.ts->src/app/features/the-wire/the-wire.component.ts - - + + - + src/app/features/the-wire/the-wire.component.spec.ts - - -the-wire.component.spec.ts + + +the-wire.component.spec.ts - + src/app/features/the-wire/the-wire.component.spec.ts->src/app/features/the-wire/the-wire.component.ts - - + + - + src/app/shared/components/banner/banner.component.spec.ts - - -banner.component.spec.ts + + +banner.component.spec.ts - + src/app/shared/components/banner/banner.component.spec.ts->src/app/shared/components/banner/banner.component.ts - - + + + + + +src/app/shared/components/blog-form/blog-form.component.spec.ts + + +blog-form.component.spec.ts + + + + + +src/app/shared/components/blog-form/blog-form.component.spec.ts->src/app/core/helpers/typescript-loader.ts + + + + + +src/app/shared/components/blog-form/blog-form.component.spec.ts->src/app/shared/pipes/truncate-file-name.pipe.ts + + + + + +src/app/shared/components/blog-form/blog-form.component.spec.ts->src/app/shared/components/blog-form/blog-form.component.ts + + + + + +src/app/shared/components/blog-form/blog-form.component.ts->src/app/core/services/translations.service.ts + + + + + +src/app/shared/components/blog-form/blog-form.component.ts->src/app/core/services/focus-tracking.service.ts + + - + src/app/shared/components/button/button.component.spec.ts - - -button.component.spec.ts + + +button.component.spec.ts - + src/app/shared/components/button/button.component.spec.ts->src/app/shared/components/button/button.component.ts - - + + - + src/app/shared/components/button/button.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/shared/components/button/button.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/shared/models/button-type.ts - - -button-type.ts + + +button-type.ts - + src/app/shared/components/button/button.component.ts->src/app/shared/models/button-type.ts - - + + - + src/app/shared/models/material-color.ts - - -material-color.ts + + +material-color.ts - + src/app/shared/components/button/button.component.ts->src/app/shared/models/material-color.ts - - + + + + + +src/app/shared/models/theme.ts + + +theme.ts + + + + + +src/app/shared/components/button/button.component.ts->src/app/shared/models/theme.ts + + - + src/app/shared/components/calendar-button/calendar-button.component.spec.ts - - -calendar-button.component.spec.ts + + +calendar-button.component.spec.ts - + src/app/shared/components/calendar-button/calendar-button.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/calendar-button/calendar-button.component.spec.ts->src/app/shared/components/calendar-button/calendar-button.component.ts - - + + - + src/app/shared/components/calendar-button/calendar-button.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/calendar-button/calendar-button.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/shared/components/editor/editor.component.spec.ts - - -editor.component.spec.ts + + +editor.component.spec.ts - + src/app/shared/components/editor/editor.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/editor/editor.component.spec.ts->src/app/shared/components/editor/editor.component.ts - - + + - + src/app/shared/components/editor/editor.component.ts->src/app/core/services/translations.service.ts - - + + + + + +src/app/shared/components/editor/editor.component.ts->src/app/shared/models/tooltip-direction.ts + + - + src/app/shared/components/editor/editor.component.ts->src/app/shared/factories/editor-config.factory.ts - - + + - + src/app/shared/factories/editor-config.factory.ts->src/app/core/services/translations.service.ts - - + + + + + +src/app/shared/components/event-form/event-form.component.spec.ts + + +event-form.component.spec.ts + + + + + +src/app/shared/components/event-form/event-form.component.spec.ts->src/app/core/helpers/typescript-loader.ts + + + + + +src/app/shared/components/event-form/event-form.component.spec.ts->src/app/shared/components/event-form/event-form.component.ts + + + + + +src/app/shared/components/event-form/event-form.component.ts->src/app/core/services/translations.service.ts + + - + src/app/shared/components/footer/footer.component.spec.ts - - -footer.component.spec.ts + + +footer.component.spec.ts - + src/app/shared/components/footer/footer.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/footer/footer.component.spec.ts->src/app/shared/components/footer/footer.component.ts - - + + - + src/app/shared/components/footer/footer.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/shared/components/footer/footer.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/forbidden/forbidden.component.spec.ts - - -forbidden.component.spec.ts + + +forbidden.component.spec.ts - + src/app/shared/components/forbidden/forbidden.component.spec.ts->src/app/shared/components/forbidden/forbidden.component.ts - - + + - + src/app/shared/components/header/header.component.spec.ts - - -header.component.spec.ts + + +header.component.spec.ts - + src/app/shared/components/header/header.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/header/header.component.spec.ts->src/app/shared/components/header/header.component.ts - - + + - + src/app/shared/components/header/header.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/shared/components/header/header.component.ts->src/app/core/services/translations.service.ts - - + + - - -src/app/shared/components/header/header.component.ts->src/app/core/models/person.ts - - + + +src/app/shared/components/header/header.component.ts->src/app/core/models/person.model.ts + + - + src/app/shared/components/header/header.component.ts->src/app/core/services/people.service.ts - - + + - + src/app/shared/components/header/header.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/shared/components/input/input.component.spec.ts - - -input.component.spec.ts + + +input.component.spec.ts - + src/app/shared/components/input/input.component.spec.ts->src/app/shared/components/input/input.component.ts - - + + - + src/app/shared/components/input/input.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/input/input.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/shared/components/input/input.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/shared/components/input/input.component.ts->src/app/shared/models/input-type.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.spec.ts - - -language-selector.component.spec.ts + + +language-selector.component.spec.ts - + src/app/shared/components/language-selector/language-selector.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.spec.ts->src/app/shared/components/language-selector/language-selector.component.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/shared/models/language.ts - - -language.ts + + +language.ts - + src/app/shared/components/language-selector/language-selector.component.ts->src/app/shared/models/language.ts - - + + - + src/app/shared/components/not-found/not-found.component.spec.ts - - -not-found.component.spec.ts + + +not-found.component.spec.ts - + src/app/shared/components/not-found/not-found.component.spec.ts->src/app/shared/components/not-found/not-found.component.ts - - + + - + src/app/shared/components/page-title/page-title.component.spec.ts - - -page-title.component.spec.ts + + +page-title.component.spec.ts - + src/app/shared/components/page-title/page-title.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/page-title/page-title.component.spec.ts->src/app/shared/components/page-title/page-title.component.ts - - + + + + + +src/app/shared/components/poll-form/poll-form.component.spec.ts + + +poll-form.component.spec.ts + + + + + +src/app/shared/components/poll-form/poll-form.component.spec.ts->src/app/core/helpers/typescript-loader.ts + + + + + +src/app/shared/components/poll-form/poll-form.component.spec.ts->src/app/shared/components/poll-form/poll-form.component.ts + + + + + +src/app/shared/components/poll-form/poll-form.component.ts->src/app/core/services/translations.service.ts + + + + + +src/app/shared/components/poll-form/poll-form.component.ts->src/app/shared/models/tooltip-direction.ts + + + + + +src/app/shared/components/post-form/post-form.component.spec.ts + + +post-form.component.spec.ts + + + + + +src/app/shared/components/post-form/post-form.component.spec.ts->src/app/core/helpers/typescript-loader.ts + + + + + +src/app/shared/components/post-form/post-form.component.spec.ts->src/app/shared/components/post-form/post-form.component.ts + + + + + +src/app/shared/components/post-form/post-form.component.ts->src/app/core/services/translations.service.ts + + - + src/app/shared/components/profile-pic/profile-pic.component.spec.ts - - -profile-pic.component.spec.ts + + +profile-pic.component.spec.ts - + src/app/shared/components/profile-pic/profile-pic.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.spec.ts->src/app/shared/components/profile-pic/profile-pic.component.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.ts->src/app/core/services/translations.service.ts - - + + - - -src/app/shared/components/profile-pic/profile-pic.component.ts->src/app/core/models/person.ts - - + + +src/app/shared/components/profile-pic/profile-pic.component.ts->src/app/core/models/person.model.ts + + - + src/app/shared/components/unauthorized/unauthorized.component.spec.ts - - -unauthorized.component.spec.ts + + +unauthorized.component.spec.ts - + src/app/shared/components/unauthorized/unauthorized.component.spec.ts->src/app/shared/components/unauthorized/unauthorized.component.ts - - + + + + + +src/app/shared/pipes/truncate-file-name.pipe.spec.ts + + +truncate-file-name.pipe.spec.ts + + + + + +src/app/shared/pipes/truncate-file-name.pipe.spec.ts->src/app/shared/pipes/truncate-file-name.pipe.ts + + - + src/assets/i18n/translations.fr.ts - - -translations.fr.ts + + +translations.fr.ts - + src/assets/i18n/translations.fr.ts->src/assets/i18n/translations.en.ts - - + + - + src/environments/environment.pr.ts - + environment.pr.ts - + src/environments/environment.prod.ts - + environment.prod.ts - + src/main.ts - - -main.ts + + +main.ts - + src/main.ts->src/app/app.module.ts - - + + - + src/main.ts->src/environments/environment.ts - + - + src/polyfills.ts - - -polyfills.ts + + +polyfills.ts - + src/test.ts - - -test.ts + + +test.ts From bdb1a3261e3a68efbd8b725639fe48334c39eef8 Mon Sep 17 00:00:00 2001 From: Adii <73539670+AdiMakkar@users.noreply.github.com> Date: Tue, 31 Oct 2023 09:44:44 -0400 Subject: [PATCH 059/165] merging main changes (#169) * news list scroll * pre-quill wip * keyboard accessible editor * refactor news card * make a post wip * wip pre-formly * make a post wip * debouncer service, editor form controls, poll form control * make a post - blog * - update form validation in blog-form - created focus tracking service - added blur to app-button * file truncate pipe * reset forms on destroy * photo dimensions validation for blog cover photo * remove debugger * save feature for make a post * wip * space for errors on blog form * event form wip * translations for make a post * make a post translations * posting animation, disable all forms * make a post init tests * time and date input, added icon prop for input * Dependency Graph ignore-deploy --------- Co-authored-by: doug0102 --- dependency-graph.svg | 4373 +++++++++-------- src/app/app.component.ts | 1 - src/app/app.module.ts | 5 +- src/app/core/core.module.ts | 1 - src/app/core/models/blog.model.ts | 13 + .../models/{location.ts => location.model.ts} | 0 .../models/{person.ts => person.model.ts} | 2 +- src/app/core/models/poll.model.ts | 13 + src/app/core/models/post.model.ts | 13 + .../core/services/debounce.service.spec.ts | 16 + src/app/core/services/debounce.service.ts | 23 + src/app/core/services/event.service.ts | 4 +- .../services/focus-tracking.service.spec.ts | 16 + .../core/services/focus-tracking.service.ts | 23 + src/app/core/services/news.service.ts | 60 +- src/app/core/services/people.service.ts | 4 +- .../components/event/event.component.html | 23 +- .../components/event/event.component.ts | 34 +- src/app/features/events/events.module.ts | 2 +- src/app/features/events/models/event.ts | 4 +- src/app/features/home/home.component.html | 3 + src/app/features/home/home.component.scss | 8 +- src/app/features/home/home.component.ts | 10 +- .../news-card/news-card.component.html | 16 +- .../news-card/news-card.component.ts | 20 +- .../news-list/news-list.component.html | 8 +- .../news-list/news-list.component.scss | 35 +- .../news-list/news-list.component.ts | 4 +- .../features/news-feed/models/INewsItem.ts | 10 + .../features/news-feed/models/news-item.ts | 10 - .../features/news-feed/news-feed.module.ts | 2 +- .../components/post/post.component.html | 99 + .../components/post/post.component.scss | 173 + .../components/post/post.component.spec.ts | 45 + .../profile/components/post/post.component.ts | 133 + .../profile-card/profile-card.component.ts | 2 +- .../profile-list/profile-list.component.ts | 2 +- src/app/features/profile/profile.module.ts | 11 +- .../components/banner/banner.component.ts | 2 +- .../blog-form/blog-form.component.html | 68 + .../blog-form/blog-form.component.scss | 49 + .../blog-form/blog-form.component.spec.ts | 45 + .../blog-form/blog-form.component.ts | 179 + .../components/button/button.component.html | 42 +- .../components/button/button.component.scss | 89 +- .../components/button/button.component.ts | 5 + .../components/editor/editor.component.html | 65 +- .../components/editor/editor.component.scss | 135 + .../components/editor/editor.component.ts | 323 +- .../editor-menu/editor-menu.component.html | 7 + .../editor-menu/editor-menu.component.scss | 0 .../menu/editor-menu/editor-menu.component.ts | 59 + .../event-form/event-form.component.html | 187 + .../event-form/event-form.component.scss | 28 + .../event-form/event-form.component.spec.ts | 45 + .../event-form/event-form.component.ts | 153 + .../components/header/header.component.ts | 2 +- .../components/input/input.component.html | 32 +- .../components/input/input.component.scss | 26 + .../components/input/input.component.ts | 64 +- .../poll-form/poll-form.component.html | 43 + .../poll-form/poll-form.component.scss | 37 + .../poll-form/poll-form.component.spec.ts | 45 + .../poll-form/poll-form.component.ts | 95 + .../post-form/post-form.component.html | 12 + .../post-form/post-form.component.scss | 16 + .../post-form/post-form.component.spec.ts | 45 + .../post-form/post-form.component.ts | 46 + .../profile-pic/profile-pic.component.ts | 2 +- src/app/shared/models/input-type.ts | 4 +- src/app/shared/models/theme.ts | 7 + .../pipes/truncate-file-name.pipe.spec.ts | 8 + .../shared/pipes/truncate-file-name.pipe.ts | 21 + src/app/shared/shared.module.ts | 46 +- src/assets/i18n/translations.en.ts | 54 +- src/assets/i18n/translations.fr.ts | 58 +- src/assets/{svg => image}/banner.svg | 0 src/assets/image/group-banner.png | Bin 0 -> 247907 bytes tsconfig.json | 1 + 79 files changed, 5259 insertions(+), 2107 deletions(-) create mode 100644 src/app/core/models/blog.model.ts rename src/app/core/models/{location.ts => location.model.ts} (100%) rename src/app/core/models/{person.ts => person.model.ts} (91%) create mode 100644 src/app/core/models/poll.model.ts create mode 100644 src/app/core/models/post.model.ts create mode 100644 src/app/core/services/debounce.service.spec.ts create mode 100644 src/app/core/services/debounce.service.ts create mode 100644 src/app/core/services/focus-tracking.service.spec.ts create mode 100644 src/app/core/services/focus-tracking.service.ts create mode 100644 src/app/features/news-feed/models/INewsItem.ts delete mode 100644 src/app/features/news-feed/models/news-item.ts create mode 100644 src/app/features/profile/components/post/post.component.html create mode 100644 src/app/features/profile/components/post/post.component.scss create mode 100644 src/app/features/profile/components/post/post.component.spec.ts create mode 100644 src/app/features/profile/components/post/post.component.ts create mode 100644 src/app/shared/components/blog-form/blog-form.component.html create mode 100644 src/app/shared/components/blog-form/blog-form.component.scss create mode 100644 src/app/shared/components/blog-form/blog-form.component.spec.ts create mode 100644 src/app/shared/components/blog-form/blog-form.component.ts create mode 100644 src/app/shared/components/editor/menu/editor-menu/editor-menu.component.html create mode 100644 src/app/shared/components/editor/menu/editor-menu/editor-menu.component.scss create mode 100644 src/app/shared/components/editor/menu/editor-menu/editor-menu.component.ts create mode 100644 src/app/shared/components/event-form/event-form.component.html create mode 100644 src/app/shared/components/event-form/event-form.component.scss create mode 100644 src/app/shared/components/event-form/event-form.component.spec.ts create mode 100644 src/app/shared/components/event-form/event-form.component.ts create mode 100644 src/app/shared/components/poll-form/poll-form.component.html create mode 100644 src/app/shared/components/poll-form/poll-form.component.scss create mode 100644 src/app/shared/components/poll-form/poll-form.component.spec.ts create mode 100644 src/app/shared/components/poll-form/poll-form.component.ts create mode 100644 src/app/shared/components/post-form/post-form.component.html create mode 100644 src/app/shared/components/post-form/post-form.component.scss create mode 100644 src/app/shared/components/post-form/post-form.component.spec.ts create mode 100644 src/app/shared/components/post-form/post-form.component.ts create mode 100644 src/app/shared/models/theme.ts create mode 100644 src/app/shared/pipes/truncate-file-name.pipe.spec.ts create mode 100644 src/app/shared/pipes/truncate-file-name.pipe.ts rename src/assets/{svg => image}/banner.svg (100%) create mode 100644 src/assets/image/group-banner.png diff --git a/dependency-graph.svg b/dependency-graph.svg index a7211834..22bf761e 100644 --- a/dependency-graph.svg +++ b/dependency-graph.svg @@ -4,367 +4,407 @@ - - + + dependency-cruiser output - + cluster_src - -src + +src cluster_src/app - -app + +app cluster_src/app/core - -core + +core cluster_src/app/core/auth - -auth + +auth cluster_src/app/core/constants - -constants + +constants cluster_src/app/core/guards - -guards + +guards cluster_src/app/core/helpers - -helpers + +helpers cluster_src/app/core/interceptors - -interceptors + +interceptors cluster_src/app/core/models - -models + +models cluster_src/app/core/services - -services + +services cluster_src/app/features - -features + +features cluster_src/app/features/about - -about + +about cluster_src/app/features/blog - -blog + +blog cluster_src/app/features/bookmarks - -bookmarks + +bookmarks cluster_src/app/features/dashboard - -dashboard + +dashboard cluster_src/app/features/events - -events + +events cluster_src/app/features/events/components - -components + +components cluster_src/app/features/events/components/event-card - -event-card + +event-card cluster_src/app/features/events/components/event-list - -event-list + +event-list cluster_src/app/features/events/components/event - -event + +event cluster_src/app/features/events/models - -models + +models cluster_src/app/features/events/resolvers - -resolvers + +resolvers cluster_src/app/features/friends - -friends + +friends cluster_src/app/features/groups - -groups + +groups cluster_src/app/features/groups/components - -components + +components cluster_src/app/features/groups/components/group-card - -group-card + +group-card cluster_src/app/features/groups/components/group-list - -group-list + +group-list cluster_src/app/features/groups/components/group - -group + +group cluster_src/app/features/groups/models - -models + +models cluster_src/app/features/home - -home + +home cluster_src/app/features/invite - -invite + +invite cluster_src/app/features/login - -login + +login cluster_src/app/features/members - -members + +members cluster_src/app/features/messages - -messages + +messages cluster_src/app/features/missions - -missions + +missions cluster_src/app/features/news-feed - -news-feed + +news-feed cluster_src/app/features/news-feed/components - -components + +components cluster_src/app/features/news-feed/components/news-card - -news-card + +news-card cluster_src/app/features/news-feed/components/news-list - -news-list + +news-list cluster_src/app/features/news-feed/models - -models + +models cluster_src/app/features/privacy - -privacy + +privacy cluster_src/app/features/profile - -profile + +profile cluster_src/app/features/profile/components - -components + +components -cluster_src/app/features/profile/components/profile-card - -profile-card +cluster_src/app/features/profile/components/post + +post -cluster_src/app/features/profile/components/profile-list - -profile-list +cluster_src/app/features/profile/components/profile-card + +profile-card -cluster_src/app/features/register - -register +cluster_src/app/features/profile/components/profile-list + +profile-list -cluster_src/app/features/search - -search +cluster_src/app/features/register + +register -cluster_src/app/features/settings - -settings +cluster_src/app/features/search + +search -cluster_src/app/features/splash - -splash +cluster_src/app/features/settings + +settings -cluster_src/app/features/stats - -stats +cluster_src/app/features/splash + +splash -cluster_src/app/features/terms - -terms +cluster_src/app/features/stats + +stats -cluster_src/app/features/the-wire - -the-wire +cluster_src/app/features/terms + +terms -cluster_src/app/shared - -shared +cluster_src/app/features/the-wire + +the-wire -cluster_src/app/shared/components - -components +cluster_src/app/shared + +shared -cluster_src/app/shared/components/banner - -banner +cluster_src/app/shared/components + +components -cluster_src/app/shared/components/button - -button +cluster_src/app/shared/components/banner + +banner -cluster_src/app/shared/components/calendar-button - -calendar-button +cluster_src/app/shared/components/blog-form + +blog-form -cluster_src/app/shared/components/editor - -editor +cluster_src/app/shared/components/button + +button -cluster_src/app/shared/components/footer - -footer +cluster_src/app/shared/components/calendar-button + +calendar-button -cluster_src/app/shared/components/forbidden - -forbidden +cluster_src/app/shared/components/editor + +editor -cluster_src/app/shared/components/header - -header +cluster_src/app/shared/components/editor/menu + +menu -cluster_src/app/shared/components/input - -input +cluster_src/app/shared/components/editor/menu/editor-menu + +editor-menu -cluster_src/app/shared/components/language-selector - -language-selector +cluster_src/app/shared/components/event-form + +event-form -cluster_src/app/shared/components/not-found - -not-found +cluster_src/app/shared/components/footer + +footer -cluster_src/app/shared/components/page-title - -page-title +cluster_src/app/shared/components/forbidden + +forbidden -cluster_src/app/shared/components/profile-pic - -profile-pic +cluster_src/app/shared/components/header + +header -cluster_src/app/shared/components/unauthorized - -unauthorized +cluster_src/app/shared/components/input + +input -cluster_src/app/shared/factories - -factories +cluster_src/app/shared/components/language-selector + +language-selector -cluster_src/app/shared/models - -models +cluster_src/app/shared/components/not-found + +not-found -cluster_src/assets - -assets +cluster_src/app/shared/components/page-title + +page-title -cluster_src/assets/i18n - -i18n +cluster_src/app/shared/components/poll-form + +poll-form +cluster_src/app/shared/components/post-form + +post-form + + +cluster_src/app/shared/components/profile-pic + +profile-pic + + +cluster_src/app/shared/components/unauthorized + +unauthorized + + +cluster_src/app/shared/factories + +factories + + +cluster_src/app/shared/models + +models + + +cluster_src/app/shared/pipes + +pipes + + +cluster_src/assets + +assets + + +cluster_src/assets/i18n + +i18n + + cluster_src/environments environments @@ -373,8 +413,8 @@ src/app/app-routing.module.ts - -app-routing.module.ts + +app-routing.module.ts @@ -382,542 +422,542 @@ src/app/core/constants/routes.constants.ts - -routes.constants.ts + +routes.constants.ts src/app/app-routing.module.ts->src/app/core/constants/routes.constants.ts - - + + src/app/core/guards/auth.guard.ts - -auth.guard.ts + +auth.guard.ts src/app/app-routing.module.ts->src/app/core/guards/auth.guard.ts - - + + src/app/core/guards/interceptor.guard.ts - -interceptor.guard.ts + +interceptor.guard.ts src/app/app-routing.module.ts->src/app/core/guards/interceptor.guard.ts - - + + src/app/core/guards/login.guard.ts - -login.guard.ts + +login.guard.ts src/app/app-routing.module.ts->src/app/core/guards/login.guard.ts - - + + src/app/core/guards/redirect.guard.ts - -redirect.guard.ts + +redirect.guard.ts src/app/app-routing.module.ts->src/app/core/guards/redirect.guard.ts - - + + src/app/core/services/translations.service.ts - -translations.service.ts + +translations.service.ts src/app/app-routing.module.ts->src/app/core/services/translations.service.ts - - + + src/app/features/about/about.module.ts - -about.module.ts + +about.module.ts src/app/app-routing.module.ts->src/app/features/about/about.module.ts - - - - + + + + src/app/features/blog/blog.module.ts - -blog.module.ts + +blog.module.ts src/app/app-routing.module.ts->src/app/features/blog/blog.module.ts - - - - + + + + src/app/features/bookmarks/bookmarks.module.ts - -bookmarks.module.ts + +bookmarks.module.ts src/app/app-routing.module.ts->src/app/features/bookmarks/bookmarks.module.ts - - - - + + + + src/app/features/dashboard/dashboard.module.ts - -dashboard.module.ts + +dashboard.module.ts src/app/app-routing.module.ts->src/app/features/dashboard/dashboard.module.ts - - - - + + + + src/app/features/events/events.module.ts - -events.module.ts + +events.module.ts src/app/app-routing.module.ts->src/app/features/events/events.module.ts - - - - + + + + src/app/features/friends/friends.module.ts - -friends.module.ts + +friends.module.ts src/app/app-routing.module.ts->src/app/features/friends/friends.module.ts - - - - + + + + src/app/features/groups/groups.module.ts - -groups.module.ts + +groups.module.ts src/app/app-routing.module.ts->src/app/features/groups/groups.module.ts - - - - + + + + src/app/features/home/home.module.ts - -home.module.ts + +home.module.ts src/app/app-routing.module.ts->src/app/features/home/home.module.ts - - - - + + + + src/app/features/invite/invite.module.ts - -invite.module.ts + +invite.module.ts src/app/app-routing.module.ts->src/app/features/invite/invite.module.ts - - - - + + + + src/app/features/login/login.module.ts - -login.module.ts + +login.module.ts src/app/app-routing.module.ts->src/app/features/login/login.module.ts - - - - + + + + src/app/features/members/members.module.ts - -members.module.ts + +members.module.ts src/app/app-routing.module.ts->src/app/features/members/members.module.ts - - - - + + + + src/app/features/messages/messages.module.ts - -messages.module.ts + +messages.module.ts src/app/app-routing.module.ts->src/app/features/messages/messages.module.ts - - - - + + + + src/app/features/missions/missions.module.ts - -missions.module.ts + +missions.module.ts src/app/app-routing.module.ts->src/app/features/missions/missions.module.ts - - - - + + + + src/app/features/news-feed/news-feed.module.ts - -news-feed.module.ts + +news-feed.module.ts src/app/app-routing.module.ts->src/app/features/news-feed/news-feed.module.ts - - - - + + + + src/app/features/privacy/privacy.module.ts - -privacy.module.ts + +privacy.module.ts src/app/app-routing.module.ts->src/app/features/privacy/privacy.module.ts - - - - + + + + src/app/features/profile/profile.module.ts - -profile.module.ts + +profile.module.ts src/app/app-routing.module.ts->src/app/features/profile/profile.module.ts - - - - + + + + src/app/features/register/register.module.ts - -register.module.ts + +register.module.ts src/app/app-routing.module.ts->src/app/features/register/register.module.ts - - - - + + + + src/app/features/search/search.module.ts - -search.module.ts + +search.module.ts src/app/app-routing.module.ts->src/app/features/search/search.module.ts - - - - + + + + src/app/features/settings/settings.module.ts - -settings.module.ts + +settings.module.ts src/app/app-routing.module.ts->src/app/features/settings/settings.module.ts - - - - + + + + src/app/features/splash/splash.module.ts - -splash.module.ts + +splash.module.ts src/app/app-routing.module.ts->src/app/features/splash/splash.module.ts - - - - + + + + src/app/features/stats/stats.module.ts - -stats.module.ts + +stats.module.ts src/app/app-routing.module.ts->src/app/features/stats/stats.module.ts - - - - + + + + src/app/features/terms/terms.module.ts - -terms.module.ts + +terms.module.ts src/app/app-routing.module.ts->src/app/features/terms/terms.module.ts - - - - + + + + src/app/features/the-wire/the-wire.module.ts - -the-wire.module.ts + +the-wire.module.ts src/app/app-routing.module.ts->src/app/features/the-wire/the-wire.module.ts - - - - + + + + src/app/shared/components/forbidden/forbidden.component.ts - -forbidden.component.ts + +forbidden.component.ts src/app/app-routing.module.ts->src/app/shared/components/forbidden/forbidden.component.ts - - + + src/app/shared/components/not-found/not-found.component.ts - -not-found.component.ts + +not-found.component.ts src/app/app-routing.module.ts->src/app/shared/components/not-found/not-found.component.ts - - + + src/app/shared/components/unauthorized/unauthorized.component.ts - -unauthorized.component.ts + +unauthorized.component.ts src/app/app-routing.module.ts->src/app/shared/components/unauthorized/unauthorized.component.ts - - + + src/app/core/services/session-storage.service.ts - -session-storage.service.ts + +session-storage.service.ts src/app/core/guards/auth.guard.ts->src/app/core/services/session-storage.service.ts - - + + @@ -931,876 +971,891 @@ src/app/core/guards/auth.guard.ts->src/environments/environment.ts - - + + src/app/core/guards/interceptor.guard.ts->src/app/core/services/session-storage.service.ts - - + + - + src/assets/i18n/translations.en.ts - - -translations.en.ts + + +translations.en.ts - + src/app/core/services/translations.service.ts->src/assets/i18n/translations.en.ts - - + + src/app/shared/shared.module.ts - -shared.module.ts + +shared.module.ts - + src/app/features/about/about.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/about/about-routing.module.ts - - -about-routing.module.ts + + +about-routing.module.ts - + src/app/features/about/about.module.ts->src/app/features/about/about-routing.module.ts - - + + - + src/app/features/about/about.component.ts - - -about.component.ts + + +about.component.ts - + src/app/features/about/about.module.ts->src/app/features/about/about.component.ts - - + + - + src/app/features/blog/blog.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/blog/blog-routing.module.ts - - -blog-routing.module.ts + + +blog-routing.module.ts - + src/app/features/blog/blog.module.ts->src/app/features/blog/blog-routing.module.ts - - + + - + src/app/features/bookmarks/bookmarks.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/bookmarks/bookmarks-routing.module.ts - - -bookmarks-routing.module.ts + + +bookmarks-routing.module.ts - + src/app/features/bookmarks/bookmarks.module.ts->src/app/features/bookmarks/bookmarks-routing.module.ts - - + + - + src/app/features/dashboard/dashboard.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/dashboard/dashboard-routing.module.ts - - -dashboard-routing.module.ts + + +dashboard-routing.module.ts - + src/app/features/dashboard/dashboard.module.ts->src/app/features/dashboard/dashboard-routing.module.ts - - + + - + src/app/features/events/events.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/events/components/event-card/event-card.component.ts - - -event-card.component.ts + + +event-card.component.ts - + src/app/features/events/events.module.ts->src/app/features/events/components/event-card/event-card.component.ts - - + + - + src/app/features/events/components/event-list/event-list.component.ts - - -event-list.component.ts + + +event-list.component.ts - + src/app/features/events/events.module.ts->src/app/features/events/components/event-list/event-list.component.ts - - + + - + src/app/features/events/components/event/event.component.ts - - -event.component.ts + + +event.component.ts - + src/app/features/events/events.module.ts->src/app/features/events/components/event/event.component.ts - - + + - + src/app/features/events/events-routing.module.ts - - -events-routing.module.ts + + +events-routing.module.ts - + src/app/features/events/events.module.ts->src/app/features/events/events-routing.module.ts - - + + - + src/app/features/friends/friends.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/friends/friends-routing.module.ts - - -friends-routing.module.ts + + +friends-routing.module.ts - + src/app/features/friends/friends.module.ts->src/app/features/friends/friends-routing.module.ts - - + + - + src/app/features/groups/groups.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/groups/components/group-card/group-card.component.ts - - -group-card.component.ts + + +group-card.component.ts - + src/app/features/groups/groups.module.ts->src/app/features/groups/components/group-card/group-card.component.ts - - + + - + src/app/features/groups/components/group-list/group-list.component.ts - - -group-list.component.ts + + +group-list.component.ts - + src/app/features/groups/groups.module.ts->src/app/features/groups/components/group-list/group-list.component.ts - - + + - + src/app/features/groups/components/group/group.component.ts - - -group.component.ts + + +group.component.ts - + src/app/features/groups/groups.module.ts->src/app/features/groups/components/group/group.component.ts - - + + - + src/app/features/groups/groups-routing.module.ts - - -groups-routing.module.ts + + +groups-routing.module.ts - + src/app/features/groups/groups.module.ts->src/app/features/groups/groups-routing.module.ts - - + + - + src/app/features/home/home.module.ts->src/app/features/events/events.module.ts - - - - + + + + - + src/app/features/home/home.module.ts->src/app/features/groups/groups.module.ts - - - - + + + + - + src/app/features/home/home.module.ts->src/app/features/news-feed/news-feed.module.ts - - - - + + + + - + src/app/features/home/home.module.ts->src/app/features/profile/profile.module.ts - - - - + + + + - + src/app/features/home/home.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/home/home-routing.module.ts - - -home-routing.module.ts + + +home-routing.module.ts - + src/app/features/home/home.module.ts->src/app/features/home/home-routing.module.ts - - + + - + src/app/features/home/home.component.ts - - -home.component.ts + + +home.component.ts - + src/app/features/home/home.module.ts->src/app/features/home/home.component.ts - - + + - + src/app/features/invite/invite.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/invite/invite-routing.module.ts - - -invite-routing.module.ts + + +invite-routing.module.ts - + src/app/features/invite/invite.module.ts->src/app/features/invite/invite-routing.module.ts - - + + - + src/app/features/login/login.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/login/login-routing.module.ts - - -login-routing.module.ts + + +login-routing.module.ts - + src/app/features/login/login.module.ts->src/app/features/login/login-routing.module.ts - - + + - + src/app/features/login/login.component.ts - - -login.component.ts + + +login.component.ts - + src/app/features/login/login.module.ts->src/app/features/login/login.component.ts - - + + - + src/app/features/members/members.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/members/members-routing.module.ts - - -members-routing.module.ts + + +members-routing.module.ts - + src/app/features/members/members.module.ts->src/app/features/members/members-routing.module.ts - - + + - + src/app/features/messages/messages.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/messages/messages-routing.module.ts - - -messages-routing.module.ts + + +messages-routing.module.ts - + src/app/features/messages/messages.module.ts->src/app/features/messages/messages-routing.module.ts - - + + - + src/app/features/missions/missions.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/missions/missions-routing.module.ts - - -missions-routing.module.ts + + +missions-routing.module.ts - + src/app/features/missions/missions.module.ts->src/app/features/missions/missions-routing.module.ts - - + + - + src/app/features/news-feed/news-feed.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/news-feed/components/news-card/news-card.component.ts - - -news-card.component.ts + + +news-card.component.ts - + src/app/features/news-feed/news-feed.module.ts->src/app/features/news-feed/components/news-card/news-card.component.ts - - + + - + src/app/features/news-feed/components/news-list/news-list.component.ts - - -news-list.component.ts + + +news-list.component.ts - + src/app/features/news-feed/news-feed.module.ts->src/app/features/news-feed/components/news-list/news-list.component.ts - - + + - + src/app/features/news-feed/news-feed-routing.module.ts - - -news-feed-routing.module.ts + + +news-feed-routing.module.ts - + src/app/features/news-feed/news-feed.module.ts->src/app/features/news-feed/news-feed-routing.module.ts - - + + - + src/app/features/privacy/privacy.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/privacy/privacy-routing.module.ts - - -privacy-routing.module.ts + + +privacy-routing.module.ts - + src/app/features/privacy/privacy.module.ts->src/app/features/privacy/privacy-routing.module.ts - - + + - + src/app/features/privacy/privacy.component.ts - - -privacy.component.ts + + +privacy.component.ts - + src/app/features/privacy/privacy.module.ts->src/app/features/privacy/privacy.component.ts - - + + - + src/app/features/profile/profile.module.ts->src/app/shared/shared.module.ts - - - - + + + + + + + +src/app/features/profile/components/post/post.component.ts + + +post.component.ts + + + + + +src/app/features/profile/profile.module.ts->src/app/features/profile/components/post/post.component.ts + + - + src/app/features/profile/components/profile-card/profile-card.component.ts - - -profile-card.component.ts + + +profile-card.component.ts - + src/app/features/profile/profile.module.ts->src/app/features/profile/components/profile-card/profile-card.component.ts - - + + - + src/app/features/profile/components/profile-list/profile-list.component.ts - - -profile-list.component.ts + + +profile-list.component.ts - + src/app/features/profile/profile.module.ts->src/app/features/profile/components/profile-list/profile-list.component.ts - - + + - + src/app/features/profile/profile-routing.module.ts - - -profile-routing.module.ts + + +profile-routing.module.ts - + src/app/features/profile/profile.module.ts->src/app/features/profile/profile-routing.module.ts - - + + - + src/app/features/register/register.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/register/register-routing.module.ts - - -register-routing.module.ts + + +register-routing.module.ts - + src/app/features/register/register.module.ts->src/app/features/register/register-routing.module.ts - - + + - + src/app/features/register/register.component.ts - - -register.component.ts + + +register.component.ts - + src/app/features/register/register.module.ts->src/app/features/register/register.component.ts - - + + - + src/app/features/search/search.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/search/search-routing.module.ts - - -search-routing.module.ts + + +search-routing.module.ts - + src/app/features/search/search.module.ts->src/app/features/search/search-routing.module.ts - - + + - + src/app/features/settings/settings.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/settings/settings-routing.module.ts - - -settings-routing.module.ts + + +settings-routing.module.ts - + src/app/features/settings/settings.module.ts->src/app/features/settings/settings-routing.module.ts - - + + - + src/app/features/splash/splash.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/splash/splash-routing.module.ts - - -splash-routing.module.ts + + +splash-routing.module.ts - + src/app/features/splash/splash.module.ts->src/app/features/splash/splash-routing.module.ts - - + + - + src/app/features/splash/splash.component.ts - - -splash.component.ts + + +splash.component.ts - + src/app/features/splash/splash.module.ts->src/app/features/splash/splash.component.ts - - + + - + src/app/features/stats/stats.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/stats/stats-routing.module.ts - - -stats-routing.module.ts + + +stats-routing.module.ts - + src/app/features/stats/stats.module.ts->src/app/features/stats/stats-routing.module.ts - - + + - + src/app/features/stats/stats.component.ts - - -stats.component.ts + + +stats.component.ts - + src/app/features/stats/stats.module.ts->src/app/features/stats/stats.component.ts - - + + - + src/app/features/terms/terms.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/terms/terms-routing.module.ts - - -terms-routing.module.ts + + +terms-routing.module.ts - + src/app/features/terms/terms.module.ts->src/app/features/terms/terms-routing.module.ts - - + + - + src/app/features/terms/terms.component.ts - - -terms.component.ts + + +terms.component.ts - + src/app/features/terms/terms.module.ts->src/app/features/terms/terms.component.ts - - + + - + src/app/features/the-wire/the-wire.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/the-wire/the-wire-routing.module.ts - - -the-wire-routing.module.ts + + +the-wire-routing.module.ts - + src/app/features/the-wire/the-wire.module.ts->src/app/features/the-wire/the-wire-routing.module.ts - - + + src/app/app.component.spec.ts - -app.component.spec.ts + +app.component.spec.ts @@ -1808,513 +1863,603 @@ src/app/app.component.ts - -app.component.ts + +app.component.ts src/app/app.component.spec.ts->src/app/app.component.ts - - + + src/app/core/auth/auth.module.ts - -auth.module.ts + +auth.module.ts src/app/app.component.spec.ts->src/app/core/auth/auth.module.ts - - + + src/app/core/helpers/typescript-loader.ts - -typescript-loader.ts + +typescript-loader.ts src/app/app.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/app.component.ts->src/app/core/constants/routes.constants.ts - - + + src/app/app.component.ts->src/app/core/services/translations.service.ts - - + + src/app/core/services/language-storage.service.ts - -language-storage.service.ts + +language-storage.service.ts src/app/app.component.ts->src/app/core/services/language-storage.service.ts - - + + src/app/core/auth/auth.module.ts->src/app/core/services/session-storage.service.ts - - + + src/app/core/auth/auth.module.ts->src/environments/environment.ts - - + + - + src/app/core/services/local-storage-ref.service.ts - - -local-storage-ref.service.ts + + +local-storage-ref.service.ts - + src/app/core/services/language-storage.service.ts->src/app/core/services/local-storage-ref.service.ts - - + + src/app/app.module.ts - -app.module.ts + +app.module.ts src/app/app.module.ts->src/app/app-routing.module.ts - - - - + + + + src/app/app.module.ts->src/app/app.component.ts - - + + src/app/app.module.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/core/core.module.ts - -core.module.ts + +core.module.ts src/app/app.module.ts->src/app/core/core.module.ts - - - - + + + + src/app/core/services/title.service.ts - -title.service.ts + +title.service.ts src/app/app.module.ts->src/app/core/services/title.service.ts - - + + src/app/features/events/events.component.ts - -events.component.ts + +events.component.ts src/app/app.module.ts->src/app/features/events/events.component.ts - - + + src/app/features/groups/groups.component.ts - -groups.component.ts + +groups.component.ts src/app/app.module.ts->src/app/features/groups/groups.component.ts - - + + src/app/app.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/core/core.module.ts->src/app/core/auth/auth.module.ts - - + + src/app/core/core.module.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/core/core.module.ts->src/app/app.module.ts - - - - + + + + - + src/app/shared/shared.module.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/shared.module.ts->src/app/shared/components/forbidden/forbidden.component.ts - - + + - + src/app/shared/shared.module.ts->src/app/shared/components/not-found/not-found.component.ts - - + + - + src/app/shared/shared.module.ts->src/app/shared/components/unauthorized/unauthorized.component.ts - - + + - + src/app/shared/shared.module.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/shared.module.ts->src/app/app.module.ts - - - - + + + + - + src/app/shared/components/banner/banner.component.ts - - -banner.component.ts + + +banner.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/banner/banner.component.ts - - + + + + + +src/app/shared/pipes/truncate-file-name.pipe.ts + + +truncate-file-name.pipe.ts + + + + + +src/app/shared/shared.module.ts->src/app/shared/pipes/truncate-file-name.pipe.ts + + + + + +src/app/shared/components/blog-form/blog-form.component.ts + + +blog-form.component.ts + + + + + +src/app/shared/shared.module.ts->src/app/shared/components/blog-form/blog-form.component.ts + + - + src/app/shared/components/button/button.component.ts - - -button.component.ts + + +button.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/button/button.component.ts - - + + - + src/app/shared/components/calendar-button/calendar-button.component.ts - - -calendar-button.component.ts + + +calendar-button.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/calendar-button/calendar-button.component.ts - - + + - + src/app/shared/components/editor/editor.component.ts - - -editor.component.ts + + +editor.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/editor/editor.component.ts - - + + - + src/app/shared/factories/editor-config.factory.ts - - -editor-config.factory.ts + + +editor-config.factory.ts - + src/app/shared/shared.module.ts->src/app/shared/factories/editor-config.factory.ts - - + + + + + +src/app/shared/components/editor/menu/editor-menu/editor-menu.component.ts + + +editor-menu.component.ts + + + + + +src/app/shared/shared.module.ts->src/app/shared/components/editor/menu/editor-menu/editor-menu.component.ts + + + + + +src/app/shared/components/event-form/event-form.component.ts + + +event-form.component.ts + + + + + +src/app/shared/shared.module.ts->src/app/shared/components/event-form/event-form.component.ts + + - + src/app/shared/components/footer/footer.component.ts - - -footer.component.ts + + +footer.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/footer/footer.component.ts - - + + - + src/app/shared/components/header/header.component.ts - - -header.component.ts + + +header.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/header/header.component.ts - - + + - + src/app/shared/components/input/input.component.ts - - -input.component.ts + + +input.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/input/input.component.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.ts - - -language-selector.component.ts + + +language-selector.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/language-selector/language-selector.component.ts - - + + - + src/app/shared/components/page-title/page-title.component.ts - - -page-title.component.ts + + +page-title.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/page-title/page-title.component.ts - - + + + + + +src/app/shared/components/poll-form/poll-form.component.ts + + +poll-form.component.ts + + + + + +src/app/shared/shared.module.ts->src/app/shared/components/poll-form/poll-form.component.ts + + + + + +src/app/shared/components/post-form/post-form.component.ts + + +post-form.component.ts + + + + + +src/app/shared/shared.module.ts->src/app/shared/components/post-form/post-form.component.ts + + - + src/app/shared/components/profile-pic/profile-pic.component.ts - - -profile-pic.component.ts + + +profile-pic.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/profile-pic/profile-pic.component.ts - - + + - + src/app/core/services/session-storage.service.ts->src/app/core/services/local-storage-ref.service.ts - - + + src/app/core/guards/auth.guard.spec.ts - -auth.guard.spec.ts + +auth.guard.spec.ts src/app/core/guards/auth.guard.spec.ts->src/app/core/guards/auth.guard.ts - - + + src/app/core/guards/auth.guard.spec.ts->src/app/core/auth/auth.module.ts - - + + src/app/core/guards/auth.guard.spec.ts->src/app/core/services/session-storage.service.ts - - + + src/app/core/guards/interceptor.guard.spec.ts - -interceptor.guard.spec.ts + +interceptor.guard.spec.ts src/app/core/guards/interceptor.guard.spec.ts->src/app/core/guards/interceptor.guard.ts - - + + src/app/core/guards/login.guard.spec.ts - -login.guard.spec.ts + +login.guard.spec.ts src/app/core/guards/login.guard.spec.ts->src/app/core/guards/login.guard.ts - - + + src/app/core/guards/login.guard.spec.ts->src/app/core/auth/auth.module.ts - - + + src/app/core/guards/redirect.guard.spec.ts - -redirect.guard.spec.ts + +redirect.guard.spec.ts src/app/core/guards/redirect.guard.spec.ts->src/app/core/guards/redirect.guard.ts - - + + src/app/core/guards/role.guard.spec.ts - -role.guard.spec.ts + +role.guard.spec.ts @@ -2322,23 +2467,23 @@ src/app/core/guards/role.guard.ts - -role.guard.ts + +role.guard.ts src/app/core/guards/role.guard.spec.ts->src/app/core/guards/role.guard.ts - - + + src/app/core/interceptors/error.interceptor.spec.ts - -error.interceptor.spec.ts + +error.interceptor.spec.ts @@ -2346,1925 +2491,2273 @@ src/app/core/interceptors/error.interceptor.ts - -error.interceptor.ts + +error.interceptor.ts src/app/core/interceptors/error.interceptor.spec.ts->src/app/core/interceptors/error.interceptor.ts - - + + - + -src/app/core/models/location.ts - - -location.ts +src/app/core/models/blog.model.ts + + +blog.model.ts - + -src/app/core/models/person.ts - - -person.ts +src/app/core/models/person.model.ts + + +person.model.ts - + -src/app/core/models/person.ts->src/app/core/models/location.ts - - +src/app/core/models/blog.model.ts->src/app/core/models/person.model.ts + + - + +src/app/features/news-feed/models/INewsItem.ts + + +INewsItem.ts + + + + + +src/app/core/models/blog.model.ts->src/app/features/news-feed/models/INewsItem.ts + + + + + +src/app/core/models/location.model.ts + + +location.model.ts + + + + + +src/app/core/models/person.model.ts->src/app/core/models/location.model.ts + + + + + +src/app/features/news-feed/models/INewsItem.ts->src/app/core/models/person.model.ts + + + + + +src/app/core/models/poll.model.ts + + +poll.model.ts + + + + + +src/app/core/models/poll.model.ts->src/app/core/models/person.model.ts + + + + + +src/app/core/models/poll.model.ts->src/app/features/news-feed/models/INewsItem.ts + + + + + +src/app/core/models/post.model.ts + + +post.model.ts + + + + + +src/app/core/models/post.model.ts->src/app/core/models/person.model.ts + + + + + +src/app/core/models/post.model.ts->src/app/features/news-feed/models/INewsItem.ts + + + + + +src/app/core/services/debounce.service.spec.ts + + +debounce.service.spec.ts + + + + + +src/app/core/services/debounce.service.ts + + +debounce.service.ts + + + + + +src/app/core/services/debounce.service.spec.ts->src/app/core/services/debounce.service.ts + + + + + src/app/core/services/event.service.spec.ts - - -event.service.spec.ts + + +event.service.spec.ts - + src/app/core/services/event.service.ts - - -event.service.ts + + +event.service.ts - + src/app/core/services/event.service.spec.ts->src/app/core/services/event.service.ts - - + + - - -src/app/core/services/event.service.ts->src/app/core/models/location.ts - - + + +src/app/core/services/event.service.ts->src/app/core/models/location.model.ts + + - + src/app/core/services/group.service.ts - - -group.service.ts + + +group.service.ts - + src/app/core/services/event.service.ts->src/app/core/services/group.service.ts - - + + - + src/app/core/services/people.service.ts - - -people.service.ts + + +people.service.ts - + src/app/core/services/event.service.ts->src/app/core/services/people.service.ts - - + + - + src/app/features/events/models/event.ts - - -event.ts + + +event.ts - + src/app/core/services/event.service.ts->src/app/features/events/models/event.ts - - + + - + src/app/features/groups/models/group.ts - - -group.ts + + +group.ts - + src/app/core/services/group.service.ts->src/app/features/groups/models/group.ts - - + + - - -src/app/core/services/people.service.ts->src/app/core/models/location.ts - - + + +src/app/core/services/people.service.ts->src/app/core/models/person.model.ts + + - - -src/app/core/services/people.service.ts->src/app/core/models/person.ts - - + + +src/app/core/services/people.service.ts->src/app/core/models/location.model.ts + + - - -src/app/features/events/models/event.ts->src/app/core/models/location.ts - - + + +src/app/features/events/models/event.ts->src/app/core/models/person.model.ts + + - - -src/app/features/events/models/event.ts->src/app/core/models/person.ts - - + + +src/app/features/events/models/event.ts->src/app/core/models/location.model.ts + + - + src/app/features/events/models/event.ts->src/app/features/groups/models/group.ts - - + + + + + +src/app/core/services/focus-tracking.service.spec.ts + + +focus-tracking.service.spec.ts + + + + + +src/app/core/services/focus-tracking.service.ts + + +focus-tracking.service.ts + + + + + +src/app/core/services/focus-tracking.service.spec.ts->src/app/core/services/focus-tracking.service.ts + + - + src/app/core/services/group.service.spec.ts - - -group.service.spec.ts + + +group.service.spec.ts - + src/app/core/services/group.service.spec.ts->src/app/core/services/group.service.ts - - + + - + src/app/core/services/language-storage.service.spec.ts - - -language-storage.service.spec.ts + + +language-storage.service.spec.ts - + src/app/core/services/language-storage.service.spec.ts->src/app/core/services/language-storage.service.ts - - + + - + src/app/core/services/local-storage-ref.service.spec.ts - - -local-storage-ref.service.spec.ts + + +local-storage-ref.service.spec.ts - + src/app/core/services/local-storage-ref.service.spec.ts->src/app/core/services/local-storage-ref.service.ts - - + + - + src/app/core/services/news.service.spec.ts - - -news.service.spec.ts + + +news.service.spec.ts - + src/app/core/services/news.service.ts - - -news.service.ts + + +news.service.ts - + src/app/core/services/news.service.spec.ts->src/app/core/services/news.service.ts - - + + - - -src/app/core/services/news.service.ts->src/app/core/services/people.service.ts - - + + +src/app/core/services/news.service.ts->src/app/core/models/blog.model.ts + + - - -src/app/features/news-feed/models/news-item.ts - - -news-item.ts - + + +src/app/core/services/news.service.ts->src/app/features/news-feed/models/INewsItem.ts + + + + +src/app/core/services/news.service.ts->src/app/core/models/poll.model.ts + + - - -src/app/core/services/news.service.ts->src/app/features/news-feed/models/news-item.ts - - + + +src/app/core/services/news.service.ts->src/app/core/models/post.model.ts + + - - -src/app/features/news-feed/models/news-item.ts->src/app/core/models/person.ts - - + + +src/app/core/services/news.service.ts->src/app/core/services/people.service.ts + + - + src/app/core/services/people.service.spec.ts - - -people.service.spec.ts + + +people.service.spec.ts - + src/app/core/services/people.service.spec.ts->src/app/core/services/people.service.ts - - + + - + src/app/core/services/session-storage.service.spec.ts - - -session-storage.service.spec.ts + + +session-storage.service.spec.ts - + src/app/core/services/session-storage.service.spec.ts->src/app/core/services/session-storage.service.ts - - + + - + src/app/core/services/title.service.spec.ts - - -title.service.spec.ts + + +title.service.spec.ts - + src/app/core/services/title.service.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/core/services/title.service.spec.ts->src/app/core/services/title.service.ts - - + + - + src/app/core/services/user.service.spec.ts - - -user.service.spec.ts + + +user.service.spec.ts - + src/app/core/services/user.service.ts - - -user.service.ts + + +user.service.ts - + src/app/core/services/user.service.spec.ts->src/app/core/services/user.service.ts - - + + - + src/app/features/about/about-routing.module.ts->src/app/features/about/about.component.ts - - + + - + src/app/features/about/about.component.spec.ts - - -about.component.spec.ts + + +about.component.spec.ts - + src/app/features/about/about.component.spec.ts->src/app/features/about/about.component.ts - - + + - + src/app/features/blog/blog.component.ts - - -blog.component.ts + + +blog.component.ts - + src/app/features/blog/blog-routing.module.ts->src/app/features/blog/blog.component.ts - - + + - + src/app/features/blog/blog.component.spec.ts - - -blog.component.spec.ts + + +blog.component.spec.ts - + src/app/features/blog/blog.component.spec.ts->src/app/features/blog/blog.component.ts - - + + - + src/app/features/bookmarks/bookmarks.component.ts - - -bookmarks.component.ts + + +bookmarks.component.ts - + src/app/features/bookmarks/bookmarks-routing.module.ts->src/app/features/bookmarks/bookmarks.component.ts - - + + - + src/app/features/bookmarks/bookmarks.component.spec.ts - - -bookmarks.component.spec.ts + + +bookmarks.component.spec.ts - + src/app/features/bookmarks/bookmarks.component.spec.ts->src/app/features/bookmarks/bookmarks.component.ts - - + + - + src/app/features/dashboard/dashboard.component.ts - - -dashboard.component.ts + + +dashboard.component.ts - + src/app/features/dashboard/dashboard-routing.module.ts->src/app/features/dashboard/dashboard.component.ts - - + + - + src/app/features/dashboard/dashboard.component.spec.ts - - -dashboard.component.spec.ts + + +dashboard.component.spec.ts - + src/app/features/dashboard/dashboard.component.spec.ts->src/app/features/dashboard/dashboard.component.ts - - + + - + src/app/features/events/components/event-card/event-card.component.spec.ts - - -event-card.component.spec.ts + + +event-card.component.spec.ts - + src/app/features/events/components/event-card/event-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/events/components/event-card/event-card.component.spec.ts->src/app/features/events/components/event-card/event-card.component.ts - - + + - + src/app/features/events/components/event-card/event-card.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/features/events/components/event-card/event-card.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/events/components/event-card/event-card.component.ts->src/app/features/events/models/event.ts - - + + - + src/app/shared/models/material-button-type.ts - - -material-button-type.ts + + +material-button-type.ts - + src/app/features/events/components/event-card/event-card.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/shared/models/tooltip-direction.ts - - -tooltip-direction.ts + + +tooltip-direction.ts - + src/app/features/events/components/event-card/event-card.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/features/events/components/event-list/event-list.component.spec.ts - - -event-list.component.spec.ts + + +event-list.component.spec.ts - + src/app/features/events/components/event-list/event-list.component.spec.ts->src/app/features/events/components/event-list/event-list.component.ts - - + + - + src/app/features/events/components/event-list/event-list.component.ts->src/app/features/events/models/event.ts - - + + - + src/app/features/events/components/event/event.component.spec.ts - - -event.component.spec.ts + + +event.component.spec.ts - + src/app/features/events/components/event/event.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/events/components/event/event.component.spec.ts->src/app/features/events/components/event/event.component.ts - - + + - + src/app/features/events/components/event/event.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/features/events/components/event/event.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/events/components/event/event.component.ts->src/app/core/services/event.service.ts - - + + - + src/app/features/events/components/event/event.component.ts->src/app/features/events/models/event.ts - - + + - + src/app/features/events/components/event/event.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/features/events/components/event/event.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/features/events/components/event/event.component.ts->src/app/shared/components/banner/banner.component.ts - - + + - + src/app/shared/models/input-type.ts - - -input-type.ts + + +input-type.ts - + src/app/features/events/components/event/event.component.ts->src/app/shared/models/input-type.ts - - + + - + src/app/features/events/events-routing.module.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/events/events-routing.module.ts->src/app/features/events/events.component.ts - - + + - + src/app/features/events/events-routing.module.ts->src/app/features/events/components/event/event.component.ts - - + + - + src/app/features/events/events.component.spec.ts - - -events.component.spec.ts + + +events.component.spec.ts - + src/app/features/events/events.component.spec.ts->src/app/features/events/events.component.ts - - + + - + src/app/features/events/resolvers/event.resolver.ts - - -event.resolver.ts + + +event.resolver.ts - + src/app/features/events/resolvers/event.resolver.ts->src/app/core/services/event.service.ts - - + + - + src/app/features/events/resolvers/event.resolver.ts->src/app/features/events/models/event.ts - - + + - + src/app/features/friends/friends.component.ts - - -friends.component.ts + + +friends.component.ts - + src/app/features/friends/friends-routing.module.ts->src/app/features/friends/friends.component.ts - - + + - + src/app/features/friends/friends.component.spec.ts - - -friends.component.spec.ts + + +friends.component.spec.ts - + src/app/features/friends/friends.component.spec.ts->src/app/features/friends/friends.component.ts - - + + - + src/app/features/groups/components/group-card/group-card.component.spec.ts - - -group-card.component.spec.ts + + +group-card.component.spec.ts - + src/app/features/groups/components/group-card/group-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/groups/components/group-card/group-card.component.spec.ts->src/app/features/groups/components/group-card/group-card.component.ts - - + + - + src/app/features/groups/components/group-card/group-card.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/features/groups/components/group-card/group-card.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/groups/components/group-card/group-card.component.ts->src/app/features/groups/models/group.ts - - + + - + src/app/features/groups/components/group-list/group-list.component.spec.ts - - -group-list.component.spec.ts + + +group-list.component.spec.ts - + src/app/features/groups/components/group-list/group-list.component.spec.ts->src/app/features/groups/components/group-list/group-list.component.ts - - + + - + src/app/features/groups/components/group-list/group-list.component.ts->src/app/features/groups/models/group.ts - - + + - + src/app/features/groups/components/group/group.component.spec.ts - - -group.component.spec.ts + + +group.component.spec.ts - + src/app/features/groups/components/group/group.component.spec.ts->src/app/features/groups/components/group/group.component.ts - - + + - + src/app/features/groups/groups-routing.module.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/groups/groups-routing.module.ts->src/app/features/groups/groups.component.ts - - + + - + src/app/features/groups/groups-routing.module.ts->src/app/features/groups/components/group/group.component.ts - - + + - + src/app/features/groups/groups.component.spec.ts - - -groups.component.spec.ts + + +groups.component.spec.ts - + src/app/features/groups/groups.component.spec.ts->src/app/features/groups/groups.component.ts - - + + - + src/app/features/home/home-routing.module.ts->src/app/features/home/home.component.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/services/translations.service.ts - - + + - - -src/app/features/home/home.component.ts->src/app/core/models/person.ts - - + + +src/app/features/home/home.component.ts->src/app/core/models/person.model.ts + + + + + +src/app/features/home/home.component.ts->src/app/features/news-feed/models/INewsItem.ts + + - + src/app/features/home/home.component.ts->src/app/core/services/event.service.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/services/group.service.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/services/people.service.ts - - + + - + src/app/features/home/home.component.ts->src/app/features/events/models/event.ts - - + + - + src/app/features/home/home.component.ts->src/app/features/groups/models/group.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/services/news.service.ts - - - - - -src/app/features/home/home.component.ts->src/app/features/news-feed/models/news-item.ts - - + + - + src/app/features/home/home.component.ts->src/app/shared/models/input-type.ts - - + + - + src/app/features/home/home.component.spec.ts - - -home.component.spec.ts + + +home.component.spec.ts - + src/app/features/home/home.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/home/home.component.spec.ts->src/app/features/home/home.component.ts - - + + - + src/app/features/invite/invite.component.ts - - -invite.component.ts + + +invite.component.ts - + src/app/features/invite/invite-routing.module.ts->src/app/features/invite/invite.component.ts - - + + - + src/app/features/invite/invite.component.spec.ts - - -invite.component.spec.ts + + +invite.component.spec.ts - + src/app/features/invite/invite.component.spec.ts->src/app/features/invite/invite.component.ts - - + + - + src/app/features/login/login-routing.module.ts->src/app/features/login/login.component.ts - - + + - + src/app/features/login/login.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/login/login.component.spec.ts - - -login.component.spec.ts + + +login.component.spec.ts - + src/app/features/login/login.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/login/login.component.spec.ts->src/app/features/login/login.component.ts - - + + - + src/app/features/members/members.component.ts - - -members.component.ts + + +members.component.ts - + src/app/features/members/members-routing.module.ts->src/app/features/members/members.component.ts - - + + - + src/app/features/members/members.component.spec.ts - - -members.component.spec.ts + + +members.component.spec.ts - + src/app/features/members/members.component.spec.ts->src/app/features/members/members.component.ts - - + + - + src/app/features/messages/messages.component.ts - - -messages.component.ts + + +messages.component.ts - + src/app/features/messages/messages-routing.module.ts->src/app/features/messages/messages.component.ts - - + + - + src/app/features/messages/messages.component.spec.ts - - -messages.component.spec.ts + + +messages.component.spec.ts - + src/app/features/messages/messages.component.spec.ts->src/app/features/messages/messages.component.ts - - + + - + src/app/features/missions/missions.component.ts - - -missions.component.ts + + +missions.component.ts - + src/app/features/missions/missions-routing.module.ts->src/app/features/missions/missions.component.ts - - + + - + src/app/features/missions/missions.component.spec.ts - - -missions.component.spec.ts + + +missions.component.spec.ts - + src/app/features/missions/missions.component.spec.ts->src/app/features/missions/missions.component.ts - - + + - + src/app/features/news-feed/components/news-card/news-card.component.spec.ts - - -news-card.component.spec.ts + + +news-card.component.spec.ts - + src/app/features/news-feed/components/news-card/news-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/news-feed/components/news-card/news-card.component.spec.ts->src/app/features/news-feed/components/news-card/news-card.component.ts - - + + - + src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/core/services/translations.service.ts - - + + - - -src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/features/news-feed/models/news-item.ts - - + + +src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/core/models/blog.model.ts + + + + + +src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/features/news-feed/models/INewsItem.ts + + + + + +src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/core/models/poll.model.ts + + + + + +src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/core/models/post.model.ts + + - + src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/features/news-feed/components/news-list/news-list.component.spec.ts - - -news-list.component.spec.ts + + +news-list.component.spec.ts - + src/app/features/news-feed/components/news-list/news-list.component.spec.ts->src/app/features/news-feed/components/news-list/news-list.component.ts - - + + - - -src/app/features/news-feed/components/news-list/news-list.component.ts->src/app/features/news-feed/models/news-item.ts - - + + +src/app/features/news-feed/components/news-list/news-list.component.ts->src/app/features/news-feed/models/INewsItem.ts + + - + src/app/features/news-feed/news-feed.component.ts - - -news-feed.component.ts + + +news-feed.component.ts - + src/app/features/news-feed/news-feed-routing.module.ts->src/app/features/news-feed/news-feed.component.ts - - + + - + src/app/features/news-feed/news-feed.component.spec.ts - - -news-feed.component.spec.ts + + +news-feed.component.spec.ts - + src/app/features/news-feed/news-feed.component.spec.ts->src/app/features/news-feed/news-feed.component.ts - - + + - + src/app/features/privacy/privacy-routing.module.ts->src/app/features/privacy/privacy.component.ts - - + + - + src/app/features/privacy/privacy.component.spec.ts - - -privacy.component.spec.ts + + +privacy.component.spec.ts - + src/app/features/privacy/privacy.component.spec.ts->src/app/features/privacy/privacy.component.ts - - + + + + + +src/app/features/profile/components/post/post.component.spec.ts + + +post.component.spec.ts + + + + + +src/app/features/profile/components/post/post.component.spec.ts->src/app/core/helpers/typescript-loader.ts + + + + + +src/app/features/profile/components/post/post.component.spec.ts->src/app/features/profile/components/post/post.component.ts + + + + + +src/app/features/profile/components/post/post.component.ts->src/app/core/services/translations.service.ts + + + + + +src/app/features/profile/components/post/post.component.ts->src/app/core/services/session-storage.service.ts + + + + + +src/app/features/profile/components/post/post.component.ts->src/app/core/models/person.model.ts + + - + src/app/features/profile/components/profile-card/profile-card.component.spec.ts - - -profile-card.component.spec.ts + + +profile-card.component.spec.ts - + src/app/features/profile/components/profile-card/profile-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.spec.ts->src/app/features/profile/components/profile-card/profile-card.component.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/core/services/translations.service.ts - - + + - - -src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/core/models/person.ts - - + + +src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/core/models/person.model.ts + + - + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/features/profile/components/profile-list/profile-list.component.spec.ts - - -profile-list.component.spec.ts + + +profile-list.component.spec.ts - + src/app/features/profile/components/profile-list/profile-list.component.spec.ts->src/app/features/profile/components/profile-list/profile-list.component.ts - - + + - - -src/app/features/profile/components/profile-list/profile-list.component.ts->src/app/core/models/person.ts - - + + +src/app/features/profile/components/profile-list/profile-list.component.ts->src/app/core/models/person.model.ts + + - + src/app/features/profile/profile.component.ts - - -profile.component.ts + + +profile.component.ts - + src/app/features/profile/profile-routing.module.ts->src/app/features/profile/profile.component.ts - - + + - + src/app/features/profile/profile.component.spec.ts - - -profile.component.spec.ts + + +profile.component.spec.ts - + src/app/features/profile/profile.component.spec.ts->src/app/features/profile/profile.component.ts - - + + - + src/app/features/register/register-routing.module.ts->src/app/features/register/register.component.ts - - + + - + src/app/features/register/register.component.spec.ts - - -register.component.spec.ts + + +register.component.spec.ts - + src/app/features/register/register.component.spec.ts->src/app/features/register/register.component.ts - - + + - + src/app/features/search/search.component.ts - - -search.component.ts + + +search.component.ts - + src/app/features/search/search-routing.module.ts->src/app/features/search/search.component.ts - - + + - + src/app/features/search/search.component.spec.ts - - -search.component.spec.ts + + +search.component.spec.ts - + src/app/features/search/search.component.spec.ts->src/app/features/search/search.component.ts - - + + - + src/app/features/settings/settings.component.ts - - -settings.component.ts + + +settings.component.ts - + src/app/features/settings/settings-routing.module.ts->src/app/features/settings/settings.component.ts - - + + - + src/app/features/settings/settings.component.spec.ts - - -settings.component.spec.ts + + +settings.component.spec.ts - + src/app/features/settings/settings.component.spec.ts->src/app/features/settings/settings.component.ts - - + + - + src/app/features/splash/splash-routing.module.ts->src/app/features/splash/splash.component.ts - - + + - + src/app/features/splash/splash.component.spec.ts - - -splash.component.spec.ts + + +splash.component.spec.ts - + src/app/features/splash/splash.component.spec.ts->src/app/features/splash/splash.component.ts - - + + - + src/app/features/stats/stats-routing.module.ts->src/app/features/stats/stats.component.ts - - + + - + src/app/features/stats/stats.component.spec.ts - - -stats.component.spec.ts + + +stats.component.spec.ts - + src/app/features/stats/stats.component.spec.ts->src/app/features/stats/stats.component.ts - - + + - + src/app/features/terms/terms-routing.module.ts->src/app/features/terms/terms.component.ts - - + + - + src/app/features/terms/terms.component.spec.ts - - -terms.component.spec.ts + + +terms.component.spec.ts - + src/app/features/terms/terms.component.spec.ts->src/app/features/terms/terms.component.ts - - + + - + src/app/features/the-wire/the-wire.component.ts - - -the-wire.component.ts + + +the-wire.component.ts - + src/app/features/the-wire/the-wire-routing.module.ts->src/app/features/the-wire/the-wire.component.ts - - + + - + src/app/features/the-wire/the-wire.component.spec.ts - - -the-wire.component.spec.ts + + +the-wire.component.spec.ts - + src/app/features/the-wire/the-wire.component.spec.ts->src/app/features/the-wire/the-wire.component.ts - - + + - + src/app/shared/components/banner/banner.component.spec.ts - - -banner.component.spec.ts + + +banner.component.spec.ts - + src/app/shared/components/banner/banner.component.spec.ts->src/app/shared/components/banner/banner.component.ts - - + + + + + +src/app/shared/components/blog-form/blog-form.component.spec.ts + + +blog-form.component.spec.ts + + + + + +src/app/shared/components/blog-form/blog-form.component.spec.ts->src/app/core/helpers/typescript-loader.ts + + + + + +src/app/shared/components/blog-form/blog-form.component.spec.ts->src/app/shared/pipes/truncate-file-name.pipe.ts + + + + + +src/app/shared/components/blog-form/blog-form.component.spec.ts->src/app/shared/components/blog-form/blog-form.component.ts + + + + + +src/app/shared/components/blog-form/blog-form.component.ts->src/app/core/services/translations.service.ts + + + + + +src/app/shared/components/blog-form/blog-form.component.ts->src/app/core/services/focus-tracking.service.ts + + - + src/app/shared/components/button/button.component.spec.ts - - -button.component.spec.ts + + +button.component.spec.ts - + src/app/shared/components/button/button.component.spec.ts->src/app/shared/components/button/button.component.ts - - + + - + src/app/shared/components/button/button.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/shared/components/button/button.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/shared/models/button-type.ts - - -button-type.ts + + +button-type.ts - + src/app/shared/components/button/button.component.ts->src/app/shared/models/button-type.ts - - + + - + src/app/shared/models/material-color.ts - - -material-color.ts + + +material-color.ts - + src/app/shared/components/button/button.component.ts->src/app/shared/models/material-color.ts - - + + + + + +src/app/shared/models/theme.ts + + +theme.ts + + + + + +src/app/shared/components/button/button.component.ts->src/app/shared/models/theme.ts + + - + src/app/shared/components/calendar-button/calendar-button.component.spec.ts - - -calendar-button.component.spec.ts + + +calendar-button.component.spec.ts - + src/app/shared/components/calendar-button/calendar-button.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/calendar-button/calendar-button.component.spec.ts->src/app/shared/components/calendar-button/calendar-button.component.ts - - + + - + src/app/shared/components/calendar-button/calendar-button.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/calendar-button/calendar-button.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/shared/components/editor/editor.component.spec.ts - - -editor.component.spec.ts + + +editor.component.spec.ts - + src/app/shared/components/editor/editor.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/editor/editor.component.spec.ts->src/app/shared/components/editor/editor.component.ts - - + + - + src/app/shared/components/editor/editor.component.ts->src/app/core/services/translations.service.ts - - + + + + + +src/app/shared/components/editor/editor.component.ts->src/app/shared/models/tooltip-direction.ts + + - + src/app/shared/components/editor/editor.component.ts->src/app/shared/factories/editor-config.factory.ts - - + + - + src/app/shared/factories/editor-config.factory.ts->src/app/core/services/translations.service.ts - - + + + + + +src/app/shared/components/event-form/event-form.component.spec.ts + + +event-form.component.spec.ts + + + + + +src/app/shared/components/event-form/event-form.component.spec.ts->src/app/core/helpers/typescript-loader.ts + + + + + +src/app/shared/components/event-form/event-form.component.spec.ts->src/app/shared/components/event-form/event-form.component.ts + + + + + +src/app/shared/components/event-form/event-form.component.ts->src/app/core/services/translations.service.ts + + - + src/app/shared/components/footer/footer.component.spec.ts - - -footer.component.spec.ts + + +footer.component.spec.ts - + src/app/shared/components/footer/footer.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/footer/footer.component.spec.ts->src/app/shared/components/footer/footer.component.ts - - + + - + src/app/shared/components/footer/footer.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/shared/components/footer/footer.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/forbidden/forbidden.component.spec.ts - - -forbidden.component.spec.ts + + +forbidden.component.spec.ts - + src/app/shared/components/forbidden/forbidden.component.spec.ts->src/app/shared/components/forbidden/forbidden.component.ts - - + + - + src/app/shared/components/header/header.component.spec.ts - - -header.component.spec.ts + + +header.component.spec.ts - + src/app/shared/components/header/header.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/header/header.component.spec.ts->src/app/shared/components/header/header.component.ts - - + + - + src/app/shared/components/header/header.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/shared/components/header/header.component.ts->src/app/core/services/translations.service.ts - - + + - - -src/app/shared/components/header/header.component.ts->src/app/core/models/person.ts - - + + +src/app/shared/components/header/header.component.ts->src/app/core/models/person.model.ts + + - + src/app/shared/components/header/header.component.ts->src/app/core/services/people.service.ts - - + + - + src/app/shared/components/header/header.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/shared/components/input/input.component.spec.ts - - -input.component.spec.ts + + +input.component.spec.ts - + src/app/shared/components/input/input.component.spec.ts->src/app/shared/components/input/input.component.ts - - + + - + src/app/shared/components/input/input.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/input/input.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/shared/components/input/input.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/shared/components/input/input.component.ts->src/app/shared/models/input-type.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.spec.ts - - -language-selector.component.spec.ts + + +language-selector.component.spec.ts - + src/app/shared/components/language-selector/language-selector.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.spec.ts->src/app/shared/components/language-selector/language-selector.component.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/shared/models/language.ts - - -language.ts + + +language.ts - + src/app/shared/components/language-selector/language-selector.component.ts->src/app/shared/models/language.ts - - + + - + src/app/shared/components/not-found/not-found.component.spec.ts - - -not-found.component.spec.ts + + +not-found.component.spec.ts - + src/app/shared/components/not-found/not-found.component.spec.ts->src/app/shared/components/not-found/not-found.component.ts - - + + - + src/app/shared/components/page-title/page-title.component.spec.ts - - -page-title.component.spec.ts + + +page-title.component.spec.ts - + src/app/shared/components/page-title/page-title.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/page-title/page-title.component.spec.ts->src/app/shared/components/page-title/page-title.component.ts - - + + + + + +src/app/shared/components/poll-form/poll-form.component.spec.ts + + +poll-form.component.spec.ts + + + + + +src/app/shared/components/poll-form/poll-form.component.spec.ts->src/app/core/helpers/typescript-loader.ts + + + + + +src/app/shared/components/poll-form/poll-form.component.spec.ts->src/app/shared/components/poll-form/poll-form.component.ts + + + + + +src/app/shared/components/poll-form/poll-form.component.ts->src/app/core/services/translations.service.ts + + + + + +src/app/shared/components/poll-form/poll-form.component.ts->src/app/shared/models/tooltip-direction.ts + + + + + +src/app/shared/components/post-form/post-form.component.spec.ts + + +post-form.component.spec.ts + + + + + +src/app/shared/components/post-form/post-form.component.spec.ts->src/app/core/helpers/typescript-loader.ts + + + + + +src/app/shared/components/post-form/post-form.component.spec.ts->src/app/shared/components/post-form/post-form.component.ts + + + + + +src/app/shared/components/post-form/post-form.component.ts->src/app/core/services/translations.service.ts + + - + src/app/shared/components/profile-pic/profile-pic.component.spec.ts - - -profile-pic.component.spec.ts + + +profile-pic.component.spec.ts - + src/app/shared/components/profile-pic/profile-pic.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.spec.ts->src/app/shared/components/profile-pic/profile-pic.component.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.ts->src/app/core/services/translations.service.ts - - + + - - -src/app/shared/components/profile-pic/profile-pic.component.ts->src/app/core/models/person.ts - - + + +src/app/shared/components/profile-pic/profile-pic.component.ts->src/app/core/models/person.model.ts + + - + src/app/shared/components/unauthorized/unauthorized.component.spec.ts - - -unauthorized.component.spec.ts + + +unauthorized.component.spec.ts - + src/app/shared/components/unauthorized/unauthorized.component.spec.ts->src/app/shared/components/unauthorized/unauthorized.component.ts - - + + + + + +src/app/shared/pipes/truncate-file-name.pipe.spec.ts + + +truncate-file-name.pipe.spec.ts + + + + + +src/app/shared/pipes/truncate-file-name.pipe.spec.ts->src/app/shared/pipes/truncate-file-name.pipe.ts + + - + src/assets/i18n/translations.fr.ts - - -translations.fr.ts + + +translations.fr.ts - + src/assets/i18n/translations.fr.ts->src/assets/i18n/translations.en.ts - - + + - + src/environments/environment.pr.ts - + environment.pr.ts - + src/environments/environment.prod.ts - + environment.prod.ts - + src/main.ts - - -main.ts + + +main.ts - + src/main.ts->src/app/app.module.ts - - + + - + src/main.ts->src/environments/environment.ts - + - + src/polyfills.ts - - -polyfills.ts + + +polyfills.ts - + src/test.ts - - -test.ts + + +test.ts diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 11f3097d..68991706 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -9,7 +9,6 @@ import { TranslateService } from "@ngx-translate/core"; import { LanguageStorageService } from './core/services/language-storage.service'; import { Translations } from './core/services/translations.service'; - @Component({ selector: 'app-root', templateUrl: './app.component.html', diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 7082bbb1..59313b1d 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -42,9 +42,10 @@ import { GroupsComponent } from './features/groups/groups.component'; }), NgxTranslateRoutesModule.forRoot({ enableRouteTranslate: true, - enableTitleTranslate: false + enableTitleTranslate: false, + }), - BrowserAnimationsModule + BrowserAnimationsModule, ], providers: [ { diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts index 20a210eb..395625c9 100644 --- a/src/app/core/core.module.ts +++ b/src/app/core/core.module.ts @@ -9,7 +9,6 @@ import { HttpClient } from '@angular/common/http'; import { TypescriptLoader } from './helpers/typescript-loader'; @NgModule({ - declarations: [], imports: [ CommonModule, AuthConfigModule, diff --git a/src/app/core/models/blog.model.ts b/src/app/core/models/blog.model.ts new file mode 100644 index 00000000..5fdfa939 --- /dev/null +++ b/src/app/core/models/blog.model.ts @@ -0,0 +1,13 @@ +import { INewsItem } from "src/app/features/news-feed/models/INewsItem"; +import { Person } from "./person.model"; + +export class Blog implements INewsItem { + constructor( + public id: string, + public author: Person, + public authoredDate: Date, + public content: string, + public comments: number, + public likes: number + ) {} +} \ No newline at end of file diff --git a/src/app/core/models/location.ts b/src/app/core/models/location.model.ts similarity index 100% rename from src/app/core/models/location.ts rename to src/app/core/models/location.model.ts diff --git a/src/app/core/models/person.ts b/src/app/core/models/person.model.ts similarity index 91% rename from src/app/core/models/person.ts rename to src/app/core/models/person.model.ts index 082ea8cd..e70626c5 100644 --- a/src/app/core/models/person.ts +++ b/src/app/core/models/person.model.ts @@ -1,4 +1,4 @@ -import { Location } from "./location"; +import { Location } from "./location.model"; export class Person { id: string | undefined; diff --git a/src/app/core/models/poll.model.ts b/src/app/core/models/poll.model.ts new file mode 100644 index 00000000..6f0cf8fd --- /dev/null +++ b/src/app/core/models/poll.model.ts @@ -0,0 +1,13 @@ +import { INewsItem } from "src/app/features/news-feed/models/INewsItem"; +import { Person } from "./person.model"; + +export class Poll implements INewsItem { + constructor( + public id: string, + public author: Person, + public authoredDate: Date, + public content: string, + public comments: number, + public likes: number + ) {} +} \ No newline at end of file diff --git a/src/app/core/models/post.model.ts b/src/app/core/models/post.model.ts new file mode 100644 index 00000000..cc67c2e8 --- /dev/null +++ b/src/app/core/models/post.model.ts @@ -0,0 +1,13 @@ +import { INewsItem } from "src/app/features/news-feed/models/INewsItem"; +import { Person } from "./person.model"; + +export class Post implements INewsItem { + constructor( + public id: string, + public author: Person, + public authoredDate: Date, + public content: string, + public comments: number, + public likes: number + ) {} +} \ No newline at end of file diff --git a/src/app/core/services/debounce.service.spec.ts b/src/app/core/services/debounce.service.spec.ts new file mode 100644 index 00000000..4ca5b957 --- /dev/null +++ b/src/app/core/services/debounce.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { DebounceService } from './debounce.service'; + +describe('DebounceService', () => { + let service: DebounceService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(DebounceService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/core/services/debounce.service.ts b/src/app/core/services/debounce.service.ts new file mode 100644 index 00000000..39065a24 --- /dev/null +++ b/src/app/core/services/debounce.service.ts @@ -0,0 +1,23 @@ +import { Injectable } from '@angular/core'; +import { Observable, Subject, debounceTime } from 'rxjs'; + +@Injectable({ + providedIn: 'root' +}) +export class DebounceService { + + private debounceSubject = new Subject(); + + constructor() { } + + debounce(fn: Function, delay: number): void { + this.debounceSubject.next(fn); + this.debounceSubject.pipe(debounceTime(delay)).subscribe((func) => { + func(); + }); + } + + getDebouncedObservable(delay: number): Observable { + return this.debounceSubject.pipe(debounceTime(delay)); + } +} diff --git a/src/app/core/services/event.service.ts b/src/app/core/services/event.service.ts index ba6275eb..feb285dc 100644 --- a/src/app/core/services/event.service.ts +++ b/src/app/core/services/event.service.ts @@ -1,7 +1,7 @@ import { Injectable, inject } from '@angular/core'; import { Observable } from 'rxjs'; import { Event } from 'src/app/features/events/models/event'; -import { Location } from '../models/location'; +import { Location } from '../models/location.model'; import { PeopleService } from './people.service'; import { LoremIpsum } from 'lorem-ipsum'; @@ -157,7 +157,7 @@ export class EventService { private randomImage() { const images: string[] = [ - 'https://s3-alpha-sig.figma.com/img/9986/772c/bad4dde06cf83ed41c61df1b17d1369a?Expires=1693785600&Signature=Mk0vcKtlQGC1NfcH0dBlpdPH-i5JMQSjJHiBxsVivkz6XbUMgo5Ul~T1ZUsd5gqSdBNfzmzp7lkO9qpVNlO8-A4GndxqBMpov3x3qwhzV1XJobTN40viIEkOjMwF~jMFLjFRL7Ya2zrsBOKmct95k6QiyVuzvgVkm3o6bcjRNM7DuWnMFbju73L4Y-qDphKeglfi83dYbf3qO074PUnB3ReGXGChQ23~NiykgTz8UDu4oszh09nTKlnPhi8ZxuBckc6W8CsIUbsjaaTP6p0lcukyKa49lGjB9aFJ~xvpf38YI3ssl6rLlpWP1ILo6HvmQQAF7wdZvhPH1edpaeWecw__&Key-Pair-Id=APKAQ4GOSFWCVNEHN3O4' + '../assets/image/group-banner.png' ]; return images[Math.floor(Math.random() * images.length)]; } diff --git a/src/app/core/services/focus-tracking.service.spec.ts b/src/app/core/services/focus-tracking.service.spec.ts new file mode 100644 index 00000000..977df303 --- /dev/null +++ b/src/app/core/services/focus-tracking.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { FocusTrackingService } from './focus-tracking.service'; + +describe('FocusTrackingService', () => { + let service: FocusTrackingService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(FocusTrackingService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/core/services/focus-tracking.service.ts b/src/app/core/services/focus-tracking.service.ts new file mode 100644 index 00000000..13cf8d97 --- /dev/null +++ b/src/app/core/services/focus-tracking.service.ts @@ -0,0 +1,23 @@ +import { Injectable } from '@angular/core'; +import { Observable, Subject } from 'rxjs'; + +@Injectable({ + providedIn: 'root' +}) +export class FocusTrackingService { + private appFocusSubject = new Subject(); + + constructor() { + this.setupFocusListener(); + } + + private setupFocusListener() { + window.addEventListener('focus', () => { + this.appFocusSubject.next(true); + }); + } + + getAppFocusObservable(): Observable { + return this.appFocusSubject.asObservable(); + } +} diff --git a/src/app/core/services/news.service.ts b/src/app/core/services/news.service.ts index 5840a634..619c355b 100644 --- a/src/app/core/services/news.service.ts +++ b/src/app/core/services/news.service.ts @@ -1,7 +1,10 @@ //import { HttpClient } from '@angular/common/http'; import { Injectable, inject } from '@angular/core'; import { Observable } from 'rxjs'; -import { NewsItem } from 'src/app/features/news-feed/models/news-item'; +import { INewsItem } from 'src/app/features/news-feed/models/INewsItem'; +import { Post } from '../models/post.model'; +import { Blog } from '../models/blog.model'; +import { Poll } from '../models/poll.model'; import { PeopleService } from './people.service'; import { LoremIpsum } from 'lorem-ipsum'; @@ -26,7 +29,7 @@ export class NewsService { private peopleService: PeopleService = inject(PeopleService); - public newsItems: NewsItem[] = [ + public newsItems: INewsItem[] = [ this.generateRandomNewsItem(), this.generateRandomNewsItem(), this.generateRandomNewsItem(), @@ -42,8 +45,8 @@ export class NewsService { constructor() { } - mockGetNewsItem(id: string | null, delay: number = this.delay): Observable { - let response: NewsItem; + mockGetNewsItem(id: string | null, delay: number = this.delay): Observable { + let response: INewsItem; for(let i = 0; i < this.newsItems.length; i++) { if (this.newsItems[i].id == id) { @@ -52,7 +55,7 @@ export class NewsService { } } - let observable: Observable = new Observable((subscriber) => { + let observable: Observable = new Observable((subscriber) => { setTimeout(() => { subscriber.next(response); subscriber.complete(); @@ -62,8 +65,8 @@ export class NewsService { return observable; } - mockGetNewsItems(count: number = 10, delay: number = 5000): Observable { - let observable: Observable = new Observable((subscriber) => { + mockGetNewsItems(count: number = 10, delay: number = 5000): Observable { + let observable: Observable = new Observable((subscriber) => { setTimeout(() => { subscriber.next(this.newsItems.slice(0, count > this.newsItems.length ? this.newsItems.length : count)); subscriber.complete(); @@ -73,15 +76,42 @@ export class NewsService { return observable; } - private generateRandomNewsItem(): NewsItem { - const newsItem = new NewsItem(); + private generateRandomNewsItem(): INewsItem { - newsItem.id = this.id.toString(); - newsItem.date = new Date(); - newsItem.content = this.randomContent(); - newsItem.comments = Math.floor(Math.random() * 199) + 1; - newsItem.likes = Math.floor(Math.random() * 99) + 1; - newsItem.author = this.peopleService.people[this.id]; + let newsItem: INewsItem = {}; + + switch(Math.floor(Math.random() * 3)) { + case 0: + newsItem = new Post( + this.id.toString(), + this.peopleService.people[this.id], + new Date(), + this.randomContent(), + Math.floor(Math.random() * 199) + 1, + Math.floor(Math.random() * 99) + 1 + ); + break; + case 1: + newsItem = new Blog( + this.id.toString(), + this.peopleService.people[this.id], + new Date(), + this.randomContent(), + Math.floor(Math.random() * 199) + 1, + Math.floor(Math.random() * 99) + 1 + ); + break; + case 2: + newsItem = new Poll( + this.id.toString(), + this.peopleService.people[this.id], + new Date(), + this.randomContent(), + Math.floor(Math.random() * 199) + 1, + Math.floor(Math.random() * 99) + 1 + ); + break; + } this.id++; diff --git a/src/app/core/services/people.service.ts b/src/app/core/services/people.service.ts index 1fdc3ce4..f6df44b8 100644 --- a/src/app/core/services/people.service.ts +++ b/src/app/core/services/people.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; -import { Person } from '../models/person'; +import { Person } from '../models/person.model'; import { Observable } from 'rxjs'; -import { Location } from '../models/location'; +import { Location } from '../models/location.model'; @Injectable({ providedIn: 'root' diff --git a/src/app/features/events/components/event/event.component.html b/src/app/features/events/components/event/event.component.html index 48ecd687..3b922e1b 100644 --- a/src/app/features/events/components/event/event.component.html +++ b/src/app/features/events/components/event/event.component.html @@ -124,47 +124,61 @@

-
+

{{ translations.event.event_registration | translate }}

@@ -179,6 +193,7 @@

{{ translations.event.event_registration | translate }}

{{ translations.event.form.agree_with | translate }} @@ -191,11 +206,11 @@

{{ translations.event.event_registration | translate }}

{{ translations.event.form.register | translate }} -
+
\ No newline at end of file diff --git a/src/app/features/events/components/event/event.component.ts b/src/app/features/events/components/event/event.component.ts index 11482095..2a52a87f 100644 --- a/src/app/features/events/components/event/event.component.ts +++ b/src/app/features/events/components/event/event.component.ts @@ -10,6 +10,8 @@ import { InputType } from 'src/app/shared/models/input-type'; import { ActivatedRoute } from '@angular/router'; import { EventService } from 'src/app/core/services/event.service'; import { CoreRoutes } from 'src/app/core/constants/routes.constants'; +import { FormControl, FormGroup, FormGroupDirective, NgForm, Validators } from '@angular/forms'; +import { ErrorStateMatcher } from '@angular/material/core'; @Component({ selector: 'app-event', @@ -24,6 +26,7 @@ export class EventComponent implements OnInit { banner: Banner | null = null; loading: boolean = true; bookmarked: boolean = false; + agreeToTerms: boolean = false; registerFormId: string = 'gcc-event-register-form'; @@ -35,10 +38,29 @@ export class EventComponent implements OnInit { private readonly route: ActivatedRoute = inject(ActivatedRoute); private readonly eventService: EventService = inject(EventService); + formModel = { + name: '', + email: '', + emailConfirm: '', + occupation: '' + } + + nameFormControl = new FormControl(this.formModel.name, [Validators.required]); + emailFormControl = new FormControl(this.formModel.email, [Validators.required, Validators.email]); + emailConfirmFormControl = new FormControl(this.formModel.emailConfirm, [Validators.required, Validators.email]); + occupationFormControl = new FormControl(this.formModel.occupation, [Validators.required]); + + formGroup = new FormGroup({}); + + matcher = new MyErrorStateMatcher(); + constructor(public translations: Translations, private viewportScroller: ViewportScroller ) { - - } + this.formGroup.addControl('name', this.nameFormControl); + this.formGroup.addControl('email', this.emailFormControl); + this.formGroup.addControl('emailConfirm', this.emailConfirmFormControl); + this.formGroup.addControl('occupation', this.occupationFormControl); + } ngOnInit(): void { if (!this.model) { @@ -72,3 +94,11 @@ export class EventComponent implements OnInit { this.viewportScroller.scrollToAnchor(this.registerFormId); } } + +/** Error when invalid control is dirty, touched, or submitted. */ +export class MyErrorStateMatcher implements ErrorStateMatcher { + isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean { + const isSubmitted = form && form.submitted; + return !!(control && control.invalid && (control.dirty || control.touched || isSubmitted)); + } +} diff --git a/src/app/features/events/events.module.ts b/src/app/features/events/events.module.ts index 90c04564..9ff2d6c3 100644 --- a/src/app/features/events/events.module.ts +++ b/src/app/features/events/events.module.ts @@ -18,7 +18,7 @@ import { EventComponent } from './components/event/event.component'; CommonModule, EventsRoutingModule, SharedModule, - MatCardModule + MatCardModule, ], exports: [ EventListComponent diff --git a/src/app/features/events/models/event.ts b/src/app/features/events/models/event.ts index e30881b9..bff82b85 100644 --- a/src/app/features/events/models/event.ts +++ b/src/app/features/events/models/event.ts @@ -1,5 +1,5 @@ -import { Person } from "src/app/core/models/person"; -import { Location } from "src/app/core/models/location"; +import { Person } from "src/app/core/models/person.model"; +import { Location } from "src/app/core/models/location.model"; import { Group } from "../../groups/models/group"; export class Event { diff --git a/src/app/features/home/home.component.html b/src/app/features/home/home.component.html index 0233de7a..71793468 100644 --- a/src/app/features/home/home.component.html +++ b/src/app/features/home/home.component.html @@ -21,6 +21,9 @@ [infiniteScrollDistance]="2" [infiniteScrollThrottle]="1000" (scrolled)="onNewsScroll()"> + + + diff --git a/src/app/features/home/home.component.scss b/src/app/features/home/home.component.scss index e662fea9..10d13d1a 100644 --- a/src/app/features/home/home.component.scss +++ b/src/app/features/home/home.component.scss @@ -6,10 +6,12 @@ width: 66%; padding-right: $grid-step; + app-post { + display: block; + padding-bottom: 40px; + } + > div { - max-height: 100vh; - min-height: 100%; - overflow: auto; padding: 0 22px 0 22px; } } diff --git a/src/app/features/home/home.component.ts b/src/app/features/home/home.component.ts index d9c26285..d2b48338 100644 --- a/src/app/features/home/home.component.ts +++ b/src/app/features/home/home.component.ts @@ -2,12 +2,12 @@ import { Component, OnInit } from '@angular/core'; import { Translations } from 'src/app/core/services/translations.service'; import { InputType } from 'src/app/shared/models/input-type'; -import { NewsItem } from '../news-feed/models/news-item'; +import { INewsItem } from '../news-feed/models/INewsItem'; import { NewsService } from 'src/app/core/services/news.service'; import { Event } from '../events/models/event'; import { EventService } from 'src/app/core/services/event.service'; import { CoreRoutes } from 'src/app/core/constants/routes.constants'; -import { Person } from 'src/app/core/models/person'; +import { Person } from 'src/app/core/models/person.model'; import { PeopleService } from 'src/app/core/services/people.service'; import { Group } from '../groups/models/group'; import { GroupService } from 'src/app/core/services/group.service'; @@ -22,7 +22,7 @@ export class HomeComponent implements OnInit { routes = CoreRoutes; // News - newsItems: NewsItem[] = []; + newsItems: INewsItem[] = []; newsPage: number = 1; loadingNews: boolean = true; @@ -50,7 +50,7 @@ export class HomeComponent implements OnInit { } ngOnInit(): void { - this.newsService.mockGetNewsItems(10, 5000).subscribe((newsItems: NewsItem[]) => { + this.newsService.mockGetNewsItems(10, 5000).subscribe((newsItems: INewsItem[]) => { this.newsItems = newsItems; this.loadingNews = false; }); @@ -74,7 +74,7 @@ export class HomeComponent implements OnInit { onNewsScroll(): void { this.loadingNews = true; - this.newsService.mockGetNewsItems(10, 3000).subscribe((newsItems: NewsItem[]) => { + this.newsService.mockGetNewsItems(10, 3000).subscribe((newsItems: INewsItem[]) => { this.newsItems.push(...newsItems); this.loadingNews = false; }); diff --git a/src/app/features/news-feed/components/news-card/news-card.component.html b/src/app/features/news-feed/components/news-card/news-card.component.html index 3006e786..28d6a7c9 100644 --- a/src/app/features/news-feed/components/news-card/news-card.component.html +++ b/src/app/features/news-feed/components/news-card/news-card.component.html @@ -25,7 +25,21 @@ -

+ + + +

+
+ + +

+
+ + +

+
+
+ -
-
- -
There is nothing to display.
-
-
+
+
diff --git a/src/app/features/news-feed/components/news-list/news-list.component.scss b/src/app/features/news-feed/components/news-list/news-list.component.scss index f3688918..a068ce5c 100644 --- a/src/app/features/news-feed/components/news-list/news-list.component.scss +++ b/src/app/features/news-feed/components/news-list/news-list.component.scss @@ -3,45 +3,12 @@ overflow: visible; .news-card-wrapper { - padding: 20px 0; - } - - .news-card-wrapper:first-child { - padding-top: 0; - } - - .news-card-wrapper:last-child { - padding-bottom: 0; + padding-bottom: 40px; } > div:not(.news-card-wrapper) { font-size: 18px; font-weight: 600; } - - .fade-list-top { - width: calc(100% + 22px + 2px); - height: 44px; - margin-left: -22px; - margin-top: -22px; - position: sticky; - top: 0; - z-index: 2; - background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(255 255 255)), to(rgba(0, 0, 0, 0))); - pointer-events: none; - } - - .fade-list-bottom { - width: 100%; - height: 44px; - position: sticky; - margin-left: -22px; - margin-top: -22px; - z-index: 2; - bottom: 0; - width: calc(100% + 22px); - background-image: -webkit-gradient(linear, left bottom, left top, from(rgb(255 255 255)), to(rgba(0, 0, 0, 0))); - pointer-events: none; - } } } \ No newline at end of file diff --git a/src/app/features/news-feed/components/news-list/news-list.component.ts b/src/app/features/news-feed/components/news-list/news-list.component.ts index e18311d4..75b4ba52 100644 --- a/src/app/features/news-feed/components/news-list/news-list.component.ts +++ b/src/app/features/news-feed/components/news-list/news-list.component.ts @@ -1,5 +1,5 @@ import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; -import { NewsItem } from '../../models/news-item'; +import { INewsItem } from '../../models/INewsItem'; @Component({ selector: 'app-news-list', @@ -8,7 +8,7 @@ import { NewsItem } from '../../models/news-item'; changeDetection: ChangeDetectionStrategy.OnPush }) export class NewsListComponent { - @Input() model?: NewsItem[]; + @Input() model: INewsItem[] = []; @Input() isLoading: boolean = false; @Input() loadingCount: number = 3; diff --git a/src/app/features/news-feed/models/INewsItem.ts b/src/app/features/news-feed/models/INewsItem.ts new file mode 100644 index 00000000..126d29c6 --- /dev/null +++ b/src/app/features/news-feed/models/INewsItem.ts @@ -0,0 +1,10 @@ +import { Person } from "src/app/core/models/person.model"; + +export interface INewsItem { + id: string; + author: Person; + authoredDate: Date; + content: string; + comments: number; + likes: number; +} \ No newline at end of file diff --git a/src/app/features/news-feed/models/news-item.ts b/src/app/features/news-feed/models/news-item.ts deleted file mode 100644 index b690a706..00000000 --- a/src/app/features/news-feed/models/news-item.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Person } from "src/app/core/models/person"; - -export class NewsItem { - id: string | undefined; - date: Date | undefined; - author: Person | undefined; - content: string | undefined; - comments: number = 0; // TODO: Comments should be its own class not a number - likes: number = 0; -} \ No newline at end of file diff --git a/src/app/features/news-feed/news-feed.module.ts b/src/app/features/news-feed/news-feed.module.ts index 4c4855d5..f0727c47 100644 --- a/src/app/features/news-feed/news-feed.module.ts +++ b/src/app/features/news-feed/news-feed.module.ts @@ -14,7 +14,7 @@ import { NewsListComponent } from './components/news-list/news-list.component'; @NgModule({ declarations: [ NewsCardComponent, - NewsListComponent + NewsListComponent, ], imports: [ CommonModule, diff --git a/src/app/features/profile/components/post/post.component.html b/src/app/features/profile/components/post/post.component.html new file mode 100644 index 00000000..db3c1d15 --- /dev/null +++ b/src/app/features/profile/components/post/post.component.html @@ -0,0 +1,99 @@ + +
+ +
+ +
+ + + + +
+ + + + {{ profile.firstName + ' ' + profile.lastName }} + + + {{ profile.jobTitle }} + + + + + +
+ + {{ translations.forms.placeholder | translate }} +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + {{ translations.forms.save | translate }} + +
+
+ +
{{ translations.forms.create | translate }}
+ +
+
+
+
\ No newline at end of file diff --git a/src/app/features/profile/components/post/post.component.scss b/src/app/features/profile/components/post/post.component.scss new file mode 100644 index 00000000..069178da --- /dev/null +++ b/src/app/features/profile/components/post/post.component.scss @@ -0,0 +1,173 @@ +@import "../../../../../assets//scss/partials/colors"; +@import "../../../../../assets//scss/partials/font-weights"; + +$title-padding: 90px; + +:host { + mat-card { + mat-card-content { + padding-top: 30px; + + .gcc-post-placeholder { + display: flex; + padding: 12px 17px; + border: 2px solid $neutral-300; + border-radius: 10px; + align-items: center; + margin-bottom: 16px; + cursor: pointer; + + i { + padding-right: 16px; + } + + i,span { + color: $neutral-900; + } + } + + ::ng-deep { + mat-tab-header { + margin-right: 65px; + padding-bottom: 30px; + + .mat-mdc-tab-labels { + gap: 20px; + + .mdc-tab__text-label { + font-size: large; + font-weight: 600; + } + } + + .mdc-tab { + height: 40px; + border: 2px solid $primary-1; + border-radius: 10px; + + .mdc-tab__text-label { + color: #000; + transition: none; + } + } + + .mdc-tab--active { + background-color: $primary-1; + + .mdc-tab__text-label { + color: $primary-1-contrast; + } + } + + .mdc-tab--active:hover, .mdc-tab--active:focus { + background-color: $primary-2; + border-color: $primary-2; + } + + .mdc-tab-indicator { + display: none; + } + } + } + + .gcc-cancel-editing { + position: absolute; + top: 112px; + right: 26px; + + ::ng-deep { + color: $primary-1; + } + } + } + + mat-card-actions { + padding: 0px 16px 24px 16px !important; + + .right-actions { + i { + color: $primary-1-contrast; + } + } + } + } + + + + + + + + mat-card { + border: 1px solid $neutral-300; + box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25); + border-radius: 10px; + padding: 0 10px; + + .profile-wrapper { + position: absolute; + left: -20px; + top: -20px; + width: 100px; + height: 100px; + border-radius: 50%; + background-color: $background; + padding: 5px; + box-shadow: 0px 2px 4px 1px rgba(0, 0, 0, 0.25); + } + + mat-card-header { + padding: 32px 0 0 calc(16px + $title-padding); + + mat-card-title { + font-size: 20px; + font-weight: $bold; + } + + mat-card-subtitle { + font-size: 16px; + } + } + + mat-card-actions { + padding-bottom: 10px; + padding-left: 0; + padding-right: 0; + + > div { + display: flex; + width: 50%; + align-items: center; + } + + .right-actions { + app-button { + float: right; + } + } + + i.fa-solid { + color: $primary-2; + } + + .right-actions { + flex-direction: row-reverse; + } + } + + .loading-header { + padding: 32px 0 0 calc(16px + $title-padding); + + ngx-skeleton-loader { + display: block; + width: 50%; + } + } + } + + ::ng-deep button:focus { + color: $primary-1; + } +} + +// https://stackoverflow.com/a/57759753/6479757 \ No newline at end of file diff --git a/src/app/features/profile/components/post/post.component.spec.ts b/src/app/features/profile/components/post/post.component.spec.ts new file mode 100644 index 00000000..b9a20dd9 --- /dev/null +++ b/src/app/features/profile/components/post/post.component.spec.ts @@ -0,0 +1,45 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { PostComponent } from './post.component'; +import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core'; +import { HttpClient, HttpClientModule } from '@angular/common/http'; +import { TypescriptLoader } from 'src/app/core/helpers/typescript-loader'; +import { RouterTestingModule } from '@angular/router/testing'; + +describe('PostComponent', () => { + let component: PostComponent; + let translateService: TranslateService; + let fixture: ComponentFixture; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [PostComponent], + imports: [ + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), + deps: [ HttpClient ] + } + }), + HttpClientModule, + RouterTestingModule + ], + providers: [ TranslateService, HttpClient ] + }); + fixture = TestBed.createComponent(PostComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + beforeEach(() => { + translateService = TestBed.inject(TranslateService); + fixture = TestBed.createComponent(PostComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); \ No newline at end of file diff --git a/src/app/features/profile/components/post/post.component.ts b/src/app/features/profile/components/post/post.component.ts new file mode 100644 index 00000000..b73d739d --- /dev/null +++ b/src/app/features/profile/components/post/post.component.ts @@ -0,0 +1,133 @@ +import { Component, Input } from '@angular/core'; +import { Person } from 'src/app/core/models/person.model'; +import { Translations } from 'src/app/core/services/translations.service'; +import { FormGroup } from '@angular/forms'; +import { MatTabChangeEvent } from '@angular/material/tabs'; +import { SessionStorageService } from 'src/app/core/services/session-storage.service'; +import { Subscription } from 'rxjs'; + +@Component({ + selector: 'app-post', + templateUrl: './post.component.html', + styleUrls: ['./post.component.scss'] +}) +export class PostComponent { + + @Input() profile!: Person; + @Input() loading: boolean = false; + @Input() editing: boolean = false; + + formGroups: FormGroup[] = [ + new FormGroup({}), + new FormGroup({}), + new FormGroup({}), + new FormGroup({}) + ]; + formWatchSubs: Subscription[] = []; + formChanges: boolean[] = []; + + selectedIndex = 0; + saveCallback: Function = this.save.bind(this); + submitCallback: Function = this.submit.bind(this); + selectedForm: FormGroup = this.formGroups[this.selectedIndex]; + creating: boolean = false; + + constructor(public translations: Translations, + private sessionStorageService: SessionStorageService) { + + } + + ngOnInit(): void { + this.formGroups.forEach(formGroup => { + // Create a boolean to track when a FormGroup value has changed + this.formChanges.push(false); + // Create a subscription that watches each FormGroup for changes + this.formWatchSubs.push( + formGroup.valueChanges.subscribe(() =>{ + this.formChanges[this.selectedIndex] = true; + }) + ); + }); + } + + ngOnDestroy(): void { + this.formWatchSubs.forEach(formWatch => { + if (formWatch) + formWatch.unsubscribe(); + }); + } + + onTabChange(event: MatTabChangeEvent): void { + this.selectedIndex = event.index; + this.selectedForm = this.formGroups[this.selectedIndex]; + } + + toggleEditing(event: Event) { + if (!this.creating && (event instanceof KeyboardEvent && (event.key == 'Enter' || event.key == 'Space')) || event instanceof KeyboardEvent == false) { + this.editing = !this.editing; + this.selectedIndex = 0; + this.selectedForm = this.formGroups[this.selectedIndex]; + } + } + + formHasValues(formGroup: FormGroup): boolean { + return Object.keys(formGroup.value).some(k => !!formGroup.value[k]); + } + + formReady(formGroup: FormGroup): boolean { + let allControlsValid = true; + for (const name in formGroup.controls) { + if (formGroup.controls[name].invalid) { + allControlsValid = false; + break; + } + } + return allControlsValid; + } + + save(): void { + const formGroupJSON = JSON.stringify(this.formGroups[this.selectedIndex].value); + this.sessionStorageService.write('gccollab-make-a-' + this.getTypeFromIndex(this.selectedIndex), formGroupJSON); + this.formChanges[this.selectedIndex] = false; + } + + load(): void { + const savedFormGroupJSON = this.sessionStorageService.read('gccollab-make-a-' + this.getTypeFromIndex(this.selectedIndex)); + if (savedFormGroupJSON) { + const savedFormData = JSON.parse(savedFormGroupJSON); + for (const [key] of Object.entries(this.selectedForm.controls)) { + this.selectedForm.controls[key].setValue(savedFormData[key]); + } + this.formChanges[this.selectedIndex] = false; + } + } + + submit(): void { + if (this.selectedForm.status === 'VALID') { + this.creating = true; + this.sessionStorageService.remove('gccollab-make-a-' + this.getTypeFromIndex(this.selectedIndex)); + + // TODO: Setup mock service for posting forms + setTimeout(() => { + this.creating = false; + this.toggleEditing(new Event('')); + }, 3000); + } + } + + private getTypeFromIndex(index: number): string { + switch(index) { + case 0: + return "post"; + case 1: + return "blog"; + case 2: + return "event"; + case 3: + return "poll"; + default: + return "error"; + } + } +} + diff --git a/src/app/features/profile/components/profile-card/profile-card.component.ts b/src/app/features/profile/components/profile-card/profile-card.component.ts index d91defad..544ba8a3 100644 --- a/src/app/features/profile/components/profile-card/profile-card.component.ts +++ b/src/app/features/profile/components/profile-card/profile-card.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core'; import { Router } from '@angular/router'; import { CoreRoutes } from 'src/app/core/constants/routes.constants'; -import { Person } from 'src/app/core/models/person'; +import { Person } from 'src/app/core/models/person.model'; import { Translations } from 'src/app/core/services/translations.service'; import { MaterialButtonType } from 'src/app/shared/models/material-button-type'; import { TooltipDirection } from 'src/app/shared/models/tooltip-direction'; diff --git a/src/app/features/profile/components/profile-list/profile-list.component.ts b/src/app/features/profile/components/profile-list/profile-list.component.ts index c10c3fa9..2dcde2f8 100644 --- a/src/app/features/profile/components/profile-list/profile-list.component.ts +++ b/src/app/features/profile/components/profile-list/profile-list.component.ts @@ -1,5 +1,5 @@ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core'; -import { Person } from 'src/app/core/models/person'; +import { Person } from 'src/app/core/models/person.model'; @Component({ selector: 'app-profile-list', diff --git a/src/app/features/profile/profile.module.ts b/src/app/features/profile/profile.module.ts index aa1205f5..b0d848e9 100644 --- a/src/app/features/profile/profile.module.ts +++ b/src/app/features/profile/profile.module.ts @@ -5,23 +5,28 @@ import { ProfileRoutingModule } from './profile-routing.module'; import { SharedModule } from 'src/app/shared/shared.module'; import { ProfileCardComponent } from './components/profile-card/profile-card.component'; import { MatCardModule } from '@angular/material/card'; +import { MatTabsModule } from '@angular/material/tabs'; import { ProfileListComponent } from './components/profile-list/profile-list.component'; +import { PostComponent } from './components/post/post.component'; @NgModule({ declarations: [ ProfileCardComponent, - ProfileListComponent + ProfileListComponent, + PostComponent ], imports: [ CommonModule, ProfileRoutingModule, SharedModule, - MatCardModule + MatCardModule, + MatTabsModule, ], exports: [ ProfileCardComponent, - ProfileListComponent + ProfileListComponent, + PostComponent ] }) export class ProfileModule { } diff --git a/src/app/shared/components/banner/banner.component.ts b/src/app/shared/components/banner/banner.component.ts index d06c2560..9fffb503 100644 --- a/src/app/shared/components/banner/banner.component.ts +++ b/src/app/shared/components/banner/banner.component.ts @@ -22,7 +22,7 @@ export class BannerComponent { export class Banner { backgroundImage: string; - constructor(backgroundImage: string = '../../../../assets/svg/banner.svg') { + constructor(backgroundImage: string = '../../../../assets/image/banner.svg') { this.backgroundImage = backgroundImage; } } \ No newline at end of file diff --git a/src/app/shared/components/blog-form/blog-form.component.html b/src/app/shared/components/blog-form/blog-form.component.html new file mode 100644 index 00000000..6dc9c653 --- /dev/null +++ b/src/app/shared/components/blog-form/blog-form.component.html @@ -0,0 +1,68 @@ +
+ + + + + + + +
+ + + {{ $any(form).controls['coverPhoto'].value ? ($any(form).controls['coverPhotoName'].value | truncateFileName: 18) : translations.forms.blog.upload_cover_photo | translate }} + * + +
+ + + {{ coverPhotoError }} + + + + A cover photo is required. + + + + + + + + + +
\ No newline at end of file diff --git a/src/app/shared/components/blog-form/blog-form.component.scss b/src/app/shared/components/blog-form/blog-form.component.scss new file mode 100644 index 00000000..8f95e9d6 --- /dev/null +++ b/src/app/shared/components/blog-form/blog-form.component.scss @@ -0,0 +1,49 @@ +@import "../../../../assets/scss/partials/colors"; + +:host { + .cover-photo-upload { + display: flex; + align-items: center; + justify-content: center; + height: 200px; + border: 2px solid $neutral-300; + border-radius: 10px; + margin-bottom: 16px; + margin-top: 5px; + } + + .cover-photo-upload.error { + border-color: $error-red; + } + + .required-star { + color: $error-red; + } + + input + app-input { + ::ng-deep { + .gcc-input-wrapper { + padding-top: 5px; + } + } + } + + mat-error { + position: absolute; + padding-left: 16px; + margin-top: -16px; + -webkit-font-smoothing: antialiased; + font-family: var(--mdc-typography-caption-font-family, var(--mdc-typography-font-family, Inter)); + font-size: var(--mdc-typography-caption-font-size, 12px); + line-height: var(--mdc-typography-caption-line-height, 20px); + font-weight: var(--mdc-typography-caption-font-weight, 400); + letter-spacing: var(--mdc-typography-caption-letter-spacing, 0.0333333333em); + -webkit-text-decoration: var(--mdc-typography-caption-text-decoration, inherit); + text-decoration: var(--mdc-typography-caption-text-decoration, inherit); + text-transform: var(--mdc-typography-caption-text-transform, none); + } + + app-editor { + padding-bottom: 16px; + } +} \ No newline at end of file diff --git a/src/app/shared/components/blog-form/blog-form.component.spec.ts b/src/app/shared/components/blog-form/blog-form.component.spec.ts new file mode 100644 index 00000000..7fad4d0d --- /dev/null +++ b/src/app/shared/components/blog-form/blog-form.component.spec.ts @@ -0,0 +1,45 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BlogFormComponent } from './blog-form.component'; +import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core'; +import { HttpClient, HttpClientModule } from '@angular/common/http'; +import { TypescriptLoader } from 'src/app/core/helpers/typescript-loader'; +import { RouterTestingModule } from '@angular/router/testing'; +import { TruncateFileNamePipe } from '../../pipes/truncate-file-name.pipe'; +describe('BlogFormComponent', () => { + let component: BlogFormComponent; + let translateService: TranslateService; + let fixture: ComponentFixture; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [BlogFormComponent, TruncateFileNamePipe], + imports: [ + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), + deps: [ HttpClient ] + } + }), + HttpClientModule, + RouterTestingModule + ], + providers: [ TranslateService, HttpClient ] + }); + fixture = TestBed.createComponent(BlogFormComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + beforeEach(() => { + translateService = TestBed.inject(TranslateService); + fixture = TestBed.createComponent(BlogFormComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/components/blog-form/blog-form.component.ts b/src/app/shared/components/blog-form/blog-form.component.ts new file mode 100644 index 00000000..18f9fffe --- /dev/null +++ b/src/app/shared/components/blog-form/blog-form.component.ts @@ -0,0 +1,179 @@ +import { Component, ElementRef, Input, OnDestroy, OnInit, ViewChild } from '@angular/core'; +import { FormControl, FormGroup, FormGroupDirective, NgForm, Validators } from '@angular/forms'; +import { ErrorStateMatcher } from '@angular/material/core'; +import { Subscription } from 'rxjs'; +import { FocusTrackingService } from 'src/app/core/services/focus-tracking.service'; +import { TranslateService } from '@ngx-translate/core'; +import { Translations } from 'src/app/core/services/translations.service'; + +@Component({ + selector: 'app-blog-form', + templateUrl: './blog-form.component.html', + styleUrls: ['./blog-form.component.scss'], +}) +export class BlogFormComponent implements OnInit, OnDestroy { + @Input() form: FormGroup = new FormGroup({}); + @Input() model: IBlogForm = { + name: '', + publisher: '', + coverPhoto: '', + coverPhotoName: '', + coverPhotoAlt: '', + description: '' + } + @Input() disabled: boolean = false; + + @ViewChild('gccBlogCoverPhotoInput') fileInput!: ElementRef; + errorStateMatcher = new MyErrorStateMatcher(); + + coverPhotoError: string | undefined; + maxBlogLength: number = 2000; + + clickCallback: Function = this.openFilePicker.bind(this); + blurCallback: Function = this.onPhotoBlur.bind(this); + + private filePickerHasOpened: boolean = false; + private appInFocus: boolean = true; + private focusSub!: Subscription; + + private maxCoverPhotoSize: number = 3145728; + private coverPhotoMaxWidth: number = 1200; + private coverPhotoMaxHeight: number = 800; + + constructor(private focusTrackingService: FocusTrackingService, + public translations: Translations) { + + } + + ngOnInit(): void { + for (const [key, value] of Object.entries(this.model)) { + if (!this.form.controls[key]) + this.form.addControl(key, new FormControl(value, [Validators.required])); + else + console.warn('Duplicate FormControl detected.'); + } + + this.focusSub = this.focusTrackingService.getAppFocusObservable().subscribe((isInFocus) => { + this.appInFocus = isInFocus; + if (isInFocus && this.filePickerHasOpened) { + this.form.controls['coverPhoto'].markAsTouched(); + } + }); + } + + ngOnDestroy(): void { + if (this.focusSub) + this.focusSub.unsubscribe(); + + this.form.reset(); + } + + openFilePicker(): void { + this.filePickerHasOpened = true; + this.fileInput.nativeElement.click(); + } + + onPhotoBlur(): void { + if (this.appInFocus && !this.filePickerHasOpened) + this.form.controls['coverPhoto'].markAsTouched(); + } + + onFileSelected(event: any): void { + const selectedFile: File = event.target.files[0]; + + if (selectedFile) { + if (!this.isImage(selectedFile.name)) { + this.setImageError("The file selected doesn't have an accepted image extension."); + } + else if (selectedFile.size > this.maxCoverPhotoSize) { + this.setImageError("Photo is too large. Maximum size allowed is " + this.maxCoverPhotoSize / 1024 + " KB."); + } + else { + this.isCorrectDimensions(selectedFile, this.coverPhotoMaxWidth, this.coverPhotoMaxHeight).then((valid) => { + + if (!valid) + return this.setImageError("Photo dimensions have a maximum of " + this.coverPhotoMaxWidth + "x" + this.coverPhotoMaxHeight + "."); + + this.loadImage(selectedFile).then((dataURL) => { + this.model.coverPhoto = dataURL; + this.form.controls['coverPhoto'].setValue(this.model.coverPhoto); + this.form.controls['coverPhotoName'].setValue(selectedFile.name); + this.coverPhotoError = undefined; + }).catch((error) => { + this.setImageError("Error reading the image."); + console.error(error); + }); + }); + } + } + else + this.form.controls['coverPhoto'].markAsTouched(); + } + + private loadImage(file: File): Promise { + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.onload = (event) => { + const dataURL = event.target?.result as string; + resolve(dataURL); + }; + reader.onerror = (error) => { + reject(error); + }; + reader.readAsDataURL(file); + }); + } + + private isImage(fileName: string): boolean { + const fileExtension = fileName.split('.').pop(); + + if (!fileExtension) + return false; + + const imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'tiff', 'svg']; + return imageExtensions.includes(fileExtension.toLowerCase()); + } + + private isCorrectDimensions(file: File, maxWidth: number, maxHeight: number): Promise { + return new Promise((resolve) => { + const img = new Image(); + + img.onload = () => { + const width = img.width; + const height = img.height; + + if (width <= maxWidth && height <= maxHeight) { + resolve(true); + } else { + resolve(false); + } + }; + + img.src = URL.createObjectURL(file); + }); + } + + private setImageError(error: string): void { + this.model.coverPhoto = ''; + this.form.controls['coverPhoto'].setValue(this.model.coverPhoto); + this.form.controls['coverPhotoName'].setValue(''); + this.coverPhotoError = error; + this.form.controls['coverPhoto'].markAsTouched(); + } +} + +export interface IBlogForm { + name: string; + publisher: string; + coverPhoto: string; + coverPhotoName: string; + coverPhotoAlt: string; + description: string; +} + +class MyErrorStateMatcher implements ErrorStateMatcher { + isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean { + const isSubmitted = form && form.submitted; + return !!(control && control.invalid && (control.dirty || control.touched || isSubmitted)); + } +} diff --git a/src/app/shared/components/button/button.component.html b/src/app/shared/components/button/button.component.html index c465c17c..85cb2d3a 100644 --- a/src/app/shared/components/button/button.component.html +++ b/src/app/shared/components/button/button.component.html @@ -4,6 +4,7 @@ [attr.name]="name" [attr.value]="value" [attr.type]="type" + [attr.form]="form" [class]="matButtonType" [disabled]="disabled" [autofocus]="autofocus" @@ -11,7 +12,10 @@ [matTooltipPosition]="tooltipDirection" [attr.ariaLabel]="ariaLabel" [color]="matColor" - [ngStyle]="{ 'font-size': fontSize }"> + [ngStyle]="{ 'font-size': fontSize }" + [attr.theme]="theme" + (click)="clickFunc()" + (blur)="blurFunc()">
+ [ngStyle]="{ 'font-size': fontSize }" + [attr.theme]="theme" + (click)="clickFunc()" + (blur)="blurFunc()">
+ [ngStyle]="{ 'font-size': fontSize }" + [attr.theme]="theme" + (click)="clickFunc()" + (blur)="blurFunc()">
+ [ngStyle]="{ 'font-size': fontSize }" + [attr.theme]="theme" + (click)="clickFunc()" + (blur)="blurFunc()">
+ [ngStyle]="{ 'font-size': fontSize }" + [attr.theme]="theme" + (click)="clickFunc()" + (blur)="blurFunc()">
+ [ngStyle]="{ 'font-size': fontSize }" + [attr.theme]="theme" + (click)="clickFunc()" + (blur)="blurFunc()">
+ [ngStyle]="{ 'font-size': fontSize }" + [attr.theme]="theme" + (click)="clickFunc()" + (blur)="blurFunc()">
{}; + @Input() blurFunc: Function = () => {}; public materialButtonType = MaterialButtonType; diff --git a/src/app/shared/components/editor/editor.component.html b/src/app/shared/components/editor/editor.component.html index 021f0e11..73d95c77 100644 --- a/src/app/shared/components/editor/editor.component.html +++ b/src/app/shared/components/editor/editor.component.html @@ -1,12 +1,65 @@ -
+ + {{ label }} +
*
+ + +
+ +
+ [toolbar]="toolbar" + [disabled]="disabled"> + [(ngModel)]="html" + (ngModelChange)="onInputChange($event); updateCharacterCount($event);" + [disabled]="disabled" + [placeholder]="this.translations.editor.placeholder | translate" + [attr.formControl]="control" + [attr.formControlName]="controlName" + [required]="required"> -
\ No newline at end of file +
+ {{ characterCount }} / {{ maxCharacters }} +
+
+ + + {{ hint }} + + + + {{ translations.input.error.minLength | translate }} {{ control.errors!['minlength'].requiredLength }}. + + + + {{ translations.input.error.maxLength | translate }} {{ control.errors!['maxlength'].requiredLength }}. + + + + {{ label }} {{ translations.input.error.required | translate }} + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/app/shared/components/editor/editor.component.scss b/src/app/shared/components/editor/editor.component.scss index 1bb9f615..a02cb1d1 100644 --- a/src/app/shared/components/editor/editor.component.scss +++ b/src/app/shared/components/editor/editor.component.scss @@ -1,3 +1,5 @@ +@import "../../../../assets/scss/partials/colors"; + :host { display: block; width: 100%; @@ -6,5 +8,138 @@ position: relative; max-width: 100%; max-height: 100%; + border-radius: 10px; + border: 2px solid $neutral-300; + + ngx-editor-menu { + ::ng-deep { + .NgxEditor__MenuBar { + border-top-left-radius: 10px; + border-top-right-radius: 10px; + border-bottom: 2px solid $neutral-300; + + ngx-toggle-command { + svg { + pointer-events: none; + } + } + + ngx-dropdown { + .NgxEditor__Dropdown--Item { + font-weight: bold; + } + .NgxEditor__Dropdown--Item:nth-child(1) { + font-size: 2em; + } + .NgxEditor__Dropdown--Item:nth-child(2) { + font-size: 1.5em; + } + .NgxEditor__Dropdown--Item:nth-child(3) { + font-size: 1.33em; + } + .NgxEditor__Dropdown--Item:nth-child(4) { + font-size: 1.17em; + } + .NgxEditor__Dropdown--Item:nth-child(5) { + font-size: 0.83em; + } + .NgxEditor__Dropdown--Item:nth-child(6) { + font-size: 0.67em; + } + } + } + } + } + + ngx-editor { + ::ng-deep { + .NgxEditor { + border-bottom-left-radius: 10px; + border-bottom-right-radius: 10px; + } + } + } + + .character-count { + text-align: right; + margin: 0 10px 4px 0; + color: $neutral-500; + pointer-events: none; + } + + .character-count.error { + color: #e92020; + font-weight: 500; + } + } + + .NgxEditor__Wrapper.focus { + border-color: $primary-1; + + ngx-editor-menu { + ::ng-deep { + .NgxEditor__MenuBar { + border-color: $primary-1; + } + } + } + } + + .NgxEditor__Wrapper.error { + border-color: $error-red; + + ngx-editor-menu { + ::ng-deep { + .NgxEditor__MenuBar { + border-color: $error-red; + } + } + } + } + + mat-label { + font-size: 18px; + font-weight: 600; + display: inline-block; + padding-bottom: 8px; + + .required-star { + display: inline-block; + color: $error-red; + } + + i { + margin-left: 5px; + cursor: pointer; + color: $primary-1; + } + } + + mat-label.disabled { + .required-star, i { + color: $neutral-300 !important; + } + } + + mat-hint { + font-size: smaller; + font-style: italic; + color: #757575; + padding: 0 16px; + display: block; + } + + mat-error { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: var(--mdc-typography-caption-font-family, var(--mdc-typography-font-family, Inter)); + font-size: var(--mdc-typography-caption-font-size, 12px); + line-height: var(--mdc-typography-caption-line-height, 20px); + font-weight: var(--mdc-typography-caption-font-weight, 400); + letter-spacing: var(--mdc-typography-caption-letter-spacing, 0.0333333333em); + -webkit-text-decoration: var(--mdc-typography-caption-text-decoration, inherit); + text-decoration: var(--mdc-typography-caption-text-decoration, inherit); + text-transform: var(--mdc-typography-caption-text-transform, none); + padding: 0 16px; } } \ No newline at end of file diff --git a/src/app/shared/components/editor/editor.component.ts b/src/app/shared/components/editor/editor.component.ts index 2cc4634f..27516ae7 100644 --- a/src/app/shared/components/editor/editor.component.ts +++ b/src/app/shared/components/editor/editor.component.ts @@ -1,17 +1,41 @@ -import { Component, OnDestroy, OnInit } from '@angular/core'; +import { AfterContentInit, AfterViewInit, Component, ElementRef, EventEmitter, Input, OnDestroy, OnInit, Output, ViewChild, forwardRef } from '@angular/core'; import { TranslateService } from '@ngx-translate/core'; import { Editor, NgxEditorService, Toolbar } from 'ngx-editor'; import { ngxEditorLocals } from '../../factories/editor-config.factory'; import { Subscription } from 'rxjs/internal/Subscription'; import { Translations } from 'src/app/core/services/translations.service'; +import { ControlValueAccessor, FormControl, NG_VALUE_ACCESSOR, Validators } from '@angular/forms'; +import { TooltipDirection } from '../../models/tooltip-direction'; // https://sibiraj-s.github.io/ngx-editor/en/introduction/ @Component({ selector: 'app-editor', templateUrl: './editor.component.html', - styleUrls: ['./editor.component.scss'] + styleUrls: ['./editor.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => EditorComponent), + multi: true, + }, + ], }) -export class EditorComponent implements OnInit, OnDestroy { +export class EditorComponent implements OnInit, OnDestroy, AfterViewInit, AfterContentInit, ControlValueAccessor { + @Input() html!: string; + @Input() disabled: boolean = false; + @Input() required: boolean = false; + @Input() label!: string; + @Input() hint!: string; + @Input() autofocus: boolean = false; + @Input() minCharacters: number = 0; + @Input() maxCharacters: number = Number.MAX_VALUE; + @Input() control!: FormControl; + @Input() controlName!: string; + + @Output() htmlChange = new EventEmitter(); + + @ViewChild('gccEditor') editorViewChild!: ElementRef; + editor: Editor; toolbar: Toolbar = [ ['bold', 'italic'], @@ -20,16 +44,37 @@ export class EditorComponent implements OnInit, OnDestroy { ['ordered_list', 'bullet_list'], [ { heading: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'] }], ['link', 'image'], - ['text_color', 'background_color'], ['align_left', 'align_center', 'align_right', 'align_justify'], ['horizontal_rule', 'format_clear'], - ] - html: string = ''; + ]; + + showHint: boolean = false; + hasFocus: boolean = false; + characterCount: number = 0; + Number = Number; + focusChange!: MutationObserver; + tooltipDirection = TooltipDirection; + hasRequiredValidator = false; + onChange = (_: any) => {}; + onTouched = () => {}; + private langChangeSub!: Subscription; + private keydownRef = this.handleKeyDown.bind(this); + private ariaRef = this.toggleAria.bind(this); + private dropdownRef = this.handleDropDown.bind(this); - constructor(private translateService: TranslateService, private ngxEditorService: NgxEditorService, public translations: Translations ) { - this.editor = new Editor(); + constructor( + public translations: Translations, + private translateService: TranslateService, + private ngxEditorService: NgxEditorService, + private elementRef: ElementRef + ) { + this.editor = new Editor({ + history: true, + keyboardShortcuts: true, + inputRules: true, + }); this.langChangeSub = this.translateService.onLangChange.subscribe(() => { this.onLangChange(); @@ -39,6 +84,52 @@ export class EditorComponent implements OnInit, OnDestroy { ngOnInit(): void { if (!this.editor) this.editor = new Editor(); + + if (!this.html) { + this.html = ''; + } else { + this.characterCount = this.html.length; + } + } + + // TODO: Handle min/max + ngAfterContentInit(): void { + if (this.control && this.control.hasValidator(Validators.required)) { + this.control.removeValidators([Validators.required]); + this.control.clearValidators(); + this.control.updateValueAndValidity(); + this.hasRequiredValidator = true; + } + } + + ngAfterViewInit() { + this.onLangChange(); + + this.focusChange = new MutationObserver((mutations: MutationRecord[]) => { + mutations.forEach((mutation: MutationRecord) => { + let classList = this.editorViewChild.nativeElement?.children[1]?.children[0]?.children[0]?.classList; + if (classList) { + this.hasFocus = Array.from(classList).includes('ProseMirror-focused') ? true : false; + + // TODO + if (!this.hasFocus && this.control && !this.control.hasValidator(Validators.required) && this.hasRequiredValidator) { + this.control.addValidators([Validators.required]); + this.control.updateValueAndValidity(); + this.updateCharacterCount(this.html); + } + } + }); + }); + + const node = this.editorViewChild.nativeElement?.children[1]?.children[0]?.children[0]; + if (node instanceof Node) { + this.focusChange.observe(node, { + attributeFilter: ['class'], + }); + } + + if (this.autofocus) + this.editor.commands.focus(); } ngOnDestroy(): void { @@ -47,13 +138,225 @@ export class EditorComponent implements OnInit, OnDestroy { if (this.langChangeSub) this.langChangeSub.unsubscribe(); + + if (this.focusChange) + this.focusChange.disconnect(); + } + + updateCharacterCount(content: string) { + this.characterCount = this.countCharactersInsideHTML(content); + + if (this.characterCount === 0) { + this.html = ''; + this.onInputChange(this.html); + } + + if (this.control) { + if (this.characterCount > this.maxCharacters){ + this.control.setErrors({ + maxlength: { + requiredLength: this.maxCharacters + } + }); + } else if (this.characterCount < this.minCharacters) { + this.control.setErrors({ + minlength: { + requiredLength: this.minCharacters + } + }); + } + this.control.markAsTouched(); + } } onLangChange(): void { this.ngxEditorService.config.locals = ngxEditorLocals(this.translateService, this.translations); + + setTimeout(() => { + this.addAccessibility( + '[title="' + this.translateService.instant(this.translations.editor.bold) + '"]', + this.translateService.instant(this.translations.editor.bold) + ); + this.addAccessibility( + '[title="' + this.translateService.instant(this.translations.editor.italic) + '"]', + this.translateService.instant(this.translations.editor.italic) + ); + this.addAccessibility( + '[title="' + this.translateService.instant(this.translations.editor.underline) + '"]', + this.translateService.instant(this.translations.editor.underline) + ); + this.addAccessibility( + '[title="' + this.translateService.instant(this.translations.editor.strike) + '"]', + this.translateService.instant(this.translations.editor.strike) + ); + this.addAccessibility( + '[title="' + this.translateService.instant(this.translations.editor.code) + '"]', + this.translateService.instant(this.translations.editor.code) + ); + this.addAccessibility( + '[title="' + this.translateService.instant(this.translations.editor.blockquote) + '"]', + this.translateService.instant(this.translations.editor.blockquote) + ); + this.addAccessibility( + '[title="' + this.translateService.instant(this.translations.editor.orderedlist) + '"]', + this.translateService.instant(this.translations.editor.orderedlist) + ); + this.addAccessibility( + '[title="' + this.translateService.instant(this.translations.editor.bulletlist) + '"]', + this.translateService.instant(this.translations.editor.bulletlist) + ); + this.addAccessibility( + '[title="' + this.translateService.instant(this.translations.editor.linkinsert) + '"]', + this.translateService.instant(this.translations.editor.linkinsert) + ); + this.addAccessibility( + '[title="' + this.translateService.instant(this.translations.editor.imginsert) + '"]', + this.translateService.instant(this.translations.editor.imginsert) + ); + this.addAccessibility( + '[title="' + this.translateService.instant(this.translations.editor.alignleft) + '"]', + this.translateService.instant(this.translations.editor.alignleft) + ); + this.addAccessibility( + '[title="' + this.translateService.instant(this.translations.editor.aligncenter) + '"]', + this.translateService.instant(this.translations.editor.aligncenter) + ); + this.addAccessibility( + '[title="' + this.translateService.instant(this.translations.editor.alignright) + '"]', + this.translateService.instant(this.translations.editor.alignright) + ); + this.addAccessibility( + '[title="' + this.translateService.instant(this.translations.editor.alignjustify) + '"]', + this.translateService.instant(this.translations.editor.alignjustify) + ); + this.addAccessibility( + '[title="' + this.translateService.instant(this.translations.editor.horizontalrule) + '"]', + this.translateService.instant(this.translations.editor.horizontalrule) + ); + this.addAccessibility( + '[title="' + this.translateService.instant(this.translations.editor.formatclear) + '"]', + this.translateService.instant(this.translations.editor.formatclear) + ); + this.addAccessibility( + '.NgxEditor__Dropdown .NgxEditor__Dropdown--Text', + this.translateService.instant(this.translations.editor.title) + ); + }, 500); + } + + addAccessibility(selector: string, ariaLabel: string): void { + let el: HTMLElement = this.elementRef.nativeElement.querySelectorAll(selector)[0]; + + if (el) { + el.removeEventListener('keydown', this.keydownRef); + el.removeEventListener('click', this.ariaRef); + + if (el.className == 'NgxEditor__Dropdown--Text') { + el.removeEventListener('keydown', this.dropdownRef); + el.removeEventListener('click', this.dropdownRef); + } + + el.setAttribute('tabIndex', '0'); + el.setAttribute('ariaLabel', el.classList.contains('NgxEditor__MenuItem--Active') ? ariaLabel + this.translateService.instant(this.translations.editor.enabled) : ariaLabel); + + el.addEventListener('keydown', this.keydownRef); + el.addEventListener('click', this.ariaRef); + + if (el.className == 'NgxEditor__Dropdown--Text') { + el.addEventListener('keydown', this.dropdownRef); + el.addEventListener('click', this.dropdownRef); + } + } else + console.warn(selector + " not found."); + } + + // TODO: Aria labels for drop down (enabled/disabled) + handleDropDown(event: Event): void { + if (event instanceof KeyboardEvent && (event.key != 'Enter' && event.key != ' ')) + return; + + setTimeout(() => { + if (event.target instanceof HTMLElement && + event.target.className.includes('NgxEditor__Dropdown--Selected') && + event.target.nextSibling) { + + event.target.nextSibling.childNodes.forEach((el) => { + if (el instanceof HTMLElement) + el.setAttribute('tabIndex', '0'); + el.addEventListener('keydown', (event) => { + if (event instanceof KeyboardEvent) + this.handleKeyDown(event); + }); + }); + } + }, 0); + } + + handleKeyDown(event: KeyboardEvent) { + if (event.key == 'Enter' || event.key == ' ') { + event.preventDefault(); + event.target?.dispatchEvent(new MouseEvent('mousedown')); + event.target?.dispatchEvent(new MouseEvent('mouseup')); + this.toggleAria(event); + } + } + + toggleAria(event: Event) { + setTimeout(() => { + if (event.target instanceof HTMLElement) { + if (event.target.classList.contains('NgxEditor__MenuItem--Active') || event.target.classList.contains('NgxEditor__Dropdown--Active')) { + event.target.setAttribute('ariaLabel', this.cleanAriaLable(event.target) + this.translateService.instant(this.translations.editor.enabled)); + } else { + event.target.setAttribute('ariaLabel', this.cleanAriaLable(event.target)); + } + } + }, 250); + } + + cleanAriaLable(el: HTMLElement): string { + let ariaLabel = el.getAttribute('ariaLabel'); + if (ariaLabel) { + return ariaLabel.replaceAll(this.translateService.instant(this.translations.editor.enabled), ''); + } + return ''; + } + + countCharactersInsideHTML(html: string): number { + let count = 0; + let insideTag = false; + + if (html) { + for (let i = 0; i < html.length; i++) { + if (html[i] === '<') { + insideTag = true; + } else if (html[i] === '>') { + insideTag = false; + } else if (!insideTag) { + count++; + } + } + } + + return count; + } + + writeValue(html: string): void { + if (html !== undefined) { + this.html = html; + } + } + + registerOnChange(fn: any): void { + this.onChange = fn; + } + + registerOnTouched(fn: any): void { + this.onTouched = fn; } - placeholderText(): string { - return this.translateService.instant(this.translations.editor.placeholder) + onInputChange(value: string) { + this.html = value; + this.onChange(this.html); + this.htmlChange.emit(this.html); } } diff --git a/src/app/shared/components/editor/menu/editor-menu/editor-menu.component.html b/src/app/shared/components/editor/menu/editor-menu/editor-menu.component.html new file mode 100644 index 00000000..f523a01a --- /dev/null +++ b/src/app/shared/components/editor/menu/editor-menu/editor-menu.component.html @@ -0,0 +1,7 @@ +
+
+ CodeMirror +
\ No newline at end of file diff --git a/src/app/shared/components/editor/menu/editor-menu/editor-menu.component.scss b/src/app/shared/components/editor/menu/editor-menu/editor-menu.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/src/app/shared/components/editor/menu/editor-menu/editor-menu.component.ts b/src/app/shared/components/editor/menu/editor-menu/editor-menu.component.ts new file mode 100644 index 00000000..59d441c4 --- /dev/null +++ b/src/app/shared/components/editor/menu/editor-menu/editor-menu.component.ts @@ -0,0 +1,59 @@ +import { Component, Input, OnInit } from '@angular/core'; +import { setBlockType } from 'prosemirror-commands'; +import { EditorState, Plugin, PluginKey, Transaction } from 'prosemirror-state'; +import { EditorView } from 'prosemirror-view'; + +import { Editor } from 'ngx-editor'; +import { isNodeActive } from 'ngx-editor/helpers'; + +@Component({ + selector: 'app-editor-menu', + templateUrl: './editor-menu.component.html', + styleUrls: ['./editor-menu.component.scss'] +}) +export class EditorMenuComponent { + constructor() {} + + @Input() editor!: Editor; + @Input() disabled: boolean = false; + isActive = false; + isDisabled = false; + + onClick(e: MouseEvent): void { + e.preventDefault(); + const { state, dispatch } = this.editor.view; + this.execute(state, dispatch); + console.log(state); + console.log(dispatch); + } + + execute(state: EditorState, dispatch?: (tr: Transaction) => void): boolean { + const { schema } = state; + if (this.isActive) { + return setBlockType(schema.nodes['paragraph'])(state, dispatch); + } + + return setBlockType(schema.nodes['bold'])(state, dispatch); + } + + update = (view: EditorView) => { + const { state } = view; + const { schema } = state; + this.isActive = isNodeActive(state, schema.nodes['bold']); + this.disabled = !this.execute(state, undefined); // returns true if executable + }; + + ngOnInit(): void { + const plugin = new Plugin({ + key: new PluginKey(`custom-menu-codemirror`), + view: () => { + return { + update: this.update, + }; + }, + }); + + this.editor.registerPlugin(plugin); + } + +} diff --git a/src/app/shared/components/event-form/event-form.component.html b/src/app/shared/components/event-form/event-form.component.html new file mode 100644 index 00000000..b5abfd27 --- /dev/null +++ b/src/app/shared/components/event-form/event-form.component.html @@ -0,0 +1,187 @@ +
+ + {{ translations.forms.event.type_of_event | translate }} +
*
+
+ + + + {{ translations.forms.event.in_person | translate }} + + + {{ translations.forms.event.hybrid | translate }} + + + {{ translations.forms.event.online | translate }} + + + + + + + + + + + {{ translations.forms.event.event_language | translate }} +
*
+
+ + + + {{ translations.forms.event.english | translate }} + + + {{ translations.forms.event.french | translate }} + + + {{ translations.forms.event.bilingual | translate }} + + + + + + + + + + + + + + {{ translations.forms.event.duration | translate }} +
*
+
+ + + + {{ translations.forms.event.single_day | translate }} + + + {{ translations.forms.event.multi_day | translate }} + + + +
+
+ + + + + + +
+ +
+ + + + + +
+
+ + + +
diff --git a/src/app/shared/components/event-form/event-form.component.scss b/src/app/shared/components/event-form/event-form.component.scss new file mode 100644 index 00000000..bd463aa5 --- /dev/null +++ b/src/app/shared/components/event-form/event-form.component.scss @@ -0,0 +1,28 @@ +@import "../../../../assets/scss/partials/colors"; + +mat-label { + font-size: 18px; + font-weight: 600; + display: inline-block; + padding-bottom: 8px; + + .required-star { + display: inline-block; + color: $error-red; + } +} + +mat-radio-group { + display: block; + margin-bottom: 16px; +} + +app-editor { + margin-bottom: 16px; +} + +.gcc-date-time-picker { + display: flex; + align-items: flex-end; + gap: 50px; +} \ No newline at end of file diff --git a/src/app/shared/components/event-form/event-form.component.spec.ts b/src/app/shared/components/event-form/event-form.component.spec.ts new file mode 100644 index 00000000..cf4d32bb --- /dev/null +++ b/src/app/shared/components/event-form/event-form.component.spec.ts @@ -0,0 +1,45 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { EventFormComponent } from './event-form.component'; +import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core'; +import { HttpClient, HttpClientModule } from '@angular/common/http'; +import { TypescriptLoader } from 'src/app/core/helpers/typescript-loader'; +import { RouterTestingModule } from '@angular/router/testing'; + +describe('EventFormComponent', () => { + let component: EventFormComponent; + let translateService: TranslateService; + let fixture: ComponentFixture; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [EventFormComponent], + imports: [ + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), + deps: [ HttpClient ] + } + }), + HttpClientModule, + RouterTestingModule + ], + providers: [ TranslateService, HttpClient ] + }); + fixture = TestBed.createComponent(EventFormComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + beforeEach(() => { + translateService = TestBed.inject(TranslateService); + fixture = TestBed.createComponent(EventFormComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/components/event-form/event-form.component.ts b/src/app/shared/components/event-form/event-form.component.ts new file mode 100644 index 00000000..f4643010 --- /dev/null +++ b/src/app/shared/components/event-form/event-form.component.ts @@ -0,0 +1,153 @@ +import { Component, Input, OnDestroy, OnInit } from '@angular/core'; +import { FormControl, FormGroup, FormGroupDirective, NgForm, Validators } from '@angular/forms'; +import { ErrorStateMatcher } from '@angular/material/core'; +import { TranslateService } from '@ngx-translate/core'; +import { Translations } from 'src/app/core/services/translations.service'; + +@Component({ + selector: 'app-event-form', + templateUrl: './event-form.component.html', + styleUrls: ['./event-form.component.scss'] +}) +export class EventFormComponent implements OnInit, OnDestroy { + @Input() form: FormGroup = new FormGroup({}); + @Input() model: IEventForm = { + eventType: EventType.Hybrid, + eventOrganizerName: '', + eventName: '', + eventLanguage: EventLanguage.Bilingual, + eventDescription: '', + eventLocation: '', + eventOnlinePlatform: '', + eventDuration: EventDuration.Single, + eventStartDate: '', + eventStartTime: '12:00', + eventEndDate: '', + eventEndTime: '13:00' + } + @Input() disabled: boolean = false; + + eventType = EventType; + eventLanguage = EventLanguage; + eventDuration = EventDuration; + errorStateMatcher = new MyErrorStateMatcher(); + + constructor(public translations: Translations) { + + } + + ngOnInit(): void { + for (const [key, value] of Object.entries(this.model)) { + if (!this.form.controls[key]) + this.form.addControl(key, new FormControl(value, [Validators.required])); + else + console.warn('Duplicate FormControl detected.'); + } + } + + ngAfterContentInit(): void { + this.onEventTypeChange(); + this.onEventDurationChange(); + } + + ngOnDestroy(): void { + this.form.reset(); + } + + onEventTypeChange(): void { + switch (this.model.eventType) { + case EventType.InPerson: + this.form.controls['eventOnlinePlatform'].removeValidators(Validators.required); + this.form.controls['eventOnlinePlatform'].clearValidators(); + this.form.controls['eventOnlinePlatform'].updateValueAndValidity(); + + this.form.controls['eventLocation'].addValidators(Validators.required); + this.form.controls['eventLocation'].clearValidators(); + this.form.controls['eventLocation'].updateValueAndValidity() + break; + + case EventType.Online: + this.form.controls['eventLocation'].removeValidators(Validators.required); + this.form.controls['eventLocation'].clearValidators(); + this.form.controls['eventLocation'].updateValueAndValidity(); + + this.form.controls['eventOnlinePlatform'].addValidators(Validators.required); + this.form.controls['eventOnlinePlatform'].clearValidators(); + this.form.controls['eventOnlinePlatform'].updateValueAndValidity(); + break; + + case EventType.Hybrid: + this.form.controls['eventLocation'].addValidators(Validators.required); + this.form.controls['eventLocation'].clearValidators(); + this.form.controls['eventLocation'].updateValueAndValidity() + + this.form.controls['eventOnlinePlatform'].addValidators(Validators.required); + this.form.controls['eventOnlinePlatform'].clearValidators(); + this.form.controls['eventOnlinePlatform'].updateValueAndValidity(); + break; + } + } + + onEventDurationChange(): void { + switch (this.model.eventDuration) { + case EventDuration.Single: + this.form.controls['eventEndDate'].removeValidators(Validators.required); + this.form.controls['eventEndDate'].clearValidators(); + this.form.controls['eventEndDate'].updateValueAndValidity(); + + this.form.controls['eventEndTime'].removeValidators(Validators.required); + this.form.controls['eventEndTime'].clearValidators(); + this.form.controls['eventEndTime'].updateValueAndValidity(); + break; + + case EventDuration.Multi: + this.form.controls['eventEndDate'].addValidators(Validators.required); + this.form.controls['eventEndDate'].clearValidators(); + this.form.controls['eventEndDate'].updateValueAndValidity(); + + this.form.controls['eventEndTime'].addValidators(Validators.required); + this.form.controls['eventEndTime'].clearValidators(); + this.form.controls['eventEndTime'].updateValueAndValidity(); + break; + } + } +} + +class MyErrorStateMatcher implements ErrorStateMatcher { + isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean { + const isSubmitted = form && form.submitted; + return !!(control && control.invalid && (control.dirty || control.touched || isSubmitted)); + } +} + +export interface IEventForm { + eventType: EventType | string, + eventOrganizerName: string, + eventName: string, + eventLanguage: EventLanguage | string, + eventDescription: string, + eventLocation: string, + eventOnlinePlatform: string, + eventDuration: EventDuration | string, + eventStartDate: string, + eventStartTime: string, + eventEndDate: string + eventEndTime: string +} + +enum EventType { + InPerson = "In Person", + Hybrid = "Hybrid", + Online = "Online" +} + +enum EventDuration { + Single = "Single", + Multi = "Multi" +} + +enum EventLanguage { + English = "English", + French = "French", + Bilingual = "Bilingual" +} diff --git a/src/app/shared/components/header/header.component.ts b/src/app/shared/components/header/header.component.ts index 273c5977..b3a8accf 100644 --- a/src/app/shared/components/header/header.component.ts +++ b/src/app/shared/components/header/header.component.ts @@ -3,7 +3,7 @@ import { CoreRoutes } from 'src/app/core/constants/routes.constants'; import { TranslateService } from '@ngx-translate/core'; import { Translations } from 'src/app/core/services/translations.service'; import { MaterialButtonType } from '../../models/material-button-type'; -import { Person } from 'src/app/core/models/person'; +import { Person } from 'src/app/core/models/person.model'; import { PeopleService } from 'src/app/core/services/people.service'; @Component({ diff --git a/src/app/shared/components/input/input.component.html b/src/app/shared/components/input/input.component.html index 652ffe23..769753d7 100644 --- a/src/app/shared/components/input/input.component.html +++ b/src/app/shared/components/input/input.component.html @@ -1,5 +1,5 @@
- + {{ label }}
*
+ + - + {{ translations.input.error.email | translate }} - + + {{ translations.input.error.minLength | translate }} {{ control.errors!['minlength'].requiredLength }}. + + + + {{ translations.input.error.maxLength | translate }} {{ control.errors!['maxlength'].requiredLength }}. + + + {{ label }} {{ translations.input.error.required | translate }} diff --git a/src/app/shared/components/input/input.component.scss b/src/app/shared/components/input/input.component.scss index dee2aa30..ad13cd34 100644 --- a/src/app/shared/components/input/input.component.scss +++ b/src/app/shared/components/input/input.component.scss @@ -39,6 +39,17 @@ mat-form-field { width: calc(100% - 65px); } + input.icon { + padding-left: 25px !important; + } + + .gcc-input-icon { + position: absolute; + left: 0; + margin-top: 12px; + color: #1E1E23; + } + app-button { display: inline-flex; @@ -106,4 +117,19 @@ mat-hint { .mat-mdc-form-field-infix { min-height: unset; } + + .mdc-text-field--invalid { + .mdc-notched-outline__leading, .mdc-notched-outline__trailing { + border-color: $error-red !important; + } + } + + input:-webkit-autofill, + input:-webkit-autofill:hover, + input:-webkit-autofill:focus, + input:-webkit-autofill:active{ + -webkit-background-clip: text; + -webkit-text-fill-color: #000; + box-shadow: inset 0 0 20px 20px white; + } } \ No newline at end of file diff --git a/src/app/shared/components/input/input.component.ts b/src/app/shared/components/input/input.component.ts index f5a3dbcb..f49592e8 100644 --- a/src/app/shared/components/input/input.component.ts +++ b/src/app/shared/components/input/input.component.ts @@ -1,47 +1,83 @@ -import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; +import { Component, EventEmitter, Input, Output, forwardRef } from '@angular/core'; import { InputType } from '../../models/input-type'; -import { FormControl } from '@angular/forms'; +import { ControlValueAccessor, FormControl, NG_VALUE_ACCESSOR } from '@angular/forms'; import { MaterialButtonType } from '../../models/material-button-type'; import { Translations } from 'src/app/core/services/translations.service'; import { TranslateService } from '@ngx-translate/core'; import { TooltipDirection } from '../../models/tooltip-direction'; +import { ErrorStateMatcher } from '@angular/material/core'; @Component({ selector: 'app-input', templateUrl: './input.component.html', styleUrls: ['./input.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => InputComponent), + multi: true, + }, + ], }) -export class InputComponent { +export class InputComponent implements ControlValueAccessor { - @Input() inputId: string = ''; - @Input() name: string = ''; + @Input() inputId!: string; + @Input({required:true}) name!: string; - @Input() type: InputType = InputType.Text; - @Input() formControl!: FormControl; + @Input() type: InputType | string = InputType.Text; + @Input() control!: FormControl; + @Input() controlName!: string; + @Input() errorMatcher!: ErrorStateMatcher; - @Input() value: string = ''; - @Input() label!: string; + @Input({required:true}) value!: string; + @Input({required:true}) label!: string; @Input() placeholder!: string; @Input() hint!: string; @Input() errorMessage!: string; - @Input() maxLength: number = 524288; - @Input() minLength: number = 0; + @Input() maxLength!: number; + @Input() minLength!: number; @Input() pattern!: string; + @Input() icon!: string; @Input() required: boolean = false; @Input() disabled: boolean = false; @Input() readonly: boolean = false; @Input() autofocus: boolean = false; + @Output() valueChange = new EventEmitter(); + materialButtonType = MaterialButtonType; tooltipDirection = TooltipDirection; inputType = InputType; showPassword = false; showHint = false; - constructor(public translations: Translations) - { } + onChange = (_: any) => {}; + onTouched = () => {}; + + constructor(public translations: Translations) { + + } + + writeValue(value: any): void { + if (value !== undefined) { + this.value = value; + } + } + + registerOnChange(fn: any): void { + this.onChange = fn; + } + + registerOnTouched(fn: any): void { + this.onTouched = fn; + } + + onInputChange(value: string) { + this.value = value; + this.onChange(this.value); + this.valueChange.emit(this.value); + } toggleShowPassword(): void { this.showPassword = !this.showPassword; diff --git a/src/app/shared/components/poll-form/poll-form.component.html b/src/app/shared/components/poll-form/poll-form.component.html new file mode 100644 index 00000000..97b3dbb3 --- /dev/null +++ b/src/app/shared/components/poll-form/poll-form.component.html @@ -0,0 +1,43 @@ +
+ + + +
+ + + + + +
+ +
+ + + {{ translations.forms.poll.option_add | translate }} + +
+
+ diff --git a/src/app/shared/components/poll-form/poll-form.component.scss b/src/app/shared/components/poll-form/poll-form.component.scss new file mode 100644 index 00000000..3ed60e49 --- /dev/null +++ b/src/app/shared/components/poll-form/poll-form.component.scss @@ -0,0 +1,37 @@ +:host { + app-editor { + padding-bottom: 30px; + } + + .option-wrapper { + display: flex; + flex-direction: row; + align-items: center; + + app-button { + flex-basis: 0; + padding-left: 10px + } + + app-input { + flex-basis: 100%; + } + } + + .form-actions { + padding: 15px 0 30px 0; + + app-button { + display: table; + + ::ng-deep { + .gcc-button-inner { + letter-spacing: 1px; + } + } + } + app-button:not(:first-child) { + padding-top: 30px + } + } +} \ No newline at end of file diff --git a/src/app/shared/components/poll-form/poll-form.component.spec.ts b/src/app/shared/components/poll-form/poll-form.component.spec.ts new file mode 100644 index 00000000..4830ddda --- /dev/null +++ b/src/app/shared/components/poll-form/poll-form.component.spec.ts @@ -0,0 +1,45 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { PollFormComponent } from './poll-form.component'; +import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core'; +import { HttpClient, HttpClientModule } from '@angular/common/http'; +import { TypescriptLoader } from 'src/app/core/helpers/typescript-loader'; +import { RouterTestingModule } from '@angular/router/testing'; + +describe('PollFormComponent', () => { + let component: PollFormComponent; + let translateService: TranslateService; + let fixture: ComponentFixture; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [PollFormComponent], + imports: [ + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), + deps: [ HttpClient ] + } + }), + HttpClientModule, + RouterTestingModule + ], + providers: [ TranslateService, HttpClient ] + }); + fixture = TestBed.createComponent(PollFormComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + beforeEach(() => { + translateService = TestBed.inject(TranslateService); + fixture = TestBed.createComponent(PollFormComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/components/poll-form/poll-form.component.ts b/src/app/shared/components/poll-form/poll-form.component.ts new file mode 100644 index 00000000..6e675948 --- /dev/null +++ b/src/app/shared/components/poll-form/poll-form.component.ts @@ -0,0 +1,95 @@ +import { Component, Input, OnDestroy, OnInit } from '@angular/core'; +import { TooltipDirection } from '../../models/tooltip-direction'; +import { FormControl, FormGroup, FormGroupDirective, NgForm, Validators } from '@angular/forms'; +import { ErrorStateMatcher } from '@angular/material/core'; +import { TranslateService } from '@ngx-translate/core'; +import { Translations } from 'src/app/core/services/translations.service'; + +@Component({ + selector: 'app-poll-form', + templateUrl: './poll-form.component.html', + styleUrls: ['./poll-form.component.scss'] +}) +export class PollFormComponent implements OnInit, OnDestroy { + @Input() form: FormGroup = new FormGroup({}); + @Input() model: IPollForm = { + description: '', + options: [ + { id: 0, value: '' }, + { id: 1, value: '' } + ], + photo: '' + } + @Input() disabled: boolean = false; + + maxOptions: number = 10; + minLength: number = 1; + maxLength: number = 240; + tooltipDirection = TooltipDirection; + errorStateMatcher = new MyErrorStateMatcher(); + + constructor(public translations: Translations) { + + } + + ngOnInit(): void { + this.form.addControl( + 'description', + new FormControl( + this.model.description, + [ + Validators.required, + //Validators.minLength(this.minLength), + Validators.maxLength(this.maxLength), + ] + ) + ); + + for (let i = 0; i < this.model.options.length; i++) { + this.form.addControl( + 'option' + i, + new FormControl(this.model.options[i].value, [Validators.required] + )); + } + } + + ngOnDestroy(): void { + this.form.reset(); + } + + addOption(): void { + if (this.model.options.length < this.maxOptions) { + this.model.options.push({id: this.model.options.length, value: ''}); + this.form.addControl( + 'option' + (this.model.options.length - 1), + new FormControl(this.model.options[this.model.options.length - 1].value, [Validators.required]) + ); + } + } + + removeOption(index: number): void { + if (this.model.options.length <= 2) + return; + + this.form.removeControl('option' + index); + this.model.options.splice(index, 1); + } +} + +class MyErrorStateMatcher implements ErrorStateMatcher { + isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean { + const isSubmitted = form && form.submitted; + return !!(control && control.invalid && (control.dirty || control.touched || isSubmitted)); + } +} + +export interface IPollForm { + description: string; + options: IPollOption[]; + photo: string; +} + +export interface IPollOption { + id: number, + value: string +} \ No newline at end of file diff --git a/src/app/shared/components/post-form/post-form.component.html b/src/app/shared/components/post-form/post-form.component.html new file mode 100644 index 00000000..df97db16 --- /dev/null +++ b/src/app/shared/components/post-form/post-form.component.html @@ -0,0 +1,12 @@ +
+ + +
\ No newline at end of file diff --git a/src/app/shared/components/post-form/post-form.component.scss b/src/app/shared/components/post-form/post-form.component.scss new file mode 100644 index 00000000..9fc2cf1e --- /dev/null +++ b/src/app/shared/components/post-form/post-form.component.scss @@ -0,0 +1,16 @@ +:host { + app-button { + ::ng-deep { + button { + margin: 30px 0; + } + .gcc-button-inner { + letter-spacing: 1px; + } + } + } + + app-editor { + padding-bottom: 16px; + } +} \ No newline at end of file diff --git a/src/app/shared/components/post-form/post-form.component.spec.ts b/src/app/shared/components/post-form/post-form.component.spec.ts new file mode 100644 index 00000000..b5830457 --- /dev/null +++ b/src/app/shared/components/post-form/post-form.component.spec.ts @@ -0,0 +1,45 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { PostFormComponent } from './post-form.component'; +import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core'; +import { HttpClient, HttpClientModule } from '@angular/common/http'; +import { TypescriptLoader } from 'src/app/core/helpers/typescript-loader'; +import { RouterTestingModule } from '@angular/router/testing'; + +describe('PostFormComponent', () => { + let component: PostFormComponent; + let translateService: TranslateService; + let fixture: ComponentFixture; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [PostFormComponent], + imports: [ + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), + deps: [ HttpClient ] + } + }), + HttpClientModule, + RouterTestingModule + ], + providers: [ TranslateService, HttpClient ] + }); + fixture = TestBed.createComponent(PostFormComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + beforeEach(() => { + translateService = TestBed.inject(TranslateService); + fixture = TestBed.createComponent(PostFormComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/components/post-form/post-form.component.ts b/src/app/shared/components/post-form/post-form.component.ts new file mode 100644 index 00000000..9c5f85dd --- /dev/null +++ b/src/app/shared/components/post-form/post-form.component.ts @@ -0,0 +1,46 @@ +import { Component, Input, OnDestroy, OnInit } from '@angular/core'; +import { FormControl, FormGroup, Validators } from '@angular/forms'; +import { TranslateService } from '@ngx-translate/core'; +import { Translations } from 'src/app/core/services/translations.service'; + +@Component({ + selector: 'app-post-form', + templateUrl: './post-form.component.html', + styleUrls: ['./post-form.component.scss'] +}) +export class PostFormComponent implements OnInit, OnDestroy { + @Input() form: FormGroup = new FormGroup({}); + @Input() model: IPostForm = { + description: '' + } + @Input() disabled: boolean = false; + + minLength: number = 3; + maxLength: number = 240; + + constructor(public translations: Translations) { + + } + + ngOnInit(): void { + this.form.addControl( + 'description', + new FormControl( + this.model.description, + [ + Validators.required, + Validators.minLength(this.minLength), + Validators.maxLength(this.maxLength), + ] + ) + ); + } + + ngOnDestroy(): void { + this.form.reset(); + } +} + +export interface IPostForm { + description: string; +} diff --git a/src/app/shared/components/profile-pic/profile-pic.component.ts b/src/app/shared/components/profile-pic/profile-pic.component.ts index 19bb8844..6e30626f 100644 --- a/src/app/shared/components/profile-pic/profile-pic.component.ts +++ b/src/app/shared/components/profile-pic/profile-pic.component.ts @@ -1,5 +1,5 @@ import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; -import { Person } from 'src/app/core/models/person'; +import { Person } from 'src/app/core/models/person.model'; import { Translations } from 'src/app/core/services/translations.service'; import { TranslateService } from '@ngx-translate/core'; import { Router } from '@angular/router'; diff --git a/src/app/shared/models/input-type.ts b/src/app/shared/models/input-type.ts index 60c8253d..2b5c5079 100644 --- a/src/app/shared/models/input-type.ts +++ b/src/app/shared/models/input-type.ts @@ -2,5 +2,7 @@ export enum InputType { Text = 'text', Number = 'number', Password = 'password', - Email = 'email' + Email = 'email', + Time = 'time', + Date = 'date' } \ No newline at end of file diff --git a/src/app/shared/models/theme.ts b/src/app/shared/models/theme.ts new file mode 100644 index 00000000..39aa4259 --- /dev/null +++ b/src/app/shared/models/theme.ts @@ -0,0 +1,7 @@ +export enum Theme { + Primary1 = 'primary-1', + Primary2 = 'primary-2', + Secondary1 = 'secondary-1', + Secondary2 = 'secondary-2', + Error = 'error' +} \ No newline at end of file diff --git a/src/app/shared/pipes/truncate-file-name.pipe.spec.ts b/src/app/shared/pipes/truncate-file-name.pipe.spec.ts new file mode 100644 index 00000000..f998c713 --- /dev/null +++ b/src/app/shared/pipes/truncate-file-name.pipe.spec.ts @@ -0,0 +1,8 @@ +import { TruncateFileNamePipe } from './truncate-file-name.pipe'; + +describe('TruncateFileNamePipe', () => { + it('create an instance', () => { + const pipe = new TruncateFileNamePipe(); + expect(pipe).toBeTruthy(); + }); +}); diff --git a/src/app/shared/pipes/truncate-file-name.pipe.ts b/src/app/shared/pipes/truncate-file-name.pipe.ts new file mode 100644 index 00000000..9ba826a2 --- /dev/null +++ b/src/app/shared/pipes/truncate-file-name.pipe.ts @@ -0,0 +1,21 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +@Pipe({ + name: 'truncateFileName' +}) +export class TruncateFileNamePipe implements PipeTransform { + transform(fileName: string, maxLength: number): string { + const extension = fileName.split('.').pop(); + + if (extension) { + if (fileName.length - extension.length <= maxLength) { + return fileName; + } + const truncatedName = fileName.substring(0, maxLength); + + return `${truncatedName}...${extension}`; + } + + return fileName; + } +} diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index 6d931cd6..a20307db 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -5,7 +5,7 @@ import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-transla import { AppModule } from '../app.module'; import { HttpClient } from '@angular/common/http'; -import { FormsModule } from '@angular/forms'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { NotFoundComponent } from './components/not-found/not-found.component'; import { UnauthorizedComponent } from './components/unauthorized/unauthorized.component'; import { ForbiddenComponent } from './components/forbidden/forbidden.component'; @@ -16,7 +16,6 @@ import { TypescriptLoader } from '../core/helpers/typescript-loader'; import { Translations } from '../core/services/translations.service'; import { ButtonComponent } from './components/button/button.component'; - import { MatButtonModule} from '@angular/material/button'; import { MatIconModule } from '@angular/material/icon'; import { MatTooltipModule } from '@angular/material/tooltip'; @@ -34,6 +33,16 @@ import { InfiniteScrollModule } from 'ngx-infinite-scroll'; import { ProfilePicComponent } from './components/profile-pic/profile-pic.component'; import { CalendarButtonComponent } from './components/calendar-button/calendar-button.component'; import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MAT_RADIO_DEFAULT_OPTIONS, MatRadioModule } from '@angular/material/radio'; +import { MatDatepickerModule } from '@angular/material/datepicker'; +import { MatAutocompleteModule } from '@angular/material/autocomplete'; +import { EditorMenuComponent } from './components/editor/menu/editor-menu/editor-menu.component'; +import { PostFormComponent } from './components/post-form/post-form.component'; +import { BlogFormComponent } from './components/blog-form/blog-form.component'; +import { EventFormComponent } from './components/event-form/event-form.component'; +import { PollFormComponent } from './components/poll-form/poll-form.component'; + +import { TruncateFileNamePipe } from './pipes/truncate-file-name.pipe'; @NgModule({ @@ -51,10 +60,17 @@ import { MatCheckboxModule } from '@angular/material/checkbox'; BannerComponent, ProfilePicComponent, CalendarButtonComponent, + EditorMenuComponent, + PostFormComponent, + BlogFormComponent, + EventFormComponent, + PollFormComponent, + TruncateFileNamePipe ], imports: [ CommonModule, FormsModule, + ReactiveFormsModule, RouterModule, TranslateModule.forChild({ loader: { @@ -65,7 +81,9 @@ import { MatCheckboxModule } from '@angular/material/checkbox'; isolate: false, extend: true }), - NgxEditorModule.forChild(), + NgxEditorModule.forChild({ + + }), MatButtonModule, MatIconModule, MatTooltipModule, @@ -73,8 +91,11 @@ import { MatCheckboxModule } from '@angular/material/checkbox'; MatFormFieldModule, MatInputModule, MatCheckboxModule, + MatRadioModule, + MatDatepickerModule, + MatAutocompleteModule, NgxSkeletonLoaderModule, - InfiniteScrollModule + InfiniteScrollModule, ], exports: [ TranslateModule, @@ -91,7 +112,12 @@ import { MatCheckboxModule } from '@angular/material/checkbox'; InfiniteScrollModule, ProfilePicComponent, CalendarButtonComponent, - MatCheckboxModule + MatCheckboxModule, + PostFormComponent, + BlogFormComponent, + EventFormComponent, + PollFormComponent, + TruncateFileNamePipe ], providers: [ { @@ -101,10 +127,12 @@ import { MatCheckboxModule } from '@angular/material/checkbox'; }, { provide: MAT_FORM_FIELD_DEFAULT_OPTIONS, - useValue: { - appearance: 'outline' - } - } + useValue: { appearance: 'outline' } + }, + { + provide: MAT_RADIO_DEFAULT_OPTIONS, + useValue: { color: 'primary' }, + } ] }) export class SharedModule { diff --git a/src/assets/i18n/translations.en.ts b/src/assets/i18n/translations.en.ts index ff16bbce..6fd0ba59 100644 --- a/src/assets/i18n/translations.en.ts +++ b/src/assets/i18n/translations.en.ts @@ -54,6 +54,8 @@ export default { "messages": "Messages", "missions": "Careers", "newsfeed": "Newsfeed", + "poll": "Poll", + "post": "Post", "profile": "Profile", "search": "Search", "settings": "Settings", @@ -173,7 +175,8 @@ export default { "title": "Title", "remove": "Remove", "horizontalrule": "Horizontal Rule", - "formatclear": "Clear Formatting" + "formatclear": "Clear Formatting", + "enabled": " enabled" }, "input": { "hint": { @@ -198,7 +201,9 @@ export default { }, "error": { "required": "is required.", - "email": "Please enter a valid email." + "email": "Please enter a valid email.", + "minLength": "Minimum character length is ", + "maxLength": "Maximum character length is " } }, "banner": { @@ -292,5 +297,50 @@ export default { "aria_on": "Click to bookmark this event.", "aria_off": "Click to remove this event from your bookmarks." } + }, + "forms": { + "placeholder": "Type here", + "save": "Save", + "create": "Create", + "post": { + "post": "Post" + }, + "blog": { + "name_of_blog": "Name of Blog", + "name_of_publisher": "Name of publisher", + "upload_cover_photo": "Upload a cover photo", + "cover_photo_alt": "Cover photo alt text", + "body": "Body" + }, + "event": { + "type_of_event": "Type of event", + "type_of_event_aria" : "Select an event type", + "in_person": "In-person", + "hybrid": "Hybrid", + "online": "Online", + "name_of_organizer": "Name of organizer", + "name_of_event": "Name of event", + "event_language": "Language of event", + "event_language_aria": "Select a language for your event", + "english": "English", + "french": "French", + "bilingual": "Bilingual", + "body": "Body", + "body_hint": "Start writing.", + "location": "Location", + "platform": "Online streaming platform", + "duration": "Event duration", + "duration_aria": "Select a duration for your event", + "single_day": "One day event", + "multi_day": "Multi-day event", + "start_date": "Start date", + "end_date": "End date" + }, + "poll": { + "description": "Poll description / question", + "option": "Option", + "option_add": "Add an option", + "option_remove": "Remove option" + } } }; \ No newline at end of file diff --git a/src/assets/i18n/translations.fr.ts b/src/assets/i18n/translations.fr.ts index db9fc729..7acc33f0 100644 --- a/src/assets/i18n/translations.fr.ts +++ b/src/assets/i18n/translations.fr.ts @@ -54,6 +54,8 @@ const fr: typeof import('./translations.en').default = { "messages": "Messages", "missions": "Carrières", "newsfeed": "Fil d'actualité", + "poll": "Sondage", + "post": "Poste", "profile": "Profil", "search": "Chercher", "settings": "Réglages", @@ -145,8 +147,8 @@ const fr: typeof import('./translations.en').default = { "bold": "Gras", "italic": "Italique", "code": "Code", - "underline": "Underline", - "strike": "Souligner", + "underline": "Souligner", + "strike": "Grève", "blockquote": "Citation en bloc", "bulletlist": "Liste à puces", "orderedlist": "Liste ordonnée", @@ -174,7 +176,8 @@ const fr: typeof import('./translations.en').default = { "title": "Titre", "remove": "Retirer", "horizontalrule": "La règle horizontale", - "formatclear": "Supprimer le formattage" + "formatclear": "Supprimer le formattage", + "enabled": " activé" }, "input": { "hint": { @@ -199,7 +202,9 @@ const fr: typeof import('./translations.en').default = { }, "error": { "required": "est requis.", - "email": "Veuillez saisir une adresse e-mail valide." + "email": "Veuillez saisir une adresse e-mail valide.", + "minLength": "La longueur minimale des caractères est ", + "maxLength": "La longueur maximale des caractères est " } }, "banner": { @@ -293,6 +298,51 @@ const fr: typeof import('./translations.en').default = { "aria_on": "Cliquez pour ajouter cet événement à vos favoris.", "aria_off": "Cliquez pour supprimer cet événement de vos favoris." } + }, + "forms": { + "placeholder": "Écrivez ici", + "save": "Sauvegarder", + "create": "Créer", + "post": { + "post": "Poste" + }, + "blog": { + "name_of_blog": "Nom du blog", + "name_of_publisher": "Nom de l'éditeur", + "upload_cover_photo": "Téléchargez une photo de couverture", + "cover_photo_alt": "Texte alternatif de la photo de couverture", + "body": "Corps" + }, + "event": { + "type_of_event": "Type d'événement", + "type_of_event_aria" : "Sélectionnez un type d'événement", + "in_person": "En personne", + "hybrid": "Hybride", + "online": "En ligne", + "name_of_organizer": "Nom de l'organisateur", + "name_of_event": "Nom de l'événement", + "event_language": "Langue de l'événement", + "event_language_aria": "Sélectionnez une langue pour votre événement", + "english": "Anglaise", + "french": "Français", + "bilingual": "Bilingue", + "body": "Corps", + "body_hint": "Commencez à écrire.", + "location": "Emplacement", + "platform": "Plateforme de streaming en ligne", + "duration": "Durée de l'événement", + "duration_aria": "Sélectionnez une durée pour votre événement", + "single_day": "Événement d'une journée", + "multi_day": "Événement sur plusieurs jours", + "start_date": "Date de début", + "end_date": "Date de fin" + }, + "poll": { + "description": "Description/question du sondage", + "option": "Option", + "option_add": "Ajouter une option", + "option_remove": "Supprimer l'option" + } } }; export default fr; \ No newline at end of file diff --git a/src/assets/svg/banner.svg b/src/assets/image/banner.svg similarity index 100% rename from src/assets/svg/banner.svg rename to src/assets/image/banner.svg diff --git a/src/assets/image/group-banner.png b/src/assets/image/group-banner.png new file mode 100644 index 0000000000000000000000000000000000000000..1d0a36b3bb4407463b30ca3884848c9e8a3ad135 GIT binary patch literal 247907 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 BHhlm9 literal 0 HcmV?d00001 diff --git a/tsconfig.json b/tsconfig.json index 0eb21cfc..8ede62ed 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -20,6 +20,7 @@ "module": "es2020", "lib": [ "es2020", + "ES2021.String", "dom" ], "resolveJsonModule": true, From d36e52e0e9f21b14120f761caef8214489e22fab Mon Sep 17 00:00:00 2001 From: doug0102 Date: Tue, 31 Oct 2023 11:48:13 -0400 Subject: [PATCH 060/165] update mat-tab style --- .../components/post/post.component.scss | 52 ------------------- src/theme.scss | 38 ++++++++++++++ 2 files changed, 38 insertions(+), 52 deletions(-) diff --git a/src/app/features/profile/components/post/post.component.scss b/src/app/features/profile/components/post/post.component.scss index 069178da..933a7e90 100644 --- a/src/app/features/profile/components/post/post.component.scss +++ b/src/app/features/profile/components/post/post.component.scss @@ -26,50 +26,6 @@ $title-padding: 90px; } } - ::ng-deep { - mat-tab-header { - margin-right: 65px; - padding-bottom: 30px; - - .mat-mdc-tab-labels { - gap: 20px; - - .mdc-tab__text-label { - font-size: large; - font-weight: 600; - } - } - - .mdc-tab { - height: 40px; - border: 2px solid $primary-1; - border-radius: 10px; - - .mdc-tab__text-label { - color: #000; - transition: none; - } - } - - .mdc-tab--active { - background-color: $primary-1; - - .mdc-tab__text-label { - color: $primary-1-contrast; - } - } - - .mdc-tab--active:hover, .mdc-tab--active:focus { - background-color: $primary-2; - border-color: $primary-2; - } - - .mdc-tab-indicator { - display: none; - } - } - } - .gcc-cancel-editing { position: absolute; top: 112px; @@ -92,12 +48,6 @@ $title-padding: 90px; } } - - - - - - mat-card { border: 1px solid $neutral-300; box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25); @@ -169,5 +119,3 @@ $title-padding: 90px; color: $primary-1; } } - -// https://stackoverflow.com/a/57759753/6479757 \ No newline at end of file diff --git a/src/theme.scss b/src/theme.scss index 71e651aa..3ae1a97d 100644 --- a/src/theme.scss +++ b/src/theme.scss @@ -66,4 +66,42 @@ mat-checkbox { color: $primary-1-dark; } } +} +mat-tab-header { + margin-right: 65px; + padding-bottom: 30px; + .mat-mdc-tab-labels { + display: inline-flex; + background-color: $neutral-200; + border-radius: 10px; + .mdc-tab__text-label { + font-size: large; + font-weight: 600; + transition: color 0.25s ease; + } + } + .mdc-tab { + height: 40px; + border-radius: 10px; + transition: background-color 0.25s ease; + .mdc-tab__text-label { + color: $neutral-900 !important; + font-weight: 500; + } + } + .mat-mdc-tab:hover, + .mat-mdc-tab.cdk-keyboard-focused { + .mdc-tab__ripple::before { + border-radius: 10px; + } + } + .mdc-tab--active { + background-color: $primary-1; + .mdc-tab__text-label { + color: $primary-1-contrast !important; + } + } + .mdc-tab-indicator { + display: none; + } } \ No newline at end of file From 52e9d612e4ac6d49dc640633728f72c83045598d Mon Sep 17 00:00:00 2001 From: Adi Makkar Date: Tue, 31 Oct 2023 14:43:34 -0400 Subject: [PATCH 061/165] wip --- .../event-card/event-card.component.html | 30 ++++++----- .../event-card/event-card.component.scss | 52 ++++++++++++++----- 2 files changed, 55 insertions(+), 27 deletions(-) diff --git a/src/app/features/events/components/event-card/event-card.component.html b/src/app/features/events/components/event-card/event-card.component.html index 125eed1a..b2a34765 100644 --- a/src/app/features/events/components/event-card/event-card.component.html +++ b/src/app/features/events/components/event-card/event-card.component.html @@ -66,7 +66,7 @@
- +
@@ -78,25 +78,29 @@ [tooltipDirection]="tooltipDirection.Above" [loading]="loading" [ngClass]="loading? 'calendar-loading' : ''"> -
+
+
+ + CANCELED {{ model?.title }} + + + {{ model?.title }} + +
-
- {{ model?.title }} -
- -
- Organizer: {{ model?.organizer }} -
- -
- Location: {{ model?.location?.address }} -
+
+ Organizer: {{ model?.organizer }} +
+
+ Location: {{ model?.location?.address }} +
+
diff --git a/src/app/features/events/components/event-card/event-card.component.scss b/src/app/features/events/components/event-card/event-card.component.scss index 97744139..0bef9add 100644 --- a/src/app/features/events/components/event-card/event-card.component.scss +++ b/src/app/features/events/components/event-card/event-card.component.scss @@ -63,6 +63,9 @@ color: $secondary-2-contrast; background: $secondary-2-gradient; cursor: pointer; + position: absolute; + margin-bottom: 125px; + margin-right: 325px; div:first-child { font-weight: 400; @@ -106,6 +109,8 @@ padding: 0 12px; display: inline-grid; justify-content: normal; + margin-top: 20px; + margin-left: 10px; div { white-space: nowrap; @@ -114,10 +119,6 @@ overflow: hidden; } - div:first-child { - font-weight: 600; - } - ngx-skeleton-loader { display: flex; flex-direction: column; @@ -162,23 +163,46 @@ // Small View mat-card.event-card-small { - display: block; // placeholders + .event-content { + div:first-child { + font-weight: 600; + } + } } // Large View mat-card.event-card-large { - .event-content { - .title-larger-text { - font-size: 18px; - } - .organizer-text { - font-weight: 450; + .event-image-wrapper { + .greyed-image-wrapper { + filter:grayscale(100%); + } } - .location-text { - font-weight: 450; - } + .event-content { + + .title-larger-text { + font-size: 20px; + font-weight: 550; + color: black; + + } + .event-organizer { + color: black; + + .organizer-text { + font-weight: 550; + color: black; + } + } + .event-location { + color: black; + + .location-text { + font-weight: 550; + color: black; + } + } } } } \ No newline at end of file From b1367236b21b052c9915376845a2807ac57f68fc Mon Sep 17 00:00:00 2001 From: Adi Makkar Date: Tue, 31 Oct 2023 14:53:40 -0400 Subject: [PATCH 062/165] wip, scope of the ticket completed --- .../events/components/event-card/event-card.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/features/events/components/event-card/event-card.component.html b/src/app/features/events/components/event-card/event-card.component.html index b2a34765..8a0c1609 100644 --- a/src/app/features/events/components/event-card/event-card.component.html +++ b/src/app/features/events/components/event-card/event-card.component.html @@ -66,7 +66,7 @@
- +
From ed4055a095b6e290cc733d08522b98040adc55c2 Mon Sep 17 00:00:00 2001 From: Adi Makkar Date: Tue, 31 Oct 2023 15:28:49 -0400 Subject: [PATCH 063/165] wip --- .../events/components/event-card/event-card.component.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/features/events/components/event-card/event-card.component.html b/src/app/features/events/components/event-card/event-card.component.html index 8a0c1609..abf32134 100644 --- a/src/app/features/events/components/event-card/event-card.component.html +++ b/src/app/features/events/components/event-card/event-card.component.html @@ -66,7 +66,7 @@
- +
@@ -85,7 +85,7 @@ routerLink="{{ '/' + routes.Events + '/' + model?.id }}">
- + CANCELED {{ model?.title }} From 0ed57f1f737293ec98fcd41dd7b626c4804a9e42 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Thu, 2 Nov 2023 11:52:25 -0400 Subject: [PATCH 064/165] file-select component --- .../blog-form/blog-form.component.html | 25 +- .../blog-form/blog-form.component.ts | 131 +--------- .../event-form/event-form.component.ts | 6 +- .../file-select/file-select.component.html | 23 ++ .../file-select/file-select.component.scss | 45 ++++ .../file-select/file-select.component.spec.ts | 46 ++++ .../file-select/file-select.component.ts | 229 ++++++++++++++++++ src/app/shared/shared.module.ts | 4 +- src/assets/i18n/translations.en.ts | 11 + src/assets/i18n/translations.fr.ts | 11 + 10 files changed, 382 insertions(+), 149 deletions(-) create mode 100644 src/app/shared/components/file-select/file-select.component.html create mode 100644 src/app/shared/components/file-select/file-select.component.scss create mode 100644 src/app/shared/components/file-select/file-select.component.spec.ts create mode 100644 src/app/shared/components/file-select/file-select.component.ts diff --git a/src/app/shared/components/blog-form/blog-form.component.html b/src/app/shared/components/blog-form/blog-form.component.html index 6dc9c653..4cdd3f4c 100644 --- a/src/app/shared/components/blog-form/blog-form.component.html +++ b/src/app/shared/components/blog-form/blog-form.component.html @@ -23,27 +23,10 @@ [disabled]="disabled"> -
- - - {{ $any(form).controls['coverPhoto'].value ? ($any(form).controls['coverPhotoName'].value | truncateFileName: 18) : translations.forms.blog.upload_cover_photo | translate }} - * - -
- - - {{ coverPhotoError }} - - - - A cover photo is required. - - - + + { - this.appInFocus = isInFocus; - if (isInFocus && this.filePickerHasOpened) { - this.form.controls['coverPhoto'].markAsTouched(); } - }); + } } ngOnDestroy(): void { - if (this.focusSub) - this.focusSub.unsubscribe(); - this.form.reset(); } - - openFilePicker(): void { - this.filePickerHasOpened = true; - this.fileInput.nativeElement.click(); - } - - onPhotoBlur(): void { - if (this.appInFocus && !this.filePickerHasOpened) - this.form.controls['coverPhoto'].markAsTouched(); - } - - onFileSelected(event: any): void { - const selectedFile: File = event.target.files[0]; - - if (selectedFile) { - if (!this.isImage(selectedFile.name)) { - this.setImageError("The file selected doesn't have an accepted image extension."); - } - else if (selectedFile.size > this.maxCoverPhotoSize) { - this.setImageError("Photo is too large. Maximum size allowed is " + this.maxCoverPhotoSize / 1024 + " KB."); - } - else { - this.isCorrectDimensions(selectedFile, this.coverPhotoMaxWidth, this.coverPhotoMaxHeight).then((valid) => { - - if (!valid) - return this.setImageError("Photo dimensions have a maximum of " + this.coverPhotoMaxWidth + "x" + this.coverPhotoMaxHeight + "."); - - this.loadImage(selectedFile).then((dataURL) => { - this.model.coverPhoto = dataURL; - this.form.controls['coverPhoto'].setValue(this.model.coverPhoto); - this.form.controls['coverPhotoName'].setValue(selectedFile.name); - this.coverPhotoError = undefined; - }).catch((error) => { - this.setImageError("Error reading the image."); - console.error(error); - }); - }); - } - } - else - this.form.controls['coverPhoto'].markAsTouched(); - } - - private loadImage(file: File): Promise { - return new Promise((resolve, reject) => { - const reader = new FileReader(); - reader.onload = (event) => { - const dataURL = event.target?.result as string; - resolve(dataURL); - }; - reader.onerror = (error) => { - reject(error); - }; - reader.readAsDataURL(file); - }); - } - - private isImage(fileName: string): boolean { - const fileExtension = fileName.split('.').pop(); - - if (!fileExtension) - return false; - - const imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'tiff', 'svg']; - return imageExtensions.includes(fileExtension.toLowerCase()); - } - - private isCorrectDimensions(file: File, maxWidth: number, maxHeight: number): Promise { - return new Promise((resolve) => { - const img = new Image(); - - img.onload = () => { - const width = img.width; - const height = img.height; - - if (width <= maxWidth && height <= maxHeight) { - resolve(true); - } else { - resolve(false); - } - }; - - img.src = URL.createObjectURL(file); - }); - } - - private setImageError(error: string): void { - this.model.coverPhoto = ''; - this.form.controls['coverPhoto'].setValue(this.model.coverPhoto); - this.form.controls['coverPhotoName'].setValue(''); - this.coverPhotoError = error; - this.form.controls['coverPhoto'].markAsTouched(); - } } export interface IBlogForm { name: string; publisher: string; coverPhoto: string; - coverPhotoName: string; coverPhotoAlt: string; description: string; } diff --git a/src/app/shared/components/event-form/event-form.component.ts b/src/app/shared/components/event-form/event-form.component.ts index f4643010..cdf192a9 100644 --- a/src/app/shared/components/event-form/event-form.component.ts +++ b/src/app/shared/components/event-form/event-form.component.ts @@ -38,10 +38,12 @@ export class EventFormComponent implements OnInit, OnDestroy { ngOnInit(): void { for (const [key, value] of Object.entries(this.model)) { - if (!this.form.controls[key]) + if (!this.form.controls[key]) { this.form.addControl(key, new FormControl(value, [Validators.required])); - else + } else { + this.form.controls[key].setValue(value); console.warn('Duplicate FormControl detected.'); + } } } diff --git a/src/app/shared/components/file-select/file-select.component.html b/src/app/shared/components/file-select/file-select.component.html new file mode 100644 index 00000000..d194b63e --- /dev/null +++ b/src/app/shared/components/file-select/file-select.component.html @@ -0,0 +1,23 @@ +
+
+ + + {{ control && control.value ? (photoName ? (photoName | truncateFileName: 18) : translations.forms.saved_image | translate) : label }} + * + +
+ + + {{ error }} + + + + {{ label + ' ' + (translations.input.error.required | translate) }} + + + \ No newline at end of file diff --git a/src/app/shared/components/file-select/file-select.component.scss b/src/app/shared/components/file-select/file-select.component.scss new file mode 100644 index 00000000..28305cc8 --- /dev/null +++ b/src/app/shared/components/file-select/file-select.component.scss @@ -0,0 +1,45 @@ +@import "../../../../assets/scss/partials/colors"; + +:host { + .form { + display: flex; + align-items: center; + justify-content: center; + height: 200px; + border: 2px solid $neutral-300; + border-radius: 10px; + margin-bottom: 16px; + margin-top: 5px; + } + + .form.error { + border-color: $error-red; + } + + .required-star { + color: $error-red; + } + + input + app-input { + ::ng-deep { + .gcc-input-wrapper { + padding-top: 5px; + } + } + } + + mat-error { + position: absolute; + padding-left: 16px; + margin-top: -16px; + -webkit-font-smoothing: antialiased; + font-family: var(--mdc-typography-caption-font-family, var(--mdc-typography-font-family, Inter)); + font-size: var(--mdc-typography-caption-font-size, 12px); + line-height: var(--mdc-typography-caption-line-height, 20px); + font-weight: var(--mdc-typography-caption-font-weight, 400); + letter-spacing: var(--mdc-typography-caption-letter-spacing, 0.0333333333em); + -webkit-text-decoration: var(--mdc-typography-caption-text-decoration, inherit); + text-decoration: var(--mdc-typography-caption-text-decoration, inherit); + text-transform: var(--mdc-typography-caption-text-transform, none); + } +} \ No newline at end of file diff --git a/src/app/shared/components/file-select/file-select.component.spec.ts b/src/app/shared/components/file-select/file-select.component.spec.ts new file mode 100644 index 00000000..18da7f5f --- /dev/null +++ b/src/app/shared/components/file-select/file-select.component.spec.ts @@ -0,0 +1,46 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { FileSelectComponent } from './file-select.component'; +import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core'; +import { HttpClient, HttpClientModule } from '@angular/common/http'; +import { TypescriptLoader } from 'src/app/core/helpers/typescript-loader'; +import { RouterTestingModule } from '@angular/router/testing'; +import { TruncateFileNamePipe } from '../../pipes/truncate-file-name.pipe'; + +describe('FileSelectComponent', () => { + let component: FileSelectComponent; + let translateService: TranslateService; + let fixture: ComponentFixture; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [FileSelectComponent, TruncateFileNamePipe], + imports: [ + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), + deps: [ HttpClient ] + } + }), + HttpClientModule, + RouterTestingModule + ], + providers: [ TranslateService, HttpClient ] + }); + fixture = TestBed.createComponent(FileSelectComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + beforeEach(() => { + translateService = TestBed.inject(TranslateService); + fixture = TestBed.createComponent(FileSelectComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/components/file-select/file-select.component.ts b/src/app/shared/components/file-select/file-select.component.ts new file mode 100644 index 00000000..a04eba6a --- /dev/null +++ b/src/app/shared/components/file-select/file-select.component.ts @@ -0,0 +1,229 @@ +import { Component, ElementRef, Input, ViewChild } from '@angular/core'; +import { FormControl } from '@angular/forms'; +import { Theme } from '../../models/theme'; +import { TooltipDirection } from '../../models/tooltip-direction'; +import { Subscription } from 'rxjs'; +import { FocusTrackingService } from 'src/app/core/services/focus-tracking.service'; +import { Translations } from 'src/app/core/services/translations.service'; +import { TranslateService } from '@ngx-translate/core'; + +@Component({ + selector: 'app-file-select', + templateUrl: './file-select.component.html', + styleUrls: ['./file-select.component.scss'] +}) +export class FileSelectComponent { + @Input({required: true}) label: string = ''; + @Input({required: true}) control!: FormControl; + @Input() fileType: FileType | string = FileType.Image; + @Input() view: FileSelectView | string = FileSelectView.Form; // TODO: Icon/Button + @Input() tooltip!: string; + @Input() tooltipDirection: TooltipDirection | string = TooltipDirection.Above; + @Input() ariaLabel!: string; // Should only be used for FileSelectView.Icon + @Input() theme: Theme | string = Theme.Primary1; + @Input() required: boolean = true; + + // All + @Input() maxSize: number = 3145728; // Bytes + @Input() ignoreExt: string[] = []; + + // Text + @Input() maxLength: number = Number.MAX_SAFE_INTEGER; + @Input() minLength: number = 0; + + // Photo + @Input() maxWidth: number = 1920; + @Input() maxHeight: number = 1080; + @Input() minWidth: number = 25; + @Input() minHeight: number = 25; + + @ViewChild('gccFileSelect') fileInput!: ElementRef; + + error: string | undefined; + photoName: string = ''; + + private filePickerHasOpened: boolean = false; + private appInFocus: boolean = true; + private focusSub!: Subscription; + + private textExtensions = [ + 'txt', 'csv', 'json', 'xml', 'html', 'md', 'log', + 'pdf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', + 'odt', 'ods', 'odp', 'rtf', 'tex', 'epub' + ]; + private imageExtensions = [ + 'jpg', 'jpeg', 'png', 'gif', 'bmp', + 'tiff', 'webp', 'svg', 'ico' + ]; + private audioExtensions = [ + 'mp3', 'wav', 'ogg', 'aac', 'wma', 'flac', + 'm4a', 'ac3', 'amr', 'aiff', 'au' + ]; + private videoExtensions = [ + 'mp4', 'avi', 'mkv', 'mov', 'wmv', 'flv', + 'webm', 'mpeg', 'm4v', '3gp', 'ogg' + ]; + private blacklist: string[] = [ + 'c', 'cgi', 'pl', 'class', 'cpp', 'cs', 'h', 'java', 'php', + 'py', 'sh', 'swift', 'vb', 'asp', 'aspx', 'cer', 'cfm', + 'css', 'htm', 'html', 'js', 'jsp', 'part', 'rss', 'xhtml', + 'apk', 'bat', 'bin', 'com', 'exe', 'gadget', 'jar', 'msi', 'wsf' + ]; + + clickCallback: Function = this.openFilePicker.bind(this); + blurCallback: Function = this.onPhotoBlur.bind(this); + + constructor(private focusTrackingService: FocusTrackingService, + public translations: Translations, private translateService: TranslateService) { + + } + + ngOnInit(): void { + this.focusSub = this.focusTrackingService.getAppFocusObservable().subscribe((isInFocus) => { + this.appInFocus = isInFocus; + if (isInFocus && this.filePickerHasOpened) { + this.control.markAsTouched(); + } + }); + } + + ngOnDestroy(): void { + if (this.focusSub) + this.focusSub.unsubscribe(); + } + + openFilePicker(): void { + this.filePickerHasOpened = true; + this.fileInput.nativeElement.click(); + } + + onPhotoBlur(): void { + if (this.appInFocus && !this.filePickerHasOpened) + this.control.markAsTouched(); + } + + onFileSelected(event: any): void { + const selectedFile: File = event.target.files[0]; + + if (selectedFile) { + if (!this.isCorrectExtension(selectedFile.name)) { + this.setError(this.translateService.instant(this.translations.file_select.error.extension)); + } + else if (selectedFile.size > this.maxSize) { + this.setError(this.translateService.instant(this.translations.file_select.error.size) + this.maxSize / 1024 + " KB."); + } + else { + + this.loadFile(selectedFile).then((dataURL) => { + + if (this.fileType == FileType.Text && dataURL.length > this.maxLength) { + return this.setError(this.translateService.instant(this.translations.file_select.error.characters) + this.maxLength); + } + else if (this.fileType == FileType.Image) { + this.isCorrectDimensions(selectedFile).then((result) => { + if (result !== true) + return this.setError(result as string); + }); + } + + this.control.setValue(dataURL); + this.photoName = selectedFile.name; + this.error = undefined; + }).catch((error) => { + this.setError(this.translateService.instant(this.translations.file_select.error.read)); + console.error(error); + }); + } + } + else + this.control.markAsTouched(); + } + + private loadFile(file: File): Promise { + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.onload = (event) => { + const dataURL = event.target?.result as string; + resolve(dataURL); + }; + reader.onerror = (error) => { + reject(error); + }; + reader.readAsDataURL(file); + }); + } + + private isCorrectExtension(fileName: string): boolean { + const fileExtension = fileName.split('.').pop(); + + if (!fileExtension) + return false; + + let valid = true; + + switch(this.fileType) { + case FileType.Text: + valid = this.textExtensions.includes(fileExtension.toLowerCase()); + break; + case FileType.Image: + valid = this.imageExtensions.includes(fileExtension.toLowerCase()); + break; + case FileType.Audio: + valid = this.audioExtensions.includes(fileExtension.toLowerCase()); + break; + case FileType.Video: + valid = this.videoExtensions.includes(fileExtension.toLowerCase()); + break; + case FileType.All: + default: + break; + } + + return valid && !this.blacklist.includes(fileExtension.toLowerCase()); + } + + private isCorrectDimensions(file: File, maxWidth: number = this.maxWidth, maxHeight: number = this.maxHeight, minWidth: number = this.minWidth, minHeight: number = this.minHeight): Promise { + return new Promise((resolve) => { + const img = new Image(); + + img.onload = () => { + const width = img.width; + const height = img.height; + + let isLarge = width >= maxWidth || height >= maxHeight; + let isSmall = width <= minWidth || height <= minHeight; + + if (!isLarge && !isSmall) { + resolve(true); + } else { + + resolve(isLarge ? + this.translateService.instant(this.translations.file_select.error.img_large) + this.maxWidth + "x" + this.maxHeight : + this.translateService.instant(this.translations.file_select.error.img_small) + this.minWidth + "x" + this.minHeight); + } + }; + + img.src = URL.createObjectURL(file); + }); + } + + private setError(error: string): void { + this.control.setValue(''); + this.control.markAsTouched(); + this.error = error; + } +} + +enum FileType { + Text = "text/plain, application/pdf, application/msword, application/vnd.openxmlformats-officedocument.wordprocessingml.document, application/vnd.ms-excel, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + Image = "image/*", + Audio = "audio/*", + Video = "video/*", + All = "*/*" +} + +enum FileSelectView { + Button = "button", + Form = "form", + Icon = "icon" +} \ No newline at end of file diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index a20307db..e3aa0b6a 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -43,6 +43,7 @@ import { EventFormComponent } from './components/event-form/event-form.component import { PollFormComponent } from './components/poll-form/poll-form.component'; import { TruncateFileNamePipe } from './pipes/truncate-file-name.pipe'; +import { FileSelectComponent } from './components/file-select/file-select.component'; @NgModule({ @@ -65,7 +66,8 @@ import { TruncateFileNamePipe } from './pipes/truncate-file-name.pipe'; BlogFormComponent, EventFormComponent, PollFormComponent, - TruncateFileNamePipe + TruncateFileNamePipe, + FileSelectComponent ], imports: [ CommonModule, diff --git a/src/assets/i18n/translations.en.ts b/src/assets/i18n/translations.en.ts index 6fd0ba59..a4018c2a 100644 --- a/src/assets/i18n/translations.en.ts +++ b/src/assets/i18n/translations.en.ts @@ -301,6 +301,7 @@ export default { "forms": { "placeholder": "Type here", "save": "Save", + "saved_image": "Saved Image", "create": "Create", "post": { "post": "Post" @@ -342,5 +343,15 @@ export default { "option_add": "Add an option", "option_remove": "Remove option" } + }, + "file_select": { + "error": { + "size": "File is too large. Maximum size allowed is ", + "extension": "The file selected doesn't have an accepted extension.", + "characters": "Files have a maximum character count of ", + "img_small": "Images must be at minimum ", + "img_large": "Images have a maximum of ", + "read": "Error reading the file." + } } }; \ No newline at end of file diff --git a/src/assets/i18n/translations.fr.ts b/src/assets/i18n/translations.fr.ts index 7acc33f0..b6066143 100644 --- a/src/assets/i18n/translations.fr.ts +++ b/src/assets/i18n/translations.fr.ts @@ -302,6 +302,7 @@ const fr: typeof import('./translations.en').default = { "forms": { "placeholder": "Écrivez ici", "save": "Sauvegarder", + "saved_image": "Image enregistrée", "create": "Créer", "post": { "post": "Poste" @@ -343,6 +344,16 @@ const fr: typeof import('./translations.en').default = { "option_add": "Ajouter une option", "option_remove": "Supprimer l'option" } + }, + "file_select": { + "error": { + "size": "Le fichier est trop grand. La taille maximale autorisée est ", + "extension": "Le fichier sélectionné n'a pas d'extension acceptée.", + "characters": "Les fichiers ont un nombre maximum de caractères de ", + "img_small": "Les images doivent être au minimum ", + "img_large": "Les images ont un maximum de ", + "read": "Erreur de lecture du fichier." + } } }; export default fr; \ No newline at end of file From 1f1cddd2311f79eaaff5e726bafe1c4ed12200a4 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Thu, 2 Nov 2023 14:58:11 -0400 Subject: [PATCH 065/165] themes for icon button --- .../profile-card/profile-card.component.html | 2 + .../blog-form/blog-form.component.html | 3 +- .../components/button/button.component.scss | 54 ++++++++++++++++++- .../components/button/button.component.ts | 2 +- .../file-select/file-select.component.html | 27 ++++++++-- .../file-select/file-select.component.scss | 6 +++ .../file-select/file-select.component.ts | 7 ++- .../components/header/header.component.html | 13 +++-- .../language-selector.component.html | 3 +- .../language-selector.component.ts | 2 + src/app/shared/models/theme.ts | 5 +- 11 files changed, 106 insertions(+), 18 deletions(-) diff --git a/src/app/features/profile/components/profile-card/profile-card.component.html b/src/app/features/profile/components/profile-card/profile-card.component.html index 668bb09f..6e2741de 100644 --- a/src/app/features/profile/components/profile-card/profile-card.component.html +++ b/src/app/features/profile/components/profile-card/profile-card.component.html @@ -26,6 +26,7 @@ [ariaLabel]="(confirmed ? translations.profileCard.confirm.aria_off : translations.profileCard.confirm.aria_on) | translate" [tooltipDirection]="tooltipDirection.Above" [disabled]="loading" + [theme]="declined ? 'disabled' : 'secondary-2'" (click)="clickConfirm()"> + [control]="$any(form).controls['coverPhoto']"> {}; @Input() blurFunc: Function = () => {}; diff --git a/src/app/shared/components/file-select/file-select.component.html b/src/app/shared/components/file-select/file-select.component.html index d194b63e..cec2f661 100644 --- a/src/app/shared/components/file-select/file-select.component.html +++ b/src/app/shared/components/file-select/file-select.component.html @@ -1,6 +1,13 @@ -
-
+ +
+ +
+ +
+ + * -
+ + + + + * + - + {{ error }} - + {{ label + ' ' + (translations.input.error.required | translate) }} diff --git a/src/app/shared/components/file-select/file-select.component.scss b/src/app/shared/components/file-select/file-select.component.scss index 28305cc8..252c1bac 100644 --- a/src/app/shared/components/file-select/file-select.component.scss +++ b/src/app/shared/components/file-select/file-select.component.scss @@ -20,6 +20,12 @@ color: $error-red; } + .required-star.icon { + position: absolute; + top: 0; + right: 5px; + } + input + app-input { ::ng-deep { .gcc-input-wrapper { diff --git a/src/app/shared/components/file-select/file-select.component.ts b/src/app/shared/components/file-select/file-select.component.ts index a04eba6a..f77f1761 100644 --- a/src/app/shared/components/file-select/file-select.component.ts +++ b/src/app/shared/components/file-select/file-select.component.ts @@ -1,5 +1,5 @@ import { Component, ElementRef, Input, ViewChild } from '@angular/core'; -import { FormControl } from '@angular/forms'; +import { FormControl, Validators } from '@angular/forms'; import { Theme } from '../../models/theme'; import { TooltipDirection } from '../../models/tooltip-direction'; import { Subscription } from 'rxjs'; @@ -21,7 +21,6 @@ export class FileSelectComponent { @Input() tooltipDirection: TooltipDirection | string = TooltipDirection.Above; @Input() ariaLabel!: string; // Should only be used for FileSelectView.Icon @Input() theme: Theme | string = Theme.Primary1; - @Input() required: boolean = true; // All @Input() maxSize: number = 3145728; // Bytes @@ -41,6 +40,8 @@ export class FileSelectComponent { error: string | undefined; photoName: string = ''; + required: boolean = false; + FileSelectView = FileSelectView; private filePickerHasOpened: boolean = false; private appInFocus: boolean = true; @@ -85,6 +86,8 @@ export class FileSelectComponent { this.control.markAsTouched(); } }); + + this.required = this.control.hasValidator(Validators.required); } ngOnDestroy(): void { diff --git a/src/app/shared/components/header/header.component.html b/src/app/shared/components/header/header.component.html index b4d24044..7ca005be 100644 --- a/src/app/shared/components/header/header.component.html +++ b/src/app/shared/components/header/header.component.html @@ -48,14 +48,16 @@ [matButtonType]="materialButtonType.Icon" [tooltip]="headerExpanded ? (translations.header.search.button.tooltip_off | translate) : translations.header.search.button.tooltip_on | translate" [ariaLabel]="headerExpanded ? (translations.header.search.button.aria_off | translate) : translations.header.search.button.aria_on | translate" - (click)="toggleSearch()"> + (click)="toggleSearch()" + [theme]="'white'"> + [routerLink]="[routes.Messages]" + [theme]="'white'"> + [ngClass]="activeRoute == routes.Messages ? 'selected' : ''" + [theme]="'white'"> + [isToggle]="true" + [theme]="'white'">
diff --git a/src/app/shared/components/language-selector/language-selector.component.html b/src/app/shared/components/language-selector/language-selector.component.html index 6ecd50dd..064c6d1d 100644 --- a/src/app/shared/components/language-selector/language-selector.component.html +++ b/src/app/shared/components/language-selector/language-selector.component.html @@ -13,6 +13,7 @@ (click)="toggle()" [matTooltip]="translations.languages.tooltip | translate" [ariaLabel]="translations.languages.aria | translate" - [fontSize]="'large'"> + [fontSize]="'large'" + [theme]="theme"> {{ selectedLanguageKey | uppercase }} \ No newline at end of file diff --git a/src/app/shared/components/language-selector/language-selector.component.ts b/src/app/shared/components/language-selector/language-selector.component.ts index bf814d17..f82b250f 100644 --- a/src/app/shared/components/language-selector/language-selector.component.ts +++ b/src/app/shared/components/language-selector/language-selector.component.ts @@ -3,6 +3,7 @@ import { TranslateService } from '@ngx-translate/core'; import { ILanguage } from '../../models/language'; import { Translations } from 'src/app/core/services/translations.service'; import { MaterialButtonType } from '../../models/material-button-type'; +import { Theme } from '../../models/theme'; @Component({ selector: 'app-language-selector', @@ -12,6 +13,7 @@ import { MaterialButtonType } from '../../models/material-button-type'; export class LanguageSelectorComponent implements OnInit { @Input() isToggle: boolean = false; + @Input() theme: Theme | string = Theme.Black; languages: ILanguage [] = [ {'key': 'en', 'value': this.translations.languages.english}, diff --git a/src/app/shared/models/theme.ts b/src/app/shared/models/theme.ts index 39aa4259..fe61459b 100644 --- a/src/app/shared/models/theme.ts +++ b/src/app/shared/models/theme.ts @@ -3,5 +3,8 @@ export enum Theme { Primary2 = 'primary-2', Secondary1 = 'secondary-1', Secondary2 = 'secondary-2', - Error = 'error' + Error = 'error', + Disabled = 'disabled', + White = 'white', + Black = 'black' } \ No newline at end of file From b9b41c0eca18516c694c360f94e35adcb61fbeaf Mon Sep 17 00:00:00 2001 From: Shea Date: Thu, 2 Nov 2023 19:02:54 +0000 Subject: [PATCH 066/165] Dependency Graph ignore-deploy --- dependency-graph.svg | 3225 +++++++++++++++++++++--------------------- 1 file changed, 1648 insertions(+), 1577 deletions(-) diff --git a/dependency-graph.svg b/dependency-graph.svg index 22bf761e..54185467 100644 --- a/dependency-graph.svg +++ b/dependency-graph.svg @@ -4,295 +4,295 @@ - - + + dependency-cruiser output - + cluster_src - -src + +src cluster_src/app - -app + +app cluster_src/app/core - -core + +core cluster_src/app/core/auth - -auth + +auth cluster_src/app/core/constants - -constants + +constants cluster_src/app/core/guards - -guards + +guards cluster_src/app/core/helpers - -helpers + +helpers cluster_src/app/core/interceptors - -interceptors + +interceptors cluster_src/app/core/models - -models + +models cluster_src/app/core/services - -services + +services cluster_src/app/features - -features + +features cluster_src/app/features/about - -about + +about cluster_src/app/features/blog - -blog + +blog cluster_src/app/features/bookmarks - -bookmarks + +bookmarks cluster_src/app/features/dashboard - -dashboard + +dashboard cluster_src/app/features/events - -events + +events cluster_src/app/features/events/components - -components + +components cluster_src/app/features/events/components/event-card - -event-card + +event-card cluster_src/app/features/events/components/event-list - -event-list + +event-list cluster_src/app/features/events/components/event - -event + +event cluster_src/app/features/events/models - -models + +models cluster_src/app/features/events/resolvers - -resolvers + +resolvers cluster_src/app/features/friends - -friends + +friends cluster_src/app/features/groups - -groups + +groups cluster_src/app/features/groups/components - -components + +components cluster_src/app/features/groups/components/group-card - -group-card + +group-card cluster_src/app/features/groups/components/group-list - -group-list + +group-list cluster_src/app/features/groups/components/group - -group + +group cluster_src/app/features/groups/models - -models + +models cluster_src/app/features/home - -home + +home cluster_src/app/features/invite - -invite + +invite cluster_src/app/features/login - -login + +login cluster_src/app/features/members - -members + +members cluster_src/app/features/messages - -messages + +messages cluster_src/app/features/missions - -missions + +missions cluster_src/app/features/news-feed - -news-feed + +news-feed cluster_src/app/features/news-feed/components - -components + +components cluster_src/app/features/news-feed/components/news-card - -news-card + +news-card cluster_src/app/features/news-feed/components/news-list - -news-list + +news-list cluster_src/app/features/news-feed/models - -models + +models cluster_src/app/features/privacy - -privacy + +privacy cluster_src/app/features/profile - -profile + +profile cluster_src/app/features/profile/components - -components + +components cluster_src/app/features/profile/components/post - -post + +post cluster_src/app/features/profile/components/profile-card - -profile-card + +profile-card cluster_src/app/features/profile/components/profile-list - -profile-list + +profile-list cluster_src/app/features/register - -register + +register cluster_src/app/features/search - -search + +search cluster_src/app/features/settings - -settings + +settings cluster_src/app/features/splash - -splash + +splash cluster_src/app/features/stats - -stats + +stats cluster_src/app/features/terms - -terms + +terms cluster_src/app/features/the-wire - -the-wire + +the-wire cluster_src/app/shared - -shared + +shared cluster_src/app/shared/components - -components + +components cluster_src/app/shared/components/banner - -banner + +banner cluster_src/app/shared/components/blog-form - -blog-form + +blog-form cluster_src/app/shared/components/button @@ -306,105 +306,110 @@ cluster_src/app/shared/components/editor - -editor + +editor cluster_src/app/shared/components/editor/menu - -menu + +menu cluster_src/app/shared/components/editor/menu/editor-menu - -editor-menu + +editor-menu cluster_src/app/shared/components/event-form - -event-form + +event-form -cluster_src/app/shared/components/footer - -footer +cluster_src/app/shared/components/file-select + +file-select +cluster_src/app/shared/components/footer + +footer + + cluster_src/app/shared/components/forbidden forbidden - + cluster_src/app/shared/components/header - -header + +header - + cluster_src/app/shared/components/input - -input + +input - + cluster_src/app/shared/components/language-selector - -language-selector + +language-selector - + cluster_src/app/shared/components/not-found not-found - + cluster_src/app/shared/components/page-title - -page-title + +page-title - + cluster_src/app/shared/components/poll-form - -poll-form + +poll-form - + cluster_src/app/shared/components/post-form - -post-form + +post-form - + cluster_src/app/shared/components/profile-pic - -profile-pic + +profile-pic - + cluster_src/app/shared/components/unauthorized unauthorized - + cluster_src/app/shared/factories - -factories + +factories - + cluster_src/app/shared/models - -models + +models - + cluster_src/app/shared/pipes - -pipes + +pipes - + cluster_src/assets - -assets + +assets - + cluster_src/assets/i18n - -i18n + +i18n - + cluster_src/environments environments @@ -413,8 +418,8 @@ src/app/app-routing.module.ts - -app-routing.module.ts + +app-routing.module.ts @@ -422,482 +427,482 @@ src/app/core/constants/routes.constants.ts - -routes.constants.ts + +routes.constants.ts src/app/app-routing.module.ts->src/app/core/constants/routes.constants.ts - - + + src/app/core/guards/auth.guard.ts - -auth.guard.ts + +auth.guard.ts src/app/app-routing.module.ts->src/app/core/guards/auth.guard.ts - - + + src/app/core/guards/interceptor.guard.ts - -interceptor.guard.ts + +interceptor.guard.ts src/app/app-routing.module.ts->src/app/core/guards/interceptor.guard.ts - - + + src/app/core/guards/login.guard.ts - -login.guard.ts + +login.guard.ts src/app/app-routing.module.ts->src/app/core/guards/login.guard.ts - - + + src/app/core/guards/redirect.guard.ts - -redirect.guard.ts + +redirect.guard.ts src/app/app-routing.module.ts->src/app/core/guards/redirect.guard.ts - - + + src/app/core/services/translations.service.ts - -translations.service.ts + +translations.service.ts src/app/app-routing.module.ts->src/app/core/services/translations.service.ts - - + + src/app/features/about/about.module.ts - -about.module.ts + +about.module.ts src/app/app-routing.module.ts->src/app/features/about/about.module.ts - - - - + + + + src/app/features/blog/blog.module.ts - -blog.module.ts + +blog.module.ts src/app/app-routing.module.ts->src/app/features/blog/blog.module.ts - - - - + + + + src/app/features/bookmarks/bookmarks.module.ts - -bookmarks.module.ts + +bookmarks.module.ts src/app/app-routing.module.ts->src/app/features/bookmarks/bookmarks.module.ts - - - - + + + + src/app/features/dashboard/dashboard.module.ts - -dashboard.module.ts + +dashboard.module.ts src/app/app-routing.module.ts->src/app/features/dashboard/dashboard.module.ts - - - - + + + + src/app/features/events/events.module.ts - -events.module.ts + +events.module.ts src/app/app-routing.module.ts->src/app/features/events/events.module.ts - - - - + + + + src/app/features/friends/friends.module.ts - -friends.module.ts + +friends.module.ts src/app/app-routing.module.ts->src/app/features/friends/friends.module.ts - - - - + + + + src/app/features/groups/groups.module.ts - -groups.module.ts + +groups.module.ts src/app/app-routing.module.ts->src/app/features/groups/groups.module.ts - - - - + + + + src/app/features/home/home.module.ts - -home.module.ts + +home.module.ts src/app/app-routing.module.ts->src/app/features/home/home.module.ts - - - - + + + + src/app/features/invite/invite.module.ts - -invite.module.ts + +invite.module.ts src/app/app-routing.module.ts->src/app/features/invite/invite.module.ts - - - - + + + + src/app/features/login/login.module.ts - -login.module.ts + +login.module.ts src/app/app-routing.module.ts->src/app/features/login/login.module.ts - - - - + + + + src/app/features/members/members.module.ts - -members.module.ts + +members.module.ts src/app/app-routing.module.ts->src/app/features/members/members.module.ts - - - - + + + + src/app/features/messages/messages.module.ts - -messages.module.ts + +messages.module.ts src/app/app-routing.module.ts->src/app/features/messages/messages.module.ts - - - - + + + + src/app/features/missions/missions.module.ts - -missions.module.ts + +missions.module.ts src/app/app-routing.module.ts->src/app/features/missions/missions.module.ts - - - - + + + + src/app/features/news-feed/news-feed.module.ts - -news-feed.module.ts + +news-feed.module.ts src/app/app-routing.module.ts->src/app/features/news-feed/news-feed.module.ts - - - - + + + + src/app/features/privacy/privacy.module.ts - -privacy.module.ts + +privacy.module.ts src/app/app-routing.module.ts->src/app/features/privacy/privacy.module.ts - - - - + + + + src/app/features/profile/profile.module.ts - -profile.module.ts + +profile.module.ts src/app/app-routing.module.ts->src/app/features/profile/profile.module.ts - - - - + + + + src/app/features/register/register.module.ts - -register.module.ts + +register.module.ts src/app/app-routing.module.ts->src/app/features/register/register.module.ts - - - - + + + + src/app/features/search/search.module.ts - -search.module.ts + +search.module.ts src/app/app-routing.module.ts->src/app/features/search/search.module.ts - - - - + + + + src/app/features/settings/settings.module.ts - -settings.module.ts + +settings.module.ts src/app/app-routing.module.ts->src/app/features/settings/settings.module.ts - - - - + + + + src/app/features/splash/splash.module.ts - -splash.module.ts + +splash.module.ts src/app/app-routing.module.ts->src/app/features/splash/splash.module.ts - - - - + + + + src/app/features/stats/stats.module.ts - -stats.module.ts + +stats.module.ts src/app/app-routing.module.ts->src/app/features/stats/stats.module.ts - - - - + + + + src/app/features/terms/terms.module.ts - -terms.module.ts + +terms.module.ts src/app/app-routing.module.ts->src/app/features/terms/terms.module.ts - - - - + + + + src/app/features/the-wire/the-wire.module.ts - -the-wire.module.ts + +the-wire.module.ts src/app/app-routing.module.ts->src/app/features/the-wire/the-wire.module.ts - - - - + + + + @@ -911,7 +916,7 @@ src/app/app-routing.module.ts->src/app/shared/components/forbidden/forbidden.component.ts - + @@ -926,8 +931,8 @@ src/app/app-routing.module.ts->src/app/shared/components/not-found/not-found.component.ts - - + + @@ -941,23 +946,23 @@ src/app/app-routing.module.ts->src/app/shared/components/unauthorized/unauthorized.component.ts - - + + src/app/core/services/session-storage.service.ts - -session-storage.service.ts + +session-storage.service.ts src/app/core/guards/auth.guard.ts->src/app/core/services/session-storage.service.ts - - + + @@ -971,891 +976,891 @@ src/app/core/guards/auth.guard.ts->src/environments/environment.ts - - + + src/app/core/guards/interceptor.guard.ts->src/app/core/services/session-storage.service.ts - - + + src/assets/i18n/translations.en.ts - -translations.en.ts + +translations.en.ts src/app/core/services/translations.service.ts->src/assets/i18n/translations.en.ts - - + + src/app/shared/shared.module.ts - -shared.module.ts + +shared.module.ts src/app/features/about/about.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/about/about-routing.module.ts - -about-routing.module.ts + +about-routing.module.ts src/app/features/about/about.module.ts->src/app/features/about/about-routing.module.ts - - + + src/app/features/about/about.component.ts - -about.component.ts + +about.component.ts src/app/features/about/about.module.ts->src/app/features/about/about.component.ts - - + + src/app/features/blog/blog.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/blog/blog-routing.module.ts - -blog-routing.module.ts + +blog-routing.module.ts src/app/features/blog/blog.module.ts->src/app/features/blog/blog-routing.module.ts - - + + src/app/features/bookmarks/bookmarks.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/bookmarks/bookmarks-routing.module.ts - -bookmarks-routing.module.ts + +bookmarks-routing.module.ts src/app/features/bookmarks/bookmarks.module.ts->src/app/features/bookmarks/bookmarks-routing.module.ts - - + + src/app/features/dashboard/dashboard.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/dashboard/dashboard-routing.module.ts - -dashboard-routing.module.ts + +dashboard-routing.module.ts src/app/features/dashboard/dashboard.module.ts->src/app/features/dashboard/dashboard-routing.module.ts - - + + src/app/features/events/events.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/events/components/event-card/event-card.component.ts - -event-card.component.ts + +event-card.component.ts src/app/features/events/events.module.ts->src/app/features/events/components/event-card/event-card.component.ts - - + + src/app/features/events/components/event-list/event-list.component.ts - -event-list.component.ts + +event-list.component.ts src/app/features/events/events.module.ts->src/app/features/events/components/event-list/event-list.component.ts - - + + src/app/features/events/components/event/event.component.ts - -event.component.ts + +event.component.ts src/app/features/events/events.module.ts->src/app/features/events/components/event/event.component.ts - - + + src/app/features/events/events-routing.module.ts - -events-routing.module.ts + +events-routing.module.ts src/app/features/events/events.module.ts->src/app/features/events/events-routing.module.ts - - + + src/app/features/friends/friends.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/friends/friends-routing.module.ts - -friends-routing.module.ts + +friends-routing.module.ts src/app/features/friends/friends.module.ts->src/app/features/friends/friends-routing.module.ts - - + + src/app/features/groups/groups.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/groups/components/group-card/group-card.component.ts - -group-card.component.ts + +group-card.component.ts src/app/features/groups/groups.module.ts->src/app/features/groups/components/group-card/group-card.component.ts - - + + src/app/features/groups/components/group-list/group-list.component.ts - -group-list.component.ts + +group-list.component.ts src/app/features/groups/groups.module.ts->src/app/features/groups/components/group-list/group-list.component.ts - - + + src/app/features/groups/components/group/group.component.ts - -group.component.ts + +group.component.ts src/app/features/groups/groups.module.ts->src/app/features/groups/components/group/group.component.ts - - + + src/app/features/groups/groups-routing.module.ts - -groups-routing.module.ts + +groups-routing.module.ts src/app/features/groups/groups.module.ts->src/app/features/groups/groups-routing.module.ts - - + + src/app/features/home/home.module.ts->src/app/features/events/events.module.ts - - - - + + + + src/app/features/home/home.module.ts->src/app/features/groups/groups.module.ts - - - - + + + + src/app/features/home/home.module.ts->src/app/features/news-feed/news-feed.module.ts - - - - + + + + src/app/features/home/home.module.ts->src/app/features/profile/profile.module.ts - - - - + + + + src/app/features/home/home.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/home/home-routing.module.ts - -home-routing.module.ts + +home-routing.module.ts src/app/features/home/home.module.ts->src/app/features/home/home-routing.module.ts - - + + src/app/features/home/home.component.ts - -home.component.ts + +home.component.ts src/app/features/home/home.module.ts->src/app/features/home/home.component.ts - - + + src/app/features/invite/invite.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/invite/invite-routing.module.ts - -invite-routing.module.ts + +invite-routing.module.ts src/app/features/invite/invite.module.ts->src/app/features/invite/invite-routing.module.ts - - + + src/app/features/login/login.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/login/login-routing.module.ts - -login-routing.module.ts + +login-routing.module.ts src/app/features/login/login.module.ts->src/app/features/login/login-routing.module.ts - - + + src/app/features/login/login.component.ts - -login.component.ts + +login.component.ts src/app/features/login/login.module.ts->src/app/features/login/login.component.ts - - + + src/app/features/members/members.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/members/members-routing.module.ts - -members-routing.module.ts + +members-routing.module.ts src/app/features/members/members.module.ts->src/app/features/members/members-routing.module.ts - - + + src/app/features/messages/messages.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/messages/messages-routing.module.ts - -messages-routing.module.ts + +messages-routing.module.ts src/app/features/messages/messages.module.ts->src/app/features/messages/messages-routing.module.ts - - + + src/app/features/missions/missions.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/missions/missions-routing.module.ts - -missions-routing.module.ts + +missions-routing.module.ts src/app/features/missions/missions.module.ts->src/app/features/missions/missions-routing.module.ts - - + + src/app/features/news-feed/news-feed.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/news-feed/components/news-card/news-card.component.ts - -news-card.component.ts + +news-card.component.ts src/app/features/news-feed/news-feed.module.ts->src/app/features/news-feed/components/news-card/news-card.component.ts - - + + src/app/features/news-feed/components/news-list/news-list.component.ts - -news-list.component.ts + +news-list.component.ts src/app/features/news-feed/news-feed.module.ts->src/app/features/news-feed/components/news-list/news-list.component.ts - - + + src/app/features/news-feed/news-feed-routing.module.ts - -news-feed-routing.module.ts + +news-feed-routing.module.ts src/app/features/news-feed/news-feed.module.ts->src/app/features/news-feed/news-feed-routing.module.ts - - + + src/app/features/privacy/privacy.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/privacy/privacy-routing.module.ts - -privacy-routing.module.ts + +privacy-routing.module.ts src/app/features/privacy/privacy.module.ts->src/app/features/privacy/privacy-routing.module.ts - - + + src/app/features/privacy/privacy.component.ts - -privacy.component.ts + +privacy.component.ts src/app/features/privacy/privacy.module.ts->src/app/features/privacy/privacy.component.ts - - + + src/app/features/profile/profile.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/profile/components/post/post.component.ts - -post.component.ts + +post.component.ts src/app/features/profile/profile.module.ts->src/app/features/profile/components/post/post.component.ts - - + + src/app/features/profile/components/profile-card/profile-card.component.ts - -profile-card.component.ts + +profile-card.component.ts src/app/features/profile/profile.module.ts->src/app/features/profile/components/profile-card/profile-card.component.ts - - + + src/app/features/profile/components/profile-list/profile-list.component.ts - -profile-list.component.ts + +profile-list.component.ts src/app/features/profile/profile.module.ts->src/app/features/profile/components/profile-list/profile-list.component.ts - - + + src/app/features/profile/profile-routing.module.ts - -profile-routing.module.ts + +profile-routing.module.ts src/app/features/profile/profile.module.ts->src/app/features/profile/profile-routing.module.ts - - + + src/app/features/register/register.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/register/register-routing.module.ts - -register-routing.module.ts + +register-routing.module.ts src/app/features/register/register.module.ts->src/app/features/register/register-routing.module.ts - - + + src/app/features/register/register.component.ts - -register.component.ts + +register.component.ts src/app/features/register/register.module.ts->src/app/features/register/register.component.ts - - + + src/app/features/search/search.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/search/search-routing.module.ts - -search-routing.module.ts + +search-routing.module.ts src/app/features/search/search.module.ts->src/app/features/search/search-routing.module.ts - - + + src/app/features/settings/settings.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/settings/settings-routing.module.ts - -settings-routing.module.ts + +settings-routing.module.ts src/app/features/settings/settings.module.ts->src/app/features/settings/settings-routing.module.ts - - + + src/app/features/splash/splash.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/splash/splash-routing.module.ts - -splash-routing.module.ts + +splash-routing.module.ts src/app/features/splash/splash.module.ts->src/app/features/splash/splash-routing.module.ts - - + + src/app/features/splash/splash.component.ts - -splash.component.ts + +splash.component.ts src/app/features/splash/splash.module.ts->src/app/features/splash/splash.component.ts - - + + src/app/features/stats/stats.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/stats/stats-routing.module.ts - -stats-routing.module.ts + +stats-routing.module.ts src/app/features/stats/stats.module.ts->src/app/features/stats/stats-routing.module.ts - - + + src/app/features/stats/stats.component.ts - -stats.component.ts + +stats.component.ts src/app/features/stats/stats.module.ts->src/app/features/stats/stats.component.ts - - + + src/app/features/terms/terms.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/terms/terms-routing.module.ts - -terms-routing.module.ts + +terms-routing.module.ts src/app/features/terms/terms.module.ts->src/app/features/terms/terms-routing.module.ts - - + + src/app/features/terms/terms.component.ts - -terms.component.ts + +terms.component.ts src/app/features/terms/terms.module.ts->src/app/features/terms/terms.component.ts - - + + src/app/features/the-wire/the-wire.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/the-wire/the-wire-routing.module.ts - -the-wire-routing.module.ts + +the-wire-routing.module.ts src/app/features/the-wire/the-wire.module.ts->src/app/features/the-wire/the-wire-routing.module.ts - - + + src/app/app.component.spec.ts - -app.component.spec.ts + +app.component.spec.ts @@ -1863,302 +1868,302 @@ src/app/app.component.ts - -app.component.ts + +app.component.ts src/app/app.component.spec.ts->src/app/app.component.ts - - + + src/app/core/auth/auth.module.ts - -auth.module.ts + +auth.module.ts src/app/app.component.spec.ts->src/app/core/auth/auth.module.ts - - + + src/app/core/helpers/typescript-loader.ts - -typescript-loader.ts + +typescript-loader.ts src/app/app.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/app.component.ts->src/app/core/constants/routes.constants.ts - - + + src/app/app.component.ts->src/app/core/services/translations.service.ts - - + + src/app/core/services/language-storage.service.ts - -language-storage.service.ts + +language-storage.service.ts src/app/app.component.ts->src/app/core/services/language-storage.service.ts - - + + src/app/core/auth/auth.module.ts->src/app/core/services/session-storage.service.ts - - + + src/app/core/auth/auth.module.ts->src/environments/environment.ts - - + + src/app/core/services/local-storage-ref.service.ts - -local-storage-ref.service.ts + +local-storage-ref.service.ts src/app/core/services/language-storage.service.ts->src/app/core/services/local-storage-ref.service.ts - - + + src/app/app.module.ts - -app.module.ts + +app.module.ts src/app/app.module.ts->src/app/app-routing.module.ts - - - - + + + + src/app/app.module.ts->src/app/app.component.ts - - + + src/app/app.module.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/core/core.module.ts - -core.module.ts + +core.module.ts src/app/app.module.ts->src/app/core/core.module.ts - - - - + + + + src/app/core/services/title.service.ts - -title.service.ts + +title.service.ts src/app/app.module.ts->src/app/core/services/title.service.ts - - + + src/app/features/events/events.component.ts - -events.component.ts + +events.component.ts src/app/app.module.ts->src/app/features/events/events.component.ts - - + + src/app/features/groups/groups.component.ts - -groups.component.ts + +groups.component.ts src/app/app.module.ts->src/app/features/groups/groups.component.ts - - + + src/app/app.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/core/core.module.ts->src/app/core/auth/auth.module.ts - - + + src/app/core/core.module.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/core/core.module.ts->src/app/app.module.ts - - - - + + + + - + src/app/shared/shared.module.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/shared.module.ts->src/app/shared/components/forbidden/forbidden.component.ts - - + + - + src/app/shared/shared.module.ts->src/app/shared/components/not-found/not-found.component.ts - - + + - + src/app/shared/shared.module.ts->src/app/shared/components/unauthorized/unauthorized.component.ts - - + + - + src/app/shared/shared.module.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/shared.module.ts->src/app/app.module.ts - - - - + + + + src/app/shared/components/banner/banner.component.ts - -banner.component.ts + +banner.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/banner/banner.component.ts - - + + src/app/shared/pipes/truncate-file-name.pipe.ts - -truncate-file-name.pipe.ts + +truncate-file-name.pipe.ts - + src/app/shared/shared.module.ts->src/app/shared/pipes/truncate-file-name.pipe.ts - - + + src/app/shared/components/blog-form/blog-form.component.ts - -blog-form.component.ts + +blog-form.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/blog-form/blog-form.component.ts - - + + @@ -2170,10 +2175,10 @@ - + src/app/shared/shared.module.ts->src/app/shared/components/button/button.component.ts - - + + @@ -2185,281 +2190,296 @@ - + src/app/shared/shared.module.ts->src/app/shared/components/calendar-button/calendar-button.component.ts - - + + src/app/shared/components/editor/editor.component.ts - -editor.component.ts + +editor.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/editor/editor.component.ts - - + + src/app/shared/factories/editor-config.factory.ts - -editor-config.factory.ts + +editor-config.factory.ts - + src/app/shared/shared.module.ts->src/app/shared/factories/editor-config.factory.ts - - + + src/app/shared/components/editor/menu/editor-menu/editor-menu.component.ts - -editor-menu.component.ts + +editor-menu.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/editor/menu/editor-menu/editor-menu.component.ts - - + + src/app/shared/components/event-form/event-form.component.ts - -event-form.component.ts + +event-form.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/event-form/event-form.component.ts - - + + - + +src/app/shared/components/file-select/file-select.component.ts + + +file-select.component.ts + + + + + +src/app/shared/shared.module.ts->src/app/shared/components/file-select/file-select.component.ts + + + + + src/app/shared/components/footer/footer.component.ts - - -footer.component.ts + + +footer.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/footer/footer.component.ts - - + + - + src/app/shared/components/header/header.component.ts - - -header.component.ts + + +header.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/header/header.component.ts - - + + - + src/app/shared/components/input/input.component.ts - - -input.component.ts + + +input.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/input/input.component.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.ts - - -language-selector.component.ts + + +language-selector.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/language-selector/language-selector.component.ts - - + + - + src/app/shared/components/page-title/page-title.component.ts - - -page-title.component.ts + + +page-title.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/page-title/page-title.component.ts - - + + - + src/app/shared/components/poll-form/poll-form.component.ts - - -poll-form.component.ts + + +poll-form.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/poll-form/poll-form.component.ts - - + + - + src/app/shared/components/post-form/post-form.component.ts - - -post-form.component.ts + + +post-form.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/post-form/post-form.component.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.ts - - -profile-pic.component.ts + + +profile-pic.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/profile-pic/profile-pic.component.ts - - + + src/app/core/services/session-storage.service.ts->src/app/core/services/local-storage-ref.service.ts - - + + src/app/core/guards/auth.guard.spec.ts - -auth.guard.spec.ts + +auth.guard.spec.ts src/app/core/guards/auth.guard.spec.ts->src/app/core/guards/auth.guard.ts - - + + src/app/core/guards/auth.guard.spec.ts->src/app/core/auth/auth.module.ts - - + + src/app/core/guards/auth.guard.spec.ts->src/app/core/services/session-storage.service.ts - - + + src/app/core/guards/interceptor.guard.spec.ts - -interceptor.guard.spec.ts + +interceptor.guard.spec.ts src/app/core/guards/interceptor.guard.spec.ts->src/app/core/guards/interceptor.guard.ts - - + + src/app/core/guards/login.guard.spec.ts - -login.guard.spec.ts + +login.guard.spec.ts src/app/core/guards/login.guard.spec.ts->src/app/core/guards/login.guard.ts - - + + src/app/core/guards/login.guard.spec.ts->src/app/core/auth/auth.module.ts - - + + src/app/core/guards/redirect.guard.spec.ts - -redirect.guard.spec.ts + +redirect.guard.spec.ts src/app/core/guards/redirect.guard.spec.ts->src/app/core/guards/redirect.guard.ts - - + + src/app/core/guards/role.guard.spec.ts - -role.guard.spec.ts + +role.guard.spec.ts @@ -2467,23 +2487,23 @@ src/app/core/guards/role.guard.ts - -role.guard.ts + +role.guard.ts src/app/core/guards/role.guard.spec.ts->src/app/core/guards/role.guard.ts - - + + src/app/core/interceptors/error.interceptor.spec.ts - -error.interceptor.spec.ts + +error.interceptor.spec.ts @@ -2491,23 +2511,23 @@ src/app/core/interceptors/error.interceptor.ts - -error.interceptor.ts + +error.interceptor.ts src/app/core/interceptors/error.interceptor.spec.ts->src/app/core/interceptors/error.interceptor.ts - - + + src/app/core/models/blog.model.ts - -blog.model.ts + +blog.model.ts @@ -2515,101 +2535,101 @@ src/app/core/models/person.model.ts - -person.model.ts + +person.model.ts src/app/core/models/blog.model.ts->src/app/core/models/person.model.ts - - + + src/app/features/news-feed/models/INewsItem.ts - -INewsItem.ts + +INewsItem.ts src/app/core/models/blog.model.ts->src/app/features/news-feed/models/INewsItem.ts - - + + src/app/core/models/location.model.ts - -location.model.ts + +location.model.ts src/app/core/models/person.model.ts->src/app/core/models/location.model.ts - - + + src/app/features/news-feed/models/INewsItem.ts->src/app/core/models/person.model.ts - - + + src/app/core/models/poll.model.ts - -poll.model.ts + +poll.model.ts src/app/core/models/poll.model.ts->src/app/core/models/person.model.ts - - + + src/app/core/models/poll.model.ts->src/app/features/news-feed/models/INewsItem.ts - - + + src/app/core/models/post.model.ts - -post.model.ts + +post.model.ts src/app/core/models/post.model.ts->src/app/core/models/person.model.ts - - + + src/app/core/models/post.model.ts->src/app/features/news-feed/models/INewsItem.ts - - + + src/app/core/services/debounce.service.spec.ts - -debounce.service.spec.ts + +debounce.service.spec.ts @@ -2617,23 +2637,23 @@ src/app/core/services/debounce.service.ts - -debounce.service.ts + +debounce.service.ts src/app/core/services/debounce.service.spec.ts->src/app/core/services/debounce.service.ts - - + + src/app/core/services/event.service.spec.ts - -event.service.spec.ts + +event.service.spec.ts @@ -2641,119 +2661,119 @@ src/app/core/services/event.service.ts - -event.service.ts + +event.service.ts src/app/core/services/event.service.spec.ts->src/app/core/services/event.service.ts - - + + src/app/core/services/event.service.ts->src/app/core/models/location.model.ts - - + + src/app/core/services/group.service.ts - -group.service.ts + +group.service.ts src/app/core/services/event.service.ts->src/app/core/services/group.service.ts - - + + src/app/core/services/people.service.ts - -people.service.ts + +people.service.ts src/app/core/services/event.service.ts->src/app/core/services/people.service.ts - - + + src/app/features/events/models/event.ts - -event.ts + +event.ts src/app/core/services/event.service.ts->src/app/features/events/models/event.ts - - + + src/app/features/groups/models/group.ts - -group.ts + +group.ts src/app/core/services/group.service.ts->src/app/features/groups/models/group.ts - - + + src/app/core/services/people.service.ts->src/app/core/models/person.model.ts - - + + src/app/core/services/people.service.ts->src/app/core/models/location.model.ts - - + + src/app/features/events/models/event.ts->src/app/core/models/person.model.ts - - + + src/app/features/events/models/event.ts->src/app/core/models/location.model.ts - - + + src/app/features/events/models/event.ts->src/app/features/groups/models/group.ts - - + + src/app/core/services/focus-tracking.service.spec.ts - -focus-tracking.service.spec.ts + +focus-tracking.service.spec.ts @@ -2761,68 +2781,68 @@ src/app/core/services/focus-tracking.service.ts - -focus-tracking.service.ts + +focus-tracking.service.ts src/app/core/services/focus-tracking.service.spec.ts->src/app/core/services/focus-tracking.service.ts - - + + src/app/core/services/group.service.spec.ts - -group.service.spec.ts + +group.service.spec.ts src/app/core/services/group.service.spec.ts->src/app/core/services/group.service.ts - - + + src/app/core/services/language-storage.service.spec.ts - -language-storage.service.spec.ts + +language-storage.service.spec.ts src/app/core/services/language-storage.service.spec.ts->src/app/core/services/language-storage.service.ts - - + + src/app/core/services/local-storage-ref.service.spec.ts - -local-storage-ref.service.spec.ts + +local-storage-ref.service.spec.ts src/app/core/services/local-storage-ref.service.spec.ts->src/app/core/services/local-storage-ref.service.ts - - + + src/app/core/services/news.service.spec.ts - -news.service.spec.ts + +news.service.spec.ts @@ -2830,104 +2850,104 @@ src/app/core/services/news.service.ts - -news.service.ts + +news.service.ts src/app/core/services/news.service.spec.ts->src/app/core/services/news.service.ts - - + + src/app/core/services/news.service.ts->src/app/core/models/blog.model.ts - - + + src/app/core/services/news.service.ts->src/app/features/news-feed/models/INewsItem.ts - - + + src/app/core/services/news.service.ts->src/app/core/models/poll.model.ts - - + + src/app/core/services/news.service.ts->src/app/core/models/post.model.ts - - + + src/app/core/services/news.service.ts->src/app/core/services/people.service.ts - - + + src/app/core/services/people.service.spec.ts - -people.service.spec.ts + +people.service.spec.ts src/app/core/services/people.service.spec.ts->src/app/core/services/people.service.ts - - + + src/app/core/services/session-storage.service.spec.ts - -session-storage.service.spec.ts + +session-storage.service.spec.ts src/app/core/services/session-storage.service.spec.ts->src/app/core/services/session-storage.service.ts - - + + src/app/core/services/title.service.spec.ts - -title.service.spec.ts + +title.service.spec.ts src/app/core/services/title.service.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/core/services/title.service.spec.ts->src/app/core/services/title.service.ts - - + + src/app/core/services/user.service.spec.ts - -user.service.spec.ts + +user.service.spec.ts @@ -2935,1231 +2955,1225 @@ src/app/core/services/user.service.ts - -user.service.ts + +user.service.ts src/app/core/services/user.service.spec.ts->src/app/core/services/user.service.ts - - + + src/app/features/about/about-routing.module.ts->src/app/features/about/about.component.ts - - + + src/app/features/about/about.component.spec.ts - -about.component.spec.ts + +about.component.spec.ts src/app/features/about/about.component.spec.ts->src/app/features/about/about.component.ts - - + + src/app/features/blog/blog.component.ts - -blog.component.ts + +blog.component.ts src/app/features/blog/blog-routing.module.ts->src/app/features/blog/blog.component.ts - - + + src/app/features/blog/blog.component.spec.ts - -blog.component.spec.ts + +blog.component.spec.ts src/app/features/blog/blog.component.spec.ts->src/app/features/blog/blog.component.ts - - + + src/app/features/bookmarks/bookmarks.component.ts - -bookmarks.component.ts + +bookmarks.component.ts src/app/features/bookmarks/bookmarks-routing.module.ts->src/app/features/bookmarks/bookmarks.component.ts - - + + src/app/features/bookmarks/bookmarks.component.spec.ts - -bookmarks.component.spec.ts + +bookmarks.component.spec.ts src/app/features/bookmarks/bookmarks.component.spec.ts->src/app/features/bookmarks/bookmarks.component.ts - - + + src/app/features/dashboard/dashboard.component.ts - -dashboard.component.ts + +dashboard.component.ts src/app/features/dashboard/dashboard-routing.module.ts->src/app/features/dashboard/dashboard.component.ts - - + + src/app/features/dashboard/dashboard.component.spec.ts - -dashboard.component.spec.ts + +dashboard.component.spec.ts src/app/features/dashboard/dashboard.component.spec.ts->src/app/features/dashboard/dashboard.component.ts - - + + src/app/features/events/components/event-card/event-card.component.spec.ts - -event-card.component.spec.ts + +event-card.component.spec.ts src/app/features/events/components/event-card/event-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/features/events/components/event-card/event-card.component.spec.ts->src/app/features/events/components/event-card/event-card.component.ts - - + + src/app/features/events/components/event-card/event-card.component.ts->src/app/core/constants/routes.constants.ts - - + + src/app/features/events/components/event-card/event-card.component.ts->src/app/core/services/translations.service.ts - - + + src/app/features/events/components/event-card/event-card.component.ts->src/app/features/events/models/event.ts - - + + src/app/shared/models/material-button-type.ts - -material-button-type.ts + +material-button-type.ts src/app/features/events/components/event-card/event-card.component.ts->src/app/shared/models/material-button-type.ts - - + + src/app/shared/models/tooltip-direction.ts - -tooltip-direction.ts + +tooltip-direction.ts src/app/features/events/components/event-card/event-card.component.ts->src/app/shared/models/tooltip-direction.ts - - + + src/app/features/events/components/event-list/event-list.component.spec.ts - -event-list.component.spec.ts + +event-list.component.spec.ts src/app/features/events/components/event-list/event-list.component.spec.ts->src/app/features/events/components/event-list/event-list.component.ts - - + + src/app/features/events/components/event-list/event-list.component.ts->src/app/features/events/models/event.ts - - + + src/app/features/events/components/event/event.component.spec.ts - -event.component.spec.ts + +event.component.spec.ts src/app/features/events/components/event/event.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/features/events/components/event/event.component.spec.ts->src/app/features/events/components/event/event.component.ts - - + + src/app/features/events/components/event/event.component.ts->src/app/core/constants/routes.constants.ts - - + + src/app/features/events/components/event/event.component.ts->src/app/core/services/translations.service.ts - - + + src/app/features/events/components/event/event.component.ts->src/app/core/services/event.service.ts - - + + src/app/features/events/components/event/event.component.ts->src/app/features/events/models/event.ts - - + + src/app/features/events/components/event/event.component.ts->src/app/shared/models/material-button-type.ts - - + + src/app/features/events/components/event/event.component.ts->src/app/shared/models/tooltip-direction.ts - - + + src/app/features/events/components/event/event.component.ts->src/app/shared/components/banner/banner.component.ts - - + + src/app/shared/models/input-type.ts - -input-type.ts + +input-type.ts src/app/features/events/components/event/event.component.ts->src/app/shared/models/input-type.ts - - + + src/app/features/events/events-routing.module.ts->src/app/core/services/translations.service.ts - - + + src/app/features/events/events-routing.module.ts->src/app/features/events/events.component.ts - - + + src/app/features/events/events-routing.module.ts->src/app/features/events/components/event/event.component.ts - - + + src/app/features/events/events.component.spec.ts - -events.component.spec.ts + +events.component.spec.ts src/app/features/events/events.component.spec.ts->src/app/features/events/events.component.ts - - + + src/app/features/events/resolvers/event.resolver.ts - -event.resolver.ts + +event.resolver.ts src/app/features/events/resolvers/event.resolver.ts->src/app/core/services/event.service.ts - - + + src/app/features/events/resolvers/event.resolver.ts->src/app/features/events/models/event.ts - - + + src/app/features/friends/friends.component.ts - -friends.component.ts + +friends.component.ts src/app/features/friends/friends-routing.module.ts->src/app/features/friends/friends.component.ts - - + + src/app/features/friends/friends.component.spec.ts - -friends.component.spec.ts + +friends.component.spec.ts src/app/features/friends/friends.component.spec.ts->src/app/features/friends/friends.component.ts - - + + src/app/features/groups/components/group-card/group-card.component.spec.ts - -group-card.component.spec.ts + +group-card.component.spec.ts src/app/features/groups/components/group-card/group-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/features/groups/components/group-card/group-card.component.spec.ts->src/app/features/groups/components/group-card/group-card.component.ts - - + + src/app/features/groups/components/group-card/group-card.component.ts->src/app/core/constants/routes.constants.ts - - + + src/app/features/groups/components/group-card/group-card.component.ts->src/app/core/services/translations.service.ts - - + + src/app/features/groups/components/group-card/group-card.component.ts->src/app/features/groups/models/group.ts - - + + src/app/features/groups/components/group-list/group-list.component.spec.ts - -group-list.component.spec.ts + +group-list.component.spec.ts src/app/features/groups/components/group-list/group-list.component.spec.ts->src/app/features/groups/components/group-list/group-list.component.ts - - + + src/app/features/groups/components/group-list/group-list.component.ts->src/app/features/groups/models/group.ts - - + + src/app/features/groups/components/group/group.component.spec.ts - -group.component.spec.ts + +group.component.spec.ts src/app/features/groups/components/group/group.component.spec.ts->src/app/features/groups/components/group/group.component.ts - - + + src/app/features/groups/groups-routing.module.ts->src/app/core/services/translations.service.ts - - + + src/app/features/groups/groups-routing.module.ts->src/app/features/groups/groups.component.ts - - + + src/app/features/groups/groups-routing.module.ts->src/app/features/groups/components/group/group.component.ts - - + + src/app/features/groups/groups.component.spec.ts - -groups.component.spec.ts + +groups.component.spec.ts src/app/features/groups/groups.component.spec.ts->src/app/features/groups/groups.component.ts - - + + src/app/features/home/home-routing.module.ts->src/app/features/home/home.component.ts - - + + src/app/features/home/home.component.ts->src/app/core/constants/routes.constants.ts - - + + src/app/features/home/home.component.ts->src/app/core/services/translations.service.ts - - + + src/app/features/home/home.component.ts->src/app/core/models/person.model.ts - - + + src/app/features/home/home.component.ts->src/app/features/news-feed/models/INewsItem.ts - - + + src/app/features/home/home.component.ts->src/app/core/services/event.service.ts - - + + src/app/features/home/home.component.ts->src/app/core/services/group.service.ts - - + + src/app/features/home/home.component.ts->src/app/core/services/people.service.ts - - + + src/app/features/home/home.component.ts->src/app/features/events/models/event.ts - - + + src/app/features/home/home.component.ts->src/app/features/groups/models/group.ts - - + + src/app/features/home/home.component.ts->src/app/core/services/news.service.ts - - + + src/app/features/home/home.component.ts->src/app/shared/models/input-type.ts - - + + src/app/features/home/home.component.spec.ts - -home.component.spec.ts + +home.component.spec.ts src/app/features/home/home.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/features/home/home.component.spec.ts->src/app/features/home/home.component.ts - - + + src/app/features/invite/invite.component.ts - -invite.component.ts + +invite.component.ts src/app/features/invite/invite-routing.module.ts->src/app/features/invite/invite.component.ts - - + + src/app/features/invite/invite.component.spec.ts - -invite.component.spec.ts + +invite.component.spec.ts src/app/features/invite/invite.component.spec.ts->src/app/features/invite/invite.component.ts - - + + src/app/features/login/login-routing.module.ts->src/app/features/login/login.component.ts - - + + src/app/features/login/login.component.ts->src/app/core/services/translations.service.ts - - + + src/app/features/login/login.component.spec.ts - -login.component.spec.ts + +login.component.spec.ts src/app/features/login/login.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/features/login/login.component.spec.ts->src/app/features/login/login.component.ts - - + + src/app/features/members/members.component.ts - -members.component.ts + +members.component.ts src/app/features/members/members-routing.module.ts->src/app/features/members/members.component.ts - - + + src/app/features/members/members.component.spec.ts - -members.component.spec.ts + +members.component.spec.ts src/app/features/members/members.component.spec.ts->src/app/features/members/members.component.ts - - + + src/app/features/messages/messages.component.ts - -messages.component.ts + +messages.component.ts src/app/features/messages/messages-routing.module.ts->src/app/features/messages/messages.component.ts - - + + src/app/features/messages/messages.component.spec.ts - -messages.component.spec.ts + +messages.component.spec.ts src/app/features/messages/messages.component.spec.ts->src/app/features/messages/messages.component.ts - - + + src/app/features/missions/missions.component.ts - -missions.component.ts + +missions.component.ts src/app/features/missions/missions-routing.module.ts->src/app/features/missions/missions.component.ts - - + + src/app/features/missions/missions.component.spec.ts - -missions.component.spec.ts + +missions.component.spec.ts src/app/features/missions/missions.component.spec.ts->src/app/features/missions/missions.component.ts - - + + src/app/features/news-feed/components/news-card/news-card.component.spec.ts - -news-card.component.spec.ts + +news-card.component.spec.ts src/app/features/news-feed/components/news-card/news-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/features/news-feed/components/news-card/news-card.component.spec.ts->src/app/features/news-feed/components/news-card/news-card.component.ts - - + + src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/core/services/translations.service.ts - - + + src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/core/models/blog.model.ts - - + + src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/features/news-feed/models/INewsItem.ts - - + + src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/core/models/poll.model.ts - - + + src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/core/models/post.model.ts - - + + src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/shared/models/material-button-type.ts - - + + src/app/features/news-feed/components/news-list/news-list.component.spec.ts - -news-list.component.spec.ts + +news-list.component.spec.ts src/app/features/news-feed/components/news-list/news-list.component.spec.ts->src/app/features/news-feed/components/news-list/news-list.component.ts - - + + src/app/features/news-feed/components/news-list/news-list.component.ts->src/app/features/news-feed/models/INewsItem.ts - - + + src/app/features/news-feed/news-feed.component.ts - -news-feed.component.ts + +news-feed.component.ts src/app/features/news-feed/news-feed-routing.module.ts->src/app/features/news-feed/news-feed.component.ts - - + + src/app/features/news-feed/news-feed.component.spec.ts - -news-feed.component.spec.ts + +news-feed.component.spec.ts src/app/features/news-feed/news-feed.component.spec.ts->src/app/features/news-feed/news-feed.component.ts - - + + src/app/features/privacy/privacy-routing.module.ts->src/app/features/privacy/privacy.component.ts - - + + src/app/features/privacy/privacy.component.spec.ts - -privacy.component.spec.ts + +privacy.component.spec.ts src/app/features/privacy/privacy.component.spec.ts->src/app/features/privacy/privacy.component.ts - - + + src/app/features/profile/components/post/post.component.spec.ts - -post.component.spec.ts + +post.component.spec.ts src/app/features/profile/components/post/post.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/features/profile/components/post/post.component.spec.ts->src/app/features/profile/components/post/post.component.ts - - + + src/app/features/profile/components/post/post.component.ts->src/app/core/services/translations.service.ts - - + + src/app/features/profile/components/post/post.component.ts->src/app/core/services/session-storage.service.ts - - + + src/app/features/profile/components/post/post.component.ts->src/app/core/models/person.model.ts - - + + src/app/features/profile/components/profile-card/profile-card.component.spec.ts - -profile-card.component.spec.ts + +profile-card.component.spec.ts src/app/features/profile/components/profile-card/profile-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/features/profile/components/profile-card/profile-card.component.spec.ts->src/app/features/profile/components/profile-card/profile-card.component.ts - - + + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/core/constants/routes.constants.ts - - + + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/core/services/translations.service.ts - - + + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/core/models/person.model.ts - - + + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/shared/models/material-button-type.ts - - + + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/shared/models/tooltip-direction.ts - - + + src/app/features/profile/components/profile-list/profile-list.component.spec.ts - -profile-list.component.spec.ts + +profile-list.component.spec.ts src/app/features/profile/components/profile-list/profile-list.component.spec.ts->src/app/features/profile/components/profile-list/profile-list.component.ts - - + + src/app/features/profile/components/profile-list/profile-list.component.ts->src/app/core/models/person.model.ts - - + + src/app/features/profile/profile.component.ts - -profile.component.ts + +profile.component.ts src/app/features/profile/profile-routing.module.ts->src/app/features/profile/profile.component.ts - - + + src/app/features/profile/profile.component.spec.ts - -profile.component.spec.ts + +profile.component.spec.ts src/app/features/profile/profile.component.spec.ts->src/app/features/profile/profile.component.ts - - + + src/app/features/register/register-routing.module.ts->src/app/features/register/register.component.ts - - + + src/app/features/register/register.component.spec.ts - -register.component.spec.ts + +register.component.spec.ts src/app/features/register/register.component.spec.ts->src/app/features/register/register.component.ts - - + + src/app/features/search/search.component.ts - -search.component.ts + +search.component.ts src/app/features/search/search-routing.module.ts->src/app/features/search/search.component.ts - - + + src/app/features/search/search.component.spec.ts - -search.component.spec.ts + +search.component.spec.ts src/app/features/search/search.component.spec.ts->src/app/features/search/search.component.ts - - + + src/app/features/settings/settings.component.ts - -settings.component.ts + +settings.component.ts src/app/features/settings/settings-routing.module.ts->src/app/features/settings/settings.component.ts - - + + src/app/features/settings/settings.component.spec.ts - -settings.component.spec.ts + +settings.component.spec.ts src/app/features/settings/settings.component.spec.ts->src/app/features/settings/settings.component.ts - - + + src/app/features/splash/splash-routing.module.ts->src/app/features/splash/splash.component.ts - - + + src/app/features/splash/splash.component.spec.ts - -splash.component.spec.ts + +splash.component.spec.ts src/app/features/splash/splash.component.spec.ts->src/app/features/splash/splash.component.ts - - + + src/app/features/stats/stats-routing.module.ts->src/app/features/stats/stats.component.ts - - + + src/app/features/stats/stats.component.spec.ts - -stats.component.spec.ts + +stats.component.spec.ts src/app/features/stats/stats.component.spec.ts->src/app/features/stats/stats.component.ts - - + + src/app/features/terms/terms-routing.module.ts->src/app/features/terms/terms.component.ts - - + + src/app/features/terms/terms.component.spec.ts - -terms.component.spec.ts + +terms.component.spec.ts src/app/features/terms/terms.component.spec.ts->src/app/features/terms/terms.component.ts - - + + src/app/features/the-wire/the-wire.component.ts - -the-wire.component.ts + +the-wire.component.ts src/app/features/the-wire/the-wire-routing.module.ts->src/app/features/the-wire/the-wire.component.ts - - + + src/app/features/the-wire/the-wire.component.spec.ts - -the-wire.component.spec.ts + +the-wire.component.spec.ts src/app/features/the-wire/the-wire.component.spec.ts->src/app/features/the-wire/the-wire.component.ts - - + + src/app/shared/components/banner/banner.component.spec.ts - -banner.component.spec.ts + +banner.component.spec.ts src/app/shared/components/banner/banner.component.spec.ts->src/app/shared/components/banner/banner.component.ts - - + + src/app/shared/components/blog-form/blog-form.component.spec.ts - -blog-form.component.spec.ts + +blog-form.component.spec.ts src/app/shared/components/blog-form/blog-form.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/shared/components/blog-form/blog-form.component.spec.ts->src/app/shared/pipes/truncate-file-name.pipe.ts - - + + src/app/shared/components/blog-form/blog-form.component.spec.ts->src/app/shared/components/blog-form/blog-form.component.ts - - + + - -src/app/shared/components/blog-form/blog-form.component.ts->src/app/core/services/translations.service.ts - - - - -src/app/shared/components/blog-form/blog-form.component.ts->src/app/core/services/focus-tracking.service.ts - - +src/app/shared/components/blog-form/blog-form.component.ts->src/app/core/services/translations.service.ts + + @@ -4171,67 +4185,67 @@ - + src/app/shared/components/button/button.component.spec.ts->src/app/shared/components/button/button.component.ts - + src/app/shared/components/button/button.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/shared/components/button/button.component.ts->src/app/shared/models/tooltip-direction.ts - - + + src/app/shared/models/button-type.ts - -button-type.ts + +button-type.ts - + src/app/shared/components/button/button.component.ts->src/app/shared/models/button-type.ts - - + + src/app/shared/models/material-color.ts - -material-color.ts + +material-color.ts - + src/app/shared/components/button/button.component.ts->src/app/shared/models/material-color.ts - - + + src/app/shared/models/theme.ts - -theme.ts + +theme.ts - + src/app/shared/components/button/button.component.ts->src/app/shared/models/theme.ts - - + + @@ -4243,521 +4257,578 @@ - + src/app/shared/components/calendar-button/calendar-button.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/calendar-button/calendar-button.component.spec.ts->src/app/shared/components/calendar-button/calendar-button.component.ts - + src/app/shared/components/calendar-button/calendar-button.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/calendar-button/calendar-button.component.ts->src/app/shared/models/tooltip-direction.ts - - + + src/app/shared/components/editor/editor.component.spec.ts - -editor.component.spec.ts + +editor.component.spec.ts - + src/app/shared/components/editor/editor.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/editor/editor.component.spec.ts->src/app/shared/components/editor/editor.component.ts - - + + - + src/app/shared/components/editor/editor.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/editor/editor.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/shared/components/editor/editor.component.ts->src/app/shared/factories/editor-config.factory.ts - - + + - + src/app/shared/factories/editor-config.factory.ts->src/app/core/services/translations.service.ts - - + + src/app/shared/components/event-form/event-form.component.spec.ts - -event-form.component.spec.ts + +event-form.component.spec.ts - + src/app/shared/components/event-form/event-form.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/event-form/event-form.component.spec.ts->src/app/shared/components/event-form/event-form.component.ts - - + + - + src/app/shared/components/event-form/event-form.component.ts->src/app/core/services/translations.service.ts - - + + - + +src/app/shared/components/file-select/file-select.component.spec.ts + + +file-select.component.spec.ts + + + + + +src/app/shared/components/file-select/file-select.component.spec.ts->src/app/core/helpers/typescript-loader.ts + + + + + +src/app/shared/components/file-select/file-select.component.spec.ts->src/app/shared/pipes/truncate-file-name.pipe.ts + + + + + +src/app/shared/components/file-select/file-select.component.spec.ts->src/app/shared/components/file-select/file-select.component.ts + + + + + +src/app/shared/components/file-select/file-select.component.ts->src/app/core/services/translations.service.ts + + + + + +src/app/shared/components/file-select/file-select.component.ts->src/app/core/services/focus-tracking.service.ts + + + + + +src/app/shared/components/file-select/file-select.component.ts->src/app/shared/models/tooltip-direction.ts + + + + + +src/app/shared/components/file-select/file-select.component.ts->src/app/shared/models/theme.ts + + + + + src/app/shared/components/footer/footer.component.spec.ts - - -footer.component.spec.ts + + +footer.component.spec.ts - + src/app/shared/components/footer/footer.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/footer/footer.component.spec.ts->src/app/shared/components/footer/footer.component.ts - - + + - + src/app/shared/components/footer/footer.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/shared/components/footer/footer.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/forbidden/forbidden.component.spec.ts - + forbidden.component.spec.ts - + src/app/shared/components/forbidden/forbidden.component.spec.ts->src/app/shared/components/forbidden/forbidden.component.ts - + src/app/shared/components/header/header.component.spec.ts - - -header.component.spec.ts + + +header.component.spec.ts - + src/app/shared/components/header/header.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/header/header.component.spec.ts->src/app/shared/components/header/header.component.ts - - + + - + src/app/shared/components/header/header.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/shared/components/header/header.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/header/header.component.ts->src/app/core/models/person.model.ts - - + + - + src/app/shared/components/header/header.component.ts->src/app/core/services/people.service.ts - - + + - + src/app/shared/components/header/header.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/shared/components/input/input.component.spec.ts - - -input.component.spec.ts + + +input.component.spec.ts - + src/app/shared/components/input/input.component.spec.ts->src/app/shared/components/input/input.component.ts - - + + - + src/app/shared/components/input/input.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/input/input.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/shared/components/input/input.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/shared/components/input/input.component.ts->src/app/shared/models/input-type.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.spec.ts - - -language-selector.component.spec.ts + + +language-selector.component.spec.ts - + src/app/shared/components/language-selector/language-selector.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.spec.ts->src/app/shared/components/language-selector/language-selector.component.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.ts->src/app/shared/models/material-button-type.ts - - + + + + + +src/app/shared/components/language-selector/language-selector.component.ts->src/app/shared/models/theme.ts + + - + src/app/shared/models/language.ts - - -language.ts + + +language.ts - + src/app/shared/components/language-selector/language-selector.component.ts->src/app/shared/models/language.ts - - + + - + src/app/shared/components/not-found/not-found.component.spec.ts - + not-found.component.spec.ts - + src/app/shared/components/not-found/not-found.component.spec.ts->src/app/shared/components/not-found/not-found.component.ts - + src/app/shared/components/page-title/page-title.component.spec.ts - - -page-title.component.spec.ts + + +page-title.component.spec.ts - + src/app/shared/components/page-title/page-title.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/page-title/page-title.component.spec.ts->src/app/shared/components/page-title/page-title.component.ts - - + + - + src/app/shared/components/poll-form/poll-form.component.spec.ts - - -poll-form.component.spec.ts + + +poll-form.component.spec.ts - + src/app/shared/components/poll-form/poll-form.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/poll-form/poll-form.component.spec.ts->src/app/shared/components/poll-form/poll-form.component.ts - - + + - + src/app/shared/components/poll-form/poll-form.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/poll-form/poll-form.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/shared/components/post-form/post-form.component.spec.ts - - -post-form.component.spec.ts + + +post-form.component.spec.ts - + src/app/shared/components/post-form/post-form.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/post-form/post-form.component.spec.ts->src/app/shared/components/post-form/post-form.component.ts - - + + - + src/app/shared/components/post-form/post-form.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.spec.ts - - -profile-pic.component.spec.ts + + +profile-pic.component.spec.ts - + src/app/shared/components/profile-pic/profile-pic.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.spec.ts->src/app/shared/components/profile-pic/profile-pic.component.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.ts->src/app/core/models/person.model.ts - - + + - + src/app/shared/components/unauthorized/unauthorized.component.spec.ts - + unauthorized.component.spec.ts - + src/app/shared/components/unauthorized/unauthorized.component.spec.ts->src/app/shared/components/unauthorized/unauthorized.component.ts - + src/app/shared/pipes/truncate-file-name.pipe.spec.ts - - -truncate-file-name.pipe.spec.ts + + +truncate-file-name.pipe.spec.ts - + src/app/shared/pipes/truncate-file-name.pipe.spec.ts->src/app/shared/pipes/truncate-file-name.pipe.ts - - + + - + src/assets/i18n/translations.fr.ts - - -translations.fr.ts + + +translations.fr.ts - + src/assets/i18n/translations.fr.ts->src/assets/i18n/translations.en.ts - - + + - + src/environments/environment.pr.ts - + environment.pr.ts - + src/environments/environment.prod.ts - + environment.prod.ts - + src/main.ts - - -main.ts + + +main.ts - + src/main.ts->src/app/app.module.ts - - + + - + src/main.ts->src/environments/environment.ts - + - + src/polyfills.ts - - -polyfills.ts + + +polyfills.ts - + src/test.ts - - -test.ts + + +test.ts From ffab4743f8ff87df8088f8d4b794a310ce7e93ea Mon Sep 17 00:00:00 2001 From: doug0102 Date: Fri, 3 Nov 2023 09:05:05 -0400 Subject: [PATCH 067/165] minor --- src/app/features/profile/components/post/post.component.html | 3 ++- .../shared/components/file-select/file-select.component.html | 4 ++-- .../shared/components/file-select/file-select.component.ts | 4 +--- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/app/features/profile/components/post/post.component.html b/src/app/features/profile/components/post/post.component.html index db3c1d15..6a4c606a 100644 --- a/src/app/features/profile/components/post/post.component.html +++ b/src/app/features/profile/components/post/post.component.html @@ -38,7 +38,8 @@ class="gcc-cancel-editing" [matButtonType]="'mat-icon-button'" (click)="toggleEditing($event)" - [disabled]="creating"> + [disabled]="creating" + [theme]="creating ? 'disabled' : 'primary-1'"> diff --git a/src/app/shared/components/file-select/file-select.component.html b/src/app/shared/components/file-select/file-select.component.html index cec2f661..5f1402f2 100644 --- a/src/app/shared/components/file-select/file-select.component.html +++ b/src/app/shared/components/file-select/file-select.component.html @@ -15,7 +15,7 @@ [theme]="theme"> {{ control && control.value ? (photoName ? (photoName | truncateFileName: 18) : translations.forms.saved_image | translate) : label }} - * + * @@ -26,7 +26,7 @@ [disabled]="control ? control.disabled : false" [theme]="theme"> - * + * diff --git a/src/app/shared/components/file-select/file-select.component.ts b/src/app/shared/components/file-select/file-select.component.ts index f77f1761..98468fb8 100644 --- a/src/app/shared/components/file-select/file-select.component.ts +++ b/src/app/shared/components/file-select/file-select.component.ts @@ -40,8 +40,8 @@ export class FileSelectComponent { error: string | undefined; photoName: string = ''; - required: boolean = false; FileSelectView = FileSelectView; + requiredValidator = Validators.required; private filePickerHasOpened: boolean = false; private appInFocus: boolean = true; @@ -86,8 +86,6 @@ export class FileSelectComponent { this.control.markAsTouched(); } }); - - this.required = this.control.hasValidator(Validators.required); } ngOnDestroy(): void { From c8b21063f6789d8173220e7dcd249fcff3135d9e Mon Sep 17 00:00:00 2001 From: doug0102 Date: Fri, 3 Nov 2023 13:46:48 -0400 Subject: [PATCH 068/165] minor --- .../events/components/event/event.component.html | 4 ---- .../shared/components/input/input.component.html | 3 --- .../shared/components/input/input.component.scss | 16 ++++++++++++++++ .../shared/components/input/input.component.ts | 6 +----- .../poll-form/poll-form.component.html | 7 +++---- 5 files changed, 20 insertions(+), 16 deletions(-) diff --git a/src/app/features/events/components/event/event.component.html b/src/app/features/events/components/event/event.component.html index 3b922e1b..45d1b3ea 100644 --- a/src/app/features/events/components/event/event.component.html +++ b/src/app/features/events/components/event/event.component.html @@ -133,7 +133,6 @@

{{ translations.event.event_registration | translate }}

[name]="'fullName'" [label]="translations.event.form.full_name | translate" [placeholder]="translations.event.form.placeholder | translate" - [errorMessage]="translations.event.form.full_name_error | translate" [required]="true" [control]="nameFormControl" [errorMatcher]="matcher" @@ -147,7 +146,6 @@

{{ translations.event.event_registration | translate }}

[type]="'email'" [label]="translations.event.form.email | translate" [placeholder]="translations.event.form.placeholder | translate" - [errorMessage]="translations.event.form.email_error | translate" [required]="true" [control]="emailFormControl" [errorMatcher]="matcher" @@ -161,7 +159,6 @@

{{ translations.event.event_registration | translate }}

[type]="'email'" [label]="translations.event.form.email_confirm | translate" [placeholder]="translations.event.form.placeholder | translate" - [errorMessage]="translations.event.form.email_confirm_error | translate" [required]="true" [control]="emailConfirmFormControl" [errorMatcher]="matcher" @@ -174,7 +171,6 @@

{{ translations.event.event_registration | translate }}

[name]="'occupation'" [label]="translations.event.form.occupation | translate" [placeholder]="translations.event.form.placeholder | translate" - [errorMessage]="translations.event.form.occupation_error | translate" [hint]="translations.event.form.occupation_hint | translate" [required]="true" [control]="occupationFormControl" diff --git a/src/app/shared/components/input/input.component.html b/src/app/shared/components/input/input.component.html index 769753d7..e1982392 100644 --- a/src/app/shared/components/input/input.component.html +++ b/src/app/shared/components/input/input.component.html @@ -21,9 +21,6 @@ [value]="value" [type]="type === inputType.Password ? (showPassword ? inputType.Text : type) : type" [placeholder]="placeholder" - [attr.minLength]="minLength" - [attr.maxLength]="maxLength" - [attr.pattern]="pattern" [required]="required" [disabled]="disabled" [readonly]="readonly" diff --git a/src/app/shared/components/input/input.component.scss b/src/app/shared/components/input/input.component.scss index ad13cd34..32a02a5c 100644 --- a/src/app/shared/components/input/input.component.scss +++ b/src/app/shared/components/input/input.component.scss @@ -59,6 +59,18 @@ mat-form-field { } } +mat-form-field.mat-focused { + .gcc-input-icon { + color: $primary-1; + } +} + +mat-form-field.mat-form-field-invalid { + .gcc-input-icon { + color: $error-red; + } +} + .hint-button { //margin-left: -20px; @@ -123,6 +135,10 @@ mat-hint { border-color: $error-red !important; } } + + .mdc-notched-outline__leading { + margin-right: -1px; + } input:-webkit-autofill, input:-webkit-autofill:hover, diff --git a/src/app/shared/components/input/input.component.ts b/src/app/shared/components/input/input.component.ts index f49592e8..b0036664 100644 --- a/src/app/shared/components/input/input.component.ts +++ b/src/app/shared/components/input/input.component.ts @@ -29,14 +29,10 @@ export class InputComponent implements ControlValueAccessor { @Input() controlName!: string; @Input() errorMatcher!: ErrorStateMatcher; - @Input({required:true}) value!: string; + @Input() value!: string; @Input({required:true}) label!: string; @Input() placeholder!: string; @Input() hint!: string; - @Input() errorMessage!: string; - @Input() maxLength!: number; - @Input() minLength!: number; - @Input() pattern!: string; @Input() icon!: string; @Input() required: boolean = false; diff --git a/src/app/shared/components/poll-form/poll-form.component.html b/src/app/shared/components/poll-form/poll-form.component.html index 97b3dbb3..5d9cf737 100644 --- a/src/app/shared/components/poll-form/poll-form.component.html +++ b/src/app/shared/components/poll-form/poll-form.component.html @@ -11,8 +11,7 @@
- @@ -34,6 +32,7 @@
{{ translations.forms.poll.option_add | translate }} From 5617e7b1198a1d9fded7be898b4be99a93908581 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Tue, 7 Nov 2023 11:24:42 -0500 Subject: [PATCH 069/165] editor validator fix --- .../components/event/event.component.html | 1 + .../blog-form/blog-form.component.ts | 6 ++- .../components/editor/editor.component.html | 6 +-- .../components/editor/editor.component.ts | 39 ++++--------------- .../event-form/event-form.component.html | 2 +- .../event-form/event-form.component.ts | 7 +++- .../poll-form/poll-form.component.ts | 6 +-- .../post-form/post-form.component.html | 8 ++-- .../post-form/post-form.component.ts | 5 ++- 9 files changed, 34 insertions(+), 46 deletions(-) diff --git a/src/app/features/events/components/event/event.component.html b/src/app/features/events/components/event/event.component.html index 45d1b3ea..391950ef 100644 --- a/src/app/features/events/components/event/event.component.html +++ b/src/app/features/events/components/event/event.component.html @@ -55,6 +55,7 @@

class="registerBtn" [disabled]="loading || isPast()" [ngClass]="loading || isPast() ? 'disabled' : 'enabled'" + theme="secondary-2" (click)="scrollToRegister()"> {{ translations.event.form.register | translate }} diff --git a/src/app/shared/components/blog-form/blog-form.component.ts b/src/app/shared/components/blog-form/blog-form.component.ts index d429f343..0d250776 100644 --- a/src/app/shared/components/blog-form/blog-form.component.ts +++ b/src/app/shared/components/blog-form/blog-form.component.ts @@ -3,6 +3,7 @@ import { FormControl, FormGroup, FormGroupDirective, NgForm, Validators } from ' import { ErrorStateMatcher } from '@angular/material/core'; import { TranslateService } from '@ngx-translate/core'; import { Translations } from 'src/app/core/services/translations.service'; +import { Validators as EditorValidators } from 'ngx-editor'; @Component({ selector: 'app-blog-form', @@ -31,7 +32,10 @@ export class BlogFormComponent implements OnInit, OnDestroy { ngOnInit(): void { for (const [key, value] of Object.entries(this.model)) { if (!this.form.controls[key]) { - this.form.addControl(key, new FormControl(value, [Validators.required])); + if (key == 'description') + this.form.addControl(key, new FormControl(value, [EditorValidators.required(), EditorValidators.maxLength(this.maxBlogLength)])); + else + this.form.addControl(key, new FormControl(value, [Validators.required])); } else { this.form.controls[key].setValue(value); console.warn('Duplicate FormControl detected.'); diff --git a/src/app/shared/components/editor/editor.component.html b/src/app/shared/components/editor/editor.component.html index 73d95c77..29b14db5 100644 --- a/src/app/shared/components/editor/editor.component.html +++ b/src/app/shared/components/editor/editor.component.html @@ -12,7 +12,7 @@
+ [ngClass]="{focus: hasFocus, error: control && control.touched && !control.valid}">
{{ characterCount }} / {{ maxCharacters }}
@@ -47,7 +47,7 @@ {{ translations.input.error.maxLength | translate }} {{ control.errors!['maxlength'].requiredLength }}. - + {{ label }} {{ translations.input.error.required | translate }} diff --git a/src/app/shared/components/editor/editor.component.ts b/src/app/shared/components/editor/editor.component.ts index 27516ae7..75673269 100644 --- a/src/app/shared/components/editor/editor.component.ts +++ b/src/app/shared/components/editor/editor.component.ts @@ -4,7 +4,7 @@ import { Editor, NgxEditorService, Toolbar } from 'ngx-editor'; import { ngxEditorLocals } from '../../factories/editor-config.factory'; import { Subscription } from 'rxjs/internal/Subscription'; import { Translations } from 'src/app/core/services/translations.service'; -import { ControlValueAccessor, FormControl, NG_VALUE_ACCESSOR, Validators } from '@angular/forms'; +import { ControlValueAccessor, FormControl, NG_VALUE_ACCESSOR } from '@angular/forms'; import { TooltipDirection } from '../../models/tooltip-direction'; // https://sibiraj-s.github.io/ngx-editor/en/introduction/ @@ -27,10 +27,10 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit, AfterC @Input() label!: string; @Input() hint!: string; @Input() autofocus: boolean = false; - @Input() minCharacters: number = 0; - @Input() maxCharacters: number = Number.MAX_VALUE; @Input() control!: FormControl; @Input() controlName!: string; + @Input() minCharacters: number = 0; + @Input() maxCharacters: number = Number.MAX_VALUE; @Output() htmlChange = new EventEmitter(); @@ -92,14 +92,9 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit, AfterC } } - // TODO: Handle min/max ngAfterContentInit(): void { - if (this.control && this.control.hasValidator(Validators.required)) { - this.control.removeValidators([Validators.required]); - this.control.clearValidators(); - this.control.updateValueAndValidity(); - this.hasRequiredValidator = true; - } + if (this.control && this.html != '') + this.updateCharacterCount(this.html); } ngAfterViewInit() { @@ -111,12 +106,8 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit, AfterC if (classList) { this.hasFocus = Array.from(classList).includes('ProseMirror-focused') ? true : false; - // TODO - if (!this.hasFocus && this.control && !this.control.hasValidator(Validators.required) && this.hasRequiredValidator) { - this.control.addValidators([Validators.required]); - this.control.updateValueAndValidity(); - this.updateCharacterCount(this.html); - } + if (this.control && !this.hasFocus) + this.control.markAsTouched(); } }); }); @@ -151,22 +142,8 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit, AfterC this.onInputChange(this.html); } - if (this.control) { - if (this.characterCount > this.maxCharacters){ - this.control.setErrors({ - maxlength: { - requiredLength: this.maxCharacters - } - }); - } else if (this.characterCount < this.minCharacters) { - this.control.setErrors({ - minlength: { - requiredLength: this.minCharacters - } - }); - } + if (this.control) this.control.markAsTouched(); - } } onLangChange(): void { diff --git a/src/app/shared/components/event-form/event-form.component.html b/src/app/shared/components/event-form/event-form.component.html index b5abfd27..9660217a 100644 --- a/src/app/shared/components/event-form/event-form.component.html +++ b/src/app/shared/components/event-form/event-form.component.html @@ -71,7 +71,7 @@ [hint]="translations.forms.event.body_hint | translate" [(html)]="model.eventDescription" [required]="true" - [maxCharacters]="240" + [maxCharacters]="maxCharacters" formControlName="eventDescription" [control]="$any(form).controls['eventDescription']" [disabled]="disabled"> diff --git a/src/app/shared/components/event-form/event-form.component.ts b/src/app/shared/components/event-form/event-form.component.ts index cdf192a9..9a4f2515 100644 --- a/src/app/shared/components/event-form/event-form.component.ts +++ b/src/app/shared/components/event-form/event-form.component.ts @@ -3,6 +3,7 @@ import { FormControl, FormGroup, FormGroupDirective, NgForm, Validators } from ' import { ErrorStateMatcher } from '@angular/material/core'; import { TranslateService } from '@ngx-translate/core'; import { Translations } from 'src/app/core/services/translations.service'; +import { Validators as EditorValidators } from 'ngx-editor'; @Component({ selector: 'app-event-form', @@ -31,6 +32,7 @@ export class EventFormComponent implements OnInit, OnDestroy { eventLanguage = EventLanguage; eventDuration = EventDuration; errorStateMatcher = new MyErrorStateMatcher(); + maxCharacters = 240; constructor(public translations: Translations) { @@ -39,7 +41,10 @@ export class EventFormComponent implements OnInit, OnDestroy { ngOnInit(): void { for (const [key, value] of Object.entries(this.model)) { if (!this.form.controls[key]) { - this.form.addControl(key, new FormControl(value, [Validators.required])); + if (key == 'eventDescription') + this.form.addControl(key, new FormControl(value, [EditorValidators.required(), EditorValidators.maxLength(this.maxCharacters)])); + else + this.form.addControl(key, new FormControl(value, [Validators.required])); } else { this.form.controls[key].setValue(value); console.warn('Duplicate FormControl detected.'); diff --git a/src/app/shared/components/poll-form/poll-form.component.ts b/src/app/shared/components/poll-form/poll-form.component.ts index 6e675948..44f42478 100644 --- a/src/app/shared/components/poll-form/poll-form.component.ts +++ b/src/app/shared/components/poll-form/poll-form.component.ts @@ -4,6 +4,7 @@ import { FormControl, FormGroup, FormGroupDirective, NgForm, Validators } from ' import { ErrorStateMatcher } from '@angular/material/core'; import { TranslateService } from '@ngx-translate/core'; import { Translations } from 'src/app/core/services/translations.service'; +import { Validators as EditorValidators } from 'ngx-editor'; @Component({ selector: 'app-poll-form', @@ -38,9 +39,8 @@ export class PollFormComponent implements OnInit, OnDestroy { new FormControl( this.model.description, [ - Validators.required, - //Validators.minLength(this.minLength), - Validators.maxLength(this.maxLength), + EditorValidators.required(), + EditorValidators.maxLength(this.maxLength), ] ) ); diff --git a/src/app/shared/components/post-form/post-form.component.html b/src/app/shared/components/post-form/post-form.component.html index df97db16..43ad4122 100644 --- a/src/app/shared/components/post-form/post-form.component.html +++ b/src/app/shared/components/post-form/post-form.component.html @@ -2,11 +2,11 @@ + [minCharacters]="minLength" + [maxCharacters]="maxLength" + [disabled]="disabled" + [required]="true"> \ No newline at end of file diff --git a/src/app/shared/components/post-form/post-form.component.ts b/src/app/shared/components/post-form/post-form.component.ts index 9c5f85dd..449d81d9 100644 --- a/src/app/shared/components/post-form/post-form.component.ts +++ b/src/app/shared/components/post-form/post-form.component.ts @@ -1,7 +1,8 @@ import { Component, Input, OnDestroy, OnInit } from '@angular/core'; -import { FormControl, FormGroup, Validators } from '@angular/forms'; +import { FormControl, FormGroup } from '@angular/forms'; import { TranslateService } from '@ngx-translate/core'; import { Translations } from 'src/app/core/services/translations.service'; +import { Validators } from 'ngx-editor'; @Component({ selector: 'app-post-form', @@ -28,7 +29,7 @@ export class PostFormComponent implements OnInit, OnDestroy { new FormControl( this.model.description, [ - Validators.required, + Validators.required(), Validators.minLength(this.minLength), Validators.maxLength(this.maxLength), ] From e88dadc1f76a4e277dcbf007e9cbf9f597f30c6f Mon Sep 17 00:00:00 2001 From: doug0102 Date: Tue, 7 Nov 2023 14:22:21 -0500 Subject: [PATCH 070/165] themes for input component --- .../components/input/input.component.html | 2 +- .../components/input/input.component.scss | 135 +++++++++++++++--- .../components/input/input.component.ts | 2 + 3 files changed, 115 insertions(+), 24 deletions(-) diff --git a/src/app/shared/components/input/input.component.html b/src/app/shared/components/input/input.component.html index e1982392..28825ef2 100644 --- a/src/app/shared/components/input/input.component.html +++ b/src/app/shared/components/input/input.component.html @@ -1,4 +1,4 @@ -
+
{{ label }}
*
diff --git a/src/app/shared/components/input/input.component.scss b/src/app/shared/components/input/input.component.scss index 32a02a5c..88d6ca08 100644 --- a/src/app/shared/components/input/input.component.scss +++ b/src/app/shared/components/input/input.component.scss @@ -18,7 +18,6 @@ mat-label { i { margin-left: 5px; cursor: pointer; - color: $primary-1; } } @@ -52,16 +51,6 @@ mat-form-field { app-button { display: inline-flex; - - ::ng-deep button:focus { - color: $primary-1; - } - } -} - -mat-form-field.mat-focused { - .gcc-input-icon { - color: $primary-1; } } @@ -72,15 +61,9 @@ mat-form-field.mat-form-field-invalid { } .hint-button { - //margin-left: -20px; - ::ng-deep button { margin-top: -4px; } - - ::ng-deep button:focus { - color: $primary-1; - } } mat-hint { @@ -114,12 +97,6 @@ mat-hint { padding-right: 0 !important; } - .mat-focused { - .mdc-notched-outline__leading, .mdc-notched-outline__trailing { - border-color: $primary-1 !important; - } - } - .mat-mdc-text-field-wrapper.mdc-text-field--outlined .mat-mdc-form-field-infix { padding-top: 0; padding-bottom: 0; @@ -148,4 +125,116 @@ mat-hint { -webkit-text-fill-color: #000; box-shadow: inset 0 0 20px 20px white; } +} + +// THEMES +.gcc-input-wrapper.primary-1 { + mat-label i { + color: $primary-1; + } + mat-form-field { + app-button ::ng-deep button:focus { + color: $primary-1; + } + } + mat-form-field.mat-focused .gcc-input-icon { + color: $primary-1; + } + .hint-button ::ng-deep button:focus { + color: $primary-1; + } + + ::ng-deep .mat-focused { + .mdc-notched-outline__leading, .mdc-notched-outline__trailing { + border-color: $primary-1 !important; + } + } +} +.gcc-input-wrapper.primary-2 { + mat-label i { + color: $primary-2; + } + mat-form-field { + app-button ::ng-deep button:focus { + color: $primary-2; + } + } + mat-form-field.mat-focused .gcc-input-icon { + color: $primary-2; + } + .hint-button ::ng-deep button:focus { + color: $primary-2; + } + + ::ng-deep .mat-focused { + .mdc-notched-outline__leading, .mdc-notched-outline__trailing { + border-color: $primary-2 !important; + } + } +} +.gcc-input-wrapper.secondary-1 { + mat-label i { + color: $secondary-1; + } + mat-form-field { + app-button ::ng-deep button:focus { + color: $secondary-1; + } + } + mat-form-field.mat-focused .gcc-input-icon { + color: $secondary-1; + } + .hint-button ::ng-deep button:focus { + color: $secondary-1; + } + + ::ng-deep .mat-focused { + .mdc-notched-outline__leading, .mdc-notched-outline__trailing { + border-color: $secondary-1 !important; + } + } +} +.gcc-input-wrapper.secondary-2 { + mat-label i { + color: $secondary-2; + } + mat-form-field { + app-button ::ng-deep button:focus { + color: $secondary-2; + } + } + mat-form-field.mat-focused .gcc-input-icon { + color: $secondary-2; + } + .hint-button ::ng-deep button:focus { + color: $secondary-2; + } + + ::ng-deep .mat-focused { + .mdc-notched-outline__leading, .mdc-notched-outline__trailing { + border-color: $secondary-2 !important; + } + } +} +.gcc-input-wrapper.secondary-2 { + mat-label i { + color: $secondary-2; + } + mat-form-field { + app-button ::ng-deep button:focus { + color: $secondary-2; + } + } + mat-form-field.mat-focused .gcc-input-icon { + color: $secondary-2; + } + .hint-button ::ng-deep button:focus { + color: $secondary-2; + } + + ::ng-deep .mat-focused { + .mdc-notched-outline__leading, .mdc-notched-outline__trailing { + border-color: $secondary-2 !important; + } + } } \ No newline at end of file diff --git a/src/app/shared/components/input/input.component.ts b/src/app/shared/components/input/input.component.ts index b0036664..50abdf9a 100644 --- a/src/app/shared/components/input/input.component.ts +++ b/src/app/shared/components/input/input.component.ts @@ -6,6 +6,7 @@ import { Translations } from 'src/app/core/services/translations.service'; import { TranslateService } from '@ngx-translate/core'; import { TooltipDirection } from '../../models/tooltip-direction'; import { ErrorStateMatcher } from '@angular/material/core'; +import { Theme } from '../../models/theme'; @Component({ selector: 'app-input', @@ -33,6 +34,7 @@ export class InputComponent implements ControlValueAccessor { @Input({required:true}) label!: string; @Input() placeholder!: string; @Input() hint!: string; + @Input() theme: Theme | string = Theme.Primary1; @Input() icon!: string; @Input() required: boolean = false; From 24113140454bc4ceb03aa32c6a0a43415024e3f5 Mon Sep 17 00:00:00 2001 From: Adi Makkar Date: Tue, 7 Nov 2023 14:58:35 -0500 Subject: [PATCH 071/165] wip --- .../event-card/event-card.component.html | 16 +++--- .../event-card/event-card.component.scss | 52 ++++++++++++------- src/assets/i18n/translations.en.ts | 9 ++++ src/assets/i18n/translations.fr.ts | 9 ++++ 4 files changed, 60 insertions(+), 26 deletions(-) diff --git a/src/app/features/events/components/event-card/event-card.component.html b/src/app/features/events/components/event-card/event-card.component.html index abf32134..e9872dee 100644 --- a/src/app/features/events/components/event-card/event-card.component.html +++ b/src/app/features/events/components/event-card/event-card.component.html @@ -1,3 +1,4 @@ + @@ -85,19 +86,18 @@ routerLink="{{ '/' + routes.Events + '/' + model?.id }}">
- - CANCELED {{ model?.title }} - - - {{ model?.title }} - +
+
+
+ CANCELED {{ model?.title }} +
-
+
Organizer: {{ model?.organizer }}
-
+
Location: {{ model?.location?.address }}
diff --git a/src/app/features/events/components/event-card/event-card.component.scss b/src/app/features/events/components/event-card/event-card.component.scss index 0bef9add..a8202a75 100644 --- a/src/app/features/events/components/event-card/event-card.component.scss +++ b/src/app/features/events/components/event-card/event-card.component.scss @@ -172,37 +172,53 @@ // Large View mat-card.event-card-large { + position: relative; + + .event-calendar { + position: fixed; + top: 120px; + left: 50px; + z-index: 999; + + app-calendar-button { + box-shadow: 0px 4px 4px 0px rgba(0, 0, 0, 0.25); + border-radius: 15px; + } + } .event-image-wrapper { .greyed-image-wrapper { - filter:grayscale(100%); + filter:grayscale(60%); } } - .event-content { + .event-content { - .title-larger-text { - font-size: 20px; + .title-larger-text { + font-size: 20px; + font-weight: 550; + color: black; + + .canceled { + color: $error-red; + } + } + .event-organizer { + color: black; + + .organizer-text { font-weight: 550; color: black; - } - .event-organizer { - color: black; + } + .event-location { + color: black; - .organizer-text { - font-weight: 550; - color: black; - } - } - .event-location { + .location-text { + font-weight: 550; color: black; - - .location-text { - font-weight: 550; - color: black; - } } + } } } } \ No newline at end of file diff --git a/src/assets/i18n/translations.en.ts b/src/assets/i18n/translations.en.ts index 6fd0ba59..51b8e427 100644 --- a/src/assets/i18n/translations.en.ts +++ b/src/assets/i18n/translations.en.ts @@ -246,6 +246,15 @@ export default { "aria_on": "Click to decline this event", "tooltip_off": "Rescind declination", "aria_off": "Click to rescind your declination of the event" + }, + "canceled": { + "canceled_on": "Canceled" + }, + "organize": { + "organizer": "Organizer" + }, + "location": { + "location": "Location" } }, "profileCard": { diff --git a/src/assets/i18n/translations.fr.ts b/src/assets/i18n/translations.fr.ts index 7acc33f0..ce060ed7 100644 --- a/src/assets/i18n/translations.fr.ts +++ b/src/assets/i18n/translations.fr.ts @@ -247,6 +247,15 @@ const fr: typeof import('./translations.en').default = { "aria_on": "Cliquez pour refuser cet événement", "tooltip_off": "Annuler la déclinaison", "aria_off": "Cliquez pour annuler votre déclinaison de l'événement" + }, + "canceled": { + "canceled_on": "Annulé" + }, + "organize": { + "organizer": "Organisateur" + }, + "location": { + "location": "Emplacement" } }, "profileCard": { From 22a7f76af9a89429156467883694e4d042d23673 Mon Sep 17 00:00:00 2001 From: Adi Makkar Date: Tue, 7 Nov 2023 15:09:20 -0500 Subject: [PATCH 072/165] wip --- .../components/event-card/event-card.component.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/app/features/events/components/event-card/event-card.component.html b/src/app/features/events/components/event-card/event-card.component.html index e9872dee..553902ce 100644 --- a/src/app/features/events/components/event-card/event-card.component.html +++ b/src/app/features/events/components/event-card/event-card.component.html @@ -88,16 +88,16 @@
-
- CANCELED {{ model?.title }} +
+ CANCELED {{ model?.title }}
-
+
Organizer: {{ model?.organizer }}
-
+
Location: {{ model?.location?.address }}
From fa7b9759516865b07fd437e91adf4323b684e0bd Mon Sep 17 00:00:00 2001 From: doug0102 Date: Tue, 7 Nov 2023 16:00:27 -0500 Subject: [PATCH 073/165] added translations back --- .../events/components/event-card/event-card.component.html | 6 +++--- src/assets/i18n/translations.en.ts | 5 ++++- src/assets/i18n/translations.fr.ts | 5 ++++- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/app/features/events/components/event-card/event-card.component.html b/src/app/features/events/components/event-card/event-card.component.html index 553902ce..cba31ff9 100644 --- a/src/app/features/events/components/event-card/event-card.component.html +++ b/src/app/features/events/components/event-card/event-card.component.html @@ -88,16 +88,16 @@
-
+
CANCELED {{ model?.title }}
-
+
Organizer: {{ model?.organizer }}
-
+
Location: {{ model?.location?.address }}
diff --git a/src/assets/i18n/translations.en.ts b/src/assets/i18n/translations.en.ts index a4018c2a..32f23cd4 100644 --- a/src/assets/i18n/translations.en.ts +++ b/src/assets/i18n/translations.en.ts @@ -246,7 +246,10 @@ export default { "aria_on": "Click to decline this event", "tooltip_off": "Rescind declination", "aria_off": "Click to rescind your declination of the event" - } + }, + "canceled": "Canceled", + "organizer": "Organizer", + "location": "Location" }, "profileCard": { "confirm": { diff --git a/src/assets/i18n/translations.fr.ts b/src/assets/i18n/translations.fr.ts index b6066143..aa0db99a 100644 --- a/src/assets/i18n/translations.fr.ts +++ b/src/assets/i18n/translations.fr.ts @@ -247,7 +247,10 @@ const fr: typeof import('./translations.en').default = { "aria_on": "Cliquez pour refuser cet événement", "tooltip_off": "Annuler la déclinaison", "aria_off": "Cliquez pour annuler votre déclinaison de l'événement" - } + }, + "canceled": "Annulé", + "organizer": "Organisateur", + "location": "Emplacement" }, "profileCard": { "confirm": { From 14417ffbc17b5fc80d15b21651cef81e50b3286e Mon Sep 17 00:00:00 2001 From: Shea Date: Tue, 7 Nov 2023 21:12:07 +0000 Subject: [PATCH 074/165] Dependency Graph ignore-deploy --- dependency-graph.svg | 264 ++++++++++++++++++++++--------------------- 1 file changed, 135 insertions(+), 129 deletions(-) diff --git a/dependency-graph.svg b/dependency-graph.svg index 54185467..d15ef118 100644 --- a/dependency-graph.svg +++ b/dependency-graph.svg @@ -391,8 +391,8 @@ cluster_src/app/shared/models - -models + +models cluster_src/app/shared/pipes @@ -2083,37 +2083,37 @@ - + src/app/shared/shared.module.ts->src/app/core/services/translations.service.ts - + src/app/shared/shared.module.ts->src/app/shared/components/forbidden/forbidden.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/not-found/not-found.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/unauthorized/unauthorized.component.ts - + src/app/shared/shared.module.ts->src/app/core/helpers/typescript-loader.ts - + src/app/shared/shared.module.ts->src/app/app.module.ts @@ -2130,7 +2130,7 @@ - + src/app/shared/shared.module.ts->src/app/shared/components/banner/banner.component.ts @@ -2145,7 +2145,7 @@ - + src/app/shared/shared.module.ts->src/app/shared/pipes/truncate-file-name.pipe.ts @@ -2160,7 +2160,7 @@ - + src/app/shared/shared.module.ts->src/app/shared/components/blog-form/blog-form.component.ts @@ -2175,7 +2175,7 @@ - + src/app/shared/shared.module.ts->src/app/shared/components/button/button.component.ts @@ -2190,7 +2190,7 @@ - + src/app/shared/shared.module.ts->src/app/shared/components/calendar-button/calendar-button.component.ts @@ -2205,7 +2205,7 @@ - + src/app/shared/shared.module.ts->src/app/shared/components/editor/editor.component.ts @@ -2220,7 +2220,7 @@ - + src/app/shared/shared.module.ts->src/app/shared/factories/editor-config.factory.ts @@ -2235,7 +2235,7 @@ - + src/app/shared/shared.module.ts->src/app/shared/components/editor/menu/editor-menu/editor-menu.component.ts @@ -2250,7 +2250,7 @@ - + src/app/shared/shared.module.ts->src/app/shared/components/event-form/event-form.component.ts @@ -2265,7 +2265,7 @@ - + src/app/shared/shared.module.ts->src/app/shared/components/file-select/file-select.component.ts @@ -2280,7 +2280,7 @@ - + src/app/shared/shared.module.ts->src/app/shared/components/footer/footer.component.ts @@ -2295,7 +2295,7 @@ - + src/app/shared/shared.module.ts->src/app/shared/components/header/header.component.ts @@ -2310,7 +2310,7 @@ - + src/app/shared/shared.module.ts->src/app/shared/components/input/input.component.ts @@ -2325,7 +2325,7 @@ - + src/app/shared/shared.module.ts->src/app/shared/components/language-selector/language-selector.component.ts @@ -2340,7 +2340,7 @@ - + src/app/shared/shared.module.ts->src/app/shared/components/page-title/page-title.component.ts @@ -2355,7 +2355,7 @@ - + src/app/shared/shared.module.ts->src/app/shared/components/poll-form/poll-form.component.ts @@ -2370,7 +2370,7 @@ - + src/app/shared/shared.module.ts->src/app/shared/components/post-form/post-form.component.ts @@ -2385,7 +2385,7 @@ - + src/app/shared/shared.module.ts->src/app/shared/components/profile-pic/profile-pic.component.ts @@ -3120,31 +3120,31 @@ src/app/shared/models/material-button-type.ts - -material-button-type.ts + +material-button-type.ts src/app/features/events/components/event-card/event-card.component.ts->src/app/shared/models/material-button-type.ts - - + + src/app/shared/models/tooltip-direction.ts - -tooltip-direction.ts + +tooltip-direction.ts src/app/features/events/components/event-card/event-card.component.ts->src/app/shared/models/tooltip-direction.ts - - + + @@ -3215,14 +3215,14 @@ src/app/features/events/components/event/event.component.ts->src/app/shared/models/material-button-type.ts - - + + src/app/features/events/components/event/event.component.ts->src/app/shared/models/tooltip-direction.ts - - + + @@ -3234,16 +3234,16 @@ src/app/shared/models/input-type.ts - -input-type.ts + +input-type.ts src/app/features/events/components/event/event.component.ts->src/app/shared/models/input-type.ts - - + + @@ -3500,14 +3500,14 @@ src/app/features/home/home.component.ts->src/app/core/services/news.service.ts - - + + src/app/features/home/home.component.ts->src/app/shared/models/input-type.ts - - + + @@ -3737,8 +3737,8 @@ src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/shared/models/material-button-type.ts - - + + @@ -3893,14 +3893,14 @@ src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/shared/models/material-button-type.ts - - + + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/shared/models/tooltip-direction.ts - - + + @@ -4193,59 +4193,59 @@ src/app/shared/components/button/button.component.ts->src/app/shared/models/material-button-type.ts - - + + src/app/shared/components/button/button.component.ts->src/app/shared/models/tooltip-direction.ts - - + + src/app/shared/models/button-type.ts - -button-type.ts + +button-type.ts src/app/shared/components/button/button.component.ts->src/app/shared/models/button-type.ts - - + + src/app/shared/models/material-color.ts - -material-color.ts + +material-color.ts src/app/shared/components/button/button.component.ts->src/app/shared/models/material-color.ts - - + + src/app/shared/models/theme.ts - -theme.ts + +theme.ts src/app/shared/components/button/button.component.ts->src/app/shared/models/theme.ts - - + + @@ -4277,8 +4277,8 @@ src/app/shared/components/calendar-button/calendar-button.component.ts->src/app/shared/models/tooltip-direction.ts - - + + @@ -4310,17 +4310,17 @@ src/app/shared/components/editor/editor.component.ts->src/app/shared/models/tooltip-direction.ts - - + + src/app/shared/components/editor/editor.component.ts->src/app/shared/factories/editor-config.factory.ts - - + + - + src/app/shared/factories/editor-config.factory.ts->src/app/core/services/translations.service.ts @@ -4388,20 +4388,20 @@ src/app/shared/components/file-select/file-select.component.ts->src/app/core/services/focus-tracking.service.ts - - + + src/app/shared/components/file-select/file-select.component.ts->src/app/shared/models/tooltip-direction.ts - - + + src/app/shared/components/file-select/file-select.component.ts->src/app/shared/models/theme.ts - - + + @@ -4493,14 +4493,14 @@ src/app/shared/components/header/header.component.ts->src/app/core/services/people.service.ts - - + + src/app/shared/components/header/header.component.ts->src/app/shared/models/material-button-type.ts - - + + @@ -4518,7 +4518,7 @@ - + src/app/shared/components/input/input.component.ts->src/app/core/services/translations.service.ts @@ -4526,20 +4526,26 @@ src/app/shared/components/input/input.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/shared/components/input/input.component.ts->src/app/shared/models/tooltip-direction.ts - - + + src/app/shared/components/input/input.component.ts->src/app/shared/models/input-type.ts - - + + + + + +src/app/shared/components/input/input.component.ts->src/app/shared/models/theme.ts + + @@ -4551,49 +4557,49 @@ - + src/app/shared/components/language-selector/language-selector.component.spec.ts->src/app/core/helpers/typescript-loader.ts - + src/app/shared/components/language-selector/language-selector.component.spec.ts->src/app/shared/components/language-selector/language-selector.component.ts - + src/app/shared/components/language-selector/language-selector.component.ts->src/app/core/services/translations.service.ts - + src/app/shared/components/language-selector/language-selector.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.ts->src/app/shared/models/theme.ts - - + + src/app/shared/models/language.ts - -language.ts + +language.ts - + src/app/shared/components/language-selector/language-selector.component.ts->src/app/shared/models/language.ts - - + + @@ -4605,7 +4611,7 @@ - + src/app/shared/components/not-found/not-found.component.spec.ts->src/app/shared/components/not-found/not-found.component.ts @@ -4620,13 +4626,13 @@ - + src/app/shared/components/page-title/page-title.component.spec.ts->src/app/core/helpers/typescript-loader.ts - + src/app/shared/components/page-title/page-title.component.spec.ts->src/app/shared/components/page-title/page-title.component.ts @@ -4641,28 +4647,28 @@ - + src/app/shared/components/poll-form/poll-form.component.spec.ts->src/app/core/helpers/typescript-loader.ts - + src/app/shared/components/poll-form/poll-form.component.spec.ts->src/app/shared/components/poll-form/poll-form.component.ts - + src/app/shared/components/poll-form/poll-form.component.ts->src/app/core/services/translations.service.ts - + src/app/shared/components/poll-form/poll-form.component.ts->src/app/shared/models/tooltip-direction.ts - - + + @@ -4674,19 +4680,19 @@ - + src/app/shared/components/post-form/post-form.component.spec.ts->src/app/core/helpers/typescript-loader.ts - + src/app/shared/components/post-form/post-form.component.spec.ts->src/app/shared/components/post-form/post-form.component.ts - + src/app/shared/components/post-form/post-form.component.ts->src/app/core/services/translations.service.ts @@ -4701,31 +4707,31 @@ - + src/app/shared/components/profile-pic/profile-pic.component.spec.ts->src/app/core/helpers/typescript-loader.ts - + src/app/shared/components/profile-pic/profile-pic.component.spec.ts->src/app/shared/components/profile-pic/profile-pic.component.ts - + src/app/shared/components/profile-pic/profile-pic.component.ts->src/app/core/constants/routes.constants.ts - + src/app/shared/components/profile-pic/profile-pic.component.ts->src/app/core/services/translations.service.ts - + src/app/shared/components/profile-pic/profile-pic.component.ts->src/app/core/models/person.model.ts @@ -4740,7 +4746,7 @@ - + src/app/shared/components/unauthorized/unauthorized.component.spec.ts->src/app/shared/components/unauthorized/unauthorized.component.ts @@ -4755,7 +4761,7 @@ - + src/app/shared/pipes/truncate-file-name.pipe.spec.ts->src/app/shared/pipes/truncate-file-name.pipe.ts @@ -4770,7 +4776,7 @@ - + src/assets/i18n/translations.fr.ts->src/assets/i18n/translations.en.ts @@ -4803,13 +4809,13 @@ - + src/main.ts->src/app/app.module.ts - + src/main.ts->src/environments/environment.ts From 376516d44607f65f4df4f64213ecfd02367f49a7 Mon Sep 17 00:00:00 2001 From: Adi Makkar Date: Thu, 9 Nov 2023 09:32:40 -0500 Subject: [PATCH 075/165] wip, requested changes made --- .../components/event-card/event-card.component.html | 12 ++++++------ .../components/event-card/event-card.component.scss | 3 +-- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/app/features/events/components/event-card/event-card.component.html b/src/app/features/events/components/event-card/event-card.component.html index cba31ff9..abaf4625 100644 --- a/src/app/features/events/components/event-card/event-card.component.html +++ b/src/app/features/events/components/event-card/event-card.component.html @@ -88,17 +88,17 @@
-
- CANCELED {{ model?.title }} +
+ {{ translations.eventCard.canceled | translate }} {{ model?.title }}
-
- Organizer: {{ model?.organizer }} +
+ {{ translations.eventCard.organizer | translate }}: {{ model?.organizer }}
-
- Location: {{ model?.location?.address }} +
+ {{ translations.eventCard.location | translate }}: {{ model?.location?.address }}
diff --git a/src/app/features/events/components/event-card/event-card.component.scss b/src/app/features/events/components/event-card/event-card.component.scss index a8202a75..1e7c964c 100644 --- a/src/app/features/events/components/event-card/event-card.component.scss +++ b/src/app/features/events/components/event-card/event-card.component.scss @@ -109,7 +109,6 @@ padding: 0 12px; display: inline-grid; justify-content: normal; - margin-top: 20px; margin-left: 10px; div { @@ -178,7 +177,7 @@ position: fixed; top: 120px; left: 50px; - z-index: 999; + z-index: 1; app-calendar-button { box-shadow: 0px 4px 4px 0px rgba(0, 0, 0, 0.25); From f8fdee7f0091f38a31867e129000216c73b6b581 Mon Sep 17 00:00:00 2001 From: Adi Makkar Date: Fri, 10 Nov 2023 09:39:20 -0500 Subject: [PATCH 076/165] wip, requested changes made --- .../events/components/event-card/event-card.component.scss | 1 + .../events/components/event-card/event-card.component.ts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/app/features/events/components/event-card/event-card.component.scss b/src/app/features/events/components/event-card/event-card.component.scss index 1e7c964c..b3068d85 100644 --- a/src/app/features/events/components/event-card/event-card.component.scss +++ b/src/app/features/events/components/event-card/event-card.component.scss @@ -192,6 +192,7 @@ } .event-content { + margin-top: 20px; .title-larger-text { font-size: 20px; diff --git a/src/app/features/events/components/event-card/event-card.component.ts b/src/app/features/events/components/event-card/event-card.component.ts index d235eb02..525bac64 100644 --- a/src/app/features/events/components/event-card/event-card.component.ts +++ b/src/app/features/events/components/event-card/event-card.component.ts @@ -15,7 +15,7 @@ import { TooltipDirection } from 'src/app/shared/models/tooltip-direction'; export class EventCardComponent { @Input() model?: Event; @Input() loading: boolean = false; - @Input() view: string = 'small'; + @Input() view: string = 'large'; @Output() confirm = new EventEmitter(); @Output() decline = new EventEmitter(); From 04634f1066b9d6ae38d5a6ffbee7e1aacd8cdb8d Mon Sep 17 00:00:00 2001 From: Adi Makkar Date: Fri, 10 Nov 2023 09:57:57 -0500 Subject: [PATCH 077/165] wip --- .../event-card/event-card.component.html | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/src/app/features/events/components/event-card/event-card.component.html b/src/app/features/events/components/event-card/event-card.component.html index abaf4625..48ccb287 100644 --- a/src/app/features/events/components/event-card/event-card.component.html +++ b/src/app/features/events/components/event-card/event-card.component.html @@ -84,23 +84,21 @@
-
-
-
-
-
- {{ translations.eventCard.canceled | translate }} {{ model?.title }} -
+
+
- -
- {{ translations.eventCard.organizer | translate }}: {{ model?.organizer }} +
+ {{ translations.eventCard.canceled | translate | uppercase }} {{ model?.title }}
+
-
- {{ translations.eventCard.location | translate }}: {{ model?.location?.address }} -
-
+
+ {{ translations.eventCard.organizer | translate }}: {{ model?.organizer }} +
+ +
+ {{ translations.eventCard.location | translate }}: {{ model?.location?.address }} +
From 599ab702839ce44641d93131cd1b9599a9bb28d2 Mon Sep 17 00:00:00 2001 From: Adi Makkar Date: Fri, 10 Nov 2023 09:58:15 -0500 Subject: [PATCH 078/165] wip --- .../events/components/event-card/event-card.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/features/events/components/event-card/event-card.component.ts b/src/app/features/events/components/event-card/event-card.component.ts index 525bac64..d235eb02 100644 --- a/src/app/features/events/components/event-card/event-card.component.ts +++ b/src/app/features/events/components/event-card/event-card.component.ts @@ -15,7 +15,7 @@ import { TooltipDirection } from 'src/app/shared/models/tooltip-direction'; export class EventCardComponent { @Input() model?: Event; @Input() loading: boolean = false; - @Input() view: string = 'large'; + @Input() view: string = 'small'; @Output() confirm = new EventEmitter(); @Output() decline = new EventEmitter(); From 0fe3aba2ee43c35076e602493edbde163736a4e2 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Tue, 14 Nov 2023 15:43:25 -0500 Subject: [PATCH 079/165] file upload - translate error on lang change --- .../file-select/file-select.component.ts | 43 +++++++++++++++---- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/src/app/shared/components/file-select/file-select.component.ts b/src/app/shared/components/file-select/file-select.component.ts index 98468fb8..a1efebdd 100644 --- a/src/app/shared/components/file-select/file-select.component.ts +++ b/src/app/shared/components/file-select/file-select.component.ts @@ -74,9 +74,15 @@ export class FileSelectComponent { clickCallback: Function = this.openFilePicker.bind(this); blurCallback: Function = this.onPhotoBlur.bind(this); + private langChangeSub!: Subscription; + private previousTranslation: string | undefined; + private previousError: string | undefined; + constructor(private focusTrackingService: FocusTrackingService, public translations: Translations, private translateService: TranslateService) { - + this.langChangeSub = this.translateService.onLangChange.subscribe(() => { + this.onLangChange(); + }); } ngOnInit(): void { @@ -91,6 +97,9 @@ export class FileSelectComponent { ngOnDestroy(): void { if (this.focusSub) this.focusSub.unsubscribe(); + + if (this.langChangeSub) + this.langChangeSub.unsubscribe(); } openFilePicker(): void { @@ -108,17 +117,17 @@ export class FileSelectComponent { if (selectedFile) { if (!this.isCorrectExtension(selectedFile.name)) { - this.setError(this.translateService.instant(this.translations.file_select.error.extension)); + this.setError(this.translations.file_select.error.extension); } else if (selectedFile.size > this.maxSize) { - this.setError(this.translateService.instant(this.translations.file_select.error.size) + this.maxSize / 1024 + " KB."); + this.setError(this.translations.file_select.error.size, this.maxSize / 1024 + " KB."); } else { this.loadFile(selectedFile).then((dataURL) => { if (this.fileType == FileType.Text && dataURL.length > this.maxLength) { - return this.setError(this.translateService.instant(this.translations.file_select.error.characters) + this.maxLength); + return this.setError(this.translations.file_select.error.characters, this.maxLength.toString()); } else if (this.fileType == FileType.Image) { this.isCorrectDimensions(selectedFile).then((result) => { @@ -129,7 +138,7 @@ export class FileSelectComponent { this.control.setValue(dataURL); this.photoName = selectedFile.name; - this.error = undefined; + this.clearError(); }).catch((error) => { this.setError(this.translateService.instant(this.translations.file_select.error.read)); console.error(error); @@ -208,10 +217,26 @@ export class FileSelectComponent { }); } - private setError(error: string): void { - this.control.setValue(''); - this.control.markAsTouched(); - this.error = error; + private setError(translation: string | undefined, error: string = ''): void { + if (translation) { + this.previousTranslation = translation; + this.previousError = error; + + this.control.setValue(''); + this.control.markAsTouched(); + this.error = this.translateService.instant(translation) + error; + } + } + + private clearError() { + this.error = undefined; + this.previousTranslation = undefined; + this.previousError = undefined; + } + + private onLangChange() { + if (this.error) + this.setError(this.previousTranslation, this.previousError); } } From 12ce6caf13ea4fbe4dcc2143eecceedb84fcbab6 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Tue, 14 Nov 2023 15:46:35 -0500 Subject: [PATCH 080/165] event card small view button theme --- .../events/components/event-card/event-card.component.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/app/features/events/components/event-card/event-card.component.html b/src/app/features/events/components/event-card/event-card.component.html index 48ccb287..63226856 100644 --- a/src/app/features/events/components/event-card/event-card.component.html +++ b/src/app/features/events/components/event-card/event-card.component.html @@ -36,6 +36,7 @@ [ariaLabel]="(model?.confirmed ? translations.eventCard.confirm.aria_off : translations.eventCard.confirm.aria_on) | translate" [tooltipDirection]="tooltipDirection.Above" [disabled]="loading || model?.canceled == true || isPast()" + [theme]="model?.declined ? 'disabled' : 'secondary-2'" (click)="confirmEvent()"> Date: Wed, 15 Nov 2023 10:43:41 -0500 Subject: [PATCH 081/165] formControl and formGroup pipes refactor forms so the formControl sets disabled state --- .../components/post/post.component.html | 8 ++--- .../profile/components/post/post.component.ts | 2 ++ .../blog-form/blog-form.component.html | 23 +++++------- .../blog-form/blog-form.component.spec.ts | 2 +- .../blog-form/blog-form.component.ts | 13 +------ .../event-form/event-form.component.html | 36 +++++++------------ .../event-form/event-form.component.ts | 1 - .../file-select/file-select.component.spec.ts | 2 +- .../components/input/input.component.html | 7 ++-- .../components/input/input.component.ts | 12 +++++-- .../poll-form/poll-form.component.html | 12 +++---- .../poll-form/poll-form.component.ts | 1 - .../post-form/post-form.component.html | 3 +- .../post-form/post-form.component.ts | 1 - .../pipes/truncate-file-name.pipe.spec.ts | 8 ----- .../shared/pipes/truncate-file-name.pipe.ts | 21 ----------- src/app/shared/shared.module.ts | 7 ++-- 17 files changed, 52 insertions(+), 107 deletions(-) delete mode 100644 src/app/shared/pipes/truncate-file-name.pipe.spec.ts delete mode 100644 src/app/shared/pipes/truncate-file-name.pipe.ts diff --git a/src/app/features/profile/components/post/post.component.html b/src/app/features/profile/components/post/post.component.html index 6a4c606a..1a846246 100644 --- a/src/app/features/profile/components/post/post.component.html +++ b/src/app/features/profile/components/post/post.component.html @@ -49,22 +49,22 @@ mat-stretch-tabs="false"> - + - + - + - + diff --git a/src/app/features/profile/components/post/post.component.ts b/src/app/features/profile/components/post/post.component.ts index b73d739d..ca4e2a60 100644 --- a/src/app/features/profile/components/post/post.component.ts +++ b/src/app/features/profile/components/post/post.component.ts @@ -105,11 +105,13 @@ export class PostComponent { submit(): void { if (this.selectedForm.status === 'VALID') { this.creating = true; + this.selectedForm.disable(); this.sessionStorageService.remove('gccollab-make-a-' + this.getTypeFromIndex(this.selectedIndex)); // TODO: Setup mock service for posting forms setTimeout(() => { this.creating = false; + this.selectedForm.enable(); this.toggleEditing(new Event('')); }, 3000); } diff --git a/src/app/shared/components/blog-form/blog-form.component.html b/src/app/shared/components/blog-form/blog-form.component.html index 46220fa0..4fd235ff 100644 --- a/src/app/shared/components/blog-form/blog-form.component.html +++ b/src/app/shared/components/blog-form/blog-form.component.html @@ -3,39 +3,33 @@ + [required]="true"> + [required]="true"> + [control]="form.controls['coverPhoto'] | formControl"> + [required]="true"> + [control]="form.controls['description'] | formControl"> \ No newline at end of file diff --git a/src/app/shared/components/blog-form/blog-form.component.spec.ts b/src/app/shared/components/blog-form/blog-form.component.spec.ts index 7fad4d0d..bd9af6e5 100644 --- a/src/app/shared/components/blog-form/blog-form.component.spec.ts +++ b/src/app/shared/components/blog-form/blog-form.component.spec.ts @@ -5,7 +5,7 @@ import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-transla import { HttpClient, HttpClientModule } from '@angular/common/http'; import { TypescriptLoader } from 'src/app/core/helpers/typescript-loader'; import { RouterTestingModule } from '@angular/router/testing'; -import { TruncateFileNamePipe } from '../../pipes/truncate-file-name.pipe'; +import { TruncateFileNamePipe } from '../../pipes/truncate-file-name/truncate-file-name.pipe'; describe('BlogFormComponent', () => { let component: BlogFormComponent; let translateService: TranslateService; diff --git a/src/app/shared/components/blog-form/blog-form.component.ts b/src/app/shared/components/blog-form/blog-form.component.ts index 0d250776..590d4c2d 100644 --- a/src/app/shared/components/blog-form/blog-form.component.ts +++ b/src/app/shared/components/blog-form/blog-form.component.ts @@ -1,6 +1,5 @@ import { Component, Input, OnDestroy, OnInit } from '@angular/core'; -import { FormControl, FormGroup, FormGroupDirective, NgForm, Validators } from '@angular/forms'; -import { ErrorStateMatcher } from '@angular/material/core'; +import { FormControl, FormGroup, Validators } from '@angular/forms'; import { TranslateService } from '@ngx-translate/core'; import { Translations } from 'src/app/core/services/translations.service'; import { Validators as EditorValidators } from 'ngx-editor'; @@ -19,9 +18,6 @@ export class BlogFormComponent implements OnInit, OnDestroy { coverPhotoAlt: '', description: '' } - @Input() disabled: boolean = false; - - errorStateMatcher = new MyErrorStateMatcher(); maxBlogLength: number = 2000; @@ -55,10 +51,3 @@ export interface IBlogForm { coverPhotoAlt: string; description: string; } - -class MyErrorStateMatcher implements ErrorStateMatcher { - isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean { - const isSubmitted = form && form.submitted; - return !!(control && control.invalid && (control.dirty || control.touched || isSubmitted)); - } -} diff --git a/src/app/shared/components/event-form/event-form.component.html b/src/app/shared/components/event-form/event-form.component.html index 9660217a..9cebc992 100644 --- a/src/app/shared/components/event-form/event-form.component.html +++ b/src/app/shared/components/event-form/event-form.component.html @@ -8,8 +8,7 @@ (ngModelChange)="onEventTypeChange()" [ariaLabel]="translations.forms.event.type_of_event_aria | translate" formControlName="eventType" - [formControl]="$any(form).controls['eventType']" - [disabled]="disabled" + [formControl]="form.controls['eventType'] | formControl" required="true"> {{ translations.forms.event.in_person | translate }} @@ -25,11 +24,10 @@ @@ -37,11 +35,10 @@ @@ -53,8 +50,7 @@ {{ translations.forms.event.english | translate }} @@ -73,19 +69,17 @@ [required]="true" [maxCharacters]="maxCharacters" formControlName="eventDescription" - [control]="$any(form).controls['eventDescription']" - [disabled]="disabled"> + [control]="form.controls['eventDescription'] | formControl"> @@ -93,11 +87,10 @@ [(value)]="model.eventOnlinePlatform" [name]="'eventOnlinePlatform'" formControlName="eventOnlinePlatform" - [control]="$any(form).controls['eventOnlinePlatform']" + [control]="form.controls['eventOnlinePlatform'] | formControl" [label]="translations.forms.event.platform | translate" [placeholder]="translations.forms.placeholder | translate" [errorMatcher]="errorStateMatcher" - [disabled]="disabled" [required]="true"> @@ -110,8 +103,7 @@ (ngModelChange)="onEventDurationChange()" [ariaLabel]="translations.forms.event.duration_aria | translate" formControlName="eventDuration" - [formControl]="$any(form).controls['eventDuration']" - [disabled]="disabled" + [formControl]="form.controls['eventDuration'] | formControl" required="true"> {{ translations.forms.event.single_day | translate }} @@ -127,13 +119,12 @@ [(value)]="model.eventStartDate" [name]="'eventStartDate'" formControlName="eventStartDate" - [control]="$any(form).controls['eventStartDate']" + [control]="form.controls['eventStartDate'] | formControl" [label]="translations.forms.event.start_date | translate" [placeholder]="'MM/DD/YYYY'" [type]="'date'" [errorMatcher]="errorStateMatcher" [icon]="'fa-solid fa-calendar-days'" - [disabled]="disabled" [required]="true"> @@ -142,13 +133,12 @@ [(value)]="model.eventStartTime" [name]="'eventStartTime'" formControlName="eventStartTime" - [control]="$any(form).controls['eventStartTime']" + [control]="form.controls['eventStartTime'] | formControl" [label]="''" [type]="'time'" [icon]="'fa-regular fa-clock'" [placeholder]="'00:00 AM'" [errorMatcher]="errorStateMatcher" - [disabled]="disabled" [required]="true">
@@ -157,26 +147,24 @@
diff --git a/src/app/shared/components/event-form/event-form.component.ts b/src/app/shared/components/event-form/event-form.component.ts index 9a4f2515..1b34b264 100644 --- a/src/app/shared/components/event-form/event-form.component.ts +++ b/src/app/shared/components/event-form/event-form.component.ts @@ -26,7 +26,6 @@ export class EventFormComponent implements OnInit, OnDestroy { eventEndDate: '', eventEndTime: '13:00' } - @Input() disabled: boolean = false; eventType = EventType; eventLanguage = EventLanguage; diff --git a/src/app/shared/components/file-select/file-select.component.spec.ts b/src/app/shared/components/file-select/file-select.component.spec.ts index 18da7f5f..3e6851de 100644 --- a/src/app/shared/components/file-select/file-select.component.spec.ts +++ b/src/app/shared/components/file-select/file-select.component.spec.ts @@ -5,7 +5,7 @@ import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-transla import { HttpClient, HttpClientModule } from '@angular/common/http'; import { TypescriptLoader } from 'src/app/core/helpers/typescript-loader'; import { RouterTestingModule } from '@angular/router/testing'; -import { TruncateFileNamePipe } from '../../pipes/truncate-file-name.pipe'; +import { TruncateFileNamePipe } from '../../pipes/truncate-file-name/truncate-file-name.pipe'; describe('FileSelectComponent', () => { let component: FileSelectComponent; diff --git a/src/app/shared/components/input/input.component.html b/src/app/shared/components/input/input.component.html index 28825ef2..e830a322 100644 --- a/src/app/shared/components/input/input.component.html +++ b/src/app/shared/components/input/input.component.html @@ -1,5 +1,5 @@
- + {{ label }}
*
diff --git a/src/app/shared/components/input/input.component.ts b/src/app/shared/components/input/input.component.ts index 50abdf9a..9f1cc0c4 100644 --- a/src/app/shared/components/input/input.component.ts +++ b/src/app/shared/components/input/input.component.ts @@ -1,6 +1,6 @@ import { Component, EventEmitter, Input, Output, forwardRef } from '@angular/core'; import { InputType } from '../../models/input-type'; -import { ControlValueAccessor, FormControl, NG_VALUE_ACCESSOR } from '@angular/forms'; +import { ControlValueAccessor, FormControl, FormGroupDirective, NG_VALUE_ACCESSOR, NgForm } from '@angular/forms'; import { MaterialButtonType } from '../../models/material-button-type'; import { Translations } from 'src/app/core/services/translations.service'; import { TranslateService } from '@ngx-translate/core'; @@ -27,8 +27,7 @@ export class InputComponent implements ControlValueAccessor { @Input() type: InputType | string = InputType.Text; @Input() control!: FormControl; - @Input() controlName!: string; - @Input() errorMatcher!: ErrorStateMatcher; + @Input() errorMatcher: ErrorStateMatcher = new MyErrorStateMatcher(); @Input() value!: string; @Input({required:true}) label!: string; @@ -85,3 +84,10 @@ export class InputComponent implements ControlValueAccessor { this.showHint = !this.showHint; } } + +class MyErrorStateMatcher implements ErrorStateMatcher { + isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean { + const isSubmitted = form && form.submitted; + return !!(control && control.invalid && (control.dirty || control.touched || isSubmitted)); + } +} \ No newline at end of file diff --git a/src/app/shared/components/poll-form/poll-form.component.html b/src/app/shared/components/poll-form/poll-form.component.html index 5d9cf737..795e9ff0 100644 --- a/src/app/shared/components/poll-form/poll-form.component.html +++ b/src/app/shared/components/poll-form/poll-form.component.html @@ -6,22 +6,20 @@ [autofocus]="true" [maxCharacters]="maxLength" formControlName="description" - [control]="$any(form).controls['description']" - [disabled]="disabled"> + [control]="form.controls['description'] | formControl">
+ [required]="true"> @@ -31,7 +29,7 @@
diff --git a/src/app/shared/components/poll-form/poll-form.component.ts b/src/app/shared/components/poll-form/poll-form.component.ts index 44f42478..59e9dfa8 100644 --- a/src/app/shared/components/poll-form/poll-form.component.ts +++ b/src/app/shared/components/poll-form/poll-form.component.ts @@ -21,7 +21,6 @@ export class PollFormComponent implements OnInit, OnDestroy { ], photo: '' } - @Input() disabled: boolean = false; maxOptions: number = 10; minLength: number = 1; diff --git a/src/app/shared/components/post-form/post-form.component.html b/src/app/shared/components/post-form/post-form.component.html index 43ad4122..43f624a5 100644 --- a/src/app/shared/components/post-form/post-form.component.html +++ b/src/app/shared/components/post-form/post-form.component.html @@ -3,10 +3,9 @@ [hint]="translations.forms.placeholder | translate" [(html)]="model.description" formControlName="description" - [control]="$any(form).controls['description']" + [control]="form.controls['description'] | formControl" [minCharacters]="minLength" [maxCharacters]="maxLength" - [disabled]="disabled" [required]="true"> \ No newline at end of file diff --git a/src/app/shared/components/post-form/post-form.component.ts b/src/app/shared/components/post-form/post-form.component.ts index 449d81d9..01b8bb96 100644 --- a/src/app/shared/components/post-form/post-form.component.ts +++ b/src/app/shared/components/post-form/post-form.component.ts @@ -14,7 +14,6 @@ export class PostFormComponent implements OnInit, OnDestroy { @Input() model: IPostForm = { description: '' } - @Input() disabled: boolean = false; minLength: number = 3; maxLength: number = 240; diff --git a/src/app/shared/pipes/truncate-file-name.pipe.spec.ts b/src/app/shared/pipes/truncate-file-name.pipe.spec.ts deleted file mode 100644 index f998c713..00000000 --- a/src/app/shared/pipes/truncate-file-name.pipe.spec.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { TruncateFileNamePipe } from './truncate-file-name.pipe'; - -describe('TruncateFileNamePipe', () => { - it('create an instance', () => { - const pipe = new TruncateFileNamePipe(); - expect(pipe).toBeTruthy(); - }); -}); diff --git a/src/app/shared/pipes/truncate-file-name.pipe.ts b/src/app/shared/pipes/truncate-file-name.pipe.ts deleted file mode 100644 index 9ba826a2..00000000 --- a/src/app/shared/pipes/truncate-file-name.pipe.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core'; - -@Pipe({ - name: 'truncateFileName' -}) -export class TruncateFileNamePipe implements PipeTransform { - transform(fileName: string, maxLength: number): string { - const extension = fileName.split('.').pop(); - - if (extension) { - if (fileName.length - extension.length <= maxLength) { - return fileName; - } - const truncatedName = fileName.substring(0, maxLength); - - return `${truncatedName}...${extension}`; - } - - return fileName; - } -} diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index e3aa0b6a..b6d62ba6 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -42,7 +42,9 @@ import { BlogFormComponent } from './components/blog-form/blog-form.component'; import { EventFormComponent } from './components/event-form/event-form.component'; import { PollFormComponent } from './components/poll-form/poll-form.component'; -import { TruncateFileNamePipe } from './pipes/truncate-file-name.pipe'; +import { TruncateFileNamePipe } from './pipes/truncate-file-name/truncate-file-name.pipe'; +import { FormControlPipe } from './pipes/form-control/form-control.pipe'; +import { FormGroupPipe } from './pipes/form-group/form-group.pipe'; import { FileSelectComponent } from './components/file-select/file-select.component'; @@ -67,6 +69,8 @@ import { FileSelectComponent } from './components/file-select/file-select.compon EventFormComponent, PollFormComponent, TruncateFileNamePipe, + FormControlPipe, + FormGroupPipe, FileSelectComponent ], imports: [ @@ -119,7 +123,6 @@ import { FileSelectComponent } from './components/file-select/file-select.compon BlogFormComponent, EventFormComponent, PollFormComponent, - TruncateFileNamePipe ], providers: [ { From de46b29a4234e82b9a9d60fd2d84b94c091d0e8c Mon Sep 17 00:00:00 2001 From: doug0102 Date: Fri, 17 Nov 2023 09:44:38 -0500 Subject: [PATCH 082/165] poll form bug fix, input update --- .../blog-form/blog-form.component.html | 6 +- .../blog-form/blog-form.component.ts | 5 +- .../event-form/event-form.component.html | 28 +++----- .../event-form/event-form.component.ts | 70 +++++++------------ .../components/input/input.component.html | 15 ++-- .../components/input/input.component.scss | 24 +------ .../components/input/input.component.ts | 5 +- .../poll-form/poll-form.component.html | 9 ++- .../poll-form/poll-form.component.ts | 29 ++++---- .../post-form/post-form.component.html | 2 +- .../form-control/form-control.pipe.spec.ts | 8 +++ .../pipes/form-control/form-control.pipe.ts | 11 +++ .../pipes/form-group/form-group.pipe.spec.ts | 8 +++ .../pipes/form-group/form-group.pipe.ts | 11 +++ .../truncate-file-name.pipe.spec.ts | 8 +++ .../truncate-file-name.pipe.ts | 21 ++++++ 16 files changed, 135 insertions(+), 125 deletions(-) create mode 100644 src/app/shared/pipes/form-control/form-control.pipe.spec.ts create mode 100644 src/app/shared/pipes/form-control/form-control.pipe.ts create mode 100644 src/app/shared/pipes/form-group/form-group.pipe.spec.ts create mode 100644 src/app/shared/pipes/form-group/form-group.pipe.ts create mode 100644 src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.spec.ts create mode 100644 src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.ts diff --git a/src/app/shared/components/blog-form/blog-form.component.html b/src/app/shared/components/blog-form/blog-form.component.html index 4fd235ff..cbd69fea 100644 --- a/src/app/shared/components/blog-form/blog-form.component.html +++ b/src/app/shared/components/blog-form/blog-form.component.html @@ -1,6 +1,6 @@
- - - - - @@ -73,24 +70,22 @@ @@ -116,21 +111,20 @@
- -
- - - diff --git a/src/app/shared/components/event-form/event-form.component.ts b/src/app/shared/components/event-form/event-form.component.ts index 1b34b264..94fbc9eb 100644 --- a/src/app/shared/components/event-form/event-form.component.ts +++ b/src/app/shared/components/event-form/event-form.component.ts @@ -1,6 +1,5 @@ import { Component, Input, OnDestroy, OnInit } from '@angular/core'; -import { FormControl, FormGroup, FormGroupDirective, NgForm, Validators } from '@angular/forms'; -import { ErrorStateMatcher } from '@angular/material/core'; +import { FormControl, FormGroup, Validators } from '@angular/forms'; import { TranslateService } from '@ngx-translate/core'; import { Translations } from 'src/app/core/services/translations.service'; import { Validators as EditorValidators } from 'ngx-editor'; @@ -30,9 +29,11 @@ export class EventFormComponent implements OnInit, OnDestroy { eventType = EventType; eventLanguage = EventLanguage; eventDuration = EventDuration; - errorStateMatcher = new MyErrorStateMatcher(); maxCharacters = 240; + private minValidator = Validators.minLength(3); + private maxValidator = Validators.maxLength(30); + constructor(public translations: Translations) { } @@ -43,10 +44,9 @@ export class EventFormComponent implements OnInit, OnDestroy { if (key == 'eventDescription') this.form.addControl(key, new FormControl(value, [EditorValidators.required(), EditorValidators.maxLength(this.maxCharacters)])); else - this.form.addControl(key, new FormControl(value, [Validators.required])); + this.form.addControl(key, new FormControl(value, [Validators.required, this.minValidator, this.maxValidator])); } else { this.form.controls[key].setValue(value); - console.warn('Duplicate FormControl detected.'); } } } @@ -63,33 +63,18 @@ export class EventFormComponent implements OnInit, OnDestroy { onEventTypeChange(): void { switch (this.model.eventType) { case EventType.InPerson: - this.form.controls['eventOnlinePlatform'].removeValidators(Validators.required); - this.form.controls['eventOnlinePlatform'].clearValidators(); - this.form.controls['eventOnlinePlatform'].updateValueAndValidity(); - - this.form.controls['eventLocation'].addValidators(Validators.required); - this.form.controls['eventLocation'].clearValidators(); - this.form.controls['eventLocation'].updateValueAndValidity() + this.removeValidators('eventOnlinePlatform'); + this.addValidators('eventLocation'); break; case EventType.Online: - this.form.controls['eventLocation'].removeValidators(Validators.required); - this.form.controls['eventLocation'].clearValidators(); - this.form.controls['eventLocation'].updateValueAndValidity(); - - this.form.controls['eventOnlinePlatform'].addValidators(Validators.required); - this.form.controls['eventOnlinePlatform'].clearValidators(); - this.form.controls['eventOnlinePlatform'].updateValueAndValidity(); + this.removeValidators('eventLocation'); + this.addValidators('eventOnlinePlatform'); break; case EventType.Hybrid: - this.form.controls['eventLocation'].addValidators(Validators.required); - this.form.controls['eventLocation'].clearValidators(); - this.form.controls['eventLocation'].updateValueAndValidity() - - this.form.controls['eventOnlinePlatform'].addValidators(Validators.required); - this.form.controls['eventOnlinePlatform'].clearValidators(); - this.form.controls['eventOnlinePlatform'].updateValueAndValidity(); + this.addValidators('eventLocation'); + this.addValidators('eventOnlinePlatform'); break; } } @@ -97,32 +82,27 @@ export class EventFormComponent implements OnInit, OnDestroy { onEventDurationChange(): void { switch (this.model.eventDuration) { case EventDuration.Single: - this.form.controls['eventEndDate'].removeValidators(Validators.required); - this.form.controls['eventEndDate'].clearValidators(); - this.form.controls['eventEndDate'].updateValueAndValidity(); - - this.form.controls['eventEndTime'].removeValidators(Validators.required); - this.form.controls['eventEndTime'].clearValidators(); - this.form.controls['eventEndTime'].updateValueAndValidity(); + this.removeValidators('eventEndDate'); + this.removeValidators('eventEndTime'); break; case EventDuration.Multi: - this.form.controls['eventEndDate'].addValidators(Validators.required); - this.form.controls['eventEndDate'].clearValidators(); - this.form.controls['eventEndDate'].updateValueAndValidity(); - - this.form.controls['eventEndTime'].addValidators(Validators.required); - this.form.controls['eventEndTime'].clearValidators(); - this.form.controls['eventEndTime'].updateValueAndValidity(); + this.addValidators('eventEndDate'); + this.addValidators('eventEndTime'); break; } } -} -class MyErrorStateMatcher implements ErrorStateMatcher { - isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean { - const isSubmitted = form && form.submitted; - return !!(control && control.invalid && (control.dirty || control.touched || isSubmitted)); + private removeValidators(controlName: string): void { + this.form.controls[controlName]?.removeValidators([Validators.required, this.minValidator, this.maxValidator]); + this.form.controls[controlName]?.clearValidators(); + this.form.controls[controlName]?.updateValueAndValidity(); + } + + private addValidators(controlName: string): void { + this.form.controls[controlName]?.addValidators([Validators.required, this.minValidator, this.maxValidator]); + this.form.controls[controlName]?.clearValidators(); + this.form.controls[controlName]?.updateValueAndValidity(); } } diff --git a/src/app/shared/components/input/input.component.html b/src/app/shared/components/input/input.component.html index e830a322..0f3d5838 100644 --- a/src/app/shared/components/input/input.component.html +++ b/src/app/shared/components/input/input.component.html @@ -1,5 +1,5 @@
- + {{ label }}
*
@@ -47,7 +44,7 @@ {{ translations.input.error.email | translate }} - + {{ translations.input.error.minLength | translate }} {{ control.errors!['minlength'].requiredLength }}. diff --git a/src/app/shared/components/input/input.component.scss b/src/app/shared/components/input/input.component.scss index 88d6ca08..37a19127 100644 --- a/src/app/shared/components/input/input.component.scss +++ b/src/app/shared/components/input/input.component.scss @@ -22,6 +22,8 @@ mat-label { } mat-label.disabled { + color: $neutral-300; + .required-star, i { color: $neutral-300 !important; } @@ -216,25 +218,3 @@ mat-hint { } } } -.gcc-input-wrapper.secondary-2 { - mat-label i { - color: $secondary-2; - } - mat-form-field { - app-button ::ng-deep button:focus { - color: $secondary-2; - } - } - mat-form-field.mat-focused .gcc-input-icon { - color: $secondary-2; - } - .hint-button ::ng-deep button:focus { - color: $secondary-2; - } - - ::ng-deep .mat-focused { - .mdc-notched-outline__leading, .mdc-notched-outline__trailing { - border-color: $secondary-2 !important; - } - } -} \ No newline at end of file diff --git a/src/app/shared/components/input/input.component.ts b/src/app/shared/components/input/input.component.ts index 9f1cc0c4..32f1decd 100644 --- a/src/app/shared/components/input/input.component.ts +++ b/src/app/shared/components/input/input.component.ts @@ -1,6 +1,6 @@ import { Component, EventEmitter, Input, Output, forwardRef } from '@angular/core'; import { InputType } from '../../models/input-type'; -import { ControlValueAccessor, FormControl, FormGroupDirective, NG_VALUE_ACCESSOR, NgForm } from '@angular/forms'; +import { AbstractControl, ControlValueAccessor, FormControl, FormGroupDirective, NG_VALUE_ACCESSOR, NgForm } from '@angular/forms'; import { MaterialButtonType } from '../../models/material-button-type'; import { Translations } from 'src/app/core/services/translations.service'; import { TranslateService } from '@ngx-translate/core'; @@ -22,6 +22,7 @@ import { Theme } from '../../models/theme'; }) export class InputComponent implements ControlValueAccessor { + @Input() inputId!: string; @Input({required:true}) name!: string; @@ -53,7 +54,7 @@ export class InputComponent implements ControlValueAccessor { onTouched = () => {}; constructor(public translations: Translations) { - + } writeValue(value: any): void { diff --git a/src/app/shared/components/poll-form/poll-form.component.html b/src/app/shared/components/poll-form/poll-form.component.html index 795e9ff0..1ef64058 100644 --- a/src/app/shared/components/poll-form/poll-form.component.html +++ b/src/app/shared/components/poll-form/poll-form.component.html @@ -10,19 +10,18 @@
- + (click)="removeOption(option)">
diff --git a/src/app/shared/components/poll-form/poll-form.component.ts b/src/app/shared/components/poll-form/poll-form.component.ts index 59e9dfa8..6ecc4578 100644 --- a/src/app/shared/components/poll-form/poll-form.component.ts +++ b/src/app/shared/components/poll-form/poll-form.component.ts @@ -1,7 +1,6 @@ import { Component, Input, OnDestroy, OnInit } from '@angular/core'; import { TooltipDirection } from '../../models/tooltip-direction'; -import { FormControl, FormGroup, FormGroupDirective, NgForm, Validators } from '@angular/forms'; -import { ErrorStateMatcher } from '@angular/material/core'; +import { FormControl, FormGroup, Validators } from '@angular/forms'; import { TranslateService } from '@ngx-translate/core'; import { Translations } from 'src/app/core/services/translations.service'; import { Validators as EditorValidators } from 'ngx-editor'; @@ -26,7 +25,6 @@ export class PollFormComponent implements OnInit, OnDestroy { minLength: number = 1; maxLength: number = 240; tooltipDirection = TooltipDirection; - errorStateMatcher = new MyErrorStateMatcher(); constructor(public translations: Translations) { @@ -47,7 +45,7 @@ export class PollFormComponent implements OnInit, OnDestroy { for (let i = 0; i < this.model.options.length; i++) { this.form.addControl( 'option' + i, - new FormControl(this.model.options[i].value, [Validators.required] + new FormControl(this.model.options[i].value, [Validators.required, Validators.minLength(3), Validators.maxLength(30)] )); } } @@ -58,27 +56,26 @@ export class PollFormComponent implements OnInit, OnDestroy { addOption(): void { if (this.model.options.length < this.maxOptions) { - this.model.options.push({id: this.model.options.length, value: ''}); + this.model.options.push({id: this.model.options[this.model.options.length - 1].id + 1, value: ''}); this.form.addControl( - 'option' + (this.model.options.length - 1), - new FormControl(this.model.options[this.model.options.length - 1].value, [Validators.required]) + 'option' + this.model.options[this.model.options.length - 1].id, + new FormControl('', [Validators.required, Validators.minLength(3), Validators.maxLength(30)]) ); } } - removeOption(index: number): void { + removeOption(option: IPollOption): void { if (this.model.options.length <= 2) return; - this.form.removeControl('option' + index); - this.model.options.splice(index, 1); - } -} + this.form.removeControl('option' + option.id); -class MyErrorStateMatcher implements ErrorStateMatcher { - isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean { - const isSubmitted = form && form.submitted; - return !!(control && control.invalid && (control.dirty || control.touched || isSubmitted)); + for (let i = 0; i < this.model.options.length; i++) { + if (this.model.options[i].id == option.id) { + this.model.options.splice(i, 1); + break; + } + } } } diff --git a/src/app/shared/components/post-form/post-form.component.html b/src/app/shared/components/post-form/post-form.component.html index 43f624a5..62bfb64a 100644 --- a/src/app/shared/components/post-form/post-form.component.html +++ b/src/app/shared/components/post-form/post-form.component.html @@ -1,7 +1,7 @@
{ + it('create an instance', () => { + const pipe = new FormControlPipe(); + expect(pipe).toBeTruthy(); + }); +}); diff --git a/src/app/shared/pipes/form-control/form-control.pipe.ts b/src/app/shared/pipes/form-control/form-control.pipe.ts new file mode 100644 index 00000000..5f66964d --- /dev/null +++ b/src/app/shared/pipes/form-control/form-control.pipe.ts @@ -0,0 +1,11 @@ +import { Pipe, PipeTransform } from "@angular/core"; +import { AbstractControl, FormControl } from "@angular/forms"; + +@Pipe({ + name: 'formControl', +}) +export class FormControlPipe implements PipeTransform { + transform(value: AbstractControl): FormControl { + return value as FormControl; + } +} \ No newline at end of file diff --git a/src/app/shared/pipes/form-group/form-group.pipe.spec.ts b/src/app/shared/pipes/form-group/form-group.pipe.spec.ts new file mode 100644 index 00000000..9e449be5 --- /dev/null +++ b/src/app/shared/pipes/form-group/form-group.pipe.spec.ts @@ -0,0 +1,8 @@ +import { FormGroupPipe } from "./form-group.pipe"; + +describe('FormGroupPipe', () => { + it('create an instance', () => { + const pipe = new FormGroupPipe(); + expect(pipe).toBeTruthy(); + }); +}); \ No newline at end of file diff --git a/src/app/shared/pipes/form-group/form-group.pipe.ts b/src/app/shared/pipes/form-group/form-group.pipe.ts new file mode 100644 index 00000000..8f7849af --- /dev/null +++ b/src/app/shared/pipes/form-group/form-group.pipe.ts @@ -0,0 +1,11 @@ +import { Pipe, PipeTransform } from "@angular/core"; +import { AbstractControl, FormGroup } from "@angular/forms"; + +@Pipe({ + name: 'formGroup', +}) +export class FormGroupPipe implements PipeTransform { + transform(value: AbstractControl): FormGroup { + return value as FormGroup; + } +} \ No newline at end of file diff --git a/src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.spec.ts b/src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.spec.ts new file mode 100644 index 00000000..f998c713 --- /dev/null +++ b/src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.spec.ts @@ -0,0 +1,8 @@ +import { TruncateFileNamePipe } from './truncate-file-name.pipe'; + +describe('TruncateFileNamePipe', () => { + it('create an instance', () => { + const pipe = new TruncateFileNamePipe(); + expect(pipe).toBeTruthy(); + }); +}); diff --git a/src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.ts b/src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.ts new file mode 100644 index 00000000..9ba826a2 --- /dev/null +++ b/src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.ts @@ -0,0 +1,21 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +@Pipe({ + name: 'truncateFileName' +}) +export class TruncateFileNamePipe implements PipeTransform { + transform(fileName: string, maxLength: number): string { + const extension = fileName.split('.').pop(); + + if (extension) { + if (fileName.length - extension.length <= maxLength) { + return fileName; + } + const truncatedName = fileName.substring(0, maxLength); + + return `${truncatedName}...${extension}`; + } + + return fileName; + } +} From 977f260dcb773a7775f5f22122b1f0fa81e199df Mon Sep 17 00:00:00 2001 From: doug0102 Date: Fri, 17 Nov 2023 11:52:14 -0500 Subject: [PATCH 083/165] editor fixes wip --- .../components/event/event.component.html | 12 ++++------- .../profile/components/post/post.component.ts | 1 + .../components/editor/editor.component.html | 11 +++++----- .../components/editor/editor.component.scss | 20 ++++++++++++++++++- .../components/editor/editor.component.ts | 6 ++---- .../event-form/event-form.component.html | 2 +- .../components/input/input.component.ts | 1 - 7 files changed, 32 insertions(+), 21 deletions(-) diff --git a/src/app/features/events/components/event/event.component.html b/src/app/features/events/components/event/event.component.html index 391950ef..fbfb3125 100644 --- a/src/app/features/events/components/event/event.component.html +++ b/src/app/features/events/components/event/event.component.html @@ -136,8 +136,7 @@

{{ translations.event.event_registration | translate }}

[placeholder]="translations.event.form.placeholder | translate" [required]="true" [control]="nameFormControl" - [errorMatcher]="matcher" - [disabled]="loading || isPast()"> + [errorMatcher]="matcher"> @@ -149,8 +148,7 @@

{{ translations.event.event_registration | translate }}

[placeholder]="translations.event.form.placeholder | translate" [required]="true" [control]="emailFormControl" - [errorMatcher]="matcher" - [disabled]="loading || isPast()"> + [errorMatcher]="matcher"> @@ -162,8 +160,7 @@

{{ translations.event.event_registration | translate }}

[placeholder]="translations.event.form.placeholder | translate" [required]="true" [control]="emailConfirmFormControl" - [errorMatcher]="matcher" - [disabled]="loading || isPast()"> + [errorMatcher]="matcher"> @@ -175,8 +172,7 @@

{{ translations.event.event_registration | translate }}

[hint]="translations.event.form.occupation_hint | translate" [required]="true" [control]="occupationFormControl" - [errorMatcher]="matcher" - [disabled]="loading || isPast()"> + [errorMatcher]="matcher"> diff --git a/src/app/features/profile/components/post/post.component.ts b/src/app/features/profile/components/post/post.component.ts index ca4e2a60..669794be 100644 --- a/src/app/features/profile/components/post/post.component.ts +++ b/src/app/features/profile/components/post/post.component.ts @@ -104,6 +104,7 @@ export class PostComponent { submit(): void { if (this.selectedForm.status === 'VALID') { + debugger this.creating = true; this.selectedForm.disable(); this.sessionStorageService.remove('gccollab-make-a-' + this.getTypeFromIndex(this.selectedIndex)); diff --git a/src/app/shared/components/editor/editor.component.html b/src/app/shared/components/editor/editor.component.html index 29b14db5..093f0412 100644 --- a/src/app/shared/components/editor/editor.component.html +++ b/src/app/shared/components/editor/editor.component.html @@ -1,4 +1,4 @@ - + {{ label }}
*
+ [ngClass]="{focus: hasFocus, disabled: control && control.disabled, error: !hasFocus && control && control.touched && !control.valid}"> + [disabled]="control && control.disabled">
{{ characterCount }} / {{ maxCharacters }}
diff --git a/src/app/shared/components/editor/editor.component.scss b/src/app/shared/components/editor/editor.component.scss index a02cb1d1..1fe12eee 100644 --- a/src/app/shared/components/editor/editor.component.scss +++ b/src/app/shared/components/editor/editor.component.scss @@ -85,7 +85,7 @@ } } - .NgxEditor__Wrapper.error { + .NgxEditor__Wrapper.error:not(.disabled) { border-color: $error-red; ngx-editor-menu { @@ -116,9 +116,27 @@ } mat-label.disabled { + color: $neutral-300; + .required-star, i { color: $neutral-300 !important; } + + .NgxEditor__Wrapper.error { + border-color: $neutral-300; + + ngx-editor-menu { + ::ng-deep { + .NgxEditor__MenuBar { + border-color: $neutral-300; + } + } + } + } + } + + .disabled ngx-editor ::ng-deep .NgxEditor__Content--Disabled { + color: $neutral-300 !important; } mat-hint { diff --git a/src/app/shared/components/editor/editor.component.ts b/src/app/shared/components/editor/editor.component.ts index 75673269..4f6f1941 100644 --- a/src/app/shared/components/editor/editor.component.ts +++ b/src/app/shared/components/editor/editor.component.ts @@ -22,12 +22,11 @@ import { TooltipDirection } from '../../models/tooltip-direction'; }) export class EditorComponent implements OnInit, OnDestroy, AfterViewInit, AfterContentInit, ControlValueAccessor { @Input() html!: string; - @Input() disabled: boolean = false; @Input() required: boolean = false; - @Input() label!: string; + @Input({required: true}) label!: string; @Input() hint!: string; @Input() autofocus: boolean = false; - @Input() control!: FormControl; + @Input({required: true}) control!: FormControl; @Input() controlName!: string; @Input() minCharacters: number = 0; @Input() maxCharacters: number = Number.MAX_VALUE; @@ -54,7 +53,6 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit, AfterC Number = Number; focusChange!: MutationObserver; tooltipDirection = TooltipDirection; - hasRequiredValidator = false; onChange = (_: any) => {}; onTouched = () => {}; diff --git a/src/app/shared/components/event-form/event-form.component.html b/src/app/shared/components/event-form/event-form.component.html index 0506c51b..e408aaff 100644 --- a/src/app/shared/components/event-form/event-form.component.html +++ b/src/app/shared/components/event-form/event-form.component.html @@ -68,7 +68,7 @@ formControlName="eventDescription" [control]="form.controls['eventDescription'] | formControl"> - + Date: Tue, 21 Nov 2023 14:02:13 -0500 Subject: [PATCH 084/165] wip --- src/app/shared/components/editor/editor.component.html | 3 +-- src/app/shared/components/editor/editor.component.ts | 4 ++-- src/app/shared/components/post-form/post-form.component.html | 1 - 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/app/shared/components/editor/editor.component.html b/src/app/shared/components/editor/editor.component.html index 093f0412..0f36d16a 100644 --- a/src/app/shared/components/editor/editor.component.html +++ b/src/app/shared/components/editor/editor.component.html @@ -21,10 +21,9 @@
Date: Tue, 21 Nov 2023 14:07:07 -0500 Subject: [PATCH 085/165] fix tests --- src/app/features/profile/components/post/post.component.ts | 1 - .../shared/components/blog-form/blog-form.component.spec.ts | 3 ++- .../shared/components/event-form/event-form.component.spec.ts | 3 ++- .../shared/components/poll-form/poll-form.component.spec.ts | 3 ++- .../shared/components/post-form/post-form.component.spec.ts | 3 ++- 5 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/app/features/profile/components/post/post.component.ts b/src/app/features/profile/components/post/post.component.ts index 669794be..ca4e2a60 100644 --- a/src/app/features/profile/components/post/post.component.ts +++ b/src/app/features/profile/components/post/post.component.ts @@ -104,7 +104,6 @@ export class PostComponent { submit(): void { if (this.selectedForm.status === 'VALID') { - debugger this.creating = true; this.selectedForm.disable(); this.sessionStorageService.remove('gccollab-make-a-' + this.getTypeFromIndex(this.selectedIndex)); diff --git a/src/app/shared/components/blog-form/blog-form.component.spec.ts b/src/app/shared/components/blog-form/blog-form.component.spec.ts index bd9af6e5..c539e268 100644 --- a/src/app/shared/components/blog-form/blog-form.component.spec.ts +++ b/src/app/shared/components/blog-form/blog-form.component.spec.ts @@ -6,6 +6,7 @@ import { HttpClient, HttpClientModule } from '@angular/common/http'; import { TypescriptLoader } from 'src/app/core/helpers/typescript-loader'; import { RouterTestingModule } from '@angular/router/testing'; import { TruncateFileNamePipe } from '../../pipes/truncate-file-name/truncate-file-name.pipe'; +import { FormControlPipe } from '../../pipes/form-control/form-control.pipe'; describe('BlogFormComponent', () => { let component: BlogFormComponent; let translateService: TranslateService; @@ -13,7 +14,7 @@ describe('BlogFormComponent', () => { beforeEach(() => { TestBed.configureTestingModule({ - declarations: [BlogFormComponent, TruncateFileNamePipe], + declarations: [BlogFormComponent, TruncateFileNamePipe, FormControlPipe], imports: [ TranslateModule.forRoot({ loader: { diff --git a/src/app/shared/components/event-form/event-form.component.spec.ts b/src/app/shared/components/event-form/event-form.component.spec.ts index cf4d32bb..72af617a 100644 --- a/src/app/shared/components/event-form/event-form.component.spec.ts +++ b/src/app/shared/components/event-form/event-form.component.spec.ts @@ -5,6 +5,7 @@ import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-transla import { HttpClient, HttpClientModule } from '@angular/common/http'; import { TypescriptLoader } from 'src/app/core/helpers/typescript-loader'; import { RouterTestingModule } from '@angular/router/testing'; +import { FormControlPipe } from '../../pipes/form-control/form-control.pipe'; describe('EventFormComponent', () => { let component: EventFormComponent; @@ -13,7 +14,7 @@ describe('EventFormComponent', () => { beforeEach(() => { TestBed.configureTestingModule({ - declarations: [EventFormComponent], + declarations: [EventFormComponent, FormControlPipe], imports: [ TranslateModule.forRoot({ loader: { diff --git a/src/app/shared/components/poll-form/poll-form.component.spec.ts b/src/app/shared/components/poll-form/poll-form.component.spec.ts index 4830ddda..832e1ba7 100644 --- a/src/app/shared/components/poll-form/poll-form.component.spec.ts +++ b/src/app/shared/components/poll-form/poll-form.component.spec.ts @@ -5,6 +5,7 @@ import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-transla import { HttpClient, HttpClientModule } from '@angular/common/http'; import { TypescriptLoader } from 'src/app/core/helpers/typescript-loader'; import { RouterTestingModule } from '@angular/router/testing'; +import { FormControlPipe } from '../../pipes/form-control/form-control.pipe'; describe('PollFormComponent', () => { let component: PollFormComponent; @@ -13,7 +14,7 @@ describe('PollFormComponent', () => { beforeEach(() => { TestBed.configureTestingModule({ - declarations: [PollFormComponent], + declarations: [PollFormComponent, FormControlPipe], imports: [ TranslateModule.forRoot({ loader: { diff --git a/src/app/shared/components/post-form/post-form.component.spec.ts b/src/app/shared/components/post-form/post-form.component.spec.ts index b5830457..c1be2494 100644 --- a/src/app/shared/components/post-form/post-form.component.spec.ts +++ b/src/app/shared/components/post-form/post-form.component.spec.ts @@ -5,6 +5,7 @@ import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-transla import { HttpClient, HttpClientModule } from '@angular/common/http'; import { TypescriptLoader } from 'src/app/core/helpers/typescript-loader'; import { RouterTestingModule } from '@angular/router/testing'; +import { FormControlPipe } from '../../pipes/form-control/form-control.pipe'; describe('PostFormComponent', () => { let component: PostFormComponent; @@ -13,7 +14,7 @@ describe('PostFormComponent', () => { beforeEach(() => { TestBed.configureTestingModule({ - declarations: [PostFormComponent], + declarations: [PostFormComponent, FormControlPipe], imports: [ TranslateModule.forRoot({ loader: { From 764b961f472c15aee2df9a2e5b77bff2dc3a1a74 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Tue, 21 Nov 2023 14:39:52 -0500 Subject: [PATCH 086/165] remove formControlName from editor --- .../shared/components/blog-form/blog-form.component.html | 1 - src/app/shared/components/editor/editor.component.ts | 9 ++++++--- .../components/event-form/event-form.component.html | 1 - .../shared/components/poll-form/poll-form.component.html | 1 - 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/app/shared/components/blog-form/blog-form.component.html b/src/app/shared/components/blog-form/blog-form.component.html index cbd69fea..77569d18 100644 --- a/src/app/shared/components/blog-form/blog-form.component.html +++ b/src/app/shared/components/blog-form/blog-form.component.html @@ -37,7 +37,6 @@ [(html)]="model.description" [required]="true" [maxCharacters]="maxBlogLength" - formControlName="description" [control]="form.controls['description'] | formControl"> \ No newline at end of file diff --git a/src/app/shared/components/editor/editor.component.ts b/src/app/shared/components/editor/editor.component.ts index 6ba5efc2..1f9e7082 100644 --- a/src/app/shared/components/editor/editor.component.ts +++ b/src/app/shared/components/editor/editor.component.ts @@ -27,7 +27,6 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit, AfterC @Input() hint!: string; @Input() autofocus: boolean = false; @Input({required: true}) control!: FormControl; - @Input() controlName!: string; @Input() minCharacters: number = 0; @Input() maxCharacters: number = Number.MAX_VALUE; @@ -104,8 +103,10 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit, AfterC if (classList) { this.hasFocus = Array.from(classList).includes('ProseMirror-focused') ? true : false; - if (this.control && !this.hasFocus) + if (this.control && !this.hasFocus) { this.control.markAsTouched(); + this.control.updateValueAndValidity(); + } } }); }); @@ -140,8 +141,10 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit, AfterC this.onInputChange(this.html); } - if (this.control && markAsTouched) + if (this.control && markAsTouched) { this.control.markAsTouched(); + this.control.updateValueAndValidity(); + } } onLangChange(): void { diff --git a/src/app/shared/components/event-form/event-form.component.html b/src/app/shared/components/event-form/event-form.component.html index e408aaff..42f9f227 100644 --- a/src/app/shared/components/event-form/event-form.component.html +++ b/src/app/shared/components/event-form/event-form.component.html @@ -65,7 +65,6 @@ [(html)]="model.eventDescription" [required]="true" [maxCharacters]="maxCharacters" - formControlName="eventDescription" [control]="form.controls['eventDescription'] | formControl"> diff --git a/src/app/shared/components/poll-form/poll-form.component.html b/src/app/shared/components/poll-form/poll-form.component.html index 1ef64058..9ae879dc 100644 --- a/src/app/shared/components/poll-form/poll-form.component.html +++ b/src/app/shared/components/poll-form/poll-form.component.html @@ -5,7 +5,6 @@ [required]="true" [autofocus]="true" [maxCharacters]="maxLength" - formControlName="description" [control]="form.controls['description'] | formControl"> From 5c2469c64d8639b5a21937618891ab30303434b5 Mon Sep 17 00:00:00 2001 From: Shea Date: Tue, 21 Nov 2023 20:10:13 +0000 Subject: [PATCH 087/165] Dependency Graph ignore-deploy --- dependency-graph.svg | 3255 ++++++++++++++++++++++-------------------- 1 file changed, 1677 insertions(+), 1578 deletions(-) diff --git a/dependency-graph.svg b/dependency-graph.svg index d15ef118..47ea95fe 100644 --- a/dependency-graph.svg +++ b/dependency-graph.svg @@ -4,280 +4,280 @@ - - + + dependency-cruiser output - + cluster_src - -src + +src cluster_src/app - -app + +app cluster_src/app/core - -core + +core cluster_src/app/core/auth - -auth + +auth cluster_src/app/core/constants - -constants + +constants cluster_src/app/core/guards - -guards + +guards cluster_src/app/core/helpers - -helpers + +helpers cluster_src/app/core/interceptors - -interceptors + +interceptors cluster_src/app/core/models - -models + +models cluster_src/app/core/services - -services + +services cluster_src/app/features - -features + +features cluster_src/app/features/about - -about + +about cluster_src/app/features/blog - -blog + +blog cluster_src/app/features/bookmarks - -bookmarks + +bookmarks cluster_src/app/features/dashboard - -dashboard + +dashboard cluster_src/app/features/events - -events + +events cluster_src/app/features/events/components - -components + +components cluster_src/app/features/events/components/event-card - -event-card + +event-card cluster_src/app/features/events/components/event-list - -event-list + +event-list cluster_src/app/features/events/components/event - -event + +event cluster_src/app/features/events/models - -models + +models cluster_src/app/features/events/resolvers - -resolvers + +resolvers cluster_src/app/features/friends - -friends + +friends cluster_src/app/features/groups - -groups + +groups cluster_src/app/features/groups/components - -components + +components cluster_src/app/features/groups/components/group-card - -group-card + +group-card cluster_src/app/features/groups/components/group-list - -group-list + +group-list cluster_src/app/features/groups/components/group - -group + +group cluster_src/app/features/groups/models - -models + +models cluster_src/app/features/home - -home + +home cluster_src/app/features/invite - -invite + +invite cluster_src/app/features/login - -login + +login cluster_src/app/features/members - -members + +members cluster_src/app/features/messages - -messages + +messages cluster_src/app/features/missions - -missions + +missions cluster_src/app/features/news-feed - -news-feed + +news-feed cluster_src/app/features/news-feed/components - -components + +components cluster_src/app/features/news-feed/components/news-card - -news-card + +news-card cluster_src/app/features/news-feed/components/news-list - -news-list + +news-list cluster_src/app/features/news-feed/models - -models + +models cluster_src/app/features/privacy - -privacy + +privacy cluster_src/app/features/profile - -profile + +profile cluster_src/app/features/profile/components - -components + +components cluster_src/app/features/profile/components/post - -post + +post cluster_src/app/features/profile/components/profile-card - -profile-card + +profile-card cluster_src/app/features/profile/components/profile-list - -profile-list + +profile-list cluster_src/app/features/register - -register + +register cluster_src/app/features/search - -search + +search cluster_src/app/features/settings - -settings + +settings cluster_src/app/features/splash - -splash + +splash cluster_src/app/features/stats - -stats + +stats cluster_src/app/features/terms - -terms + +terms cluster_src/app/features/the-wire - -the-wire + +the-wire cluster_src/app/shared - -shared + +shared cluster_src/app/shared/components @@ -301,33 +301,33 @@ cluster_src/app/shared/components/calendar-button - -calendar-button + +calendar-button cluster_src/app/shared/components/editor - -editor + +editor cluster_src/app/shared/components/editor/menu - -menu + +menu cluster_src/app/shared/components/editor/menu/editor-menu - -editor-menu + +editor-menu cluster_src/app/shared/components/event-form - -event-form + +event-form cluster_src/app/shared/components/file-select - -file-select + +file-select cluster_src/app/shared/components/footer @@ -341,13 +341,13 @@ cluster_src/app/shared/components/header - -header + +header cluster_src/app/shared/components/input - -input + +input cluster_src/app/shared/components/language-selector @@ -366,18 +366,18 @@ cluster_src/app/shared/components/poll-form - -poll-form + +poll-form cluster_src/app/shared/components/post-form - -post-form + +post-form cluster_src/app/shared/components/profile-pic - -profile-pic + +profile-pic cluster_src/app/shared/components/unauthorized @@ -391,25 +391,40 @@ cluster_src/app/shared/models - -models + +models cluster_src/app/shared/pipes - -pipes + +pipes -cluster_src/assets - -assets +cluster_src/app/shared/pipes/form-control + +form-control -cluster_src/assets/i18n - -i18n +cluster_src/app/shared/pipes/form-group + +form-group +cluster_src/app/shared/pipes/truncate-file-name + +truncate-file-name + + +cluster_src/assets + +assets + + +cluster_src/assets/i18n + +i18n + + cluster_src/environments environments @@ -418,8 +433,8 @@ src/app/app-routing.module.ts - -app-routing.module.ts + +app-routing.module.ts @@ -427,482 +442,482 @@ src/app/core/constants/routes.constants.ts - -routes.constants.ts + +routes.constants.ts src/app/app-routing.module.ts->src/app/core/constants/routes.constants.ts - - + + src/app/core/guards/auth.guard.ts - -auth.guard.ts + +auth.guard.ts src/app/app-routing.module.ts->src/app/core/guards/auth.guard.ts - - + + src/app/core/guards/interceptor.guard.ts - -interceptor.guard.ts + +interceptor.guard.ts src/app/app-routing.module.ts->src/app/core/guards/interceptor.guard.ts - - + + src/app/core/guards/login.guard.ts - -login.guard.ts + +login.guard.ts src/app/app-routing.module.ts->src/app/core/guards/login.guard.ts - - + + src/app/core/guards/redirect.guard.ts - -redirect.guard.ts + +redirect.guard.ts src/app/app-routing.module.ts->src/app/core/guards/redirect.guard.ts - - + + src/app/core/services/translations.service.ts - -translations.service.ts + +translations.service.ts src/app/app-routing.module.ts->src/app/core/services/translations.service.ts - - + + src/app/features/about/about.module.ts - -about.module.ts + +about.module.ts src/app/app-routing.module.ts->src/app/features/about/about.module.ts - - - - + + + + src/app/features/blog/blog.module.ts - -blog.module.ts + +blog.module.ts src/app/app-routing.module.ts->src/app/features/blog/blog.module.ts - - - - + + + + src/app/features/bookmarks/bookmarks.module.ts - -bookmarks.module.ts + +bookmarks.module.ts src/app/app-routing.module.ts->src/app/features/bookmarks/bookmarks.module.ts - - - - + + + + src/app/features/dashboard/dashboard.module.ts - -dashboard.module.ts + +dashboard.module.ts src/app/app-routing.module.ts->src/app/features/dashboard/dashboard.module.ts - - - - + + + + src/app/features/events/events.module.ts - -events.module.ts + +events.module.ts src/app/app-routing.module.ts->src/app/features/events/events.module.ts - - - - + + + + src/app/features/friends/friends.module.ts - -friends.module.ts + +friends.module.ts src/app/app-routing.module.ts->src/app/features/friends/friends.module.ts - - - - + + + + src/app/features/groups/groups.module.ts - -groups.module.ts + +groups.module.ts src/app/app-routing.module.ts->src/app/features/groups/groups.module.ts - - - - + + + + src/app/features/home/home.module.ts - -home.module.ts + +home.module.ts src/app/app-routing.module.ts->src/app/features/home/home.module.ts - - - - + + + + src/app/features/invite/invite.module.ts - -invite.module.ts + +invite.module.ts src/app/app-routing.module.ts->src/app/features/invite/invite.module.ts - - - - + + + + src/app/features/login/login.module.ts - -login.module.ts + +login.module.ts src/app/app-routing.module.ts->src/app/features/login/login.module.ts - - - - + + + + src/app/features/members/members.module.ts - -members.module.ts + +members.module.ts src/app/app-routing.module.ts->src/app/features/members/members.module.ts - - - - + + + + src/app/features/messages/messages.module.ts - -messages.module.ts + +messages.module.ts src/app/app-routing.module.ts->src/app/features/messages/messages.module.ts - - - - + + + + src/app/features/missions/missions.module.ts - -missions.module.ts + +missions.module.ts src/app/app-routing.module.ts->src/app/features/missions/missions.module.ts - - - - + + + + src/app/features/news-feed/news-feed.module.ts - -news-feed.module.ts + +news-feed.module.ts src/app/app-routing.module.ts->src/app/features/news-feed/news-feed.module.ts - - - - + + + + src/app/features/privacy/privacy.module.ts - -privacy.module.ts + +privacy.module.ts src/app/app-routing.module.ts->src/app/features/privacy/privacy.module.ts - - - - + + + + src/app/features/profile/profile.module.ts - -profile.module.ts + +profile.module.ts src/app/app-routing.module.ts->src/app/features/profile/profile.module.ts - - - - + + + + src/app/features/register/register.module.ts - -register.module.ts + +register.module.ts src/app/app-routing.module.ts->src/app/features/register/register.module.ts - - - - + + + + src/app/features/search/search.module.ts - -search.module.ts + +search.module.ts src/app/app-routing.module.ts->src/app/features/search/search.module.ts - - - - + + + + src/app/features/settings/settings.module.ts - -settings.module.ts + +settings.module.ts src/app/app-routing.module.ts->src/app/features/settings/settings.module.ts - - - - + + + + src/app/features/splash/splash.module.ts - -splash.module.ts + +splash.module.ts src/app/app-routing.module.ts->src/app/features/splash/splash.module.ts - - - - + + + + src/app/features/stats/stats.module.ts - -stats.module.ts + +stats.module.ts src/app/app-routing.module.ts->src/app/features/stats/stats.module.ts - - - - + + + + src/app/features/terms/terms.module.ts - -terms.module.ts + +terms.module.ts src/app/app-routing.module.ts->src/app/features/terms/terms.module.ts - - - - + + + + src/app/features/the-wire/the-wire.module.ts - -the-wire.module.ts + +the-wire.module.ts src/app/app-routing.module.ts->src/app/features/the-wire/the-wire.module.ts - - - - + + + + @@ -916,7 +931,7 @@ src/app/app-routing.module.ts->src/app/shared/components/forbidden/forbidden.component.ts - + @@ -931,7 +946,7 @@ src/app/app-routing.module.ts->src/app/shared/components/not-found/not-found.component.ts - + @@ -946,23 +961,23 @@ src/app/app-routing.module.ts->src/app/shared/components/unauthorized/unauthorized.component.ts - + src/app/core/services/session-storage.service.ts - -session-storage.service.ts + +session-storage.service.ts src/app/core/guards/auth.guard.ts->src/app/core/services/session-storage.service.ts - - + + @@ -976,29 +991,29 @@ src/app/core/guards/auth.guard.ts->src/environments/environment.ts - - + + src/app/core/guards/interceptor.guard.ts->src/app/core/services/session-storage.service.ts - - + + src/assets/i18n/translations.en.ts - -translations.en.ts + +translations.en.ts src/app/core/services/translations.service.ts->src/assets/i18n/translations.en.ts - - + + @@ -1012,855 +1027,855 @@ src/app/features/about/about.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/about/about-routing.module.ts - -about-routing.module.ts + +about-routing.module.ts src/app/features/about/about.module.ts->src/app/features/about/about-routing.module.ts - - + + src/app/features/about/about.component.ts - -about.component.ts + +about.component.ts src/app/features/about/about.module.ts->src/app/features/about/about.component.ts - - + + src/app/features/blog/blog.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/blog/blog-routing.module.ts - -blog-routing.module.ts + +blog-routing.module.ts src/app/features/blog/blog.module.ts->src/app/features/blog/blog-routing.module.ts - - + + src/app/features/bookmarks/bookmarks.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/bookmarks/bookmarks-routing.module.ts - -bookmarks-routing.module.ts + +bookmarks-routing.module.ts src/app/features/bookmarks/bookmarks.module.ts->src/app/features/bookmarks/bookmarks-routing.module.ts - - + + src/app/features/dashboard/dashboard.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/dashboard/dashboard-routing.module.ts - -dashboard-routing.module.ts + +dashboard-routing.module.ts src/app/features/dashboard/dashboard.module.ts->src/app/features/dashboard/dashboard-routing.module.ts - - + + src/app/features/events/events.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/events/components/event-card/event-card.component.ts - -event-card.component.ts + +event-card.component.ts src/app/features/events/events.module.ts->src/app/features/events/components/event-card/event-card.component.ts - - + + src/app/features/events/components/event-list/event-list.component.ts - -event-list.component.ts + +event-list.component.ts src/app/features/events/events.module.ts->src/app/features/events/components/event-list/event-list.component.ts - - + + src/app/features/events/components/event/event.component.ts - -event.component.ts + +event.component.ts src/app/features/events/events.module.ts->src/app/features/events/components/event/event.component.ts - - + + src/app/features/events/events-routing.module.ts - -events-routing.module.ts + +events-routing.module.ts src/app/features/events/events.module.ts->src/app/features/events/events-routing.module.ts - - + + src/app/features/friends/friends.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/friends/friends-routing.module.ts - -friends-routing.module.ts + +friends-routing.module.ts src/app/features/friends/friends.module.ts->src/app/features/friends/friends-routing.module.ts - - + + src/app/features/groups/groups.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/groups/components/group-card/group-card.component.ts - -group-card.component.ts + +group-card.component.ts src/app/features/groups/groups.module.ts->src/app/features/groups/components/group-card/group-card.component.ts - - + + src/app/features/groups/components/group-list/group-list.component.ts - -group-list.component.ts + +group-list.component.ts src/app/features/groups/groups.module.ts->src/app/features/groups/components/group-list/group-list.component.ts - - + + src/app/features/groups/components/group/group.component.ts - -group.component.ts + +group.component.ts src/app/features/groups/groups.module.ts->src/app/features/groups/components/group/group.component.ts - - + + src/app/features/groups/groups-routing.module.ts - -groups-routing.module.ts + +groups-routing.module.ts src/app/features/groups/groups.module.ts->src/app/features/groups/groups-routing.module.ts - - + + src/app/features/home/home.module.ts->src/app/features/events/events.module.ts - - - - + + + + src/app/features/home/home.module.ts->src/app/features/groups/groups.module.ts - - - - + + + + src/app/features/home/home.module.ts->src/app/features/news-feed/news-feed.module.ts - - - - + + + + src/app/features/home/home.module.ts->src/app/features/profile/profile.module.ts - - - - + + + + src/app/features/home/home.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/home/home-routing.module.ts - -home-routing.module.ts + +home-routing.module.ts src/app/features/home/home.module.ts->src/app/features/home/home-routing.module.ts - - + + src/app/features/home/home.component.ts - -home.component.ts + +home.component.ts src/app/features/home/home.module.ts->src/app/features/home/home.component.ts - - + + src/app/features/invite/invite.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/invite/invite-routing.module.ts - -invite-routing.module.ts + +invite-routing.module.ts src/app/features/invite/invite.module.ts->src/app/features/invite/invite-routing.module.ts - - + + src/app/features/login/login.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/login/login-routing.module.ts - -login-routing.module.ts + +login-routing.module.ts src/app/features/login/login.module.ts->src/app/features/login/login-routing.module.ts - - + + src/app/features/login/login.component.ts - -login.component.ts + +login.component.ts src/app/features/login/login.module.ts->src/app/features/login/login.component.ts - - + + src/app/features/members/members.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/members/members-routing.module.ts - -members-routing.module.ts + +members-routing.module.ts src/app/features/members/members.module.ts->src/app/features/members/members-routing.module.ts - - + + src/app/features/messages/messages.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/messages/messages-routing.module.ts - -messages-routing.module.ts + +messages-routing.module.ts src/app/features/messages/messages.module.ts->src/app/features/messages/messages-routing.module.ts - - + + src/app/features/missions/missions.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/missions/missions-routing.module.ts - -missions-routing.module.ts + +missions-routing.module.ts src/app/features/missions/missions.module.ts->src/app/features/missions/missions-routing.module.ts - - + + src/app/features/news-feed/news-feed.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/news-feed/components/news-card/news-card.component.ts - -news-card.component.ts + +news-card.component.ts src/app/features/news-feed/news-feed.module.ts->src/app/features/news-feed/components/news-card/news-card.component.ts - - + + src/app/features/news-feed/components/news-list/news-list.component.ts - -news-list.component.ts + +news-list.component.ts src/app/features/news-feed/news-feed.module.ts->src/app/features/news-feed/components/news-list/news-list.component.ts - - + + src/app/features/news-feed/news-feed-routing.module.ts - -news-feed-routing.module.ts + +news-feed-routing.module.ts src/app/features/news-feed/news-feed.module.ts->src/app/features/news-feed/news-feed-routing.module.ts - - + + src/app/features/privacy/privacy.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/privacy/privacy-routing.module.ts - -privacy-routing.module.ts + +privacy-routing.module.ts src/app/features/privacy/privacy.module.ts->src/app/features/privacy/privacy-routing.module.ts - - + + src/app/features/privacy/privacy.component.ts - -privacy.component.ts + +privacy.component.ts src/app/features/privacy/privacy.module.ts->src/app/features/privacy/privacy.component.ts - - + + src/app/features/profile/profile.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/profile/components/post/post.component.ts - -post.component.ts + +post.component.ts src/app/features/profile/profile.module.ts->src/app/features/profile/components/post/post.component.ts - - + + src/app/features/profile/components/profile-card/profile-card.component.ts - -profile-card.component.ts + +profile-card.component.ts src/app/features/profile/profile.module.ts->src/app/features/profile/components/profile-card/profile-card.component.ts - - + + src/app/features/profile/components/profile-list/profile-list.component.ts - -profile-list.component.ts + +profile-list.component.ts src/app/features/profile/profile.module.ts->src/app/features/profile/components/profile-list/profile-list.component.ts - - + + src/app/features/profile/profile-routing.module.ts - -profile-routing.module.ts + +profile-routing.module.ts src/app/features/profile/profile.module.ts->src/app/features/profile/profile-routing.module.ts - - + + src/app/features/register/register.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/register/register-routing.module.ts - -register-routing.module.ts + +register-routing.module.ts src/app/features/register/register.module.ts->src/app/features/register/register-routing.module.ts - - + + src/app/features/register/register.component.ts - -register.component.ts + +register.component.ts src/app/features/register/register.module.ts->src/app/features/register/register.component.ts - - + + src/app/features/search/search.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/search/search-routing.module.ts - -search-routing.module.ts + +search-routing.module.ts src/app/features/search/search.module.ts->src/app/features/search/search-routing.module.ts - - + + src/app/features/settings/settings.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/settings/settings-routing.module.ts - -settings-routing.module.ts + +settings-routing.module.ts src/app/features/settings/settings.module.ts->src/app/features/settings/settings-routing.module.ts - - + + src/app/features/splash/splash.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/splash/splash-routing.module.ts - -splash-routing.module.ts + +splash-routing.module.ts src/app/features/splash/splash.module.ts->src/app/features/splash/splash-routing.module.ts - - + + src/app/features/splash/splash.component.ts - -splash.component.ts + +splash.component.ts src/app/features/splash/splash.module.ts->src/app/features/splash/splash.component.ts - - + + src/app/features/stats/stats.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/stats/stats-routing.module.ts - -stats-routing.module.ts + +stats-routing.module.ts src/app/features/stats/stats.module.ts->src/app/features/stats/stats-routing.module.ts - - + + src/app/features/stats/stats.component.ts - -stats.component.ts + +stats.component.ts src/app/features/stats/stats.module.ts->src/app/features/stats/stats.component.ts - - + + src/app/features/terms/terms.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/terms/terms-routing.module.ts - -terms-routing.module.ts + +terms-routing.module.ts src/app/features/terms/terms.module.ts->src/app/features/terms/terms-routing.module.ts - - + + src/app/features/terms/terms.component.ts - -terms.component.ts + +terms.component.ts src/app/features/terms/terms.module.ts->src/app/features/terms/terms.component.ts - - + + src/app/features/the-wire/the-wire.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/the-wire/the-wire-routing.module.ts - -the-wire-routing.module.ts + +the-wire-routing.module.ts src/app/features/the-wire/the-wire.module.ts->src/app/features/the-wire/the-wire-routing.module.ts - - + + src/app/app.component.spec.ts - -app.component.spec.ts + +app.component.spec.ts @@ -1868,257 +1883,257 @@ src/app/app.component.ts - -app.component.ts + +app.component.ts src/app/app.component.spec.ts->src/app/app.component.ts - - + + src/app/core/auth/auth.module.ts - -auth.module.ts + +auth.module.ts src/app/app.component.spec.ts->src/app/core/auth/auth.module.ts - - + + src/app/core/helpers/typescript-loader.ts - -typescript-loader.ts + +typescript-loader.ts src/app/app.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/app.component.ts->src/app/core/constants/routes.constants.ts - - + + src/app/app.component.ts->src/app/core/services/translations.service.ts - - + + src/app/core/services/language-storage.service.ts - -language-storage.service.ts + +language-storage.service.ts src/app/app.component.ts->src/app/core/services/language-storage.service.ts - - + + src/app/core/auth/auth.module.ts->src/app/core/services/session-storage.service.ts - - + + src/app/core/auth/auth.module.ts->src/environments/environment.ts - - + + src/app/core/services/local-storage-ref.service.ts - -local-storage-ref.service.ts + +local-storage-ref.service.ts src/app/core/services/language-storage.service.ts->src/app/core/services/local-storage-ref.service.ts - - + + src/app/app.module.ts - -app.module.ts + +app.module.ts src/app/app.module.ts->src/app/app-routing.module.ts - - - - + + + + src/app/app.module.ts->src/app/app.component.ts - - + + src/app/app.module.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/core/core.module.ts - -core.module.ts + +core.module.ts src/app/app.module.ts->src/app/core/core.module.ts - - - - + + + + src/app/core/services/title.service.ts - -title.service.ts + +title.service.ts src/app/app.module.ts->src/app/core/services/title.service.ts - - + + src/app/features/events/events.component.ts - -events.component.ts + +events.component.ts src/app/app.module.ts->src/app/features/events/events.component.ts - - + + src/app/features/groups/groups.component.ts - -groups.component.ts + +groups.component.ts src/app/app.module.ts->src/app/features/groups/groups.component.ts - - + + src/app/app.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/core/core.module.ts->src/app/core/auth/auth.module.ts - - + + src/app/core/core.module.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/core/core.module.ts->src/app/app.module.ts - - - - + + + + - + src/app/shared/shared.module.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/shared.module.ts->src/app/shared/components/forbidden/forbidden.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/not-found/not-found.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/unauthorized/unauthorized.component.ts - + src/app/shared/shared.module.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/shared.module.ts->src/app/app.module.ts - - - - + + + + @@ -2130,356 +2145,386 @@ - + src/app/shared/shared.module.ts->src/app/shared/components/banner/banner.component.ts - + -src/app/shared/pipes/truncate-file-name.pipe.ts - - -truncate-file-name.pipe.ts +src/app/shared/pipes/form-control/form-control.pipe.ts + + +form-control.pipe.ts - - -src/app/shared/shared.module.ts->src/app/shared/pipes/truncate-file-name.pipe.ts - - + + +src/app/shared/shared.module.ts->src/app/shared/pipes/form-control/form-control.pipe.ts + + - + +src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.ts + + +truncate-file-name.pipe.ts + + + + + +src/app/shared/shared.module.ts->src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.ts + + + + + src/app/shared/components/blog-form/blog-form.component.ts - + blog-form.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/blog-form/blog-form.component.ts - + src/app/shared/components/button/button.component.ts - + button.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/button/button.component.ts - + src/app/shared/components/calendar-button/calendar-button.component.ts - - -calendar-button.component.ts + + +calendar-button.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/calendar-button/calendar-button.component.ts - - + + - + src/app/shared/components/editor/editor.component.ts - - -editor.component.ts + + +editor.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/editor/editor.component.ts - - + + - + src/app/shared/factories/editor-config.factory.ts - + editor-config.factory.ts - + src/app/shared/shared.module.ts->src/app/shared/factories/editor-config.factory.ts - + src/app/shared/components/editor/menu/editor-menu/editor-menu.component.ts - - -editor-menu.component.ts + + +editor-menu.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/editor/menu/editor-menu/editor-menu.component.ts - - + + - + src/app/shared/components/event-form/event-form.component.ts - - -event-form.component.ts + + +event-form.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/event-form/event-form.component.ts - - + + - + src/app/shared/components/file-select/file-select.component.ts - - -file-select.component.ts + + +file-select.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/file-select/file-select.component.ts - - + + - + src/app/shared/components/footer/footer.component.ts - + footer.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/footer/footer.component.ts - + src/app/shared/components/header/header.component.ts - - -header.component.ts + + +header.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/header/header.component.ts - - + + - + src/app/shared/components/input/input.component.ts - - -input.component.ts + + +input.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/input/input.component.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.ts - + language-selector.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/language-selector/language-selector.component.ts - + src/app/shared/components/page-title/page-title.component.ts - + page-title.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/page-title/page-title.component.ts - + src/app/shared/components/poll-form/poll-form.component.ts - - -poll-form.component.ts + + +poll-form.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/poll-form/poll-form.component.ts - - + + - + src/app/shared/components/post-form/post-form.component.ts - - -post-form.component.ts + + +post-form.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/post-form/post-form.component.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.ts - - -profile-pic.component.ts + + +profile-pic.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/profile-pic/profile-pic.component.ts - - + + + + + +src/app/shared/pipes/form-group/form-group.pipe.ts + + +form-group.pipe.ts + + + + + +src/app/shared/shared.module.ts->src/app/shared/pipes/form-group/form-group.pipe.ts + + src/app/core/services/session-storage.service.ts->src/app/core/services/local-storage-ref.service.ts - - + + src/app/core/guards/auth.guard.spec.ts - -auth.guard.spec.ts + +auth.guard.spec.ts src/app/core/guards/auth.guard.spec.ts->src/app/core/guards/auth.guard.ts - - + + src/app/core/guards/auth.guard.spec.ts->src/app/core/auth/auth.module.ts - - + + src/app/core/guards/auth.guard.spec.ts->src/app/core/services/session-storage.service.ts - - + + src/app/core/guards/interceptor.guard.spec.ts - -interceptor.guard.spec.ts + +interceptor.guard.spec.ts src/app/core/guards/interceptor.guard.spec.ts->src/app/core/guards/interceptor.guard.ts - - + + src/app/core/guards/login.guard.spec.ts - -login.guard.spec.ts + +login.guard.spec.ts src/app/core/guards/login.guard.spec.ts->src/app/core/guards/login.guard.ts - - + + src/app/core/guards/login.guard.spec.ts->src/app/core/auth/auth.module.ts - - + + src/app/core/guards/redirect.guard.spec.ts - -redirect.guard.spec.ts + +redirect.guard.spec.ts src/app/core/guards/redirect.guard.spec.ts->src/app/core/guards/redirect.guard.ts - - + + src/app/core/guards/role.guard.spec.ts - -role.guard.spec.ts + +role.guard.spec.ts @@ -2487,23 +2532,23 @@ src/app/core/guards/role.guard.ts - -role.guard.ts + +role.guard.ts src/app/core/guards/role.guard.spec.ts->src/app/core/guards/role.guard.ts - - + + src/app/core/interceptors/error.interceptor.spec.ts - -error.interceptor.spec.ts + +error.interceptor.spec.ts @@ -2511,23 +2556,23 @@ src/app/core/interceptors/error.interceptor.ts - -error.interceptor.ts + +error.interceptor.ts src/app/core/interceptors/error.interceptor.spec.ts->src/app/core/interceptors/error.interceptor.ts - - + + src/app/core/models/blog.model.ts - -blog.model.ts + +blog.model.ts @@ -2535,101 +2580,101 @@ src/app/core/models/person.model.ts - -person.model.ts + +person.model.ts src/app/core/models/blog.model.ts->src/app/core/models/person.model.ts - - + + src/app/features/news-feed/models/INewsItem.ts - -INewsItem.ts + +INewsItem.ts src/app/core/models/blog.model.ts->src/app/features/news-feed/models/INewsItem.ts - - + + src/app/core/models/location.model.ts - -location.model.ts + +location.model.ts src/app/core/models/person.model.ts->src/app/core/models/location.model.ts - - + + src/app/features/news-feed/models/INewsItem.ts->src/app/core/models/person.model.ts - - + + src/app/core/models/poll.model.ts - -poll.model.ts + +poll.model.ts src/app/core/models/poll.model.ts->src/app/core/models/person.model.ts - - + + src/app/core/models/poll.model.ts->src/app/features/news-feed/models/INewsItem.ts - - + + src/app/core/models/post.model.ts - -post.model.ts + +post.model.ts src/app/core/models/post.model.ts->src/app/core/models/person.model.ts - - + + src/app/core/models/post.model.ts->src/app/features/news-feed/models/INewsItem.ts - - + + src/app/core/services/debounce.service.spec.ts - -debounce.service.spec.ts + +debounce.service.spec.ts @@ -2637,23 +2682,23 @@ src/app/core/services/debounce.service.ts - -debounce.service.ts + +debounce.service.ts src/app/core/services/debounce.service.spec.ts->src/app/core/services/debounce.service.ts - - + + src/app/core/services/event.service.spec.ts - -event.service.spec.ts + +event.service.spec.ts @@ -2661,119 +2706,119 @@ src/app/core/services/event.service.ts - -event.service.ts + +event.service.ts src/app/core/services/event.service.spec.ts->src/app/core/services/event.service.ts - - + + src/app/core/services/event.service.ts->src/app/core/models/location.model.ts - - + + src/app/core/services/group.service.ts - -group.service.ts + +group.service.ts src/app/core/services/event.service.ts->src/app/core/services/group.service.ts - - + + src/app/core/services/people.service.ts - -people.service.ts + +people.service.ts src/app/core/services/event.service.ts->src/app/core/services/people.service.ts - - + + src/app/features/events/models/event.ts - -event.ts + +event.ts src/app/core/services/event.service.ts->src/app/features/events/models/event.ts - - + + src/app/features/groups/models/group.ts - -group.ts + +group.ts src/app/core/services/group.service.ts->src/app/features/groups/models/group.ts - - + + src/app/core/services/people.service.ts->src/app/core/models/person.model.ts - - + + src/app/core/services/people.service.ts->src/app/core/models/location.model.ts - - + + src/app/features/events/models/event.ts->src/app/core/models/person.model.ts - - + + src/app/features/events/models/event.ts->src/app/core/models/location.model.ts - - + + src/app/features/events/models/event.ts->src/app/features/groups/models/group.ts - - + + src/app/core/services/focus-tracking.service.spec.ts - -focus-tracking.service.spec.ts + +focus-tracking.service.spec.ts @@ -2781,68 +2826,68 @@ src/app/core/services/focus-tracking.service.ts - -focus-tracking.service.ts + +focus-tracking.service.ts src/app/core/services/focus-tracking.service.spec.ts->src/app/core/services/focus-tracking.service.ts - - + + src/app/core/services/group.service.spec.ts - -group.service.spec.ts + +group.service.spec.ts src/app/core/services/group.service.spec.ts->src/app/core/services/group.service.ts - - + + src/app/core/services/language-storage.service.spec.ts - -language-storage.service.spec.ts + +language-storage.service.spec.ts src/app/core/services/language-storage.service.spec.ts->src/app/core/services/language-storage.service.ts - - + + src/app/core/services/local-storage-ref.service.spec.ts - -local-storage-ref.service.spec.ts + +local-storage-ref.service.spec.ts src/app/core/services/local-storage-ref.service.spec.ts->src/app/core/services/local-storage-ref.service.ts - - + + src/app/core/services/news.service.spec.ts - -news.service.spec.ts + +news.service.spec.ts @@ -2850,104 +2895,104 @@ src/app/core/services/news.service.ts - -news.service.ts + +news.service.ts src/app/core/services/news.service.spec.ts->src/app/core/services/news.service.ts - - + + src/app/core/services/news.service.ts->src/app/core/models/blog.model.ts - - + + src/app/core/services/news.service.ts->src/app/features/news-feed/models/INewsItem.ts - - + + src/app/core/services/news.service.ts->src/app/core/models/poll.model.ts - - + + src/app/core/services/news.service.ts->src/app/core/models/post.model.ts - - + + src/app/core/services/news.service.ts->src/app/core/services/people.service.ts - - + + src/app/core/services/people.service.spec.ts - -people.service.spec.ts + +people.service.spec.ts src/app/core/services/people.service.spec.ts->src/app/core/services/people.service.ts - - + + src/app/core/services/session-storage.service.spec.ts - -session-storage.service.spec.ts + +session-storage.service.spec.ts src/app/core/services/session-storage.service.spec.ts->src/app/core/services/session-storage.service.ts - - + + src/app/core/services/title.service.spec.ts - -title.service.spec.ts + +title.service.spec.ts src/app/core/services/title.service.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/core/services/title.service.spec.ts->src/app/core/services/title.service.ts - - + + src/app/core/services/user.service.spec.ts - -user.service.spec.ts + +user.service.spec.ts @@ -2955,1177 +3000,1177 @@ src/app/core/services/user.service.ts - -user.service.ts + +user.service.ts src/app/core/services/user.service.spec.ts->src/app/core/services/user.service.ts - - + + src/app/features/about/about-routing.module.ts->src/app/features/about/about.component.ts - - + + src/app/features/about/about.component.spec.ts - -about.component.spec.ts + +about.component.spec.ts src/app/features/about/about.component.spec.ts->src/app/features/about/about.component.ts - - + + src/app/features/blog/blog.component.ts - -blog.component.ts + +blog.component.ts src/app/features/blog/blog-routing.module.ts->src/app/features/blog/blog.component.ts - - + + src/app/features/blog/blog.component.spec.ts - -blog.component.spec.ts + +blog.component.spec.ts src/app/features/blog/blog.component.spec.ts->src/app/features/blog/blog.component.ts - - + + src/app/features/bookmarks/bookmarks.component.ts - -bookmarks.component.ts + +bookmarks.component.ts src/app/features/bookmarks/bookmarks-routing.module.ts->src/app/features/bookmarks/bookmarks.component.ts - - + + src/app/features/bookmarks/bookmarks.component.spec.ts - -bookmarks.component.spec.ts + +bookmarks.component.spec.ts src/app/features/bookmarks/bookmarks.component.spec.ts->src/app/features/bookmarks/bookmarks.component.ts - - + + src/app/features/dashboard/dashboard.component.ts - -dashboard.component.ts + +dashboard.component.ts src/app/features/dashboard/dashboard-routing.module.ts->src/app/features/dashboard/dashboard.component.ts - - + + src/app/features/dashboard/dashboard.component.spec.ts - -dashboard.component.spec.ts + +dashboard.component.spec.ts src/app/features/dashboard/dashboard.component.spec.ts->src/app/features/dashboard/dashboard.component.ts - - + + src/app/features/events/components/event-card/event-card.component.spec.ts - -event-card.component.spec.ts + +event-card.component.spec.ts src/app/features/events/components/event-card/event-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/features/events/components/event-card/event-card.component.spec.ts->src/app/features/events/components/event-card/event-card.component.ts - - + + src/app/features/events/components/event-card/event-card.component.ts->src/app/core/constants/routes.constants.ts - - + + src/app/features/events/components/event-card/event-card.component.ts->src/app/core/services/translations.service.ts - - + + src/app/features/events/components/event-card/event-card.component.ts->src/app/features/events/models/event.ts - - + + src/app/shared/models/material-button-type.ts - -material-button-type.ts + +material-button-type.ts src/app/features/events/components/event-card/event-card.component.ts->src/app/shared/models/material-button-type.ts - - + + src/app/shared/models/tooltip-direction.ts - -tooltip-direction.ts + +tooltip-direction.ts src/app/features/events/components/event-card/event-card.component.ts->src/app/shared/models/tooltip-direction.ts - - + + src/app/features/events/components/event-list/event-list.component.spec.ts - -event-list.component.spec.ts + +event-list.component.spec.ts src/app/features/events/components/event-list/event-list.component.spec.ts->src/app/features/events/components/event-list/event-list.component.ts - - + + src/app/features/events/components/event-list/event-list.component.ts->src/app/features/events/models/event.ts - - + + src/app/features/events/components/event/event.component.spec.ts - -event.component.spec.ts + +event.component.spec.ts src/app/features/events/components/event/event.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/features/events/components/event/event.component.spec.ts->src/app/features/events/components/event/event.component.ts - - + + src/app/features/events/components/event/event.component.ts->src/app/core/constants/routes.constants.ts - - + + src/app/features/events/components/event/event.component.ts->src/app/core/services/translations.service.ts - - + + src/app/features/events/components/event/event.component.ts->src/app/core/services/event.service.ts - - + + src/app/features/events/components/event/event.component.ts->src/app/features/events/models/event.ts - - + + src/app/features/events/components/event/event.component.ts->src/app/shared/models/material-button-type.ts - - + + src/app/features/events/components/event/event.component.ts->src/app/shared/models/tooltip-direction.ts - - + + src/app/features/events/components/event/event.component.ts->src/app/shared/components/banner/banner.component.ts - - + + src/app/shared/models/input-type.ts - -input-type.ts + +input-type.ts src/app/features/events/components/event/event.component.ts->src/app/shared/models/input-type.ts - - + + src/app/features/events/events-routing.module.ts->src/app/core/services/translations.service.ts - - + + src/app/features/events/events-routing.module.ts->src/app/features/events/events.component.ts - - + + src/app/features/events/events-routing.module.ts->src/app/features/events/components/event/event.component.ts - - + + src/app/features/events/events.component.spec.ts - -events.component.spec.ts + +events.component.spec.ts src/app/features/events/events.component.spec.ts->src/app/features/events/events.component.ts - - + + src/app/features/events/resolvers/event.resolver.ts - -event.resolver.ts + +event.resolver.ts src/app/features/events/resolvers/event.resolver.ts->src/app/core/services/event.service.ts - - + + src/app/features/events/resolvers/event.resolver.ts->src/app/features/events/models/event.ts - - + + src/app/features/friends/friends.component.ts - -friends.component.ts + +friends.component.ts src/app/features/friends/friends-routing.module.ts->src/app/features/friends/friends.component.ts - - + + src/app/features/friends/friends.component.spec.ts - -friends.component.spec.ts + +friends.component.spec.ts src/app/features/friends/friends.component.spec.ts->src/app/features/friends/friends.component.ts - - + + src/app/features/groups/components/group-card/group-card.component.spec.ts - -group-card.component.spec.ts + +group-card.component.spec.ts src/app/features/groups/components/group-card/group-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/features/groups/components/group-card/group-card.component.spec.ts->src/app/features/groups/components/group-card/group-card.component.ts - - + + src/app/features/groups/components/group-card/group-card.component.ts->src/app/core/constants/routes.constants.ts - - + + src/app/features/groups/components/group-card/group-card.component.ts->src/app/core/services/translations.service.ts - - + + src/app/features/groups/components/group-card/group-card.component.ts->src/app/features/groups/models/group.ts - - + + src/app/features/groups/components/group-list/group-list.component.spec.ts - -group-list.component.spec.ts + +group-list.component.spec.ts src/app/features/groups/components/group-list/group-list.component.spec.ts->src/app/features/groups/components/group-list/group-list.component.ts - - + + src/app/features/groups/components/group-list/group-list.component.ts->src/app/features/groups/models/group.ts - - + + src/app/features/groups/components/group/group.component.spec.ts - -group.component.spec.ts + +group.component.spec.ts src/app/features/groups/components/group/group.component.spec.ts->src/app/features/groups/components/group/group.component.ts - - + + src/app/features/groups/groups-routing.module.ts->src/app/core/services/translations.service.ts - - + + src/app/features/groups/groups-routing.module.ts->src/app/features/groups/groups.component.ts - - + + src/app/features/groups/groups-routing.module.ts->src/app/features/groups/components/group/group.component.ts - - + + src/app/features/groups/groups.component.spec.ts - -groups.component.spec.ts + +groups.component.spec.ts src/app/features/groups/groups.component.spec.ts->src/app/features/groups/groups.component.ts - - + + src/app/features/home/home-routing.module.ts->src/app/features/home/home.component.ts - - + + src/app/features/home/home.component.ts->src/app/core/constants/routes.constants.ts - - + + src/app/features/home/home.component.ts->src/app/core/services/translations.service.ts - - + + src/app/features/home/home.component.ts->src/app/core/models/person.model.ts - - + + src/app/features/home/home.component.ts->src/app/features/news-feed/models/INewsItem.ts - - + + src/app/features/home/home.component.ts->src/app/core/services/event.service.ts - - + + src/app/features/home/home.component.ts->src/app/core/services/group.service.ts - - + + src/app/features/home/home.component.ts->src/app/core/services/people.service.ts - - + + src/app/features/home/home.component.ts->src/app/features/events/models/event.ts - - + + src/app/features/home/home.component.ts->src/app/features/groups/models/group.ts - - + + src/app/features/home/home.component.ts->src/app/core/services/news.service.ts - - + + src/app/features/home/home.component.ts->src/app/shared/models/input-type.ts - - + + src/app/features/home/home.component.spec.ts - -home.component.spec.ts + +home.component.spec.ts src/app/features/home/home.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/features/home/home.component.spec.ts->src/app/features/home/home.component.ts - - + + src/app/features/invite/invite.component.ts - -invite.component.ts + +invite.component.ts src/app/features/invite/invite-routing.module.ts->src/app/features/invite/invite.component.ts - - + + src/app/features/invite/invite.component.spec.ts - -invite.component.spec.ts + +invite.component.spec.ts src/app/features/invite/invite.component.spec.ts->src/app/features/invite/invite.component.ts - - + + src/app/features/login/login-routing.module.ts->src/app/features/login/login.component.ts - - + + src/app/features/login/login.component.ts->src/app/core/services/translations.service.ts - - + + src/app/features/login/login.component.spec.ts - -login.component.spec.ts + +login.component.spec.ts src/app/features/login/login.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/features/login/login.component.spec.ts->src/app/features/login/login.component.ts - - + + src/app/features/members/members.component.ts - -members.component.ts + +members.component.ts src/app/features/members/members-routing.module.ts->src/app/features/members/members.component.ts - - + + src/app/features/members/members.component.spec.ts - -members.component.spec.ts + +members.component.spec.ts src/app/features/members/members.component.spec.ts->src/app/features/members/members.component.ts - - + + src/app/features/messages/messages.component.ts - -messages.component.ts + +messages.component.ts src/app/features/messages/messages-routing.module.ts->src/app/features/messages/messages.component.ts - - + + src/app/features/messages/messages.component.spec.ts - -messages.component.spec.ts + +messages.component.spec.ts src/app/features/messages/messages.component.spec.ts->src/app/features/messages/messages.component.ts - - + + src/app/features/missions/missions.component.ts - -missions.component.ts + +missions.component.ts src/app/features/missions/missions-routing.module.ts->src/app/features/missions/missions.component.ts - - + + src/app/features/missions/missions.component.spec.ts - -missions.component.spec.ts + +missions.component.spec.ts src/app/features/missions/missions.component.spec.ts->src/app/features/missions/missions.component.ts - - + + src/app/features/news-feed/components/news-card/news-card.component.spec.ts - -news-card.component.spec.ts + +news-card.component.spec.ts src/app/features/news-feed/components/news-card/news-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/features/news-feed/components/news-card/news-card.component.spec.ts->src/app/features/news-feed/components/news-card/news-card.component.ts - - + + src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/core/services/translations.service.ts - - + + src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/core/models/blog.model.ts - - + + src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/features/news-feed/models/INewsItem.ts - - + + src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/core/models/poll.model.ts - - + + src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/core/models/post.model.ts - - + + src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/shared/models/material-button-type.ts - - + + src/app/features/news-feed/components/news-list/news-list.component.spec.ts - -news-list.component.spec.ts + +news-list.component.spec.ts src/app/features/news-feed/components/news-list/news-list.component.spec.ts->src/app/features/news-feed/components/news-list/news-list.component.ts - - + + src/app/features/news-feed/components/news-list/news-list.component.ts->src/app/features/news-feed/models/INewsItem.ts - - + + src/app/features/news-feed/news-feed.component.ts - -news-feed.component.ts + +news-feed.component.ts src/app/features/news-feed/news-feed-routing.module.ts->src/app/features/news-feed/news-feed.component.ts - - + + src/app/features/news-feed/news-feed.component.spec.ts - -news-feed.component.spec.ts + +news-feed.component.spec.ts src/app/features/news-feed/news-feed.component.spec.ts->src/app/features/news-feed/news-feed.component.ts - - + + src/app/features/privacy/privacy-routing.module.ts->src/app/features/privacy/privacy.component.ts - - + + src/app/features/privacy/privacy.component.spec.ts - -privacy.component.spec.ts + +privacy.component.spec.ts src/app/features/privacy/privacy.component.spec.ts->src/app/features/privacy/privacy.component.ts - - + + src/app/features/profile/components/post/post.component.spec.ts - -post.component.spec.ts + +post.component.spec.ts src/app/features/profile/components/post/post.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/features/profile/components/post/post.component.spec.ts->src/app/features/profile/components/post/post.component.ts - - + + src/app/features/profile/components/post/post.component.ts->src/app/core/services/translations.service.ts - - + + src/app/features/profile/components/post/post.component.ts->src/app/core/services/session-storage.service.ts - - + + src/app/features/profile/components/post/post.component.ts->src/app/core/models/person.model.ts - - + + src/app/features/profile/components/profile-card/profile-card.component.spec.ts - -profile-card.component.spec.ts + +profile-card.component.spec.ts src/app/features/profile/components/profile-card/profile-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/features/profile/components/profile-card/profile-card.component.spec.ts->src/app/features/profile/components/profile-card/profile-card.component.ts - - + + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/core/constants/routes.constants.ts - - + + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/core/services/translations.service.ts - - + + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/core/models/person.model.ts - - + + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/shared/models/material-button-type.ts - - + + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/shared/models/tooltip-direction.ts - - + + src/app/features/profile/components/profile-list/profile-list.component.spec.ts - -profile-list.component.spec.ts + +profile-list.component.spec.ts src/app/features/profile/components/profile-list/profile-list.component.spec.ts->src/app/features/profile/components/profile-list/profile-list.component.ts - - + + src/app/features/profile/components/profile-list/profile-list.component.ts->src/app/core/models/person.model.ts - - + + src/app/features/profile/profile.component.ts - -profile.component.ts + +profile.component.ts src/app/features/profile/profile-routing.module.ts->src/app/features/profile/profile.component.ts - - + + src/app/features/profile/profile.component.spec.ts - -profile.component.spec.ts + +profile.component.spec.ts src/app/features/profile/profile.component.spec.ts->src/app/features/profile/profile.component.ts - - + + src/app/features/register/register-routing.module.ts->src/app/features/register/register.component.ts - - + + src/app/features/register/register.component.spec.ts - -register.component.spec.ts + +register.component.spec.ts src/app/features/register/register.component.spec.ts->src/app/features/register/register.component.ts - - + + src/app/features/search/search.component.ts - -search.component.ts + +search.component.ts src/app/features/search/search-routing.module.ts->src/app/features/search/search.component.ts - - + + src/app/features/search/search.component.spec.ts - -search.component.spec.ts + +search.component.spec.ts src/app/features/search/search.component.spec.ts->src/app/features/search/search.component.ts - - + + src/app/features/settings/settings.component.ts - -settings.component.ts + +settings.component.ts src/app/features/settings/settings-routing.module.ts->src/app/features/settings/settings.component.ts - - + + src/app/features/settings/settings.component.spec.ts - -settings.component.spec.ts + +settings.component.spec.ts src/app/features/settings/settings.component.spec.ts->src/app/features/settings/settings.component.ts - - + + src/app/features/splash/splash-routing.module.ts->src/app/features/splash/splash.component.ts - - + + src/app/features/splash/splash.component.spec.ts - -splash.component.spec.ts + +splash.component.spec.ts src/app/features/splash/splash.component.spec.ts->src/app/features/splash/splash.component.ts - - + + src/app/features/stats/stats-routing.module.ts->src/app/features/stats/stats.component.ts - - + + src/app/features/stats/stats.component.spec.ts - -stats.component.spec.ts + +stats.component.spec.ts src/app/features/stats/stats.component.spec.ts->src/app/features/stats/stats.component.ts - - + + src/app/features/terms/terms-routing.module.ts->src/app/features/terms/terms.component.ts - - + + src/app/features/terms/terms.component.spec.ts - -terms.component.spec.ts + +terms.component.spec.ts src/app/features/terms/terms.component.spec.ts->src/app/features/terms/terms.component.ts - - + + src/app/features/the-wire/the-wire.component.ts - -the-wire.component.ts + +the-wire.component.ts src/app/features/the-wire/the-wire-routing.module.ts->src/app/features/the-wire/the-wire.component.ts - - + + src/app/features/the-wire/the-wire.component.spec.ts - -the-wire.component.spec.ts + +the-wire.component.spec.ts src/app/features/the-wire/the-wire.component.spec.ts->src/app/features/the-wire/the-wire.component.ts - - + + @@ -4152,689 +4197,743 @@ - + src/app/shared/components/blog-form/blog-form.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + -src/app/shared/components/blog-form/blog-form.component.spec.ts->src/app/shared/pipes/truncate-file-name.pipe.ts - - +src/app/shared/components/blog-form/blog-form.component.spec.ts->src/app/shared/pipes/form-control/form-control.pipe.ts + + - + +src/app/shared/components/blog-form/blog-form.component.spec.ts->src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.ts + + + + + src/app/shared/components/blog-form/blog-form.component.spec.ts->src/app/shared/components/blog-form/blog-form.component.ts - + src/app/shared/components/blog-form/blog-form.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/button/button.component.spec.ts - + button.component.spec.ts - + src/app/shared/components/button/button.component.spec.ts->src/app/shared/components/button/button.component.ts - + src/app/shared/components/button/button.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/shared/components/button/button.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/shared/models/button-type.ts - - -button-type.ts + + +button-type.ts - + src/app/shared/components/button/button.component.ts->src/app/shared/models/button-type.ts - - + + - + src/app/shared/models/material-color.ts - - -material-color.ts + + +material-color.ts - + src/app/shared/components/button/button.component.ts->src/app/shared/models/material-color.ts - - + + - + src/app/shared/models/theme.ts - - -theme.ts + + +theme.ts - + src/app/shared/components/button/button.component.ts->src/app/shared/models/theme.ts - - + + - + src/app/shared/components/calendar-button/calendar-button.component.spec.ts - - -calendar-button.component.spec.ts + + +calendar-button.component.spec.ts - + src/app/shared/components/calendar-button/calendar-button.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/calendar-button/calendar-button.component.spec.ts->src/app/shared/components/calendar-button/calendar-button.component.ts - - + + - + src/app/shared/components/calendar-button/calendar-button.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/calendar-button/calendar-button.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/shared/components/editor/editor.component.spec.ts - - -editor.component.spec.ts + + +editor.component.spec.ts - + src/app/shared/components/editor/editor.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/editor/editor.component.spec.ts->src/app/shared/components/editor/editor.component.ts - - + + - + src/app/shared/components/editor/editor.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/editor/editor.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/shared/components/editor/editor.component.ts->src/app/shared/factories/editor-config.factory.ts - - + + - + src/app/shared/factories/editor-config.factory.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/event-form/event-form.component.spec.ts - - -event-form.component.spec.ts + + +event-form.component.spec.ts - + src/app/shared/components/event-form/event-form.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + + + + +src/app/shared/components/event-form/event-form.component.spec.ts->src/app/shared/pipes/form-control/form-control.pipe.ts + + - + src/app/shared/components/event-form/event-form.component.spec.ts->src/app/shared/components/event-form/event-form.component.ts - - + + - + src/app/shared/components/event-form/event-form.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/file-select/file-select.component.spec.ts - - -file-select.component.spec.ts + + +file-select.component.spec.ts - + src/app/shared/components/file-select/file-select.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - - -src/app/shared/components/file-select/file-select.component.spec.ts->src/app/shared/pipes/truncate-file-name.pipe.ts - - + + +src/app/shared/components/file-select/file-select.component.spec.ts->src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.ts + + - + src/app/shared/components/file-select/file-select.component.spec.ts->src/app/shared/components/file-select/file-select.component.ts - - + + - + src/app/shared/components/file-select/file-select.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/file-select/file-select.component.ts->src/app/core/services/focus-tracking.service.ts - - + + - + src/app/shared/components/file-select/file-select.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/shared/components/file-select/file-select.component.ts->src/app/shared/models/theme.ts - - + + - + src/app/shared/components/footer/footer.component.spec.ts - + footer.component.spec.ts - + src/app/shared/components/footer/footer.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/footer/footer.component.spec.ts->src/app/shared/components/footer/footer.component.ts - + src/app/shared/components/footer/footer.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/shared/components/footer/footer.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/forbidden/forbidden.component.spec.ts - + forbidden.component.spec.ts - + src/app/shared/components/forbidden/forbidden.component.spec.ts->src/app/shared/components/forbidden/forbidden.component.ts - + src/app/shared/components/header/header.component.spec.ts - - -header.component.spec.ts + + +header.component.spec.ts - + src/app/shared/components/header/header.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/header/header.component.spec.ts->src/app/shared/components/header/header.component.ts - - + + - + src/app/shared/components/header/header.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/shared/components/header/header.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/header/header.component.ts->src/app/core/models/person.model.ts - - + + - + src/app/shared/components/header/header.component.ts->src/app/core/services/people.service.ts - - + + - + src/app/shared/components/header/header.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/shared/components/input/input.component.spec.ts - - -input.component.spec.ts + + +input.component.spec.ts - + src/app/shared/components/input/input.component.spec.ts->src/app/shared/components/input/input.component.ts - - + + - + src/app/shared/components/input/input.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/input/input.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/shared/components/input/input.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/shared/components/input/input.component.ts->src/app/shared/models/input-type.ts - - + + - + src/app/shared/components/input/input.component.ts->src/app/shared/models/theme.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.spec.ts - + language-selector.component.spec.ts - + src/app/shared/components/language-selector/language-selector.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.spec.ts->src/app/shared/components/language-selector/language-selector.component.ts - + src/app/shared/components/language-selector/language-selector.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.ts->src/app/shared/models/theme.ts - - + + - + src/app/shared/models/language.ts - - -language.ts + + +language.ts - + src/app/shared/components/language-selector/language-selector.component.ts->src/app/shared/models/language.ts - - + + - + src/app/shared/components/not-found/not-found.component.spec.ts - + not-found.component.spec.ts - + src/app/shared/components/not-found/not-found.component.spec.ts->src/app/shared/components/not-found/not-found.component.ts - + src/app/shared/components/page-title/page-title.component.spec.ts - + page-title.component.spec.ts - + src/app/shared/components/page-title/page-title.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/page-title/page-title.component.spec.ts->src/app/shared/components/page-title/page-title.component.ts - + src/app/shared/components/poll-form/poll-form.component.spec.ts - - -poll-form.component.spec.ts + + +poll-form.component.spec.ts - + src/app/shared/components/poll-form/poll-form.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + + + + +src/app/shared/components/poll-form/poll-form.component.spec.ts->src/app/shared/pipes/form-control/form-control.pipe.ts + + - + src/app/shared/components/poll-form/poll-form.component.spec.ts->src/app/shared/components/poll-form/poll-form.component.ts - - + + - + src/app/shared/components/poll-form/poll-form.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/poll-form/poll-form.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/shared/components/post-form/post-form.component.spec.ts - - -post-form.component.spec.ts + + +post-form.component.spec.ts - + src/app/shared/components/post-form/post-form.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + + + + +src/app/shared/components/post-form/post-form.component.spec.ts->src/app/shared/pipes/form-control/form-control.pipe.ts + + - + src/app/shared/components/post-form/post-form.component.spec.ts->src/app/shared/components/post-form/post-form.component.ts - - + + - + src/app/shared/components/post-form/post-form.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.spec.ts - - -profile-pic.component.spec.ts + + +profile-pic.component.spec.ts - + src/app/shared/components/profile-pic/profile-pic.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.spec.ts->src/app/shared/components/profile-pic/profile-pic.component.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.ts->src/app/core/models/person.model.ts - - + + - + src/app/shared/components/unauthorized/unauthorized.component.spec.ts - + unauthorized.component.spec.ts - + src/app/shared/components/unauthorized/unauthorized.component.spec.ts->src/app/shared/components/unauthorized/unauthorized.component.ts - - -src/app/shared/pipes/truncate-file-name.pipe.spec.ts - - -truncate-file-name.pipe.spec.ts + + +src/app/shared/pipes/form-control/form-control.pipe.spec.ts + + +form-control.pipe.spec.ts - - -src/app/shared/pipes/truncate-file-name.pipe.spec.ts->src/app/shared/pipes/truncate-file-name.pipe.ts - - + + +src/app/shared/pipes/form-control/form-control.pipe.spec.ts->src/app/shared/pipes/form-control/form-control.pipe.ts + + + + + +src/app/shared/pipes/form-group/form-group.pipe.spec.ts + + +form-group.pipe.spec.ts + + + + + +src/app/shared/pipes/form-group/form-group.pipe.spec.ts->src/app/shared/pipes/form-group/form-group.pipe.ts + + + + + +src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.spec.ts + + +truncate-file-name.pipe.spec.ts + + + + + +src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.spec.ts->src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.ts + + - + src/assets/i18n/translations.fr.ts - - -translations.fr.ts + + +translations.fr.ts - + src/assets/i18n/translations.fr.ts->src/assets/i18n/translations.en.ts - - + + - + src/environments/environment.pr.ts - + environment.pr.ts - + src/environments/environment.prod.ts - + environment.prod.ts - + src/main.ts - - -main.ts + + +main.ts - + src/main.ts->src/app/app.module.ts - - + + - + src/main.ts->src/environments/environment.ts - + - + src/polyfills.ts - - -polyfills.ts + + +polyfills.ts - + src/test.ts - - -test.ts + + +test.ts From 182e74b115715051a60f070209ae399cedfb6ff4 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Wed, 22 Nov 2023 11:01:51 -0500 Subject: [PATCH 088/165] IList interface implemented in all list services. --- src/app/core/interfaces/list.interface.ts | 6 ++++++ src/app/core/services/event.service.ts | 7 ++++--- src/app/core/services/group.service.ts | 7 ++++--- src/app/core/services/news.service.ts | 8 ++++---- src/app/core/services/people.service.ts | 7 ++++--- src/app/core/services/user.service.spec.ts | 16 ---------------- src/app/core/services/user.service.ts | 9 --------- .../events/components/event/event.component.ts | 2 +- src/app/features/home/home.component.ts | 10 +++++----- .../shared/components/header/header.component.ts | 2 +- 10 files changed, 29 insertions(+), 45 deletions(-) create mode 100644 src/app/core/interfaces/list.interface.ts delete mode 100644 src/app/core/services/user.service.spec.ts delete mode 100644 src/app/core/services/user.service.ts diff --git a/src/app/core/interfaces/list.interface.ts b/src/app/core/interfaces/list.interface.ts new file mode 100644 index 00000000..0392570d --- /dev/null +++ b/src/app/core/interfaces/list.interface.ts @@ -0,0 +1,6 @@ +import { Observable } from "rxjs"; + +export interface IList { + get(id: string, delay: number): Observable; + getMany(count: number, delay: number): Observable; +} \ No newline at end of file diff --git a/src/app/core/services/event.service.ts b/src/app/core/services/event.service.ts index feb285dc..637cf77e 100644 --- a/src/app/core/services/event.service.ts +++ b/src/app/core/services/event.service.ts @@ -6,11 +6,12 @@ import { PeopleService } from './people.service'; import { LoremIpsum } from 'lorem-ipsum'; import { GroupService } from './group.service'; +import { IList } from '../interfaces/list.interface'; @Injectable({ providedIn: 'root' }) -export class EventService { +export class EventService implements IList { private id: number = 0; private delay: number = 5000; @@ -46,7 +47,7 @@ export class EventService { } - mockGetEvent(id: string | null, delay: number = this.delay): Observable { + get(id: string | null, delay: number = this.delay): Observable { let response: Event; for(let i = 0; i < this.events.length; i++) { @@ -66,7 +67,7 @@ export class EventService { return observable; } - mockGetEvents(count: number = 10, delay: number = this.delay): Observable { + getMany(count: number = 10, delay: number = this.delay): Observable { let observable: Observable = new Observable((subscriber) => { setTimeout(() => { diff --git a/src/app/core/services/group.service.ts b/src/app/core/services/group.service.ts index 468164e4..88f47b47 100644 --- a/src/app/core/services/group.service.ts +++ b/src/app/core/services/group.service.ts @@ -1,11 +1,12 @@ import { Injectable } from '@angular/core'; import { Observable } from 'rxjs'; import { Group, GroupStatus } from 'src/app/features/groups/models/group'; +import { IList } from '../interfaces/list.interface'; @Injectable({ providedIn: 'root' }) - export class GroupService { + export class GroupService implements IList { private id: number = 0; private delay: number = 5000; @@ -25,7 +26,7 @@ import { Group, GroupStatus } from 'src/app/features/groups/models/group'; constructor() { } - mockGetGroup(id: string | null, delay: number = this.delay): Observable { + get(id: string | null, delay: number = this.delay): Observable { let response: Group; for(let i = 0; i < this.groups.length; i++) { @@ -45,7 +46,7 @@ import { Group, GroupStatus } from 'src/app/features/groups/models/group'; return observable; } - mockGetGroups(count: number = 10, delay: number = this.delay): Observable { + getMany(count: number = 10, delay: number = this.delay): Observable { let observable: Observable = new Observable((subscriber) => { setTimeout(() => { subscriber.next(this.groups.slice(0, count > this.groups.length ? this.groups.length : count)); diff --git a/src/app/core/services/news.service.ts b/src/app/core/services/news.service.ts index 619c355b..bc19c41e 100644 --- a/src/app/core/services/news.service.ts +++ b/src/app/core/services/news.service.ts @@ -1,4 +1,3 @@ -//import { HttpClient } from '@angular/common/http'; import { Injectable, inject } from '@angular/core'; import { Observable } from 'rxjs'; import { INewsItem } from 'src/app/features/news-feed/models/INewsItem'; @@ -8,11 +7,12 @@ import { Poll } from '../models/poll.model'; import { PeopleService } from './people.service'; import { LoremIpsum } from 'lorem-ipsum'; +import { IList } from '../interfaces/list.interface'; @Injectable({ providedIn: 'root' }) -export class NewsService { +export class NewsService implements IList { private id: number = 0; private delay: number = 3000; @@ -45,7 +45,7 @@ export class NewsService { constructor() { } - mockGetNewsItem(id: string | null, delay: number = this.delay): Observable { + get(id: string | null, delay: number = this.delay): Observable { let response: INewsItem; for(let i = 0; i < this.newsItems.length; i++) { @@ -65,7 +65,7 @@ export class NewsService { return observable; } - mockGetNewsItems(count: number = 10, delay: number = 5000): Observable { + getMany(count: number = 10, delay: number = 5000): Observable { let observable: Observable = new Observable((subscriber) => { setTimeout(() => { subscriber.next(this.newsItems.slice(0, count > this.newsItems.length ? this.newsItems.length : count)); diff --git a/src/app/core/services/people.service.ts b/src/app/core/services/people.service.ts index f6df44b8..f1ee844d 100644 --- a/src/app/core/services/people.service.ts +++ b/src/app/core/services/people.service.ts @@ -2,11 +2,12 @@ import { Injectable } from '@angular/core'; import { Person } from '../models/person.model'; import { Observable } from 'rxjs'; import { Location } from '../models/location.model'; +import { IList } from '../interfaces/list.interface'; @Injectable({ providedIn: 'root' }) -export class PeopleService { +export class PeopleService implements IList { private id: number = 0; private delay: number = 3000; @@ -26,7 +27,7 @@ export class PeopleService { constructor() { } - mockGetPerson(id: string | null, delay: number = this.delay): Observable { + get(id: string | null, delay: number = this.delay): Observable { let response: Person; for(let i = 0; i < this.people.length; i++) { @@ -46,7 +47,7 @@ export class PeopleService { return observable; } - mockGetPeople(count: number = 10, delay: number = this.delay): Observable { + getMany(count: number = 10, delay: number = this.delay): Observable { let observable: Observable = new Observable((subscriber) => { setTimeout(() => { diff --git a/src/app/core/services/user.service.spec.ts b/src/app/core/services/user.service.spec.ts deleted file mode 100644 index 3f804c9f..00000000 --- a/src/app/core/services/user.service.spec.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { UserService } from './user.service'; - -describe('UserService', () => { - let service: UserService; - - beforeEach(() => { - TestBed.configureTestingModule({}); - service = TestBed.inject(UserService); - }); - - it('should be created', () => { - expect(service).toBeTruthy(); - }); -}); diff --git a/src/app/core/services/user.service.ts b/src/app/core/services/user.service.ts deleted file mode 100644 index 3569db9f..00000000 --- a/src/app/core/services/user.service.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Injectable } from '@angular/core'; - -@Injectable({ - providedIn: 'root' -}) -export class UserService { - - constructor() { } -} diff --git a/src/app/features/events/components/event/event.component.ts b/src/app/features/events/components/event/event.component.ts index 2a52a87f..e1ef28c1 100644 --- a/src/app/features/events/components/event/event.component.ts +++ b/src/app/features/events/components/event/event.component.ts @@ -64,7 +64,7 @@ export class EventComponent implements OnInit { ngOnInit(): void { if (!this.model) { - this.eventService.mockGetEvent(this.route.snapshot.paramMap.get('id'), 3000) + this.eventService.get(this.route.snapshot.paramMap.get('id'), 3000) .subscribe(event => { this.model = event; this.banner = this.createBanner(this.model); diff --git a/src/app/features/home/home.component.ts b/src/app/features/home/home.component.ts index d2b48338..3a724017 100644 --- a/src/app/features/home/home.component.ts +++ b/src/app/features/home/home.component.ts @@ -50,22 +50,22 @@ export class HomeComponent implements OnInit { } ngOnInit(): void { - this.newsService.mockGetNewsItems(10, 5000).subscribe((newsItems: INewsItem[]) => { + this.newsService.getMany(10, 5000).subscribe((newsItems: INewsItem[]) => { this.newsItems = newsItems; this.loadingNews = false; }); - this.eventService.mockGetEvents(3, 5000).subscribe((events: Event[]) => { + this.eventService.getMany(3, 5000).subscribe((events: Event[]) => { this.events = events; this.loadingEvents = false; }); - this.peopleService.mockGetPeople(3, 5000).subscribe((people: Person[]) => { + this.peopleService.getMany(3, 5000).subscribe((people: Person[]) => { this.people = people; this.loadingPeople = false; }); - this.groupService.mockGetGroups(3, 5000).subscribe((groups: Group[]) => { + this.groupService.getMany(3, 5000).subscribe((groups: Group[]) => { this.groups = groups; this.loadingGroups = false; }); @@ -74,7 +74,7 @@ export class HomeComponent implements OnInit { onNewsScroll(): void { this.loadingNews = true; - this.newsService.mockGetNewsItems(10, 3000).subscribe((newsItems: INewsItem[]) => { + this.newsService.getMany(10, 3000).subscribe((newsItems: INewsItem[]) => { this.newsItems.push(...newsItems); this.loadingNews = false; }); diff --git a/src/app/shared/components/header/header.component.ts b/src/app/shared/components/header/header.component.ts index b3a8accf..3695e123 100644 --- a/src/app/shared/components/header/header.component.ts +++ b/src/app/shared/components/header/header.component.ts @@ -27,7 +27,7 @@ export class HeaderComponent { peopleService: PeopleService) { // TODO: Get user from service - peopleService.mockGetPerson('0', 0).subscribe((person: Person) => { + peopleService.get('0', 0).subscribe((person: Person) => { this.user = person; this.loadingProfile = false; }); From 529ff6a5260b8f3fe151f210e77d0f088feae697 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Thu, 23 Nov 2023 10:55:50 -0500 Subject: [PATCH 089/165] pre-angular upgrade --- ...interface.ts => list-service.interface.ts} | 4 +- src/app/core/services/event.service.ts | 8 +++- src/app/core/services/group.service.ts | 8 +++- src/app/core/services/news.service.ts | 8 +++- src/app/core/services/people.service.ts | 8 +++- src/app/features/home/home.component.html | 2 + src/app/features/home/home.component.ts | 8 ++-- .../components/list/list.component.html | 7 +++ .../components/list/list.component.scss | 14 ++++++ .../components/list/list.component.spec.ts | 21 +++++++++ .../shared/components/list/list.component.ts | 47 +++++++++++++++++++ src/app/shared/shared.module.ts | 7 ++- 12 files changed, 127 insertions(+), 15 deletions(-) rename src/app/core/interfaces/{list.interface.ts => list-service.interface.ts} (64%) create mode 100644 src/app/shared/components/list/list.component.html create mode 100644 src/app/shared/components/list/list.component.scss create mode 100644 src/app/shared/components/list/list.component.spec.ts create mode 100644 src/app/shared/components/list/list.component.ts diff --git a/src/app/core/interfaces/list.interface.ts b/src/app/core/interfaces/list-service.interface.ts similarity index 64% rename from src/app/core/interfaces/list.interface.ts rename to src/app/core/interfaces/list-service.interface.ts index 0392570d..f423ae2a 100644 --- a/src/app/core/interfaces/list.interface.ts +++ b/src/app/core/interfaces/list-service.interface.ts @@ -1,6 +1,8 @@ import { Observable } from "rxjs"; -export interface IList { +export interface IListService { get(id: string, delay: number): Observable; getMany(count: number, delay: number): Observable; + dataType: any; + cardComponent: any; } \ No newline at end of file diff --git a/src/app/core/services/event.service.ts b/src/app/core/services/event.service.ts index 637cf77e..06653ad1 100644 --- a/src/app/core/services/event.service.ts +++ b/src/app/core/services/event.service.ts @@ -6,12 +6,13 @@ import { PeopleService } from './people.service'; import { LoremIpsum } from 'lorem-ipsum'; import { GroupService } from './group.service'; -import { IList } from '../interfaces/list.interface'; +import { IListService } from '../interfaces/list-service.interface'; +import { EventCardComponent } from 'src/app/features/events/components/event-card/event-card.component'; @Injectable({ providedIn: 'root' }) -export class EventService implements IList { +export class EventService implements IListService { private id: number = 0; private delay: number = 5000; @@ -43,6 +44,9 @@ export class EventService implements IList { this.generateRandomEventItem() ]; + public dataType = Event; + public cardComponent = EventCardComponent; + constructor() { } diff --git a/src/app/core/services/group.service.ts b/src/app/core/services/group.service.ts index 88f47b47..a68ef6e4 100644 --- a/src/app/core/services/group.service.ts +++ b/src/app/core/services/group.service.ts @@ -1,12 +1,13 @@ import { Injectable } from '@angular/core'; import { Observable } from 'rxjs'; import { Group, GroupStatus } from 'src/app/features/groups/models/group'; -import { IList } from '../interfaces/list.interface'; +import { IListService } from '../interfaces/list-service.interface'; +import { GroupCardComponent } from 'src/app/features/groups/components/group-card/group-card.component'; @Injectable({ providedIn: 'root' }) - export class GroupService implements IList { + export class GroupService implements IListService { private id: number = 0; private delay: number = 5000; @@ -24,6 +25,9 @@ import { IList } from '../interfaces/list.interface'; this.generateRandomGroupItem() ]; + public dataType = Group; + public cardComponent = GroupCardComponent; + constructor() { } get(id: string | null, delay: number = this.delay): Observable { diff --git a/src/app/core/services/news.service.ts b/src/app/core/services/news.service.ts index bc19c41e..eab8e09c 100644 --- a/src/app/core/services/news.service.ts +++ b/src/app/core/services/news.service.ts @@ -7,12 +7,13 @@ import { Poll } from '../models/poll.model'; import { PeopleService } from './people.service'; import { LoremIpsum } from 'lorem-ipsum'; -import { IList } from '../interfaces/list.interface'; +import { IListService } from '../interfaces/list-service.interface'; +import { NewsCardComponent } from 'src/app/features/news-feed/components/news-card/news-card.component'; @Injectable({ providedIn: 'root' }) -export class NewsService implements IList { +export class NewsService implements IListService { private id: number = 0; private delay: number = 3000; @@ -42,6 +43,9 @@ export class NewsService implements IList { this.generateRandomNewsItem() ]; + public dataType = Post; + public cardComponent = NewsCardComponent; + constructor() { } diff --git a/src/app/core/services/people.service.ts b/src/app/core/services/people.service.ts index f1ee844d..6887c615 100644 --- a/src/app/core/services/people.service.ts +++ b/src/app/core/services/people.service.ts @@ -2,12 +2,13 @@ import { Injectable } from '@angular/core'; import { Person } from '../models/person.model'; import { Observable } from 'rxjs'; import { Location } from '../models/location.model'; -import { IList } from '../interfaces/list.interface'; +import { IListService } from '../interfaces/list-service.interface'; +import { ProfileCardComponent } from 'src/app/features/profile/components/profile-card/profile-card.component'; @Injectable({ providedIn: 'root' }) -export class PeopleService implements IList { +export class PeopleService implements IListService { private id: number = 0; private delay: number = 3000; @@ -25,6 +26,9 @@ export class PeopleService implements IList { this.generateRandomPerson() ]; + public dataType = Person; + public cardComponent = ProfileCardComponent; + constructor() { } get(id: string | null, delay: number = this.delay): Observable { diff --git a/src/app/features/home/home.component.html b/src/app/features/home/home.component.html index 71793468..63ac4431 100644 --- a/src/app/features/home/home.component.html +++ b/src/app/features/home/home.component.html @@ -24,6 +24,8 @@ + + diff --git a/src/app/features/home/home.component.ts b/src/app/features/home/home.component.ts index 3a724017..f761da29 100644 --- a/src/app/features/home/home.component.ts +++ b/src/app/features/home/home.component.ts @@ -42,10 +42,10 @@ export class HomeComponent implements OnInit { loadingGroups: boolean = true; constructor(public translations: Translations, - private newsService: NewsService, - private eventService: EventService, - private peopleService: PeopleService, - private groupService: GroupService) { + public newsService: NewsService, + public eventService: EventService, + public peopleService: PeopleService, + public groupService: GroupService) { } diff --git a/src/app/shared/components/list/list.component.html b/src/app/shared/components/list/list.component.html new file mode 100644 index 00000000..23cb6b85 --- /dev/null +++ b/src/app/shared/components/list/list.component.html @@ -0,0 +1,7 @@ +
+
+ + +
+
diff --git a/src/app/shared/components/list/list.component.scss b/src/app/shared/components/list/list.component.scss new file mode 100644 index 00000000..3e3629fe --- /dev/null +++ b/src/app/shared/components/list/list.component.scss @@ -0,0 +1,14 @@ +:host { + .gcc-list-container { + overflow: visible; + + .gcc-list-item { + padding-bottom: 40px; + } + + > div:not(.gcc-list-item) { + font-size: 18px; + font-weight: 600; + } + } +} \ No newline at end of file diff --git a/src/app/shared/components/list/list.component.spec.ts b/src/app/shared/components/list/list.component.spec.ts new file mode 100644 index 00000000..1b7458c4 --- /dev/null +++ b/src/app/shared/components/list/list.component.spec.ts @@ -0,0 +1,21 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ListComponent } from './list.component'; + +describe('ListComponent', () => { + let component: ListComponent; + let fixture: ComponentFixture; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [ListComponent] + }); + fixture = TestBed.createComponent(ListComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/components/list/list.component.ts b/src/app/shared/components/list/list.component.ts new file mode 100644 index 00000000..bdae4077 --- /dev/null +++ b/src/app/shared/components/list/list.component.ts @@ -0,0 +1,47 @@ +import { Component, Injector, Input, OnInit } from '@angular/core'; +import { NgComponentOutlet } from '@angular/common'; +import { IListService } from 'src/app/core/interfaces/list-service.interface'; + +@Component({ + selector: 'app-list', + templateUrl: './list.component.html', + styleUrls: ['./list.component.scss'] +}) +export class ListComponent implements OnInit { + + @Input({required:true}) service!: IListService; + @Input() items: typeof this.service.dataType[] = []; + @Input() cardSize: CardSize | string = CardSize.Small; + @Input() orientation: Orientation | string = Orientation.Vertical; + + loading: boolean = true; + + injector!: Injector; + + constructor(public injec: Injector) { + + } + + ngOnInit(): void { + this.injector = Injector.create({providers: [{provide: this.service.cardComponent, deps: []}], parent: this.injec}); + + if (this.items.length === 0) { + this.service.getMany(10, 5000).subscribe((items: typeof this.service.dataType[]) => { + this.items = items; + this.loading = false; + }); + } + } +} + +export enum Orientation { + Vertical = "vertical", + Horizontal = "horizontal" +} + +export enum CardSize { + Small = "small", + Medium = "medium", + Large = "large", + Dynamic = "dynamic" +} \ No newline at end of file diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index b6d62ba6..ca9afa87 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -46,6 +46,7 @@ import { TruncateFileNamePipe } from './pipes/truncate-file-name/truncate-file-n import { FormControlPipe } from './pipes/form-control/form-control.pipe'; import { FormGroupPipe } from './pipes/form-group/form-group.pipe'; import { FileSelectComponent } from './components/file-select/file-select.component'; +import { ListComponent } from './components/list/list.component'; @NgModule({ @@ -71,7 +72,8 @@ import { FileSelectComponent } from './components/file-select/file-select.compon TruncateFileNamePipe, FormControlPipe, FormGroupPipe, - FileSelectComponent + FileSelectComponent, + ListComponent ], imports: [ CommonModule, @@ -101,7 +103,7 @@ import { FileSelectComponent } from './components/file-select/file-select.compon MatDatepickerModule, MatAutocompleteModule, NgxSkeletonLoaderModule, - InfiniteScrollModule, + InfiniteScrollModule ], exports: [ TranslateModule, @@ -123,6 +125,7 @@ import { FileSelectComponent } from './components/file-select/file-select.compon BlogFormComponent, EventFormComponent, PollFormComponent, + ListComponent ], providers: [ { From 1a2862ce1befbbcb17b38881d5c5491cc5f5d0ff Mon Sep 17 00:00:00 2001 From: doug0102 Date: Thu, 23 Nov 2023 11:14:21 -0500 Subject: [PATCH 090/165] angular upgraded 16.0.0 -> 16.2.0 --- package-lock.json | 8268 +++++++++++------ package.json | 24 +- .../components/list/list.component.html | 2 +- .../components/list/list.component.scss | 5 - .../shared/components/list/list.component.ts | 8 +- 5 files changed, 5218 insertions(+), 3089 deletions(-) diff --git a/package-lock.json b/package-lock.json index ce4d4963..1d797ed4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,16 +8,16 @@ "name": "gccollab-frontend", "version": "0.0.0", "dependencies": { - "@angular/animations": "^16.0.1", + "@angular/animations": "^16.2.0", "@angular/cdk": "^16.0.0", - "@angular/common": "^16.0.1", - "@angular/compiler": "^16.0.1", - "@angular/core": "^16.0.1", - "@angular/forms": "^16.0.1", + "@angular/common": "^16.2.0", + "@angular/compiler": "^16.2.0", + "@angular/core": "^16.2.0", + "@angular/forms": "^16.2.0", "@angular/material": "^16.0.0", - "@angular/platform-browser": "^16.0.1", - "@angular/platform-browser-dynamic": "^16.0.1", - "@angular/router": "^16.0.1", + "@angular/platform-browser": "^16.2.0", + "@angular/platform-browser-dynamic": "^16.2.0", + "@angular/router": "^16.2.0", "@ngx-translate/core": "^14.0.0", "@ngx-translate/http-loader": "^7.0.0", "angular-auth-oidc-client": "^14.1.5", @@ -31,9 +31,9 @@ "zone.js": "~0.13.0" }, "devDependencies": { - "@angular-devkit/build-angular": "^16.0.0", - "@angular/cli": "~16.0.0", - "@angular/compiler-cli": "^16.0.1", + "@angular-devkit/build-angular": "^16.2.0", + "@angular/cli": "~16.2.0", + "@angular/compiler-cli": "^16.2.0", "@types/jasmine": "~4.0.0", "dependency-cruiser": "^12.10.1", "jasmine-core": "~4.3.0", @@ -59,12 +59,12 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1600.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1600.0.tgz", - "integrity": "sha512-nYRcqAxZnndhAEpSpJ1U2TScs2huu674OKrsEyJTqLEANEyCPBnusAmS9HcGzMBgePAwNElqOKrr5/f1DbYq1A==", + "version": "0.1602.10", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1602.10.tgz", + "integrity": "sha512-FwemQXh3edqA/S6zPpsqKei5v7gt0R0WpjJoAJaz+FOpfDwij1fwnKr88XINY8xcefTcQaTDQxJZheJShA/hHw==", "dev": true, "dependencies": { - "@angular-devkit/core": "16.0.0", + "@angular-devkit/core": "16.2.10", "rxjs": "7.8.1" }, "engines": { @@ -83,40 +83,40 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.0.0.tgz", - "integrity": "sha512-OvDQAbrV3cUMfHws30MnDURsXselZ0GWhSxZjOdcD3cF64Nsq5ywftHOT+QC3YdDghwI8gMADN9et+aVDscBzQ==", + "version": "16.2.10", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.2.10.tgz", + "integrity": "sha512-msB/qjIsAOySDxdU5DpcX2sWGUEJOFIO03O9+HbtLwf3NDfe74mFfejxuKlHJXIJdgpM2Zc948M6+618QKpUYA==", "dev": true, "dependencies": { "@ampproject/remapping": "2.2.1", - "@angular-devkit/architect": "0.1600.0", - "@angular-devkit/build-webpack": "0.1600.0", - "@angular-devkit/core": "16.0.0", - "@babel/core": "7.21.4", - "@babel/generator": "7.21.4", - "@babel/helper-annotate-as-pure": "7.18.6", - "@babel/helper-split-export-declaration": "7.18.6", + "@angular-devkit/architect": "0.1602.10", + "@angular-devkit/build-webpack": "0.1602.10", + "@angular-devkit/core": "16.2.10", + "@babel/core": "7.22.9", + "@babel/generator": "7.22.9", + "@babel/helper-annotate-as-pure": "7.22.5", + "@babel/helper-split-export-declaration": "7.22.6", "@babel/plugin-proposal-async-generator-functions": "7.20.7", - "@babel/plugin-transform-async-to-generator": "7.20.7", - "@babel/plugin-transform-runtime": "7.21.4", - "@babel/preset-env": "7.21.4", - "@babel/runtime": "7.21.0", - "@babel/template": "7.20.7", + "@babel/plugin-transform-async-to-generator": "7.22.5", + "@babel/plugin-transform-runtime": "7.22.9", + "@babel/preset-env": "7.22.9", + "@babel/runtime": "7.22.6", + "@babel/template": "7.22.5", "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "16.0.0", + "@ngtools/webpack": "16.2.10", "@vitejs/plugin-basic-ssl": "1.0.1", "ansi-colors": "4.1.3", "autoprefixer": "10.4.14", - "babel-loader": "9.1.2", + "babel-loader": "9.1.3", "babel-plugin-istanbul": "6.1.1", - "browserslist": "4.21.5", - "cacache": "17.0.6", + "browserslist": "^4.21.5", "chokidar": "3.5.3", "copy-webpack-plugin": "11.0.0", - "critters": "0.0.16", - "css-loader": "6.7.3", - "esbuild-wasm": "0.17.18", - "glob": "8.1.0", + "critters": "0.0.20", + "css-loader": "6.8.1", + "esbuild-wasm": "0.18.17", + "fast-glob": "3.3.1", + "guess-parser": "0.4.22", "https-proxy-agent": "5.0.1", "inquirer": "8.2.4", "jsonc-parser": "3.2.0", @@ -125,31 +125,32 @@ "less-loader": "11.1.0", "license-webpack-plugin": "4.0.2", "loader-utils": "3.2.1", - "magic-string": "0.30.0", - "mini-css-extract-plugin": "2.7.5", + "magic-string": "0.30.1", + "mini-css-extract-plugin": "2.7.6", "mrmime": "1.0.1", "open": "8.4.2", "ora": "5.4.1", "parse5-html-rewriting-stream": "7.0.0", - "piscina": "3.2.0", - "postcss": "8.4.23", - "postcss-loader": "7.2.4", + "picomatch": "2.3.1", + "piscina": "4.0.0", + "postcss": "8.4.31", + "postcss-loader": "7.3.3", "resolve-url-loader": "5.0.0", "rxjs": "7.8.1", - "sass": "1.62.1", - "sass-loader": "13.2.2", - "semver": "7.4.0", + "sass": "1.64.1", + "sass-loader": "13.3.2", + "semver": "7.5.4", "source-map-loader": "4.0.1", "source-map-support": "0.5.21", - "terser": "5.17.1", + "terser": "5.19.2", "text-table": "0.2.0", "tree-kill": "1.2.2", - "tslib": "2.5.0", - "vite": "4.3.1", - "webpack": "5.80.0", - "webpack-dev-middleware": "6.0.2", - "webpack-dev-server": "4.13.2", - "webpack-merge": "5.8.0", + "tslib": "2.6.1", + "vite": "4.4.7", + "webpack": "5.88.2", + "webpack-dev-middleware": "6.1.1", + "webpack-dev-server": "4.15.1", + "webpack-merge": "5.9.0", "webpack-subresource-integrity": "5.1.0" }, "engines": { @@ -158,7 +159,7 @@ "yarn": ">= 1.13.0" }, "optionalDependencies": { - "esbuild": "0.17.18" + "esbuild": "0.18.17" }, "peerDependencies": { "@angular/compiler-cli": "^16.0.0", @@ -171,7 +172,7 @@ "ng-packagr": "^16.0.0", "protractor": "^7.0.0", "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=4.9.3 <5.1" + "typescript": ">=4.9.3 <5.2" }, "peerDependenciesMeta": { "@angular/localize": { @@ -204,42 +205,432 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/@babel/core": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.4.tgz", - "integrity": "sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", + "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.4", - "@babel/helper-compilation-targets": "^7.21.4", - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.4", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.4", - "@babel/types": "^7.21.4", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.9", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.8", + "@babel/types": "^7.22.5", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.2", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/android-arm": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.17.tgz", + "integrity": "sha512-wHsmJG/dnL3OkpAcwbgoBTTMHVi4Uyou3F5mf58ZtmUyIKfcdA7TROav/6tCzET4A3QW2Q2FC+eFneMU+iyOxg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/android-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.17.tgz", + "integrity": "sha512-9np+YYdNDed5+Jgr1TdWBsozZ85U1Oa3xW0c7TWqH0y2aGghXtZsuT8nYRbzOMcl0bXZXjOGbksoTtVOlWrRZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/android-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.17.tgz", + "integrity": "sha512-O+FeWB/+xya0aLg23hHEM2E3hbfwZzjqumKMSIqcHbNvDa+dza2D0yLuymRBQQnC34CWrsJUXyH2MG5VnLd6uw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/darwin-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.17.tgz", + "integrity": "sha512-M9uJ9VSB1oli2BE/dJs3zVr9kcCBBsE883prage1NWz6pBS++1oNn/7soPNS3+1DGj0FrkSvnED4Bmlu1VAE9g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/darwin-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.17.tgz", + "integrity": "sha512-XDre+J5YeIJDMfp3n0279DFNrGCXlxOuGsWIkRb1NThMZ0BsrWXoTg23Jer7fEXQ9Ye5QjrvXpxnhzl3bHtk0g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.17.tgz", + "integrity": "sha512-cjTzGa3QlNfERa0+ptykyxs5A6FEUQQF0MuilYXYBGdBxD3vxJcKnzDlhDCa1VAJCmAxed6mYhA2KaJIbtiNuQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/freebsd-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.17.tgz", + "integrity": "sha512-sOxEvR8d7V7Kw8QqzxWc7bFfnWnGdaFBut1dRUYtu+EIRXefBc/eIsiUiShnW0hM3FmQ5Zf27suDuHsKgZ5QrA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-arm": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.17.tgz", + "integrity": "sha512-2d3Lw6wkwgSLC2fIvXKoMNGVaeY8qdN0IC3rfuVxJp89CRfA3e3VqWifGDfuakPmp90+ZirmTfye1n4ncjv2lg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.17.tgz", + "integrity": "sha512-c9w3tE7qA3CYWjT+M3BMbwMt+0JYOp3vCMKgVBrCl1nwjAlOMYzEo+gG7QaZ9AtqZFj5MbUc885wuBBmu6aADQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-ia32": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.17.tgz", + "integrity": "sha512-1DS9F966pn5pPnqXYz16dQqWIB0dmDfAQZd6jSSpiT9eX1NzKh07J6VKR3AoXXXEk6CqZMojiVDSZi1SlmKVdg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-loong64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.17.tgz", + "integrity": "sha512-EvLsxCk6ZF0fpCB6w6eOI2Fc8KW5N6sHlIovNe8uOFObL2O+Mr0bflPHyHwLT6rwMg9r77WOAWb2FqCQrVnwFg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-mips64el": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.17.tgz", + "integrity": "sha512-e0bIdHA5p6l+lwqTE36NAW5hHtw2tNRmHlGBygZC14QObsA3bD4C6sXLJjvnDIjSKhW1/0S3eDy+QmX/uZWEYQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-ppc64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.17.tgz", + "integrity": "sha512-BAAilJ0M5O2uMxHYGjFKn4nJKF6fNCdP1E0o5t5fvMYYzeIqy2JdAP88Az5LHt9qBoUa4tDaRpfWt21ep5/WqQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-riscv64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.17.tgz", + "integrity": "sha512-Wh/HW2MPnC3b8BqRSIme/9Zhab36PPH+3zam5pqGRH4pE+4xTrVLx2+XdGp6fVS3L2x+DrsIcsbMleex8fbE6g==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-s390x": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.17.tgz", + "integrity": "sha512-j/34jAl3ul3PNcK3pfI0NSlBANduT2UO5kZ7FCaK33XFv3chDhICLY8wJJWIhiQ+YNdQ9dxqQctRg2bvrMlYgg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.17.tgz", + "integrity": "sha512-QM50vJ/y+8I60qEmFxMoxIx4de03pGo2HwxdBeFd4nMh364X6TIBZ6VQ5UQmPbQWUVWHWws5MmJXlHAXvJEmpQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/netbsd-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.17.tgz", + "integrity": "sha512-/jGlhWR7Sj9JPZHzXyyMZ1RFMkNPjC6QIAan0sDOtIo2TYk3tZn5UDrkE0XgsTQCxWTTOcMPf9p6Rh2hXtl5TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/openbsd-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.17.tgz", + "integrity": "sha512-rSEeYaGgyGGf4qZM2NonMhMOP/5EHp4u9ehFiBrg7stH6BYEEjlkVREuDEcQ0LfIl53OXLxNbfuIj7mr5m29TA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/sunos-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.17.tgz", + "integrity": "sha512-Y7ZBbkLqlSgn4+zot4KUNYst0bFoO68tRgI6mY2FIM+b7ZbyNVtNbDP5y8qlu4/knZZ73fgJDlXID+ohY5zt5g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/win32-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.17.tgz", + "integrity": "sha512-bwPmTJsEQcbZk26oYpc4c/8PvTY3J5/QK8jM19DVlEsAB41M39aWovWoHtNm78sd6ip6prilxeHosPADXtEJFw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/win32-ia32": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.17.tgz", + "integrity": "sha512-H/XaPtPKli2MhW+3CQueo6Ni3Avggi6hP/YvgkEe1aSaxw+AeO8MFjq8DlgfTd9Iz4Yih3QCZI6YLMoyccnPRg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/win32-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.17.tgz", + "integrity": "sha512-fGEb8f2BSA3CW7riJVurug65ACLuQAzKq0SSqkY2b2yHHH0MzDfbLyKIGzHwOI/gkHcxM/leuSW6D5w/LMNitA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@angular-devkit/build-angular/node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "node_modules/@angular-devkit/build-angular/node_modules/esbuild": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.17.tgz", + "integrity": "sha512-1GJtYnUxsJreHYA0Y+iQz2UEykonY66HNWOb0yXYZi9/kNrORUEHVg87eQsCtqh59PEJ5YVZJO98JHznMJSWjg==", "dev": true, + "hasInstallScript": true, + "optional": true, "bin": { - "semver": "bin/semver.js" + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.17", + "@esbuild/android-arm64": "0.18.17", + "@esbuild/android-x64": "0.18.17", + "@esbuild/darwin-arm64": "0.18.17", + "@esbuild/darwin-x64": "0.18.17", + "@esbuild/freebsd-arm64": "0.18.17", + "@esbuild/freebsd-x64": "0.18.17", + "@esbuild/linux-arm": "0.18.17", + "@esbuild/linux-arm64": "0.18.17", + "@esbuild/linux-ia32": "0.18.17", + "@esbuild/linux-loong64": "0.18.17", + "@esbuild/linux-mips64el": "0.18.17", + "@esbuild/linux-ppc64": "0.18.17", + "@esbuild/linux-riscv64": "0.18.17", + "@esbuild/linux-s390x": "0.18.17", + "@esbuild/linux-x64": "0.18.17", + "@esbuild/netbsd-x64": "0.18.17", + "@esbuild/openbsd-x64": "0.18.17", + "@esbuild/sunos-x64": "0.18.17", + "@esbuild/win32-arm64": "0.18.17", + "@esbuild/win32-ia32": "0.18.17", + "@esbuild/win32-x64": "0.18.17" } }, "node_modules/@angular-devkit/build-angular/node_modules/lru-cache": { @@ -264,9 +655,9 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/semver": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.4.0.tgz", - "integrity": "sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -279,12 +670,12 @@ } }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1600.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1600.0.tgz", - "integrity": "sha512-ZlNNMtAzgMCsaN5crkqtgeYxWEyZ78/ePfrJTB3+Hb6LS+hsRf4WAYubHWRWReSx87ppluRrgNZLy0K9ooWy1w==", + "version": "0.1602.10", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1602.10.tgz", + "integrity": "sha512-H7HiFKbZl/xVxpr1RH05SGawTpA1417wvr2nFGRu2OiePd0lPr6pIhcq8F8gt7JcA8yZKKaqjn2gU+6um2MFLg==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1600.0", + "@angular-devkit/architect": "0.1602.10", "rxjs": "7.8.1" }, "engines": { @@ -307,14 +698,15 @@ } }, "node_modules/@angular-devkit/core": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.0.0.tgz", - "integrity": "sha512-YJKvAJlg4/lfP93pQNawlOTQalynWGpoatZU+1aXBgRh5YCTKu2S/A3gtQ71DBuhac76gJe1RpxDoq41kB2KlQ==", + "version": "16.2.10", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.10.tgz", + "integrity": "sha512-eo7suLDjyu5bSlEr4TluYkFm4v2PVLSAPgnau8XHHlN5Yg4P/BZ00ve7LA7C9S1gzRSCrxQhK5ki4rnoFTo5zg==", "dev": true, "dependencies": { "ajv": "8.12.0", "ajv-formats": "2.1.1", "jsonc-parser": "3.2.0", + "picomatch": "2.3.1", "rxjs": "7.8.1", "source-map": "0.7.4" }, @@ -342,14 +734,14 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.0.0.tgz", - "integrity": "sha512-9uFOqjOQdhnpxU5mku2LvBkV5Ave2ihHBFaQCH7vQ7DD+p4NpLHu93bMSh+f7k9W7F0lY18g9qrihRgK/7wfuA==", + "version": "16.2.10", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.2.10.tgz", + "integrity": "sha512-UCfPJKVNekb21bWRbzyx81tfHN3x8vU4ZMX/VA6xALg//QalMB7NOkkXBAssthnLastkyzkUtlvApTp2+R+EkQ==", "dev": true, "dependencies": { - "@angular-devkit/core": "16.0.0", + "@angular-devkit/core": "16.2.10", "jsonc-parser": "3.2.0", - "magic-string": "0.30.0", + "magic-string": "0.30.1", "ora": "5.4.1", "rxjs": "7.8.1" }, @@ -369,9 +761,9 @@ } }, "node_modules/@angular/animations": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-16.0.1.tgz", - "integrity": "sha512-ziRq1hGJJuQqQUHqNpEMp9uy1pVutvL8oNvawblh32u4bnLsVQU5gMd6sTonn0x4sphEwMNnuEmp/q6QRIx+pA==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-16.2.12.tgz", + "integrity": "sha512-MD0ElviEfAJY8qMOd6/jjSSvtqER2RDAi0lxe6EtUacC1DHCYkaPrKW4vLqY+tmZBg1yf+6n+uS77pXcHHcA3w==", "dependencies": { "tslib": "^2.3.0" }, @@ -379,7 +771,7 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/core": "16.0.1" + "@angular/core": "16.2.12" } }, "node_modules/@angular/cdk": { @@ -398,18 +790,6 @@ "rxjs": "^6.5.3 || ^7.4.0" } }, - "node_modules/@angular/cdk/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "optional": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/@angular/cdk/node_modules/parse5": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", @@ -423,27 +803,27 @@ } }, "node_modules/@angular/cli": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-16.0.0.tgz", - "integrity": "sha512-vsveaSJ5kj0MeJCg1nir5iJJEsdrRRnyNeL1awMcyrEjAhBPX3d0gfOP2fe0HR5KJtntX8zvihGus3i48Quo7A==", + "version": "16.2.10", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-16.2.10.tgz", + "integrity": "sha512-zDqlD+rXFuYZP169c2v35HkMbkchVCft5sS+VpoCCgYTk2rwxpeYkjJ8DQZztZJZRXQ+EMpkv/TubswmDro2zA==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1600.0", - "@angular-devkit/core": "16.0.0", - "@angular-devkit/schematics": "16.0.0", - "@schematics/angular": "16.0.0", + "@angular-devkit/architect": "0.1602.10", + "@angular-devkit/core": "16.2.10", + "@angular-devkit/schematics": "16.2.10", + "@schematics/angular": "16.2.10", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.3", - "ini": "4.0.0", + "ini": "4.1.1", "inquirer": "8.2.4", "jsonc-parser": "3.2.0", "npm-package-arg": "10.1.0", "npm-pick-manifest": "8.0.1", "open": "8.4.2", "ora": "5.4.1", - "pacote": "15.1.3", + "pacote": "15.2.0", "resolve": "1.22.2", - "semver": "7.4.0", + "semver": "7.5.4", "symbol-observable": "4.0.0", "yargs": "17.7.2" }, @@ -469,9 +849,9 @@ } }, "node_modules/@angular/cli/node_modules/semver": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.4.0.tgz", - "integrity": "sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -484,9 +864,9 @@ } }, "node_modules/@angular/common": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-16.0.1.tgz", - "integrity": "sha512-ic9Ri4Mepf4c0BTff7o4Oyl/a1vACNXXUzuoTwIjWnIqrH89dtwg7ncTD9Rv0N1lon7r4gXokTbn9A/Yk/0jbw==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-16.2.12.tgz", + "integrity": "sha512-B+WY/cT2VgEaz9HfJitBmgdk4I333XG/ybC98CMC4Wz8E49T8yzivmmxXB3OD6qvjcOB6ftuicl6WBqLbZNg2w==", "dependencies": { "tslib": "^2.3.0" }, @@ -494,14 +874,14 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/core": "16.0.1", + "@angular/core": "16.2.12", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-16.0.1.tgz", - "integrity": "sha512-7zNo6H1qVQow3T4EUul76SaIDSMRSl0hmtyWUzPjtWkxMjrCPSduqjA4/NHaG0KX1BsUvUtQEoDJ5jv/7EHWTQ==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-16.2.12.tgz", + "integrity": "sha512-6SMXUgSVekGM7R6l1Z9rCtUGtlg58GFmgbpMCsGf+VXxP468Njw8rjT2YZkf5aEPxEuRpSHhDYjqz7n14cwCXQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -509,7 +889,7 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/core": "16.0.1" + "@angular/core": "16.2.12" }, "peerDependenciesMeta": { "@angular/core": { @@ -518,12 +898,12 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-16.0.1.tgz", - "integrity": "sha512-EW7Oxp8EuTz3vCNd4RAncZGB7dCUYviUkBA4PzuyPmL2copZPt12j9qx0pXXF3T6ydjoZ+99ZEgfkKOV6FeU3g==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-16.2.12.tgz", + "integrity": "sha512-pWSrr152562ujh6lsFZR8NfNc5Ljj+zSTQO44DsuB0tZjwEpnRcjJEgzuhGXr+CoiBf+jTSPZKemtSktDk5aaA==", "dev": true, "dependencies": { - "@babel/core": "7.19.3", + "@babel/core": "7.23.2", "@jridgewell/sourcemap-codec": "^1.4.14", "chokidar": "^3.0.0", "convert-source-map": "^1.5.1", @@ -541,14 +921,14 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/compiler": "16.0.1", - "typescript": ">=4.9.3 <5.1" + "@angular/compiler": "16.2.12", + "typescript": ">=4.9.3 <5.2" } }, "node_modules/@angular/core": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-16.0.1.tgz", - "integrity": "sha512-3s4XBbzWgyWcjI0WFlNDKRxsbm4J+OKIL4mJCM9r8gWwno9y0K/giziAm9YMIJ4VOBIvrcMbOh85o44FCk8cRA==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-16.2.12.tgz", + "integrity": "sha512-GLLlDeke/NjroaLYOks0uyzFVo6HyLl7VOm0K1QpLXnYvW63W9Ql/T3yguRZa7tRkOAeFZ3jw+1wnBD4O8MoUA==", "dependencies": { "tslib": "^2.3.0" }, @@ -561,9 +941,9 @@ } }, "node_modules/@angular/forms": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-16.0.1.tgz", - "integrity": "sha512-VbH/YnEBau0q97zI7BjSk0pu/i2S0Y/zmhvA2wgI2CCvtbqT6hCNdE/3rW6ZFBcnuCe+dFhuchXe6dX28epsvg==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-16.2.12.tgz", + "integrity": "sha512-1Eao89hlBgLR3v8tU91vccn21BBKL06WWxl7zLpQmG6Hun+2jrThgOE4Pf3os4fkkbH4Apj0tWL2fNIWe/blbw==", "dependencies": { "tslib": "^2.3.0" }, @@ -571,9 +951,9 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/common": "16.0.1", - "@angular/core": "16.0.1", - "@angular/platform-browser": "16.0.1", + "@angular/common": "16.2.12", + "@angular/core": "16.2.12", + "@angular/platform-browser": "16.2.12", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -642,9 +1022,9 @@ } }, "node_modules/@angular/platform-browser": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-16.0.1.tgz", - "integrity": "sha512-7XLIOnTnGDJLE4Q0zBz6eI9q5V3NnsTAJqIICJHc4gk6jNgVz90gtejAQ4EFbo0d83XGzwFL22hxID5Dj1WRIA==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-16.2.12.tgz", + "integrity": "sha512-NnH7ju1iirmVEsUq432DTm0nZBGQsBrU40M3ZeVHMQ2subnGiyUs3QyzDz8+VWLL/T5xTxWLt9BkDn65vgzlIQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -652,9 +1032,9 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/animations": "16.0.1", - "@angular/common": "16.0.1", - "@angular/core": "16.0.1" + "@angular/animations": "16.2.12", + "@angular/common": "16.2.12", + "@angular/core": "16.2.12" }, "peerDependenciesMeta": { "@angular/animations": { @@ -663,9 +1043,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-16.0.1.tgz", - "integrity": "sha512-qrGlRPqJM42WZcHCbzwTA8SiK90xrhM/VrOL/8/1okuHn82gSWbbynpqycdZnsI9XMbW+HNhpKR2n8HKV38Jug==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-16.2.12.tgz", + "integrity": "sha512-ya54jerNgreCVAR278wZavwjrUWImMr2F8yM5n9HBvsMBbFaAQ83anwbOEiHEF2BlR+gJiEBLfpuPRMw20pHqw==", "dependencies": { "tslib": "^2.3.0" }, @@ -673,16 +1053,16 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/common": "16.0.1", - "@angular/compiler": "16.0.1", - "@angular/core": "16.0.1", - "@angular/platform-browser": "16.0.1" + "@angular/common": "16.2.12", + "@angular/compiler": "16.2.12", + "@angular/core": "16.2.12", + "@angular/platform-browser": "16.2.12" } }, "node_modules/@angular/router": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-16.0.1.tgz", - "integrity": "sha512-4GH0SxPbuY08B/M0f3NEHf9yIFH+D3wlzWJHI75chfdqQ8gGAMG6B6PSmo3haicDxHcSnZTYNJXDLOQvaBAHcA==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-16.2.12.tgz", + "integrity": "sha512-aU6QnYSza005V9P3W6PpkieL56O0IHps96DjqI1RS8yOJUl3THmokqYN4Fm5+HXy4f390FN9i6ftadYQDKeWmA==", "dependencies": { "tslib": "^2.3.0" }, @@ -690,9 +1070,9 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/common": "16.0.1", - "@angular/core": "16.0.1", - "@angular/platform-browser": "16.0.1", + "@angular/common": "16.2.12", + "@angular/core": "16.2.12", + "@angular/platform-browser": "16.2.12", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -703,47 +1083,48 @@ "dev": true }, "node_modules/@babel/code-frame": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", - "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.4.tgz", + "integrity": "sha512-r1IONyb6Ia+jYR2vvIDhdWdlTGhqbBoFqLTQidzZ4kepUFH15ejXvFHxCVbtl7BOXIudsIubf4E81xeA3h3IXA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.21.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.7.tgz", - "integrity": "sha512-KYMqFYTaenzMK4yUtf4EW9wc4N9ef80FsbMtkwool5zpwl4YrT1SdWYSTRcT94KO4hannogdS+LxY7L+arP3gA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz", + "integrity": "sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.3.tgz", - "integrity": "sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.3", - "@babel/helper-compilation-targets": "^7.19.3", - "@babel/helper-module-transforms": "^7.19.0", - "@babel/helpers": "^7.19.0", - "@babel/parser": "^7.19.3", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.3", - "@babel/types": "^7.19.3", - "convert-source-map": "^1.7.0", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", + "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helpers": "^7.23.2", + "@babel/parser": "^7.23.0", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -753,22 +1134,57 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/@babel/core/node_modules/@babel/generator": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.4.tgz", + "integrity": "sha512-esuS49Cga3HcThFNebGhlgsrVLkvhqvYDTzgjfFFlHJcIfLe5jFmRRfCQ1KuBfc4Jrtn3ndLgKWAKjBE+IraYQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.4", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core/node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz", - "integrity": "sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", + "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", "dev": true, "dependencies": { - "@babel/types": "^7.21.4", + "@babel/types": "^7.22.5", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -778,72 +1194,69 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.21.5.tgz", - "integrity": "sha512-uNrjKztPLkUk7bpCNC0jEKDJzzkvel/W+HguzbN8krA+LPfC1CEobJEvAvGka2A/M+ViOqXdcRL0GqPUJSjx9g==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", "dev": true, "dependencies": { - "@babel/types": "^7.21.5" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz", - "integrity": "sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.21.5", - "@babel/helper-validator-option": "^7.21.0", - "browserslist": "^4.21.3", + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", "lru-cache": "^5.1.1", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.8.tgz", - "integrity": "sha512-+THiN8MqiH2AczyuZrnrKL6cAxFRRQDKW9h1YkBvbgKmAm6mwiacig1qT73DHIWMGo40GRnsEfN3LA+E6NtmSw==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-member-expression-to-functions": "^7.21.5", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.21.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/helper-split-export-declaration": "^7.18.6", - "semver": "^6.3.0" + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", + "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -853,23 +1266,23 @@ } }, "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.8.tgz", - "integrity": "sha512-zGuSdedkFtsFHGbexAvNuipg1hbtitDLo2XE8/uf6Y9sOQV1xsYX/2pNbtedp/X0eU1pIt+kGvaqHCowkRbS5g==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-annotate-as-pure": "^7.22.5", "regexpu-core": "^5.3.1", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -879,148 +1292,151 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", - "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz", + "integrity": "sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" + "resolve": "^1.14.2" }, "peerDependencies": { - "@babel/core": "^7.4.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true, - "bin": { - "semver": "bin/semver.js" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz", - "integrity": "sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==", + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", + "node_modules/@babel/helper-function-name/node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "dependencies": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.5.tgz", - "integrity": "sha512-nIcGfgwpH2u4n9GG1HpStW5Ogx7x7ekiFHbjjFRKXbn5zUvqO9ZgotCO4x1aNbKn/x/xOUaXEhyNHCwtFCpxWg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", "dev": true, "dependencies": { - "@babel/types": "^7.21.5" + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", - "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dev": true, "dependencies": { - "@babel/types": "^7.21.4" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz", - "integrity": "sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-module-imports": "^7.21.4", - "@babel/helper-simple-access": "^7.21.5", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz", - "integrity": "sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -1030,379 +1446,210 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.21.5.tgz", - "integrity": "sha512-/y7vBgsr9Idu4M6MprbOVUfH3vs7tsIfnVWv/Ml2xgwvyH6LTngdfbf5AdsKwkJy4zgy1X/kuNrEKvhhK28Yrg==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-member-expression-to-functions": "^7.21.5", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz", - "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, "dependencies": { - "@babel/types": "^7.21.5" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", - "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", "dev": true, "dependencies": { - "@babel/types": "^7.20.0" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz", - "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", - "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", - "dev": true, - "dependencies": { - "@babel/helper-function-name": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.5.tgz", - "integrity": "sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA==", - "dev": true, - "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.8.tgz", - "integrity": "sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", - "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-proposal-optional-chaining": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", - "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", - "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", - "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", + "node_modules/@babel/helper-wrap-function/node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "node_modules/@babel/helpers": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.4.tgz", + "integrity": "sha512-HfcMizYz10cr3h29VqyfGL6ZWIjTwWfvYBMsBVGwpcbhNGe3wQ1ZXZRPzZoAHhd9OqHadHqjQ89iVKINXnbzuw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.4", + "@babel/types": "^7.23.4" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "node_modules/@babel/helpers/node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", - "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.7" + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" }, "engines": { "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.4.tgz", + "integrity": "sha512-vf3Xna6UEprW+7t6EtOmFpHNAuxw3xqPZghy+brsnusscJRW5BMUzzHZc5ICjULee81WeUV2jjakG09MDglJXQ==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", + "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", + "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.23.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.13.0" } }, - "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", + "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead.", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { "node": ">=6.9.0" @@ -1412,16 +1659,10 @@ } }, "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz", - "integrity": "sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==", + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, "engines": { "node": ">=6.9.0" }, @@ -1433,6 +1674,7 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-unicode-property-regex instead.", "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", @@ -1509,12 +1751,27 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", - "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", + "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", + "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1523,6 +1780,18 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", @@ -1637,13 +1906,47 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz", - "integrity": "sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", + "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.4.tgz", + "integrity": "sha512-efdkfPhHYTtn0G6n2ddrESE91fgXxjlqLsnUtPWnJs4a4mZIbUaK7ffqKIIUKXSHwcDvaCVX6GXkaJJFqtX7jw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { "node": ">=6.9.0" @@ -1653,14 +1956,14 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", - "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", + "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9" + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1670,12 +1973,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", + "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1685,12 +1988,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz", - "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", + "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1699,20 +2002,53 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz", - "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==", + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", + "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", + "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.3.tgz", + "integrity": "sha512-FGEQmugvAEu2QtgtU0uTASXevfLMFfBeVCIIdcQhn/uBQsMTjBajdnAtanQlOcuihWh10PZ7+HWvc7NtBwP74w==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-split-export-declaration": "^7.22.6", "globals": "^11.1.0" }, "engines": { @@ -1723,13 +2059,13 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz", - "integrity": "sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", + "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/template": "^7.20.7" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -1738,13 +2074,27 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-computed-properties/node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz", - "integrity": "sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", + "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1754,13 +2104,13 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", + "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1770,12 +2120,28 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", + "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", + "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1785,13 +2151,29 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", + "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", + "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1801,12 +2183,12 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz", - "integrity": "sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.3.tgz", + "integrity": "sha512-X8jSm8X1CMwxmK878qsUGJRmbysKNbdpTv/O1/v0LuY/ZkZrng5WYiekYSdg9m09OTmDDUWeEDsTE+17WYbAZw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1816,14 +2198,30 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", + "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", + "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1833,12 +2231,28 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", + "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", + "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { "node": ">=6.9.0" @@ -1848,12 +2262,12 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", + "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1863,13 +2277,13 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", - "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", + "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1879,14 +2293,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz", - "integrity": "sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", + "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.21.5", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-simple-access": "^7.21.5" + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1896,15 +2310,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", - "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz", + "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==", "dev": true, "dependencies": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-identifier": "^7.19.1" + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -1914,13 +2328,13 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", + "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1930,13 +2344,13 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", - "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1946,12 +2360,63 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", + "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", + "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", + "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz", + "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.23.3", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.23.3" }, "engines": { "node": ">=6.9.0" @@ -1961,13 +2426,46 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", + "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", + "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", + "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1977,12 +2475,46 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz", - "integrity": "sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", + "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", + "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", + "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { "node": ">=6.9.0" @@ -1992,12 +2524,12 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", + "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2007,13 +2539,13 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz", - "integrity": "sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", + "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "regenerator-transform": "^0.15.1" + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" }, "engines": { "node": ">=6.9.0" @@ -2023,12 +2555,12 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", + "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2038,17 +2570,17 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.4.tgz", - "integrity": "sha512-1J4dhrw1h1PqnNNpzwxQ2UBymJUF8KuPjAAnlLwZcGhHAIqUigFW7cdK6GHoB64ubY4qXQNYknoUeks4Wz7CUA==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.9.tgz", + "integrity": "sha512-9KjBH61AGJetCPYp/IEyLEp47SyybZb0nDRpBvmtEkm+rUIwxdlKpyNHI1TmsGkeuLclJdleQHRZ8XLBnnh8CQ==", "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.21.4", - "@babel/helper-plugin-utils": "^7.20.2", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "semver": "^6.3.0" + "dependencies": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.4", + "babel-plugin-polyfill-corejs3": "^0.8.2", + "babel-plugin-polyfill-regenerator": "^0.5.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -2058,21 +2590,21 @@ } }, "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", + "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2082,13 +2614,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", - "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", + "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2098,12 +2630,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", + "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2113,12 +2645,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", + "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2128,12 +2660,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", + "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2143,12 +2675,28 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz", - "integrity": "sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", + "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", + "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2158,13 +2706,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", + "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2173,39 +2721,43 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.21.4.tgz", - "integrity": "sha512-2W57zHs2yDLm6GD5ZpvNn71lZ0B/iypSdIeq25OurDKji6AdzV07qp4s3n1/x5BqtiGaTrPN3nerlSCaC5qNTw==", + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", + "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.21.4", - "@babel/helper-compilation-targets": "^7.21.4", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-option": "^7.21.0", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.20.7", - "@babel/plugin-proposal-async-generator-functions": "^7.20.7", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.21.0", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.20.7", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.20.7", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.21.0", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.21.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.9.tgz", + "integrity": "sha512-wNi5H/Emkhll/bqPjsjQorSykrlfY5OWakd6AulLvMEytpKasMVUpVy8RL4qBIBs5Ac6/5i0/Rv0b/Fg6Eag/g==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.9", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.5", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@babel/plugin-syntax-import-assertions": "^7.22.5", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", @@ -2215,45 +2767,62 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.20.7", - "@babel/plugin-transform-async-to-generator": "^7.20.7", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.21.0", - "@babel/plugin-transform-classes": "^7.21.0", - "@babel/plugin-transform-computed-properties": "^7.20.7", - "@babel/plugin-transform-destructuring": "^7.21.3", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.21.0", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.20.11", - "@babel/plugin-transform-modules-commonjs": "^7.21.2", - "@babel/plugin-transform-modules-systemjs": "^7.20.11", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.20.5", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.21.3", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.20.5", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.20.7", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.10", - "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.22.5", + "@babel/plugin-transform-async-generator-functions": "^7.22.7", + "@babel/plugin-transform-async-to-generator": "^7.22.5", + "@babel/plugin-transform-block-scoped-functions": "^7.22.5", + "@babel/plugin-transform-block-scoping": "^7.22.5", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-class-static-block": "^7.22.5", + "@babel/plugin-transform-classes": "^7.22.6", + "@babel/plugin-transform-computed-properties": "^7.22.5", + "@babel/plugin-transform-destructuring": "^7.22.5", + "@babel/plugin-transform-dotall-regex": "^7.22.5", + "@babel/plugin-transform-duplicate-keys": "^7.22.5", + "@babel/plugin-transform-dynamic-import": "^7.22.5", + "@babel/plugin-transform-exponentiation-operator": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.5", + "@babel/plugin-transform-for-of": "^7.22.5", + "@babel/plugin-transform-function-name": "^7.22.5", + "@babel/plugin-transform-json-strings": "^7.22.5", + "@babel/plugin-transform-literals": "^7.22.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.5", + "@babel/plugin-transform-member-expression-literals": "^7.22.5", + "@babel/plugin-transform-modules-amd": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.5", + "@babel/plugin-transform-modules-systemjs": "^7.22.5", + "@babel/plugin-transform-modules-umd": "^7.22.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.22.5", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.5", + "@babel/plugin-transform-numeric-separator": "^7.22.5", + "@babel/plugin-transform-object-rest-spread": "^7.22.5", + "@babel/plugin-transform-object-super": "^7.22.5", + "@babel/plugin-transform-optional-catch-binding": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.6", + "@babel/plugin-transform-parameters": "^7.22.5", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.5", + "@babel/plugin-transform-property-literals": "^7.22.5", + "@babel/plugin-transform-regenerator": "^7.22.5", + "@babel/plugin-transform-reserved-words": "^7.22.5", + "@babel/plugin-transform-shorthand-properties": "^7.22.5", + "@babel/plugin-transform-spread": "^7.22.5", + "@babel/plugin-transform-sticky-regex": "^7.22.5", + "@babel/plugin-transform-template-literals": "^7.22.5", + "@babel/plugin-transform-typeof-symbol": "^7.22.5", + "@babel/plugin-transform-unicode-escapes": "^7.22.5", + "@babel/plugin-transform-unicode-property-regex": "^7.22.5", + "@babel/plugin-transform-unicode-regex": "^7.22.5", + "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.21.4", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "core-js-compat": "^3.25.1", - "semver": "^6.3.0" + "@babel/types": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.4", + "babel-plugin-polyfill-corejs3": "^0.8.2", + "babel-plugin-polyfill-regenerator": "^0.5.1", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -2263,18 +2832,18 @@ } }, "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6.tgz", + "integrity": "sha512-ID2yj6K/4lKfhuU3+EX4UvNbIt7eACFbHmNUjzA+ep+B5971CknnA/9DEWKbRokfbbtblxxxXFJJrH47UEAMVg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", @@ -2284,7 +2853,7 @@ "esutils": "^2.0.2" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, "node_modules/@babel/regjsgen": { @@ -2294,9 +2863,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", - "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", "dev": true, "dependencies": { "regenerator-runtime": "^0.13.11" @@ -2306,33 +2875,33 @@ } }, "node_modules/@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.5.tgz", - "integrity": "sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.5", - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.5", - "@babel/types": "^7.21.5", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.4.tgz", + "integrity": "sha512-IYM8wSUwunWTB6tFC2dkKZhxbIjHoWemdK+3f8/wq8aKhbUscxD5MX72ubd90fxvFknaLPeGw5ycU84V1obHJg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.23.4", + "@babel/generator": "^7.23.4", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.4", + "@babel/types": "^7.23.4", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -2341,12 +2910,12 @@ } }, "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.5.tgz", - "integrity": "sha512-SrKK/sRv8GesIW1bDagf9cCG38IOMYZusoe1dfg0D8aiUe3Amvoj1QtjTPAWcfrZFvIwlleLb0gxzQidL9w14w==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.4.tgz", + "integrity": "sha512-esuS49Cga3HcThFNebGhlgsrVLkvhqvYDTzgjfFFlHJcIfLe5jFmRRfCQ1KuBfc4Jrtn3ndLgKWAKjBE+IraYQ==", "dev": true, "dependencies": { - "@babel/types": "^7.21.5", + "@babel/types": "^7.23.4", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -2356,13 +2925,13 @@ } }, "node_modules/@babel/types": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.5.tgz", - "integrity": "sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.4.tgz", + "integrity": "sha512-7uIFwVYpoplT5jp/kVv6EF93VaJ8H+Yn5IczYiaAi98ajzjfoZfslet/e0sLh+wVBjb2qqIut1b0S26VSafsSQ==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.21.5", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2378,30 +2947,6 @@ "node": ">=0.1.90" } }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", @@ -2412,9 +2957,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.18.tgz", - "integrity": "sha512-EmwL+vUBZJ7mhFCs5lA4ZimpUH3WMAoqvOIYhVQwdIgSpHC8ImHdsRyhHAVxpDYUSm0lWvd63z0XH1IlImS2Qw==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", "cpu": [ "arm" ], @@ -2428,9 +2973,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.18.tgz", - "integrity": "sha512-/iq0aK0eeHgSC3z55ucMAHO05OIqmQehiGay8eP5l/5l+iEr4EIbh4/MI8xD9qRFjqzgkc0JkX0LculNC9mXBw==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", "cpu": [ "arm64" ], @@ -2444,9 +2989,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.18.tgz", - "integrity": "sha512-x+0efYNBF3NPW2Xc5bFOSFW7tTXdAcpfEg2nXmxegm4mJuVeS+i109m/7HMiOQ6M12aVGGFlqJX3RhNdYM2lWg==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", "cpu": [ "x64" ], @@ -2460,9 +3005,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.18.tgz", - "integrity": "sha512-6tY+djEAdF48M1ONWnQb1C+6LiXrKjmqjzPNPWXhu/GzOHTHX2nh8Mo2ZAmBFg0kIodHhciEgUBtcYCAIjGbjQ==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", "cpu": [ "arm64" ], @@ -2476,9 +3021,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.18.tgz", - "integrity": "sha512-Qq84ykvLvya3dO49wVC9FFCNUfSrQJLbxhoQk/TE1r6MjHo3sFF2tlJCwMjhkBVq3/ahUisj7+EpRSz0/+8+9A==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", "cpu": [ "x64" ], @@ -2492,9 +3037,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.18.tgz", - "integrity": "sha512-fw/ZfxfAzuHfaQeMDhbzxp9mc+mHn1Y94VDHFHjGvt2Uxl10mT4CDavHm+/L9KG441t1QdABqkVYwakMUeyLRA==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", "cpu": [ "arm64" ], @@ -2508,9 +3053,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.18.tgz", - "integrity": "sha512-FQFbRtTaEi8ZBi/A6kxOC0V0E9B/97vPdYjY9NdawyLd4Qk5VD5g2pbWN2VR1c0xhzcJm74HWpObPszWC+qTew==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", "cpu": [ "x64" ], @@ -2524,9 +3069,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.18.tgz", - "integrity": "sha512-jW+UCM40LzHcouIaqv3e/oRs0JM76JfhHjCavPxMUti7VAPh8CaGSlS7cmyrdpzSk7A+8f0hiedHqr/LMnfijg==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", "cpu": [ "arm" ], @@ -2540,9 +3085,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.18.tgz", - "integrity": "sha512-R7pZvQZFOY2sxUG8P6A21eq6q+eBv7JPQYIybHVf1XkQYC+lT7nDBdC7wWKTrbvMXKRaGudp/dzZCwL/863mZQ==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", "cpu": [ "arm64" ], @@ -2556,9 +3101,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.18.tgz", - "integrity": "sha512-ygIMc3I7wxgXIxk6j3V00VlABIjq260i967Cp9BNAk5pOOpIXmd1RFQJQX9Io7KRsthDrQYrtcx7QCof4o3ZoQ==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", "cpu": [ "ia32" ], @@ -2572,9 +3117,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.18.tgz", - "integrity": "sha512-bvPG+MyFs5ZlwYclCG1D744oHk1Pv7j8psF5TfYx7otCVmcJsEXgFEhQkbhNW8otDHL1a2KDINW20cfCgnzgMQ==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", "cpu": [ "loong64" ], @@ -2588,9 +3133,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.18.tgz", - "integrity": "sha512-oVqckATOAGuiUOa6wr8TXaVPSa+6IwVJrGidmNZS1cZVx0HqkTMkqFGD2HIx9H1RvOwFeWYdaYbdY6B89KUMxA==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", "cpu": [ "mips64el" ], @@ -2604,9 +3149,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.18.tgz", - "integrity": "sha512-3dLlQO+b/LnQNxgH4l9rqa2/IwRJVN9u/bK63FhOPB4xqiRqlQAU0qDU3JJuf0BmaH0yytTBdoSBHrb2jqc5qQ==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", "cpu": [ "ppc64" ], @@ -2620,9 +3165,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.18.tgz", - "integrity": "sha512-/x7leOyDPjZV3TcsdfrSI107zItVnsX1q2nho7hbbQoKnmoeUWjs+08rKKt4AUXju7+3aRZSsKrJtaRmsdL1xA==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", "cpu": [ "riscv64" ], @@ -2636,9 +3181,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.18.tgz", - "integrity": "sha512-cX0I8Q9xQkL/6F5zWdYmVf5JSQt+ZfZD2bJudZrWD+4mnUvoZ3TDDXtDX2mUaq6upMFv9FlfIh4Gfun0tbGzuw==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", "cpu": [ "s390x" ], @@ -2652,9 +3197,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.18.tgz", - "integrity": "sha512-66RmRsPlYy4jFl0vG80GcNRdirx4nVWAzJmXkevgphP1qf4dsLQCpSKGM3DUQCojwU1hnepI63gNZdrr02wHUA==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", "cpu": [ "x64" ], @@ -2668,9 +3213,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.18.tgz", - "integrity": "sha512-95IRY7mI2yrkLlTLb1gpDxdC5WLC5mZDi+kA9dmM5XAGxCME0F8i4bYH4jZreaJ6lIZ0B8hTrweqG1fUyW7jbg==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", "cpu": [ "x64" ], @@ -2684,9 +3229,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.18.tgz", - "integrity": "sha512-WevVOgcng+8hSZ4Q3BKL3n1xTv5H6Nb53cBrtzzEjDbbnOmucEVcZeGCsCOi9bAOcDYEeBZbD2SJNBxlfP3qiA==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", "cpu": [ "x64" ], @@ -2700,9 +3245,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.18.tgz", - "integrity": "sha512-Rzf4QfQagnwhQXVBS3BYUlxmEbcV7MY+BH5vfDZekU5eYpcffHSyjU8T0xucKVuOcdCsMo+Ur5wmgQJH2GfNrg==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", "cpu": [ "x64" ], @@ -2716,9 +3261,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.18.tgz", - "integrity": "sha512-Kb3Ko/KKaWhjeAm2YoT/cNZaHaD1Yk/pa3FTsmqo9uFh1D1Rfco7BBLIPdDOozrObj2sahslFuAQGvWbgWldAg==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", "cpu": [ "arm64" ], @@ -2732,9 +3277,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.18.tgz", - "integrity": "sha512-0/xUMIdkVHwkvxfbd5+lfG7mHOf2FRrxNbPiKWg9C4fFrB8H0guClmaM3BFiRUYrznVoyxTIyC/Ou2B7QQSwmw==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", "cpu": [ "ia32" ], @@ -2748,9 +3293,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.18.tgz", - "integrity": "sha512-qU25Ma1I3NqTSHJUOKi9sAH1/Mzuvlke0ioMJRthLXKm7JiSKVwFghlGbDLOO2sARECGhja4xYfRAZNPAkooYg==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", "cpu": [ "x64" ], @@ -2847,9 +3392,9 @@ } }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "dependencies": { "ansi-regex": "^6.0.1" @@ -2936,9 +3481,9 @@ } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", @@ -3720,9 +4265,9 @@ } }, "node_modules/@ngtools/webpack": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.0.0.tgz", - "integrity": "sha512-I5zjGtJu2wwIdM+OFUHXezmwTJ0wpParVJgCxR0cLd0CIbpRYSjOSZQN/nR9ZnTKAI5uFZ3MM2p/VRQGUUHUcw==", + "version": "16.2.10", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.2.10.tgz", + "integrity": "sha512-XAVn59zP3ztuKDtw92Xc9+64RK4u4c9g8y5GgtjIWeOwgNXl8bYhAo3uTZzrSrOu96DFZGjsmghFab/7/C2pDg==", "dev": true, "engines": { "node": "^16.14.0 || >=18.10.0", @@ -3731,7 +4276,7 @@ }, "peerDependencies": { "@angular/compiler-cli": "^16.0.0", - "typescript": ">=4.9.3 <5.1", + "typescript": ">=4.9.3 <5.2", "webpack": "^5.54.0" } }, @@ -3808,9 +4353,9 @@ } }, "node_modules/@npmcli/git": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.0.4.tgz", - "integrity": "sha512-5yZghx+u5M47LghaybLCkdSyFzV/w4OuH12d96HO389Ik9CDsLaDZJVynSGGVJOLn6gy/k7Dz5XYcplM3uxXRg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", + "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", "dev": true, "dependencies": { "@npmcli/promise-spawn": "^6.0.0", @@ -3958,13 +4503,13 @@ } }, "node_modules/@schematics/angular": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.0.0.tgz", - "integrity": "sha512-Ao1Y0hEDa30JjWDLnUfOsD+9nnfdBFclfKFzR+7pvvFYCpSUhH1u+8e+7noruIxlP26+SpqPn3AF5+IRTGza8w==", + "version": "16.2.10", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.2.10.tgz", + "integrity": "sha512-PXmoswvN7qknTsXDmEvhZ9UG+awwWnQ/1Jd/eqqQx08iAaAT81OsXj1bN7eSs6tEGBKGjPb6q2xzuiECAdymzg==", "dev": true, "dependencies": { - "@angular-devkit/core": "16.0.0", - "@angular-devkit/schematics": "16.0.0", + "@angular-devkit/core": "16.2.10", + "@angular-devkit/schematics": "16.2.10", "jsonc-parser": "3.2.0" }, "engines": { @@ -3973,22 +4518,42 @@ "yarn": ">= 1.13.0" } }, + "node_modules/@sigstore/bundle": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-1.1.0.tgz", + "integrity": "sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog==", + "dev": true, + "dependencies": { + "@sigstore/protobuf-specs": "^0.2.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/@sigstore/protobuf-specs": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.1.0.tgz", - "integrity": "sha512-a31EnjuIDSX8IXBUib3cYLDRlPMU36AWX4xS8ysLaNu4ZzUesDiPt83pgrW2X1YLMe5L2HbDyaKK5BrL4cNKaQ==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz", + "integrity": "sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==", "dev": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@socket.io/component-emitter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", - "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", - "dev": true + "node_modules/@sigstore/sign": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-1.0.0.tgz", + "integrity": "sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA==", + "dev": true, + "dependencies": { + "@sigstore/bundle": "^1.1.0", + "@sigstore/protobuf-specs": "^0.2.0", + "make-fetch-happen": "^11.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } }, - "node_modules/@tootallnate/once": { + "node_modules/@sigstore/sign/node_modules/@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", @@ -3997,33 +4562,108 @@ "node": ">= 10" } }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "node_modules/@sigstore/sign/node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "dev": true, - "peer": true + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "node_modules/@sigstore/sign/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@sigstore/sign/node_modules/make-fetch-happen": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", "dev": true, - "peer": true + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "node_modules/@sigstore/sign/node_modules/minipass-fetch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", + "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/@sigstore/sign/node_modules/minipass-fetch/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "dev": true, - "peer": true + "engines": { + "node": ">=16 || 14 >=14.17" + } }, - "node_modules/@tsconfig/node16": { + "node_modules/@sigstore/tuf": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.3.tgz", + "integrity": "sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==", + "dev": true, + "dependencies": { + "@sigstore/protobuf-specs": "^0.2.0", + "tuf-js": "^1.1.7" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", + "dev": true + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "dev": true, - "peer": true + "engines": { + "node": ">= 6" + } }, "node_modules/@tufjs/canonical-json": { "version": "1.0.0", @@ -4047,25 +4687,10 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@tufjs/models/node_modules/minimatch": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.0.tgz", - "integrity": "sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", "dev": true, "dependencies": { "@types/connect": "*", @@ -4073,27 +4698,27 @@ } }, "node_modules/@types/bonjour": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", - "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", - "integrity": "sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", "dev": true, "dependencies": { "@types/express-serve-static-core": "*", @@ -4139,9 +4764,9 @@ "dev": true }, "node_modules/@types/express": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", "dev": true, "dependencies": { "@types/body-parser": "*", @@ -4151,9 +4776,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.34", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.34.tgz", - "integrity": "sha512-fvr49XlCGoUj2Pp730AItckfjat4WNb0lb3kfrLWffd+RLeoGAMsq7UOy04PAPtoL01uKwcp6u8nhzpgpDYr3w==", + "version": "4.17.41", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz", + "integrity": "sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==", "dev": true, "dependencies": { "@types/node": "*", @@ -4162,10 +4787,16 @@ "@types/send": "*" } }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true + }, "node_modules/@types/http-proxy": { - "version": "1.17.11", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz", - "integrity": "sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==", + "version": "1.17.14", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", + "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", "dev": true, "dependencies": { "@types/node": "*" @@ -4184,9 +4815,9 @@ "dev": true }, "node_modules/@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", "dev": true }, "node_modules/@types/node": { @@ -4195,16 +4826,25 @@ "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", "dev": true }, + "node_modules/@types/node-forge": { + "version": "1.3.10", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.10.tgz", + "integrity": "sha512-y6PJDYN4xYBxwd22l+OVH35N+1fCYWiuC3aiP2SlXVE6Lo7SS+rSx9r89hLxrP4pn6n1lBGhHJ12pj3F3Mpttw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "version": "6.9.10", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz", + "integrity": "sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==", "dev": true }, "node_modules/@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", "dev": true }, "node_modules/@types/retry": { @@ -4214,9 +4854,9 @@ "dev": true }, "node_modules/@types/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", - "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", "dev": true, "dependencies": { "@types/mime": "^1", @@ -4224,37 +4864,38 @@ } }, "node_modules/@types/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", "dev": true, "dependencies": { "@types/express": "*" } }, "node_modules/@types/serve-static": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", - "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", + "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", "dev": true, "dependencies": { + "@types/http-errors": "*", "@types/mime": "*", "@types/node": "*" } }, "node_modules/@types/sockjs": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", - "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/ws": { - "version": "8.5.4", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", - "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", "dev": true, "dependencies": { "@types/node": "*" @@ -4408,14 +5049,107 @@ "@webassemblyjs/utf8": "1.11.6" } }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@wessberg/ts-evaluator": { + "version": "0.0.27", + "resolved": "https://registry.npmjs.org/@wessberg/ts-evaluator/-/ts-evaluator-0.0.27.tgz", + "integrity": "sha512-7gOpVm3yYojUp/Yn7F4ZybJRxyqfMNf0LXK5KJiawbPfL0XTsJV+0mgrEDjOIR6Bi0OYk2Cyg4tjFu1r8MCZaA==", + "deprecated": "this package has been renamed to ts-evaluator. Please install ts-evaluator instead", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "jsdom": "^16.4.0", + "object-path": "^0.11.5", + "tslib": "^2.0.3" + }, + "engines": { + "node": ">=10.1.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/wessberg/ts-evaluator?sponsor=1" + }, + "peerDependencies": { + "typescript": ">=3.2.x || >= 4.x" + } + }, + "node_modules/@wessberg/ts-evaluator/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@wessberg/ts-evaluator/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@wessberg/ts-evaluator/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@wessberg/ts-evaluator/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@wessberg/ts-evaluator/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@wessberg/ts-evaluator/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@xtuc/long": "4.2.2" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/@xtuc/ieee754": { @@ -4473,10 +5207,41 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals/node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", "dev": true, "peerDependencies": { "acorn": "^8" @@ -4558,13 +5323,11 @@ } }, "node_modules/agentkeepalive": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.3.0.tgz", - "integrity": "sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", "dev": true, "dependencies": { - "debug": "^4.1.0", - "depd": "^2.0.0", "humanize-ms": "^1.2.1" }, "engines": { @@ -4733,13 +5496,6 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true, - "peer": true - }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -4755,6 +5511,12 @@ "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", "dev": true }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, "node_modules/autoprefixer": { "version": "10.4.14", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", @@ -4789,12 +5551,12 @@ } }, "node_modules/babel-loader": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.2.tgz", - "integrity": "sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA==", + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", + "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", "dev": true, "dependencies": { - "find-cache-dir": "^3.3.2", + "find-cache-dir": "^4.0.0", "schema-utils": "^4.0.0" }, "engines": { @@ -4822,51 +5584,51 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz", + "integrity": "sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", - "semver": "^6.1.1" + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.3", + "semver": "^6.3.1" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", - "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", + "version": "0.8.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz", + "integrity": "sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3", - "core-js-compat": "^3.25.1" + "@babel/helper-define-polyfill-provider": "^0.4.3", + "core-js-compat": "^3.33.1" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", - "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz", + "integrity": "sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3" + "@babel/helper-define-polyfill-provider": "^0.4.3" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/balanced-match": { @@ -5017,10 +5779,16 @@ "node": ">=8" } }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, "node_modules/browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", "dev": true, "funding": [ { @@ -5030,13 +5798,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" }, "bin": { "browserslist": "cli.js" @@ -5094,21 +5866,20 @@ } }, "node_modules/cacache": { - "version": "17.0.6", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.0.6.tgz", - "integrity": "sha512-ixcYmEBExFa/+ajIPjcwypxL97CjJyOsH9A/W+4qgEPIpJvKlC+HmVY8nkIck6n3PwUTdgq9c489niJGwl+5Cw==", + "version": "17.1.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", + "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", "dev": true, "dependencies": { "@npmcli/fs": "^3.1.0", "fs-minipass": "^3.0.0", "glob": "^10.2.2", "lru-cache": "^7.7.1", - "minipass": "^5.0.0", + "minipass": "^7.0.3", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", "ssri": "^10.0.0", "tar": "^6.1.11", "unique-filename": "^3.0.0" @@ -5117,28 +5888,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/cacache/node_modules/glob": { - "version": "10.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.3.tgz", - "integrity": "sha512-Kb4rfmBVE3eQTAimgmeqc2LwSnN0wIOkkUL6HmxEFxNJ4fHghYHVbFba/HcGcRjE6s9KoMNK3rSOwkL4PioZjg==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", - "minimatch": "^9.0.0", - "minipass": "^5.0.0", - "path-scurry": "^1.7.0" - }, - "bin": { - "glob": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/cacache/node_modules/lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", @@ -5148,19 +5897,13 @@ "node": ">=12" } }, - "node_modules/cacache/node_modules/minimatch": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.0.tgz", - "integrity": "sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==", + "node_modules/cacache/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, "engines": { "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" } }, "node_modules/call-bind": { @@ -5195,9 +5938,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001486", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001486.tgz", - "integrity": "sha512-uv7/gXuHi10Whlj0pp5q/tsK/32J2QSqVRKQhs2j8VsDCjgyruAh/eEXHF822VqO9yT6iZKw3nRwZRSPBE9OQg==", + "version": "1.0.30001564", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001564.tgz", + "integrity": "sha512-DqAOf+rhof+6GVx1y+xzbFPeOumfQnhYzVnZD6LAXijR77yPtm9mfOcqOnT3mpnJiZVT+kwLAFnRlZcIz+c6bg==", "dev": true, "funding": [ { @@ -5385,16 +6128,28 @@ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", "dev": true }, "node_modules/compressible": { @@ -5599,12 +6354,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.2.tgz", - "integrity": "sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA==", + "version": "3.33.3", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.3.tgz", + "integrity": "sha512-cNzGqFsh3Ot+529GIXacjTJ7kegdt5fPXxCBVS1G0iaZpuo/tBz399ymceLJveQhFFZ8qThHiP3fzuoQjKN2ow==", "dev": true, "dependencies": { - "browserslist": "^4.21.5" + "browserslist": "^4.22.1" }, "funding": { "type": "opencollective", @@ -5631,14 +6386,14 @@ } }, "node_modules/cosmiconfig": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.3.tgz", - "integrity": "sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==", + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "dev": true, "dependencies": { - "import-fresh": "^3.2.1", + "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", - "parse-json": "^5.0.0", + "parse-json": "^5.2.0", "path-type": "^4.0.0" }, "engines": { @@ -5646,22 +6401,14 @@ }, "funding": { "url": "https://github.com/sponsors/d-fischer" - } - }, - "node_modules/cosmiconfig-typescript-loader": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.3.0.tgz", - "integrity": "sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q==", - "dev": true, - "engines": { - "node": ">=12", - "npm": ">=6" }, "peerDependencies": { - "@types/node": "*", - "cosmiconfig": ">=7", - "ts-node": ">=10", - "typescript": ">=3" + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/cosmiconfig/node_modules/argparse": { @@ -5682,24 +6429,18 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true, - "peer": true - }, "node_modules/critters": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.16.tgz", - "integrity": "sha512-JwjgmO6i3y6RWtLYmXwO5jMd+maZt8Tnfu7VVISmEWyQqfLpB8soBswf8/2bu6SBXxtKA68Al3c+qIG1ApT68A==", + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.20.tgz", + "integrity": "sha512-CImNRorKOl5d8TWcnAz5n5izQ6HFsvz29k327/ELy6UFcmbiZNOsinaKvzv16WZR0P6etfSWYzE47C4/56B3Uw==", "dev": true, "dependencies": { "chalk": "^4.1.0", - "css-select": "^4.2.0", - "parse5": "^6.0.1", - "parse5-htmlparser2-tree-adapter": "^6.0.1", - "postcss": "^8.3.7", + "css-select": "^5.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.2", + "htmlparser2": "^8.0.2", + "postcss": "^8.4.23", "pretty-bytes": "^5.3.0" } }, @@ -5803,15 +6544,15 @@ } }, "node_modules/css-loader": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", - "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", + "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", "dev": true, "dependencies": { "icss-utils": "^5.1.0", - "postcss": "^8.4.19", + "postcss": "^8.4.21", "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-local-by-default": "^4.0.3", "postcss-modules-scope": "^3.0.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", @@ -5829,15 +6570,15 @@ } }, "node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "dev": true, "dependencies": { "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", "nth-check": "^2.0.1" }, "funding": { @@ -5868,12 +6609,50 @@ "node": ">=4" } }, + "node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, "node_modules/custom-event": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", "dev": true }, + "node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/date-format": { "version": "4.0.14", "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", @@ -5900,6 +6679,12 @@ } } }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true + }, "node_modules/default-gateway": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", @@ -5933,6 +6718,15 @@ "node": ">=8" } }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", @@ -6138,16 +6932,6 @@ "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", "dev": true }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.3.1" - } - }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -6167,9 +6951,9 @@ "dev": true }, "node_modules/dns-packet": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz", - "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", "dev": true, "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" @@ -6191,14 +6975,14 @@ } }, "node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" }, "funding": { "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" @@ -6216,13 +7000,34 @@ } ] }, + "node_modules/domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, "dependencies": { - "domelementtype": "^2.2.0" + "domelementtype": "^2.3.0" }, "engines": { "node": ">= 4" @@ -6232,14 +7037,14 @@ } }, "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "dev": true, "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" }, "funding": { "url": "https://github.com/fb55/domutils?sponsor=1" @@ -6258,9 +7063,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", + "version": "1.4.592", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.592.tgz", + "integrity": "sha512-D3NOkROIlF+d5ixnz7pAf3Lu/AuWpd6AYgI9O67GQXMXTcCP1gJQRotOq35eQy5Sb4hez33XH1YdTtILA7Udww==", "dev": true }, "node_modules/emoji-regex": { @@ -6360,10 +7165,13 @@ "dev": true }, "node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "devOptional": true, + "engines": { + "node": ">=0.12" + }, "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } @@ -6412,9 +7220,9 @@ "dev": true }, "node_modules/esbuild": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.18.tgz", - "integrity": "sha512-z1lix43jBs6UKjcZVKOw2xx69ffE2aG0PygLL5qJ9OS/gy0Ewd1gW/PUQIOIQGXBHWNywSc0floSKoMFF8aK2w==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", "dev": true, "hasInstallScript": true, "bin": { @@ -6424,34 +7232,34 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.17.18", - "@esbuild/android-arm64": "0.17.18", - "@esbuild/android-x64": "0.17.18", - "@esbuild/darwin-arm64": "0.17.18", - "@esbuild/darwin-x64": "0.17.18", - "@esbuild/freebsd-arm64": "0.17.18", - "@esbuild/freebsd-x64": "0.17.18", - "@esbuild/linux-arm": "0.17.18", - "@esbuild/linux-arm64": "0.17.18", - "@esbuild/linux-ia32": "0.17.18", - "@esbuild/linux-loong64": "0.17.18", - "@esbuild/linux-mips64el": "0.17.18", - "@esbuild/linux-ppc64": "0.17.18", - "@esbuild/linux-riscv64": "0.17.18", - "@esbuild/linux-s390x": "0.17.18", - "@esbuild/linux-x64": "0.17.18", - "@esbuild/netbsd-x64": "0.17.18", - "@esbuild/openbsd-x64": "0.17.18", - "@esbuild/sunos-x64": "0.17.18", - "@esbuild/win32-arm64": "0.17.18", - "@esbuild/win32-ia32": "0.17.18", - "@esbuild/win32-x64": "0.17.18" + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" } }, "node_modules/esbuild-wasm": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.17.18.tgz", - "integrity": "sha512-h4m5zVa+KaDuRFIbH9dokMwovvkIjTQJS7/Ry+0Z1paVuS9aIkso2vdA2GmwH9GSvGX6w71WveJ3PfkoLuWaRw==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.18.17.tgz", + "integrity": "sha512-9OHGcuRzy+I8ziF9FzjfKLWAPbvi0e/metACVg9k6bK+SI4FFxeV6PcZsz8RIVaMD4YNehw+qj6UMR3+qj/EuQ==", "dev": true, "bin": { "esbuild": "bin/esbuild" @@ -6484,6 +7292,46 @@ "node": ">=0.8.0" } }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -6602,6 +7450,12 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "dev": true + }, "node_modules/express": { "version": "4.18.2", "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", @@ -6728,9 +7582,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -6843,20 +7697,19 @@ } }, "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", "dev": true, "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" }, "engines": { - "node": ">=8" + "node": ">=14.16" }, "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/find-up": { @@ -6915,9 +7768,9 @@ } }, "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.1.tgz", - "integrity": "sha512-uUWsN4aOxJAS8KOuf3QMyFtgm1pkb6I+KRZbRF/ghdf5T7sM+B1lLLzPDxswUjkmHyxQAVzEgG35E3NzDM9GVw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, "engines": { "node": ">=14" @@ -6926,6 +7779,20 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -6972,21 +7839,30 @@ } }, "node_modules/fs-minipass": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.2.tgz", - "integrity": "sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", "dev": true, "dependencies": { - "minipass": "^5.0.0" + "minipass": "^7.0.3" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", + "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==", "dev": true }, "node_modules/fs.realpath": { @@ -7088,19 +7964,22 @@ } }, "node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=12" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -7182,6 +8061,18 @@ "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, + "node_modules/guess-parser": { + "version": "0.4.22", + "resolved": "https://registry.npmjs.org/guess-parser/-/guess-parser-0.4.22.tgz", + "integrity": "sha512-KcUWZ5ACGaBM69SbqwVIuWGoSAgD+9iJnchR9j/IarVI1jHVeXv+bUXBIMeqVMSKt3zrn0Dgf9UpcOEpPBLbSg==", + "dev": true, + "dependencies": { + "@wessberg/ts-evaluator": "0.0.27" + }, + "peerDependencies": { + "typescript": ">=3.7.5" + } + }, "node_modules/handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", @@ -7337,11 +8228,33 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/html-entities": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", - "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", - "dev": true + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", + "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] }, "node_modules/html-escaper": { "version": "2.0.2", @@ -7349,6 +8262,25 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, "node_modules/http-cache-semantics": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", @@ -7407,12 +8339,12 @@ } }, "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", "dev": true, "dependencies": { - "@tootallnate/once": "2", + "@tootallnate/once": "1", "agent-base": "6", "debug": "4" }, @@ -7540,21 +8472,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/ignore-walk/node_modules/minimatch": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.0.tgz", - "integrity": "sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/image-size": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", @@ -7640,9 +8557,9 @@ "dev": true }, "node_modules/ini": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.0.0.tgz", - "integrity": "sha512-t0ikzf5qkSFqRl1e6ejKBe+Tk2bsQd8ivEkcisyGXsku2t8NvXZ1Y3RRz5vxrDgOrTBOi13CvGsVoI5wVpd7xg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", "dev": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -7760,9 +8677,9 @@ "dev": true }, "node_modules/ipaddr.js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", "dev": true, "engines": { "node": ">= 10" @@ -7916,6 +8833,12 @@ "node": ">=0.10.0" } }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -8097,9 +9020,9 @@ } }, "node_modules/jackspeak": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.0.tgz", - "integrity": "sha512-r5XBrqIJfwRIjRt/Xr5fv9Wh09qyhHfKnYddDlpM+ibRR20qrYActpCAgU6U+d53EOEjzkvxPMVHSlgR7leXrQ==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", "dev": true, "dependencies": { "@isaacs/cliui": "^8.0.2" @@ -8158,6 +9081,15 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -8177,6 +9109,73 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dev": true, + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -8488,13 +9487,13 @@ } }, "node_modules/launch-editor": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz", - "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", + "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", "dev": true, "dependencies": { "picocolors": "^1.0.0", - "shell-quote": "^1.7.3" + "shell-quote": "^1.8.1" } }, "node_modules/less": { @@ -8796,17 +9795,23 @@ "dev": true }, "node_modules/magic-string": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", - "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", + "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", "dev": true, "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" + "@jridgewell/sourcemap-codec": "^1.4.15" }, "engines": { "node": ">=12" } }, + "node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -8831,13 +9836,6 @@ "semver": "bin/semver.js" } }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, - "peer": true - }, "node_modules/make-fetch-happen": { "version": "10.2.1", "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", @@ -8878,6 +9876,15 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/make-fetch-happen/node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, "node_modules/make-fetch-happen/node_modules/cacache": { "version": "16.1.3", "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", @@ -8919,6 +9926,39 @@ "node": ">= 8" } }, + "node_modules/make-fetch-happen/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/make-fetch-happen/node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/make-fetch-happen/node_modules/lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", @@ -8928,6 +9968,18 @@ "node": ">=12" } }, + "node_modules/make-fetch-happen/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/make-fetch-happen/node_modules/minipass": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", @@ -8986,12 +10038,12 @@ } }, "node_modules/memfs": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.1.tgz", - "integrity": "sha512-UWbFJKvj5k+nETdteFndTpYxdeTMox/ULeqX5k/dpaQJCCFmj5EeKv3dBcyO2xmkRAx2vppRu5dVG7SOtsGOzA==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", "dev": true, "dependencies": { - "fs-monkey": "^1.0.3" + "fs-monkey": "^1.0.4" }, "engines": { "node": ">= 4.0.0" @@ -9083,9 +10135,9 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.7.5", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.5.tgz", - "integrity": "sha512-9HaR++0mlgom81s95vvNjxkg52n2b5s//3ZTI1EtzFb98awsLSivs2LMsVqnQ3ay0PVhqWcGNyDaTE961FOcjQ==", + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz", + "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==", "dev": true, "dependencies": { "schema-utils": "^4.0.0" @@ -9108,15 +10160,18 @@ "dev": true }, "node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/minimist": { @@ -9519,12 +10574,13 @@ } }, "node_modules/node-gyp": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.3.1.tgz", - "integrity": "sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg==", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz", + "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==", "dev": true, "dependencies": { "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", "glob": "^7.1.4", "graceful-fs": "^4.2.6", "make-fetch-happen": "^10.0.3", @@ -9543,9 +10599,9 @@ } }, "node_modules/node-gyp-build": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", - "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.7.0.tgz", + "integrity": "sha512-PbZERfeFdrHQOOXiAKOY0VPbykZy90ndPKk0d+CFDegTKmWp1VgOTz2xACVbr1BjCWxrQp68CXtvNsveFhqDJg==", "dev": true, "optional": true, "bin": { @@ -9612,9 +10668,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "dev": true }, "node_modules/nopt": { @@ -9678,9 +10734,9 @@ } }, "node_modules/npm-install-checks": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.1.1.tgz", - "integrity": "sha512-dH3GmQL4vsPtld59cOn8uY0iOqRmqKvV+DLGwNXV/Q7MDgD2QfOADWd/mFXcIE5LVhYYGjA3baz6W9JneqnuCw==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", + "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", "dev": true, "dependencies": { "semver": "^7.1.1" @@ -9758,6 +10814,29 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/npm-registry-fetch/node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/npm-registry-fetch/node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/npm-registry-fetch/node_modules/lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", @@ -9794,12 +10873,12 @@ } }, "node_modules/npm-registry-fetch/node_modules/minipass-fetch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", - "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", + "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", "dev": true, "dependencies": { - "minipass": "^5.0.0", + "minipass": "^7.0.3", "minipass-sized": "^1.0.3", "minizlib": "^2.1.2" }, @@ -9810,6 +10889,15 @@ "encoding": "^0.1.13" } }, + "node_modules/npm-registry-fetch/node_modules/minipass-fetch/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -9849,6 +10937,12 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, + "node_modules/nwsapi": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", + "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", + "dev": true + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -9867,6 +10961,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object-path": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.8.tgz", + "integrity": "sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==", + "dev": true, + "engines": { + "node": ">= 10.12.0" + } + }, "node_modules/obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", @@ -10116,9 +11219,9 @@ } }, "node_modules/pacote": { - "version": "15.1.3", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.1.3.tgz", - "integrity": "sha512-aRts8cZqxiJVDitmAh+3z+FxuO3tLNWEmwDRPEpDDiZJaRz06clP4XX112ynMT5uF0QNoMPajBBHnaStUEPJXA==", + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz", + "integrity": "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==", "dev": true, "dependencies": { "@npmcli/git": "^4.0.0", @@ -10212,18 +11315,6 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/parse5-html-rewriting-stream/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/parse5-html-rewriting-stream/node_modules/parse5": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", @@ -10236,15 +11327,6 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", - "dev": true, - "dependencies": { - "parse5": "^6.0.1" - } - }, "node_modules/parse5-sax-parser": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", @@ -10257,18 +11339,6 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/parse5-sax-parser/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/parse5-sax-parser/node_modules/parse5": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", @@ -10324,13 +11394,13 @@ "dev": true }, "node_modules/path-scurry": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.8.0.tgz", - "integrity": "sha512-IjTrKseM404/UAWA8bBbL3Qp6O2wXkanuIE3seCxBH7ctRuvH1QRawy1N3nVDHGkdeZsjOsSe/8AQBL/VQCy2g==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", "dev": true, "dependencies": { - "lru-cache": "^9.1.1", - "minipass": "^5.0.0" + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -10340,9 +11410,9 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.1.tgz", - "integrity": "sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", "dev": true, "engines": { "node": "14 || >=16.14" @@ -10386,52 +11456,125 @@ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "engines": { - "node": ">=8.6" + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/piscina": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.0.0.tgz", + "integrity": "sha512-641nAmJS4k4iqpNUqfggqUBUMmlw0ZoM5VZKdQkV2e970Inn3Tk9kroCc1wpsYLD07vCwpys5iY0d3xI/9WkTg==", + "dev": true, + "dependencies": { + "eventemitter-asyncresource": "^1.0.0", + "hdr-histogram-js": "^2.0.1", + "hdr-histogram-percentiles-obj": "^3.0.0" + }, + "optionalDependencies": { + "nice-napi": "^1.0.2" + } + }, + "node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "dev": true, + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "dev": true, - "optional": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, "engines": { - "node": ">=6" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/piscina": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-3.2.0.tgz", - "integrity": "sha512-yn/jMdHRw+q2ZJhFhyqsmANcbF6V2QwmD84c6xRau+QpQOmtrBCoRGdvTfeuFDYXB5W2m6MfLkjkvQa9lUSmIA==", + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", "dev": true, "dependencies": { - "eventemitter-asyncresource": "^1.0.0", - "hdr-histogram-js": "^2.0.1", - "hdr-histogram-percentiles-obj": "^3.0.0" + "p-limit": "^4.0.0" }, - "optionalDependencies": { - "nice-napi": "^1.0.2" + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "node_modules/pkg-dir/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, "node_modules/postcss": { - "version": "8.4.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", - "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "dev": true, "funding": [ { @@ -10457,14 +11600,13 @@ } }, "node_modules/postcss-loader": { - "version": "7.2.4", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.2.4.tgz", - "integrity": "sha512-F88rpxxNspo5hatIc+orYwZDtHFaVFOSIVAx+fBfJC1GmhWbVmPWtmg2gXKE1OxJbneOSGn8PWdIwsZFcruS+w==", + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.3.tgz", + "integrity": "sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA==", "dev": true, "dependencies": { - "cosmiconfig": "^8.1.3", - "cosmiconfig-typescript-loader": "^4.3.0", - "klona": "^2.0.6", + "cosmiconfig": "^8.2.0", + "jiti": "^1.18.2", "semver": "^7.3.8" }, "engines": { @@ -10476,17 +11618,7 @@ }, "peerDependencies": { "postcss": "^7.0.0 || ^8.0.1", - "ts-node": ">=10", - "typescript": ">=4", "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - }, - "typescript": { - "optional": true - } } }, "node_modules/postcss-modules-extract-imports": { @@ -10502,9 +11634,9 @@ } }, "node_modules/postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", + "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", "dev": true, "dependencies": { "icss-utils": "^5.0.0", @@ -10549,9 +11681,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.12", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.12.tgz", - "integrity": "sha512-NdxGCAZdRrwVI1sy59+Wzrh+pMMHxapGnpfenDVlMEXoOcvt4pGE0JLK9YY2F5dLxcFYA/YbVQKhcGU+FtSYQg==", + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -10739,6 +11871,12 @@ "dev": true, "optional": true }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, "node_modules/punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -10772,6 +11910,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -10826,9 +11970,9 @@ } }, "node_modules/read-package-json": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.3.tgz", - "integrity": "sha512-4QbpReW4kxFgeBQ0vPAqh2y8sXEB3D4t3jsXbJKIhBiF80KT6XRo45reqwtftju5J6ru1ax06A2Gb/wM1qCOEQ==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.4.tgz", + "integrity": "sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==", "dev": true, "dependencies": { "glob": "^10.2.2", @@ -10862,28 +12006,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/read-package-json/node_modules/glob": { - "version": "10.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.3.tgz", - "integrity": "sha512-Kb4rfmBVE3eQTAimgmeqc2LwSnN0wIOkkUL6HmxEFxNJ4fHghYHVbFba/HcGcRjE6s9KoMNK3rSOwkL4PioZjg==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", - "minimatch": "^9.0.0", - "minipass": "^5.0.0", - "path-scurry": "^1.7.0" - }, - "bin": { - "glob": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/read-package-json/node_modules/json-parse-even-better-errors": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", @@ -10893,21 +12015,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/read-package-json/node_modules/minimatch": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.0.tgz", - "integrity": "sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -10959,9 +12066,9 @@ "dev": true }, "node_modules/regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", "dev": true, "dependencies": { "regenerate": "^1.4.2" @@ -10977,9 +12084,9 @@ "dev": true }, "node_modules/regenerator-transform": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", - "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", "dev": true, "dependencies": { "@babel/runtime": "^7.8.4" @@ -11228,9 +12335,9 @@ } }, "node_modules/rollup": { - "version": "3.21.6", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.21.6.tgz", - "integrity": "sha512-SXIICxvxQxR3D4dp/3LDHZIJPC8a4anKMHd4E3Jiz2/JnY+2bEjqrOokAauc5ShGVNFHlEFjBXAXlaxkJqIqSg==", + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -11329,9 +12436,9 @@ "integrity": "sha512-LRneZZRXNgjzwG4bDQdOTSbze3fHm1EAKN/8bePxnlEZiBmkYEDggaHbuvHI9/hoqHbGfsEA7tWS9GhYHZBBsw==" }, "node_modules/sass": { - "version": "1.62.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.62.1.tgz", - "integrity": "sha512-NHpxIzN29MXvWiuswfc1W3I0N8SXBd8UR26WntmDlRYf0bSADnwnOjsyMZ3lMezSlArD33Vs3YFhp7dWvL770A==", + "version": "1.64.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.64.1.tgz", + "integrity": "sha512-16rRACSOFEE8VN7SCgBu1MpYCyN7urj9At898tyzdXFhC+a+yOX5dXwAR7L8/IdPJ1NB8OYoXmD55DM30B2kEQ==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -11346,12 +12453,11 @@ } }, "node_modules/sass-loader": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.2.2.tgz", - "integrity": "sha512-nrIdVAAte3B9icfBiGWvmMhT/D+eCDwnk+yA7VE/76dp/WkHX+i44Q/pfo71NYbwj0Ap+PGsn0ekOuU1WFJ2AA==", + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.2.tgz", + "integrity": "sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg==", "dev": true, "dependencies": { - "klona": "^2.0.6", "neo-async": "^2.6.2" }, "engines": { @@ -11363,7 +12469,7 @@ }, "peerDependencies": { "fibers": ">= 3.1.0", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", "sass": "^1.3.0", "sass-embedded": "*", "webpack": "^5.0.0" @@ -11390,6 +12496,18 @@ "dev": true, "optional": true }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/schema-utils": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", @@ -11416,11 +12534,12 @@ "dev": true }, "node_modules/selfsigned": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", - "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", "dev": true, "dependencies": { + "@types/node-forge": "^1.3.0", "node-forge": "^1" }, "engines": { @@ -11700,14 +12819,16 @@ "dev": true }, "node_modules/sigstore": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.4.0.tgz", - "integrity": "sha512-N7TRpSbFjY/TrFDg6yGAQSYBrQ5s6qmPiq4pD6fkv1LoyfMsLG0NwZWG2s5q+uttLHgyVyTa0Rogx2P78rN8kQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.9.0.tgz", + "integrity": "sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==", "dev": true, "dependencies": { - "@sigstore/protobuf-specs": "^0.1.0", - "make-fetch-happen": "^11.0.1", - "tuf-js": "^1.1.3" + "@sigstore/bundle": "^1.1.0", + "@sigstore/protobuf-specs": "^0.2.0", + "@sigstore/sign": "^1.0.0", + "@sigstore/tuf": "^1.0.3", + "make-fetch-happen": "^11.0.1" }, "bin": { "sigstore": "bin/sigstore.js" @@ -11716,6 +12837,29 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/sigstore/node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sigstore/node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/sigstore/node_modules/lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", @@ -11752,12 +12896,12 @@ } }, "node_modules/sigstore/node_modules/minipass-fetch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", - "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", + "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", "dev": true, "dependencies": { - "minipass": "^5.0.0", + "minipass": "^7.0.3", "minipass-sized": "^1.0.3", "minizlib": "^2.1.2" }, @@ -11768,6 +12912,15 @@ "encoding": "^0.1.13" } }, + "node_modules/sigstore/node_modules/minipass-fetch/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -11968,9 +13121,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", "dev": true }, "node_modules/spdy": { @@ -12010,17 +13163,26 @@ "dev": true }, "node_modules/ssri": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.4.tgz", - "integrity": "sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ==", + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", + "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", "dev": true, "dependencies": { - "minipass": "^5.0.0" + "minipass": "^7.0.3" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/ssri/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -12158,6 +13320,12 @@ "node": ">=0.10" } }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -12168,9 +13336,9 @@ } }, "node_modules/tar": { - "version": "6.1.14", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.14.tgz", - "integrity": "sha512-piERznXu0U7/pW7cdSn7hjqySIVTYT6F76icmFk7ptU7dDYlXTm5r9A6K04R2vU3olYgoKeo1Cg3eeu5nhftAw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", "dev": true, "dependencies": { "chownr": "^2.0.0", @@ -12215,13 +13383,13 @@ "dev": true }, "node_modules/terser": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.1.tgz", - "integrity": "sha512-hVl35zClmpisy6oaoKALOpS0rDYLxRFLHhRuDlEGTKey9qHjS1w9GMORjuwIMt70Wan4lwsLYyWDVnWgF+KUEw==", + "version": "5.19.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", + "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", "dev": true, "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -12431,57 +13599,49 @@ "node": ">=0.6" } }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "node_modules/tough-cookie": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", "dev": true, - "bin": { - "tree-kill": "cli.js" + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" } }, - "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", "dev": true, - "peer": true, "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" + "punycode": "^2.1.1" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } + "tree-kill": "cli.js" } }, "node_modules/tsconfig-paths": { @@ -12583,24 +13743,47 @@ } }, "node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==" }, "node_modules/tuf-js": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.6.tgz", - "integrity": "sha512-CXwFVIsXGbVY4vFiWF7TJKWmlKJAT8TWkH4RmiohJRcDJInix++F0dznDmoVbtJNzZ8yLprKUG4YrDIhv3nBMg==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.7.tgz", + "integrity": "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==", "dev": true, "dependencies": { "@tufjs/models": "1.0.4", "debug": "^4.3.4", - "make-fetch-happen": "^11.1.0" + "make-fetch-happen": "^11.1.1" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/tuf-js/node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/tuf-js/node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/tuf-js/node_modules/lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", @@ -12637,12 +13820,12 @@ } }, "node_modules/tuf-js/node_modules/minipass-fetch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", - "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", + "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", "dev": true, "dependencies": { - "minipass": "^5.0.0", + "minipass": "^7.0.3", "minipass-sized": "^1.0.3", "minizlib": "^2.1.2" }, @@ -12653,6 +13836,15 @@ "encoding": "^0.1.13" } }, + "node_modules/tuf-js/node_modules/minipass-fetch/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/type-fest": { "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", @@ -12812,9 +14004,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "dev": true, "funding": [ { @@ -12824,6 +14016,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { @@ -12831,7 +14027,7 @@ "picocolors": "^1.0.0" }, "bin": { - "browserslist-lint": "cli.js" + "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" @@ -12846,6 +14042,16 @@ "punycode": "^2.1.0" } }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -12870,13 +14076,6 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true, - "peer": true - }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -12909,14 +14108,14 @@ } }, "node_modules/vite": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.1.tgz", - "integrity": "sha512-EPmfPLAI79Z/RofuMvkIS0Yr091T2ReUoXQqc5ppBX/sjFRhHKiPPF/R46cTdoci/XgeQpB23diiJxq5w30vdg==", + "version": "4.4.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.7.tgz", + "integrity": "sha512-6pYf9QJ1mHylfVh39HpuSfMPojPSKVxZvnclX1K1FyZ1PXDOcLBibdq5t1qxJSnL63ca8Wf4zts6mD8u8oc9Fw==", "dev": true, "dependencies": { - "esbuild": "^0.17.5", - "postcss": "^8.4.21", - "rollup": "^3.20.2" + "esbuild": "^0.18.10", + "postcss": "^8.4.26", + "rollup": "^3.25.2" }, "bin": { "vite": "bin/vite.js" @@ -12924,12 +14123,16 @@ "engines": { "node": "^14.18.0 || >=16.0.0" }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, "optionalDependencies": { "fsevents": "~2.3.2" }, "peerDependencies": { "@types/node": ">= 14", "less": "*", + "lightningcss": "^1.21.0", "sass": "*", "stylus": "*", "sugarss": "*", @@ -12942,6 +14145,9 @@ "less": { "optional": true }, + "lightningcss": { + "optional": true + }, "sass": { "optional": true }, @@ -12965,11 +14171,33 @@ "node": ">=0.10.0" } }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", + "dev": true, + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, "node_modules/w3c-keyname": { "version": "2.2.6", "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.6.tgz", "integrity": "sha512-f+fciywl1SJEniZHD6H+kUO8gOnwIr7f4ijKA6+ZvJFjeGi1r4PDLl53Ayud9O/rk64RqgoQine0feoeOU0kXg==" }, + "node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/watchpack": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", @@ -13025,10 +14253,19 @@ "defaults": "^1.0.3" } }, + "node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true, + "engines": { + "node": ">=10.4" + } + }, "node_modules/webpack": { - "version": "5.80.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.80.0.tgz", - "integrity": "sha512-OIMiq37XK1rWO8mH9ssfFKZsXg4n6klTEDL7S8/HqbAOBBaiy8ABvXvz0dDCXeEF9gqwxSvVk611zFPjS8hJxA==", + "version": "5.88.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", + "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -13037,10 +14274,10 @@ "@webassemblyjs/wasm-edit": "^1.11.5", "@webassemblyjs/wasm-parser": "^1.11.5", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", + "acorn-import-assertions": "^1.9.0", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.13.0", + "enhanced-resolve": "^5.15.0", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -13050,7 +14287,7 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.2", + "schema-utils": "^3.2.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.7", "watchpack": "^2.4.0", @@ -13073,9 +14310,9 @@ } }, "node_modules/webpack-dev-middleware": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.0.2.tgz", - "integrity": "sha512-iOddiJzPcQC6lwOIu60vscbGWth8PCRcWRCwoQcTQf9RMoOWBHg5EyzpGdtSmGMrSPd5vHEfFXmVErQEmkRngQ==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.1.tgz", + "integrity": "sha512-y51HrHaFeeWir0YO4f0g+9GwZawuigzcAdRNon6jErXy/SqV/+O6eaVAzDqE6t3e3NpGeR5CS+cCDaTC+V3yEQ==", "dev": true, "dependencies": { "colorette": "^2.0.10", @@ -13101,9 +14338,9 @@ } }, "node_modules/webpack-dev-server": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.13.2.tgz", - "integrity": "sha512-5i6TrGBRxG4vnfDpB6qSQGfnB6skGBXNL5/542w2uRGLimX6qeE5BQMLrzIC3JYV/xlGOv+s+hTleI9AZKUQNw==", + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", + "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", "dev": true, "dependencies": { "@types/bonjour": "^3.5.9", @@ -13112,7 +14349,7 @@ "@types/serve-index": "^1.9.1", "@types/serve-static": "^1.13.10", "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.1", + "@types/ws": "^8.5.5", "ansi-html-community": "^0.0.8", "bonjour-service": "^1.0.11", "chokidar": "^3.5.3", @@ -13183,9 +14420,9 @@ } }, "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "version": "8.14.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", + "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", "dev": true, "engines": { "node": ">=10.0.0" @@ -13204,9 +14441,9 @@ } }, "node_modules/webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz", + "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", "dev": true, "dependencies": { "clone-deep": "^4.0.1", @@ -13272,9 +14509,9 @@ } }, "node_modules/webpack/node_modules/enhanced-resolve": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.0.tgz", - "integrity": "sha512-+DCows0XNwLDcUhbFJPdlQEVnT2zXlCv7hPxemTz86/O+B/hCQ+mb7ydkPKiflpVraqLPCAfu7lDy+hBXueojw==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -13291,9 +14528,9 @@ "dev": true }, "node_modules/webpack/node_modules/schema-utils": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", - "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.8", @@ -13328,7 +14565,36 @@ "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "dev": true, "engines": { - "node": ">=0.8.0" + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" } }, "node_modules/which": { @@ -13353,9 +14619,9 @@ } }, "node_modules/wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "dev": true }, "node_modules/wordwrap": { @@ -13492,6 +14758,18 @@ } } }, + "node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -13548,14 +14826,16 @@ "node": ">=12" } }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", "dev": true, - "peer": true, "engines": { - "node": ">=6" + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/zone.js": { @@ -13579,12 +14859,12 @@ } }, "@angular-devkit/architect": { - "version": "0.1600.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1600.0.tgz", - "integrity": "sha512-nYRcqAxZnndhAEpSpJ1U2TScs2huu674OKrsEyJTqLEANEyCPBnusAmS9HcGzMBgePAwNElqOKrr5/f1DbYq1A==", + "version": "0.1602.10", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1602.10.tgz", + "integrity": "sha512-FwemQXh3edqA/S6zPpsqKei5v7gt0R0WpjJoAJaz+FOpfDwij1fwnKr88XINY8xcefTcQaTDQxJZheJShA/hHw==", "dev": true, "requires": { - "@angular-devkit/core": "16.0.0", + "@angular-devkit/core": "16.2.10", "rxjs": "7.8.1" }, "dependencies": { @@ -13600,41 +14880,41 @@ } }, "@angular-devkit/build-angular": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.0.0.tgz", - "integrity": "sha512-OvDQAbrV3cUMfHws30MnDURsXselZ0GWhSxZjOdcD3cF64Nsq5ywftHOT+QC3YdDghwI8gMADN9et+aVDscBzQ==", + "version": "16.2.10", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.2.10.tgz", + "integrity": "sha512-msB/qjIsAOySDxdU5DpcX2sWGUEJOFIO03O9+HbtLwf3NDfe74mFfejxuKlHJXIJdgpM2Zc948M6+618QKpUYA==", "dev": true, "requires": { "@ampproject/remapping": "2.2.1", - "@angular-devkit/architect": "0.1600.0", - "@angular-devkit/build-webpack": "0.1600.0", - "@angular-devkit/core": "16.0.0", - "@babel/core": "7.21.4", - "@babel/generator": "7.21.4", - "@babel/helper-annotate-as-pure": "7.18.6", - "@babel/helper-split-export-declaration": "7.18.6", + "@angular-devkit/architect": "0.1602.10", + "@angular-devkit/build-webpack": "0.1602.10", + "@angular-devkit/core": "16.2.10", + "@babel/core": "7.22.9", + "@babel/generator": "7.22.9", + "@babel/helper-annotate-as-pure": "7.22.5", + "@babel/helper-split-export-declaration": "7.22.6", "@babel/plugin-proposal-async-generator-functions": "7.20.7", - "@babel/plugin-transform-async-to-generator": "7.20.7", - "@babel/plugin-transform-runtime": "7.21.4", - "@babel/preset-env": "7.21.4", - "@babel/runtime": "7.21.0", - "@babel/template": "7.20.7", + "@babel/plugin-transform-async-to-generator": "7.22.5", + "@babel/plugin-transform-runtime": "7.22.9", + "@babel/preset-env": "7.22.9", + "@babel/runtime": "7.22.6", + "@babel/template": "7.22.5", "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "16.0.0", + "@ngtools/webpack": "16.2.10", "@vitejs/plugin-basic-ssl": "1.0.1", "ansi-colors": "4.1.3", "autoprefixer": "10.4.14", - "babel-loader": "9.1.2", + "babel-loader": "9.1.3", "babel-plugin-istanbul": "6.1.1", - "browserslist": "4.21.5", - "cacache": "17.0.6", + "browserslist": "^4.21.5", "chokidar": "3.5.3", "copy-webpack-plugin": "11.0.0", - "critters": "0.0.16", - "css-loader": "6.7.3", - "esbuild": "0.17.18", - "esbuild-wasm": "0.17.18", - "glob": "8.1.0", + "critters": "0.0.20", + "css-loader": "6.8.1", + "esbuild": "0.18.17", + "esbuild-wasm": "0.18.17", + "fast-glob": "3.3.1", + "guess-parser": "0.4.22", "https-proxy-agent": "5.0.1", "inquirer": "8.2.4", "jsonc-parser": "3.2.0", @@ -13643,65 +14923,251 @@ "less-loader": "11.1.0", "license-webpack-plugin": "4.0.2", "loader-utils": "3.2.1", - "magic-string": "0.30.0", - "mini-css-extract-plugin": "2.7.5", + "magic-string": "0.30.1", + "mini-css-extract-plugin": "2.7.6", "mrmime": "1.0.1", "open": "8.4.2", "ora": "5.4.1", "parse5-html-rewriting-stream": "7.0.0", - "piscina": "3.2.0", - "postcss": "8.4.23", - "postcss-loader": "7.2.4", + "picomatch": "2.3.1", + "piscina": "4.0.0", + "postcss": "8.4.31", + "postcss-loader": "7.3.3", "resolve-url-loader": "5.0.0", "rxjs": "7.8.1", - "sass": "1.62.1", - "sass-loader": "13.2.2", - "semver": "7.4.0", + "sass": "1.64.1", + "sass-loader": "13.3.2", + "semver": "7.5.4", "source-map-loader": "4.0.1", "source-map-support": "0.5.21", - "terser": "5.17.1", + "terser": "5.19.2", "text-table": "0.2.0", "tree-kill": "1.2.2", - "tslib": "2.5.0", - "vite": "4.3.1", - "webpack": "5.80.0", - "webpack-dev-middleware": "6.0.2", - "webpack-dev-server": "4.13.2", - "webpack-merge": "5.8.0", + "tslib": "2.6.1", + "vite": "4.4.7", + "webpack": "5.88.2", + "webpack-dev-middleware": "6.1.1", + "webpack-dev-server": "4.15.1", + "webpack-merge": "5.9.0", "webpack-subresource-integrity": "5.1.0" }, "dependencies": { "@babel/core": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.4.tgz", - "integrity": "sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", + "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", "dev": true, "requires": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.4", - "@babel/helper-compilation-targets": "^7.21.4", - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.4", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.4", - "@babel/types": "^7.21.4", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.9", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.8", + "@babel/types": "^7.22.5", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.2", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } }, + "@esbuild/android-arm": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.17.tgz", + "integrity": "sha512-wHsmJG/dnL3OkpAcwbgoBTTMHVi4Uyou3F5mf58ZtmUyIKfcdA7TROav/6tCzET4A3QW2Q2FC+eFneMU+iyOxg==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.17.tgz", + "integrity": "sha512-9np+YYdNDed5+Jgr1TdWBsozZ85U1Oa3xW0c7TWqH0y2aGghXtZsuT8nYRbzOMcl0bXZXjOGbksoTtVOlWrRZg==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.17.tgz", + "integrity": "sha512-O+FeWB/+xya0aLg23hHEM2E3hbfwZzjqumKMSIqcHbNvDa+dza2D0yLuymRBQQnC34CWrsJUXyH2MG5VnLd6uw==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.17.tgz", + "integrity": "sha512-M9uJ9VSB1oli2BE/dJs3zVr9kcCBBsE883prage1NWz6pBS++1oNn/7soPNS3+1DGj0FrkSvnED4Bmlu1VAE9g==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.17.tgz", + "integrity": "sha512-XDre+J5YeIJDMfp3n0279DFNrGCXlxOuGsWIkRb1NThMZ0BsrWXoTg23Jer7fEXQ9Ye5QjrvXpxnhzl3bHtk0g==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.17.tgz", + "integrity": "sha512-cjTzGa3QlNfERa0+ptykyxs5A6FEUQQF0MuilYXYBGdBxD3vxJcKnzDlhDCa1VAJCmAxed6mYhA2KaJIbtiNuQ==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.17.tgz", + "integrity": "sha512-sOxEvR8d7V7Kw8QqzxWc7bFfnWnGdaFBut1dRUYtu+EIRXefBc/eIsiUiShnW0hM3FmQ5Zf27suDuHsKgZ5QrA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.17.tgz", + "integrity": "sha512-2d3Lw6wkwgSLC2fIvXKoMNGVaeY8qdN0IC3rfuVxJp89CRfA3e3VqWifGDfuakPmp90+ZirmTfye1n4ncjv2lg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.17.tgz", + "integrity": "sha512-c9w3tE7qA3CYWjT+M3BMbwMt+0JYOp3vCMKgVBrCl1nwjAlOMYzEo+gG7QaZ9AtqZFj5MbUc885wuBBmu6aADQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.17.tgz", + "integrity": "sha512-1DS9F966pn5pPnqXYz16dQqWIB0dmDfAQZd6jSSpiT9eX1NzKh07J6VKR3AoXXXEk6CqZMojiVDSZi1SlmKVdg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.17.tgz", + "integrity": "sha512-EvLsxCk6ZF0fpCB6w6eOI2Fc8KW5N6sHlIovNe8uOFObL2O+Mr0bflPHyHwLT6rwMg9r77WOAWb2FqCQrVnwFg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.17.tgz", + "integrity": "sha512-e0bIdHA5p6l+lwqTE36NAW5hHtw2tNRmHlGBygZC14QObsA3bD4C6sXLJjvnDIjSKhW1/0S3eDy+QmX/uZWEYQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.17.tgz", + "integrity": "sha512-BAAilJ0M5O2uMxHYGjFKn4nJKF6fNCdP1E0o5t5fvMYYzeIqy2JdAP88Az5LHt9qBoUa4tDaRpfWt21ep5/WqQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.17.tgz", + "integrity": "sha512-Wh/HW2MPnC3b8BqRSIme/9Zhab36PPH+3zam5pqGRH4pE+4xTrVLx2+XdGp6fVS3L2x+DrsIcsbMleex8fbE6g==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.17.tgz", + "integrity": "sha512-j/34jAl3ul3PNcK3pfI0NSlBANduT2UO5kZ7FCaK33XFv3chDhICLY8wJJWIhiQ+YNdQ9dxqQctRg2bvrMlYgg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.17.tgz", + "integrity": "sha512-QM50vJ/y+8I60qEmFxMoxIx4de03pGo2HwxdBeFd4nMh364X6TIBZ6VQ5UQmPbQWUVWHWws5MmJXlHAXvJEmpQ==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.17.tgz", + "integrity": "sha512-/jGlhWR7Sj9JPZHzXyyMZ1RFMkNPjC6QIAan0sDOtIo2TYk3tZn5UDrkE0XgsTQCxWTTOcMPf9p6Rh2hXtl5TQ==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.17.tgz", + "integrity": "sha512-rSEeYaGgyGGf4qZM2NonMhMOP/5EHp4u9ehFiBrg7stH6BYEEjlkVREuDEcQ0LfIl53OXLxNbfuIj7mr5m29TA==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.17.tgz", + "integrity": "sha512-Y7ZBbkLqlSgn4+zot4KUNYst0bFoO68tRgI6mY2FIM+b7ZbyNVtNbDP5y8qlu4/knZZ73fgJDlXID+ohY5zt5g==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.17.tgz", + "integrity": "sha512-bwPmTJsEQcbZk26oYpc4c/8PvTY3J5/QK8jM19DVlEsAB41M39aWovWoHtNm78sd6ip6prilxeHosPADXtEJFw==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.17.tgz", + "integrity": "sha512-H/XaPtPKli2MhW+3CQueo6Ni3Avggi6hP/YvgkEe1aSaxw+AeO8MFjq8DlgfTd9Iz4Yih3QCZI6YLMoyccnPRg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.17.tgz", + "integrity": "sha512-fGEb8f2BSA3CW7riJVurug65ACLuQAzKq0SSqkY2b2yHHH0MzDfbLyKIGzHwOI/gkHcxM/leuSW6D5w/LMNitA==", + "dev": true, + "optional": true + }, + "esbuild": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.17.tgz", + "integrity": "sha512-1GJtYnUxsJreHYA0Y+iQz2UEykonY66HNWOb0yXYZi9/kNrORUEHVg87eQsCtqh59PEJ5YVZJO98JHznMJSWjg==", + "dev": true, + "optional": true, + "requires": { + "@esbuild/android-arm": "0.18.17", + "@esbuild/android-arm64": "0.18.17", + "@esbuild/android-x64": "0.18.17", + "@esbuild/darwin-arm64": "0.18.17", + "@esbuild/darwin-x64": "0.18.17", + "@esbuild/freebsd-arm64": "0.18.17", + "@esbuild/freebsd-x64": "0.18.17", + "@esbuild/linux-arm": "0.18.17", + "@esbuild/linux-arm64": "0.18.17", + "@esbuild/linux-ia32": "0.18.17", + "@esbuild/linux-loong64": "0.18.17", + "@esbuild/linux-mips64el": "0.18.17", + "@esbuild/linux-ppc64": "0.18.17", + "@esbuild/linux-riscv64": "0.18.17", + "@esbuild/linux-s390x": "0.18.17", + "@esbuild/linux-x64": "0.18.17", + "@esbuild/netbsd-x64": "0.18.17", + "@esbuild/openbsd-x64": "0.18.17", + "@esbuild/sunos-x64": "0.18.17", + "@esbuild/win32-arm64": "0.18.17", + "@esbuild/win32-ia32": "0.18.17", + "@esbuild/win32-x64": "0.18.17" + } + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -13721,9 +15187,9 @@ } }, "semver": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.4.0.tgz", - "integrity": "sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -13732,12 +15198,12 @@ } }, "@angular-devkit/build-webpack": { - "version": "0.1600.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1600.0.tgz", - "integrity": "sha512-ZlNNMtAzgMCsaN5crkqtgeYxWEyZ78/ePfrJTB3+Hb6LS+hsRf4WAYubHWRWReSx87ppluRrgNZLy0K9ooWy1w==", + "version": "0.1602.10", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1602.10.tgz", + "integrity": "sha512-H7HiFKbZl/xVxpr1RH05SGawTpA1417wvr2nFGRu2OiePd0lPr6pIhcq8F8gt7JcA8yZKKaqjn2gU+6um2MFLg==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1600.0", + "@angular-devkit/architect": "0.1602.10", "rxjs": "7.8.1" }, "dependencies": { @@ -13753,14 +15219,15 @@ } }, "@angular-devkit/core": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.0.0.tgz", - "integrity": "sha512-YJKvAJlg4/lfP93pQNawlOTQalynWGpoatZU+1aXBgRh5YCTKu2S/A3gtQ71DBuhac76gJe1RpxDoq41kB2KlQ==", + "version": "16.2.10", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.10.tgz", + "integrity": "sha512-eo7suLDjyu5bSlEr4TluYkFm4v2PVLSAPgnau8XHHlN5Yg4P/BZ00ve7LA7C9S1gzRSCrxQhK5ki4rnoFTo5zg==", "dev": true, "requires": { "ajv": "8.12.0", "ajv-formats": "2.1.1", "jsonc-parser": "3.2.0", + "picomatch": "2.3.1", "rxjs": "7.8.1", "source-map": "0.7.4" }, @@ -13777,14 +15244,14 @@ } }, "@angular-devkit/schematics": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.0.0.tgz", - "integrity": "sha512-9uFOqjOQdhnpxU5mku2LvBkV5Ave2ihHBFaQCH7vQ7DD+p4NpLHu93bMSh+f7k9W7F0lY18g9qrihRgK/7wfuA==", + "version": "16.2.10", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.2.10.tgz", + "integrity": "sha512-UCfPJKVNekb21bWRbzyx81tfHN3x8vU4ZMX/VA6xALg//QalMB7NOkkXBAssthnLastkyzkUtlvApTp2+R+EkQ==", "dev": true, "requires": { - "@angular-devkit/core": "16.0.0", + "@angular-devkit/core": "16.2.10", "jsonc-parser": "3.2.0", - "magic-string": "0.30.0", + "magic-string": "0.30.1", "ora": "5.4.1", "rxjs": "7.8.1" }, @@ -13801,9 +15268,9 @@ } }, "@angular/animations": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-16.0.1.tgz", - "integrity": "sha512-ziRq1hGJJuQqQUHqNpEMp9uy1pVutvL8oNvawblh32u4bnLsVQU5gMd6sTonn0x4sphEwMNnuEmp/q6QRIx+pA==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-16.2.12.tgz", + "integrity": "sha512-MD0ElviEfAJY8qMOd6/jjSSvtqER2RDAi0lxe6EtUacC1DHCYkaPrKW4vLqY+tmZBg1yf+6n+uS77pXcHHcA3w==", "requires": { "tslib": "^2.3.0" } @@ -13817,12 +15284,6 @@ "tslib": "^2.3.0" }, "dependencies": { - "entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "optional": true - }, "parse5": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", @@ -13835,27 +15296,27 @@ } }, "@angular/cli": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-16.0.0.tgz", - "integrity": "sha512-vsveaSJ5kj0MeJCg1nir5iJJEsdrRRnyNeL1awMcyrEjAhBPX3d0gfOP2fe0HR5KJtntX8zvihGus3i48Quo7A==", + "version": "16.2.10", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-16.2.10.tgz", + "integrity": "sha512-zDqlD+rXFuYZP169c2v35HkMbkchVCft5sS+VpoCCgYTk2rwxpeYkjJ8DQZztZJZRXQ+EMpkv/TubswmDro2zA==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1600.0", - "@angular-devkit/core": "16.0.0", - "@angular-devkit/schematics": "16.0.0", - "@schematics/angular": "16.0.0", + "@angular-devkit/architect": "0.1602.10", + "@angular-devkit/core": "16.2.10", + "@angular-devkit/schematics": "16.2.10", + "@schematics/angular": "16.2.10", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.3", - "ini": "4.0.0", + "ini": "4.1.1", "inquirer": "8.2.4", "jsonc-parser": "3.2.0", "npm-package-arg": "10.1.0", "npm-pick-manifest": "8.0.1", "open": "8.4.2", "ora": "5.4.1", - "pacote": "15.1.3", + "pacote": "15.2.0", "resolve": "1.22.2", - "semver": "7.4.0", + "semver": "7.5.4", "symbol-observable": "4.0.0", "yargs": "17.7.2" }, @@ -13870,9 +15331,9 @@ } }, "semver": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.4.0.tgz", - "integrity": "sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -13881,28 +15342,28 @@ } }, "@angular/common": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-16.0.1.tgz", - "integrity": "sha512-ic9Ri4Mepf4c0BTff7o4Oyl/a1vACNXXUzuoTwIjWnIqrH89dtwg7ncTD9Rv0N1lon7r4gXokTbn9A/Yk/0jbw==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-16.2.12.tgz", + "integrity": "sha512-B+WY/cT2VgEaz9HfJitBmgdk4I333XG/ybC98CMC4Wz8E49T8yzivmmxXB3OD6qvjcOB6ftuicl6WBqLbZNg2w==", "requires": { "tslib": "^2.3.0" } }, "@angular/compiler": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-16.0.1.tgz", - "integrity": "sha512-7zNo6H1qVQow3T4EUul76SaIDSMRSl0hmtyWUzPjtWkxMjrCPSduqjA4/NHaG0KX1BsUvUtQEoDJ5jv/7EHWTQ==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-16.2.12.tgz", + "integrity": "sha512-6SMXUgSVekGM7R6l1Z9rCtUGtlg58GFmgbpMCsGf+VXxP468Njw8rjT2YZkf5aEPxEuRpSHhDYjqz7n14cwCXQ==", "requires": { "tslib": "^2.3.0" } }, "@angular/compiler-cli": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-16.0.1.tgz", - "integrity": "sha512-EW7Oxp8EuTz3vCNd4RAncZGB7dCUYviUkBA4PzuyPmL2copZPt12j9qx0pXXF3T6ydjoZ+99ZEgfkKOV6FeU3g==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-16.2.12.tgz", + "integrity": "sha512-pWSrr152562ujh6lsFZR8NfNc5Ljj+zSTQO44DsuB0tZjwEpnRcjJEgzuhGXr+CoiBf+jTSPZKemtSktDk5aaA==", "dev": true, "requires": { - "@babel/core": "7.19.3", + "@babel/core": "7.23.2", "@jridgewell/sourcemap-codec": "^1.4.14", "chokidar": "^3.0.0", "convert-source-map": "^1.5.1", @@ -13913,17 +15374,17 @@ } }, "@angular/core": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-16.0.1.tgz", - "integrity": "sha512-3s4XBbzWgyWcjI0WFlNDKRxsbm4J+OKIL4mJCM9r8gWwno9y0K/giziAm9YMIJ4VOBIvrcMbOh85o44FCk8cRA==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-16.2.12.tgz", + "integrity": "sha512-GLLlDeke/NjroaLYOks0uyzFVo6HyLl7VOm0K1QpLXnYvW63W9Ql/T3yguRZa7tRkOAeFZ3jw+1wnBD4O8MoUA==", "requires": { "tslib": "^2.3.0" } }, "@angular/forms": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-16.0.1.tgz", - "integrity": "sha512-VbH/YnEBau0q97zI7BjSk0pu/i2S0Y/zmhvA2wgI2CCvtbqT6hCNdE/3rW6ZFBcnuCe+dFhuchXe6dX28epsvg==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-16.2.12.tgz", + "integrity": "sha512-1Eao89hlBgLR3v8tU91vccn21BBKL06WWxl7zLpQmG6Hun+2jrThgOE4Pf3os4fkkbH4Apj0tWL2fNIWe/blbw==", "requires": { "tslib": "^2.3.0" } @@ -13984,25 +15445,25 @@ } }, "@angular/platform-browser": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-16.0.1.tgz", - "integrity": "sha512-7XLIOnTnGDJLE4Q0zBz6eI9q5V3NnsTAJqIICJHc4gk6jNgVz90gtejAQ4EFbo0d83XGzwFL22hxID5Dj1WRIA==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-16.2.12.tgz", + "integrity": "sha512-NnH7ju1iirmVEsUq432DTm0nZBGQsBrU40M3ZeVHMQ2subnGiyUs3QyzDz8+VWLL/T5xTxWLt9BkDn65vgzlIQ==", "requires": { "tslib": "^2.3.0" } }, "@angular/platform-browser-dynamic": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-16.0.1.tgz", - "integrity": "sha512-qrGlRPqJM42WZcHCbzwTA8SiK90xrhM/VrOL/8/1okuHn82gSWbbynpqycdZnsI9XMbW+HNhpKR2n8HKV38Jug==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-16.2.12.tgz", + "integrity": "sha512-ya54jerNgreCVAR278wZavwjrUWImMr2F8yM5n9HBvsMBbFaAQ83anwbOEiHEF2BlR+gJiEBLfpuPRMw20pHqw==", "requires": { "tslib": "^2.3.0" } }, "@angular/router": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-16.0.1.tgz", - "integrity": "sha512-4GH0SxPbuY08B/M0f3NEHf9yIFH+D3wlzWJHI75chfdqQ8gGAMG6B6PSmo3haicDxHcSnZTYNJXDLOQvaBAHcA==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-16.2.12.tgz", + "integrity": "sha512-aU6QnYSza005V9P3W6PpkieL56O0IHps96DjqI1RS8yOJUl3THmokqYN4Fm5+HXy4f390FN9i6ftadYQDKeWmA==", "requires": { "tslib": "^2.3.0" } @@ -14014,522 +15475,444 @@ "dev": true }, "@babel/code-frame": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", - "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.4.tgz", + "integrity": "sha512-r1IONyb6Ia+jYR2vvIDhdWdlTGhqbBoFqLTQidzZ4kepUFH15ejXvFHxCVbtl7BOXIudsIubf4E81xeA3h3IXA==", "dev": true, "requires": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" } }, "@babel/compat-data": { - "version": "7.21.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.7.tgz", - "integrity": "sha512-KYMqFYTaenzMK4yUtf4EW9wc4N9ef80FsbMtkwool5zpwl4YrT1SdWYSTRcT94KO4hannogdS+LxY7L+arP3gA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz", + "integrity": "sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==", "dev": true }, "@babel/core": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.3.tgz", - "integrity": "sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.3", - "@babel/helper-compilation-targets": "^7.19.3", - "@babel/helper-module-transforms": "^7.19.0", - "@babel/helpers": "^7.19.0", - "@babel/parser": "^7.19.3", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.3", - "@babel/types": "^7.19.3", - "convert-source-map": "^1.7.0", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", + "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helpers": "^7.23.2", + "@babel/parser": "^7.23.0", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "dependencies": { + "@babel/generator": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.4.tgz", + "integrity": "sha512-esuS49Cga3HcThFNebGhlgsrVLkvhqvYDTzgjfFFlHJcIfLe5jFmRRfCQ1KuBfc4Jrtn3ndLgKWAKjBE+IraYQ==", + "dev": true, + "requires": { + "@babel/types": "^7.23.4", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + } + }, + "@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + } + }, + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } }, "@babel/generator": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz", - "integrity": "sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", + "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", "dev": true, "requires": { - "@babel/types": "^7.21.4", + "@babel/types": "^7.22.5", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" } }, "@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.21.5.tgz", - "integrity": "sha512-uNrjKztPLkUk7bpCNC0jEKDJzzkvel/W+HguzbN8krA+LPfC1CEobJEvAvGka2A/M+ViOqXdcRL0GqPUJSjx9g==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", "dev": true, "requires": { - "@babel/types": "^7.21.5" + "@babel/types": "^7.22.15" } }, "@babel/helper-compilation-targets": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz", - "integrity": "sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", "dev": true, "requires": { - "@babel/compat-data": "^7.21.5", - "@babel/helper-validator-option": "^7.21.0", - "browserslist": "^4.21.3", + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", "lru-cache": "^5.1.1", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } }, "@babel/helper-create-class-features-plugin": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.8.tgz", - "integrity": "sha512-+THiN8MqiH2AczyuZrnrKL6cAxFRRQDKW9h1YkBvbgKmAm6mwiacig1qT73DHIWMGo40GRnsEfN3LA+E6NtmSw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-member-expression-to-functions": "^7.21.5", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.21.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/helper-split-export-declaration": "^7.18.6", - "semver": "^6.3.0" + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", + "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.8.tgz", - "integrity": "sha512-zGuSdedkFtsFHGbexAvNuipg1hbtitDLo2XE8/uf6Y9sOQV1xsYX/2pNbtedp/X0eU1pIt+kGvaqHCowkRbS5g==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-annotate-as-pure": "^7.22.5", "regexpu-core": "^5.3.1", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } }, "@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", - "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz", + "integrity": "sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==", "dev": true, "requires": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } + "resolve": "^1.14.2" } }, "@babel/helper-environment-visitor": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz", - "integrity": "sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true }, "@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "requires": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "dependencies": { + "@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + } + } } }, "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.5.tgz", - "integrity": "sha512-nIcGfgwpH2u4n9GG1HpStW5Ogx7x7ekiFHbjjFRKXbn5zUvqO9ZgotCO4x1aNbKn/x/xOUaXEhyNHCwtFCpxWg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", "dev": true, "requires": { - "@babel/types": "^7.21.5" + "@babel/types": "^7.23.0" } }, "@babel/helper-module-imports": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", - "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dev": true, "requires": { - "@babel/types": "^7.21.4" + "@babel/types": "^7.22.15" } }, "@babel/helper-module-transforms": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz", - "integrity": "sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-module-imports": "^7.21.4", - "@babel/helper-simple-access": "^7.21.5", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" } }, "@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-plugin-utils": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz", - "integrity": "sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "dev": true }, "@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" } }, "@babel/helper-replace-supers": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.21.5.tgz", - "integrity": "sha512-/y7vBgsr9Idu4M6MprbOVUfH3vs7tsIfnVWv/Ml2xgwvyH6LTngdfbf5AdsKwkJy4zgy1X/kuNrEKvhhK28Yrg==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-member-expression-to-functions": "^7.21.5", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5" } }, "@babel/helper-simple-access": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz", - "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, "requires": { - "@babel/types": "^7.21.5" + "@babel/types": "^7.22.5" } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", - "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", "dev": true, "requires": { - "@babel/types": "^7.20.0" + "@babel/types": "^7.22.5" } }, "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-string-parser": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz", - "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", "dev": true }, "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true }, "@babel/helper-validator-option": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", "dev": true }, "@babel/helper-wrap-function": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", - "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" + }, + "dependencies": { + "@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + } + } } }, "@babel/helpers": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.5.tgz", - "integrity": "sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.4.tgz", + "integrity": "sha512-HfcMizYz10cr3h29VqyfGL6ZWIjTwWfvYBMsBVGwpcbhNGe3wQ1ZXZRPzZoAHhd9OqHadHqjQ89iVKINXnbzuw==", "dev": true, "requires": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.4", + "@babel/types": "^7.23.4" + }, + "dependencies": { + "@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + } + } } }, "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.8.tgz", - "integrity": "sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.4.tgz", + "integrity": "sha512-vf3Xna6UEprW+7t6EtOmFpHNAuxw3xqPZghy+brsnusscJRW5BMUzzHZc5ICjULee81WeUV2jjakG09MDglJXQ==", "dev": true }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", - "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-proposal-optional-chaining": "^7.20.7" - } - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", - "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-proposal-class-static-block": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", - "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } - }, - "@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - } - }, - "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", - "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", - "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.7" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", + "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@babel/helper-plugin-utils": "^7.22.5" } }, - "@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", + "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.23.3" } }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz", - "integrity": "sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==", + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", + "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" } }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "requires": {} + }, "@babel/plugin-proposal-unicode-property-regex": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", @@ -14586,12 +15969,30 @@ } }, "@babel/plugin-syntax-import-assertions": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", - "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", + "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-syntax-import-attributes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", + "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-json-strings": { @@ -14675,376 +16076,556 @@ "@babel/helper-plugin-utils": "^7.14.5" } }, + "@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, "@babel/plugin-transform-arrow-functions": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz", - "integrity": "sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", + "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-async-generator-functions": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.4.tgz", + "integrity": "sha512-efdkfPhHYTtn0G6n2ddrESE91fgXxjlqLsnUtPWnJs4a4mZIbUaK7ffqKIIUKXSHwcDvaCVX6GXkaJJFqtX7jw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/plugin-syntax-async-generators": "^7.8.4" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", - "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", + "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9" + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", + "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz", - "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", + "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" } }, - "@babel/plugin-transform-classes": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz", - "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==", + "@babel/plugin-transform-class-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", + "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-class-static-block": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", + "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.3.tgz", + "integrity": "sha512-FGEQmugvAEu2QtgtU0uTASXevfLMFfBeVCIIdcQhn/uBQsMTjBajdnAtanQlOcuihWh10PZ7+HWvc7NtBwP74w==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-split-export-declaration": "^7.22.6", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz", - "integrity": "sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", + "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/template": "^7.20.7" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.15" + }, + "dependencies": { + "@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + } + } } }, "@babel/plugin-transform-destructuring": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz", - "integrity": "sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", + "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", + "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", + "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-dynamic-import": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", + "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", + "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", "dev": true, "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-export-namespace-from": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", + "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, "@babel/plugin-transform-for-of": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz", - "integrity": "sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.3.tgz", + "integrity": "sha512-X8jSm8X1CMwxmK878qsUGJRmbysKNbdpTv/O1/v0LuY/ZkZrng5WYiekYSdg9m09OTmDDUWeEDsTE+17WYbAZw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", + "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-json-strings": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", + "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", "dev": true, "requires": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" } }, "@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", + "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-logical-assignment-operators": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", + "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", + "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", - "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", + "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz", - "integrity": "sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", + "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.21.5", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-simple-access": "^7.21.5" + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", - "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz", + "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-identifier": "^7.19.1" + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", + "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", - "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", + "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", + "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-transform-numeric-separator": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", + "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-transform-object-rest-spread": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz", + "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.23.3", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.23.3" } }, "@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", + "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20" + } + }, + "@babel/plugin-transform-optional-catch-binding": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", + "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-transform-optional-chaining": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", + "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, "@babel/plugin-transform-parameters": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz", - "integrity": "sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", + "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-private-methods": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", + "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-private-property-in-object": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", + "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" } }, "@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", + "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-regenerator": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz", - "integrity": "sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", + "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.21.5", - "regenerator-transform": "^0.15.1" + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", + "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-runtime": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.4.tgz", - "integrity": "sha512-1J4dhrw1h1PqnNNpzwxQ2UBymJUF8KuPjAAnlLwZcGhHAIqUigFW7cdK6GHoB64ubY4qXQNYknoUeks4Wz7CUA==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.9.tgz", + "integrity": "sha512-9KjBH61AGJetCPYp/IEyLEp47SyybZb0nDRpBvmtEkm+rUIwxdlKpyNHI1TmsGkeuLclJdleQHRZ8XLBnnh8CQ==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.21.4", - "@babel/helper-plugin-utils": "^7.20.2", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "semver": "^6.3.0" + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.4", + "babel-plugin-polyfill-corejs3": "^0.8.2", + "babel-plugin-polyfill-regenerator": "^0.5.1", + "semver": "^6.3.1" }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", + "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", - "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", + "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", + "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", + "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", + "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz", - "integrity": "sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", + "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-unicode-property-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", + "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", + "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" } }, - "@babel/preset-env": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.21.4.tgz", - "integrity": "sha512-2W57zHs2yDLm6GD5ZpvNn71lZ0B/iypSdIeq25OurDKji6AdzV07qp4s3n1/x5BqtiGaTrPN3nerlSCaC5qNTw==", + "@babel/plugin-transform-unicode-sets-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", + "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", "dev": true, "requires": { - "@babel/compat-data": "^7.21.4", - "@babel/helper-compilation-targets": "^7.21.4", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-option": "^7.21.0", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.20.7", - "@babel/plugin-proposal-async-generator-functions": "^7.20.7", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.21.0", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.20.7", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.20.7", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.21.0", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.21.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/preset-env": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.9.tgz", + "integrity": "sha512-wNi5H/Emkhll/bqPjsjQorSykrlfY5OWakd6AulLvMEytpKasMVUpVy8RL4qBIBs5Ac6/5i0/Rv0b/Fg6Eag/g==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.9", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.5", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@babel/plugin-syntax-import-assertions": "^7.22.5", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", @@ -15054,59 +16635,76 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.20.7", - "@babel/plugin-transform-async-to-generator": "^7.20.7", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.21.0", - "@babel/plugin-transform-classes": "^7.21.0", - "@babel/plugin-transform-computed-properties": "^7.20.7", - "@babel/plugin-transform-destructuring": "^7.21.3", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.21.0", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.20.11", - "@babel/plugin-transform-modules-commonjs": "^7.21.2", - "@babel/plugin-transform-modules-systemjs": "^7.20.11", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.20.5", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.21.3", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.20.5", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.20.7", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.10", - "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.22.5", + "@babel/plugin-transform-async-generator-functions": "^7.22.7", + "@babel/plugin-transform-async-to-generator": "^7.22.5", + "@babel/plugin-transform-block-scoped-functions": "^7.22.5", + "@babel/plugin-transform-block-scoping": "^7.22.5", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-class-static-block": "^7.22.5", + "@babel/plugin-transform-classes": "^7.22.6", + "@babel/plugin-transform-computed-properties": "^7.22.5", + "@babel/plugin-transform-destructuring": "^7.22.5", + "@babel/plugin-transform-dotall-regex": "^7.22.5", + "@babel/plugin-transform-duplicate-keys": "^7.22.5", + "@babel/plugin-transform-dynamic-import": "^7.22.5", + "@babel/plugin-transform-exponentiation-operator": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.5", + "@babel/plugin-transform-for-of": "^7.22.5", + "@babel/plugin-transform-function-name": "^7.22.5", + "@babel/plugin-transform-json-strings": "^7.22.5", + "@babel/plugin-transform-literals": "^7.22.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.5", + "@babel/plugin-transform-member-expression-literals": "^7.22.5", + "@babel/plugin-transform-modules-amd": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.5", + "@babel/plugin-transform-modules-systemjs": "^7.22.5", + "@babel/plugin-transform-modules-umd": "^7.22.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.22.5", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.5", + "@babel/plugin-transform-numeric-separator": "^7.22.5", + "@babel/plugin-transform-object-rest-spread": "^7.22.5", + "@babel/plugin-transform-object-super": "^7.22.5", + "@babel/plugin-transform-optional-catch-binding": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.6", + "@babel/plugin-transform-parameters": "^7.22.5", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.5", + "@babel/plugin-transform-property-literals": "^7.22.5", + "@babel/plugin-transform-regenerator": "^7.22.5", + "@babel/plugin-transform-reserved-words": "^7.22.5", + "@babel/plugin-transform-shorthand-properties": "^7.22.5", + "@babel/plugin-transform-spread": "^7.22.5", + "@babel/plugin-transform-sticky-regex": "^7.22.5", + "@babel/plugin-transform-template-literals": "^7.22.5", + "@babel/plugin-transform-typeof-symbol": "^7.22.5", + "@babel/plugin-transform-unicode-escapes": "^7.22.5", + "@babel/plugin-transform-unicode-property-regex": "^7.22.5", + "@babel/plugin-transform-unicode-regex": "^7.22.5", + "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.21.4", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "core-js-compat": "^3.25.1", - "semver": "^6.3.0" + "@babel/types": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.4", + "babel-plugin-polyfill-corejs3": "^0.8.2", + "babel-plugin-polyfill-regenerator": "^0.5.1", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } }, "@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6.tgz", + "integrity": "sha512-ID2yj6K/4lKfhuU3+EX4UvNbIt7eACFbHmNUjzA+ep+B5971CknnA/9DEWKbRokfbbtblxxxXFJJrH47UEAMVg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", @@ -15123,50 +16721,50 @@ "dev": true }, "@babel/runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", - "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", "dev": true, "requires": { "regenerator-runtime": "^0.13.11" } }, "@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", "dev": true, "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" } }, "@babel/traverse": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.5.tgz", - "integrity": "sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.5", - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.5", - "@babel/types": "^7.21.5", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.4.tgz", + "integrity": "sha512-IYM8wSUwunWTB6tFC2dkKZhxbIjHoWemdK+3f8/wq8aKhbUscxD5MX72ubd90fxvFknaLPeGw5ycU84V1obHJg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.23.4", + "@babel/generator": "^7.23.4", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.4", + "@babel/types": "^7.23.4", "debug": "^4.1.0", "globals": "^11.1.0" }, "dependencies": { "@babel/generator": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.5.tgz", - "integrity": "sha512-SrKK/sRv8GesIW1bDagf9cCG38IOMYZusoe1dfg0D8aiUe3Amvoj1QtjTPAWcfrZFvIwlleLb0gxzQidL9w14w==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.4.tgz", + "integrity": "sha512-esuS49Cga3HcThFNebGhlgsrVLkvhqvYDTzgjfFFlHJcIfLe5jFmRRfCQ1KuBfc4Jrtn3ndLgKWAKjBE+IraYQ==", "dev": true, "requires": { - "@babel/types": "^7.21.5", + "@babel/types": "^7.23.4", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -15175,13 +16773,13 @@ } }, "@babel/types": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.5.tgz", - "integrity": "sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.4.tgz", + "integrity": "sha512-7uIFwVYpoplT5jp/kVv6EF93VaJ8H+Yn5IczYiaAi98ajzjfoZfslet/e0sLh+wVBjb2qqIut1b0S26VSafsSQ==", "dev": true, "requires": { - "@babel/helper-string-parser": "^7.21.5", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" } }, @@ -15191,29 +16789,6 @@ "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "dev": true }, - "@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "peer": true, - "requires": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "dependencies": { - "@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "peer": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - } - } - }, "@discoveryjs/json-ext": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", @@ -15221,156 +16796,156 @@ "dev": true }, "@esbuild/android-arm": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.18.tgz", - "integrity": "sha512-EmwL+vUBZJ7mhFCs5lA4ZimpUH3WMAoqvOIYhVQwdIgSpHC8ImHdsRyhHAVxpDYUSm0lWvd63z0XH1IlImS2Qw==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", "dev": true, "optional": true }, "@esbuild/android-arm64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.18.tgz", - "integrity": "sha512-/iq0aK0eeHgSC3z55ucMAHO05OIqmQehiGay8eP5l/5l+iEr4EIbh4/MI8xD9qRFjqzgkc0JkX0LculNC9mXBw==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", "dev": true, "optional": true }, "@esbuild/android-x64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.18.tgz", - "integrity": "sha512-x+0efYNBF3NPW2Xc5bFOSFW7tTXdAcpfEg2nXmxegm4mJuVeS+i109m/7HMiOQ6M12aVGGFlqJX3RhNdYM2lWg==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", "dev": true, "optional": true }, "@esbuild/darwin-arm64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.18.tgz", - "integrity": "sha512-6tY+djEAdF48M1ONWnQb1C+6LiXrKjmqjzPNPWXhu/GzOHTHX2nh8Mo2ZAmBFg0kIodHhciEgUBtcYCAIjGbjQ==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", "dev": true, "optional": true }, "@esbuild/darwin-x64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.18.tgz", - "integrity": "sha512-Qq84ykvLvya3dO49wVC9FFCNUfSrQJLbxhoQk/TE1r6MjHo3sFF2tlJCwMjhkBVq3/ahUisj7+EpRSz0/+8+9A==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", "dev": true, "optional": true }, "@esbuild/freebsd-arm64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.18.tgz", - "integrity": "sha512-fw/ZfxfAzuHfaQeMDhbzxp9mc+mHn1Y94VDHFHjGvt2Uxl10mT4CDavHm+/L9KG441t1QdABqkVYwakMUeyLRA==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", "dev": true, "optional": true }, "@esbuild/freebsd-x64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.18.tgz", - "integrity": "sha512-FQFbRtTaEi8ZBi/A6kxOC0V0E9B/97vPdYjY9NdawyLd4Qk5VD5g2pbWN2VR1c0xhzcJm74HWpObPszWC+qTew==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", "dev": true, "optional": true }, "@esbuild/linux-arm": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.18.tgz", - "integrity": "sha512-jW+UCM40LzHcouIaqv3e/oRs0JM76JfhHjCavPxMUti7VAPh8CaGSlS7cmyrdpzSk7A+8f0hiedHqr/LMnfijg==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", "dev": true, "optional": true }, "@esbuild/linux-arm64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.18.tgz", - "integrity": "sha512-R7pZvQZFOY2sxUG8P6A21eq6q+eBv7JPQYIybHVf1XkQYC+lT7nDBdC7wWKTrbvMXKRaGudp/dzZCwL/863mZQ==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", "dev": true, "optional": true }, "@esbuild/linux-ia32": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.18.tgz", - "integrity": "sha512-ygIMc3I7wxgXIxk6j3V00VlABIjq260i967Cp9BNAk5pOOpIXmd1RFQJQX9Io7KRsthDrQYrtcx7QCof4o3ZoQ==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", "dev": true, "optional": true }, "@esbuild/linux-loong64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.18.tgz", - "integrity": "sha512-bvPG+MyFs5ZlwYclCG1D744oHk1Pv7j8psF5TfYx7otCVmcJsEXgFEhQkbhNW8otDHL1a2KDINW20cfCgnzgMQ==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", "dev": true, "optional": true }, "@esbuild/linux-mips64el": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.18.tgz", - "integrity": "sha512-oVqckATOAGuiUOa6wr8TXaVPSa+6IwVJrGidmNZS1cZVx0HqkTMkqFGD2HIx9H1RvOwFeWYdaYbdY6B89KUMxA==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", "dev": true, "optional": true }, "@esbuild/linux-ppc64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.18.tgz", - "integrity": "sha512-3dLlQO+b/LnQNxgH4l9rqa2/IwRJVN9u/bK63FhOPB4xqiRqlQAU0qDU3JJuf0BmaH0yytTBdoSBHrb2jqc5qQ==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", "dev": true, "optional": true }, "@esbuild/linux-riscv64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.18.tgz", - "integrity": "sha512-/x7leOyDPjZV3TcsdfrSI107zItVnsX1q2nho7hbbQoKnmoeUWjs+08rKKt4AUXju7+3aRZSsKrJtaRmsdL1xA==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", "dev": true, "optional": true }, "@esbuild/linux-s390x": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.18.tgz", - "integrity": "sha512-cX0I8Q9xQkL/6F5zWdYmVf5JSQt+ZfZD2bJudZrWD+4mnUvoZ3TDDXtDX2mUaq6upMFv9FlfIh4Gfun0tbGzuw==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", "dev": true, "optional": true }, "@esbuild/linux-x64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.18.tgz", - "integrity": "sha512-66RmRsPlYy4jFl0vG80GcNRdirx4nVWAzJmXkevgphP1qf4dsLQCpSKGM3DUQCojwU1hnepI63gNZdrr02wHUA==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", "dev": true, "optional": true }, "@esbuild/netbsd-x64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.18.tgz", - "integrity": "sha512-95IRY7mI2yrkLlTLb1gpDxdC5WLC5mZDi+kA9dmM5XAGxCME0F8i4bYH4jZreaJ6lIZ0B8hTrweqG1fUyW7jbg==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", "dev": true, "optional": true }, "@esbuild/openbsd-x64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.18.tgz", - "integrity": "sha512-WevVOgcng+8hSZ4Q3BKL3n1xTv5H6Nb53cBrtzzEjDbbnOmucEVcZeGCsCOi9bAOcDYEeBZbD2SJNBxlfP3qiA==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", "dev": true, "optional": true }, "@esbuild/sunos-x64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.18.tgz", - "integrity": "sha512-Rzf4QfQagnwhQXVBS3BYUlxmEbcV7MY+BH5vfDZekU5eYpcffHSyjU8T0xucKVuOcdCsMo+Ur5wmgQJH2GfNrg==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", "dev": true, "optional": true }, "@esbuild/win32-arm64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.18.tgz", - "integrity": "sha512-Kb3Ko/KKaWhjeAm2YoT/cNZaHaD1Yk/pa3FTsmqo9uFh1D1Rfco7BBLIPdDOozrObj2sahslFuAQGvWbgWldAg==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", "dev": true, "optional": true }, "@esbuild/win32-ia32": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.18.tgz", - "integrity": "sha512-0/xUMIdkVHwkvxfbd5+lfG7mHOf2FRrxNbPiKWg9C4fFrB8H0guClmaM3BFiRUYrznVoyxTIyC/Ou2B7QQSwmw==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", "dev": true, "optional": true }, "@esbuild/win32-x64": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.18.tgz", - "integrity": "sha512-qU25Ma1I3NqTSHJUOKi9sAH1/Mzuvlke0ioMJRthLXKm7JiSKVwFghlGbDLOO2sARECGhja4xYfRAZNPAkooYg==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", "dev": true, "optional": true }, @@ -15437,9 +17012,9 @@ } }, "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "requires": { "ansi-regex": "^6.0.1" @@ -15501,9 +17076,9 @@ "dev": true }, "@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", "dev": true, "requires": { "@jridgewell/gen-mapping": "^0.3.0", @@ -16285,9 +17860,9 @@ } }, "@ngtools/webpack": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.0.0.tgz", - "integrity": "sha512-I5zjGtJu2wwIdM+OFUHXezmwTJ0wpParVJgCxR0cLd0CIbpRYSjOSZQN/nR9ZnTKAI5uFZ3MM2p/VRQGUUHUcw==", + "version": "16.2.10", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.2.10.tgz", + "integrity": "sha512-XAVn59zP3ztuKDtw92Xc9+64RK4u4c9g8y5GgtjIWeOwgNXl8bYhAo3uTZzrSrOu96DFZGjsmghFab/7/C2pDg==", "dev": true, "requires": {} }, @@ -16343,9 +17918,9 @@ } }, "@npmcli/git": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.0.4.tgz", - "integrity": "sha512-5yZghx+u5M47LghaybLCkdSyFzV/w4OuH12d96HO389Ik9CDsLaDZJVynSGGVJOLn6gy/k7Dz5XYcplM3uxXRg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", + "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", "dev": true, "requires": { "@npmcli/promise-spawn": "^6.0.0", @@ -16453,61 +18028,131 @@ "optional": true }, "@schematics/angular": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.0.0.tgz", - "integrity": "sha512-Ao1Y0hEDa30JjWDLnUfOsD+9nnfdBFclfKFzR+7pvvFYCpSUhH1u+8e+7noruIxlP26+SpqPn3AF5+IRTGza8w==", + "version": "16.2.10", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.2.10.tgz", + "integrity": "sha512-PXmoswvN7qknTsXDmEvhZ9UG+awwWnQ/1Jd/eqqQx08iAaAT81OsXj1bN7eSs6tEGBKGjPb6q2xzuiECAdymzg==", "dev": true, "requires": { - "@angular-devkit/core": "16.0.0", - "@angular-devkit/schematics": "16.0.0", + "@angular-devkit/core": "16.2.10", + "@angular-devkit/schematics": "16.2.10", "jsonc-parser": "3.2.0" } }, - "@sigstore/protobuf-specs": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.1.0.tgz", - "integrity": "sha512-a31EnjuIDSX8IXBUib3cYLDRlPMU36AWX4xS8ysLaNu4ZzUesDiPt83pgrW2X1YLMe5L2HbDyaKK5BrL4cNKaQ==", - "dev": true - }, - "@socket.io/component-emitter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", - "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", - "dev": true + "@sigstore/bundle": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-1.1.0.tgz", + "integrity": "sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog==", + "dev": true, + "requires": { + "@sigstore/protobuf-specs": "^0.2.0" + } }, - "@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "@sigstore/protobuf-specs": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz", + "integrity": "sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==", "dev": true }, - "@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true, - "peer": true - }, - "@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "@sigstore/sign": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-1.0.0.tgz", + "integrity": "sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA==", "dev": true, - "peer": true + "requires": { + "@sigstore/bundle": "^1.1.0", + "@sigstore/protobuf-specs": "^0.2.0", + "make-fetch-happen": "^11.0.1" + }, + "dependencies": { + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true + }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true + }, + "make-fetch-happen": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "dev": true, + "requires": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + } + }, + "minipass-fetch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", + "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "dev": true, + "requires": { + "encoding": "^0.1.13", + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "dependencies": { + "minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true + } + } + } + } }, - "@tsconfig/node14": { + "@sigstore/tuf": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.3.tgz", + "integrity": "sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==", "dev": true, - "peer": true + "requires": { + "@sigstore/protobuf-specs": "^0.2.0", + "tuf-js": "^1.1.7" + } + }, + "@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", + "dev": true }, - "@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true, - "peer": true + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true }, "@tufjs/canonical-json": { "version": "1.0.0", @@ -16523,23 +18168,12 @@ "requires": { "@tufjs/canonical-json": "1.0.0", "minimatch": "^9.0.0" - }, - "dependencies": { - "minimatch": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.0.tgz", - "integrity": "sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } } }, "@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", "dev": true, "requires": { "@types/connect": "*", @@ -16547,27 +18181,27 @@ } }, "@types/bonjour": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", - "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", "dev": true, "requires": { "@types/node": "*" } }, "@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, "requires": { "@types/node": "*" } }, "@types/connect-history-api-fallback": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", - "integrity": "sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", "dev": true, "requires": { "@types/express-serve-static-core": "*", @@ -16613,9 +18247,9 @@ "dev": true }, "@types/express": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", "dev": true, "requires": { "@types/body-parser": "*", @@ -16625,9 +18259,9 @@ } }, "@types/express-serve-static-core": { - "version": "4.17.34", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.34.tgz", - "integrity": "sha512-fvr49XlCGoUj2Pp730AItckfjat4WNb0lb3kfrLWffd+RLeoGAMsq7UOy04PAPtoL01uKwcp6u8nhzpgpDYr3w==", + "version": "4.17.41", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz", + "integrity": "sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==", "dev": true, "requires": { "@types/node": "*", @@ -16636,10 +18270,16 @@ "@types/send": "*" } }, + "@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true + }, "@types/http-proxy": { - "version": "1.17.11", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz", - "integrity": "sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==", + "version": "1.17.14", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", + "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", "dev": true, "requires": { "@types/node": "*" @@ -16658,9 +18298,9 @@ "dev": true }, "@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", "dev": true }, "@types/node": { @@ -16669,16 +18309,25 @@ "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", "dev": true }, + "@types/node-forge": { + "version": "1.3.10", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.10.tgz", + "integrity": "sha512-y6PJDYN4xYBxwd22l+OVH35N+1fCYWiuC3aiP2SlXVE6Lo7SS+rSx9r89hLxrP4pn6n1lBGhHJ12pj3F3Mpttw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "version": "6.9.10", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz", + "integrity": "sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==", "dev": true }, "@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", "dev": true }, "@types/retry": { @@ -16688,9 +18337,9 @@ "dev": true }, "@types/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", - "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", "dev": true, "requires": { "@types/mime": "^1", @@ -16698,37 +18347,38 @@ } }, "@types/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", "dev": true, "requires": { "@types/express": "*" } }, "@types/serve-static": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", - "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", + "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", "dev": true, "requires": { + "@types/http-errors": "*", "@types/mime": "*", "@types/node": "*" } }, "@types/sockjs": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", - "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", "dev": true, "requires": { "@types/node": "*" } }, "@types/ws": { - "version": "8.5.4", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", - "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", "dev": true, "requires": { "@types/node": "*" @@ -16887,6 +18537,69 @@ "@xtuc/long": "4.2.2" } }, + "@wessberg/ts-evaluator": { + "version": "0.0.27", + "resolved": "https://registry.npmjs.org/@wessberg/ts-evaluator/-/ts-evaluator-0.0.27.tgz", + "integrity": "sha512-7gOpVm3yYojUp/Yn7F4ZybJRxyqfMNf0LXK5KJiawbPfL0XTsJV+0mgrEDjOIR6Bi0OYk2Cyg4tjFu1r8MCZaA==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "jsdom": "^16.4.0", + "object-path": "^0.11.5", + "tslib": "^2.0.3" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -16933,10 +18646,34 @@ "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", "dev": true }, + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + } + } + }, "acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", "dev": true, "requires": {} }, @@ -17001,13 +18738,11 @@ } }, "agentkeepalive": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.3.0.tgz", - "integrity": "sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", "dev": true, "requires": { - "debug": "^4.1.0", - "depd": "^2.0.0", "humanize-ms": "^1.2.1" } }, @@ -17122,13 +18857,6 @@ "readable-stream": "^3.6.0" } }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true, - "peer": true - }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -17144,6 +18872,12 @@ "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", "dev": true }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, "autoprefixer": { "version": "10.4.14", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", @@ -17159,12 +18893,12 @@ } }, "babel-loader": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.2.tgz", - "integrity": "sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA==", + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", + "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", "dev": true, "requires": { - "find-cache-dir": "^3.3.2", + "find-cache-dir": "^4.0.0", "schema-utils": "^4.0.0" } }, @@ -17182,41 +18916,41 @@ } }, "babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz", + "integrity": "sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==", "dev": true, "requires": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", - "semver": "^6.1.1" + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.3", + "semver": "^6.3.1" }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } }, "babel-plugin-polyfill-corejs3": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", - "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", + "version": "0.8.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz", + "integrity": "sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ==", "dev": true, "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.3", - "core-js-compat": "^3.25.1" + "@babel/helper-define-polyfill-provider": "^0.4.3", + "core-js-compat": "^3.33.1" } }, "babel-plugin-polyfill-regenerator": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", - "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz", + "integrity": "sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==", "dev": true, "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.3" + "@babel/helper-define-polyfill-provider": "^0.4.3" } }, "balanced-match": { @@ -17339,16 +19073,22 @@ "fill-range": "^7.0.1" } }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, "browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" } }, "buffer": { @@ -17383,53 +19123,36 @@ "dev": true }, "cacache": { - "version": "17.0.6", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.0.6.tgz", - "integrity": "sha512-ixcYmEBExFa/+ajIPjcwypxL97CjJyOsH9A/W+4qgEPIpJvKlC+HmVY8nkIck6n3PwUTdgq9c489niJGwl+5Cw==", + "version": "17.1.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", + "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", "dev": true, "requires": { "@npmcli/fs": "^3.1.0", "fs-minipass": "^3.0.0", "glob": "^10.2.2", "lru-cache": "^7.7.1", - "minipass": "^5.0.0", + "minipass": "^7.0.3", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", "ssri": "^10.0.0", "tar": "^6.1.11", "unique-filename": "^3.0.0" }, "dependencies": { - "glob": { - "version": "10.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.3.tgz", - "integrity": "sha512-Kb4rfmBVE3eQTAimgmeqc2LwSnN0wIOkkUL6HmxEFxNJ4fHghYHVbFba/HcGcRjE6s9KoMNK3rSOwkL4PioZjg==", - "dev": true, - "requires": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", - "minimatch": "^9.0.0", - "minipass": "^5.0.0", - "path-scurry": "^1.7.0" - } - }, "lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true }, - "minimatch": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.0.tgz", - "integrity": "sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } + "minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true } } }, @@ -17456,9 +19179,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001486", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001486.tgz", - "integrity": "sha512-uv7/gXuHi10Whlj0pp5q/tsK/32J2QSqVRKQhs2j8VsDCjgyruAh/eEXHF822VqO9yT6iZKw3nRwZRSPBE9OQg==", + "version": "1.0.30001564", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001564.tgz", + "integrity": "sha512-DqAOf+rhof+6GVx1y+xzbFPeOumfQnhYzVnZD6LAXijR77yPtm9mfOcqOnT3mpnJiZVT+kwLAFnRlZcIz+c6bg==", "dev": true }, "chalk": { @@ -17588,16 +19311,25 @@ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", "dev": true }, "compressible": { @@ -17768,12 +19500,12 @@ } }, "core-js-compat": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.2.tgz", - "integrity": "sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA==", + "version": "3.33.3", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.3.tgz", + "integrity": "sha512-cNzGqFsh3Ot+529GIXacjTJ7kegdt5fPXxCBVS1G0iaZpuo/tBz399ymceLJveQhFFZ8qThHiP3fzuoQjKN2ow==", "dev": true, "requires": { - "browserslist": "^4.21.5" + "browserslist": "^4.22.1" } }, "core-util-is": { @@ -17793,14 +19525,14 @@ } }, "cosmiconfig": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.3.tgz", - "integrity": "sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==", + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "dev": true, "requires": { - "import-fresh": "^3.2.1", + "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", - "parse-json": "^5.0.0", + "parse-json": "^5.2.0", "path-type": "^4.0.0" }, "dependencies": { @@ -17821,31 +19553,18 @@ } } }, - "cosmiconfig-typescript-loader": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.3.0.tgz", - "integrity": "sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q==", - "dev": true, - "requires": {} - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true, - "peer": true - }, "critters": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.16.tgz", - "integrity": "sha512-JwjgmO6i3y6RWtLYmXwO5jMd+maZt8Tnfu7VVISmEWyQqfLpB8soBswf8/2bu6SBXxtKA68Al3c+qIG1ApT68A==", + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.20.tgz", + "integrity": "sha512-CImNRorKOl5d8TWcnAz5n5izQ6HFsvz29k327/ELy6UFcmbiZNOsinaKvzv16WZR0P6etfSWYzE47C4/56B3Uw==", "dev": true, "requires": { "chalk": "^4.1.0", - "css-select": "^4.2.0", - "parse5": "^6.0.1", - "parse5-htmlparser2-tree-adapter": "^6.0.1", - "postcss": "^8.3.7", + "css-select": "^5.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.2", + "htmlparser2": "^8.0.2", + "postcss": "^8.4.23", "pretty-bytes": "^5.3.0" }, "dependencies": { @@ -17923,15 +19642,15 @@ } }, "css-loader": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", - "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", + "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", "dev": true, "requires": { "icss-utils": "^5.1.0", - "postcss": "^8.4.19", + "postcss": "^8.4.21", "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-local-by-default": "^4.0.3", "postcss-modules-scope": "^3.0.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", @@ -17939,15 +19658,15 @@ } }, "css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "dev": true, "requires": { "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, @@ -17963,12 +19682,46 @@ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + } + } + }, "custom-event": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", "dev": true }, + "data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + } + }, "date-format": { "version": "4.0.14", "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", @@ -17984,6 +19737,12 @@ "ms": "2.1.2" } }, + "decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true + }, "default-gateway": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", @@ -18008,6 +19767,12 @@ "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "dev": true }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true + }, "delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", @@ -18164,13 +19929,6 @@ "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", "dev": true }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "peer": true - }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -18187,9 +19945,9 @@ "dev": true }, "dns-packet": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz", - "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", "dev": true, "requires": { "@leichtgewicht/ip-codec": "^2.0.1" @@ -18208,14 +19966,14 @@ } }, "dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" } }, "domelementtype": { @@ -18224,24 +19982,41 @@ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true }, + "domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "requires": { + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true + } + } + }, "domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, "requires": { - "domelementtype": "^2.2.0" + "domelementtype": "^2.3.0" } }, "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "dev": true, "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" } }, "eastasianwidth": { @@ -18257,9 +20032,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", + "version": "1.4.592", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.592.tgz", + "integrity": "sha512-D3NOkROIlF+d5ixnz7pAf3Lu/AuWpd6AYgI9O67GQXMXTcCP1gJQRotOq35eQy5Sb4hez33XH1YdTtILA7Udww==", "dev": true }, "emoji-regex": { @@ -18343,10 +20118,10 @@ "dev": true }, "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "devOptional": true }, "env-paths": { "version": "2.2.1", @@ -18386,39 +20161,39 @@ "dev": true }, "esbuild": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.18.tgz", - "integrity": "sha512-z1lix43jBs6UKjcZVKOw2xx69ffE2aG0PygLL5qJ9OS/gy0Ewd1gW/PUQIOIQGXBHWNywSc0floSKoMFF8aK2w==", - "dev": true, - "requires": { - "@esbuild/android-arm": "0.17.18", - "@esbuild/android-arm64": "0.17.18", - "@esbuild/android-x64": "0.17.18", - "@esbuild/darwin-arm64": "0.17.18", - "@esbuild/darwin-x64": "0.17.18", - "@esbuild/freebsd-arm64": "0.17.18", - "@esbuild/freebsd-x64": "0.17.18", - "@esbuild/linux-arm": "0.17.18", - "@esbuild/linux-arm64": "0.17.18", - "@esbuild/linux-ia32": "0.17.18", - "@esbuild/linux-loong64": "0.17.18", - "@esbuild/linux-mips64el": "0.17.18", - "@esbuild/linux-ppc64": "0.17.18", - "@esbuild/linux-riscv64": "0.17.18", - "@esbuild/linux-s390x": "0.17.18", - "@esbuild/linux-x64": "0.17.18", - "@esbuild/netbsd-x64": "0.17.18", - "@esbuild/openbsd-x64": "0.17.18", - "@esbuild/sunos-x64": "0.17.18", - "@esbuild/win32-arm64": "0.17.18", - "@esbuild/win32-ia32": "0.17.18", - "@esbuild/win32-x64": "0.17.18" + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" } }, "esbuild-wasm": { - "version": "0.17.18", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.17.18.tgz", - "integrity": "sha512-h4m5zVa+KaDuRFIbH9dokMwovvkIjTQJS7/Ry+0Z1paVuS9aIkso2vdA2GmwH9GSvGX6w71WveJ3PfkoLuWaRw==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.18.17.tgz", + "integrity": "sha512-9OHGcuRzy+I8ziF9FzjfKLWAPbvi0e/metACVg9k6bK+SI4FFxeV6PcZsz8RIVaMD4YNehw+qj6UMR3+qj/EuQ==", "dev": true }, "escalade": { @@ -18439,6 +20214,33 @@ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, + "escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "source-map": "~0.6.1" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, "eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -18525,6 +20327,12 @@ "strip-final-newline": "^2.0.0" } }, + "exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "dev": true + }, "express": { "version": "4.18.2", "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", @@ -18638,9 +20446,9 @@ "dev": true }, "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -18734,14 +20542,13 @@ } }, "find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", "dev": true, "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" } }, "find-up": { @@ -18777,13 +20584,24 @@ }, "dependencies": { "signal-exit": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.1.tgz", - "integrity": "sha512-uUWsN4aOxJAS8KOuf3QMyFtgm1pkb6I+KRZbRF/ghdf5T7sM+B1lLLzPDxswUjkmHyxQAVzEgG35E3NzDM9GVw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true } } }, + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, "forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -18814,18 +20632,26 @@ } }, "fs-minipass": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.2.tgz", - "integrity": "sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", "dev": true, "requires": { - "minipass": "^5.0.0" + "minipass": "^7.0.3" + }, + "dependencies": { + "minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true + } } }, "fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", + "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==", "dev": true }, "fs.realpath": { @@ -18899,16 +20725,16 @@ "dev": true }, "glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" } }, "glob-parent": { @@ -18968,6 +20794,15 @@ "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, + "guess-parser": { + "version": "0.4.22", + "resolved": "https://registry.npmjs.org/guess-parser/-/guess-parser-0.4.22.tgz", + "integrity": "sha512-KcUWZ5ACGaBM69SbqwVIuWGoSAgD+9iJnchR9j/IarVI1jHVeXv+bUXBIMeqVMSKt3zrn0Dgf9UpcOEpPBLbSg==", + "dev": true, + "requires": { + "@wessberg/ts-evaluator": "0.0.27" + } + }, "handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", @@ -19100,10 +20935,19 @@ } } }, + "html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.5" + } + }, "html-entities": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", - "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", + "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", "dev": true }, "html-escaper": { @@ -19112,6 +20956,18 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, + "htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, "http-cache-semantics": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", @@ -19161,14 +21017,14 @@ "follow-redirects": "^1.0.0", "requires-port": "^1.0.0" } - }, - "http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", "dev": true, "requires": { - "@tootallnate/once": "2", + "@tootallnate/once": "1", "agent-base": "6", "debug": "4" } @@ -19246,17 +21102,6 @@ "dev": true, "requires": { "minimatch": "^9.0.0" - }, - "dependencies": { - "minimatch": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.0.tgz", - "integrity": "sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } } }, "image-size": { @@ -19325,9 +21170,9 @@ "dev": true }, "ini": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.0.0.tgz", - "integrity": "sha512-t0ikzf5qkSFqRl1e6ejKBe+Tk2bsQd8ivEkcisyGXsku2t8NvXZ1Y3RRz5vxrDgOrTBOi13CvGsVoI5wVpd7xg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", "dev": true }, "inquirer": { @@ -19417,9 +21262,9 @@ "dev": true }, "ipaddr.js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", "dev": true }, "is-arrayish": { @@ -19522,6 +21367,12 @@ "isobject": "^3.0.1" } }, + "is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, "is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -19658,9 +21509,9 @@ } }, "jackspeak": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.0.tgz", - "integrity": "sha512-r5XBrqIJfwRIjRt/Xr5fv9Wh09qyhHfKnYddDlpM+ibRR20qrYActpCAgU6U+d53EOEjzkvxPMVHSlgR7leXrQ==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", "dev": true, "requires": { "@isaacs/cliui": "^8.0.2", @@ -19701,6 +21552,12 @@ } } }, + "jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "dev": true + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -19717,6 +21574,50 @@ "esprima": "^4.0.0" } }, + "jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dev": true, + "requires": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "dev": true, + "requires": {} + } + } + }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -19962,13 +21863,13 @@ "dev": true }, "launch-editor": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz", - "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", + "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", "dev": true, "requires": { "picocolors": "^1.0.0", - "shell-quote": "^1.7.3" + "shell-quote": "^1.8.1" } }, "less": { @@ -20187,12 +22088,20 @@ } }, "magic-string": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", - "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", + "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", "dev": true, "requires": { - "@jridgewell/sourcemap-codec": "^1.4.13" + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "dependencies": { + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + } } }, "make-dir": { @@ -20212,13 +22121,6 @@ } } }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, - "peer": true - }, "make-fetch-happen": { "version": "10.2.1", "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", @@ -20253,6 +22155,12 @@ "semver": "^7.3.5" } }, + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true + }, "cacache": { "version": "16.1.3", "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", @@ -20288,12 +22196,45 @@ "minipass": "^3.0.0" } }, + "glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, "lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, "minipass": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", @@ -20339,12 +22280,12 @@ "dev": true }, "memfs": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.1.tgz", - "integrity": "sha512-UWbFJKvj5k+nETdteFndTpYxdeTMox/ULeqX5k/dpaQJCCFmj5EeKv3dBcyO2xmkRAx2vppRu5dVG7SOtsGOzA==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", "dev": true, "requires": { - "fs-monkey": "^1.0.3" + "fs-monkey": "^1.0.4" } }, "merge-descriptors": { @@ -20409,9 +22350,9 @@ "dev": true }, "mini-css-extract-plugin": { - "version": "2.7.5", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.5.tgz", - "integrity": "sha512-9HaR++0mlgom81s95vvNjxkg52n2b5s//3ZTI1EtzFb98awsLSivs2LMsVqnQ3ay0PVhqWcGNyDaTE961FOcjQ==", + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz", + "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==", "dev": true, "requires": { "schema-utils": "^4.0.0" @@ -20424,9 +22365,9 @@ "dev": true }, "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "requires": { "brace-expansion": "^2.0.1" @@ -20743,12 +22684,13 @@ "dev": true }, "node-gyp": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.3.1.tgz", - "integrity": "sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg==", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz", + "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==", "dev": true, "requires": { "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", "glob": "^7.1.4", "graceful-fs": "^4.2.6", "make-fetch-happen": "^10.0.3", @@ -20805,16 +22747,16 @@ } }, "node-gyp-build": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", - "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.7.0.tgz", + "integrity": "sha512-PbZERfeFdrHQOOXiAKOY0VPbykZy90ndPKk0d+CFDegTKmWp1VgOTz2xACVbr1BjCWxrQp68CXtvNsveFhqDJg==", "dev": true, "optional": true }, "node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "dev": true }, "nopt": { @@ -20860,9 +22802,9 @@ } }, "npm-install-checks": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.1.1.tgz", - "integrity": "sha512-dH3GmQL4vsPtld59cOn8uY0iOqRmqKvV+DLGwNXV/Q7MDgD2QfOADWd/mFXcIE5LVhYYGjA3baz6W9JneqnuCw==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", + "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", "dev": true, "requires": { "semver": "^7.1.1" @@ -20922,6 +22864,23 @@ "proc-log": "^3.0.0" }, "dependencies": { + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true + }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, "lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", @@ -20952,15 +22911,23 @@ } }, "minipass-fetch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", - "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", + "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", "dev": true, "requires": { "encoding": "^0.1.13", - "minipass": "^5.0.0", + "minipass": "^7.0.3", "minipass-sized": "^1.0.3", "minizlib": "^2.1.2" + }, + "dependencies": { + "minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true + } } } } @@ -20995,6 +22962,12 @@ "boolbase": "^1.0.0" } }, + "nwsapi": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", + "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", + "dev": true + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -21007,6 +22980,12 @@ "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", "dev": true }, + "object-path": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.8.tgz", + "integrity": "sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==", + "dev": true + }, "obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", @@ -21188,9 +23167,9 @@ "dev": true }, "pacote": { - "version": "15.1.3", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.1.3.tgz", - "integrity": "sha512-aRts8cZqxiJVDitmAh+3z+FxuO3tLNWEmwDRPEpDDiZJaRz06clP4XX112ynMT5uF0QNoMPajBBHnaStUEPJXA==", + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz", + "integrity": "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==", "dev": true, "requires": { "@npmcli/git": "^4.0.0", @@ -21263,12 +23242,6 @@ "parse5-sax-parser": "^7.0.0" }, "dependencies": { - "entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true - }, "parse5": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", @@ -21280,15 +23253,6 @@ } } }, - "parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", - "dev": true, - "requires": { - "parse5": "^6.0.1" - } - }, "parse5-sax-parser": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", @@ -21298,12 +23262,6 @@ "parse5": "^7.0.0" }, "dependencies": { - "entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true - }, "parse5": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", @@ -21346,19 +23304,19 @@ "dev": true }, "path-scurry": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.8.0.tgz", - "integrity": "sha512-IjTrKseM404/UAWA8bBbL3Qp6O2wXkanuIE3seCxBH7ctRuvH1QRawy1N3nVDHGkdeZsjOsSe/8AQBL/VQCy2g==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", "dev": true, "requires": { - "lru-cache": "^9.1.1", - "minipass": "^5.0.0" + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "dependencies": { "lru-cache": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.1.tgz", - "integrity": "sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", "dev": true } } @@ -21403,9 +23361,9 @@ "optional": true }, "piscina": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-3.2.0.tgz", - "integrity": "sha512-yn/jMdHRw+q2ZJhFhyqsmANcbF6V2QwmD84c6xRau+QpQOmtrBCoRGdvTfeuFDYXB5W2m6MfLkjkvQa9lUSmIA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.0.0.tgz", + "integrity": "sha512-641nAmJS4k4iqpNUqfggqUBUMmlw0ZoM5VZKdQkV2e970Inn3Tk9kroCc1wpsYLD07vCwpys5iY0d3xI/9WkTg==", "dev": true, "requires": { "eventemitter-asyncresource": "^1.0.0", @@ -21415,18 +23373,63 @@ } }, "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", "dev": true, "requires": { - "find-up": "^4.0.0" + "find-up": "^6.3.0" + }, + "dependencies": { + "find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "requires": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + } + }, + "locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "requires": { + "p-locate": "^6.0.0" + } + }, + "p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "requires": { + "yocto-queue": "^1.0.0" + } + }, + "p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "requires": { + "p-limit": "^4.0.0" + } + }, + "path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true + } } }, "postcss": { - "version": "8.4.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", - "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "dev": true, "requires": { "nanoid": "^3.3.6", @@ -21435,14 +23438,13 @@ } }, "postcss-loader": { - "version": "7.2.4", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.2.4.tgz", - "integrity": "sha512-F88rpxxNspo5hatIc+orYwZDtHFaVFOSIVAx+fBfJC1GmhWbVmPWtmg2gXKE1OxJbneOSGn8PWdIwsZFcruS+w==", + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.3.tgz", + "integrity": "sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA==", "dev": true, "requires": { - "cosmiconfig": "^8.1.3", - "cosmiconfig-typescript-loader": "^4.3.0", - "klona": "^2.0.6", + "cosmiconfig": "^8.2.0", + "jiti": "^1.18.2", "semver": "^7.3.8" } }, @@ -21454,9 +23456,9 @@ "requires": {} }, "postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", + "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", "dev": true, "requires": { "icss-utils": "^5.0.0", @@ -21483,9 +23485,9 @@ } }, "postcss-selector-parser": { - "version": "6.0.12", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.12.tgz", - "integrity": "sha512-NdxGCAZdRrwVI1sy59+Wzrh+pMMHxapGnpfenDVlMEXoOcvt4pGE0JLK9YY2F5dLxcFYA/YbVQKhcGU+FtSYQg==", + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", "dev": true, "requires": { "cssesc": "^3.0.0", @@ -21651,6 +23653,12 @@ "dev": true, "optional": true }, + "psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -21672,6 +23680,12 @@ "side-channel": "^1.0.4" } }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -21706,9 +23720,9 @@ } }, "read-package-json": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.3.tgz", - "integrity": "sha512-4QbpReW4kxFgeBQ0vPAqh2y8sXEB3D4t3jsXbJKIhBiF80KT6XRo45reqwtftju5J6ru1ax06A2Gb/wM1qCOEQ==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.4.tgz", + "integrity": "sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==", "dev": true, "requires": { "glob": "^10.2.2", @@ -21717,33 +23731,11 @@ "npm-normalize-package-bin": "^3.0.0" }, "dependencies": { - "glob": { - "version": "10.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.3.tgz", - "integrity": "sha512-Kb4rfmBVE3eQTAimgmeqc2LwSnN0wIOkkUL6HmxEFxNJ4fHghYHVbFba/HcGcRjE6s9KoMNK3rSOwkL4PioZjg==", - "dev": true, - "requires": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", - "minimatch": "^9.0.0", - "minipass": "^5.0.0", - "path-scurry": "^1.7.0" - } - }, "json-parse-even-better-errors": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", "dev": true - }, - "minimatch": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.0.tgz", - "integrity": "sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } } } }, @@ -21807,9 +23799,9 @@ "dev": true }, "regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", "dev": true, "requires": { "regenerate": "^1.4.2" @@ -21822,9 +23814,9 @@ "dev": true }, "regenerator-transform": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", - "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", "dev": true, "requires": { "@babel/runtime": "^7.8.4" @@ -22018,9 +24010,9 @@ } }, "rollup": { - "version": "3.21.6", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.21.6.tgz", - "integrity": "sha512-SXIICxvxQxR3D4dp/3LDHZIJPC8a4anKMHd4E3Jiz2/JnY+2bEjqrOokAauc5ShGVNFHlEFjBXAXlaxkJqIqSg==", + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", "dev": true, "requires": { "fsevents": "~2.3.2" @@ -22081,9 +24073,9 @@ "integrity": "sha512-LRneZZRXNgjzwG4bDQdOTSbze3fHm1EAKN/8bePxnlEZiBmkYEDggaHbuvHI9/hoqHbGfsEA7tWS9GhYHZBBsw==" }, "sass": { - "version": "1.62.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.62.1.tgz", - "integrity": "sha512-NHpxIzN29MXvWiuswfc1W3I0N8SXBd8UR26WntmDlRYf0bSADnwnOjsyMZ3lMezSlArD33Vs3YFhp7dWvL770A==", + "version": "1.64.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.64.1.tgz", + "integrity": "sha512-16rRACSOFEE8VN7SCgBu1MpYCyN7urj9At898tyzdXFhC+a+yOX5dXwAR7L8/IdPJ1NB8OYoXmD55DM30B2kEQ==", "dev": true, "requires": { "chokidar": ">=3.0.0 <4.0.0", @@ -22092,12 +24084,11 @@ } }, "sass-loader": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.2.2.tgz", - "integrity": "sha512-nrIdVAAte3B9icfBiGWvmMhT/D+eCDwnk+yA7VE/76dp/WkHX+i44Q/pfo71NYbwj0Ap+PGsn0ekOuU1WFJ2AA==", + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.2.tgz", + "integrity": "sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg==", "dev": true, "requires": { - "klona": "^2.0.6", "neo-async": "^2.6.2" } }, @@ -22108,6 +24099,15 @@ "dev": true, "optional": true }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "requires": { + "xmlchars": "^2.2.0" + } + }, "schema-utils": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", @@ -22127,11 +24127,12 @@ "dev": true }, "selfsigned": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", - "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", "dev": true, "requires": { + "@types/node-forge": "^1.3.0", "node-forge": "^1" } }, @@ -22365,16 +24366,35 @@ "dev": true }, "sigstore": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.4.0.tgz", - "integrity": "sha512-N7TRpSbFjY/TrFDg6yGAQSYBrQ5s6qmPiq4pD6fkv1LoyfMsLG0NwZWG2s5q+uttLHgyVyTa0Rogx2P78rN8kQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.9.0.tgz", + "integrity": "sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==", "dev": true, "requires": { - "@sigstore/protobuf-specs": "^0.1.0", - "make-fetch-happen": "^11.0.1", - "tuf-js": "^1.1.3" + "@sigstore/bundle": "^1.1.0", + "@sigstore/protobuf-specs": "^0.2.0", + "@sigstore/sign": "^1.0.0", + "@sigstore/tuf": "^1.0.3", + "make-fetch-happen": "^11.0.1" }, "dependencies": { + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true + }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, "lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", @@ -22405,15 +24425,23 @@ } }, "minipass-fetch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", - "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", + "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", "dev": true, "requires": { "encoding": "^0.1.13", - "minipass": "^5.0.0", + "minipass": "^7.0.3", "minipass-sized": "^1.0.3", "minizlib": "^2.1.2" + }, + "dependencies": { + "minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true + } } } } @@ -22577,9 +24605,9 @@ } }, "spdx-license-ids": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", "dev": true }, "spdy": { @@ -22616,12 +24644,20 @@ "dev": true }, "ssri": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.4.tgz", - "integrity": "sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ==", + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", + "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", "dev": true, "requires": { - "minipass": "^5.0.0" + "minipass": "^7.0.3" + }, + "dependencies": { + "minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true + } } }, "statuses": { @@ -22723,6 +24759,12 @@ "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", "dev": true }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, "tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -22730,9 +24772,9 @@ "dev": true }, "tar": { - "version": "6.1.14", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.14.tgz", - "integrity": "sha512-piERznXu0U7/pW7cdSn7hjqySIVTYT6F76icmFk7ptU7dDYlXTm5r9A6K04R2vU3olYgoKeo1Cg3eeu5nhftAw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", "dev": true, "requires": { "chownr": "^2.0.0", @@ -22772,13 +24814,13 @@ "dev": true }, "terser": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.1.tgz", - "integrity": "sha512-hVl35zClmpisy6oaoKALOpS0rDYLxRFLHhRuDlEGTKey9qHjS1w9GMORjuwIMt70Wan4lwsLYyWDVnWgF+KUEw==", + "version": "5.19.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", + "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", "dev": true, "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" } @@ -22928,34 +24970,41 @@ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true }, + "tough-cookie": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "dev": true, + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "dependencies": { + "universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true + } + } + }, + "tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } + }, "tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true }, - "ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "peer": true, - "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - } - }, "tsconfig-paths": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.1.2.tgz", @@ -23030,21 +25079,38 @@ } }, "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==" }, "tuf-js": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.6.tgz", - "integrity": "sha512-CXwFVIsXGbVY4vFiWF7TJKWmlKJAT8TWkH4RmiohJRcDJInix++F0dznDmoVbtJNzZ8yLprKUG4YrDIhv3nBMg==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.7.tgz", + "integrity": "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==", "dev": true, "requires": { "@tufjs/models": "1.0.4", "debug": "^4.3.4", - "make-fetch-happen": "^11.1.0" + "make-fetch-happen": "^11.1.1" }, "dependencies": { + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true + }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, "lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", @@ -23075,15 +25141,23 @@ } }, "minipass-fetch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", - "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", + "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", "dev": true, "requires": { "encoding": "^0.1.13", - "minipass": "^5.0.0", + "minipass": "^7.0.3", "minipass-sized": "^1.0.3", "minizlib": "^2.1.2" + }, + "dependencies": { + "minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true + } } } } @@ -23188,9 +25262,9 @@ "dev": true }, "update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "dev": true, "requires": { "escalade": "^3.1.1", @@ -23206,6 +25280,16 @@ "punycode": "^2.1.0" } }, + "url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -23224,13 +25308,6 @@ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true }, - "v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true, - "peer": true - }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -23257,15 +25334,15 @@ "dev": true }, "vite": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.1.tgz", - "integrity": "sha512-EPmfPLAI79Z/RofuMvkIS0Yr091T2ReUoXQqc5ppBX/sjFRhHKiPPF/R46cTdoci/XgeQpB23diiJxq5w30vdg==", + "version": "4.4.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.7.tgz", + "integrity": "sha512-6pYf9QJ1mHylfVh39HpuSfMPojPSKVxZvnclX1K1FyZ1PXDOcLBibdq5t1qxJSnL63ca8Wf4zts6mD8u8oc9Fw==", "dev": true, "requires": { - "esbuild": "^0.17.5", + "esbuild": "^0.18.10", "fsevents": "~2.3.2", - "postcss": "^8.4.21", - "rollup": "^3.20.2" + "postcss": "^8.4.26", + "rollup": "^3.25.2" } }, "void-elements": { @@ -23274,11 +25351,29 @@ "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", "dev": true }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, "w3c-keyname": { "version": "2.2.6", "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.6.tgz", "integrity": "sha512-f+fciywl1SJEniZHD6H+kUO8gOnwIr7f4ijKA6+ZvJFjeGi1r4PDLl53Ayud9O/rk64RqgoQine0feoeOU0kXg==" }, + "w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "requires": { + "xml-name-validator": "^3.0.0" + } + }, "watchpack": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", @@ -23324,10 +25419,16 @@ "defaults": "^1.0.3" } }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true + }, "webpack": { - "version": "5.80.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.80.0.tgz", - "integrity": "sha512-OIMiq37XK1rWO8mH9ssfFKZsXg4n6klTEDL7S8/HqbAOBBaiy8ABvXvz0dDCXeEF9gqwxSvVk611zFPjS8hJxA==", + "version": "5.88.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", + "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.3", @@ -23336,10 +25437,10 @@ "@webassemblyjs/wasm-edit": "^1.11.5", "@webassemblyjs/wasm-parser": "^1.11.5", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", + "acorn-import-assertions": "^1.9.0", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.13.0", + "enhanced-resolve": "^5.15.0", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -23349,7 +25450,7 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.2", + "schema-utils": "^3.2.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.7", "watchpack": "^2.4.0", @@ -23376,9 +25477,9 @@ "requires": {} }, "enhanced-resolve": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.0.tgz", - "integrity": "sha512-+DCows0XNwLDcUhbFJPdlQEVnT2zXlCv7hPxemTz86/O+B/hCQ+mb7ydkPKiflpVraqLPCAfu7lDy+hBXueojw==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", "dev": true, "requires": { "graceful-fs": "^4.2.4", @@ -23392,9 +25493,9 @@ "dev": true }, "schema-utils": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", - "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "requires": { "@types/json-schema": "^7.0.8", @@ -23405,9 +25506,9 @@ } }, "webpack-dev-middleware": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.0.2.tgz", - "integrity": "sha512-iOddiJzPcQC6lwOIu60vscbGWth8PCRcWRCwoQcTQf9RMoOWBHg5EyzpGdtSmGMrSPd5vHEfFXmVErQEmkRngQ==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.1.tgz", + "integrity": "sha512-y51HrHaFeeWir0YO4f0g+9GwZawuigzcAdRNon6jErXy/SqV/+O6eaVAzDqE6t3e3NpGeR5CS+cCDaTC+V3yEQ==", "dev": true, "requires": { "colorette": "^2.0.10", @@ -23418,9 +25519,9 @@ } }, "webpack-dev-server": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.13.2.tgz", - "integrity": "sha512-5i6TrGBRxG4vnfDpB6qSQGfnB6skGBXNL5/542w2uRGLimX6qeE5BQMLrzIC3JYV/xlGOv+s+hTleI9AZKUQNw==", + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", + "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", "dev": true, "requires": { "@types/bonjour": "^3.5.9", @@ -23429,7 +25530,7 @@ "@types/serve-index": "^1.9.1", "@types/serve-static": "^1.13.10", "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.1", + "@types/ws": "^8.5.5", "ansi-html-community": "^0.0.8", "bonjour-service": "^1.0.11", "chokidar": "^3.5.3", @@ -23469,18 +25570,18 @@ } }, "ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "version": "8.14.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", + "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", "dev": true, "requires": {} } } }, "webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz", + "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", "dev": true, "requires": { "clone-deep": "^4.0.1", @@ -23519,6 +25620,32 @@ "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "dev": true }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "requires": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + } + }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -23538,9 +25665,9 @@ } }, "wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "dev": true }, "wordwrap": { @@ -23636,6 +25763,18 @@ "dev": true, "requires": {} }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -23682,12 +25821,11 @@ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "peer": true + "yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true }, "zone.js": { "version": "0.13.0", diff --git a/package.json b/package.json index 795b82de..987ed15b 100644 --- a/package.json +++ b/package.json @@ -16,16 +16,16 @@ }, "private": true, "dependencies": { - "@angular/animations": "^16.0.1", + "@angular/animations": "^16.2.0", "@angular/cdk": "^16.0.0", - "@angular/common": "^16.0.1", - "@angular/compiler": "^16.0.1", - "@angular/core": "^16.0.1", - "@angular/forms": "^16.0.1", + "@angular/common": "^16.2.0", + "@angular/compiler": "^16.2.0", + "@angular/core": "^16.2.0", + "@angular/forms": "^16.2.0", "@angular/material": "^16.0.0", - "@angular/platform-browser": "^16.0.1", - "@angular/platform-browser-dynamic": "^16.0.1", - "@angular/router": "^16.0.1", + "@angular/platform-browser": "^16.2.0", + "@angular/platform-browser-dynamic": "^16.2.0", + "@angular/router": "^16.2.0", "@ngx-translate/core": "^14.0.0", "@ngx-translate/http-loader": "^7.0.0", "angular-auth-oidc-client": "^14.1.5", @@ -39,9 +39,9 @@ "zone.js": "~0.13.0" }, "devDependencies": { - "@angular-devkit/build-angular": "^16.0.0", - "@angular/cli": "~16.0.0", - "@angular/compiler-cli": "^16.0.1", + "@angular-devkit/build-angular": "^16.2.0", + "@angular/cli": "~16.2.0", + "@angular/compiler-cli": "^16.2.0", "@types/jasmine": "~4.0.0", "dependency-cruiser": "^12.10.1", "jasmine-core": "~4.3.0", @@ -52,4 +52,4 @@ "karma-jasmine-html-reporter": "~2.0.0", "typescript": "~4.9.3" } -} +} \ No newline at end of file diff --git a/src/app/shared/components/list/list.component.html b/src/app/shared/components/list/list.component.html index 23cb6b85..34c40c0d 100644 --- a/src/app/shared/components/list/list.component.html +++ b/src/app/shared/components/list/list.component.html @@ -1,7 +1,7 @@
+ inputs: {model: item, loading: loading}; ">
diff --git a/src/app/shared/components/list/list.component.scss b/src/app/shared/components/list/list.component.scss index 3e3629fe..d8b4c71e 100644 --- a/src/app/shared/components/list/list.component.scss +++ b/src/app/shared/components/list/list.component.scss @@ -5,10 +5,5 @@ .gcc-list-item { padding-bottom: 40px; } - - > div:not(.gcc-list-item) { - font-size: 18px; - font-weight: 600; - } } } \ No newline at end of file diff --git a/src/app/shared/components/list/list.component.ts b/src/app/shared/components/list/list.component.ts index bdae4077..9e2ff5a2 100644 --- a/src/app/shared/components/list/list.component.ts +++ b/src/app/shared/components/list/list.component.ts @@ -1,4 +1,4 @@ -import { Component, Injector, Input, OnInit } from '@angular/core'; +import { Component, Input, OnInit } from '@angular/core'; import { NgComponentOutlet } from '@angular/common'; import { IListService } from 'src/app/core/interfaces/list-service.interface'; @@ -16,15 +16,11 @@ export class ListComponent implements OnInit { loading: boolean = true; - injector!: Injector; - - constructor(public injec: Injector) { + constructor() { } ngOnInit(): void { - this.injector = Injector.create({providers: [{provide: this.service.cardComponent, deps: []}], parent: this.injec}); - if (this.items.length === 0) { this.service.getMany(10, 5000).subscribe((items: typeof this.service.dataType[]) => { this.items = items; From 9dfc7dba61855965fd6fc1bc0f06b55456024cf9 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Thu, 23 Nov 2023 12:38:03 -0500 Subject: [PATCH 091/165] basic list features done. --- src/app/features/home/home.component.html | 2 -- src/app/shared/components/list/list.component.html | 5 +++-- src/app/shared/components/list/list.component.scss | 5 +---- src/app/shared/components/list/list.component.ts | 5 ++++- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/app/features/home/home.component.html b/src/app/features/home/home.component.html index 63ac4431..71793468 100644 --- a/src/app/features/home/home.component.html +++ b/src/app/features/home/home.component.html @@ -24,8 +24,6 @@ - - diff --git a/src/app/shared/components/list/list.component.html b/src/app/shared/components/list/list.component.html index 34c40c0d..f9ca32f5 100644 --- a/src/app/shared/components/list/list.component.html +++ b/src/app/shared/components/list/list.component.html @@ -1,7 +1,8 @@ -
+
+ inputs: {model: item, loading: loading};">
diff --git a/src/app/shared/components/list/list.component.scss b/src/app/shared/components/list/list.component.scss index d8b4c71e..4ae49087 100644 --- a/src/app/shared/components/list/list.component.scss +++ b/src/app/shared/components/list/list.component.scss @@ -1,9 +1,6 @@ :host { .gcc-list-container { + display: flex; overflow: visible; - - .gcc-list-item { - padding-bottom: 40px; - } } } \ No newline at end of file diff --git a/src/app/shared/components/list/list.component.ts b/src/app/shared/components/list/list.component.ts index 9e2ff5a2..48f3a01e 100644 --- a/src/app/shared/components/list/list.component.ts +++ b/src/app/shared/components/list/list.component.ts @@ -11,10 +11,13 @@ export class ListComponent implements OnInit { @Input({required:true}) service!: IListService; @Input() items: typeof this.service.dataType[] = []; - @Input() cardSize: CardSize | string = CardSize.Small; + @Input() cardSize: CardSize | string = CardSize.Small; // TODO: Card size on all card components. Make a base component or interface that gets implemented. @Input() orientation: Orientation | string = Orientation.Vertical; + @Input() loadItems: number = 3; + @Input() gap: number = 40; loading: boolean = true; + Orientations = Orientation; constructor() { From f44e9c31433c578f6933d74e607874b5cc6d473a Mon Sep 17 00:00:00 2001 From: doug0102 Date: Thu, 23 Nov 2023 13:39:19 -0500 Subject: [PATCH 092/165] fix test --- src/app/shared/components/list/list.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/shared/components/list/list.component.ts b/src/app/shared/components/list/list.component.ts index 48f3a01e..a7787dbf 100644 --- a/src/app/shared/components/list/list.component.ts +++ b/src/app/shared/components/list/list.component.ts @@ -25,7 +25,7 @@ export class ListComponent implements OnInit { ngOnInit(): void { if (this.items.length === 0) { - this.service.getMany(10, 5000).subscribe((items: typeof this.service.dataType[]) => { + this.service?.getMany(10, 5000).subscribe((items: typeof this.service.dataType[]) => { this.items = items; this.loading = false; }); From afc9b196b791ef08e42612199be38cc6db4382dd Mon Sep 17 00:00:00 2001 From: Shea Date: Thu, 23 Nov 2023 18:40:20 +0000 Subject: [PATCH 093/165] Dependency Graph ignore-deploy --- dependency-graph.svg | 4699 +++++++++++++++++++++--------------------- 1 file changed, 2389 insertions(+), 2310 deletions(-) diff --git a/dependency-graph.svg b/dependency-graph.svg index 47ea95fe..afd6950b 100644 --- a/dependency-graph.svg +++ b/dependency-graph.svg @@ -4,427 +4,437 @@ - - + + dependency-cruiser output - + cluster_src - -src + +src cluster_src/app - -app + +app cluster_src/app/core - -core + +core cluster_src/app/core/auth - -auth + +auth cluster_src/app/core/constants - -constants + +constants cluster_src/app/core/guards - -guards + +guards cluster_src/app/core/helpers - -helpers + +helpers cluster_src/app/core/interceptors - -interceptors + +interceptors -cluster_src/app/core/models - -models +cluster_src/app/core/interfaces + +interfaces -cluster_src/app/core/services - -services +cluster_src/app/core/models + +models -cluster_src/app/features - -features +cluster_src/app/core/services + +services -cluster_src/app/features/about - -about +cluster_src/app/features + +features -cluster_src/app/features/blog - -blog +cluster_src/app/features/about + +about -cluster_src/app/features/bookmarks - -bookmarks +cluster_src/app/features/blog + +blog -cluster_src/app/features/dashboard - -dashboard +cluster_src/app/features/bookmarks + +bookmarks -cluster_src/app/features/events - -events +cluster_src/app/features/dashboard + +dashboard -cluster_src/app/features/events/components - -components +cluster_src/app/features/events + +events -cluster_src/app/features/events/components/event-card - -event-card +cluster_src/app/features/events/components + +components -cluster_src/app/features/events/components/event-list - -event-list +cluster_src/app/features/events/components/event-card + +event-card -cluster_src/app/features/events/components/event - -event +cluster_src/app/features/events/components/event-list + +event-list -cluster_src/app/features/events/models - -models +cluster_src/app/features/events/components/event + +event -cluster_src/app/features/events/resolvers - -resolvers +cluster_src/app/features/events/models + +models -cluster_src/app/features/friends - -friends +cluster_src/app/features/events/resolvers + +resolvers -cluster_src/app/features/groups - -groups +cluster_src/app/features/friends + +friends -cluster_src/app/features/groups/components - -components +cluster_src/app/features/groups + +groups -cluster_src/app/features/groups/components/group-card - -group-card +cluster_src/app/features/groups/components + +components -cluster_src/app/features/groups/components/group-list - -group-list +cluster_src/app/features/groups/components/group-card + +group-card -cluster_src/app/features/groups/components/group - -group +cluster_src/app/features/groups/components/group-list + +group-list -cluster_src/app/features/groups/models - -models +cluster_src/app/features/groups/components/group + +group -cluster_src/app/features/home - -home +cluster_src/app/features/groups/models + +models -cluster_src/app/features/invite - -invite +cluster_src/app/features/home + +home -cluster_src/app/features/login - -login +cluster_src/app/features/invite + +invite -cluster_src/app/features/members - -members +cluster_src/app/features/login + +login -cluster_src/app/features/messages - -messages +cluster_src/app/features/members + +members -cluster_src/app/features/missions - -missions +cluster_src/app/features/messages + +messages -cluster_src/app/features/news-feed - -news-feed +cluster_src/app/features/missions + +missions -cluster_src/app/features/news-feed/components - -components +cluster_src/app/features/news-feed + +news-feed -cluster_src/app/features/news-feed/components/news-card - -news-card +cluster_src/app/features/news-feed/components + +components -cluster_src/app/features/news-feed/components/news-list - -news-list +cluster_src/app/features/news-feed/components/news-card + +news-card -cluster_src/app/features/news-feed/models - -models +cluster_src/app/features/news-feed/components/news-list + +news-list -cluster_src/app/features/privacy - -privacy +cluster_src/app/features/news-feed/models + +models -cluster_src/app/features/profile - -profile +cluster_src/app/features/privacy + +privacy -cluster_src/app/features/profile/components - -components +cluster_src/app/features/profile + +profile -cluster_src/app/features/profile/components/post - -post +cluster_src/app/features/profile/components + +components -cluster_src/app/features/profile/components/profile-card - -profile-card +cluster_src/app/features/profile/components/post + +post -cluster_src/app/features/profile/components/profile-list - -profile-list +cluster_src/app/features/profile/components/profile-card + +profile-card -cluster_src/app/features/register - -register +cluster_src/app/features/profile/components/profile-list + +profile-list -cluster_src/app/features/search - -search +cluster_src/app/features/register + +register -cluster_src/app/features/settings - -settings +cluster_src/app/features/search + +search -cluster_src/app/features/splash - -splash +cluster_src/app/features/settings + +settings -cluster_src/app/features/stats - -stats +cluster_src/app/features/splash + +splash -cluster_src/app/features/terms - -terms +cluster_src/app/features/stats + +stats -cluster_src/app/features/the-wire - -the-wire +cluster_src/app/features/terms + +terms -cluster_src/app/shared - -shared +cluster_src/app/features/the-wire + +the-wire -cluster_src/app/shared/components - -components +cluster_src/app/shared + +shared -cluster_src/app/shared/components/banner - -banner +cluster_src/app/shared/components + +components -cluster_src/app/shared/components/blog-form - -blog-form +cluster_src/app/shared/components/banner + +banner -cluster_src/app/shared/components/button - -button +cluster_src/app/shared/components/blog-form + +blog-form -cluster_src/app/shared/components/calendar-button - -calendar-button +cluster_src/app/shared/components/button + +button -cluster_src/app/shared/components/editor - -editor +cluster_src/app/shared/components/calendar-button + +calendar-button -cluster_src/app/shared/components/editor/menu - -menu +cluster_src/app/shared/components/editor + +editor -cluster_src/app/shared/components/editor/menu/editor-menu - -editor-menu +cluster_src/app/shared/components/editor/menu + +menu -cluster_src/app/shared/components/event-form - -event-form +cluster_src/app/shared/components/editor/menu/editor-menu + +editor-menu -cluster_src/app/shared/components/file-select - -file-select +cluster_src/app/shared/components/event-form + +event-form -cluster_src/app/shared/components/footer - -footer +cluster_src/app/shared/components/file-select + +file-select -cluster_src/app/shared/components/forbidden - -forbidden +cluster_src/app/shared/components/footer + +footer -cluster_src/app/shared/components/header - -header +cluster_src/app/shared/components/forbidden + +forbidden -cluster_src/app/shared/components/input - -input +cluster_src/app/shared/components/header + +header -cluster_src/app/shared/components/language-selector - -language-selector +cluster_src/app/shared/components/input + +input -cluster_src/app/shared/components/not-found - -not-found +cluster_src/app/shared/components/language-selector + +language-selector -cluster_src/app/shared/components/page-title - -page-title +cluster_src/app/shared/components/list + +list -cluster_src/app/shared/components/poll-form - -poll-form +cluster_src/app/shared/components/not-found + +not-found -cluster_src/app/shared/components/post-form - -post-form +cluster_src/app/shared/components/page-title + +page-title -cluster_src/app/shared/components/profile-pic - -profile-pic +cluster_src/app/shared/components/poll-form + +poll-form -cluster_src/app/shared/components/unauthorized - -unauthorized +cluster_src/app/shared/components/post-form + +post-form -cluster_src/app/shared/factories - -factories +cluster_src/app/shared/components/profile-pic + +profile-pic -cluster_src/app/shared/models - -models +cluster_src/app/shared/components/unauthorized + +unauthorized -cluster_src/app/shared/pipes - -pipes +cluster_src/app/shared/factories + +factories -cluster_src/app/shared/pipes/form-control - -form-control +cluster_src/app/shared/models + +models -cluster_src/app/shared/pipes/form-group - -form-group +cluster_src/app/shared/pipes + +pipes -cluster_src/app/shared/pipes/truncate-file-name - -truncate-file-name +cluster_src/app/shared/pipes/form-control + +form-control -cluster_src/assets - -assets +cluster_src/app/shared/pipes/form-group + +form-group -cluster_src/assets/i18n - -i18n +cluster_src/app/shared/pipes/truncate-file-name + +truncate-file-name +cluster_src/assets + +assets + + +cluster_src/assets/i18n + +i18n + + cluster_src/environments environments @@ -433,8 +443,8 @@ src/app/app-routing.module.ts - -app-routing.module.ts + +app-routing.module.ts @@ -442,542 +452,542 @@ src/app/core/constants/routes.constants.ts - -routes.constants.ts + +routes.constants.ts src/app/app-routing.module.ts->src/app/core/constants/routes.constants.ts - - + + src/app/core/guards/auth.guard.ts - -auth.guard.ts + +auth.guard.ts src/app/app-routing.module.ts->src/app/core/guards/auth.guard.ts - - + + src/app/core/guards/interceptor.guard.ts - -interceptor.guard.ts + +interceptor.guard.ts src/app/app-routing.module.ts->src/app/core/guards/interceptor.guard.ts - - + + src/app/core/guards/login.guard.ts - -login.guard.ts + +login.guard.ts src/app/app-routing.module.ts->src/app/core/guards/login.guard.ts - - + + src/app/core/guards/redirect.guard.ts - -redirect.guard.ts + +redirect.guard.ts src/app/app-routing.module.ts->src/app/core/guards/redirect.guard.ts - - + + src/app/core/services/translations.service.ts - -translations.service.ts + +translations.service.ts src/app/app-routing.module.ts->src/app/core/services/translations.service.ts - - + + src/app/features/about/about.module.ts - -about.module.ts + +about.module.ts src/app/app-routing.module.ts->src/app/features/about/about.module.ts - - - - + + + + src/app/features/blog/blog.module.ts - -blog.module.ts + +blog.module.ts src/app/app-routing.module.ts->src/app/features/blog/blog.module.ts - - - - + + + + src/app/features/bookmarks/bookmarks.module.ts - -bookmarks.module.ts + +bookmarks.module.ts src/app/app-routing.module.ts->src/app/features/bookmarks/bookmarks.module.ts - - - - + + + + src/app/features/dashboard/dashboard.module.ts - -dashboard.module.ts + +dashboard.module.ts src/app/app-routing.module.ts->src/app/features/dashboard/dashboard.module.ts - - - - + + + + src/app/features/events/events.module.ts - -events.module.ts + +events.module.ts src/app/app-routing.module.ts->src/app/features/events/events.module.ts - - - - + + + + src/app/features/friends/friends.module.ts - -friends.module.ts + +friends.module.ts src/app/app-routing.module.ts->src/app/features/friends/friends.module.ts - - - - + + + + src/app/features/groups/groups.module.ts - -groups.module.ts + +groups.module.ts src/app/app-routing.module.ts->src/app/features/groups/groups.module.ts - - - - + + + + src/app/features/home/home.module.ts - -home.module.ts + +home.module.ts src/app/app-routing.module.ts->src/app/features/home/home.module.ts - - - - + + + + src/app/features/invite/invite.module.ts - -invite.module.ts + +invite.module.ts src/app/app-routing.module.ts->src/app/features/invite/invite.module.ts - - - - + + + + src/app/features/login/login.module.ts - -login.module.ts + +login.module.ts src/app/app-routing.module.ts->src/app/features/login/login.module.ts - - - - + + + + src/app/features/members/members.module.ts - -members.module.ts + +members.module.ts src/app/app-routing.module.ts->src/app/features/members/members.module.ts - - - - + + + + src/app/features/messages/messages.module.ts - -messages.module.ts + +messages.module.ts src/app/app-routing.module.ts->src/app/features/messages/messages.module.ts - - - - + + + + src/app/features/missions/missions.module.ts - -missions.module.ts + +missions.module.ts src/app/app-routing.module.ts->src/app/features/missions/missions.module.ts - - - - + + + + src/app/features/news-feed/news-feed.module.ts - -news-feed.module.ts + +news-feed.module.ts src/app/app-routing.module.ts->src/app/features/news-feed/news-feed.module.ts - - - - + + + + src/app/features/privacy/privacy.module.ts - -privacy.module.ts + +privacy.module.ts src/app/app-routing.module.ts->src/app/features/privacy/privacy.module.ts - - - - + + + + src/app/features/profile/profile.module.ts - -profile.module.ts + +profile.module.ts src/app/app-routing.module.ts->src/app/features/profile/profile.module.ts - - - - + + + + src/app/features/register/register.module.ts - -register.module.ts + +register.module.ts src/app/app-routing.module.ts->src/app/features/register/register.module.ts - - - - + + + + src/app/features/search/search.module.ts - -search.module.ts + +search.module.ts src/app/app-routing.module.ts->src/app/features/search/search.module.ts - - - - + + + + src/app/features/settings/settings.module.ts - -settings.module.ts + +settings.module.ts src/app/app-routing.module.ts->src/app/features/settings/settings.module.ts - - - - + + + + src/app/features/splash/splash.module.ts - -splash.module.ts + +splash.module.ts src/app/app-routing.module.ts->src/app/features/splash/splash.module.ts - - - - + + + + src/app/features/stats/stats.module.ts - -stats.module.ts + +stats.module.ts src/app/app-routing.module.ts->src/app/features/stats/stats.module.ts - - - - + + + + src/app/features/terms/terms.module.ts - -terms.module.ts + +terms.module.ts src/app/app-routing.module.ts->src/app/features/terms/terms.module.ts - - - - + + + + src/app/features/the-wire/the-wire.module.ts - -the-wire.module.ts + +the-wire.module.ts src/app/app-routing.module.ts->src/app/features/the-wire/the-wire.module.ts - - - - + + + + src/app/shared/components/forbidden/forbidden.component.ts - -forbidden.component.ts + +forbidden.component.ts src/app/app-routing.module.ts->src/app/shared/components/forbidden/forbidden.component.ts - - + + src/app/shared/components/not-found/not-found.component.ts - -not-found.component.ts + +not-found.component.ts src/app/app-routing.module.ts->src/app/shared/components/not-found/not-found.component.ts - - + + src/app/shared/components/unauthorized/unauthorized.component.ts - -unauthorized.component.ts + +unauthorized.component.ts src/app/app-routing.module.ts->src/app/shared/components/unauthorized/unauthorized.component.ts - - + + src/app/core/services/session-storage.service.ts - -session-storage.service.ts + +session-storage.service.ts src/app/core/guards/auth.guard.ts->src/app/core/services/session-storage.service.ts - - + + @@ -991,891 +1001,891 @@ src/app/core/guards/auth.guard.ts->src/environments/environment.ts - - + + src/app/core/guards/interceptor.guard.ts->src/app/core/services/session-storage.service.ts - - + + - + src/assets/i18n/translations.en.ts - - -translations.en.ts + + +translations.en.ts - + src/app/core/services/translations.service.ts->src/assets/i18n/translations.en.ts - - + + src/app/shared/shared.module.ts - -shared.module.ts + +shared.module.ts - + src/app/features/about/about.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/about/about-routing.module.ts - - -about-routing.module.ts + + +about-routing.module.ts - + src/app/features/about/about.module.ts->src/app/features/about/about-routing.module.ts - - + + - + src/app/features/about/about.component.ts - - -about.component.ts + + +about.component.ts - + src/app/features/about/about.module.ts->src/app/features/about/about.component.ts - - + + - + src/app/features/blog/blog.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/blog/blog-routing.module.ts - - -blog-routing.module.ts + + +blog-routing.module.ts - + src/app/features/blog/blog.module.ts->src/app/features/blog/blog-routing.module.ts - - + + - + src/app/features/bookmarks/bookmarks.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/bookmarks/bookmarks-routing.module.ts - - -bookmarks-routing.module.ts + + +bookmarks-routing.module.ts - + src/app/features/bookmarks/bookmarks.module.ts->src/app/features/bookmarks/bookmarks-routing.module.ts - - + + - + src/app/features/dashboard/dashboard.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/dashboard/dashboard-routing.module.ts - - -dashboard-routing.module.ts + + +dashboard-routing.module.ts - + src/app/features/dashboard/dashboard.module.ts->src/app/features/dashboard/dashboard-routing.module.ts - - + + - + src/app/features/events/events.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/events/components/event-card/event-card.component.ts - - -event-card.component.ts + + +event-card.component.ts - + src/app/features/events/events.module.ts->src/app/features/events/components/event-card/event-card.component.ts - - + + - + src/app/features/events/components/event-list/event-list.component.ts - - -event-list.component.ts + + +event-list.component.ts - + src/app/features/events/events.module.ts->src/app/features/events/components/event-list/event-list.component.ts - - + + - + src/app/features/events/components/event/event.component.ts - - -event.component.ts + + +event.component.ts - + src/app/features/events/events.module.ts->src/app/features/events/components/event/event.component.ts - - + + - + src/app/features/events/events-routing.module.ts - - -events-routing.module.ts + + +events-routing.module.ts - + src/app/features/events/events.module.ts->src/app/features/events/events-routing.module.ts - - + + - + src/app/features/friends/friends.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/friends/friends-routing.module.ts - - -friends-routing.module.ts + + +friends-routing.module.ts - + src/app/features/friends/friends.module.ts->src/app/features/friends/friends-routing.module.ts - - + + - + src/app/features/groups/groups.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/groups/components/group-card/group-card.component.ts - - -group-card.component.ts + + +group-card.component.ts - + src/app/features/groups/groups.module.ts->src/app/features/groups/components/group-card/group-card.component.ts - - + + - + src/app/features/groups/components/group-list/group-list.component.ts - - -group-list.component.ts + + +group-list.component.ts - + src/app/features/groups/groups.module.ts->src/app/features/groups/components/group-list/group-list.component.ts - - + + - + src/app/features/groups/components/group/group.component.ts - - -group.component.ts + + +group.component.ts - + src/app/features/groups/groups.module.ts->src/app/features/groups/components/group/group.component.ts - - + + - + src/app/features/groups/groups-routing.module.ts - - -groups-routing.module.ts + + +groups-routing.module.ts - + src/app/features/groups/groups.module.ts->src/app/features/groups/groups-routing.module.ts - - + + - + src/app/features/home/home.module.ts->src/app/features/events/events.module.ts - - - - + + + + - + src/app/features/home/home.module.ts->src/app/features/groups/groups.module.ts - - - - + + + + - + src/app/features/home/home.module.ts->src/app/features/news-feed/news-feed.module.ts - - - - + + + + - + src/app/features/home/home.module.ts->src/app/features/profile/profile.module.ts - - - - + + + + - + src/app/features/home/home.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/home/home-routing.module.ts - - -home-routing.module.ts + + +home-routing.module.ts - + src/app/features/home/home.module.ts->src/app/features/home/home-routing.module.ts - - + + - + src/app/features/home/home.component.ts - - -home.component.ts + + +home.component.ts - + src/app/features/home/home.module.ts->src/app/features/home/home.component.ts - - + + - + src/app/features/invite/invite.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/invite/invite-routing.module.ts - - -invite-routing.module.ts + + +invite-routing.module.ts - + src/app/features/invite/invite.module.ts->src/app/features/invite/invite-routing.module.ts - - + + - + src/app/features/login/login.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/login/login-routing.module.ts - - -login-routing.module.ts + + +login-routing.module.ts - + src/app/features/login/login.module.ts->src/app/features/login/login-routing.module.ts - - + + - + src/app/features/login/login.component.ts - - -login.component.ts + + +login.component.ts - + src/app/features/login/login.module.ts->src/app/features/login/login.component.ts - - + + - + src/app/features/members/members.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/members/members-routing.module.ts - - -members-routing.module.ts + + +members-routing.module.ts - + src/app/features/members/members.module.ts->src/app/features/members/members-routing.module.ts - - + + - + src/app/features/messages/messages.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/messages/messages-routing.module.ts - - -messages-routing.module.ts + + +messages-routing.module.ts - + src/app/features/messages/messages.module.ts->src/app/features/messages/messages-routing.module.ts - - + + - + src/app/features/missions/missions.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/missions/missions-routing.module.ts - - -missions-routing.module.ts + + +missions-routing.module.ts - + src/app/features/missions/missions.module.ts->src/app/features/missions/missions-routing.module.ts - - + + - + src/app/features/news-feed/news-feed.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/news-feed/components/news-card/news-card.component.ts - - -news-card.component.ts + + +news-card.component.ts - + src/app/features/news-feed/news-feed.module.ts->src/app/features/news-feed/components/news-card/news-card.component.ts - - + + src/app/features/news-feed/components/news-list/news-list.component.ts - -news-list.component.ts + +news-list.component.ts - + src/app/features/news-feed/news-feed.module.ts->src/app/features/news-feed/components/news-list/news-list.component.ts - - + + src/app/features/news-feed/news-feed-routing.module.ts - -news-feed-routing.module.ts + +news-feed-routing.module.ts - + src/app/features/news-feed/news-feed.module.ts->src/app/features/news-feed/news-feed-routing.module.ts - - + + - + src/app/features/privacy/privacy.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/privacy/privacy-routing.module.ts - -privacy-routing.module.ts + +privacy-routing.module.ts - + src/app/features/privacy/privacy.module.ts->src/app/features/privacy/privacy-routing.module.ts - - + + src/app/features/privacy/privacy.component.ts - -privacy.component.ts + +privacy.component.ts - + src/app/features/privacy/privacy.module.ts->src/app/features/privacy/privacy.component.ts - - + + - + src/app/features/profile/profile.module.ts->src/app/shared/shared.module.ts - - - - + + + + + + + +src/app/features/profile/components/profile-card/profile-card.component.ts + + +profile-card.component.ts + + + + + +src/app/features/profile/profile.module.ts->src/app/features/profile/components/profile-card/profile-card.component.ts + + src/app/features/profile/components/post/post.component.ts - -post.component.ts + +post.component.ts - + src/app/features/profile/profile.module.ts->src/app/features/profile/components/post/post.component.ts - - - - - -src/app/features/profile/components/profile-card/profile-card.component.ts - - -profile-card.component.ts - - - - - -src/app/features/profile/profile.module.ts->src/app/features/profile/components/profile-card/profile-card.component.ts - - + + - + src/app/features/profile/components/profile-list/profile-list.component.ts - - -profile-list.component.ts + + +profile-list.component.ts - + src/app/features/profile/profile.module.ts->src/app/features/profile/components/profile-list/profile-list.component.ts - - + + - + src/app/features/profile/profile-routing.module.ts - - -profile-routing.module.ts + + +profile-routing.module.ts - + src/app/features/profile/profile.module.ts->src/app/features/profile/profile-routing.module.ts - - + + - + src/app/features/register/register.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/register/register-routing.module.ts - - -register-routing.module.ts + + +register-routing.module.ts - + src/app/features/register/register.module.ts->src/app/features/register/register-routing.module.ts - - + + - + src/app/features/register/register.component.ts - - -register.component.ts + + +register.component.ts - + src/app/features/register/register.module.ts->src/app/features/register/register.component.ts - - + + - + src/app/features/search/search.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/search/search-routing.module.ts - - -search-routing.module.ts + + +search-routing.module.ts - + src/app/features/search/search.module.ts->src/app/features/search/search-routing.module.ts - - + + - + src/app/features/settings/settings.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/settings/settings-routing.module.ts - - -settings-routing.module.ts + + +settings-routing.module.ts - + src/app/features/settings/settings.module.ts->src/app/features/settings/settings-routing.module.ts - - + + - + src/app/features/splash/splash.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/splash/splash-routing.module.ts - - -splash-routing.module.ts + + +splash-routing.module.ts - + src/app/features/splash/splash.module.ts->src/app/features/splash/splash-routing.module.ts - - + + - + src/app/features/splash/splash.component.ts - - -splash.component.ts + + +splash.component.ts - + src/app/features/splash/splash.module.ts->src/app/features/splash/splash.component.ts - - + + - + src/app/features/stats/stats.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/stats/stats-routing.module.ts - - -stats-routing.module.ts + + +stats-routing.module.ts - + src/app/features/stats/stats.module.ts->src/app/features/stats/stats-routing.module.ts - - + + - + src/app/features/stats/stats.component.ts - - -stats.component.ts + + +stats.component.ts - + src/app/features/stats/stats.module.ts->src/app/features/stats/stats.component.ts - - + + - + src/app/features/terms/terms.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/terms/terms-routing.module.ts - - -terms-routing.module.ts + + +terms-routing.module.ts - + src/app/features/terms/terms.module.ts->src/app/features/terms/terms-routing.module.ts - - + + - + src/app/features/terms/terms.component.ts - - -terms.component.ts + + +terms.component.ts - + src/app/features/terms/terms.module.ts->src/app/features/terms/terms.component.ts - - + + - + src/app/features/the-wire/the-wire.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/the-wire/the-wire-routing.module.ts - - -the-wire-routing.module.ts + + +the-wire-routing.module.ts - + src/app/features/the-wire/the-wire.module.ts->src/app/features/the-wire/the-wire-routing.module.ts - - + + src/app/app.component.spec.ts - -app.component.spec.ts + +app.component.spec.ts @@ -1883,648 +1893,663 @@ src/app/app.component.ts - -app.component.ts + +app.component.ts src/app/app.component.spec.ts->src/app/app.component.ts - - + + src/app/core/auth/auth.module.ts - -auth.module.ts + +auth.module.ts src/app/app.component.spec.ts->src/app/core/auth/auth.module.ts - - + + src/app/core/helpers/typescript-loader.ts - -typescript-loader.ts + +typescript-loader.ts src/app/app.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/app.component.ts->src/app/core/constants/routes.constants.ts - - + + src/app/app.component.ts->src/app/core/services/translations.service.ts - - + + src/app/core/services/language-storage.service.ts - -language-storage.service.ts + +language-storage.service.ts src/app/app.component.ts->src/app/core/services/language-storage.service.ts - - + + src/app/core/auth/auth.module.ts->src/app/core/services/session-storage.service.ts - - + + src/app/core/auth/auth.module.ts->src/environments/environment.ts - - + + - + src/app/core/services/local-storage-ref.service.ts - - -local-storage-ref.service.ts + + +local-storage-ref.service.ts - + src/app/core/services/language-storage.service.ts->src/app/core/services/local-storage-ref.service.ts - - + + src/app/app.module.ts - -app.module.ts + +app.module.ts src/app/app.module.ts->src/app/app-routing.module.ts - - - - + + + + src/app/app.module.ts->src/app/app.component.ts - - + + src/app/app.module.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/core/core.module.ts - -core.module.ts + +core.module.ts src/app/app.module.ts->src/app/core/core.module.ts - - - - + + + + src/app/core/services/title.service.ts - -title.service.ts + +title.service.ts src/app/app.module.ts->src/app/core/services/title.service.ts - - + + src/app/features/events/events.component.ts - -events.component.ts + +events.component.ts src/app/app.module.ts->src/app/features/events/events.component.ts - - + + src/app/features/groups/groups.component.ts - -groups.component.ts + +groups.component.ts src/app/app.module.ts->src/app/features/groups/groups.component.ts - - + + src/app/app.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/core/core.module.ts->src/app/core/auth/auth.module.ts - - + + src/app/core/core.module.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/core/core.module.ts->src/app/app.module.ts - - - - + + + + - + src/app/shared/shared.module.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/shared.module.ts->src/app/shared/components/forbidden/forbidden.component.ts - - + + - + src/app/shared/shared.module.ts->src/app/shared/components/not-found/not-found.component.ts - - + + - + src/app/shared/shared.module.ts->src/app/shared/components/unauthorized/unauthorized.component.ts - - + + - + src/app/shared/shared.module.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/shared.module.ts->src/app/app.module.ts - - - - + + + + - + src/app/shared/components/banner/banner.component.ts - - -banner.component.ts + + +banner.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/banner/banner.component.ts - - + + - + src/app/shared/pipes/form-control/form-control.pipe.ts - - -form-control.pipe.ts + + +form-control.pipe.ts - + src/app/shared/shared.module.ts->src/app/shared/pipes/form-control/form-control.pipe.ts - - + + - + src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.ts - - -truncate-file-name.pipe.ts + + +truncate-file-name.pipe.ts - + src/app/shared/shared.module.ts->src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.ts - - + + - + src/app/shared/components/blog-form/blog-form.component.ts - - -blog-form.component.ts + + +blog-form.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/blog-form/blog-form.component.ts - - + + - + src/app/shared/components/button/button.component.ts - - -button.component.ts + + +button.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/button/button.component.ts - - + + - + src/app/shared/components/calendar-button/calendar-button.component.ts - - -calendar-button.component.ts + + +calendar-button.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/calendar-button/calendar-button.component.ts - - + + - + src/app/shared/components/editor/editor.component.ts - - -editor.component.ts + + +editor.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/editor/editor.component.ts - - + + - + src/app/shared/factories/editor-config.factory.ts - - -editor-config.factory.ts + + +editor-config.factory.ts - + src/app/shared/shared.module.ts->src/app/shared/factories/editor-config.factory.ts - - + + - + src/app/shared/components/editor/menu/editor-menu/editor-menu.component.ts - - -editor-menu.component.ts + + +editor-menu.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/editor/menu/editor-menu/editor-menu.component.ts - - + + - + src/app/shared/components/event-form/event-form.component.ts - - -event-form.component.ts + + +event-form.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/event-form/event-form.component.ts - - + + - + src/app/shared/components/file-select/file-select.component.ts - - -file-select.component.ts + + +file-select.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/file-select/file-select.component.ts - - + + - + src/app/shared/components/footer/footer.component.ts - - -footer.component.ts + + +footer.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/footer/footer.component.ts - - + + - + src/app/shared/components/header/header.component.ts - - -header.component.ts + + +header.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/header/header.component.ts - - + + - + src/app/shared/components/input/input.component.ts - - -input.component.ts + + +input.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/input/input.component.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.ts - - -language-selector.component.ts + + +language-selector.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/language-selector/language-selector.component.ts - - + + + + + +src/app/shared/components/list/list.component.ts + + +list.component.ts + + + + + +src/app/shared/shared.module.ts->src/app/shared/components/list/list.component.ts + + - + src/app/shared/components/page-title/page-title.component.ts - - -page-title.component.ts + + +page-title.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/page-title/page-title.component.ts - - + + - + src/app/shared/components/poll-form/poll-form.component.ts - - -poll-form.component.ts + + +poll-form.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/poll-form/poll-form.component.ts - - + + - + src/app/shared/components/post-form/post-form.component.ts - - -post-form.component.ts + + +post-form.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/post-form/post-form.component.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.ts - - -profile-pic.component.ts + + +profile-pic.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/profile-pic/profile-pic.component.ts - - + + - + src/app/shared/pipes/form-group/form-group.pipe.ts - - -form-group.pipe.ts + + +form-group.pipe.ts - + src/app/shared/shared.module.ts->src/app/shared/pipes/form-group/form-group.pipe.ts - - + + - + src/app/core/services/session-storage.service.ts->src/app/core/services/local-storage-ref.service.ts - - + + src/app/core/guards/auth.guard.spec.ts - -auth.guard.spec.ts + +auth.guard.spec.ts src/app/core/guards/auth.guard.spec.ts->src/app/core/guards/auth.guard.ts - - + + src/app/core/guards/auth.guard.spec.ts->src/app/core/auth/auth.module.ts - - + + src/app/core/guards/auth.guard.spec.ts->src/app/core/services/session-storage.service.ts - - + + src/app/core/guards/interceptor.guard.spec.ts - -interceptor.guard.spec.ts + +interceptor.guard.spec.ts src/app/core/guards/interceptor.guard.spec.ts->src/app/core/guards/interceptor.guard.ts - - + + src/app/core/guards/login.guard.spec.ts - -login.guard.spec.ts + +login.guard.spec.ts src/app/core/guards/login.guard.spec.ts->src/app/core/guards/login.guard.ts - - + + src/app/core/guards/login.guard.spec.ts->src/app/core/auth/auth.module.ts - - + + src/app/core/guards/redirect.guard.spec.ts - -redirect.guard.spec.ts + +redirect.guard.spec.ts src/app/core/guards/redirect.guard.spec.ts->src/app/core/guards/redirect.guard.ts - - + + src/app/core/guards/role.guard.spec.ts - -role.guard.spec.ts + +role.guard.spec.ts @@ -2532,23 +2557,23 @@ src/app/core/guards/role.guard.ts - -role.guard.ts + +role.guard.ts src/app/core/guards/role.guard.spec.ts->src/app/core/guards/role.guard.ts - - + + src/app/core/interceptors/error.interceptor.spec.ts - -error.interceptor.spec.ts + +error.interceptor.spec.ts @@ -2556,102 +2581,111 @@ src/app/core/interceptors/error.interceptor.ts - -error.interceptor.ts + +error.interceptor.ts src/app/core/interceptors/error.interceptor.spec.ts->src/app/core/interceptors/error.interceptor.ts - - + + - + +src/app/core/interfaces/list-service.interface.ts + + +list-service.interface.ts + + + + + src/app/core/models/blog.model.ts - + blog.model.ts - + src/app/core/models/person.model.ts - - -person.model.ts + + +person.model.ts src/app/core/models/blog.model.ts->src/app/core/models/person.model.ts - - + + - + src/app/features/news-feed/models/INewsItem.ts - - -INewsItem.ts + + +INewsItem.ts src/app/core/models/blog.model.ts->src/app/features/news-feed/models/INewsItem.ts - - + + - + src/app/core/models/location.model.ts - - -location.model.ts + + +location.model.ts src/app/core/models/person.model.ts->src/app/core/models/location.model.ts - - + + - + src/app/features/news-feed/models/INewsItem.ts->src/app/core/models/person.model.ts - - + + - + src/app/core/models/poll.model.ts - - -poll.model.ts + + +poll.model.ts src/app/core/models/poll.model.ts->src/app/core/models/person.model.ts - - + + src/app/core/models/poll.model.ts->src/app/features/news-feed/models/INewsItem.ts - - + + - + src/app/core/models/post.model.ts - + post.model.ts @@ -2660,2280 +2694,2325 @@ src/app/core/models/post.model.ts->src/app/core/models/person.model.ts - - + + src/app/core/models/post.model.ts->src/app/features/news-feed/models/INewsItem.ts - - + + - + src/app/core/services/debounce.service.spec.ts - + debounce.service.spec.ts - + src/app/core/services/debounce.service.ts - - -debounce.service.ts + + +debounce.service.ts src/app/core/services/debounce.service.spec.ts->src/app/core/services/debounce.service.ts - - + + - + src/app/core/services/event.service.spec.ts - - -event.service.spec.ts + + +event.service.spec.ts - + src/app/core/services/event.service.ts - - -event.service.ts + + +event.service.ts src/app/core/services/event.service.spec.ts->src/app/core/services/event.service.ts - - + + - + +src/app/core/services/event.service.ts->src/app/core/interfaces/list-service.interface.ts + + + + + src/app/core/services/event.service.ts->src/app/core/models/location.model.ts - - + + - + src/app/core/services/group.service.ts - - -group.service.ts + + +group.service.ts - + src/app/core/services/event.service.ts->src/app/core/services/group.service.ts - - + + - + src/app/core/services/people.service.ts - - -people.service.ts + + +people.service.ts - + src/app/core/services/event.service.ts->src/app/core/services/people.service.ts - - + + + + + +src/app/core/services/event.service.ts->src/app/features/events/components/event-card/event-card.component.ts + + - + src/app/features/events/models/event.ts - - -event.ts + + +event.ts - + src/app/core/services/event.service.ts->src/app/features/events/models/event.ts - - + + + + + +src/app/core/services/group.service.ts->src/app/core/interfaces/list-service.interface.ts + + + + + +src/app/core/services/group.service.ts->src/app/features/groups/components/group-card/group-card.component.ts + + - + src/app/features/groups/models/group.ts - - -group.ts + + +group.ts - + src/app/core/services/group.service.ts->src/app/features/groups/models/group.ts - - + + + + + +src/app/core/services/people.service.ts->src/app/core/interfaces/list-service.interface.ts + + - + src/app/core/services/people.service.ts->src/app/core/models/person.model.ts - - + + - + src/app/core/services/people.service.ts->src/app/core/models/location.model.ts - - + + + + + +src/app/core/services/people.service.ts->src/app/features/profile/components/profile-card/profile-card.component.ts + + + + + +src/app/features/events/components/event-card/event-card.component.ts->src/app/core/constants/routes.constants.ts + + + + + +src/app/features/events/components/event-card/event-card.component.ts->src/app/core/services/translations.service.ts + + + + + +src/app/features/events/components/event-card/event-card.component.ts->src/app/features/events/models/event.ts + + + + + +src/app/shared/models/material-button-type.ts + + +material-button-type.ts + + + + + +src/app/features/events/components/event-card/event-card.component.ts->src/app/shared/models/material-button-type.ts + + + + + +src/app/shared/models/tooltip-direction.ts + + +tooltip-direction.ts + + + + + +src/app/features/events/components/event-card/event-card.component.ts->src/app/shared/models/tooltip-direction.ts + + - + src/app/features/events/models/event.ts->src/app/core/models/person.model.ts - - + + - + src/app/features/events/models/event.ts->src/app/core/models/location.model.ts - - + + - + src/app/features/events/models/event.ts->src/app/features/groups/models/group.ts - - + + - + src/app/core/services/focus-tracking.service.spec.ts - - -focus-tracking.service.spec.ts + + +focus-tracking.service.spec.ts - + src/app/core/services/focus-tracking.service.ts - - -focus-tracking.service.ts + + +focus-tracking.service.ts - + src/app/core/services/focus-tracking.service.spec.ts->src/app/core/services/focus-tracking.service.ts - - + + - + src/app/core/services/group.service.spec.ts - - -group.service.spec.ts + + +group.service.spec.ts - + src/app/core/services/group.service.spec.ts->src/app/core/services/group.service.ts - - + + + + + +src/app/features/groups/components/group-card/group-card.component.ts->src/app/core/constants/routes.constants.ts + + + + + +src/app/features/groups/components/group-card/group-card.component.ts->src/app/core/services/translations.service.ts + + + + + +src/app/features/groups/components/group-card/group-card.component.ts->src/app/features/groups/models/group.ts + + - + src/app/core/services/language-storage.service.spec.ts - - -language-storage.service.spec.ts + + +language-storage.service.spec.ts - + src/app/core/services/language-storage.service.spec.ts->src/app/core/services/language-storage.service.ts - - + + - + src/app/core/services/local-storage-ref.service.spec.ts - - -local-storage-ref.service.spec.ts + + +local-storage-ref.service.spec.ts - + src/app/core/services/local-storage-ref.service.spec.ts->src/app/core/services/local-storage-ref.service.ts - - + + - + src/app/core/services/news.service.spec.ts - + news.service.spec.ts - + src/app/core/services/news.service.ts - - -news.service.ts + + +news.service.ts - + src/app/core/services/news.service.spec.ts->src/app/core/services/news.service.ts - - + + + + + +src/app/core/services/news.service.ts->src/app/core/interfaces/list-service.interface.ts + + - + src/app/core/services/news.service.ts->src/app/core/models/blog.model.ts - - + + - + src/app/core/services/news.service.ts->src/app/features/news-feed/models/INewsItem.ts - - + + - + src/app/core/services/news.service.ts->src/app/core/models/poll.model.ts - - + + - + src/app/core/services/news.service.ts->src/app/core/models/post.model.ts - - + + - + src/app/core/services/news.service.ts->src/app/core/services/people.service.ts - - + + + + + +src/app/core/services/news.service.ts->src/app/features/news-feed/components/news-card/news-card.component.ts + + + + + +src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/core/services/translations.service.ts + + + + + +src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/core/models/blog.model.ts + + + + + +src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/features/news-feed/models/INewsItem.ts + + + + + +src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/core/models/poll.model.ts + + + + + +src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/core/models/post.model.ts + + + + + +src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/shared/models/material-button-type.ts + + - + src/app/core/services/people.service.spec.ts - - -people.service.spec.ts + + +people.service.spec.ts - + src/app/core/services/people.service.spec.ts->src/app/core/services/people.service.ts - - + + + + + +src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/core/constants/routes.constants.ts + + + + + +src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/core/services/translations.service.ts + + + + + +src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/core/models/person.model.ts + + + + + +src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/shared/models/material-button-type.ts + + + + + +src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/shared/models/tooltip-direction.ts + + - + src/app/core/services/session-storage.service.spec.ts - + session-storage.service.spec.ts - + src/app/core/services/session-storage.service.spec.ts->src/app/core/services/session-storage.service.ts - - + + - + src/app/core/services/title.service.spec.ts - - -title.service.spec.ts + + +title.service.spec.ts - + src/app/core/services/title.service.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/core/services/title.service.spec.ts->src/app/core/services/title.service.ts - - - - - -src/app/core/services/user.service.spec.ts - - -user.service.spec.ts - - - - - -src/app/core/services/user.service.ts - - -user.service.ts - - - - - -src/app/core/services/user.service.spec.ts->src/app/core/services/user.service.ts - - + + - + src/app/features/about/about-routing.module.ts->src/app/features/about/about.component.ts - - + + - + src/app/features/about/about.component.spec.ts - - -about.component.spec.ts + + +about.component.spec.ts - + src/app/features/about/about.component.spec.ts->src/app/features/about/about.component.ts - - + + - + src/app/features/blog/blog.component.ts - - -blog.component.ts + + +blog.component.ts - + src/app/features/blog/blog-routing.module.ts->src/app/features/blog/blog.component.ts - - + + - + src/app/features/blog/blog.component.spec.ts - - -blog.component.spec.ts + + +blog.component.spec.ts - + src/app/features/blog/blog.component.spec.ts->src/app/features/blog/blog.component.ts - - + + - + src/app/features/bookmarks/bookmarks.component.ts - - -bookmarks.component.ts + + +bookmarks.component.ts - + src/app/features/bookmarks/bookmarks-routing.module.ts->src/app/features/bookmarks/bookmarks.component.ts - - + + - + src/app/features/bookmarks/bookmarks.component.spec.ts - - -bookmarks.component.spec.ts + + +bookmarks.component.spec.ts - + src/app/features/bookmarks/bookmarks.component.spec.ts->src/app/features/bookmarks/bookmarks.component.ts - - + + - + src/app/features/dashboard/dashboard.component.ts - - -dashboard.component.ts + + +dashboard.component.ts - + src/app/features/dashboard/dashboard-routing.module.ts->src/app/features/dashboard/dashboard.component.ts - - + + - + src/app/features/dashboard/dashboard.component.spec.ts - - -dashboard.component.spec.ts + + +dashboard.component.spec.ts - + src/app/features/dashboard/dashboard.component.spec.ts->src/app/features/dashboard/dashboard.component.ts - - + + - + src/app/features/events/components/event-card/event-card.component.spec.ts - - -event-card.component.spec.ts + + +event-card.component.spec.ts - + src/app/features/events/components/event-card/event-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/events/components/event-card/event-card.component.spec.ts->src/app/features/events/components/event-card/event-card.component.ts - - - - - -src/app/features/events/components/event-card/event-card.component.ts->src/app/core/constants/routes.constants.ts - - - - - -src/app/features/events/components/event-card/event-card.component.ts->src/app/core/services/translations.service.ts - - - - - -src/app/features/events/components/event-card/event-card.component.ts->src/app/features/events/models/event.ts - - - - - -src/app/shared/models/material-button-type.ts - - -material-button-type.ts - - - - - -src/app/features/events/components/event-card/event-card.component.ts->src/app/shared/models/material-button-type.ts - - - - - -src/app/shared/models/tooltip-direction.ts - - -tooltip-direction.ts - - - - - -src/app/features/events/components/event-card/event-card.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/features/events/components/event-list/event-list.component.spec.ts - - -event-list.component.spec.ts + + +event-list.component.spec.ts - + src/app/features/events/components/event-list/event-list.component.spec.ts->src/app/features/events/components/event-list/event-list.component.ts - - + + - + src/app/features/events/components/event-list/event-list.component.ts->src/app/features/events/models/event.ts - - + + - + src/app/features/events/components/event/event.component.spec.ts - - -event.component.spec.ts + + +event.component.spec.ts - + src/app/features/events/components/event/event.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/events/components/event/event.component.spec.ts->src/app/features/events/components/event/event.component.ts - - + + - + src/app/features/events/components/event/event.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/features/events/components/event/event.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/events/components/event/event.component.ts->src/app/core/services/event.service.ts - - + + - + src/app/features/events/components/event/event.component.ts->src/app/features/events/models/event.ts - - + + - + src/app/features/events/components/event/event.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/features/events/components/event/event.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/features/events/components/event/event.component.ts->src/app/shared/components/banner/banner.component.ts - - + + - + src/app/shared/models/input-type.ts - - -input-type.ts + + +input-type.ts - + src/app/features/events/components/event/event.component.ts->src/app/shared/models/input-type.ts - - + + - + src/app/features/events/events-routing.module.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/events/events-routing.module.ts->src/app/features/events/events.component.ts - - + + - + src/app/features/events/events-routing.module.ts->src/app/features/events/components/event/event.component.ts - - + + - + src/app/features/events/events.component.spec.ts - - -events.component.spec.ts + + +events.component.spec.ts - + src/app/features/events/events.component.spec.ts->src/app/features/events/events.component.ts - - + + - + src/app/features/events/resolvers/event.resolver.ts - - -event.resolver.ts + + +event.resolver.ts - + src/app/features/events/resolvers/event.resolver.ts->src/app/core/services/event.service.ts - - + + - + src/app/features/events/resolvers/event.resolver.ts->src/app/features/events/models/event.ts - - + + - + src/app/features/friends/friends.component.ts - - -friends.component.ts + + +friends.component.ts - + src/app/features/friends/friends-routing.module.ts->src/app/features/friends/friends.component.ts - - + + - + src/app/features/friends/friends.component.spec.ts - - -friends.component.spec.ts + + +friends.component.spec.ts - + src/app/features/friends/friends.component.spec.ts->src/app/features/friends/friends.component.ts - - + + - + src/app/features/groups/components/group-card/group-card.component.spec.ts - - -group-card.component.spec.ts + + +group-card.component.spec.ts - + src/app/features/groups/components/group-card/group-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/groups/components/group-card/group-card.component.spec.ts->src/app/features/groups/components/group-card/group-card.component.ts - - - - - -src/app/features/groups/components/group-card/group-card.component.ts->src/app/core/constants/routes.constants.ts - - - - - -src/app/features/groups/components/group-card/group-card.component.ts->src/app/core/services/translations.service.ts - - - - - -src/app/features/groups/components/group-card/group-card.component.ts->src/app/features/groups/models/group.ts - - + + - + src/app/features/groups/components/group-list/group-list.component.spec.ts - - -group-list.component.spec.ts + + +group-list.component.spec.ts - + src/app/features/groups/components/group-list/group-list.component.spec.ts->src/app/features/groups/components/group-list/group-list.component.ts - - + + - + src/app/features/groups/components/group-list/group-list.component.ts->src/app/features/groups/models/group.ts - - + + - + src/app/features/groups/components/group/group.component.spec.ts - - -group.component.spec.ts + + +group.component.spec.ts - + src/app/features/groups/components/group/group.component.spec.ts->src/app/features/groups/components/group/group.component.ts - - + + - + src/app/features/groups/groups-routing.module.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/groups/groups-routing.module.ts->src/app/features/groups/groups.component.ts - - + + - + src/app/features/groups/groups-routing.module.ts->src/app/features/groups/components/group/group.component.ts - - + + - + src/app/features/groups/groups.component.spec.ts - - -groups.component.spec.ts + + +groups.component.spec.ts - + src/app/features/groups/groups.component.spec.ts->src/app/features/groups/groups.component.ts - - + + - + src/app/features/home/home-routing.module.ts->src/app/features/home/home.component.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/models/person.model.ts - - + + - + src/app/features/home/home.component.ts->src/app/features/news-feed/models/INewsItem.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/services/event.service.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/services/group.service.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/services/people.service.ts - - + + - + src/app/features/home/home.component.ts->src/app/features/events/models/event.ts - - + + - + src/app/features/home/home.component.ts->src/app/features/groups/models/group.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/services/news.service.ts - - + + - + src/app/features/home/home.component.ts->src/app/shared/models/input-type.ts - - + + - + src/app/features/home/home.component.spec.ts - - -home.component.spec.ts + + +home.component.spec.ts - + src/app/features/home/home.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/home/home.component.spec.ts->src/app/features/home/home.component.ts - - + + - + src/app/features/invite/invite.component.ts - - -invite.component.ts + + +invite.component.ts - + src/app/features/invite/invite-routing.module.ts->src/app/features/invite/invite.component.ts - - + + - + src/app/features/invite/invite.component.spec.ts - - -invite.component.spec.ts + + +invite.component.spec.ts - + src/app/features/invite/invite.component.spec.ts->src/app/features/invite/invite.component.ts - - + + - + src/app/features/login/login-routing.module.ts->src/app/features/login/login.component.ts - - + + - + src/app/features/login/login.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/login/login.component.spec.ts - - -login.component.spec.ts + + +login.component.spec.ts - + src/app/features/login/login.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/login/login.component.spec.ts->src/app/features/login/login.component.ts - - + + - + src/app/features/members/members.component.ts - - -members.component.ts + + +members.component.ts - + src/app/features/members/members-routing.module.ts->src/app/features/members/members.component.ts - - + + - + src/app/features/members/members.component.spec.ts - - -members.component.spec.ts + + +members.component.spec.ts - + src/app/features/members/members.component.spec.ts->src/app/features/members/members.component.ts - - + + - + src/app/features/messages/messages.component.ts - - -messages.component.ts + + +messages.component.ts - + src/app/features/messages/messages-routing.module.ts->src/app/features/messages/messages.component.ts - - + + - + src/app/features/messages/messages.component.spec.ts - - -messages.component.spec.ts + + +messages.component.spec.ts - + src/app/features/messages/messages.component.spec.ts->src/app/features/messages/messages.component.ts - - + + - + src/app/features/missions/missions.component.ts - - -missions.component.ts + + +missions.component.ts - + src/app/features/missions/missions-routing.module.ts->src/app/features/missions/missions.component.ts - - + + - + src/app/features/missions/missions.component.spec.ts - - -missions.component.spec.ts + + +missions.component.spec.ts - + src/app/features/missions/missions.component.spec.ts->src/app/features/missions/missions.component.ts - - + + - + src/app/features/news-feed/components/news-card/news-card.component.spec.ts - - -news-card.component.spec.ts + + +news-card.component.spec.ts - + src/app/features/news-feed/components/news-card/news-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - -src/app/features/news-feed/components/news-card/news-card.component.spec.ts->src/app/features/news-feed/components/news-card/news-card.component.ts - - - - - -src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/core/services/translations.service.ts - - - - - -src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/core/models/blog.model.ts - - - - - -src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/features/news-feed/models/INewsItem.ts - - - - - -src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/core/models/poll.model.ts - - - - - -src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/core/models/post.model.ts - - - - -src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/shared/models/material-button-type.ts - - +src/app/features/news-feed/components/news-card/news-card.component.spec.ts->src/app/features/news-feed/components/news-card/news-card.component.ts + + src/app/features/news-feed/components/news-list/news-list.component.spec.ts - -news-list.component.spec.ts + +news-list.component.spec.ts - + src/app/features/news-feed/components/news-list/news-list.component.spec.ts->src/app/features/news-feed/components/news-list/news-list.component.ts - - + + - + src/app/features/news-feed/components/news-list/news-list.component.ts->src/app/features/news-feed/models/INewsItem.ts - - + + src/app/features/news-feed/news-feed.component.ts - -news-feed.component.ts + +news-feed.component.ts - + src/app/features/news-feed/news-feed-routing.module.ts->src/app/features/news-feed/news-feed.component.ts - - + + src/app/features/news-feed/news-feed.component.spec.ts - -news-feed.component.spec.ts + +news-feed.component.spec.ts - + src/app/features/news-feed/news-feed.component.spec.ts->src/app/features/news-feed/news-feed.component.ts - - + + - + src/app/features/privacy/privacy-routing.module.ts->src/app/features/privacy/privacy.component.ts - - + + src/app/features/privacy/privacy.component.spec.ts - -privacy.component.spec.ts + +privacy.component.spec.ts - + src/app/features/privacy/privacy.component.spec.ts->src/app/features/privacy/privacy.component.ts - - + + src/app/features/profile/components/post/post.component.spec.ts - -post.component.spec.ts + +post.component.spec.ts - + src/app/features/profile/components/post/post.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/profile/components/post/post.component.spec.ts->src/app/features/profile/components/post/post.component.ts - - + + - + src/app/features/profile/components/post/post.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/profile/components/post/post.component.ts->src/app/core/services/session-storage.service.ts - - + + - + src/app/features/profile/components/post/post.component.ts->src/app/core/models/person.model.ts - - + + src/app/features/profile/components/profile-card/profile-card.component.spec.ts - -profile-card.component.spec.ts + +profile-card.component.spec.ts - + src/app/features/profile/components/profile-card/profile-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.spec.ts->src/app/features/profile/components/profile-card/profile-card.component.ts - - - - - -src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/core/constants/routes.constants.ts - - - - - -src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/core/services/translations.service.ts - - - - - -src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/core/models/person.model.ts - - - - - -src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/shared/models/material-button-type.ts - - - - - -src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/features/profile/components/profile-list/profile-list.component.spec.ts - - -profile-list.component.spec.ts + + +profile-list.component.spec.ts - + src/app/features/profile/components/profile-list/profile-list.component.spec.ts->src/app/features/profile/components/profile-list/profile-list.component.ts - - + + - + src/app/features/profile/components/profile-list/profile-list.component.ts->src/app/core/models/person.model.ts - - + + - + src/app/features/profile/profile.component.ts - - -profile.component.ts + + +profile.component.ts - + src/app/features/profile/profile-routing.module.ts->src/app/features/profile/profile.component.ts - - + + - + src/app/features/profile/profile.component.spec.ts - - -profile.component.spec.ts + + +profile.component.spec.ts - + src/app/features/profile/profile.component.spec.ts->src/app/features/profile/profile.component.ts - - + + - + src/app/features/register/register-routing.module.ts->src/app/features/register/register.component.ts - - + + - + src/app/features/register/register.component.spec.ts - - -register.component.spec.ts + + +register.component.spec.ts - + src/app/features/register/register.component.spec.ts->src/app/features/register/register.component.ts - - + + - + src/app/features/search/search.component.ts - - -search.component.ts + + +search.component.ts - + src/app/features/search/search-routing.module.ts->src/app/features/search/search.component.ts - - + + - + src/app/features/search/search.component.spec.ts - - -search.component.spec.ts + + +search.component.spec.ts - + src/app/features/search/search.component.spec.ts->src/app/features/search/search.component.ts - - + + - + src/app/features/settings/settings.component.ts - - -settings.component.ts + + +settings.component.ts - + src/app/features/settings/settings-routing.module.ts->src/app/features/settings/settings.component.ts - - + + - + src/app/features/settings/settings.component.spec.ts - - -settings.component.spec.ts + + +settings.component.spec.ts - + src/app/features/settings/settings.component.spec.ts->src/app/features/settings/settings.component.ts - - + + - + src/app/features/splash/splash-routing.module.ts->src/app/features/splash/splash.component.ts - - + + - + src/app/features/splash/splash.component.spec.ts - - -splash.component.spec.ts + + +splash.component.spec.ts - + src/app/features/splash/splash.component.spec.ts->src/app/features/splash/splash.component.ts - - + + - + src/app/features/stats/stats-routing.module.ts->src/app/features/stats/stats.component.ts - - + + - + src/app/features/stats/stats.component.spec.ts - - -stats.component.spec.ts + + +stats.component.spec.ts - + src/app/features/stats/stats.component.spec.ts->src/app/features/stats/stats.component.ts - - + + - + src/app/features/terms/terms-routing.module.ts->src/app/features/terms/terms.component.ts - - + + - + src/app/features/terms/terms.component.spec.ts - - -terms.component.spec.ts + + +terms.component.spec.ts - + src/app/features/terms/terms.component.spec.ts->src/app/features/terms/terms.component.ts - - + + - + src/app/features/the-wire/the-wire.component.ts - - -the-wire.component.ts + + +the-wire.component.ts - + src/app/features/the-wire/the-wire-routing.module.ts->src/app/features/the-wire/the-wire.component.ts - - + + - + src/app/features/the-wire/the-wire.component.spec.ts - - -the-wire.component.spec.ts + + +the-wire.component.spec.ts - + src/app/features/the-wire/the-wire.component.spec.ts->src/app/features/the-wire/the-wire.component.ts - - + + - + src/app/shared/components/banner/banner.component.spec.ts - - -banner.component.spec.ts + + +banner.component.spec.ts - + src/app/shared/components/banner/banner.component.spec.ts->src/app/shared/components/banner/banner.component.ts - - + + - + src/app/shared/components/blog-form/blog-form.component.spec.ts - - -blog-form.component.spec.ts + + +blog-form.component.spec.ts - + src/app/shared/components/blog-form/blog-form.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/blog-form/blog-form.component.spec.ts->src/app/shared/pipes/form-control/form-control.pipe.ts - - + + - + src/app/shared/components/blog-form/blog-form.component.spec.ts->src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.ts - - + + - + src/app/shared/components/blog-form/blog-form.component.spec.ts->src/app/shared/components/blog-form/blog-form.component.ts - - + + - + src/app/shared/components/blog-form/blog-form.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/button/button.component.spec.ts - - -button.component.spec.ts + + +button.component.spec.ts - + src/app/shared/components/button/button.component.spec.ts->src/app/shared/components/button/button.component.ts - - + + - + src/app/shared/components/button/button.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/shared/components/button/button.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/shared/models/button-type.ts - - -button-type.ts + + +button-type.ts - + src/app/shared/components/button/button.component.ts->src/app/shared/models/button-type.ts - - + + - + src/app/shared/models/material-color.ts - - -material-color.ts + + +material-color.ts - + src/app/shared/components/button/button.component.ts->src/app/shared/models/material-color.ts - - + + - + src/app/shared/models/theme.ts - - -theme.ts + + +theme.ts - + src/app/shared/components/button/button.component.ts->src/app/shared/models/theme.ts - - + + - + src/app/shared/components/calendar-button/calendar-button.component.spec.ts - - -calendar-button.component.spec.ts + + +calendar-button.component.spec.ts - + src/app/shared/components/calendar-button/calendar-button.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/calendar-button/calendar-button.component.spec.ts->src/app/shared/components/calendar-button/calendar-button.component.ts - - + + - + src/app/shared/components/calendar-button/calendar-button.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/calendar-button/calendar-button.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/shared/components/editor/editor.component.spec.ts - - -editor.component.spec.ts + + +editor.component.spec.ts - + src/app/shared/components/editor/editor.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/editor/editor.component.spec.ts->src/app/shared/components/editor/editor.component.ts - - + + - + src/app/shared/components/editor/editor.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/editor/editor.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/shared/components/editor/editor.component.ts->src/app/shared/factories/editor-config.factory.ts - - + + - + src/app/shared/factories/editor-config.factory.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/event-form/event-form.component.spec.ts - - -event-form.component.spec.ts + + +event-form.component.spec.ts - + src/app/shared/components/event-form/event-form.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/event-form/event-form.component.spec.ts->src/app/shared/pipes/form-control/form-control.pipe.ts - - + + - + src/app/shared/components/event-form/event-form.component.spec.ts->src/app/shared/components/event-form/event-form.component.ts - - + + - + src/app/shared/components/event-form/event-form.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/file-select/file-select.component.spec.ts - - -file-select.component.spec.ts + + +file-select.component.spec.ts - + src/app/shared/components/file-select/file-select.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/file-select/file-select.component.spec.ts->src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.ts - - + + - + src/app/shared/components/file-select/file-select.component.spec.ts->src/app/shared/components/file-select/file-select.component.ts - - + + - + src/app/shared/components/file-select/file-select.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/file-select/file-select.component.ts->src/app/core/services/focus-tracking.service.ts - - + + - + src/app/shared/components/file-select/file-select.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/shared/components/file-select/file-select.component.ts->src/app/shared/models/theme.ts - - + + - + src/app/shared/components/footer/footer.component.spec.ts - - -footer.component.spec.ts + + +footer.component.spec.ts - + src/app/shared/components/footer/footer.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/footer/footer.component.spec.ts->src/app/shared/components/footer/footer.component.ts - - + + - + src/app/shared/components/footer/footer.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/shared/components/footer/footer.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/forbidden/forbidden.component.spec.ts - - -forbidden.component.spec.ts + + +forbidden.component.spec.ts - + src/app/shared/components/forbidden/forbidden.component.spec.ts->src/app/shared/components/forbidden/forbidden.component.ts - - + + - + src/app/shared/components/header/header.component.spec.ts - - -header.component.spec.ts + + +header.component.spec.ts - + src/app/shared/components/header/header.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/header/header.component.spec.ts->src/app/shared/components/header/header.component.ts - - + + - + src/app/shared/components/header/header.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/shared/components/header/header.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/header/header.component.ts->src/app/core/models/person.model.ts - - + + - + src/app/shared/components/header/header.component.ts->src/app/core/services/people.service.ts - - + + - + src/app/shared/components/header/header.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/shared/components/input/input.component.spec.ts - - -input.component.spec.ts + + +input.component.spec.ts - + src/app/shared/components/input/input.component.spec.ts->src/app/shared/components/input/input.component.ts - - + + - + src/app/shared/components/input/input.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/input/input.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/shared/components/input/input.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/shared/components/input/input.component.ts->src/app/shared/models/input-type.ts - - + + - + src/app/shared/components/input/input.component.ts->src/app/shared/models/theme.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.spec.ts - - -language-selector.component.spec.ts + + +language-selector.component.spec.ts - + src/app/shared/components/language-selector/language-selector.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.spec.ts->src/app/shared/components/language-selector/language-selector.component.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.ts->src/app/shared/models/theme.ts - - + + - + src/app/shared/models/language.ts - - -language.ts + + +language.ts - + src/app/shared/components/language-selector/language-selector.component.ts->src/app/shared/models/language.ts - - + + + + + +src/app/shared/components/list/list.component.spec.ts + + +list.component.spec.ts + + + + + +src/app/shared/components/list/list.component.spec.ts->src/app/shared/components/list/list.component.ts + + + + + +src/app/shared/components/list/list.component.ts->src/app/core/interfaces/list-service.interface.ts + + - + src/app/shared/components/not-found/not-found.component.spec.ts - - -not-found.component.spec.ts + + +not-found.component.spec.ts - + src/app/shared/components/not-found/not-found.component.spec.ts->src/app/shared/components/not-found/not-found.component.ts - - + + - + src/app/shared/components/page-title/page-title.component.spec.ts - - -page-title.component.spec.ts + + +page-title.component.spec.ts - + src/app/shared/components/page-title/page-title.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/page-title/page-title.component.spec.ts->src/app/shared/components/page-title/page-title.component.ts - - + + - + src/app/shared/components/poll-form/poll-form.component.spec.ts - - -poll-form.component.spec.ts + + +poll-form.component.spec.ts - + src/app/shared/components/poll-form/poll-form.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/poll-form/poll-form.component.spec.ts->src/app/shared/pipes/form-control/form-control.pipe.ts - - + + - + src/app/shared/components/poll-form/poll-form.component.spec.ts->src/app/shared/components/poll-form/poll-form.component.ts - - + + - + src/app/shared/components/poll-form/poll-form.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/poll-form/poll-form.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/shared/components/post-form/post-form.component.spec.ts - - -post-form.component.spec.ts + + +post-form.component.spec.ts - + src/app/shared/components/post-form/post-form.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/post-form/post-form.component.spec.ts->src/app/shared/pipes/form-control/form-control.pipe.ts - - + + - + src/app/shared/components/post-form/post-form.component.spec.ts->src/app/shared/components/post-form/post-form.component.ts - - + + - + src/app/shared/components/post-form/post-form.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.spec.ts - - -profile-pic.component.spec.ts + + +profile-pic.component.spec.ts - + src/app/shared/components/profile-pic/profile-pic.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.spec.ts->src/app/shared/components/profile-pic/profile-pic.component.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.ts->src/app/core/models/person.model.ts - - + + - + src/app/shared/components/unauthorized/unauthorized.component.spec.ts - - -unauthorized.component.spec.ts + + +unauthorized.component.spec.ts - + src/app/shared/components/unauthorized/unauthorized.component.spec.ts->src/app/shared/components/unauthorized/unauthorized.component.ts - - + + - + src/app/shared/pipes/form-control/form-control.pipe.spec.ts - - -form-control.pipe.spec.ts + + +form-control.pipe.spec.ts - + src/app/shared/pipes/form-control/form-control.pipe.spec.ts->src/app/shared/pipes/form-control/form-control.pipe.ts - - + + - + src/app/shared/pipes/form-group/form-group.pipe.spec.ts - - -form-group.pipe.spec.ts + + +form-group.pipe.spec.ts - + src/app/shared/pipes/form-group/form-group.pipe.spec.ts->src/app/shared/pipes/form-group/form-group.pipe.ts - - + + - + src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.spec.ts - - -truncate-file-name.pipe.spec.ts + + +truncate-file-name.pipe.spec.ts - + src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.spec.ts->src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.ts - - + + - + src/assets/i18n/translations.fr.ts - - -translations.fr.ts + + +translations.fr.ts - + src/assets/i18n/translations.fr.ts->src/assets/i18n/translations.en.ts - - + + - + src/environments/environment.pr.ts - + environment.pr.ts - + src/environments/environment.prod.ts - + environment.prod.ts - + src/main.ts - - -main.ts + + +main.ts - + src/main.ts->src/app/app.module.ts - - + + - + src/main.ts->src/environments/environment.ts - + - + src/polyfills.ts - - -polyfills.ts + + +polyfills.ts - + src/test.ts - - -test.ts + + +test.ts From 6c2ec612834956bf92045ada0f67d2c81fc053fe Mon Sep 17 00:00:00 2001 From: Adii <73539670+AdiMakkar@users.noreply.github.com> Date: Fri, 24 Nov 2023 09:32:23 -0500 Subject: [PATCH 094/165] Event list support feature (#184) * wip * wip * wip * wip --- .../events/components/event-card/event-card.component.ts | 7 ++++--- .../events/components/event-list/event-list.component.html | 3 ++- .../events/components/event-list/event-list.component.ts | 3 ++- src/app/features/events/models/eventcardview.ts | 5 +++++ 4 files changed, 13 insertions(+), 5 deletions(-) create mode 100644 src/app/features/events/models/eventcardview.ts diff --git a/src/app/features/events/components/event-card/event-card.component.ts b/src/app/features/events/components/event-card/event-card.component.ts index d235eb02..4b934512 100644 --- a/src/app/features/events/components/event-card/event-card.component.ts +++ b/src/app/features/events/components/event-card/event-card.component.ts @@ -5,6 +5,7 @@ import { MaterialButtonType } from 'src/app/shared/models/material-button-type'; import { Router } from '@angular/router'; import { CoreRoutes } from 'src/app/core/constants/routes.constants'; import { TooltipDirection } from 'src/app/shared/models/tooltip-direction'; +import { EventCardView } from '../../models/eventcardview'; @Component({ selector: 'app-event-card', @@ -15,7 +16,7 @@ import { TooltipDirection } from 'src/app/shared/models/tooltip-direction'; export class EventCardComponent { @Input() model?: Event; @Input() loading: boolean = false; - @Input() view: string = 'small'; + @Input() view: string | EventCardView = EventCardView.Small; @Output() confirm = new EventEmitter(); @Output() decline = new EventEmitter(); @@ -32,7 +33,7 @@ export class EventCardComponent { this.model.confirmed = !this.model.confirmed; - if (this.model.confirmed && this.model.declined) + if (this.model.confirmed && this.model.declined) this.model.declined = false; if (this.model.confirmed) @@ -45,7 +46,7 @@ export class EventCardComponent { this.model.declined = !this.model.declined; - if (this.model.declined && this.model.confirmed) + if (this.model.declined && this.model.confirmed) this.model.confirmed = false; if (this.model.declined) diff --git a/src/app/features/events/components/event-list/event-list.component.html b/src/app/features/events/components/event-list/event-list.component.html index 5ae312ee..0ca9ebc2 100644 --- a/src/app/features/events/components/event-list/event-list.component.html +++ b/src/app/features/events/components/event-list/event-list.component.html @@ -1,6 +1,7 @@
@@ -8,7 +9,7 @@
- +
diff --git a/src/app/features/events/components/event-list/event-list.component.ts b/src/app/features/events/components/event-list/event-list.component.ts index 08d84e22..298fa220 100644 --- a/src/app/features/events/components/event-list/event-list.component.ts +++ b/src/app/features/events/components/event-list/event-list.component.ts @@ -1,5 +1,6 @@ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core'; import { Event } from '../../models/event'; +import { EventCardView } from '../../models/eventcardview'; @Component({ selector: 'app-event-list', @@ -11,7 +12,7 @@ export class EventListComponent { @Input() model?: Event[]; @Input() isLoading: boolean = false; @Input() loadingCount: number = 3; - + @Input() view: string | EventCardView = EventCardView.Small; @Output() confirm = new EventEmitter(); @Output() decline = new EventEmitter(); diff --git a/src/app/features/events/models/eventcardview.ts b/src/app/features/events/models/eventcardview.ts new file mode 100644 index 00000000..9d305067 --- /dev/null +++ b/src/app/features/events/models/eventcardview.ts @@ -0,0 +1,5 @@ + +export enum EventCardView { + Large = 'large', + Small = 'small', + } \ No newline at end of file From a1f7ebbd49033279b1d4f5fb504a9f916147434d Mon Sep 17 00:00:00 2001 From: Shea Date: Fri, 24 Nov 2023 14:33:04 +0000 Subject: [PATCH 095/165] Dependency Graph ignore-deploy --- dependency-graph.svg | 1117 +++++++++++++++++++++--------------------- 1 file changed, 569 insertions(+), 548 deletions(-) diff --git a/dependency-graph.svg b/dependency-graph.svg index afd6950b..9a9212fe 100644 --- a/dependency-graph.svg +++ b/dependency-graph.svg @@ -91,8 +91,8 @@ cluster_src/app/features/events - -events + +events cluster_src/app/features/events/components @@ -116,8 +116,8 @@ cluster_src/app/features/events/models - -models + +models cluster_src/app/features/events/resolvers @@ -1142,7 +1142,7 @@ - + src/app/features/events/events.module.ts->src/app/shared/shared.module.ts @@ -1159,58 +1159,58 @@ - + src/app/features/events/events.module.ts->src/app/features/events/components/event-card/event-card.component.ts - + src/app/features/events/components/event-list/event-list.component.ts - + event-list.component.ts - + src/app/features/events/events.module.ts->src/app/features/events/components/event-list/event-list.component.ts - + src/app/features/events/components/event/event.component.ts - + event.component.ts - + src/app/features/events/events.module.ts->src/app/features/events/components/event/event.component.ts - + src/app/features/events/events-routing.module.ts - + events-routing.module.ts - + src/app/features/events/events.module.ts->src/app/features/events/events-routing.module.ts - + src/app/features/friends/friends.module.ts->src/app/shared/shared.module.ts @@ -1218,22 +1218,22 @@ - + src/app/features/friends/friends-routing.module.ts - + friends-routing.module.ts - + src/app/features/friends/friends.module.ts->src/app/features/friends/friends-routing.module.ts - + src/app/features/groups/groups.module.ts->src/app/shared/shared.module.ts @@ -1250,58 +1250,58 @@ - + src/app/features/groups/groups.module.ts->src/app/features/groups/components/group-card/group-card.component.ts - + src/app/features/groups/components/group-list/group-list.component.ts - + group-list.component.ts - + src/app/features/groups/groups.module.ts->src/app/features/groups/components/group-list/group-list.component.ts - + src/app/features/groups/components/group/group.component.ts - + group.component.ts - + src/app/features/groups/groups.module.ts->src/app/features/groups/components/group/group.component.ts - + src/app/features/groups/groups-routing.module.ts - + groups-routing.module.ts - + src/app/features/groups/groups.module.ts->src/app/features/groups/groups-routing.module.ts - + src/app/features/home/home.module.ts->src/app/features/events/events.module.ts @@ -1309,7 +1309,7 @@ - + src/app/features/home/home.module.ts->src/app/features/groups/groups.module.ts @@ -1317,7 +1317,7 @@ - + src/app/features/home/home.module.ts->src/app/features/news-feed/news-feed.module.ts @@ -1325,7 +1325,7 @@ - + src/app/features/home/home.module.ts->src/app/features/profile/profile.module.ts @@ -1333,7 +1333,7 @@ - + src/app/features/home/home.module.ts->src/app/shared/shared.module.ts @@ -1341,37 +1341,37 @@ - + src/app/features/home/home-routing.module.ts - + home-routing.module.ts - + src/app/features/home/home.module.ts->src/app/features/home/home-routing.module.ts - + src/app/features/home/home.component.ts - + home.component.ts - + src/app/features/home/home.module.ts->src/app/features/home/home.component.ts - + src/app/features/invite/invite.module.ts->src/app/shared/shared.module.ts @@ -1379,22 +1379,22 @@ - + src/app/features/invite/invite-routing.module.ts - + invite-routing.module.ts - + src/app/features/invite/invite.module.ts->src/app/features/invite/invite-routing.module.ts - + src/app/features/login/login.module.ts->src/app/shared/shared.module.ts @@ -1402,37 +1402,37 @@ - + src/app/features/login/login-routing.module.ts - + login-routing.module.ts - + src/app/features/login/login.module.ts->src/app/features/login/login-routing.module.ts - + src/app/features/login/login.component.ts - + login.component.ts - + src/app/features/login/login.module.ts->src/app/features/login/login.component.ts - + src/app/features/members/members.module.ts->src/app/shared/shared.module.ts @@ -1440,22 +1440,22 @@ - + src/app/features/members/members-routing.module.ts - + members-routing.module.ts - + src/app/features/members/members.module.ts->src/app/features/members/members-routing.module.ts - + src/app/features/messages/messages.module.ts->src/app/shared/shared.module.ts @@ -1463,22 +1463,22 @@ - + src/app/features/messages/messages-routing.module.ts - + messages-routing.module.ts - + src/app/features/messages/messages.module.ts->src/app/features/messages/messages-routing.module.ts - + src/app/features/missions/missions.module.ts->src/app/shared/shared.module.ts @@ -1486,22 +1486,22 @@ - + src/app/features/missions/missions-routing.module.ts - + missions-routing.module.ts - + src/app/features/missions/missions.module.ts->src/app/features/missions/missions-routing.module.ts - + src/app/features/news-feed/news-feed.module.ts->src/app/shared/shared.module.ts @@ -1518,43 +1518,43 @@ - + src/app/features/news-feed/news-feed.module.ts->src/app/features/news-feed/components/news-card/news-card.component.ts - + src/app/features/news-feed/components/news-list/news-list.component.ts - + news-list.component.ts - + src/app/features/news-feed/news-feed.module.ts->src/app/features/news-feed/components/news-list/news-list.component.ts - + src/app/features/news-feed/news-feed-routing.module.ts - + news-feed-routing.module.ts - + src/app/features/news-feed/news-feed.module.ts->src/app/features/news-feed/news-feed-routing.module.ts - + src/app/features/privacy/privacy.module.ts->src/app/shared/shared.module.ts @@ -1562,37 +1562,37 @@ - + src/app/features/privacy/privacy-routing.module.ts - + privacy-routing.module.ts - + src/app/features/privacy/privacy.module.ts->src/app/features/privacy/privacy-routing.module.ts - + src/app/features/privacy/privacy.component.ts - + privacy.component.ts - + src/app/features/privacy/privacy.module.ts->src/app/features/privacy/privacy.component.ts - + src/app/features/profile/profile.module.ts->src/app/shared/shared.module.ts @@ -1609,58 +1609,58 @@ - + src/app/features/profile/profile.module.ts->src/app/features/profile/components/profile-card/profile-card.component.ts - + src/app/features/profile/components/post/post.component.ts - + post.component.ts - + src/app/features/profile/profile.module.ts->src/app/features/profile/components/post/post.component.ts - + src/app/features/profile/components/profile-list/profile-list.component.ts - + profile-list.component.ts - + src/app/features/profile/profile.module.ts->src/app/features/profile/components/profile-list/profile-list.component.ts - + src/app/features/profile/profile-routing.module.ts - + profile-routing.module.ts - + src/app/features/profile/profile.module.ts->src/app/features/profile/profile-routing.module.ts - + src/app/features/register/register.module.ts->src/app/shared/shared.module.ts @@ -1668,37 +1668,37 @@ - + src/app/features/register/register-routing.module.ts - + register-routing.module.ts - + src/app/features/register/register.module.ts->src/app/features/register/register-routing.module.ts - + src/app/features/register/register.component.ts - + register.component.ts - + src/app/features/register/register.module.ts->src/app/features/register/register.component.ts - + src/app/features/search/search.module.ts->src/app/shared/shared.module.ts @@ -1706,22 +1706,22 @@ - + src/app/features/search/search-routing.module.ts - + search-routing.module.ts - + src/app/features/search/search.module.ts->src/app/features/search/search-routing.module.ts - + src/app/features/settings/settings.module.ts->src/app/shared/shared.module.ts @@ -1729,22 +1729,22 @@ - + src/app/features/settings/settings-routing.module.ts - + settings-routing.module.ts - + src/app/features/settings/settings.module.ts->src/app/features/settings/settings-routing.module.ts - + src/app/features/splash/splash.module.ts->src/app/shared/shared.module.ts @@ -1752,37 +1752,37 @@ - + src/app/features/splash/splash-routing.module.ts - + splash-routing.module.ts - + src/app/features/splash/splash.module.ts->src/app/features/splash/splash-routing.module.ts - + src/app/features/splash/splash.component.ts - + splash.component.ts - + src/app/features/splash/splash.module.ts->src/app/features/splash/splash.component.ts - + src/app/features/stats/stats.module.ts->src/app/shared/shared.module.ts @@ -1790,37 +1790,37 @@ - + src/app/features/stats/stats-routing.module.ts - + stats-routing.module.ts - + src/app/features/stats/stats.module.ts->src/app/features/stats/stats-routing.module.ts - + src/app/features/stats/stats.component.ts - + stats.component.ts - + src/app/features/stats/stats.module.ts->src/app/features/stats/stats.component.ts - + src/app/features/terms/terms.module.ts->src/app/shared/shared.module.ts @@ -1828,37 +1828,37 @@ - + src/app/features/terms/terms-routing.module.ts - + terms-routing.module.ts - + src/app/features/terms/terms.module.ts->src/app/features/terms/terms-routing.module.ts - + src/app/features/terms/terms.component.ts - + terms.component.ts - + src/app/features/terms/terms.module.ts->src/app/features/terms/terms.component.ts - + src/app/features/the-wire/the-wire.module.ts->src/app/shared/shared.module.ts @@ -1866,16 +1866,16 @@ - + src/app/features/the-wire/the-wire-routing.module.ts - + the-wire-routing.module.ts - + src/app/features/the-wire/the-wire.module.ts->src/app/features/the-wire/the-wire-routing.module.ts @@ -2108,37 +2108,37 @@ - + src/app/shared/shared.module.ts->src/app/core/services/translations.service.ts - + src/app/shared/shared.module.ts->src/app/shared/components/forbidden/forbidden.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/not-found/not-found.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/unauthorized/unauthorized.component.ts - + src/app/shared/shared.module.ts->src/app/core/helpers/typescript-loader.ts - + src/app/shared/shared.module.ts->src/app/app.module.ts @@ -2146,316 +2146,316 @@ - + src/app/shared/components/banner/banner.component.ts - + banner.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/banner/banner.component.ts - + src/app/shared/pipes/form-control/form-control.pipe.ts - + form-control.pipe.ts - + src/app/shared/shared.module.ts->src/app/shared/pipes/form-control/form-control.pipe.ts - + src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.ts - + truncate-file-name.pipe.ts - + src/app/shared/shared.module.ts->src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.ts - + src/app/shared/components/blog-form/blog-form.component.ts - + blog-form.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/blog-form/blog-form.component.ts - + src/app/shared/components/button/button.component.ts - + button.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/button/button.component.ts - + src/app/shared/components/calendar-button/calendar-button.component.ts - + calendar-button.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/calendar-button/calendar-button.component.ts - + src/app/shared/components/editor/editor.component.ts - + editor.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/editor/editor.component.ts - + src/app/shared/factories/editor-config.factory.ts - + editor-config.factory.ts - + src/app/shared/shared.module.ts->src/app/shared/factories/editor-config.factory.ts - + src/app/shared/components/editor/menu/editor-menu/editor-menu.component.ts - + editor-menu.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/editor/menu/editor-menu/editor-menu.component.ts - + src/app/shared/components/event-form/event-form.component.ts - + event-form.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/event-form/event-form.component.ts - + src/app/shared/components/file-select/file-select.component.ts - + file-select.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/file-select/file-select.component.ts - + src/app/shared/components/footer/footer.component.ts - + footer.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/footer/footer.component.ts - + src/app/shared/components/header/header.component.ts - + header.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/header/header.component.ts - + src/app/shared/components/input/input.component.ts - + input.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/input/input.component.ts - + src/app/shared/components/language-selector/language-selector.component.ts - + language-selector.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/language-selector/language-selector.component.ts - + src/app/shared/components/list/list.component.ts - + list.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/list/list.component.ts - + src/app/shared/components/page-title/page-title.component.ts - + page-title.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/page-title/page-title.component.ts - + src/app/shared/components/poll-form/poll-form.component.ts - + poll-form.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/poll-form/poll-form.component.ts - + src/app/shared/components/post-form/post-form.component.ts - + post-form.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/post-form/post-form.component.ts - + src/app/shared/components/profile-pic/profile-pic.component.ts - + profile-pic.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/profile-pic/profile-pic.component.ts - + src/app/shared/pipes/form-group/form-group.pipe.ts - + form-group.pipe.ts - + src/app/shared/shared.module.ts->src/app/shared/pipes/form-group/form-group.pipe.ts @@ -2656,7 +2656,7 @@ - + src/app/features/news-feed/models/INewsItem.ts->src/app/core/models/person.model.ts @@ -2866,13 +2866,13 @@ - + src/app/features/events/components/event-card/event-card.component.ts->src/app/core/constants/routes.constants.ts - + src/app/features/events/components/event-card/event-card.component.ts->src/app/core/services/translations.service.ts @@ -2883,50 +2883,65 @@ - + +src/app/features/events/models/eventcardview.ts + + +eventcardview.ts + + + + + +src/app/features/events/components/event-card/event-card.component.ts->src/app/features/events/models/eventcardview.ts + + + + + src/app/shared/models/material-button-type.ts - + material-button-type.ts - + src/app/features/events/components/event-card/event-card.component.ts->src/app/shared/models/material-button-type.ts - + src/app/shared/models/tooltip-direction.ts - + tooltip-direction.ts - + src/app/features/events/components/event-card/event-card.component.ts->src/app/shared/models/tooltip-direction.ts - + src/app/features/events/models/event.ts->src/app/core/models/person.model.ts - + src/app/features/events/models/event.ts->src/app/core/models/location.model.ts - + src/app/features/events/models/event.ts->src/app/features/groups/models/group.ts @@ -2971,19 +2986,19 @@ - + src/app/features/groups/components/group-card/group-card.component.ts->src/app/core/constants/routes.constants.ts - + src/app/features/groups/components/group-card/group-card.component.ts->src/app/core/services/translations.service.ts - + src/app/features/groups/components/group-card/group-card.component.ts->src/app/features/groups/models/group.ts @@ -3085,37 +3100,37 @@ - + src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/core/services/translations.service.ts - + src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/core/models/blog.model.ts - + src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/features/news-feed/models/INewsItem.ts - + src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/core/models/poll.model.ts - + src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/core/models/post.model.ts - + src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/shared/models/material-button-type.ts @@ -3136,31 +3151,31 @@ - + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/core/constants/routes.constants.ts - + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/core/services/translations.service.ts - + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/core/models/person.model.ts - + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/shared/models/material-button-type.ts - + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/shared/models/tooltip-direction.ts @@ -3334,1683 +3349,1689 @@ - + src/app/features/events/components/event-list/event-list.component.spec.ts - + event-list.component.spec.ts - + src/app/features/events/components/event-list/event-list.component.spec.ts->src/app/features/events/components/event-list/event-list.component.ts - + src/app/features/events/components/event-list/event-list.component.ts->src/app/features/events/models/event.ts - - + + + + + +src/app/features/events/components/event-list/event-list.component.ts->src/app/features/events/models/eventcardview.ts + + - + src/app/features/events/components/event/event.component.spec.ts - + event.component.spec.ts - + src/app/features/events/components/event/event.component.spec.ts->src/app/core/helpers/typescript-loader.ts - + src/app/features/events/components/event/event.component.spec.ts->src/app/features/events/components/event/event.component.ts - + src/app/features/events/components/event/event.component.ts->src/app/core/constants/routes.constants.ts - + src/app/features/events/components/event/event.component.ts->src/app/core/services/translations.service.ts - + src/app/features/events/components/event/event.component.ts->src/app/core/services/event.service.ts - + src/app/features/events/components/event/event.component.ts->src/app/features/events/models/event.ts - - + + - + src/app/features/events/components/event/event.component.ts->src/app/shared/models/material-button-type.ts - + src/app/features/events/components/event/event.component.ts->src/app/shared/models/tooltip-direction.ts - + src/app/features/events/components/event/event.component.ts->src/app/shared/components/banner/banner.component.ts - + src/app/shared/models/input-type.ts - + input-type.ts - + src/app/features/events/components/event/event.component.ts->src/app/shared/models/input-type.ts - + src/app/features/events/events-routing.module.ts->src/app/core/services/translations.service.ts - + src/app/features/events/events-routing.module.ts->src/app/features/events/events.component.ts - + src/app/features/events/events-routing.module.ts->src/app/features/events/components/event/event.component.ts - + src/app/features/events/events.component.spec.ts - + events.component.spec.ts - + src/app/features/events/events.component.spec.ts->src/app/features/events/events.component.ts - + src/app/features/events/resolvers/event.resolver.ts - + event.resolver.ts - + src/app/features/events/resolvers/event.resolver.ts->src/app/core/services/event.service.ts - + src/app/features/events/resolvers/event.resolver.ts->src/app/features/events/models/event.ts - - + + - + src/app/features/friends/friends.component.ts - + friends.component.ts - + src/app/features/friends/friends-routing.module.ts->src/app/features/friends/friends.component.ts - + src/app/features/friends/friends.component.spec.ts - + friends.component.spec.ts - + src/app/features/friends/friends.component.spec.ts->src/app/features/friends/friends.component.ts - + src/app/features/groups/components/group-card/group-card.component.spec.ts - + group-card.component.spec.ts - + src/app/features/groups/components/group-card/group-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - + src/app/features/groups/components/group-card/group-card.component.spec.ts->src/app/features/groups/components/group-card/group-card.component.ts - + src/app/features/groups/components/group-list/group-list.component.spec.ts - + group-list.component.spec.ts - + src/app/features/groups/components/group-list/group-list.component.spec.ts->src/app/features/groups/components/group-list/group-list.component.ts - + src/app/features/groups/components/group-list/group-list.component.ts->src/app/features/groups/models/group.ts - + src/app/features/groups/components/group/group.component.spec.ts - + group.component.spec.ts - + src/app/features/groups/components/group/group.component.spec.ts->src/app/features/groups/components/group/group.component.ts - + src/app/features/groups/groups-routing.module.ts->src/app/core/services/translations.service.ts - + src/app/features/groups/groups-routing.module.ts->src/app/features/groups/groups.component.ts - + src/app/features/groups/groups-routing.module.ts->src/app/features/groups/components/group/group.component.ts - + src/app/features/groups/groups.component.spec.ts - + groups.component.spec.ts - + src/app/features/groups/groups.component.spec.ts->src/app/features/groups/groups.component.ts - + src/app/features/home/home-routing.module.ts->src/app/features/home/home.component.ts - + src/app/features/home/home.component.ts->src/app/core/constants/routes.constants.ts - + src/app/features/home/home.component.ts->src/app/core/services/translations.service.ts - + src/app/features/home/home.component.ts->src/app/core/models/person.model.ts - + src/app/features/home/home.component.ts->src/app/features/news-feed/models/INewsItem.ts - + src/app/features/home/home.component.ts->src/app/core/services/event.service.ts - + src/app/features/home/home.component.ts->src/app/core/services/group.service.ts - + src/app/features/home/home.component.ts->src/app/core/services/people.service.ts - + src/app/features/home/home.component.ts->src/app/features/events/models/event.ts - + src/app/features/home/home.component.ts->src/app/features/groups/models/group.ts - + src/app/features/home/home.component.ts->src/app/core/services/news.service.ts - + src/app/features/home/home.component.ts->src/app/shared/models/input-type.ts - + src/app/features/home/home.component.spec.ts - + home.component.spec.ts - + src/app/features/home/home.component.spec.ts->src/app/core/helpers/typescript-loader.ts - + src/app/features/home/home.component.spec.ts->src/app/features/home/home.component.ts - + src/app/features/invite/invite.component.ts - + invite.component.ts - + src/app/features/invite/invite-routing.module.ts->src/app/features/invite/invite.component.ts - + src/app/features/invite/invite.component.spec.ts - + invite.component.spec.ts - + src/app/features/invite/invite.component.spec.ts->src/app/features/invite/invite.component.ts - + src/app/features/login/login-routing.module.ts->src/app/features/login/login.component.ts - + src/app/features/login/login.component.ts->src/app/core/services/translations.service.ts - + src/app/features/login/login.component.spec.ts - + login.component.spec.ts - + src/app/features/login/login.component.spec.ts->src/app/core/helpers/typescript-loader.ts - + src/app/features/login/login.component.spec.ts->src/app/features/login/login.component.ts - + src/app/features/members/members.component.ts - + members.component.ts - + src/app/features/members/members-routing.module.ts->src/app/features/members/members.component.ts - + src/app/features/members/members.component.spec.ts - + members.component.spec.ts - + src/app/features/members/members.component.spec.ts->src/app/features/members/members.component.ts - + src/app/features/messages/messages.component.ts - + messages.component.ts - + src/app/features/messages/messages-routing.module.ts->src/app/features/messages/messages.component.ts - + src/app/features/messages/messages.component.spec.ts - + messages.component.spec.ts - + src/app/features/messages/messages.component.spec.ts->src/app/features/messages/messages.component.ts - + src/app/features/missions/missions.component.ts - + missions.component.ts - + src/app/features/missions/missions-routing.module.ts->src/app/features/missions/missions.component.ts - + src/app/features/missions/missions.component.spec.ts - + missions.component.spec.ts - + src/app/features/missions/missions.component.spec.ts->src/app/features/missions/missions.component.ts - + src/app/features/news-feed/components/news-card/news-card.component.spec.ts - + news-card.component.spec.ts - + src/app/features/news-feed/components/news-card/news-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - + src/app/features/news-feed/components/news-card/news-card.component.spec.ts->src/app/features/news-feed/components/news-card/news-card.component.ts - + src/app/features/news-feed/components/news-list/news-list.component.spec.ts - + news-list.component.spec.ts - + src/app/features/news-feed/components/news-list/news-list.component.spec.ts->src/app/features/news-feed/components/news-list/news-list.component.ts - + src/app/features/news-feed/components/news-list/news-list.component.ts->src/app/features/news-feed/models/INewsItem.ts - + src/app/features/news-feed/news-feed.component.ts - + news-feed.component.ts - + src/app/features/news-feed/news-feed-routing.module.ts->src/app/features/news-feed/news-feed.component.ts - + src/app/features/news-feed/news-feed.component.spec.ts - + news-feed.component.spec.ts - + src/app/features/news-feed/news-feed.component.spec.ts->src/app/features/news-feed/news-feed.component.ts - + src/app/features/privacy/privacy-routing.module.ts->src/app/features/privacy/privacy.component.ts - + src/app/features/privacy/privacy.component.spec.ts - + privacy.component.spec.ts - + src/app/features/privacy/privacy.component.spec.ts->src/app/features/privacy/privacy.component.ts - + src/app/features/profile/components/post/post.component.spec.ts - + post.component.spec.ts - + src/app/features/profile/components/post/post.component.spec.ts->src/app/core/helpers/typescript-loader.ts - + src/app/features/profile/components/post/post.component.spec.ts->src/app/features/profile/components/post/post.component.ts - + src/app/features/profile/components/post/post.component.ts->src/app/core/services/translations.service.ts - + src/app/features/profile/components/post/post.component.ts->src/app/core/services/session-storage.service.ts - + src/app/features/profile/components/post/post.component.ts->src/app/core/models/person.model.ts - + src/app/features/profile/components/profile-card/profile-card.component.spec.ts - + profile-card.component.spec.ts - + src/app/features/profile/components/profile-card/profile-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - + src/app/features/profile/components/profile-card/profile-card.component.spec.ts->src/app/features/profile/components/profile-card/profile-card.component.ts - + src/app/features/profile/components/profile-list/profile-list.component.spec.ts - + profile-list.component.spec.ts - + src/app/features/profile/components/profile-list/profile-list.component.spec.ts->src/app/features/profile/components/profile-list/profile-list.component.ts - + src/app/features/profile/components/profile-list/profile-list.component.ts->src/app/core/models/person.model.ts - + src/app/features/profile/profile.component.ts - + profile.component.ts - + src/app/features/profile/profile-routing.module.ts->src/app/features/profile/profile.component.ts - + src/app/features/profile/profile.component.spec.ts - + profile.component.spec.ts - + src/app/features/profile/profile.component.spec.ts->src/app/features/profile/profile.component.ts - + src/app/features/register/register-routing.module.ts->src/app/features/register/register.component.ts - + src/app/features/register/register.component.spec.ts - + register.component.spec.ts - + src/app/features/register/register.component.spec.ts->src/app/features/register/register.component.ts - + src/app/features/search/search.component.ts - + search.component.ts - + src/app/features/search/search-routing.module.ts->src/app/features/search/search.component.ts - + src/app/features/search/search.component.spec.ts - + search.component.spec.ts - + src/app/features/search/search.component.spec.ts->src/app/features/search/search.component.ts - + src/app/features/settings/settings.component.ts - + settings.component.ts - + src/app/features/settings/settings-routing.module.ts->src/app/features/settings/settings.component.ts - + src/app/features/settings/settings.component.spec.ts - + settings.component.spec.ts - + src/app/features/settings/settings.component.spec.ts->src/app/features/settings/settings.component.ts - + src/app/features/splash/splash-routing.module.ts->src/app/features/splash/splash.component.ts - + src/app/features/splash/splash.component.spec.ts - + splash.component.spec.ts - + src/app/features/splash/splash.component.spec.ts->src/app/features/splash/splash.component.ts - + src/app/features/stats/stats-routing.module.ts->src/app/features/stats/stats.component.ts - + src/app/features/stats/stats.component.spec.ts - + stats.component.spec.ts - + src/app/features/stats/stats.component.spec.ts->src/app/features/stats/stats.component.ts - + src/app/features/terms/terms-routing.module.ts->src/app/features/terms/terms.component.ts - + src/app/features/terms/terms.component.spec.ts - + terms.component.spec.ts - + src/app/features/terms/terms.component.spec.ts->src/app/features/terms/terms.component.ts - + src/app/features/the-wire/the-wire.component.ts - + the-wire.component.ts - + src/app/features/the-wire/the-wire-routing.module.ts->src/app/features/the-wire/the-wire.component.ts - + src/app/features/the-wire/the-wire.component.spec.ts - + the-wire.component.spec.ts - + src/app/features/the-wire/the-wire.component.spec.ts->src/app/features/the-wire/the-wire.component.ts - + src/app/shared/components/banner/banner.component.spec.ts - + banner.component.spec.ts - + src/app/shared/components/banner/banner.component.spec.ts->src/app/shared/components/banner/banner.component.ts - + src/app/shared/components/blog-form/blog-form.component.spec.ts - + blog-form.component.spec.ts - + src/app/shared/components/blog-form/blog-form.component.spec.ts->src/app/core/helpers/typescript-loader.ts - + src/app/shared/components/blog-form/blog-form.component.spec.ts->src/app/shared/pipes/form-control/form-control.pipe.ts - + src/app/shared/components/blog-form/blog-form.component.spec.ts->src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.ts - + src/app/shared/components/blog-form/blog-form.component.spec.ts->src/app/shared/components/blog-form/blog-form.component.ts - + src/app/shared/components/blog-form/blog-form.component.ts->src/app/core/services/translations.service.ts - + src/app/shared/components/button/button.component.spec.ts - + button.component.spec.ts - + src/app/shared/components/button/button.component.spec.ts->src/app/shared/components/button/button.component.ts - + src/app/shared/components/button/button.component.ts->src/app/shared/models/material-button-type.ts - + src/app/shared/components/button/button.component.ts->src/app/shared/models/tooltip-direction.ts - + src/app/shared/models/button-type.ts - + button-type.ts - + src/app/shared/components/button/button.component.ts->src/app/shared/models/button-type.ts - + src/app/shared/models/material-color.ts - + material-color.ts - + src/app/shared/components/button/button.component.ts->src/app/shared/models/material-color.ts - + src/app/shared/models/theme.ts - + theme.ts - + src/app/shared/components/button/button.component.ts->src/app/shared/models/theme.ts - + src/app/shared/components/calendar-button/calendar-button.component.spec.ts - + calendar-button.component.spec.ts - + src/app/shared/components/calendar-button/calendar-button.component.spec.ts->src/app/core/helpers/typescript-loader.ts - + src/app/shared/components/calendar-button/calendar-button.component.spec.ts->src/app/shared/components/calendar-button/calendar-button.component.ts - + src/app/shared/components/calendar-button/calendar-button.component.ts->src/app/core/services/translations.service.ts - + src/app/shared/components/calendar-button/calendar-button.component.ts->src/app/shared/models/tooltip-direction.ts - + src/app/shared/components/editor/editor.component.spec.ts - + editor.component.spec.ts - + src/app/shared/components/editor/editor.component.spec.ts->src/app/core/helpers/typescript-loader.ts - + src/app/shared/components/editor/editor.component.spec.ts->src/app/shared/components/editor/editor.component.ts - + src/app/shared/components/editor/editor.component.ts->src/app/core/services/translations.service.ts - + src/app/shared/components/editor/editor.component.ts->src/app/shared/models/tooltip-direction.ts - + src/app/shared/components/editor/editor.component.ts->src/app/shared/factories/editor-config.factory.ts - + src/app/shared/factories/editor-config.factory.ts->src/app/core/services/translations.service.ts - + src/app/shared/components/event-form/event-form.component.spec.ts - + event-form.component.spec.ts - + src/app/shared/components/event-form/event-form.component.spec.ts->src/app/core/helpers/typescript-loader.ts - + src/app/shared/components/event-form/event-form.component.spec.ts->src/app/shared/pipes/form-control/form-control.pipe.ts - + src/app/shared/components/event-form/event-form.component.spec.ts->src/app/shared/components/event-form/event-form.component.ts - + src/app/shared/components/event-form/event-form.component.ts->src/app/core/services/translations.service.ts - + src/app/shared/components/file-select/file-select.component.spec.ts - + file-select.component.spec.ts - + src/app/shared/components/file-select/file-select.component.spec.ts->src/app/core/helpers/typescript-loader.ts - + src/app/shared/components/file-select/file-select.component.spec.ts->src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.ts - + src/app/shared/components/file-select/file-select.component.spec.ts->src/app/shared/components/file-select/file-select.component.ts - + src/app/shared/components/file-select/file-select.component.ts->src/app/core/services/translations.service.ts - + src/app/shared/components/file-select/file-select.component.ts->src/app/core/services/focus-tracking.service.ts - + src/app/shared/components/file-select/file-select.component.ts->src/app/shared/models/tooltip-direction.ts - + src/app/shared/components/file-select/file-select.component.ts->src/app/shared/models/theme.ts - + src/app/shared/components/footer/footer.component.spec.ts - + footer.component.spec.ts - + src/app/shared/components/footer/footer.component.spec.ts->src/app/core/helpers/typescript-loader.ts - + src/app/shared/components/footer/footer.component.spec.ts->src/app/shared/components/footer/footer.component.ts - + src/app/shared/components/footer/footer.component.ts->src/app/core/constants/routes.constants.ts - + src/app/shared/components/footer/footer.component.ts->src/app/core/services/translations.service.ts - + src/app/shared/components/forbidden/forbidden.component.spec.ts - + forbidden.component.spec.ts - + src/app/shared/components/forbidden/forbidden.component.spec.ts->src/app/shared/components/forbidden/forbidden.component.ts - + src/app/shared/components/header/header.component.spec.ts - + header.component.spec.ts - + src/app/shared/components/header/header.component.spec.ts->src/app/core/helpers/typescript-loader.ts - + src/app/shared/components/header/header.component.spec.ts->src/app/shared/components/header/header.component.ts - + src/app/shared/components/header/header.component.ts->src/app/core/constants/routes.constants.ts - + src/app/shared/components/header/header.component.ts->src/app/core/services/translations.service.ts - + src/app/shared/components/header/header.component.ts->src/app/core/models/person.model.ts - + src/app/shared/components/header/header.component.ts->src/app/core/services/people.service.ts - + src/app/shared/components/header/header.component.ts->src/app/shared/models/material-button-type.ts - + src/app/shared/components/input/input.component.spec.ts - + input.component.spec.ts - + src/app/shared/components/input/input.component.spec.ts->src/app/shared/components/input/input.component.ts - + src/app/shared/components/input/input.component.ts->src/app/core/services/translations.service.ts - + src/app/shared/components/input/input.component.ts->src/app/shared/models/material-button-type.ts - + src/app/shared/components/input/input.component.ts->src/app/shared/models/tooltip-direction.ts - + src/app/shared/components/input/input.component.ts->src/app/shared/models/input-type.ts - + src/app/shared/components/input/input.component.ts->src/app/shared/models/theme.ts - + src/app/shared/components/language-selector/language-selector.component.spec.ts - + language-selector.component.spec.ts - + src/app/shared/components/language-selector/language-selector.component.spec.ts->src/app/core/helpers/typescript-loader.ts - + src/app/shared/components/language-selector/language-selector.component.spec.ts->src/app/shared/components/language-selector/language-selector.component.ts - + src/app/shared/components/language-selector/language-selector.component.ts->src/app/core/services/translations.service.ts - + src/app/shared/components/language-selector/language-selector.component.ts->src/app/shared/models/material-button-type.ts - + src/app/shared/components/language-selector/language-selector.component.ts->src/app/shared/models/theme.ts - + src/app/shared/models/language.ts - + language.ts - + src/app/shared/components/language-selector/language-selector.component.ts->src/app/shared/models/language.ts - + src/app/shared/components/list/list.component.spec.ts - + list.component.spec.ts - + src/app/shared/components/list/list.component.spec.ts->src/app/shared/components/list/list.component.ts - + src/app/shared/components/list/list.component.ts->src/app/core/interfaces/list-service.interface.ts - + src/app/shared/components/not-found/not-found.component.spec.ts - + not-found.component.spec.ts - + src/app/shared/components/not-found/not-found.component.spec.ts->src/app/shared/components/not-found/not-found.component.ts - + src/app/shared/components/page-title/page-title.component.spec.ts - + page-title.component.spec.ts - + src/app/shared/components/page-title/page-title.component.spec.ts->src/app/core/helpers/typescript-loader.ts - + src/app/shared/components/page-title/page-title.component.spec.ts->src/app/shared/components/page-title/page-title.component.ts - + src/app/shared/components/poll-form/poll-form.component.spec.ts - + poll-form.component.spec.ts - + src/app/shared/components/poll-form/poll-form.component.spec.ts->src/app/core/helpers/typescript-loader.ts - + src/app/shared/components/poll-form/poll-form.component.spec.ts->src/app/shared/pipes/form-control/form-control.pipe.ts - + src/app/shared/components/poll-form/poll-form.component.spec.ts->src/app/shared/components/poll-form/poll-form.component.ts - + src/app/shared/components/poll-form/poll-form.component.ts->src/app/core/services/translations.service.ts - + src/app/shared/components/poll-form/poll-form.component.ts->src/app/shared/models/tooltip-direction.ts - + src/app/shared/components/post-form/post-form.component.spec.ts - + post-form.component.spec.ts - + src/app/shared/components/post-form/post-form.component.spec.ts->src/app/core/helpers/typescript-loader.ts - + src/app/shared/components/post-form/post-form.component.spec.ts->src/app/shared/pipes/form-control/form-control.pipe.ts - + src/app/shared/components/post-form/post-form.component.spec.ts->src/app/shared/components/post-form/post-form.component.ts - + src/app/shared/components/post-form/post-form.component.ts->src/app/core/services/translations.service.ts - + src/app/shared/components/profile-pic/profile-pic.component.spec.ts - + profile-pic.component.spec.ts - + src/app/shared/components/profile-pic/profile-pic.component.spec.ts->src/app/core/helpers/typescript-loader.ts - + src/app/shared/components/profile-pic/profile-pic.component.spec.ts->src/app/shared/components/profile-pic/profile-pic.component.ts - + src/app/shared/components/profile-pic/profile-pic.component.ts->src/app/core/constants/routes.constants.ts - + src/app/shared/components/profile-pic/profile-pic.component.ts->src/app/core/services/translations.service.ts - + src/app/shared/components/profile-pic/profile-pic.component.ts->src/app/core/models/person.model.ts - + src/app/shared/components/unauthorized/unauthorized.component.spec.ts - + unauthorized.component.spec.ts - + src/app/shared/components/unauthorized/unauthorized.component.spec.ts->src/app/shared/components/unauthorized/unauthorized.component.ts - + src/app/shared/pipes/form-control/form-control.pipe.spec.ts - + form-control.pipe.spec.ts - + src/app/shared/pipes/form-control/form-control.pipe.spec.ts->src/app/shared/pipes/form-control/form-control.pipe.ts - + src/app/shared/pipes/form-group/form-group.pipe.spec.ts - + form-group.pipe.spec.ts - + src/app/shared/pipes/form-group/form-group.pipe.spec.ts->src/app/shared/pipes/form-group/form-group.pipe.ts - + src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.spec.ts - + truncate-file-name.pipe.spec.ts - + src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.spec.ts->src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.ts - + src/assets/i18n/translations.fr.ts - + translations.fr.ts - + src/assets/i18n/translations.fr.ts->src/assets/i18n/translations.en.ts - + src/environments/environment.pr.ts - + environment.pr.ts - + src/environments/environment.prod.ts - + environment.prod.ts - + src/main.ts - + main.ts - + src/main.ts->src/app/app.module.ts - + src/main.ts->src/environments/environment.ts - + src/polyfills.ts - + polyfills.ts - + src/test.ts - + test.ts From ef1fa436a649ec3b6c27c35969e363742724474c Mon Sep 17 00:00:00 2001 From: doug0102 Date: Fri, 24 Nov 2023 14:26:35 -0500 Subject: [PATCH 096/165] wip list paging --- src/app/features/home/home.component.html | 2 + src/app/features/home/home.component.scss | 5 ++ .../components/list/list.component.html | 27 ++++++++-- .../components/list/list.component.scss | 15 ++++++ .../shared/components/list/list.component.ts | 51 ++++++++++++++++--- 5 files changed, 91 insertions(+), 9 deletions(-) diff --git a/src/app/features/home/home.component.html b/src/app/features/home/home.component.html index 71793468..997ae786 100644 --- a/src/app/features/home/home.component.html +++ b/src/app/features/home/home.component.html @@ -24,6 +24,8 @@ + + diff --git a/src/app/features/home/home.component.scss b/src/app/features/home/home.component.scss index 10d13d1a..6c465fa5 100644 --- a/src/app/features/home/home.component.scss +++ b/src/app/features/home/home.component.scss @@ -35,4 +35,9 @@ section:not(:last-child) { padding-bottom: 44px; } + + app-news-list { + padding-top: 40px; + display: block; + } } \ No newline at end of file diff --git a/src/app/shared/components/list/list.component.html b/src/app/shared/components/list/list.component.html index f9ca32f5..a7345d23 100644 --- a/src/app/shared/components/list/list.component.html +++ b/src/app/shared/components/list/list.component.html @@ -1,8 +1,29 @@
-
+ [ngStyle]="{'flex-direction': orientation === Orientations.Vertical ? 'column' : 'row', + 'columnGap': columnGap + 'px', + 'rowGap': rowGap + 'px'}"> + +
+ + + +
+ +
+ inputs: { model: item, loading: loading && currentPage === lastPage};">
+ +
+ + + +
diff --git a/src/app/shared/components/list/list.component.scss b/src/app/shared/components/list/list.component.scss index 4ae49087..7a47779b 100644 --- a/src/app/shared/components/list/list.component.scss +++ b/src/app/shared/components/list/list.component.scss @@ -1,6 +1,21 @@ :host { + //display: flex; + .gcc-list-container { display: flex; overflow: visible; + flex-wrap: wrap; + } + + .gcc-list-item { + flex-grow: 1; + } + + .gcc-list-previous, + .gcc-list-next { + display: flex; + align-items: center; + flex-direction: column; + margin: auto; } } \ No newline at end of file diff --git a/src/app/shared/components/list/list.component.ts b/src/app/shared/components/list/list.component.ts index a7787dbf..22ed1b39 100644 --- a/src/app/shared/components/list/list.component.ts +++ b/src/app/shared/components/list/list.component.ts @@ -13,24 +13,63 @@ export class ListComponent implements OnInit { @Input() items: typeof this.service.dataType[] = []; @Input() cardSize: CardSize | string = CardSize.Small; // TODO: Card size on all card components. Make a base component or interface that gets implemented. @Input() orientation: Orientation | string = Orientation.Vertical; - @Input() loadItems: number = 3; - @Input() gap: number = 40; + @Input() pageSize: number = 10; + @Input() loadTime: number = 5000; + @Input() columnGap: number = 10; + @Input() rowGap: number = 40; + currentPage: number = 1; + lastPage: number = this.currentPage; loading: boolean = true; Orientations = Orientation; + nextPageCallback: Function = this.nextPage.bind(this); + previousPageCallback: Function = this.previousPage.bind(this); + constructor() { } ngOnInit(): void { if (this.items.length === 0) { - this.service?.getMany(10, 5000).subscribe((items: typeof this.service.dataType[]) => { - this.items = items; - this.loading = false; - }); + this.loadNext(); } } + + loadNext(): void { + this.loading = true; + + this.service?.getMany(this.pageSize, this.loadTime).subscribe((items: typeof this.service.dataType[]) => { + this.items.push(...items); + this.loading = false; + }); + } + + nextPage(): void { + this.lastPage = ++this.currentPage; + + if (this.pageSize * this.currentPage > this.items.length) + this.loadNext(); + } + + previousPage(): void { + if (this.currentPage > 1) + this.currentPage--; + } + + get startIndex(): number { + return (this.currentPage - 1) * this.pageSize; + } + + get endIndex(): number { + return this.startIndex + this.pageSize; + } + + get paginatedItems(): any[] { + return this.loading && this.currentPage === this.lastPage + ? this.items.slice(0, this.pageSize) + : this.items.slice(this.startIndex, this.endIndex); + } } export enum Orientation { From 04aabfe3526f228fc3a27c85808727b0963fe710 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Mon, 27 Nov 2023 16:15:08 -0500 Subject: [PATCH 097/165] list paging boolean --- src/app/features/home/home.component.html | 2 -- src/app/shared/components/list/list.component.html | 6 +++--- src/app/shared/components/list/list.component.scss | 2 +- src/app/shared/components/list/list.component.ts | 6 +++++- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/app/features/home/home.component.html b/src/app/features/home/home.component.html index 997ae786..71793468 100644 --- a/src/app/features/home/home.component.html +++ b/src/app/features/home/home.component.html @@ -24,8 +24,6 @@ - - diff --git a/src/app/shared/components/list/list.component.html b/src/app/shared/components/list/list.component.html index a7345d23..98432210 100644 --- a/src/app/shared/components/list/list.component.html +++ b/src/app/shared/components/list/list.component.html @@ -1,9 +1,9 @@ -
-
+
-
+
Date: Mon, 27 Nov 2023 16:24:29 -0500 Subject: [PATCH 098/165] card size for list --- .../core/interfaces/card-component.interface.ts | 7 +++++++ .../components/group-card/group-card.component.ts | 5 ++++- .../components/news-card/news-card.component.ts | 5 ++++- .../profile-card/profile-card.component.ts | 5 ++++- src/app/shared/components/list/list.component.ts | 14 ++------------ src/app/shared/models/card-size.ts | 6 ++++++ src/app/shared/models/orientation.ts | 4 ++++ 7 files changed, 31 insertions(+), 15 deletions(-) create mode 100644 src/app/core/interfaces/card-component.interface.ts create mode 100644 src/app/shared/models/card-size.ts create mode 100644 src/app/shared/models/orientation.ts diff --git a/src/app/core/interfaces/card-component.interface.ts b/src/app/core/interfaces/card-component.interface.ts new file mode 100644 index 00000000..27fadbd9 --- /dev/null +++ b/src/app/core/interfaces/card-component.interface.ts @@ -0,0 +1,7 @@ +import { CardSize } from "src/app/shared/models/card-size"; + +export interface ICardComponent { + model?: any; + cardSize: CardSize + loading: boolean; +} \ No newline at end of file diff --git a/src/app/features/groups/components/group-card/group-card.component.ts b/src/app/features/groups/components/group-card/group-card.component.ts index 794c1255..2be78e15 100644 --- a/src/app/features/groups/components/group-card/group-card.component.ts +++ b/src/app/features/groups/components/group-card/group-card.component.ts @@ -3,6 +3,8 @@ import { Group } from '../../models/group'; import { Translations } from 'src/app/core/services/translations.service'; import { Router } from '@angular/router'; import { CoreRoutes } from 'src/app/core/constants/routes.constants'; +import { ICardComponent } from 'src/app/core/interfaces/card-component.interface'; +import { CardSize } from 'src/app/shared/models/card-size'; @Component({ selector: 'app-group-card', @@ -10,8 +12,9 @@ import { CoreRoutes } from 'src/app/core/constants/routes.constants'; styleUrls: ['./group-card.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush }) - export class GroupCardComponent { + export class GroupCardComponent implements ICardComponent { @Input() model?: Group; + @Input() cardSize: CardSize = CardSize.Small; @Input() loading: boolean = false; routes = CoreRoutes; diff --git a/src/app/features/news-feed/components/news-card/news-card.component.ts b/src/app/features/news-feed/components/news-card/news-card.component.ts index a0f7c983..449013db 100644 --- a/src/app/features/news-feed/components/news-card/news-card.component.ts +++ b/src/app/features/news-feed/components/news-card/news-card.component.ts @@ -6,6 +6,8 @@ import { Translations } from 'src/app/core/services/translations.service'; import { Post } from 'src/app/core/models/post.model'; import { Blog } from 'src/app/core/models/blog.model'; import { Poll } from 'src/app/core/models/poll.model'; +import { ICardComponent } from 'src/app/core/interfaces/card-component.interface'; +import { CardSize } from 'src/app/shared/models/card-size'; @Component({ selector: 'app-news-card', @@ -13,9 +15,10 @@ import { Poll } from 'src/app/core/models/poll.model'; styleUrls: ['./news-card.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush }) -export class NewsCardComponent { +export class NewsCardComponent implements ICardComponent { @Input() model?: INewsItem; + @Input() cardSize: CardSize = CardSize.Large; @Input() loading: boolean = false; liked: boolean = false; diff --git a/src/app/features/profile/components/profile-card/profile-card.component.ts b/src/app/features/profile/components/profile-card/profile-card.component.ts index 544ba8a3..0c364944 100644 --- a/src/app/features/profile/components/profile-card/profile-card.component.ts +++ b/src/app/features/profile/components/profile-card/profile-card.component.ts @@ -1,8 +1,10 @@ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core'; import { Router } from '@angular/router'; import { CoreRoutes } from 'src/app/core/constants/routes.constants'; +import { ICardComponent } from 'src/app/core/interfaces/card-component.interface'; import { Person } from 'src/app/core/models/person.model'; import { Translations } from 'src/app/core/services/translations.service'; +import { CardSize } from 'src/app/shared/models/card-size'; import { MaterialButtonType } from 'src/app/shared/models/material-button-type'; import { TooltipDirection } from 'src/app/shared/models/tooltip-direction'; @@ -12,8 +14,9 @@ import { TooltipDirection } from 'src/app/shared/models/tooltip-direction'; styleUrls: ['./profile-card.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush }) -export class ProfileCardComponent { +export class ProfileCardComponent implements ICardComponent { @Input() model?: Person; + @Input() cardSize: CardSize = CardSize.Small; @Input() loading: boolean = false; @Output() confirm = new EventEmitter(); diff --git a/src/app/shared/components/list/list.component.ts b/src/app/shared/components/list/list.component.ts index af30a3fc..dc70c23f 100644 --- a/src/app/shared/components/list/list.component.ts +++ b/src/app/shared/components/list/list.component.ts @@ -1,6 +1,8 @@ import { Component, Input, OnInit } from '@angular/core'; import { NgComponentOutlet } from '@angular/common'; import { IListService } from 'src/app/core/interfaces/list-service.interface'; +import { CardSize } from '../../models/card-size'; +import { Orientation } from '../../models/orientation'; @Component({ selector: 'app-list', @@ -74,16 +76,4 @@ export class ListComponent implements OnInit { ? this.items.slice(0, this.pageSize) : this.items.slice(this.startIndex, this.endIndex); } -} - -export enum Orientation { - Vertical = "vertical", - Horizontal = "horizontal" -} - -export enum CardSize { - Small = "small", - Medium = "medium", - Large = "large", - Dynamic = "dynamic" } \ No newline at end of file diff --git a/src/app/shared/models/card-size.ts b/src/app/shared/models/card-size.ts new file mode 100644 index 00000000..3fad75bd --- /dev/null +++ b/src/app/shared/models/card-size.ts @@ -0,0 +1,6 @@ +export enum CardSize { + Small = "small", + Medium = "medium", + Large = "large", + Dynamic = "dynamic" +} \ No newline at end of file diff --git a/src/app/shared/models/orientation.ts b/src/app/shared/models/orientation.ts new file mode 100644 index 00000000..40293707 --- /dev/null +++ b/src/app/shared/models/orientation.ts @@ -0,0 +1,4 @@ +export enum Orientation { + Vertical = "vertical", + Horizontal = "horizontal" +} \ No newline at end of file From 62d09f636c6b28f544d6249a616cd85ac577d555 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Mon, 27 Nov 2023 16:31:32 -0500 Subject: [PATCH 099/165] card size implementation for list --- src/app/core/interfaces/card-component.interface.ts | 2 +- .../events/components/event-card/event-card.component.html | 4 ++-- .../events/components/event-card/event-card.component.ts | 7 ++++--- .../events/components/event-list/event-list.component.html | 4 ++-- .../events/components/event-list/event-list.component.ts | 4 ++-- src/app/features/events/models/eventcardview.ts | 5 ----- src/app/features/home/home.component.html | 2 ++ src/app/shared/components/list/list.component.html | 2 +- 8 files changed, 14 insertions(+), 16 deletions(-) delete mode 100644 src/app/features/events/models/eventcardview.ts diff --git a/src/app/core/interfaces/card-component.interface.ts b/src/app/core/interfaces/card-component.interface.ts index 27fadbd9..ec31cf75 100644 --- a/src/app/core/interfaces/card-component.interface.ts +++ b/src/app/core/interfaces/card-component.interface.ts @@ -2,6 +2,6 @@ import { CardSize } from "src/app/shared/models/card-size"; export interface ICardComponent { model?: any; - cardSize: CardSize + cardSize: CardSize | string; loading: boolean; } \ No newline at end of file diff --git a/src/app/features/events/components/event-card/event-card.component.html b/src/app/features/events/components/event-card/event-card.component.html index 63226856..5dd11a7a 100644 --- a/src/app/features/events/components/event-card/event-card.component.html +++ b/src/app/features/events/components/event-card/event-card.component.html @@ -1,7 +1,7 @@ - +
- +
diff --git a/src/app/features/events/components/event-card/event-card.component.ts b/src/app/features/events/components/event-card/event-card.component.ts index 4b934512..f96f1903 100644 --- a/src/app/features/events/components/event-card/event-card.component.ts +++ b/src/app/features/events/components/event-card/event-card.component.ts @@ -5,7 +5,8 @@ import { MaterialButtonType } from 'src/app/shared/models/material-button-type'; import { Router } from '@angular/router'; import { CoreRoutes } from 'src/app/core/constants/routes.constants'; import { TooltipDirection } from 'src/app/shared/models/tooltip-direction'; -import { EventCardView } from '../../models/eventcardview'; +import { ICardComponent } from 'src/app/core/interfaces/card-component.interface'; +import { CardSize } from 'src/app/shared/models/card-size'; @Component({ selector: 'app-event-card', @@ -13,10 +14,10 @@ import { EventCardView } from '../../models/eventcardview'; styleUrls: ['./event-card.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush }) -export class EventCardComponent { +export class EventCardComponent implements ICardComponent { @Input() model?: Event; @Input() loading: boolean = false; - @Input() view: string | EventCardView = EventCardView.Small; + @Input() cardSize: CardSize | string = CardSize.Small; @Output() confirm = new EventEmitter(); @Output() decline = new EventEmitter(); diff --git a/src/app/features/events/components/event-list/event-list.component.html b/src/app/features/events/components/event-list/event-list.component.html index 0ca9ebc2..d89a5e29 100644 --- a/src/app/features/events/components/event-list/event-list.component.html +++ b/src/app/features/events/components/event-list/event-list.component.html @@ -1,7 +1,7 @@
@@ -9,7 +9,7 @@
- +
diff --git a/src/app/features/events/components/event-list/event-list.component.ts b/src/app/features/events/components/event-list/event-list.component.ts index 298fa220..98ea7d31 100644 --- a/src/app/features/events/components/event-list/event-list.component.ts +++ b/src/app/features/events/components/event-list/event-list.component.ts @@ -1,6 +1,6 @@ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core'; import { Event } from '../../models/event'; -import { EventCardView } from '../../models/eventcardview'; +import { CardSize } from 'src/app/shared/models/card-size'; @Component({ selector: 'app-event-list', @@ -12,7 +12,7 @@ export class EventListComponent { @Input() model?: Event[]; @Input() isLoading: boolean = false; @Input() loadingCount: number = 3; - @Input() view: string | EventCardView = EventCardView.Small; + @Input() cardSize: string | CardSize = CardSize.Small; @Output() confirm = new EventEmitter(); @Output() decline = new EventEmitter(); diff --git a/src/app/features/events/models/eventcardview.ts b/src/app/features/events/models/eventcardview.ts deleted file mode 100644 index 9d305067..00000000 --- a/src/app/features/events/models/eventcardview.ts +++ /dev/null @@ -1,5 +0,0 @@ - -export enum EventCardView { - Large = 'large', - Small = 'small', - } \ No newline at end of file diff --git a/src/app/features/home/home.component.html b/src/app/features/home/home.component.html index 71793468..04f60c00 100644 --- a/src/app/features/home/home.component.html +++ b/src/app/features/home/home.component.html @@ -24,6 +24,8 @@ + + diff --git a/src/app/shared/components/list/list.component.html b/src/app/shared/components/list/list.component.html index 98432210..a4d67219 100644 --- a/src/app/shared/components/list/list.component.html +++ b/src/app/shared/components/list/list.component.html @@ -14,7 +14,7 @@
+ inputs: { model: item, cardSize: cardSize, loading: loading && currentPage === lastPage};">
From 978ab5e17d6612734c67c0f41b59ecedc4ba7c15 Mon Sep 17 00:00:00 2001 From: Shea Date: Mon, 27 Nov 2023 21:33:20 +0000 Subject: [PATCH 100/165] Dependency Graph ignore-deploy --- dependency-graph.svg | 4320 +++++++++++++++++++++--------------------- 1 file changed, 2199 insertions(+), 2121 deletions(-) diff --git a/dependency-graph.svg b/dependency-graph.svg index 9a9212fe..ae648c10 100644 --- a/dependency-graph.svg +++ b/dependency-graph.svg @@ -4,280 +4,280 @@ - - + + dependency-cruiser output - + cluster_src - -src + +src cluster_src/app - -app + +app cluster_src/app/core - -core + +core cluster_src/app/core/auth - -auth + +auth cluster_src/app/core/constants - -constants + +constants cluster_src/app/core/guards - -guards + +guards cluster_src/app/core/helpers - -helpers + +helpers cluster_src/app/core/interceptors - -interceptors + +interceptors cluster_src/app/core/interfaces - -interfaces + +interfaces cluster_src/app/core/models - -models + +models cluster_src/app/core/services - -services + +services cluster_src/app/features - -features + +features cluster_src/app/features/about - -about + +about cluster_src/app/features/blog - -blog + +blog cluster_src/app/features/bookmarks - -bookmarks + +bookmarks cluster_src/app/features/dashboard - -dashboard + +dashboard cluster_src/app/features/events - -events + +events cluster_src/app/features/events/components - -components + +components cluster_src/app/features/events/components/event-card - -event-card + +event-card cluster_src/app/features/events/components/event-list - -event-list + +event-list cluster_src/app/features/events/components/event - -event + +event cluster_src/app/features/events/models - -models + +models cluster_src/app/features/events/resolvers - -resolvers + +resolvers cluster_src/app/features/friends - -friends + +friends cluster_src/app/features/groups - -groups + +groups cluster_src/app/features/groups/components - -components + +components cluster_src/app/features/groups/components/group-card - -group-card + +group-card cluster_src/app/features/groups/components/group-list - -group-list + +group-list cluster_src/app/features/groups/components/group - -group + +group cluster_src/app/features/groups/models - -models + +models cluster_src/app/features/home - -home + +home cluster_src/app/features/invite - -invite + +invite cluster_src/app/features/login - -login + +login cluster_src/app/features/members - -members + +members cluster_src/app/features/messages - -messages + +messages cluster_src/app/features/missions - -missions + +missions cluster_src/app/features/news-feed - -news-feed + +news-feed cluster_src/app/features/news-feed/components - -components + +components cluster_src/app/features/news-feed/components/news-card - -news-card + +news-card cluster_src/app/features/news-feed/components/news-list - -news-list + +news-list cluster_src/app/features/news-feed/models - -models + +models cluster_src/app/features/privacy - -privacy + +privacy cluster_src/app/features/profile - -profile + +profile cluster_src/app/features/profile/components - -components + +components cluster_src/app/features/profile/components/post - -post + +post cluster_src/app/features/profile/components/profile-card - -profile-card + +profile-card cluster_src/app/features/profile/components/profile-list - -profile-list + +profile-list cluster_src/app/features/register - -register + +register cluster_src/app/features/search - -search + +search cluster_src/app/features/settings - -settings + +settings cluster_src/app/features/splash - -splash + +splash cluster_src/app/features/stats - -stats + +stats cluster_src/app/features/terms - -terms + +terms cluster_src/app/features/the-wire - -the-wire + +the-wire cluster_src/app/shared @@ -296,8 +296,8 @@ cluster_src/app/shared/components/blog-form - -blog-form + +blog-form cluster_src/app/shared/components/button @@ -306,28 +306,28 @@ cluster_src/app/shared/components/calendar-button - -calendar-button + +calendar-button cluster_src/app/shared/components/editor - -editor + +editor cluster_src/app/shared/components/editor/menu - -menu + +menu cluster_src/app/shared/components/editor/menu/editor-menu - -editor-menu + +editor-menu cluster_src/app/shared/components/event-form - -event-form + +event-form cluster_src/app/shared/components/file-select @@ -336,8 +336,8 @@ cluster_src/app/shared/components/footer - -footer + +footer cluster_src/app/shared/components/forbidden @@ -346,18 +346,18 @@ cluster_src/app/shared/components/header - -header + +header cluster_src/app/shared/components/input - -input + +input cluster_src/app/shared/components/language-selector - -language-selector + +language-selector cluster_src/app/shared/components/list @@ -371,23 +371,23 @@ cluster_src/app/shared/components/page-title - -page-title + +page-title cluster_src/app/shared/components/poll-form - -poll-form + +poll-form cluster_src/app/shared/components/post-form - -post-form + +post-form cluster_src/app/shared/components/profile-pic - -profile-pic + +profile-pic cluster_src/app/shared/components/unauthorized @@ -396,13 +396,13 @@ cluster_src/app/shared/factories - -factories + +factories cluster_src/app/shared/models - -models + +models cluster_src/app/shared/pipes @@ -426,13 +426,13 @@ cluster_src/assets - -assets + +assets cluster_src/assets/i18n - -i18n + +i18n cluster_src/environments @@ -443,8 +443,8 @@ src/app/app-routing.module.ts - -app-routing.module.ts + +app-routing.module.ts @@ -452,482 +452,482 @@ src/app/core/constants/routes.constants.ts - -routes.constants.ts + +routes.constants.ts src/app/app-routing.module.ts->src/app/core/constants/routes.constants.ts - - + + src/app/core/guards/auth.guard.ts - -auth.guard.ts + +auth.guard.ts src/app/app-routing.module.ts->src/app/core/guards/auth.guard.ts - - + + src/app/core/guards/interceptor.guard.ts - -interceptor.guard.ts + +interceptor.guard.ts src/app/app-routing.module.ts->src/app/core/guards/interceptor.guard.ts - - + + src/app/core/guards/login.guard.ts - -login.guard.ts + +login.guard.ts src/app/app-routing.module.ts->src/app/core/guards/login.guard.ts - - + + src/app/core/guards/redirect.guard.ts - -redirect.guard.ts + +redirect.guard.ts src/app/app-routing.module.ts->src/app/core/guards/redirect.guard.ts - - + + src/app/core/services/translations.service.ts - -translations.service.ts + +translations.service.ts src/app/app-routing.module.ts->src/app/core/services/translations.service.ts - - + + src/app/features/about/about.module.ts - -about.module.ts + +about.module.ts src/app/app-routing.module.ts->src/app/features/about/about.module.ts - - - - + + + + src/app/features/blog/blog.module.ts - -blog.module.ts + +blog.module.ts src/app/app-routing.module.ts->src/app/features/blog/blog.module.ts - - - - + + + + src/app/features/bookmarks/bookmarks.module.ts - -bookmarks.module.ts + +bookmarks.module.ts src/app/app-routing.module.ts->src/app/features/bookmarks/bookmarks.module.ts - - - - + + + + src/app/features/dashboard/dashboard.module.ts - -dashboard.module.ts + +dashboard.module.ts src/app/app-routing.module.ts->src/app/features/dashboard/dashboard.module.ts - - - - + + + + src/app/features/events/events.module.ts - -events.module.ts + +events.module.ts src/app/app-routing.module.ts->src/app/features/events/events.module.ts - - - - + + + + src/app/features/friends/friends.module.ts - -friends.module.ts + +friends.module.ts src/app/app-routing.module.ts->src/app/features/friends/friends.module.ts - - - - + + + + src/app/features/groups/groups.module.ts - -groups.module.ts + +groups.module.ts src/app/app-routing.module.ts->src/app/features/groups/groups.module.ts - - - - + + + + src/app/features/home/home.module.ts - -home.module.ts + +home.module.ts src/app/app-routing.module.ts->src/app/features/home/home.module.ts - - - - + + + + src/app/features/invite/invite.module.ts - -invite.module.ts + +invite.module.ts src/app/app-routing.module.ts->src/app/features/invite/invite.module.ts - - - - + + + + src/app/features/login/login.module.ts - -login.module.ts + +login.module.ts src/app/app-routing.module.ts->src/app/features/login/login.module.ts - - - - + + + + src/app/features/members/members.module.ts - -members.module.ts + +members.module.ts src/app/app-routing.module.ts->src/app/features/members/members.module.ts - - - - + + + + src/app/features/messages/messages.module.ts - -messages.module.ts + +messages.module.ts src/app/app-routing.module.ts->src/app/features/messages/messages.module.ts - - - - + + + + src/app/features/missions/missions.module.ts - -missions.module.ts + +missions.module.ts src/app/app-routing.module.ts->src/app/features/missions/missions.module.ts - - - - + + + + src/app/features/news-feed/news-feed.module.ts - -news-feed.module.ts + +news-feed.module.ts src/app/app-routing.module.ts->src/app/features/news-feed/news-feed.module.ts - - - - + + + + src/app/features/privacy/privacy.module.ts - -privacy.module.ts + +privacy.module.ts src/app/app-routing.module.ts->src/app/features/privacy/privacy.module.ts - - - - + + + + src/app/features/profile/profile.module.ts - -profile.module.ts + +profile.module.ts src/app/app-routing.module.ts->src/app/features/profile/profile.module.ts - - - - + + + + src/app/features/register/register.module.ts - -register.module.ts + +register.module.ts src/app/app-routing.module.ts->src/app/features/register/register.module.ts - - - - + + + + src/app/features/search/search.module.ts - -search.module.ts + +search.module.ts src/app/app-routing.module.ts->src/app/features/search/search.module.ts - - - - + + + + src/app/features/settings/settings.module.ts - -settings.module.ts + +settings.module.ts src/app/app-routing.module.ts->src/app/features/settings/settings.module.ts - - - - + + + + src/app/features/splash/splash.module.ts - -splash.module.ts + +splash.module.ts src/app/app-routing.module.ts->src/app/features/splash/splash.module.ts - - - - + + + + src/app/features/stats/stats.module.ts - -stats.module.ts + +stats.module.ts src/app/app-routing.module.ts->src/app/features/stats/stats.module.ts - - - - + + + + src/app/features/terms/terms.module.ts - -terms.module.ts + +terms.module.ts src/app/app-routing.module.ts->src/app/features/terms/terms.module.ts - - - - + + + + src/app/features/the-wire/the-wire.module.ts - -the-wire.module.ts + +the-wire.module.ts src/app/app-routing.module.ts->src/app/features/the-wire/the-wire.module.ts - - - - + + + + @@ -941,8 +941,8 @@ src/app/app-routing.module.ts->src/app/shared/components/forbidden/forbidden.component.ts - - + + @@ -956,8 +956,8 @@ src/app/app-routing.module.ts->src/app/shared/components/not-found/not-found.component.ts - - + + @@ -971,23 +971,23 @@ src/app/app-routing.module.ts->src/app/shared/components/unauthorized/unauthorized.component.ts - - + + src/app/core/services/session-storage.service.ts - -session-storage.service.ts + +session-storage.service.ts src/app/core/guards/auth.guard.ts->src/app/core/services/session-storage.service.ts - - + + @@ -1001,29 +1001,29 @@ src/app/core/guards/auth.guard.ts->src/environments/environment.ts - - + + src/app/core/guards/interceptor.guard.ts->src/app/core/services/session-storage.service.ts - - + + - + src/assets/i18n/translations.en.ts - - -translations.en.ts + + +translations.en.ts - + src/app/core/services/translations.service.ts->src/assets/i18n/translations.en.ts - - + + @@ -1035,857 +1035,857 @@ - + src/app/features/about/about.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/about/about-routing.module.ts - - -about-routing.module.ts + + +about-routing.module.ts - + src/app/features/about/about.module.ts->src/app/features/about/about-routing.module.ts - - + + - + src/app/features/about/about.component.ts - - -about.component.ts + + +about.component.ts - + src/app/features/about/about.module.ts->src/app/features/about/about.component.ts - - + + - + src/app/features/blog/blog.module.ts->src/app/shared/shared.module.ts - - + + - + src/app/features/blog/blog-routing.module.ts - - -blog-routing.module.ts + + +blog-routing.module.ts - + src/app/features/blog/blog.module.ts->src/app/features/blog/blog-routing.module.ts - - + + - + src/app/features/bookmarks/bookmarks.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/bookmarks/bookmarks-routing.module.ts - - -bookmarks-routing.module.ts + + +bookmarks-routing.module.ts - + src/app/features/bookmarks/bookmarks.module.ts->src/app/features/bookmarks/bookmarks-routing.module.ts - - + + - + src/app/features/dashboard/dashboard.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/dashboard/dashboard-routing.module.ts - - -dashboard-routing.module.ts + + +dashboard-routing.module.ts - + src/app/features/dashboard/dashboard.module.ts->src/app/features/dashboard/dashboard-routing.module.ts - - + + - + src/app/features/events/events.module.ts->src/app/shared/shared.module.ts - + - + src/app/features/events/components/event-card/event-card.component.ts - - -event-card.component.ts + + +event-card.component.ts - + src/app/features/events/events.module.ts->src/app/features/events/components/event-card/event-card.component.ts - - + + - + src/app/features/events/components/event-list/event-list.component.ts - - -event-list.component.ts + + +event-list.component.ts - + src/app/features/events/events.module.ts->src/app/features/events/components/event-list/event-list.component.ts - - + + - + src/app/features/events/components/event/event.component.ts - - -event.component.ts + + +event.component.ts - + src/app/features/events/events.module.ts->src/app/features/events/components/event/event.component.ts - - + + - + src/app/features/events/events-routing.module.ts - - -events-routing.module.ts + + +events-routing.module.ts - + src/app/features/events/events.module.ts->src/app/features/events/events-routing.module.ts - - + + - + src/app/features/friends/friends.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/friends/friends-routing.module.ts - - -friends-routing.module.ts + + +friends-routing.module.ts - + src/app/features/friends/friends.module.ts->src/app/features/friends/friends-routing.module.ts - - + + - + src/app/features/groups/groups.module.ts->src/app/shared/shared.module.ts - + - + src/app/features/groups/components/group-card/group-card.component.ts - - -group-card.component.ts + + +group-card.component.ts - + src/app/features/groups/groups.module.ts->src/app/features/groups/components/group-card/group-card.component.ts - - + + - + src/app/features/groups/components/group-list/group-list.component.ts - - -group-list.component.ts + + +group-list.component.ts - + src/app/features/groups/groups.module.ts->src/app/features/groups/components/group-list/group-list.component.ts - - + + - + src/app/features/groups/components/group/group.component.ts - - -group.component.ts + + +group.component.ts - + src/app/features/groups/groups.module.ts->src/app/features/groups/components/group/group.component.ts - - + + - + src/app/features/groups/groups-routing.module.ts - - -groups-routing.module.ts + + +groups-routing.module.ts - + src/app/features/groups/groups.module.ts->src/app/features/groups/groups-routing.module.ts - - + + - + src/app/features/home/home.module.ts->src/app/features/events/events.module.ts - - - - + + + + - + src/app/features/home/home.module.ts->src/app/features/groups/groups.module.ts - - - - + + + + - + src/app/features/home/home.module.ts->src/app/features/news-feed/news-feed.module.ts - - - - + + + + - + src/app/features/home/home.module.ts->src/app/features/profile/profile.module.ts - - - - + + + + - + src/app/features/home/home.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/home/home-routing.module.ts - - -home-routing.module.ts + + +home-routing.module.ts - + src/app/features/home/home.module.ts->src/app/features/home/home-routing.module.ts - - + + - + src/app/features/home/home.component.ts - - -home.component.ts + + +home.component.ts - + src/app/features/home/home.module.ts->src/app/features/home/home.component.ts - - + + - + src/app/features/invite/invite.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/invite/invite-routing.module.ts - - -invite-routing.module.ts + + +invite-routing.module.ts - + src/app/features/invite/invite.module.ts->src/app/features/invite/invite-routing.module.ts - - + + - + src/app/features/login/login.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/login/login-routing.module.ts - - -login-routing.module.ts + + +login-routing.module.ts - + src/app/features/login/login.module.ts->src/app/features/login/login-routing.module.ts - - + + - + src/app/features/login/login.component.ts - - -login.component.ts + + +login.component.ts - + src/app/features/login/login.module.ts->src/app/features/login/login.component.ts - - + + - + src/app/features/members/members.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/members/members-routing.module.ts - - -members-routing.module.ts + + +members-routing.module.ts - + src/app/features/members/members.module.ts->src/app/features/members/members-routing.module.ts - - + + - + src/app/features/messages/messages.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/messages/messages-routing.module.ts - - -messages-routing.module.ts + + +messages-routing.module.ts - + src/app/features/messages/messages.module.ts->src/app/features/messages/messages-routing.module.ts - - + + - + src/app/features/missions/missions.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/missions/missions-routing.module.ts - - -missions-routing.module.ts + + +missions-routing.module.ts - + src/app/features/missions/missions.module.ts->src/app/features/missions/missions-routing.module.ts - - + + - + src/app/features/news-feed/news-feed.module.ts->src/app/shared/shared.module.ts - - - + + + - + src/app/features/news-feed/components/news-card/news-card.component.ts - - -news-card.component.ts + + +news-card.component.ts - + src/app/features/news-feed/news-feed.module.ts->src/app/features/news-feed/components/news-card/news-card.component.ts - - + + - + src/app/features/news-feed/components/news-list/news-list.component.ts - - -news-list.component.ts + + +news-list.component.ts - + src/app/features/news-feed/news-feed.module.ts->src/app/features/news-feed/components/news-list/news-list.component.ts - - + + - + src/app/features/news-feed/news-feed-routing.module.ts - - -news-feed-routing.module.ts + + +news-feed-routing.module.ts - + src/app/features/news-feed/news-feed.module.ts->src/app/features/news-feed/news-feed-routing.module.ts - - + + - + src/app/features/privacy/privacy.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/privacy/privacy-routing.module.ts - - -privacy-routing.module.ts + + +privacy-routing.module.ts - + src/app/features/privacy/privacy.module.ts->src/app/features/privacy/privacy-routing.module.ts - - + + - + src/app/features/privacy/privacy.component.ts - - -privacy.component.ts + + +privacy.component.ts - + src/app/features/privacy/privacy.module.ts->src/app/features/privacy/privacy.component.ts - - + + - + src/app/features/profile/profile.module.ts->src/app/shared/shared.module.ts - - + + - + - + src/app/features/profile/components/profile-card/profile-card.component.ts - - -profile-card.component.ts + + +profile-card.component.ts - + src/app/features/profile/profile.module.ts->src/app/features/profile/components/profile-card/profile-card.component.ts - - + + - + src/app/features/profile/components/post/post.component.ts - - -post.component.ts + + +post.component.ts - + src/app/features/profile/profile.module.ts->src/app/features/profile/components/post/post.component.ts - - + + - + src/app/features/profile/components/profile-list/profile-list.component.ts - - -profile-list.component.ts + + +profile-list.component.ts - + src/app/features/profile/profile.module.ts->src/app/features/profile/components/profile-list/profile-list.component.ts - - + + - + src/app/features/profile/profile-routing.module.ts - - -profile-routing.module.ts + + +profile-routing.module.ts - + src/app/features/profile/profile.module.ts->src/app/features/profile/profile-routing.module.ts - - + + - + src/app/features/register/register.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/register/register-routing.module.ts - - -register-routing.module.ts + + +register-routing.module.ts - + src/app/features/register/register.module.ts->src/app/features/register/register-routing.module.ts - - + + - + src/app/features/register/register.component.ts - - -register.component.ts + + +register.component.ts - + src/app/features/register/register.module.ts->src/app/features/register/register.component.ts - - + + - + src/app/features/search/search.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/search/search-routing.module.ts - - -search-routing.module.ts + + +search-routing.module.ts - + src/app/features/search/search.module.ts->src/app/features/search/search-routing.module.ts - - + + - + src/app/features/settings/settings.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/settings/settings-routing.module.ts - - -settings-routing.module.ts + + +settings-routing.module.ts - + src/app/features/settings/settings.module.ts->src/app/features/settings/settings-routing.module.ts - - + + - + src/app/features/splash/splash.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/splash/splash-routing.module.ts - - -splash-routing.module.ts + + +splash-routing.module.ts - + src/app/features/splash/splash.module.ts->src/app/features/splash/splash-routing.module.ts - - + + - + src/app/features/splash/splash.component.ts - - -splash.component.ts + + +splash.component.ts - + src/app/features/splash/splash.module.ts->src/app/features/splash/splash.component.ts - - + + - + src/app/features/stats/stats.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/stats/stats-routing.module.ts - - -stats-routing.module.ts + + +stats-routing.module.ts - + src/app/features/stats/stats.module.ts->src/app/features/stats/stats-routing.module.ts - - + + - + src/app/features/stats/stats.component.ts - - -stats.component.ts + + +stats.component.ts - + src/app/features/stats/stats.module.ts->src/app/features/stats/stats.component.ts - - + + - + src/app/features/terms/terms.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/terms/terms-routing.module.ts - - -terms-routing.module.ts + + +terms-routing.module.ts - + src/app/features/terms/terms.module.ts->src/app/features/terms/terms-routing.module.ts - - + + - + src/app/features/terms/terms.component.ts - - -terms.component.ts + + +terms.component.ts - + src/app/features/terms/terms.module.ts->src/app/features/terms/terms.component.ts - - + + - + src/app/features/the-wire/the-wire.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/the-wire/the-wire-routing.module.ts - - -the-wire-routing.module.ts + + +the-wire-routing.module.ts - + src/app/features/the-wire/the-wire.module.ts->src/app/features/the-wire/the-wire-routing.module.ts - - + + src/app/app.component.spec.ts - -app.component.spec.ts + +app.component.spec.ts @@ -1893,196 +1893,196 @@ src/app/app.component.ts - -app.component.ts + +app.component.ts src/app/app.component.spec.ts->src/app/app.component.ts - - + + src/app/core/auth/auth.module.ts - -auth.module.ts + +auth.module.ts src/app/app.component.spec.ts->src/app/core/auth/auth.module.ts - - + + src/app/core/helpers/typescript-loader.ts - -typescript-loader.ts + +typescript-loader.ts src/app/app.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/app.component.ts->src/app/core/constants/routes.constants.ts - - + + src/app/app.component.ts->src/app/core/services/translations.service.ts - - + + src/app/core/services/language-storage.service.ts - -language-storage.service.ts + +language-storage.service.ts src/app/app.component.ts->src/app/core/services/language-storage.service.ts - - + + src/app/core/auth/auth.module.ts->src/app/core/services/session-storage.service.ts - - + + src/app/core/auth/auth.module.ts->src/environments/environment.ts - - + + - + src/app/core/services/local-storage-ref.service.ts - - -local-storage-ref.service.ts + + +local-storage-ref.service.ts - + src/app/core/services/language-storage.service.ts->src/app/core/services/local-storage-ref.service.ts - - + + src/app/app.module.ts - -app.module.ts + +app.module.ts src/app/app.module.ts->src/app/app-routing.module.ts - - - - + + + + src/app/app.module.ts->src/app/app.component.ts - - + + src/app/app.module.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/core/core.module.ts - -core.module.ts + +core.module.ts src/app/app.module.ts->src/app/core/core.module.ts - - - - + + + + src/app/core/services/title.service.ts - -title.service.ts + +title.service.ts src/app/app.module.ts->src/app/core/services/title.service.ts - - + + src/app/features/events/events.component.ts - -events.component.ts + +events.component.ts src/app/app.module.ts->src/app/features/events/events.component.ts - - + + src/app/features/groups/groups.component.ts - -groups.component.ts + +groups.component.ts src/app/app.module.ts->src/app/features/groups/groups.component.ts - - + + src/app/app.module.ts->src/app/shared/shared.module.ts - + @@ -2090,466 +2090,466 @@ src/app/core/core.module.ts->src/app/core/auth/auth.module.ts - - + + src/app/core/core.module.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/core/core.module.ts->src/app/app.module.ts - - - - + + + + - + src/app/shared/shared.module.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/shared.module.ts->src/app/shared/components/forbidden/forbidden.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/not-found/not-found.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/unauthorized/unauthorized.component.ts - + src/app/shared/shared.module.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/shared.module.ts->src/app/app.module.ts - - - - + + + + - + src/app/shared/components/banner/banner.component.ts - + banner.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/banner/banner.component.ts - + src/app/shared/pipes/form-control/form-control.pipe.ts - + form-control.pipe.ts - + src/app/shared/shared.module.ts->src/app/shared/pipes/form-control/form-control.pipe.ts - + src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.ts - + truncate-file-name.pipe.ts - + src/app/shared/shared.module.ts->src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.ts - + src/app/shared/components/blog-form/blog-form.component.ts - - -blog-form.component.ts + + +blog-form.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/blog-form/blog-form.component.ts - - + + - + src/app/shared/components/button/button.component.ts - + button.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/button/button.component.ts - + src/app/shared/components/calendar-button/calendar-button.component.ts - - -calendar-button.component.ts + + +calendar-button.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/calendar-button/calendar-button.component.ts - - + + - + src/app/shared/components/editor/editor.component.ts - - -editor.component.ts + + +editor.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/editor/editor.component.ts - - + + - + src/app/shared/factories/editor-config.factory.ts - - -editor-config.factory.ts + + +editor-config.factory.ts - + src/app/shared/shared.module.ts->src/app/shared/factories/editor-config.factory.ts - - + + - + src/app/shared/components/editor/menu/editor-menu/editor-menu.component.ts - - -editor-menu.component.ts + + +editor-menu.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/editor/menu/editor-menu/editor-menu.component.ts - - + + - + src/app/shared/components/event-form/event-form.component.ts - - -event-form.component.ts + + +event-form.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/event-form/event-form.component.ts - - + + - + src/app/shared/components/file-select/file-select.component.ts - + file-select.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/file-select/file-select.component.ts - + src/app/shared/components/footer/footer.component.ts - - -footer.component.ts + + +footer.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/footer/footer.component.ts - - + + - + src/app/shared/components/header/header.component.ts - - -header.component.ts + + +header.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/header/header.component.ts - - + + - + src/app/shared/components/input/input.component.ts - - -input.component.ts + + +input.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/input/input.component.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.ts - - -language-selector.component.ts + + +language-selector.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/language-selector/language-selector.component.ts - - + + - + src/app/shared/components/list/list.component.ts - + list.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/list/list.component.ts - + src/app/shared/components/page-title/page-title.component.ts - - -page-title.component.ts + + +page-title.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/page-title/page-title.component.ts - - + + - + src/app/shared/components/poll-form/poll-form.component.ts - - -poll-form.component.ts + + +poll-form.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/poll-form/poll-form.component.ts - - + + - + src/app/shared/components/post-form/post-form.component.ts - - -post-form.component.ts + + +post-form.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/post-form/post-form.component.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.ts - - -profile-pic.component.ts + + +profile-pic.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/profile-pic/profile-pic.component.ts - - + + - + src/app/shared/pipes/form-group/form-group.pipe.ts - + form-group.pipe.ts - + src/app/shared/shared.module.ts->src/app/shared/pipes/form-group/form-group.pipe.ts - + src/app/core/services/session-storage.service.ts->src/app/core/services/local-storage-ref.service.ts - - + + src/app/core/guards/auth.guard.spec.ts - -auth.guard.spec.ts + +auth.guard.spec.ts src/app/core/guards/auth.guard.spec.ts->src/app/core/guards/auth.guard.ts - - + + src/app/core/guards/auth.guard.spec.ts->src/app/core/auth/auth.module.ts - - + + src/app/core/guards/auth.guard.spec.ts->src/app/core/services/session-storage.service.ts - - + + src/app/core/guards/interceptor.guard.spec.ts - -interceptor.guard.spec.ts + +interceptor.guard.spec.ts src/app/core/guards/interceptor.guard.spec.ts->src/app/core/guards/interceptor.guard.ts - - + + src/app/core/guards/login.guard.spec.ts - -login.guard.spec.ts + +login.guard.spec.ts src/app/core/guards/login.guard.spec.ts->src/app/core/guards/login.guard.ts - - + + src/app/core/guards/login.guard.spec.ts->src/app/core/auth/auth.module.ts - - + + src/app/core/guards/redirect.guard.spec.ts - -redirect.guard.spec.ts + +redirect.guard.spec.ts src/app/core/guards/redirect.guard.spec.ts->src/app/core/guards/redirect.guard.ts - - + + src/app/core/guards/role.guard.spec.ts - -role.guard.spec.ts + +role.guard.spec.ts @@ -2557,23 +2557,23 @@ src/app/core/guards/role.guard.ts - -role.guard.ts + +role.guard.ts src/app/core/guards/role.guard.spec.ts->src/app/core/guards/role.guard.ts - - + + src/app/core/interceptors/error.interceptor.spec.ts - -error.interceptor.spec.ts + +error.interceptor.spec.ts @@ -2581,2459 +2581,2537 @@ src/app/core/interceptors/error.interceptor.ts - -error.interceptor.ts + +error.interceptor.ts src/app/core/interceptors/error.interceptor.spec.ts->src/app/core/interceptors/error.interceptor.ts - - + + - + +src/app/core/interfaces/card-component.interface.ts + + +card-component.interface.ts + + + + + +src/app/shared/models/card-size.ts + + +card-size.ts + + + + + +src/app/core/interfaces/card-component.interface.ts->src/app/shared/models/card-size.ts + + + + + src/app/core/interfaces/list-service.interface.ts - - -list-service.interface.ts + + +list-service.interface.ts - + src/app/core/models/blog.model.ts - - -blog.model.ts + + +blog.model.ts - + src/app/core/models/person.model.ts - - -person.model.ts + + +person.model.ts - + src/app/core/models/blog.model.ts->src/app/core/models/person.model.ts - - + + - + src/app/features/news-feed/models/INewsItem.ts - - -INewsItem.ts + + +INewsItem.ts - + src/app/core/models/blog.model.ts->src/app/features/news-feed/models/INewsItem.ts - - + + - + src/app/core/models/location.model.ts - - -location.model.ts + + +location.model.ts - + src/app/core/models/person.model.ts->src/app/core/models/location.model.ts - - + + - + src/app/features/news-feed/models/INewsItem.ts->src/app/core/models/person.model.ts - - + + - + src/app/core/models/poll.model.ts - - -poll.model.ts + + +poll.model.ts - + src/app/core/models/poll.model.ts->src/app/core/models/person.model.ts - - + + - + src/app/core/models/poll.model.ts->src/app/features/news-feed/models/INewsItem.ts - - + + - + src/app/core/models/post.model.ts - - -post.model.ts + + +post.model.ts - + src/app/core/models/post.model.ts->src/app/core/models/person.model.ts - - + + - + src/app/core/models/post.model.ts->src/app/features/news-feed/models/INewsItem.ts - - + + - + src/app/core/services/debounce.service.spec.ts - - -debounce.service.spec.ts + + +debounce.service.spec.ts - + src/app/core/services/debounce.service.ts - - -debounce.service.ts + + +debounce.service.ts - + src/app/core/services/debounce.service.spec.ts->src/app/core/services/debounce.service.ts - - + + - + src/app/core/services/event.service.spec.ts - - -event.service.spec.ts + + +event.service.spec.ts - + src/app/core/services/event.service.ts - - -event.service.ts + + +event.service.ts - + src/app/core/services/event.service.spec.ts->src/app/core/services/event.service.ts - - + + - + src/app/core/services/event.service.ts->src/app/core/interfaces/list-service.interface.ts - - + + - + src/app/core/services/event.service.ts->src/app/core/models/location.model.ts - - + + - + src/app/core/services/group.service.ts - - -group.service.ts + + +group.service.ts - + src/app/core/services/event.service.ts->src/app/core/services/group.service.ts - - + + - + src/app/core/services/people.service.ts - - -people.service.ts + + +people.service.ts - + src/app/core/services/event.service.ts->src/app/core/services/people.service.ts - - + + - + src/app/core/services/event.service.ts->src/app/features/events/components/event-card/event-card.component.ts - - + + - + src/app/features/events/models/event.ts - - -event.ts + + +event.ts - + src/app/core/services/event.service.ts->src/app/features/events/models/event.ts - - + + - + src/app/core/services/group.service.ts->src/app/core/interfaces/list-service.interface.ts - - + + - + src/app/core/services/group.service.ts->src/app/features/groups/components/group-card/group-card.component.ts - - + + - + src/app/features/groups/models/group.ts - - -group.ts + + +group.ts - + src/app/core/services/group.service.ts->src/app/features/groups/models/group.ts - - + + - + src/app/core/services/people.service.ts->src/app/core/interfaces/list-service.interface.ts - - + + - + src/app/core/services/people.service.ts->src/app/core/models/person.model.ts - - + + - + src/app/core/services/people.service.ts->src/app/core/models/location.model.ts - - + + - + src/app/core/services/people.service.ts->src/app/features/profile/components/profile-card/profile-card.component.ts - - + + src/app/features/events/components/event-card/event-card.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/features/events/components/event-card/event-card.component.ts->src/app/core/services/translations.service.ts - - - - - -src/app/features/events/components/event-card/event-card.component.ts->src/app/features/events/models/event.ts - - + + - - -src/app/features/events/models/eventcardview.ts - - -eventcardview.ts - + + +src/app/features/events/components/event-card/event-card.component.ts->src/app/core/interfaces/card-component.interface.ts + + + + +src/app/features/events/components/event-card/event-card.component.ts->src/app/shared/models/card-size.ts + + - + -src/app/features/events/components/event-card/event-card.component.ts->src/app/features/events/models/eventcardview.ts - - +src/app/features/events/components/event-card/event-card.component.ts->src/app/features/events/models/event.ts + + - + src/app/shared/models/material-button-type.ts - - -material-button-type.ts + + +material-button-type.ts - + src/app/features/events/components/event-card/event-card.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/shared/models/tooltip-direction.ts - - -tooltip-direction.ts + + +tooltip-direction.ts - + src/app/features/events/components/event-card/event-card.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/features/events/models/event.ts->src/app/core/models/person.model.ts - - + + - + src/app/features/events/models/event.ts->src/app/core/models/location.model.ts - - + + - + src/app/features/events/models/event.ts->src/app/features/groups/models/group.ts - - + + - + src/app/core/services/focus-tracking.service.spec.ts - - -focus-tracking.service.spec.ts + + +focus-tracking.service.spec.ts - + src/app/core/services/focus-tracking.service.ts - - -focus-tracking.service.ts + + +focus-tracking.service.ts - + src/app/core/services/focus-tracking.service.spec.ts->src/app/core/services/focus-tracking.service.ts - - + + - + src/app/core/services/group.service.spec.ts - - -group.service.spec.ts + + +group.service.spec.ts - + src/app/core/services/group.service.spec.ts->src/app/core/services/group.service.ts - - + + - + src/app/features/groups/components/group-card/group-card.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/features/groups/components/group-card/group-card.component.ts->src/app/core/services/translations.service.ts - - + + + + + +src/app/features/groups/components/group-card/group-card.component.ts->src/app/core/interfaces/card-component.interface.ts + + + + + +src/app/features/groups/components/group-card/group-card.component.ts->src/app/shared/models/card-size.ts + + - + src/app/features/groups/components/group-card/group-card.component.ts->src/app/features/groups/models/group.ts - - + + - + src/app/core/services/language-storage.service.spec.ts - - -language-storage.service.spec.ts + + +language-storage.service.spec.ts - + src/app/core/services/language-storage.service.spec.ts->src/app/core/services/language-storage.service.ts - - + + - + src/app/core/services/local-storage-ref.service.spec.ts - - -local-storage-ref.service.spec.ts + + +local-storage-ref.service.spec.ts - + src/app/core/services/local-storage-ref.service.spec.ts->src/app/core/services/local-storage-ref.service.ts - - + + - + src/app/core/services/news.service.spec.ts - - -news.service.spec.ts + + +news.service.spec.ts - + src/app/core/services/news.service.ts - - -news.service.ts + + +news.service.ts - + src/app/core/services/news.service.spec.ts->src/app/core/services/news.service.ts - - + + - + src/app/core/services/news.service.ts->src/app/core/interfaces/list-service.interface.ts - - + + - + src/app/core/services/news.service.ts->src/app/core/models/blog.model.ts - - + + - + src/app/core/services/news.service.ts->src/app/features/news-feed/models/INewsItem.ts - - + + - + src/app/core/services/news.service.ts->src/app/core/models/poll.model.ts - - + + - + src/app/core/services/news.service.ts->src/app/core/models/post.model.ts - - + + - + src/app/core/services/news.service.ts->src/app/core/services/people.service.ts - - + + - + src/app/core/services/news.service.ts->src/app/features/news-feed/components/news-card/news-card.component.ts - - + + - + src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/core/services/translations.service.ts - - + + + + + +src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/core/interfaces/card-component.interface.ts + + + + + +src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/shared/models/card-size.ts + + - + src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/core/models/blog.model.ts - - + + - + src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/features/news-feed/models/INewsItem.ts - - + + - + src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/core/models/poll.model.ts - - + + - + src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/core/models/post.model.ts - - + + - + src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/core/services/people.service.spec.ts - - -people.service.spec.ts + + +people.service.spec.ts - + src/app/core/services/people.service.spec.ts->src/app/core/services/people.service.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/core/services/translations.service.ts - - + + + + + +src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/core/interfaces/card-component.interface.ts + + + + + +src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/shared/models/card-size.ts + + - + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/core/models/person.model.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/core/services/session-storage.service.spec.ts - - -session-storage.service.spec.ts + + +session-storage.service.spec.ts - + src/app/core/services/session-storage.service.spec.ts->src/app/core/services/session-storage.service.ts - - + + - + src/app/core/services/title.service.spec.ts - - -title.service.spec.ts + + +title.service.spec.ts - + src/app/core/services/title.service.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/core/services/title.service.spec.ts->src/app/core/services/title.service.ts - - + + - + src/app/features/about/about-routing.module.ts->src/app/features/about/about.component.ts - - + + - + src/app/features/about/about.component.spec.ts - - -about.component.spec.ts + + +about.component.spec.ts - + src/app/features/about/about.component.spec.ts->src/app/features/about/about.component.ts - - + + - + src/app/features/blog/blog.component.ts - - -blog.component.ts + + +blog.component.ts - + src/app/features/blog/blog-routing.module.ts->src/app/features/blog/blog.component.ts - - + + - + src/app/features/blog/blog.component.spec.ts - - -blog.component.spec.ts + + +blog.component.spec.ts - + src/app/features/blog/blog.component.spec.ts->src/app/features/blog/blog.component.ts - - + + - + src/app/features/bookmarks/bookmarks.component.ts - - -bookmarks.component.ts + + +bookmarks.component.ts - + src/app/features/bookmarks/bookmarks-routing.module.ts->src/app/features/bookmarks/bookmarks.component.ts - - + + - + src/app/features/bookmarks/bookmarks.component.spec.ts - - -bookmarks.component.spec.ts + + +bookmarks.component.spec.ts - + src/app/features/bookmarks/bookmarks.component.spec.ts->src/app/features/bookmarks/bookmarks.component.ts - - + + - + src/app/features/dashboard/dashboard.component.ts - - -dashboard.component.ts + + +dashboard.component.ts - + src/app/features/dashboard/dashboard-routing.module.ts->src/app/features/dashboard/dashboard.component.ts - - + + - + src/app/features/dashboard/dashboard.component.spec.ts - - -dashboard.component.spec.ts + + +dashboard.component.spec.ts - + src/app/features/dashboard/dashboard.component.spec.ts->src/app/features/dashboard/dashboard.component.ts - - + + - + src/app/features/events/components/event-card/event-card.component.spec.ts - - -event-card.component.spec.ts + + +event-card.component.spec.ts - + src/app/features/events/components/event-card/event-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/events/components/event-card/event-card.component.spec.ts->src/app/features/events/components/event-card/event-card.component.ts - - + + - + src/app/features/events/components/event-list/event-list.component.spec.ts - - -event-list.component.spec.ts + + +event-list.component.spec.ts - + src/app/features/events/components/event-list/event-list.component.spec.ts->src/app/features/events/components/event-list/event-list.component.ts - - + + + + + +src/app/features/events/components/event-list/event-list.component.ts->src/app/shared/models/card-size.ts + + - + src/app/features/events/components/event-list/event-list.component.ts->src/app/features/events/models/event.ts - - - - - -src/app/features/events/components/event-list/event-list.component.ts->src/app/features/events/models/eventcardview.ts - - + + - + src/app/features/events/components/event/event.component.spec.ts - - -event.component.spec.ts + + +event.component.spec.ts - + src/app/features/events/components/event/event.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/events/components/event/event.component.spec.ts->src/app/features/events/components/event/event.component.ts - - + + - + src/app/features/events/components/event/event.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/features/events/components/event/event.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/events/components/event/event.component.ts->src/app/core/services/event.service.ts - - + + - + src/app/features/events/components/event/event.component.ts->src/app/features/events/models/event.ts - - + + - + src/app/features/events/components/event/event.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/features/events/components/event/event.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/features/events/components/event/event.component.ts->src/app/shared/components/banner/banner.component.ts - + - + src/app/shared/models/input-type.ts - - -input-type.ts + + +input-type.ts - + src/app/features/events/components/event/event.component.ts->src/app/shared/models/input-type.ts - - + + - + src/app/features/events/events-routing.module.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/events/events-routing.module.ts->src/app/features/events/events.component.ts - - + + - + src/app/features/events/events-routing.module.ts->src/app/features/events/components/event/event.component.ts - - + + - + src/app/features/events/events.component.spec.ts - - -events.component.spec.ts + + +events.component.spec.ts - + src/app/features/events/events.component.spec.ts->src/app/features/events/events.component.ts - - + + - + src/app/features/events/resolvers/event.resolver.ts - - -event.resolver.ts + + +event.resolver.ts - + src/app/features/events/resolvers/event.resolver.ts->src/app/core/services/event.service.ts - - + + - + src/app/features/events/resolvers/event.resolver.ts->src/app/features/events/models/event.ts - - + + - + src/app/features/friends/friends.component.ts - - -friends.component.ts + + +friends.component.ts - + src/app/features/friends/friends-routing.module.ts->src/app/features/friends/friends.component.ts - - + + - + src/app/features/friends/friends.component.spec.ts - - -friends.component.spec.ts + + +friends.component.spec.ts - + src/app/features/friends/friends.component.spec.ts->src/app/features/friends/friends.component.ts - - + + - + src/app/features/groups/components/group-card/group-card.component.spec.ts - - -group-card.component.spec.ts + + +group-card.component.spec.ts - + src/app/features/groups/components/group-card/group-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/groups/components/group-card/group-card.component.spec.ts->src/app/features/groups/components/group-card/group-card.component.ts - - + + - + src/app/features/groups/components/group-list/group-list.component.spec.ts - - -group-list.component.spec.ts + + +group-list.component.spec.ts - + src/app/features/groups/components/group-list/group-list.component.spec.ts->src/app/features/groups/components/group-list/group-list.component.ts - - + + - + src/app/features/groups/components/group-list/group-list.component.ts->src/app/features/groups/models/group.ts - - + + - + src/app/features/groups/components/group/group.component.spec.ts - - -group.component.spec.ts + + +group.component.spec.ts - + src/app/features/groups/components/group/group.component.spec.ts->src/app/features/groups/components/group/group.component.ts - - + + - + src/app/features/groups/groups-routing.module.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/groups/groups-routing.module.ts->src/app/features/groups/groups.component.ts - - + + - + src/app/features/groups/groups-routing.module.ts->src/app/features/groups/components/group/group.component.ts - - + + - + src/app/features/groups/groups.component.spec.ts - - -groups.component.spec.ts + + +groups.component.spec.ts - + src/app/features/groups/groups.component.spec.ts->src/app/features/groups/groups.component.ts - - + + - + src/app/features/home/home-routing.module.ts->src/app/features/home/home.component.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/models/person.model.ts - - + + - + src/app/features/home/home.component.ts->src/app/features/news-feed/models/INewsItem.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/services/event.service.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/services/group.service.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/services/people.service.ts - - + + - + src/app/features/home/home.component.ts->src/app/features/events/models/event.ts - - + + - + src/app/features/home/home.component.ts->src/app/features/groups/models/group.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/services/news.service.ts - - + + - + src/app/features/home/home.component.ts->src/app/shared/models/input-type.ts - - + + - + src/app/features/home/home.component.spec.ts - - -home.component.spec.ts + + +home.component.spec.ts - + src/app/features/home/home.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/home/home.component.spec.ts->src/app/features/home/home.component.ts - - + + - + src/app/features/invite/invite.component.ts - - -invite.component.ts + + +invite.component.ts - + src/app/features/invite/invite-routing.module.ts->src/app/features/invite/invite.component.ts - - + + - + src/app/features/invite/invite.component.spec.ts - - -invite.component.spec.ts + + +invite.component.spec.ts - + src/app/features/invite/invite.component.spec.ts->src/app/features/invite/invite.component.ts - - + + - + src/app/features/login/login-routing.module.ts->src/app/features/login/login.component.ts - - + + - + src/app/features/login/login.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/login/login.component.spec.ts - - -login.component.spec.ts + + +login.component.spec.ts - + src/app/features/login/login.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/login/login.component.spec.ts->src/app/features/login/login.component.ts - - + + - + src/app/features/members/members.component.ts - - -members.component.ts + + +members.component.ts - + src/app/features/members/members-routing.module.ts->src/app/features/members/members.component.ts - - + + - + src/app/features/members/members.component.spec.ts - - -members.component.spec.ts + + +members.component.spec.ts - + src/app/features/members/members.component.spec.ts->src/app/features/members/members.component.ts - - + + - + src/app/features/messages/messages.component.ts - - -messages.component.ts + + +messages.component.ts - + src/app/features/messages/messages-routing.module.ts->src/app/features/messages/messages.component.ts - - + + - + src/app/features/messages/messages.component.spec.ts - - -messages.component.spec.ts + + +messages.component.spec.ts - + src/app/features/messages/messages.component.spec.ts->src/app/features/messages/messages.component.ts - - + + - + src/app/features/missions/missions.component.ts - - -missions.component.ts + + +missions.component.ts - + src/app/features/missions/missions-routing.module.ts->src/app/features/missions/missions.component.ts - - + + - + src/app/features/missions/missions.component.spec.ts - - -missions.component.spec.ts + + +missions.component.spec.ts - + src/app/features/missions/missions.component.spec.ts->src/app/features/missions/missions.component.ts - - + + - + src/app/features/news-feed/components/news-card/news-card.component.spec.ts - - -news-card.component.spec.ts + + +news-card.component.spec.ts - + src/app/features/news-feed/components/news-card/news-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/news-feed/components/news-card/news-card.component.spec.ts->src/app/features/news-feed/components/news-card/news-card.component.ts - - + + - + src/app/features/news-feed/components/news-list/news-list.component.spec.ts - - -news-list.component.spec.ts + + +news-list.component.spec.ts - + src/app/features/news-feed/components/news-list/news-list.component.spec.ts->src/app/features/news-feed/components/news-list/news-list.component.ts - - + + - + src/app/features/news-feed/components/news-list/news-list.component.ts->src/app/features/news-feed/models/INewsItem.ts - - + + - + src/app/features/news-feed/news-feed.component.ts - - -news-feed.component.ts + + +news-feed.component.ts - + src/app/features/news-feed/news-feed-routing.module.ts->src/app/features/news-feed/news-feed.component.ts - - + + - + src/app/features/news-feed/news-feed.component.spec.ts - - -news-feed.component.spec.ts + + +news-feed.component.spec.ts - + src/app/features/news-feed/news-feed.component.spec.ts->src/app/features/news-feed/news-feed.component.ts - - + + - + src/app/features/privacy/privacy-routing.module.ts->src/app/features/privacy/privacy.component.ts - - + + - + src/app/features/privacy/privacy.component.spec.ts - - -privacy.component.spec.ts + + +privacy.component.spec.ts - + src/app/features/privacy/privacy.component.spec.ts->src/app/features/privacy/privacy.component.ts - - + + - + src/app/features/profile/components/post/post.component.spec.ts - - -post.component.spec.ts + + +post.component.spec.ts - + src/app/features/profile/components/post/post.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/profile/components/post/post.component.spec.ts->src/app/features/profile/components/post/post.component.ts - - + + - + src/app/features/profile/components/post/post.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/profile/components/post/post.component.ts->src/app/core/services/session-storage.service.ts - - + + - + src/app/features/profile/components/post/post.component.ts->src/app/core/models/person.model.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.spec.ts - - -profile-card.component.spec.ts + + +profile-card.component.spec.ts - + src/app/features/profile/components/profile-card/profile-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.spec.ts->src/app/features/profile/components/profile-card/profile-card.component.ts - - + + - + src/app/features/profile/components/profile-list/profile-list.component.spec.ts - - -profile-list.component.spec.ts + + +profile-list.component.spec.ts - + src/app/features/profile/components/profile-list/profile-list.component.spec.ts->src/app/features/profile/components/profile-list/profile-list.component.ts - - + + - + src/app/features/profile/components/profile-list/profile-list.component.ts->src/app/core/models/person.model.ts - - + + - + src/app/features/profile/profile.component.ts - - -profile.component.ts + + +profile.component.ts - + src/app/features/profile/profile-routing.module.ts->src/app/features/profile/profile.component.ts - - + + - + src/app/features/profile/profile.component.spec.ts - - -profile.component.spec.ts + + +profile.component.spec.ts - + src/app/features/profile/profile.component.spec.ts->src/app/features/profile/profile.component.ts - - + + - + src/app/features/register/register-routing.module.ts->src/app/features/register/register.component.ts - - + + - + src/app/features/register/register.component.spec.ts - - -register.component.spec.ts + + +register.component.spec.ts - + src/app/features/register/register.component.spec.ts->src/app/features/register/register.component.ts - - + + - + src/app/features/search/search.component.ts - - -search.component.ts + + +search.component.ts - + src/app/features/search/search-routing.module.ts->src/app/features/search/search.component.ts - - + + - + src/app/features/search/search.component.spec.ts - - -search.component.spec.ts + + +search.component.spec.ts - + src/app/features/search/search.component.spec.ts->src/app/features/search/search.component.ts - - + + - + src/app/features/settings/settings.component.ts - - -settings.component.ts + + +settings.component.ts - + src/app/features/settings/settings-routing.module.ts->src/app/features/settings/settings.component.ts - - + + - + src/app/features/settings/settings.component.spec.ts - - -settings.component.spec.ts + + +settings.component.spec.ts - + src/app/features/settings/settings.component.spec.ts->src/app/features/settings/settings.component.ts - - + + - + src/app/features/splash/splash-routing.module.ts->src/app/features/splash/splash.component.ts - - + + - + src/app/features/splash/splash.component.spec.ts - - -splash.component.spec.ts + + +splash.component.spec.ts - + src/app/features/splash/splash.component.spec.ts->src/app/features/splash/splash.component.ts - - + + - + src/app/features/stats/stats-routing.module.ts->src/app/features/stats/stats.component.ts - - + + - + src/app/features/stats/stats.component.spec.ts - - -stats.component.spec.ts + + +stats.component.spec.ts - + src/app/features/stats/stats.component.spec.ts->src/app/features/stats/stats.component.ts - - + + - + src/app/features/terms/terms-routing.module.ts->src/app/features/terms/terms.component.ts - - + + - + src/app/features/terms/terms.component.spec.ts - - -terms.component.spec.ts + + +terms.component.spec.ts - + src/app/features/terms/terms.component.spec.ts->src/app/features/terms/terms.component.ts - - + + - + src/app/features/the-wire/the-wire.component.ts - - -the-wire.component.ts + + +the-wire.component.ts - + src/app/features/the-wire/the-wire-routing.module.ts->src/app/features/the-wire/the-wire.component.ts - - + + - + src/app/features/the-wire/the-wire.component.spec.ts - - -the-wire.component.spec.ts + + +the-wire.component.spec.ts - + src/app/features/the-wire/the-wire.component.spec.ts->src/app/features/the-wire/the-wire.component.ts - - + + - + src/app/shared/components/banner/banner.component.spec.ts - + banner.component.spec.ts - + src/app/shared/components/banner/banner.component.spec.ts->src/app/shared/components/banner/banner.component.ts - + src/app/shared/components/blog-form/blog-form.component.spec.ts - - -blog-form.component.spec.ts + + +blog-form.component.spec.ts - + src/app/shared/components/blog-form/blog-form.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/blog-form/blog-form.component.spec.ts->src/app/shared/pipes/form-control/form-control.pipe.ts - - + + - + src/app/shared/components/blog-form/blog-form.component.spec.ts->src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.ts - - + + - + src/app/shared/components/blog-form/blog-form.component.spec.ts->src/app/shared/components/blog-form/blog-form.component.ts - - + + - + src/app/shared/components/blog-form/blog-form.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/button/button.component.spec.ts - + button.component.spec.ts - + src/app/shared/components/button/button.component.spec.ts->src/app/shared/components/button/button.component.ts - + src/app/shared/components/button/button.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/shared/components/button/button.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/shared/models/button-type.ts - - -button-type.ts + + +button-type.ts - + src/app/shared/components/button/button.component.ts->src/app/shared/models/button-type.ts - - + + - + src/app/shared/models/material-color.ts - - -material-color.ts + + +material-color.ts - + src/app/shared/components/button/button.component.ts->src/app/shared/models/material-color.ts - - + + - + src/app/shared/models/theme.ts - - -theme.ts + + +theme.ts - + src/app/shared/components/button/button.component.ts->src/app/shared/models/theme.ts - - + + - + src/app/shared/components/calendar-button/calendar-button.component.spec.ts - - -calendar-button.component.spec.ts + + +calendar-button.component.spec.ts - + src/app/shared/components/calendar-button/calendar-button.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/calendar-button/calendar-button.component.spec.ts->src/app/shared/components/calendar-button/calendar-button.component.ts - - + + - + src/app/shared/components/calendar-button/calendar-button.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/calendar-button/calendar-button.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/shared/components/editor/editor.component.spec.ts - - -editor.component.spec.ts + + +editor.component.spec.ts - + src/app/shared/components/editor/editor.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/editor/editor.component.spec.ts->src/app/shared/components/editor/editor.component.ts - - + + - + src/app/shared/components/editor/editor.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/editor/editor.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/shared/components/editor/editor.component.ts->src/app/shared/factories/editor-config.factory.ts - - + + - + src/app/shared/factories/editor-config.factory.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/event-form/event-form.component.spec.ts - - -event-form.component.spec.ts + + +event-form.component.spec.ts - + src/app/shared/components/event-form/event-form.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/event-form/event-form.component.spec.ts->src/app/shared/pipes/form-control/form-control.pipe.ts - - + + - + src/app/shared/components/event-form/event-form.component.spec.ts->src/app/shared/components/event-form/event-form.component.ts - - + + - + src/app/shared/components/event-form/event-form.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/file-select/file-select.component.spec.ts - + file-select.component.spec.ts - + src/app/shared/components/file-select/file-select.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/file-select/file-select.component.spec.ts->src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.ts - + src/app/shared/components/file-select/file-select.component.spec.ts->src/app/shared/components/file-select/file-select.component.ts - + src/app/shared/components/file-select/file-select.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/file-select/file-select.component.ts->src/app/core/services/focus-tracking.service.ts - - + + - + src/app/shared/components/file-select/file-select.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/shared/components/file-select/file-select.component.ts->src/app/shared/models/theme.ts - - + + - + src/app/shared/components/footer/footer.component.spec.ts - - -footer.component.spec.ts + + +footer.component.spec.ts - + src/app/shared/components/footer/footer.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/footer/footer.component.spec.ts->src/app/shared/components/footer/footer.component.ts - - + + - + src/app/shared/components/footer/footer.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/shared/components/footer/footer.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/forbidden/forbidden.component.spec.ts - + forbidden.component.spec.ts - + src/app/shared/components/forbidden/forbidden.component.spec.ts->src/app/shared/components/forbidden/forbidden.component.ts - + src/app/shared/components/header/header.component.spec.ts - - -header.component.spec.ts + + +header.component.spec.ts - + src/app/shared/components/header/header.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/header/header.component.spec.ts->src/app/shared/components/header/header.component.ts - - + + - + src/app/shared/components/header/header.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/shared/components/header/header.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/header/header.component.ts->src/app/core/models/person.model.ts - - + + - + src/app/shared/components/header/header.component.ts->src/app/core/services/people.service.ts - - + + - + src/app/shared/components/header/header.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/shared/components/input/input.component.spec.ts - - -input.component.spec.ts + + +input.component.spec.ts - + src/app/shared/components/input/input.component.spec.ts->src/app/shared/components/input/input.component.ts - - + + - + src/app/shared/components/input/input.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/input/input.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/shared/components/input/input.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/shared/components/input/input.component.ts->src/app/shared/models/input-type.ts - - + + - + src/app/shared/components/input/input.component.ts->src/app/shared/models/theme.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.spec.ts - - -language-selector.component.spec.ts + + +language-selector.component.spec.ts - + src/app/shared/components/language-selector/language-selector.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.spec.ts->src/app/shared/components/language-selector/language-selector.component.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.ts->src/app/shared/models/theme.ts - - + + - + src/app/shared/models/language.ts - - -language.ts + + +language.ts - + src/app/shared/components/language-selector/language-selector.component.ts->src/app/shared/models/language.ts - - + + - + src/app/shared/components/list/list.component.spec.ts - + list.component.spec.ts - + src/app/shared/components/list/list.component.spec.ts->src/app/shared/components/list/list.component.ts + + +src/app/shared/components/list/list.component.ts->src/app/shared/models/card-size.ts + + + - + src/app/shared/components/list/list.component.ts->src/app/core/interfaces/list-service.interface.ts - - + + + + + +src/app/shared/models/orientation.ts + + +orientation.ts + + + + + +src/app/shared/components/list/list.component.ts->src/app/shared/models/orientation.ts + + - + src/app/shared/components/not-found/not-found.component.spec.ts - + not-found.component.spec.ts - + src/app/shared/components/not-found/not-found.component.spec.ts->src/app/shared/components/not-found/not-found.component.ts - + src/app/shared/components/page-title/page-title.component.spec.ts - - -page-title.component.spec.ts + + +page-title.component.spec.ts - + src/app/shared/components/page-title/page-title.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/page-title/page-title.component.spec.ts->src/app/shared/components/page-title/page-title.component.ts - - + + - + src/app/shared/components/poll-form/poll-form.component.spec.ts - - -poll-form.component.spec.ts + + +poll-form.component.spec.ts - + src/app/shared/components/poll-form/poll-form.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/poll-form/poll-form.component.spec.ts->src/app/shared/pipes/form-control/form-control.pipe.ts - - + + - + src/app/shared/components/poll-form/poll-form.component.spec.ts->src/app/shared/components/poll-form/poll-form.component.ts - - + + - + src/app/shared/components/poll-form/poll-form.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/poll-form/poll-form.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/shared/components/post-form/post-form.component.spec.ts - - -post-form.component.spec.ts + + +post-form.component.spec.ts - + src/app/shared/components/post-form/post-form.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/post-form/post-form.component.spec.ts->src/app/shared/pipes/form-control/form-control.pipe.ts - - + + - + src/app/shared/components/post-form/post-form.component.spec.ts->src/app/shared/components/post-form/post-form.component.ts - - + + - + src/app/shared/components/post-form/post-form.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.spec.ts - - -profile-pic.component.spec.ts + + +profile-pic.component.spec.ts - + src/app/shared/components/profile-pic/profile-pic.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.spec.ts->src/app/shared/components/profile-pic/profile-pic.component.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.ts->src/app/core/models/person.model.ts - - + + - + src/app/shared/components/unauthorized/unauthorized.component.spec.ts - + unauthorized.component.spec.ts - + src/app/shared/components/unauthorized/unauthorized.component.spec.ts->src/app/shared/components/unauthorized/unauthorized.component.ts - + src/app/shared/pipes/form-control/form-control.pipe.spec.ts - + form-control.pipe.spec.ts - + src/app/shared/pipes/form-control/form-control.pipe.spec.ts->src/app/shared/pipes/form-control/form-control.pipe.ts - + src/app/shared/pipes/form-group/form-group.pipe.spec.ts - + form-group.pipe.spec.ts - + src/app/shared/pipes/form-group/form-group.pipe.spec.ts->src/app/shared/pipes/form-group/form-group.pipe.ts - + src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.spec.ts - + truncate-file-name.pipe.spec.ts - + src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.spec.ts->src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.ts - + src/assets/i18n/translations.fr.ts - - -translations.fr.ts + + +translations.fr.ts - + src/assets/i18n/translations.fr.ts->src/assets/i18n/translations.en.ts - - + + - + src/environments/environment.pr.ts - + environment.pr.ts - + src/environments/environment.prod.ts - + environment.prod.ts - + src/main.ts - - -main.ts + + +main.ts - + src/main.ts->src/app/app.module.ts - - + + - + src/main.ts->src/environments/environment.ts - + - + src/polyfills.ts - - -polyfills.ts + + +polyfills.ts - + src/test.ts - - -test.ts + + +test.ts From cbceeff6c5cd397ef33d2ee9fbb9cf586450a3ef Mon Sep 17 00:00:00 2001 From: doug0102 Date: Mon, 27 Nov 2023 17:09:19 -0500 Subject: [PATCH 101/165] change icons for list paging, load 3 pages on init --- src/app/features/home/home.component.html | 2 +- src/app/shared/components/list/list.component.html | 12 ++++++------ src/app/shared/components/list/list.component.ts | 6 +++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/app/features/home/home.component.html b/src/app/features/home/home.component.html index 04f60c00..52ad90e0 100644 --- a/src/app/features/home/home.component.html +++ b/src/app/features/home/home.component.html @@ -24,7 +24,7 @@ - + diff --git a/src/app/shared/components/list/list.component.html b/src/app/shared/components/list/list.component.html index a4d67219..25b70413 100644 --- a/src/app/shared/components/list/list.component.html +++ b/src/app/shared/components/list/list.component.html @@ -7,8 +7,8 @@ - + theme="secondary-2"> +
@@ -20,10 +20,10 @@
- + theme="secondary-2"> +
-
+
\ No newline at end of file diff --git a/src/app/shared/components/list/list.component.ts b/src/app/shared/components/list/list.component.ts index dc70c23f..0e88e616 100644 --- a/src/app/shared/components/list/list.component.ts +++ b/src/app/shared/components/list/list.component.ts @@ -35,17 +35,17 @@ export class ListComponent implements OnInit { ngOnInit(): void { if (this.items.length === 0) { - this.loadNext(); + this.loadNext(this.pageSize * 3); } else { this.lastPage = this.items.length / this.pageSize; } } - loadNext(): void { + loadNext(count: number = this.pageSize): void { this.loading = true; - this.service?.getMany(this.pageSize, this.loadTime).subscribe((items: typeof this.service.dataType[]) => { + this.service?.getMany(count, this.loadTime).subscribe((items: typeof this.service.dataType[]) => { this.items.push(...items); this.loading = false; }); From d697183edd4ac5276539ca56d33bbe144837669d Mon Sep 17 00:00:00 2001 From: doug0102 Date: Mon, 27 Nov 2023 17:41:59 -0500 Subject: [PATCH 102/165] list - specify number pages to load --- src/app/shared/components/list/list.component.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/app/shared/components/list/list.component.ts b/src/app/shared/components/list/list.component.ts index 0e88e616..9e5ee6db 100644 --- a/src/app/shared/components/list/list.component.ts +++ b/src/app/shared/components/list/list.component.ts @@ -15,11 +15,12 @@ export class ListComponent implements OnInit { @Input() items: typeof this.service.dataType[] = []; @Input() cardSize: CardSize | string = CardSize.Small; // TODO: Card size on all card components. Make a base component or interface that gets implemented. @Input() orientation: Orientation | string = Orientation.Vertical; - @Input() pageSize: number = 3; - @Input() loadTime: number = 5000; @Input() columnGap: number = 10; @Input() rowGap: number = 40; @Input() paging: boolean = false; + @Input() pageSize: number = 3; + @Input() pagesToLoad: number = 3; + @Input() loadTime: number = 5000; currentPage: number = 1; lastPage: number = this.currentPage; @@ -35,7 +36,7 @@ export class ListComponent implements OnInit { ngOnInit(): void { if (this.items.length === 0) { - this.loadNext(this.pageSize * 3); + this.loadNext(this.pageSize * (this.paging ? this.pagesToLoad : 1)); } else { this.lastPage = this.items.length / this.pageSize; @@ -47,6 +48,7 @@ export class ListComponent implements OnInit { this.service?.getMany(count, this.loadTime).subscribe((items: typeof this.service.dataType[]) => { this.items.push(...items); + this.lastPage = this.items.length / this.pageSize; this.loading = false; }); } @@ -55,7 +57,7 @@ export class ListComponent implements OnInit { this.lastPage = ++this.currentPage; if (this.pageSize * this.currentPage > this.items.length) - this.loadNext(); + this.loadNext(this.pageSize * this.pagesToLoad); } previousPage(): void { From aed037dc245a11002c791856a250111881dd8d81 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Wed, 10 Jan 2024 12:54:04 -0500 Subject: [PATCH 103/165] upgrade angular from v16.2 to v17.0 --- README.md | 6 +- angular.json | 8 +- package-lock.json | 7586 ++++++++++++++++++++------------------------- package.json | 28 +- 4 files changed, 3428 insertions(+), 4200 deletions(-) diff --git a/README.md b/README.md index 837ec0dd..609c6fd8 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ # Getting Started -Install [Node](https://nodejs.org/en/blog/release/v16.14.2) at version 18.10.0. +Install [Node](https://nodejs.org/en/blog/release/v18.13.0) at version 18.13.0. -Install the Angular CLI at version 16.0.0 +Install the Angular CLI at version 17.0.0 - npm install -g @angular/cli@16.0.0 + npm install -g @angular/cli@17.0.0 Navigate to the project and Install the packages diff --git a/angular.json b/angular.json index 2ed31bb5..2bc01076 100644 --- a/angular.json +++ b/angular.json @@ -101,13 +101,13 @@ "builder": "@angular-devkit/build-angular:dev-server", "configurations": { "production": { - "browserTarget": "gccollab-frontend:build:production" + "buildTarget": "gccollab-frontend:build:production" }, "development": { - "browserTarget": "gccollab-frontend:build:development" + "buildTarget": "gccollab-frontend:build:development" }, "pullrequest": { - "browserTarget": "gccollab-frontend:build:pullrequest" + "buildTarget": "gccollab-frontend:build:pullrequest" } }, "defaultConfiguration": "development" @@ -115,7 +115,7 @@ "extract-i18n": { "builder": "@angular-devkit/build-angular:extract-i18n", "options": { - "browserTarget": "gccollab-frontend:build" + "buildTarget": "gccollab-frontend:build" } }, "test": { diff --git a/package-lock.json b/package-lock.json index 1d797ed4..740cf69a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,32 +8,32 @@ "name": "gccollab-frontend", "version": "0.0.0", "dependencies": { - "@angular/animations": "^16.2.0", + "@angular/animations": "^17.0.8", "@angular/cdk": "^16.0.0", - "@angular/common": "^16.2.0", - "@angular/compiler": "^16.2.0", - "@angular/core": "^16.2.0", - "@angular/forms": "^16.2.0", + "@angular/common": "^17.0.8", + "@angular/compiler": "^17.0.8", + "@angular/core": "^17.0.8", + "@angular/forms": "^17.0.8", "@angular/material": "^16.0.0", - "@angular/platform-browser": "^16.2.0", - "@angular/platform-browser-dynamic": "^16.2.0", - "@angular/router": "^16.2.0", + "@angular/platform-browser": "^17.0.8", + "@angular/platform-browser-dynamic": "^17.0.8", + "@angular/router": "^17.0.8", "@ngx-translate/core": "^14.0.0", "@ngx-translate/http-loader": "^7.0.0", "angular-auth-oidc-client": "^14.1.5", "lorem-ipsum": "^2.0.8", "ngx-editor": "^15.3.0", - "ngx-infinite-scroll": "^16.0.0", + "ngx-infinite-scroll": "^17.0.0", "ngx-skeleton-loader": "^7.0.0", "ngx-translate-routes": "^1.4.1", "rxjs": "~7.5.0", "tslib": "^2.3.0", - "zone.js": "~0.13.0" + "zone.js": "~0.14.0" }, "devDependencies": { - "@angular-devkit/build-angular": "^16.2.0", - "@angular/cli": "~16.2.0", - "@angular/compiler-cli": "^16.2.0", + "@angular-devkit/build-angular": "^17.0.9", + "@angular/cli": "~17.0.9", + "@angular/compiler-cli": "^17.0.8", "@types/jasmine": "~4.0.0", "dependency-cruiser": "^12.10.1", "jasmine-core": "~4.3.0", @@ -42,7 +42,7 @@ "karma-coverage": "~2.2.0", "karma-jasmine": "~5.1.0", "karma-jasmine-html-reporter": "~2.0.0", - "typescript": "~4.9.3" + "typescript": "~5.2.0" } }, "node_modules/@ampproject/remapping": { @@ -59,16 +59,16 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1602.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1602.10.tgz", - "integrity": "sha512-FwemQXh3edqA/S6zPpsqKei5v7gt0R0WpjJoAJaz+FOpfDwij1fwnKr88XINY8xcefTcQaTDQxJZheJShA/hHw==", + "version": "0.1700.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1700.9.tgz", + "integrity": "sha512-B8OeUrvJj5JsfOJIibpoVjvuZzthPFxf1LvuUXTyQcqDUscJAe/RJBc2woT6ss13Iv/HWt8mgaMPP4CccckdNg==", "dev": true, "dependencies": { - "@angular-devkit/core": "16.2.10", + "@angular-devkit/core": "17.0.9", "rxjs": "7.8.1" }, "engines": { - "node": "^16.14.0 || >=18.10.0", + "node": "^18.13.0 || >=20.9.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } @@ -83,96 +83,97 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "16.2.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.2.10.tgz", - "integrity": "sha512-msB/qjIsAOySDxdU5DpcX2sWGUEJOFIO03O9+HbtLwf3NDfe74mFfejxuKlHJXIJdgpM2Zc948M6+618QKpUYA==", + "version": "17.0.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-17.0.9.tgz", + "integrity": "sha512-yH6AfR2/CXrp05dIFQCroyl6Eaq8mS6tt4P7yS48+KXvAbQq2KzYW+TrDD4flFXe3qLVQGFpds3jE2auiwhHsA==", "dev": true, "dependencies": { "@ampproject/remapping": "2.2.1", - "@angular-devkit/architect": "0.1602.10", - "@angular-devkit/build-webpack": "0.1602.10", - "@angular-devkit/core": "16.2.10", - "@babel/core": "7.22.9", - "@babel/generator": "7.22.9", + "@angular-devkit/architect": "0.1700.9", + "@angular-devkit/build-webpack": "0.1700.9", + "@angular-devkit/core": "17.0.9", + "@babel/core": "7.23.2", + "@babel/generator": "7.23.0", "@babel/helper-annotate-as-pure": "7.22.5", "@babel/helper-split-export-declaration": "7.22.6", - "@babel/plugin-proposal-async-generator-functions": "7.20.7", + "@babel/plugin-transform-async-generator-functions": "7.23.2", "@babel/plugin-transform-async-to-generator": "7.22.5", - "@babel/plugin-transform-runtime": "7.22.9", - "@babel/preset-env": "7.22.9", - "@babel/runtime": "7.22.6", - "@babel/template": "7.22.5", + "@babel/plugin-transform-runtime": "7.23.2", + "@babel/preset-env": "7.23.2", + "@babel/runtime": "7.23.2", "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "16.2.10", + "@ngtools/webpack": "17.0.9", "@vitejs/plugin-basic-ssl": "1.0.1", "ansi-colors": "4.1.3", - "autoprefixer": "10.4.14", + "autoprefixer": "10.4.16", "babel-loader": "9.1.3", "babel-plugin-istanbul": "6.1.1", + "browser-sync": "2.29.3", "browserslist": "^4.21.5", "chokidar": "3.5.3", "copy-webpack-plugin": "11.0.0", "critters": "0.0.20", "css-loader": "6.8.1", - "esbuild-wasm": "0.18.17", + "esbuild-wasm": "0.19.5", "fast-glob": "3.3.1", - "guess-parser": "0.4.22", - "https-proxy-agent": "5.0.1", - "inquirer": "8.2.4", + "http-proxy-middleware": "2.0.6", + "https-proxy-agent": "7.0.2", + "inquirer": "9.2.11", "jsonc-parser": "3.2.0", "karma-source-map-support": "1.4.0", - "less": "4.1.3", + "less": "4.2.0", "less-loader": "11.1.0", "license-webpack-plugin": "4.0.2", "loader-utils": "3.2.1", - "magic-string": "0.30.1", + "magic-string": "0.30.5", "mini-css-extract-plugin": "2.7.6", "mrmime": "1.0.1", "open": "8.4.2", "ora": "5.4.1", "parse5-html-rewriting-stream": "7.0.0", - "picomatch": "2.3.1", - "piscina": "4.0.0", + "picomatch": "3.0.1", + "piscina": "4.1.0", "postcss": "8.4.31", "postcss-loader": "7.3.3", "resolve-url-loader": "5.0.0", "rxjs": "7.8.1", - "sass": "1.64.1", + "sass": "1.69.5", "sass-loader": "13.3.2", "semver": "7.5.4", "source-map-loader": "4.0.1", "source-map-support": "0.5.21", - "terser": "5.19.2", + "terser": "5.24.0", "text-table": "0.2.0", "tree-kill": "1.2.2", - "tslib": "2.6.1", - "vite": "4.4.7", - "webpack": "5.88.2", + "tslib": "2.6.2", + "undici": "5.27.2", + "vite": "4.5.1", + "webpack": "5.89.0", "webpack-dev-middleware": "6.1.1", "webpack-dev-server": "4.15.1", - "webpack-merge": "5.9.0", + "webpack-merge": "5.10.0", "webpack-subresource-integrity": "5.1.0" }, "engines": { - "node": "^16.14.0 || >=18.10.0", + "node": "^18.13.0 || >=20.9.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, "optionalDependencies": { - "esbuild": "0.18.17" + "esbuild": "0.19.5" }, "peerDependencies": { - "@angular/compiler-cli": "^16.0.0", - "@angular/localize": "^16.0.0", - "@angular/platform-server": "^16.0.0", - "@angular/service-worker": "^16.0.0", + "@angular/compiler-cli": "^17.0.0", + "@angular/localize": "^17.0.0", + "@angular/platform-server": "^17.0.0", + "@angular/service-worker": "^17.0.0", "jest": "^29.5.0", "jest-environment-jsdom": "^29.5.0", "karma": "^6.3.0", - "ng-packagr": "^16.0.0", + "ng-packagr": "^17.0.0", "protractor": "^7.0.0", "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=4.9.3 <5.2" + "typescript": ">=5.2 <5.3" }, "peerDependenciesMeta": { "@angular/localize": { @@ -204,49 +205,10 @@ } } }, - "node_modules/@angular-devkit/build-angular/node_modules/@babel/core": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", - "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.9", - "@babel/helper-compilation-targets": "^7.22.9", - "@babel/helper-module-transforms": "^7.22.9", - "@babel/helpers": "^7.22.6", - "@babel/parser": "^7.22.7", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.8", - "@babel/types": "^7.22.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/android-arm": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.17.tgz", - "integrity": "sha512-wHsmJG/dnL3OkpAcwbgoBTTMHVi4Uyou3F5mf58ZtmUyIKfcdA7TROav/6tCzET4A3QW2Q2FC+eFneMU+iyOxg==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.5.tgz", + "integrity": "sha512-bhvbzWFF3CwMs5tbjf3ObfGqbl/17ict2/uwOSfr3wmxDE6VdS2GqY/FuzIPe0q0bdhj65zQsvqfArI9MY6+AA==", "cpu": [ "arm" ], @@ -260,9 +222,9 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/android-arm64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.17.tgz", - "integrity": "sha512-9np+YYdNDed5+Jgr1TdWBsozZ85U1Oa3xW0c7TWqH0y2aGghXtZsuT8nYRbzOMcl0bXZXjOGbksoTtVOlWrRZg==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.5.tgz", + "integrity": "sha512-5d1OkoJxnYQfmC+Zd8NBFjkhyCNYwM4n9ODrycTFY6Jk1IGiZ+tjVJDDSwDt77nK+tfpGP4T50iMtVi4dEGzhQ==", "cpu": [ "arm64" ], @@ -276,9 +238,9 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/android-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.17.tgz", - "integrity": "sha512-O+FeWB/+xya0aLg23hHEM2E3hbfwZzjqumKMSIqcHbNvDa+dza2D0yLuymRBQQnC34CWrsJUXyH2MG5VnLd6uw==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.5.tgz", + "integrity": "sha512-9t+28jHGL7uBdkBjL90QFxe7DVA+KGqWlHCF8ChTKyaKO//VLuoBricQCgwhOjA1/qOczsw843Fy4cbs4H3DVA==", "cpu": [ "x64" ], @@ -292,9 +254,9 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/darwin-arm64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.17.tgz", - "integrity": "sha512-M9uJ9VSB1oli2BE/dJs3zVr9kcCBBsE883prage1NWz6pBS++1oNn/7soPNS3+1DGj0FrkSvnED4Bmlu1VAE9g==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.5.tgz", + "integrity": "sha512-mvXGcKqqIqyKoxq26qEDPHJuBYUA5KizJncKOAf9eJQez+L9O+KfvNFu6nl7SCZ/gFb2QPaRqqmG0doSWlgkqw==", "cpu": [ "arm64" ], @@ -308,9 +270,9 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/darwin-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.17.tgz", - "integrity": "sha512-XDre+J5YeIJDMfp3n0279DFNrGCXlxOuGsWIkRb1NThMZ0BsrWXoTg23Jer7fEXQ9Ye5QjrvXpxnhzl3bHtk0g==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.5.tgz", + "integrity": "sha512-Ly8cn6fGLNet19s0X4unjcniX24I0RqjPv+kurpXabZYSXGM4Pwpmf85WHJN3lAgB8GSth7s5A0r856S+4DyiA==", "cpu": [ "x64" ], @@ -324,9 +286,9 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.17.tgz", - "integrity": "sha512-cjTzGa3QlNfERa0+ptykyxs5A6FEUQQF0MuilYXYBGdBxD3vxJcKnzDlhDCa1VAJCmAxed6mYhA2KaJIbtiNuQ==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.5.tgz", + "integrity": "sha512-GGDNnPWTmWE+DMchq1W8Sd0mUkL+APvJg3b11klSGUDvRXh70JqLAO56tubmq1s2cgpVCSKYywEiKBfju8JztQ==", "cpu": [ "arm64" ], @@ -340,9 +302,9 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/freebsd-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.17.tgz", - "integrity": "sha512-sOxEvR8d7V7Kw8QqzxWc7bFfnWnGdaFBut1dRUYtu+EIRXefBc/eIsiUiShnW0hM3FmQ5Zf27suDuHsKgZ5QrA==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.5.tgz", + "integrity": "sha512-1CCwDHnSSoA0HNwdfoNY0jLfJpd7ygaLAp5EHFos3VWJCRX9DMwWODf96s9TSse39Br7oOTLryRVmBoFwXbuuQ==", "cpu": [ "x64" ], @@ -356,9 +318,9 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-arm": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.17.tgz", - "integrity": "sha512-2d3Lw6wkwgSLC2fIvXKoMNGVaeY8qdN0IC3rfuVxJp89CRfA3e3VqWifGDfuakPmp90+ZirmTfye1n4ncjv2lg==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.5.tgz", + "integrity": "sha512-lrWXLY/vJBzCPC51QN0HM71uWgIEpGSjSZZADQhq7DKhPcI6NH1IdzjfHkDQws2oNpJKpR13kv7/pFHBbDQDwQ==", "cpu": [ "arm" ], @@ -372,9 +334,9 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-arm64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.17.tgz", - "integrity": "sha512-c9w3tE7qA3CYWjT+M3BMbwMt+0JYOp3vCMKgVBrCl1nwjAlOMYzEo+gG7QaZ9AtqZFj5MbUc885wuBBmu6aADQ==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.5.tgz", + "integrity": "sha512-o3vYippBmSrjjQUCEEiTZ2l+4yC0pVJD/Dl57WfPwwlvFkrxoSO7rmBZFii6kQB3Wrn/6GwJUPLU5t52eq2meA==", "cpu": [ "arm64" ], @@ -388,9 +350,9 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-ia32": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.17.tgz", - "integrity": "sha512-1DS9F966pn5pPnqXYz16dQqWIB0dmDfAQZd6jSSpiT9eX1NzKh07J6VKR3AoXXXEk6CqZMojiVDSZi1SlmKVdg==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.5.tgz", + "integrity": "sha512-MkjHXS03AXAkNp1KKkhSKPOCYztRtK+KXDNkBa6P78F8Bw0ynknCSClO/ztGszILZtyO/lVKpa7MolbBZ6oJtQ==", "cpu": [ "ia32" ], @@ -404,9 +366,9 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-loong64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.17.tgz", - "integrity": "sha512-EvLsxCk6ZF0fpCB6w6eOI2Fc8KW5N6sHlIovNe8uOFObL2O+Mr0bflPHyHwLT6rwMg9r77WOAWb2FqCQrVnwFg==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.5.tgz", + "integrity": "sha512-42GwZMm5oYOD/JHqHska3Jg0r+XFb/fdZRX+WjADm3nLWLcIsN27YKtqxzQmGNJgu0AyXg4HtcSK9HuOk3v1Dw==", "cpu": [ "loong64" ], @@ -420,9 +382,9 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-mips64el": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.17.tgz", - "integrity": "sha512-e0bIdHA5p6l+lwqTE36NAW5hHtw2tNRmHlGBygZC14QObsA3bD4C6sXLJjvnDIjSKhW1/0S3eDy+QmX/uZWEYQ==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.5.tgz", + "integrity": "sha512-kcjndCSMitUuPJobWCnwQ9lLjiLZUR3QLQmlgaBfMX23UEa7ZOrtufnRds+6WZtIS9HdTXqND4yH8NLoVVIkcg==", "cpu": [ "mips64el" ], @@ -436,9 +398,9 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-ppc64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.17.tgz", - "integrity": "sha512-BAAilJ0M5O2uMxHYGjFKn4nJKF6fNCdP1E0o5t5fvMYYzeIqy2JdAP88Az5LHt9qBoUa4tDaRpfWt21ep5/WqQ==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.5.tgz", + "integrity": "sha512-yJAxJfHVm0ZbsiljbtFFP1BQKLc8kUF6+17tjQ78QjqjAQDnhULWiTA6u0FCDmYT1oOKS9PzZ2z0aBI+Mcyj7Q==", "cpu": [ "ppc64" ], @@ -452,9 +414,9 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-riscv64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.17.tgz", - "integrity": "sha512-Wh/HW2MPnC3b8BqRSIme/9Zhab36PPH+3zam5pqGRH4pE+4xTrVLx2+XdGp6fVS3L2x+DrsIcsbMleex8fbE6g==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.5.tgz", + "integrity": "sha512-5u8cIR/t3gaD6ad3wNt1MNRstAZO+aNyBxu2We8X31bA8XUNyamTVQwLDA1SLoPCUehNCymhBhK3Qim1433Zag==", "cpu": [ "riscv64" ], @@ -468,9 +430,9 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-s390x": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.17.tgz", - "integrity": "sha512-j/34jAl3ul3PNcK3pfI0NSlBANduT2UO5kZ7FCaK33XFv3chDhICLY8wJJWIhiQ+YNdQ9dxqQctRg2bvrMlYgg==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.5.tgz", + "integrity": "sha512-Z6JrMyEw/EmZBD/OFEFpb+gao9xJ59ATsoTNlj39jVBbXqoZm4Xntu6wVmGPB/OATi1uk/DB+yeDPv2E8PqZGw==", "cpu": [ "s390x" ], @@ -484,9 +446,9 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.17.tgz", - "integrity": "sha512-QM50vJ/y+8I60qEmFxMoxIx4de03pGo2HwxdBeFd4nMh364X6TIBZ6VQ5UQmPbQWUVWHWws5MmJXlHAXvJEmpQ==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.5.tgz", + "integrity": "sha512-psagl+2RlK1z8zWZOmVdImisMtrUxvwereIdyJTmtmHahJTKb64pAcqoPlx6CewPdvGvUKe2Jw+0Z/0qhSbG1A==", "cpu": [ "x64" ], @@ -500,9 +462,9 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/netbsd-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.17.tgz", - "integrity": "sha512-/jGlhWR7Sj9JPZHzXyyMZ1RFMkNPjC6QIAan0sDOtIo2TYk3tZn5UDrkE0XgsTQCxWTTOcMPf9p6Rh2hXtl5TQ==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.5.tgz", + "integrity": "sha512-kL2l+xScnAy/E/3119OggX8SrWyBEcqAh8aOY1gr4gPvw76la2GlD4Ymf832UCVbmuWeTf2adkZDK+h0Z/fB4g==", "cpu": [ "x64" ], @@ -516,9 +478,9 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/openbsd-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.17.tgz", - "integrity": "sha512-rSEeYaGgyGGf4qZM2NonMhMOP/5EHp4u9ehFiBrg7stH6BYEEjlkVREuDEcQ0LfIl53OXLxNbfuIj7mr5m29TA==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.5.tgz", + "integrity": "sha512-sPOfhtzFufQfTBgRnE1DIJjzsXukKSvZxloZbkJDG383q0awVAq600pc1nfqBcl0ice/WN9p4qLc39WhBShRTA==", "cpu": [ "x64" ], @@ -532,9 +494,9 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/sunos-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.17.tgz", - "integrity": "sha512-Y7ZBbkLqlSgn4+zot4KUNYst0bFoO68tRgI6mY2FIM+b7ZbyNVtNbDP5y8qlu4/knZZ73fgJDlXID+ohY5zt5g==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.5.tgz", + "integrity": "sha512-dGZkBXaafuKLpDSjKcB0ax0FL36YXCvJNnztjKV+6CO82tTYVDSH2lifitJ29jxRMoUhgkg9a+VA/B03WK5lcg==", "cpu": [ "x64" ], @@ -548,9 +510,9 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/win32-arm64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.17.tgz", - "integrity": "sha512-bwPmTJsEQcbZk26oYpc4c/8PvTY3J5/QK8jM19DVlEsAB41M39aWovWoHtNm78sd6ip6prilxeHosPADXtEJFw==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.5.tgz", + "integrity": "sha512-dWVjD9y03ilhdRQ6Xig1NWNgfLtf2o/STKTS+eZuF90fI2BhbwD6WlaiCGKptlqXlURVB5AUOxUj09LuwKGDTg==", "cpu": [ "arm64" ], @@ -564,9 +526,9 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/win32-ia32": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.17.tgz", - "integrity": "sha512-H/XaPtPKli2MhW+3CQueo6Ni3Avggi6hP/YvgkEe1aSaxw+AeO8MFjq8DlgfTd9Iz4Yih3QCZI6YLMoyccnPRg==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.5.tgz", + "integrity": "sha512-4liggWIA4oDgUxqpZwrDhmEfAH4d0iljanDOK7AnVU89T6CzHon/ony8C5LeOdfgx60x5cnQJFZwEydVlYx4iw==", "cpu": [ "ia32" ], @@ -580,9 +542,9 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/win32-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.17.tgz", - "integrity": "sha512-fGEb8f2BSA3CW7riJVurug65ACLuQAzKq0SSqkY2b2yHHH0MzDfbLyKIGzHwOI/gkHcxM/leuSW6D5w/LMNitA==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.5.tgz", + "integrity": "sha512-czTrygUsB/jlM8qEW5MD8bgYU2Xg14lo6kBDXW6HdxKjh8M5PzETGiSHaz9MtbXBYDloHNUAUW2tMiKW4KM9Mw==", "cpu": [ "x64" ], @@ -595,10 +557,26 @@ "node": ">=12" } }, + "node_modules/@angular-devkit/build-angular/node_modules/@ngtools/webpack": { + "version": "17.0.9", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-17.0.9.tgz", + "integrity": "sha512-ilbzwW30NaccrhYbdY3jy/ZpbC0l7W6+L2Cd3dzHFQ1gZGckibDdMzjibW/vyq/vRf0xr25+oBVIqUn8kZ606g==", + "dev": true, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "@angular/compiler-cli": "^17.0.0", + "typescript": ">=5.2 <5.3", + "webpack": "^5.54.0" + } + }, "node_modules/@angular-devkit/build-angular/node_modules/esbuild": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.17.tgz", - "integrity": "sha512-1GJtYnUxsJreHYA0Y+iQz2UEykonY66HNWOb0yXYZi9/kNrORUEHVg87eQsCtqh59PEJ5YVZJO98JHznMJSWjg==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.5.tgz", + "integrity": "sha512-bUxalY7b1g8vNhQKdB24QDmHeY4V4tw/s6Ak5z+jJX9laP5MoQseTOMemAr0gxssjNcH0MCViG8ONI2kksvfFQ==", "dev": true, "hasInstallScript": true, "optional": true, @@ -609,28 +587,28 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.18.17", - "@esbuild/android-arm64": "0.18.17", - "@esbuild/android-x64": "0.18.17", - "@esbuild/darwin-arm64": "0.18.17", - "@esbuild/darwin-x64": "0.18.17", - "@esbuild/freebsd-arm64": "0.18.17", - "@esbuild/freebsd-x64": "0.18.17", - "@esbuild/linux-arm": "0.18.17", - "@esbuild/linux-arm64": "0.18.17", - "@esbuild/linux-ia32": "0.18.17", - "@esbuild/linux-loong64": "0.18.17", - "@esbuild/linux-mips64el": "0.18.17", - "@esbuild/linux-ppc64": "0.18.17", - "@esbuild/linux-riscv64": "0.18.17", - "@esbuild/linux-s390x": "0.18.17", - "@esbuild/linux-x64": "0.18.17", - "@esbuild/netbsd-x64": "0.18.17", - "@esbuild/openbsd-x64": "0.18.17", - "@esbuild/sunos-x64": "0.18.17", - "@esbuild/win32-arm64": "0.18.17", - "@esbuild/win32-ia32": "0.18.17", - "@esbuild/win32-x64": "0.18.17" + "@esbuild/android-arm": "0.19.5", + "@esbuild/android-arm64": "0.19.5", + "@esbuild/android-x64": "0.19.5", + "@esbuild/darwin-arm64": "0.19.5", + "@esbuild/darwin-x64": "0.19.5", + "@esbuild/freebsd-arm64": "0.19.5", + "@esbuild/freebsd-x64": "0.19.5", + "@esbuild/linux-arm": "0.19.5", + "@esbuild/linux-arm64": "0.19.5", + "@esbuild/linux-ia32": "0.19.5", + "@esbuild/linux-loong64": "0.19.5", + "@esbuild/linux-mips64el": "0.19.5", + "@esbuild/linux-ppc64": "0.19.5", + "@esbuild/linux-riscv64": "0.19.5", + "@esbuild/linux-s390x": "0.19.5", + "@esbuild/linux-x64": "0.19.5", + "@esbuild/netbsd-x64": "0.19.5", + "@esbuild/openbsd-x64": "0.19.5", + "@esbuild/sunos-x64": "0.19.5", + "@esbuild/win32-arm64": "0.19.5", + "@esbuild/win32-ia32": "0.19.5", + "@esbuild/win32-x64": "0.19.5" } }, "node_modules/@angular-devkit/build-angular/node_modules/lru-cache": { @@ -645,6 +623,18 @@ "node": ">=10" } }, + "node_modules/@angular-devkit/build-angular/node_modules/picomatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", + "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/@angular-devkit/build-angular/node_modules/rxjs": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", @@ -670,16 +660,16 @@ } }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1602.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1602.10.tgz", - "integrity": "sha512-H7HiFKbZl/xVxpr1RH05SGawTpA1417wvr2nFGRu2OiePd0lPr6pIhcq8F8gt7JcA8yZKKaqjn2gU+6um2MFLg==", + "version": "0.1700.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1700.9.tgz", + "integrity": "sha512-NBpTb5kdnTePtNirsJQFXfOIFKTPdDqJe0b0sI3FI860po7uvUFu1m5pL5QSkJLmdqrjfPkNq7svGf7NlHQ8JA==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1602.10", + "@angular-devkit/architect": "0.1700.9", "rxjs": "7.8.1" }, "engines": { - "node": "^16.14.0 || >=18.10.0", + "node": "^18.13.0 || >=20.9.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, @@ -698,20 +688,20 @@ } }, "node_modules/@angular-devkit/core": { - "version": "16.2.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.10.tgz", - "integrity": "sha512-eo7suLDjyu5bSlEr4TluYkFm4v2PVLSAPgnau8XHHlN5Yg4P/BZ00ve7LA7C9S1gzRSCrxQhK5ki4rnoFTo5zg==", + "version": "17.0.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.0.9.tgz", + "integrity": "sha512-r5jqwpWOgowqe9KSDqJ3iSbmsEt2XPjSvRG4DSI2T9s31bReoMtreo8b7wkRa2B3hbcDnstFbn8q27VvJDqRaQ==", "dev": true, "dependencies": { "ajv": "8.12.0", "ajv-formats": "2.1.1", "jsonc-parser": "3.2.0", - "picomatch": "2.3.1", + "picomatch": "3.0.1", "rxjs": "7.8.1", "source-map": "0.7.4" }, "engines": { - "node": "^16.14.0 || >=18.10.0", + "node": "^18.13.0 || >=20.9.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, @@ -724,6 +714,18 @@ } } }, + "node_modules/@angular-devkit/core/node_modules/picomatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", + "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/@angular-devkit/core/node_modules/rxjs": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", @@ -734,19 +736,19 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "16.2.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.2.10.tgz", - "integrity": "sha512-UCfPJKVNekb21bWRbzyx81tfHN3x8vU4ZMX/VA6xALg//QalMB7NOkkXBAssthnLastkyzkUtlvApTp2+R+EkQ==", + "version": "17.0.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.0.9.tgz", + "integrity": "sha512-5ti7g45F2KjDJS0DbgnOGI1GyKxGpn4XsKTYJFJrSAWj6VpuvPy/DINRrXNuRVo09VPEkqA+IW7QwaG9icptQg==", "dev": true, "dependencies": { - "@angular-devkit/core": "16.2.10", + "@angular-devkit/core": "17.0.9", "jsonc-parser": "3.2.0", - "magic-string": "0.30.1", + "magic-string": "0.30.5", "ora": "5.4.1", "rxjs": "7.8.1" }, "engines": { - "node": "^16.14.0 || >=18.10.0", + "node": "^18.13.0 || >=20.9.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } @@ -761,17 +763,17 @@ } }, "node_modules/@angular/animations": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-16.2.12.tgz", - "integrity": "sha512-MD0ElviEfAJY8qMOd6/jjSSvtqER2RDAi0lxe6EtUacC1DHCYkaPrKW4vLqY+tmZBg1yf+6n+uS77pXcHHcA3w==", + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.0.8.tgz", + "integrity": "sha512-iKJ2s4ZqVoGS9tSRBuuwYEWTV+Rw6b4zDY1rqiXvbZrpNRxfzYr6s+aYsLQQEindZ4hzxgp9j60FJ8aE/g4w6A==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/core": "16.2.12" + "@angular/core": "17.0.8" } }, "node_modules/@angular/cdk": { @@ -803,26 +805,26 @@ } }, "node_modules/@angular/cli": { - "version": "16.2.10", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-16.2.10.tgz", - "integrity": "sha512-zDqlD+rXFuYZP169c2v35HkMbkchVCft5sS+VpoCCgYTk2rwxpeYkjJ8DQZztZJZRXQ+EMpkv/TubswmDro2zA==", + "version": "17.0.9", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-17.0.9.tgz", + "integrity": "sha512-a1rLAu3TNU5d56ozBnx9UZchJDKC8qMvZL4ThJhcaTUJb0Cj//gqLJdNdMcB0p1Ve9lmmAQ3J17+2Xij1u3sNg==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1602.10", - "@angular-devkit/core": "16.2.10", - "@angular-devkit/schematics": "16.2.10", - "@schematics/angular": "16.2.10", + "@angular-devkit/architect": "0.1700.9", + "@angular-devkit/core": "17.0.9", + "@angular-devkit/schematics": "17.0.9", + "@schematics/angular": "17.0.9", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.3", "ini": "4.1.1", - "inquirer": "8.2.4", + "inquirer": "9.2.11", "jsonc-parser": "3.2.0", - "npm-package-arg": "10.1.0", - "npm-pick-manifest": "8.0.1", + "npm-package-arg": "11.0.1", + "npm-pick-manifest": "9.0.0", "open": "8.4.2", "ora": "5.4.1", - "pacote": "15.2.0", - "resolve": "1.22.2", + "pacote": "17.0.4", + "resolve": "1.22.8", "semver": "7.5.4", "symbol-observable": "4.0.0", "yargs": "17.7.2" @@ -831,7 +833,7 @@ "ng": "bin/ng.js" }, "engines": { - "node": "^16.14.0 || >=18.10.0", + "node": "^18.13.0 || >=20.9.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } @@ -864,32 +866,32 @@ } }, "node_modules/@angular/common": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-16.2.12.tgz", - "integrity": "sha512-B+WY/cT2VgEaz9HfJitBmgdk4I333XG/ybC98CMC4Wz8E49T8yzivmmxXB3OD6qvjcOB6ftuicl6WBqLbZNg2w==", + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.0.8.tgz", + "integrity": "sha512-fFfwtdg7H+OkqnvV/ENu8F8KGfgIiH16DDbQqYY5KQyyQB+SMsoVW29F1fGx6Y30s7ZlsLOy6cHhgrw74itkSw==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/core": "16.2.12", + "@angular/core": "17.0.8", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-16.2.12.tgz", - "integrity": "sha512-6SMXUgSVekGM7R6l1Z9rCtUGtlg58GFmgbpMCsGf+VXxP468Njw8rjT2YZkf5aEPxEuRpSHhDYjqz7n14cwCXQ==", + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.0.8.tgz", + "integrity": "sha512-48jWypuhBGTrUUbkz1vB9gjbKKZ3hpuJ2DUUncd331Yw4tqkqZQbBa/E3ei4IHiCxEvW2uX3lI4AwlhuozmUtA==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/core": "16.2.12" + "@angular/core": "17.0.8" }, "peerDependenciesMeta": { "@angular/core": { @@ -898,9 +900,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-16.2.12.tgz", - "integrity": "sha512-pWSrr152562ujh6lsFZR8NfNc5Ljj+zSTQO44DsuB0tZjwEpnRcjJEgzuhGXr+CoiBf+jTSPZKemtSktDk5aaA==", + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.0.8.tgz", + "integrity": "sha512-ny2SMVgl+icjMuU5ZM57yFGUrhjR0hNxfCn0otAD3jUFliz/Onu9l6EPRKA5Cr8MZx3mg3rTLSBMD17YT8rsOg==", "dev": true, "dependencies": { "@babel/core": "7.23.2", @@ -918,42 +920,42 @@ "ngcc": "bundles/ngcc/index.js" }, "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/compiler": "16.2.12", - "typescript": ">=4.9.3 <5.2" + "@angular/compiler": "17.0.8", + "typescript": ">=5.2 <5.3" } }, "node_modules/@angular/core": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-16.2.12.tgz", - "integrity": "sha512-GLLlDeke/NjroaLYOks0uyzFVo6HyLl7VOm0K1QpLXnYvW63W9Ql/T3yguRZa7tRkOAeFZ3jw+1wnBD4O8MoUA==", + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.0.8.tgz", + "integrity": "sha512-tzYsK24LdkNuKNJK6efF4XOqspvF/qOe9j/n1Y61a6mNvFwsJFGbcmdZMby4hI/YRm6oIDoIIFjSep8ycp6Pbw==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { "rxjs": "^6.5.3 || ^7.4.0", - "zone.js": "~0.13.0" + "zone.js": "~0.14.0" } }, "node_modules/@angular/forms": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-16.2.12.tgz", - "integrity": "sha512-1Eao89hlBgLR3v8tU91vccn21BBKL06WWxl7zLpQmG6Hun+2jrThgOE4Pf3os4fkkbH4Apj0tWL2fNIWe/blbw==", + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-17.0.8.tgz", + "integrity": "sha512-WZBHbMQjaSovAzOMhKqZN+m7eUPGfOzh9rKFKvj6UQLIJ9qSpEpqlvL0omU1z/47s3XXeLiBzomMiRfQISJvvw==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/common": "16.2.12", - "@angular/core": "16.2.12", - "@angular/platform-browser": "16.2.12", + "@angular/common": "17.0.8", + "@angular/core": "17.0.8", + "@angular/platform-browser": "17.0.8", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -1022,19 +1024,19 @@ } }, "node_modules/@angular/platform-browser": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-16.2.12.tgz", - "integrity": "sha512-NnH7ju1iirmVEsUq432DTm0nZBGQsBrU40M3ZeVHMQ2subnGiyUs3QyzDz8+VWLL/T5xTxWLt9BkDn65vgzlIQ==", + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.0.8.tgz", + "integrity": "sha512-XaI+p2AxQaIHzR761lhPUf4OcOp46WDW0IfbvOzaezHE+8r81joZyVSDQPgXSa/aRfI58YhcfUavuGqyU3PphA==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/animations": "16.2.12", - "@angular/common": "16.2.12", - "@angular/core": "16.2.12" + "@angular/animations": "17.0.8", + "@angular/common": "17.0.8", + "@angular/core": "17.0.8" }, "peerDependenciesMeta": { "@angular/animations": { @@ -1043,36 +1045,36 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-16.2.12.tgz", - "integrity": "sha512-ya54jerNgreCVAR278wZavwjrUWImMr2F8yM5n9HBvsMBbFaAQ83anwbOEiHEF2BlR+gJiEBLfpuPRMw20pHqw==", + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.0.8.tgz", + "integrity": "sha512-BIXNKnfBZb8sdluQ7WIhIXFuVnsJJ0SV+aiMKzQ7B6XhWoAXZQnlvON2thydjIIVuCvaF3YmWTbILI2K8YZ2jQ==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/common": "16.2.12", - "@angular/compiler": "16.2.12", - "@angular/core": "16.2.12", - "@angular/platform-browser": "16.2.12" + "@angular/common": "17.0.8", + "@angular/compiler": "17.0.8", + "@angular/core": "17.0.8", + "@angular/platform-browser": "17.0.8" } }, "node_modules/@angular/router": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-16.2.12.tgz", - "integrity": "sha512-aU6QnYSza005V9P3W6PpkieL56O0IHps96DjqI1RS8yOJUl3THmokqYN4Fm5+HXy4f390FN9i6ftadYQDKeWmA==", + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-17.0.8.tgz", + "integrity": "sha512-ptphcRe1RG/mIS60R7ZPilkkrxautqB0sOhds3h5VP3g628G1a2HWzvnmvjEfpJWDMFivV32VJMMBtTLqGr+0Q==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/common": "16.2.12", - "@angular/core": "16.2.12", - "@angular/platform-browser": "16.2.12", + "@angular/common": "17.0.8", + "@angular/core": "17.0.8", + "@angular/platform-browser": "17.0.8", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -1096,9 +1098,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz", - "integrity": "sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", "dev": true, "engines": { "node": ">=6.9.0" @@ -1149,20 +1151,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/core/node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/core/node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -1179,12 +1167,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", - "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5", + "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -1218,14 +1206,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -1243,17 +1231,17 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", - "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.7.tgz", + "integrity": "sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.23.0", "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-replace-supers": "^7.22.20", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", "semver": "^6.3.1" @@ -1301,9 +1289,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz", - "integrity": "sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==", + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz", + "integrity": "sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", @@ -1338,20 +1326,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-function-name/node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-hoist-variables": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", @@ -1517,9 +1491,9 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", "dev": true, "engines": { "node": ">=6.9.0" @@ -1539,20 +1513,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-wrap-function/node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helpers": { "version": "7.23.4", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.4.tgz", @@ -1567,20 +1527,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helpers/node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/highlight": { "version": "7.23.4", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", @@ -1639,25 +1585,6 @@ "@babel/core": "^7.13.0" } }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", - "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead.", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-proposal-private-property-in-object": { "version": "7.21.0-placeholder-for-preset-env.2", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", @@ -1670,23 +1597,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-unicode-property-regex instead.", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", @@ -1938,9 +1848,9 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.4.tgz", - "integrity": "sha512-efdkfPhHYTtn0G6n2ddrESE91fgXxjlqLsnUtPWnJs4a4mZIbUaK7ffqKIIUKXSHwcDvaCVX6GXkaJJFqtX7jw==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz", + "integrity": "sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", @@ -2036,16 +1946,15 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.3.tgz", - "integrity": "sha512-FGEQmugvAEu2QtgtU0uTASXevfLMFfBeVCIIdcQhn/uBQsMTjBajdnAtanQlOcuihWh10PZ7+HWvc7NtBwP74w==", + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz", + "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-replace-supers": "^7.22.20", "@babel/helper-split-export-declaration": "^7.22.6", @@ -2074,20 +1983,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-computed-properties/node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-destructuring": { "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", @@ -2183,12 +2078,13 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.3.tgz", - "integrity": "sha512-X8jSm8X1CMwxmK878qsUGJRmbysKNbdpTv/O1/v0LuY/ZkZrng5WYiekYSdg9m09OTmDDUWeEDsTE+17WYbAZw==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", + "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2570,16 +2466,16 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.9.tgz", - "integrity": "sha512-9KjBH61AGJetCPYp/IEyLEp47SyybZb0nDRpBvmtEkm+rUIwxdlKpyNHI1TmsGkeuLclJdleQHRZ8XLBnnh8CQ==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.2.tgz", + "integrity": "sha512-XOntj6icgzMS58jPVtQpiuF6ZFWxQiJavISGx5KGjRj+3gqZr8+N6Kx+N9BApWzgS+DOjIZfXXj0ZesenOWDyA==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.4", - "babel-plugin-polyfill-corejs3": "^0.8.2", - "babel-plugin-polyfill-regenerator": "^0.5.1", + "babel-plugin-polyfill-corejs2": "^0.4.6", + "babel-plugin-polyfill-corejs3": "^0.8.5", + "babel-plugin-polyfill-regenerator": "^0.5.3", "semver": "^6.3.1" }, "engines": { @@ -2738,17 +2634,17 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.9.tgz", - "integrity": "sha512-wNi5H/Emkhll/bqPjsjQorSykrlfY5OWakd6AulLvMEytpKasMVUpVy8RL4qBIBs5Ac6/5i0/Rv0b/Fg6Eag/g==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.2.tgz", + "integrity": "sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-compilation-targets": "^7.22.9", + "@babel/compat-data": "^7.23.2", + "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.15", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.15", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", @@ -2769,58 +2665,58 @@ "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.22.5", - "@babel/plugin-transform-async-generator-functions": "^7.22.7", + "@babel/plugin-transform-async-generator-functions": "^7.23.2", "@babel/plugin-transform-async-to-generator": "^7.22.5", "@babel/plugin-transform-block-scoped-functions": "^7.22.5", - "@babel/plugin-transform-block-scoping": "^7.22.5", + "@babel/plugin-transform-block-scoping": "^7.23.0", "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-class-static-block": "^7.22.5", - "@babel/plugin-transform-classes": "^7.22.6", + "@babel/plugin-transform-class-static-block": "^7.22.11", + "@babel/plugin-transform-classes": "^7.22.15", "@babel/plugin-transform-computed-properties": "^7.22.5", - "@babel/plugin-transform-destructuring": "^7.22.5", + "@babel/plugin-transform-destructuring": "^7.23.0", "@babel/plugin-transform-dotall-regex": "^7.22.5", "@babel/plugin-transform-duplicate-keys": "^7.22.5", - "@babel/plugin-transform-dynamic-import": "^7.22.5", + "@babel/plugin-transform-dynamic-import": "^7.22.11", "@babel/plugin-transform-exponentiation-operator": "^7.22.5", - "@babel/plugin-transform-export-namespace-from": "^7.22.5", - "@babel/plugin-transform-for-of": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.11", + "@babel/plugin-transform-for-of": "^7.22.15", "@babel/plugin-transform-function-name": "^7.22.5", - "@babel/plugin-transform-json-strings": "^7.22.5", + "@babel/plugin-transform-json-strings": "^7.22.11", "@babel/plugin-transform-literals": "^7.22.5", - "@babel/plugin-transform-logical-assignment-operators": "^7.22.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.11", "@babel/plugin-transform-member-expression-literals": "^7.22.5", - "@babel/plugin-transform-modules-amd": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.22.5", - "@babel/plugin-transform-modules-systemjs": "^7.22.5", + "@babel/plugin-transform-modules-amd": "^7.23.0", + "@babel/plugin-transform-modules-commonjs": "^7.23.0", + "@babel/plugin-transform-modules-systemjs": "^7.23.0", "@babel/plugin-transform-modules-umd": "^7.22.5", "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", "@babel/plugin-transform-new-target": "^7.22.5", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.5", - "@babel/plugin-transform-numeric-separator": "^7.22.5", - "@babel/plugin-transform-object-rest-spread": "^7.22.5", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", + "@babel/plugin-transform-numeric-separator": "^7.22.11", + "@babel/plugin-transform-object-rest-spread": "^7.22.15", "@babel/plugin-transform-object-super": "^7.22.5", - "@babel/plugin-transform-optional-catch-binding": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.6", - "@babel/plugin-transform-parameters": "^7.22.5", + "@babel/plugin-transform-optional-catch-binding": "^7.22.11", + "@babel/plugin-transform-optional-chaining": "^7.23.0", + "@babel/plugin-transform-parameters": "^7.22.15", "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/plugin-transform-private-property-in-object": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.11", "@babel/plugin-transform-property-literals": "^7.22.5", - "@babel/plugin-transform-regenerator": "^7.22.5", + "@babel/plugin-transform-regenerator": "^7.22.10", "@babel/plugin-transform-reserved-words": "^7.22.5", "@babel/plugin-transform-shorthand-properties": "^7.22.5", "@babel/plugin-transform-spread": "^7.22.5", "@babel/plugin-transform-sticky-regex": "^7.22.5", "@babel/plugin-transform-template-literals": "^7.22.5", "@babel/plugin-transform-typeof-symbol": "^7.22.5", - "@babel/plugin-transform-unicode-escapes": "^7.22.5", + "@babel/plugin-transform-unicode-escapes": "^7.22.10", "@babel/plugin-transform-unicode-property-regex": "^7.22.5", "@babel/plugin-transform-unicode-regex": "^7.22.5", "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.4", - "babel-plugin-polyfill-corejs3": "^0.8.2", - "babel-plugin-polyfill-regenerator": "^0.5.1", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "@babel/types": "^7.23.0", + "babel-plugin-polyfill-corejs2": "^0.4.6", + "babel-plugin-polyfill-corejs3": "^0.8.5", + "babel-plugin-polyfill-regenerator": "^0.5.3", "core-js-compat": "^3.31.0", "semver": "^6.3.1" }, @@ -2841,14 +2737,12 @@ } }, "node_modules/@babel/preset-modules": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6.tgz", - "integrity": "sha512-ID2yj6K/4lKfhuU3+EX4UvNbIt7eACFbHmNUjzA+ep+B5971CknnA/9DEWKbRokfbbtblxxxXFJJrH47UEAMVg==", + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", "@babel/types": "^7.4.4", "esutils": "^2.0.2" }, @@ -2863,26 +2757,26 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", - "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", + "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", "dev": true, "dependencies": { - "regenerator-runtime": "^0.13.11" + "regenerator-runtime": "^0.14.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -3308,6 +3202,15 @@ "node": ">=12" } }, + "node_modules/@fastify/busboy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz", + "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==", + "dev": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@floating-ui/core": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.2.0.tgz", @@ -3321,12 +3224,6 @@ "@floating-ui/core": "^1.2.0" } }, - "node_modules/@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "dev": true - }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -3512,6 +3409,18 @@ "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", "dev": true }, + "node_modules/@ljharb/through": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.11.tgz", + "integrity": "sha512-ccfcIDlogiXNq5KcbAwbaO7lMh3Tm1i3khMPYpxlK8hH/W53zN81KM9coerRLOnTGu3nfXIniAmQbRI9OxbC0w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/@material/animation": { "version": "15.0.0-canary.51f9c0c28.0", "resolved": "https://registry.npmjs.org/@material/animation/-/animation-15.0.0-canary.51f9c0c28.0.tgz", @@ -4264,22 +4173,6 @@ "tslib": "^2.1.0" } }, - "node_modules/@ngtools/webpack": { - "version": "16.2.10", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.2.10.tgz", - "integrity": "sha512-XAVn59zP3ztuKDtw92Xc9+64RK4u4c9g8y5GgtjIWeOwgNXl8bYhAo3uTZzrSrOu96DFZGjsmghFab/7/C2pDg==", - "dev": true, - "engines": { - "node": "^16.14.0 || >=18.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "@angular/compiler-cli": "^16.0.0", - "typescript": ">=4.9.3 <5.2", - "webpack": "^5.54.0" - } - }, "node_modules/@ngx-translate/core": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-14.0.0.tgz", @@ -4340,6 +4233,31 @@ "node": ">= 8" } }, + "node_modules/@npmcli/agent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.0.tgz", + "integrity": "sha512-2yThA1Es98orMkpSLVqlDZAMPK3jHJhifP2gnNUdk1754uZ8yI5c+ulCoVG+WlntQA6MzhrURMXjSd9Z7dJ2/Q==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/agent/node_modules/lru-cache": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, "node_modules/@npmcli/fs": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", @@ -4353,46 +4271,55 @@ } }, "node_modules/@npmcli/git": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", - "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.4.tgz", + "integrity": "sha512-nr6/WezNzuYUppzXRaYu/W4aT5rLxdXqEFupbh6e/ovlYFQ8hpu1UUPV3Ir/YTl+74iXl2ZOMlGzudh9ZPUchQ==", "dev": true, "dependencies": { - "@npmcli/promise-spawn": "^6.0.0", - "lru-cache": "^7.4.4", - "npm-pick-manifest": "^8.0.0", + "@npmcli/promise-spawn": "^7.0.0", + "lru-cache": "^10.0.1", + "npm-pick-manifest": "^9.0.0", "proc-log": "^3.0.0", "promise-inflight": "^1.0.1", "promise-retry": "^2.0.1", "semver": "^7.3.5", - "which": "^3.0.0" + "which": "^4.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "engines": { + "node": ">=16" } }, "node_modules/@npmcli/git/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", "dev": true, "engines": { - "node": ">=12" + "node": "14 || >=16.14" } }, "node_modules/@npmcli/git/node_modules/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "dev": true, "dependencies": { - "isexe": "^2.0.0" + "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.13.0 || >=18.0.0" } }, "node_modules/@npmcli/installed-package-contents": { @@ -4411,20 +4338,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@npmcli/move-file": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", - "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", - "deprecated": "This functionality has been moved to @npmcli/fs", - "dev": true, - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/@npmcli/node-gyp": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", @@ -4435,61 +4348,79 @@ } }, "node_modules/@npmcli/promise-spawn": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", - "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.1.tgz", + "integrity": "sha512-P4KkF9jX3y+7yFUxgcUdDtLy+t4OlDGuEBLNs57AZsfSfg+uV6MLndqGpnl4831ggaEdXwR50XFoZP4VFtHolg==", "dev": true, "dependencies": { - "which": "^3.0.0" + "which": "^4.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "engines": { + "node": ">=16" } }, "node_modules/@npmcli/promise-spawn/node_modules/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "dev": true, "dependencies": { - "isexe": "^2.0.0" + "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.13.0 || >=18.0.0" } }, "node_modules/@npmcli/run-script": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.2.tgz", - "integrity": "sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-7.0.3.tgz", + "integrity": "sha512-ZMWGLHpzMq3rBGIwPyeaoaleaLMvrBrH8nugHxTi5ACkJZXTxXPtVuEH91ifgtss5hUwJQ2VDnzDBWPmz78rvg==", "dev": true, "dependencies": { "@npmcli/node-gyp": "^3.0.0", - "@npmcli/promise-spawn": "^6.0.0", - "node-gyp": "^9.0.0", + "@npmcli/promise-spawn": "^7.0.0", + "node-gyp": "^10.0.0", "read-package-json-fast": "^3.0.0", - "which": "^3.0.0" + "which": "^4.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "engines": { + "node": ">=16" } }, "node_modules/@npmcli/run-script/node_modules/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "dev": true, "dependencies": { - "isexe": "^2.0.0" + "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.13.0 || >=18.0.0" } }, "node_modules/@pkgjs/parseargs": { @@ -4503,31 +4434,31 @@ } }, "node_modules/@schematics/angular": { - "version": "16.2.10", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.2.10.tgz", - "integrity": "sha512-PXmoswvN7qknTsXDmEvhZ9UG+awwWnQ/1Jd/eqqQx08iAaAT81OsXj1bN7eSs6tEGBKGjPb6q2xzuiECAdymzg==", + "version": "17.0.9", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.0.9.tgz", + "integrity": "sha512-XPaHAhobxdQMswH8wSrfToKN7wmGJFh/K5jq/3J+78KeSBZStYxZkVIQbvJkSU8Y1MsdVaeMYKDE8rjFN83OYA==", "dev": true, "dependencies": { - "@angular-devkit/core": "16.2.10", - "@angular-devkit/schematics": "16.2.10", + "@angular-devkit/core": "17.0.9", + "@angular-devkit/schematics": "17.0.9", "jsonc-parser": "3.2.0" }, "engines": { - "node": "^16.14.0 || >=18.10.0", + "node": "^18.13.0 || >=20.9.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, "node_modules/@sigstore/bundle": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-1.1.0.tgz", - "integrity": "sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.1.0.tgz", + "integrity": "sha512-89uOo6yh/oxaU8AeOUnVrTdVMcGk9Q1hJa7Hkvalc6G3Z3CupWk4Xe9djSgJm9fMkH69s0P0cVHUoKSOemLdng==", "dev": true, "dependencies": { - "@sigstore/protobuf-specs": "^0.2.0" + "@sigstore/protobuf-specs": "^0.2.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/@sigstore/protobuf-specs": { @@ -4540,114 +4471,30 @@ } }, "node_modules/@sigstore/sign": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-1.0.0.tgz", - "integrity": "sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA==", - "dev": true, - "dependencies": { - "@sigstore/bundle": "^1.1.0", - "@sigstore/protobuf-specs": "^0.2.0", - "make-fetch-happen": "^11.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/sign/node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@sigstore/sign/node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@sigstore/sign/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@sigstore/sign/node_modules/make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", - "dev": true, - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/sign/node_modules/minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.2.0.tgz", + "integrity": "sha512-AAbmnEHDQv6CSfrWA5wXslGtzLPtAtHZleKOgxdQYvx/s76Fk6T6ZVt7w2IGV9j1UrFeBocTTQxaXG2oRrDhYA==", "dev": true, "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "@sigstore/bundle": "^2.1.0", + "@sigstore/protobuf-specs": "^0.2.1", + "make-fetch-happen": "^13.0.0" }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/@sigstore/sign/node_modules/minipass-fetch/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/@sigstore/tuf": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.3.tgz", - "integrity": "sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.2.0.tgz", + "integrity": "sha512-KKATZ5orWfqd9ZG6MN8PtCIx4eevWSuGRKQvofnWXRpyMyUEpmrzg5M5BrCpjM+NfZ0RbNGOh5tCz/P2uoRqOA==", "dev": true, "dependencies": { - "@sigstore/protobuf-specs": "^0.2.0", - "tuf-js": "^1.1.7" + "@sigstore/protobuf-specs": "^0.2.1", + "tuf-js": "^2.1.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/@socket.io/component-emitter": { @@ -4656,35 +4503,26 @@ "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", "dev": true }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, "node_modules/@tufjs/canonical-json": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz", - "integrity": "sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", + "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", "dev": true, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/@tufjs/models": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.4.tgz", - "integrity": "sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-2.0.0.tgz", + "integrity": "sha512-c8nj8BaOExmZKO2DXhDfegyhSGcG9E/mPN3U13L+/PsoWm1uaGiHHjxqSHQiasDBQwDA3aHuw9+9spYAP1qvvg==", "dev": true, "dependencies": { - "@tufjs/canonical-json": "1.0.0", - "minimatch": "^9.0.0" + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^9.0.3" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/@types/body-parser": { @@ -4827,18 +4665,18 @@ "dev": true }, "node_modules/@types/node-forge": { - "version": "1.3.10", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.10.tgz", - "integrity": "sha512-y6PJDYN4xYBxwd22l+OVH35N+1fCYWiuC3aiP2SlXVE6Lo7SS+rSx9r89hLxrP4pn6n1lBGhHJ12pj3F3Mpttw==", + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/qs": { - "version": "6.9.10", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz", - "integrity": "sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==", + "version": "6.9.11", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", + "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==", "dev": true }, "node_modules/@types/range-parser": { @@ -5059,99 +4897,6 @@ "@xtuc/long": "4.2.2" } }, - "node_modules/@wessberg/ts-evaluator": { - "version": "0.0.27", - "resolved": "https://registry.npmjs.org/@wessberg/ts-evaluator/-/ts-evaluator-0.0.27.tgz", - "integrity": "sha512-7gOpVm3yYojUp/Yn7F4ZybJRxyqfMNf0LXK5KJiawbPfL0XTsJV+0mgrEDjOIR6Bi0OYk2Cyg4tjFu1r8MCZaA==", - "deprecated": "this package has been renamed to ts-evaluator. Please install ts-evaluator instead", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "jsdom": "^16.4.0", - "object-path": "^0.11.5", - "tslib": "^2.0.3" - }, - "engines": { - "node": ">=10.1.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/wessberg/ts-evaluator?sponsor=1" - }, - "peerDependencies": { - "typescript": ">=3.2.x || >= 4.x" - } - }, - "node_modules/@wessberg/ts-evaluator/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@wessberg/ts-evaluator/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@wessberg/ts-evaluator/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@wessberg/ts-evaluator/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@wessberg/ts-evaluator/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@wessberg/ts-evaluator/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -5177,10 +4922,13 @@ "dev": true }, "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } }, "node_modules/accepts": { "version": "1.3.8", @@ -5207,37 +4955,6 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "dependencies": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "node_modules/acorn-globals/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals/node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/acorn-import-assertions": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", @@ -5311,27 +5028,15 @@ } }, "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/agentkeepalive": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", - "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", "dev": true, "dependencies": { - "humanize-ms": "^1.2.1" + "debug": "^4.3.4" }, "engines": { - "node": ">= 8.0.0" + "node": ">= 14" } }, "node_modules/aggregate-error": { @@ -5477,25 +5182,6 @@ "node": ">= 8" } }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - }, - "node_modules/are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "dev": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -5506,21 +5192,33 @@ } }, "node_modules/array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true + "node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/async-each-series": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz", + "integrity": "sha512-p4jj6Fws4Iy2m0iCmI2am2ZNZCgbdgE+P8F/8csmn2vx7ixXrO2zGcuNsD46X5uZSVecmkEy/M06X2vG8KD6dQ==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } }, "node_modules/autoprefixer": { - "version": "10.4.14", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", - "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", + "version": "10.4.16", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", + "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", "dev": true, "funding": [ { @@ -5530,12 +5228,16 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "browserslist": "^4.21.5", - "caniuse-lite": "^1.0.30001464", - "fraction.js": "^4.2.0", + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001538", + "fraction.js": "^4.3.6", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", "postcss-value-parser": "^4.2.0" @@ -5550,6 +5252,15 @@ "postcss": "^8.1.0" } }, + "node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "dev": true, + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, "node_modules/babel-loader": { "version": "9.1.3", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", @@ -5584,13 +5295,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz", - "integrity": "sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==", + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.7.tgz", + "integrity": "sha512-LidDk/tEGDfuHW2DWh/Hgo4rmnw3cduK6ZkOI1NPFceSK3n/yAGeOsNT7FLnSGHkXj3RHGSEVkN3FsCTY6w2CQ==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.3", + "@babel/helper-define-polyfill-provider": "^0.4.4", "semver": "^6.3.1" }, "peerDependencies": { @@ -5607,12 +5318,12 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz", - "integrity": "sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz", + "integrity": "sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.3", + "@babel/helper-define-polyfill-provider": "^0.4.4", "core-js-compat": "^3.33.1" }, "peerDependencies": { @@ -5620,12 +5331,12 @@ } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz", - "integrity": "sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.4.tgz", + "integrity": "sha512-S/x2iOCvDaCASLYsOOgWOq4bCfKYVqvO/uxjkaYyZ3rVsVE3CeAI/c84NpyuBBymEgNvHgjEot3a9/Z/kXvqsg==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.3" + "@babel/helper-define-polyfill-provider": "^0.4.4" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -5741,13 +5452,11 @@ "dev": true }, "node_modules/bonjour-service": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", - "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", + "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", "dev": true, "dependencies": { - "array-flatten": "^2.1.2", - "dns-equal": "^1.0.0", "fast-deep-equal": "^3.1.3", "multicast-dns": "^7.2.5" } @@ -5779,25 +5488,361 @@ "node": ">=8" } }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "node_modules/browserslist": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", - "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", + "node_modules/browser-sync": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.29.3.tgz", + "integrity": "sha512-NiM38O6XU84+MN+gzspVmXV2fTOoe+jBqIBx3IBdhZrdeURr6ZgznJr/p+hQ+KzkKEiGH/GcC4SQFSL0jV49bg==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" + "dependencies": { + "browser-sync-client": "^2.29.3", + "browser-sync-ui": "^2.29.3", + "bs-recipes": "1.3.4", + "chalk": "4.1.2", + "chokidar": "^3.5.1", + "connect": "3.6.6", + "connect-history-api-fallback": "^1", + "dev-ip": "^1.0.1", + "easy-extender": "^2.3.4", + "eazy-logger": "^4.0.1", + "etag": "^1.8.1", + "fresh": "^0.5.2", + "fs-extra": "3.0.1", + "http-proxy": "^1.18.1", + "immutable": "^3", + "localtunnel": "^2.0.1", + "micromatch": "^4.0.2", + "opn": "5.3.0", + "portscanner": "2.2.0", + "raw-body": "^2.3.2", + "resp-modifier": "6.0.2", + "rx": "4.1.0", + "send": "0.16.2", + "serve-index": "1.9.1", + "serve-static": "1.13.2", + "server-destroy": "1.0.1", + "socket.io": "^4.4.1", + "ua-parser-js": "^1.0.33", + "yargs": "^17.3.1" + }, + "bin": { + "browser-sync": "dist/bin.js" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/browser-sync-client": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.29.3.tgz", + "integrity": "sha512-4tK5JKCl7v/3aLbmCBMzpufiYLsB1+UI+7tUXCCp5qF0AllHy/jAqYu6k7hUF3hYtlClKpxExWaR+rH+ny07wQ==", + "dev": true, + "dependencies": { + "etag": "1.8.1", + "fresh": "0.5.2", + "mitt": "^1.1.3" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/browser-sync-ui": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.29.3.tgz", + "integrity": "sha512-kBYOIQjU/D/3kYtUIJtj82e797Egk1FB2broqItkr3i4eF1qiHbFCG6srksu9gWhfmuM/TNG76jMfzAdxEPakg==", + "dev": true, + "dependencies": { + "async-each-series": "0.1.1", + "chalk": "4.1.2", + "connect-history-api-fallback": "^1", + "immutable": "^3", + "server-destroy": "1.0.1", + "socket.io-client": "^4.4.1", + "stream-throttle": "^0.1.3" + } + }, + "node_modules/browser-sync-ui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/browser-sync-ui/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/browser-sync-ui/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/browser-sync-ui/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/browser-sync-ui/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-sync-ui/node_modules/immutable": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", + "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/browser-sync-ui/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-sync/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/browser-sync/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/browser-sync/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/browser-sync/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/browser-sync/node_modules/connect": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", + "integrity": "sha512-OO7axMmPpu/2XuX1+2Yrg0ddju31B6xLZMWkJ5rYBu4YRmRVlOjvlY6kw2FJKiAzyxGwnrDUAG4s1Pf0sbBMCQ==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.0", + "parseurl": "~1.3.2", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/browser-sync/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/browser-sync/node_modules/finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha512-ejnvM9ZXYzp6PUPUyQBMBf0Co5VX2gr5H2VQe2Ui2jWXNlxv+PYZo8wpAymJNJdLsG1R4p+M4aynF8KuoUEwRw==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/browser-sync/node_modules/fs-extra": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", + "integrity": "sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^3.0.0", + "universalify": "^0.1.0" + } + }, + "node_modules/browser-sync/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-sync/node_modules/immutable": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", + "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/browser-sync/node_modules/jsonfile": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", + "integrity": "sha512-oBko6ZHlubVB5mRFkur5vgYR1UyqX+S6Y/oCfLhqNdcc2fYFlDpIoNc7AfKS1KOGcnNAkvsr0grLck9ANM815w==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/browser-sync/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/browser-sync/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/browser-sync/node_modules/statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha512-wuTCPGlJONk/a1kqZ4fQM2+908lC7fa7nPYpTC1EhnvqLX/IICbeP1OZGDtA374trpSq68YubKUMo8oRhN46yg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/browser-sync/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-sync/node_modules/ua-parser-js": { + "version": "1.0.37", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.37.tgz", + "integrity": "sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "engines": { + "node": "*" + } + }, + "node_modules/browserslist": { + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", + "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" }, { "type": "github", @@ -5805,9 +5850,9 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001541", - "electron-to-chromium": "^1.4.535", - "node-releases": "^2.0.13", + "caniuse-lite": "^1.0.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" }, "bin": { @@ -5817,6 +5862,12 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/bs-recipes": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz", + "integrity": "sha512-BXvDkqhDNxXEjeGM8LFkSbR+jzmP/CYpCiVKYn+soB1dDldeU15EBNDkwVXndKuX35wnNUaPd0qSoQEAkmQtMw==", + "dev": true + }, "node_modules/buffer": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", @@ -5866,17 +5917,17 @@ } }, "node_modules/cacache": { - "version": "17.1.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", - "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", + "version": "18.0.2", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.2.tgz", + "integrity": "sha512-r3NU8h/P+4lVUHfeRw1dtgQYar3DZMm4/cm2bZgOvrFC/su7budSOeqh52VJIC4U4iG1WWwV6vRW0znqBvxNuw==", "dev": true, "dependencies": { "@npmcli/fs": "^3.1.0", "fs-minipass": "^3.0.0", "glob": "^10.2.2", - "lru-cache": "^7.7.1", + "lru-cache": "^10.0.1", "minipass": "^7.0.3", - "minipass-collect": "^1.0.2", + "minipass-collect": "^2.0.1", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "p-map": "^4.0.0", @@ -5885,25 +5936,16 @@ "unique-filename": "^3.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/cacache/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/cacache/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", "dev": true, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "14 || >=16.14" } }, "node_modules/call-bind": { @@ -5938,9 +5980,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001564", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001564.tgz", - "integrity": "sha512-DqAOf+rhof+6GVx1y+xzbFPeOumfQnhYzVnZD6LAXijR77yPtm9mfOcqOnT3mpnJiZVT+kwLAFnRlZcIz+c6bg==", + "version": "1.0.30001576", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001576.tgz", + "integrity": "sha512-ff5BdakGe2P3SQsMsiqmt1Lc8221NR1VzHj5jXN5vBny9A6fpze94HiVV/n7XRosOlsShJcvMv5mdnpjOGCEgg==", "dev": true, "funding": [ { @@ -6056,12 +6098,12 @@ } }, "node_modules/cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", "dev": true, "engines": { - "node": ">= 10" + "node": ">= 12" } }, "node_modules/cliui": { @@ -6113,33 +6155,12 @@ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true, - "bin": { - "color-support": "bin.js" - } - }, "node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -6234,9 +6255,9 @@ } }, "node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", "dev": true, "engines": { "node": ">=0.8" @@ -6257,12 +6278,6 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "dev": true - }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -6354,12 +6369,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.33.3", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.3.tgz", - "integrity": "sha512-cNzGqFsh3Ot+529GIXacjTJ7kegdt5fPXxCBVS1G0iaZpuo/tBz399ymceLJveQhFFZ8qThHiP3fzuoQjKN2ow==", + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.0.tgz", + "integrity": "sha512-5blwFAddknKeNgsjBzilkdQ0+YK8L1PfqPYq40NOYMYFSS38qj+hpTcLLWwpIwA2A5bje/x5jmVn2tzUMg9IVw==", "dev": true, "dependencies": { - "browserslist": "^4.22.1" + "browserslist": "^4.22.2" }, "funding": { "type": "opencollective", @@ -6609,50 +6624,12 @@ "node": ">=4" } }, - "node_modules/cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - }, "node_modules/custom-event": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", "dev": true }, - "node_modules/data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dev": true, - "dependencies": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/date-format": { "version": "4.0.14", "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", @@ -6679,12 +6656,6 @@ } } }, - "node_modules/decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", - "dev": true - }, "node_modules/default-gateway": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", @@ -6718,21 +6689,6 @@ "node": ">=8" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true - }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -6926,6 +6882,18 @@ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "dev": true }, + "node_modules/dev-ip": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", + "integrity": "sha512-LmVkry/oDShEgSZPNgqCIp2/TlqtExeGmymru3uCELnfyjY11IzpAproLYs+1X88fXO6DBoYP3ul2Xo2yz2j6A==", + "dev": true, + "bin": { + "dev-ip": "lib/dev-ip.js" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/di": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", @@ -6944,12 +6912,6 @@ "node": ">=8" } }, - "node_modules/dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", - "dev": true - }, "node_modules/dns-packet": { "version": "5.6.1", "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", @@ -7000,27 +6962,6 @@ } ] }, - "node_modules/domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "dev": true, - "dependencies": { - "webidl-conversions": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/domexception/node_modules/webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/domhandler": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", @@ -7056,6 +6997,100 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true }, + "node_modules/easy-extender": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz", + "integrity": "sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==", + "dev": true, + "dependencies": { + "lodash": "^4.17.10" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/eazy-logger": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-4.0.1.tgz", + "integrity": "sha512-2GSFtnnC6U4IEKhEI7+PvdxrmjJ04mdsj3wHZTFiw0tUtG4HCWzTr13ZYTk8XOGnA1xQMaDljoBOYlk3D/MMSw==", + "dev": true, + "dependencies": { + "chalk": "4.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eazy-logger/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eazy-logger/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eazy-logger/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eazy-logger/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eazy-logger/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eazy-logger/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -7063,9 +7098,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.592", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.592.tgz", - "integrity": "sha512-D3NOkROIlF+d5ixnz7pAf3Lu/AuWpd6AYgI9O67GQXMXTcCP1gJQRotOq35eQy5Sb4hez33XH1YdTtILA7Udww==", + "version": "1.4.626", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.626.tgz", + "integrity": "sha512-f7/be56VjRRQk+Ric6PmIrEtPcIqsn3tElyAu9Sh6egha2VLJ82qwkcOdcnT06W+Pb6RUulV1ckzrGbKzVcTHg==", "dev": true }, "node_modules/emoji-regex": { @@ -7136,6 +7171,49 @@ "node": ">=10.0.0" } }, + "node_modules/engine.io-client": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.3.tgz", + "integrity": "sha512-9Z0qLB0NIisTRt1DZ/8U2k12RJn8yls/nXMZLn+/N8hANT3TcYjKFKcwbw5zFQiN4NTde3TSY9zb79e1ij6j9Q==", + "dev": true, + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.11.0", + "xmlhttprequest-ssl": "~2.0.0" + } + }, + "node_modules/engine.io-client/node_modules/engine.io-parser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.1.tgz", + "integrity": "sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io-client/node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/engine.io-parser": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz", @@ -7257,9 +7335,9 @@ } }, "node_modules/esbuild-wasm": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.18.17.tgz", - "integrity": "sha512-9OHGcuRzy+I8ziF9FzjfKLWAPbvi0e/metACVg9k6bK+SI4FFxeV6PcZsz8RIVaMD4YNehw+qj6UMR3+qj/EuQ==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.19.5.tgz", + "integrity": "sha512-7zmLLn2QCj93XfMmHtzrDJ1UBuOHB2CZz1ghoCEZiRajxjUvHsF40PnbzFIY/pmesqPRaEtEWii0uzsTbnAgrA==", "dev": true, "bin": { "esbuild": "bin/esbuild" @@ -7270,66 +7348,26 @@ }, "node_modules/escalade": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "dev": true, - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true, "engines": { - "node": ">=4.0" + "node": ">=6" } }, - "node_modules/escodegen/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, - "optional": true, "engines": { - "node": ">=0.10.0" + "node": ">=0.8.0" } }, "node_modules/eslint-scope": { @@ -7498,12 +7536,6 @@ "node": ">= 0.10.0" } }, - "node_modules/express/node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true - }, "node_modules/express/node_modules/cookie": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", @@ -7540,12 +7572,69 @@ "node": ">= 0.8" } }, + "node_modules/express/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/express/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "node_modules/express/node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/express/node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/express/node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/express/node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -7725,6 +7814,15 @@ "node": ">=8" } }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, "node_modules/flatted": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", @@ -7779,20 +7877,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -7803,16 +7887,16 @@ } }, "node_modules/fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", "dev": true, "engines": { "node": "*" }, "funding": { "type": "patreon", - "url": "https://www.patreon.com/infusion" + "url": "https://github.com/sponsors/rawify" } }, "node_modules/fresh": { @@ -7850,15 +7934,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/fs-monkey": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", @@ -7886,28 +7961,12 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/gensync": { @@ -8061,18 +8120,6 @@ "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, - "node_modules/guess-parser": { - "version": "0.4.22", - "resolved": "https://registry.npmjs.org/guess-parser/-/guess-parser-0.4.22.tgz", - "integrity": "sha512-KcUWZ5ACGaBM69SbqwVIuWGoSAgD+9iJnchR9j/IarVI1jHVeXv+bUXBIMeqVMSKt3zrn0Dgf9UpcOEpPBLbSg==", - "dev": true, - "dependencies": { - "@wessberg/ts-evaluator": "0.0.27" - }, - "peerDependencies": { - "typescript": ">=3.7.5" - } - }, "node_modules/handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", @@ -8142,11 +8189,17 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } }, "node_modules/hdr-histogram-js": { "version": "2.0.3", @@ -8166,24 +8219,24 @@ "dev": true }, "node_modules/hosted-git-info": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", - "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.1.tgz", + "integrity": "sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==", "dev": true, "dependencies": { - "lru-cache": "^7.5.1" + "lru-cache": "^10.0.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", "dev": true, "engines": { - "node": ">=12" + "node": "14 || >=16.14" } }, "node_modules/hpack.js": { @@ -8228,18 +8281,6 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "dev": true, - "dependencies": { - "whatwg-encoding": "^1.0.5" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/html-entities": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", @@ -8339,17 +8380,16 @@ } }, "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", + "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", "dev": true, "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" + "agent-base": "^7.1.0", + "debug": "^4.3.4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/http-proxy-middleware": { @@ -8377,16 +8417,16 @@ } }, "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", + "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", "dev": true, "dependencies": { - "agent-base": "6", + "agent-base": "^7.0.2", "debug": "4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/human-signals": { @@ -8398,15 +8438,6 @@ "node": ">=10.17.0" } }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "dev": true, - "dependencies": { - "ms": "^2.0.0" - } - }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -8461,9 +8492,9 @@ } }, "node_modules/ignore-walk": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.3.tgz", - "integrity": "sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.4.tgz", + "integrity": "sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw==", "dev": true, "dependencies": { "minimatch": "^9.0.0" @@ -8534,12 +8565,6 @@ "node": ">=8" } }, - "node_modules/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -8566,29 +8591,29 @@ } }, "node_modules/inquirer": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", - "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", + "version": "9.2.11", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.11.tgz", + "integrity": "sha512-B2LafrnnhbRzCWfAdOXisUzL89Kg8cVJlYmhqoi3flSiV/TveO+nsXwgKr9h9PIo+J1hz7nBSk6gegRIMBBf7g==", "dev": true, "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", + "@ljharb/through": "^2.3.9", + "ansi-escapes": "^4.3.2", + "chalk": "^5.3.0", "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", + "cli-width": "^4.1.0", + "external-editor": "^3.1.0", + "figures": "^5.0.0", "lodash": "^4.17.21", - "mute-stream": "0.0.8", + "mute-stream": "1.0.0", "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.5.5", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6", - "wrap-ansi": "^7.0.0" + "run-async": "^3.0.0", + "rxjs": "^7.8.1", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.18.0" } }, "node_modules/inquirer/node_modules/ansi-styles": { @@ -8607,16 +8632,12 @@ } }, "node_modules/inquirer/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { - "node": ">=10" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" @@ -8640,22 +8661,64 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/inquirer/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/inquirer/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/inquirer/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/inquirer/node_modules/figures": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", + "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "escape-string-regexp": "^5.0.0", + "is-unicode-supported": "^1.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inquirer/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inquirer/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/inquirer/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { "node": ">=8" @@ -8704,12 +8767,12 @@ } }, "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dev": true, "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8800,6 +8863,15 @@ "node": ">=0.12.0" } }, + "node_modules/is-number-like": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", + "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", + "dev": true, + "dependencies": { + "lodash.isfinite": "^3.3.2" + } + }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -8833,12 +8905,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -9104,76 +9170,9 @@ "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsdom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", - "dev": true, - "dependencies": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsdom/node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, "node_modules/jsesc": { @@ -9497,9 +9496,9 @@ } }, "node_modules/less": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz", - "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz", + "integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==", "dev": true, "dependencies": { "copy-anything": "^2.0.1", @@ -9606,6 +9605,12 @@ } } }, + "node_modules/limiter": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", + "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==", + "dev": true + }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -9630,6 +9635,68 @@ "node": ">= 12.13.0" } }, + "node_modules/localtunnel": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.2.tgz", + "integrity": "sha512-n418Cn5ynvJd7m/N1d9WVJISLJF/ellZnfsLnx8WBWGzxv/ntNcFkJ1o6se5quUhCplfLGBNL5tYHiq5WF3Nug==", + "dev": true, + "dependencies": { + "axios": "0.21.4", + "debug": "4.3.2", + "openurl": "1.1.1", + "yargs": "17.1.1" + }, + "bin": { + "lt": "bin/lt.js" + }, + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/localtunnel/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/localtunnel/node_modules/yargs": { + "version": "17.1.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz", + "integrity": "sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/localtunnel/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -9654,6 +9721,12 @@ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, + "node_modules/lodash.isfinite": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", + "integrity": "sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==", + "dev": true + }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -9795,9 +9868,9 @@ "dev": true }, "node_modules/magic-string": { - "version": "0.30.1", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", - "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", + "version": "0.30.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", + "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", "dev": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" @@ -9837,195 +9910,25 @@ } }, "node_modules/make-fetch-happen": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", - "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz", + "integrity": "sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==", "dev": true, "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^0.6.3", "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/@npmcli/fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", - "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", - "dev": true, - "dependencies": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/make-fetch-happen/node_modules/cacache": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", - "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", - "dev": true, - "dependencies": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/make-fetch-happen/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/make-fetch-happen/node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/make-fetch-happen/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/make-fetch-happen/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-fetch-happen/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/make-fetch-happen/node_modules/ssri": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", - "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", - "dev": true, - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/unique-filename": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", - "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", - "dev": true, - "dependencies": { - "unique-slug": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/unique-slug": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", - "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4" + "ssri": "^10.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/media-typer": { @@ -10184,67 +10087,43 @@ } }, "node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "dev": true, "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" } }, "node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-collect/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", + "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", "dev": true, "dependencies": { - "yallist": "^4.0.0" + "minipass": "^7.0.3" }, "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" } }, "node_modules/minipass-fetch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", - "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", + "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", "dev": true, "dependencies": { - "minipass": "^3.1.6", + "minipass": "^7.0.3", "minipass-sized": "^1.0.3", "minizlib": "^2.1.2" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" }, "optionalDependencies": { "encoding": "^0.1.13" } }, - "node_modules/minipass-fetch/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/minipass-flush": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", @@ -10364,6 +10243,12 @@ "node": ">=8" } }, + "node_modules/mitt": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", + "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==", + "dev": true + }, "node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -10405,10 +10290,13 @@ } }, "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } }, "node_modules/nanoid": { "version": "3.3.6", @@ -10510,15 +10398,15 @@ } }, "node_modules/ngx-infinite-scroll": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/ngx-infinite-scroll/-/ngx-infinite-scroll-16.0.0.tgz", - "integrity": "sha512-bzyNYd+wVlUUxcopRVr2DAa81eEc8vITtKVvb+c7R1uy8hWPTlxOEXf3L1qA4FMwTEzCQ9b37TXzlJji3qBy+A==", + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/ngx-infinite-scroll/-/ngx-infinite-scroll-17.0.0.tgz", + "integrity": "sha512-pQXLuRiuhRuDKD3nmgyW1V08JVNBepmk6nb8qjHc5hgsWNts01+R/p33rYcRDzcut6/PWqGyrZ9o9i8swzMYMA==", "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { - "@angular/common": ">=16.0.0 <17.0.0", - "@angular/core": ">=16.0.0 <17.0.0" + "@angular/common": ">=17.0.0 <18.0.0", + "@angular/core": ">=17.0.0 <18.0.0" } }, "node_modules/ngx-skeleton-loader": { @@ -10574,133 +10462,99 @@ } }, "node_modules/node-gyp": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz", - "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.0.1.tgz", + "integrity": "sha512-gg3/bHehQfZivQVfqIyy8wTdSymF9yTyP4CJifK73imyNMU8AIGQE2pUa7dNWfmMeG9cDVF2eehiRMv0LC1iAg==", "dev": true, "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", - "glob": "^7.1.4", + "glob": "^10.3.10", "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", + "make-fetch-happen": "^13.0.0", + "nopt": "^7.0.0", + "proc-log": "^3.0.0", "semver": "^7.3.5", "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" + "which": "^4.0.0" }, - "engines": { - "node": "^12.13 || ^14.13 || >=16" - } - }, - "node_modules/node-gyp-build": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.7.0.tgz", - "integrity": "sha512-PbZERfeFdrHQOOXiAKOY0VPbykZy90ndPKk0d+CFDegTKmWp1VgOTz2xACVbr1BjCWxrQp68CXtvNsveFhqDJg==", - "dev": true, - "optional": true, - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/node-gyp/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/node-gyp/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "bin": { + "node-gyp": "bin/node-gyp.js" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/node-gyp/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/node-gyp-build": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.0.tgz", + "integrity": "sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==", + "dev": true, + "optional": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-gyp/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, "engines": { - "node": "*" + "node": ">=16" } }, "node_modules/node-gyp/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "dev": true, "dependencies": { - "isexe": "^2.0.0" + "isexe": "^3.1.1" }, "bin": { - "node-which": "bin/node-which" + "node-which": "bin/which.js" }, "engines": { - "node": ">= 8" + "node": "^16.13.0 || >=18.0.0" } }, "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true }, "node_modules/nopt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", + "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==", "dev": true, "dependencies": { - "abbrev": "^1.0.0" + "abbrev": "^2.0.0" }, "bin": { "nopt": "bin/nopt.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/normalize-package-data": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", - "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.0.tgz", + "integrity": "sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==", "dev": true, "dependencies": { - "hosted-git-info": "^6.0.0", + "hosted-git-info": "^7.0.0", "is-core-module": "^2.8.1", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/normalize-path": { @@ -10755,147 +10609,63 @@ } }, "node_modules/npm-package-arg": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", - "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.1.tgz", + "integrity": "sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==", "dev": true, "dependencies": { - "hosted-git-info": "^6.0.0", + "hosted-git-info": "^7.0.0", "proc-log": "^3.0.0", "semver": "^7.3.5", "validate-npm-package-name": "^5.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm-packlist": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz", - "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-8.0.2.tgz", + "integrity": "sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==", "dev": true, "dependencies": { - "ignore-walk": "^6.0.0" + "ignore-walk": "^6.0.4" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm-pick-manifest": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz", - "integrity": "sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.0.0.tgz", + "integrity": "sha512-VfvRSs/b6n9ol4Qb+bDwNGUXutpy76x6MARw/XssevE0TnctIKcmklJZM5Z7nqs5z5aW+0S63pgCNbpkUNNXBg==", "dev": true, "dependencies": { "npm-install-checks": "^6.0.0", "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^10.0.0", + "npm-package-arg": "^11.0.0", "semver": "^7.3.5" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm-registry-fetch": { - "version": "14.0.5", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz", - "integrity": "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==", + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-16.1.0.tgz", + "integrity": "sha512-PQCELXKt8Azvxnt5Y85GseQDJJlglTFM9L9U9gkv2y4e9s0k3GVDdOx3YoB6gm2Do0hlkzC39iCGXby+Wve1Bw==", "dev": true, "dependencies": { - "make-fetch-happen": "^11.0.0", - "minipass": "^5.0.0", + "make-fetch-happen": "^13.0.0", + "minipass": "^7.0.2", "minipass-fetch": "^3.0.0", "minipass-json-stream": "^1.0.1", "minizlib": "^2.1.2", - "npm-package-arg": "^10.0.0", + "npm-package-arg": "^11.0.0", "proc-log": "^3.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-registry-fetch/node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm-registry-fetch/node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm-registry-fetch/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/npm-registry-fetch/node_modules/make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", - "dev": true, - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-registry-fetch/node_modules/minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", - "dev": true, - "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/npm-registry-fetch/node_modules/minipass-fetch/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm-run-path": { @@ -10910,21 +10680,6 @@ "node": ">=8" } }, - "node_modules/npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "dev": true, - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", @@ -10937,12 +10692,6 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/nwsapi": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", - "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", - "dev": true - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -10961,15 +10710,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object-path": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.8.tgz", - "integrity": "sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==", - "dev": true, - "engines": { - "node": ">= 10.12.0" - } - }, "node_modules/obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", @@ -11038,6 +10778,33 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/openurl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", + "integrity": "sha512-d/gTkTb1i1GKz5k3XE3XFV/PxQ1k45zDqGP2OA7YhgsaLoqm6qRvARAZOFer1fcXritWlGBRCu/UgeS4HAnXAA==", + "dev": true + }, + "node_modules/opn": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", + "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", + "dev": true, + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/opn/node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/ora": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", @@ -11219,27 +10986,27 @@ } }, "node_modules/pacote": { - "version": "15.2.0", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz", - "integrity": "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==", + "version": "17.0.4", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-17.0.4.tgz", + "integrity": "sha512-eGdLHrV/g5b5MtD5cTPyss+JxOlaOloSMG3UwPMAvL8ywaLJ6beONPF40K4KKl/UI6q5hTKCJq5rCu8tkF+7Dg==", "dev": true, "dependencies": { - "@npmcli/git": "^4.0.0", + "@npmcli/git": "^5.0.0", "@npmcli/installed-package-contents": "^2.0.1", - "@npmcli/promise-spawn": "^6.0.1", - "@npmcli/run-script": "^6.0.0", - "cacache": "^17.0.0", + "@npmcli/promise-spawn": "^7.0.0", + "@npmcli/run-script": "^7.0.0", + "cacache": "^18.0.0", "fs-minipass": "^3.0.0", - "minipass": "^5.0.0", - "npm-package-arg": "^10.0.0", - "npm-packlist": "^7.0.0", - "npm-pick-manifest": "^8.0.0", - "npm-registry-fetch": "^14.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^11.0.0", + "npm-packlist": "^8.0.0", + "npm-pick-manifest": "^9.0.0", + "npm-registry-fetch": "^16.0.0", "proc-log": "^3.0.0", "promise-retry": "^2.0.1", - "read-package-json": "^6.0.0", + "read-package-json": "^7.0.0", "read-package-json-fast": "^3.0.0", - "sigstore": "^1.3.0", + "sigstore": "^2.0.0", "ssri": "^10.0.0", "tar": "^6.1.11" }, @@ -11247,7 +11014,7 @@ "pacote": "lib/bin.js" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/pako": { @@ -11295,12 +11062,6 @@ "node": ">= 0.10" } }, - "node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, "node_modules/parse5-html-rewriting-stream": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz", @@ -11473,9 +11234,9 @@ } }, "node_modules/piscina": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.0.0.tgz", - "integrity": "sha512-641nAmJS4k4iqpNUqfggqUBUMmlw0ZoM5VZKdQkV2e970Inn3Tk9kroCc1wpsYLD07vCwpys5iY0d3xI/9WkTg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.1.0.tgz", + "integrity": "sha512-sjbLMi3sokkie+qmtZpkfMCUJTpbxJm/wvaPzU28vmYSsTSW8xk9JcFUsbqGJdtPpIQ9tuj+iDcTtgZjwnOSig==", "dev": true, "dependencies": { "eventemitter-asyncresource": "^1.0.0", @@ -11571,6 +11332,20 @@ "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, + "node_modules/portscanner": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz", + "integrity": "sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==", + "dev": true, + "dependencies": { + "async": "^2.6.0", + "is-number-like": "^1.0.3" + }, + "engines": { + "node": ">=0.4", + "npm": ">=1.0.0" + } + }, "node_modules/postcss": { "version": "8.4.31", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", @@ -11871,12 +11646,6 @@ "dev": true, "optional": true }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true - }, "node_modules/punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -11910,12 +11679,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -11970,18 +11733,18 @@ } }, "node_modules/read-package-json": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.4.tgz", - "integrity": "sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-7.0.0.tgz", + "integrity": "sha512-uL4Z10OKV4p6vbdvIXB+OzhInYtIozl/VxUBPgNkBuUi2DeRonnuspmaVAMcrkmfjKGNmRndyQAbE7/AmzGwFg==", "dev": true, "dependencies": { "glob": "^10.2.2", "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^5.0.0", + "normalize-package-data": "^6.0.0", "npm-normalize-package-bin": "^3.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/read-package-json-fast": { @@ -11998,18 +11761,18 @@ } }, "node_modules/read-package-json-fast/node_modules/json-parse-even-better-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", - "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz", + "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==", "dev": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/read-package-json/node_modules/json-parse-even-better-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", - "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz", + "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==", "dev": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -12054,9 +11817,9 @@ } }, "node_modules/reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.14.tgz", + "integrity": "sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==", "dev": true }, "node_modules/regenerate": { @@ -12078,9 +11841,9 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", "dev": true }, "node_modules/regenerator-transform": { @@ -12170,12 +11933,12 @@ "dev": true }, "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "dependencies": { - "is-core-module": "^2.11.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -12234,6 +11997,56 @@ "node": ">=0.10.0" } }, + "node_modules/resp-modifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz", + "integrity": "sha512-U1+0kWC/+4ncRFYqQWTx/3qkfE6a4B/h3XXgmXypfa0SPZ3t7cbbaFk297PjQS/yov24R18h6OZe6iZwj3NSLw==", + "dev": true, + "dependencies": { + "debug": "^2.2.0", + "minimatch": "^3.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/resp-modifier/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/resp-modifier/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/resp-modifier/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/resp-modifier/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, "node_modules/restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", @@ -12356,9 +12169,9 @@ "integrity": "sha512-85aZYCxweiD5J8yTEbw+E6A27zSnLPNDL0WfPdw3YYodq7WjnTKo0q4dtyQ2gz23iPT8Q9CUyJtAaUNcTxRf5Q==" }, "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", + "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", "dev": true, "engines": { "node": ">=0.12.0" @@ -12387,6 +12200,12 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/rx": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", + "integrity": "sha512-CiaiuN6gapkdl+cZUr67W6I8jquN4lkak3vtIsIWCl4XIPP8ffsoyN6/+PuGXnQy8Cu8W2y9Xxh31Rq4M6wUug==", + "dev": true + }, "node_modules/rxjs": { "version": "7.5.7", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz", @@ -12436,9 +12255,9 @@ "integrity": "sha512-LRneZZRXNgjzwG4bDQdOTSbze3fHm1EAKN/8bePxnlEZiBmkYEDggaHbuvHI9/hoqHbGfsEA7tWS9GhYHZBBsw==" }, "node_modules/sass": { - "version": "1.64.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.64.1.tgz", - "integrity": "sha512-16rRACSOFEE8VN7SCgBu1MpYCyN7urj9At898tyzdXFhC+a+yOX5dXwAR7L8/IdPJ1NB8OYoXmD55DM30B2kEQ==", + "version": "1.69.5", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.69.5.tgz", + "integrity": "sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -12496,18 +12315,6 @@ "dev": true, "optional": true }, - "node_modules/saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/schema-utils": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", @@ -12586,69 +12393,114 @@ } }, "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", "dev": true, "dependencies": { "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", + "depd": "~1.1.2", + "destroy": "~1.0.4", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/send/node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==", + "dev": true + }, + "node_modules/send/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 0.6" } }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/send/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/send/node_modules/mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", "dev": true, - "dependencies": { - "ms": "2.0.0" + "bin": { + "mime": "cli.js" } }, - "node_modules/send/node_modules/debug/node_modules/ms": { + "node_modules/send/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "node_modules/send/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "node_modules/send/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", "dev": true, - "bin": { - "mime": "cli.js" + "dependencies": { + "ee-first": "1.1.1" }, "engines": { - "node": ">=4" + "node": ">= 0.8" } }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "node_modules/send/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", "dev": true }, "node_modules/send/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", "dev": true, "engines": { - "node": ">= 0.8" + "node": ">= 0.6" } }, "node_modules/serialize-javascript": { @@ -12730,24 +12582,24 @@ "dev": true }, "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", "dev": true, "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" + "parseurl": "~1.3.2", + "send": "0.16.2" }, "engines": { "node": ">= 0.8.0" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "node_modules/server-destroy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", + "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==", "dev": true }, "node_modules/setprototypeof": { @@ -12819,106 +12671,18 @@ "dev": true }, "node_modules/sigstore": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.9.0.tgz", - "integrity": "sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==", - "dev": true, - "dependencies": { - "@sigstore/bundle": "^1.1.0", - "@sigstore/protobuf-specs": "^0.2.0", - "@sigstore/sign": "^1.0.0", - "@sigstore/tuf": "^1.0.3", - "make-fetch-happen": "^11.0.1" - }, - "bin": { - "sigstore": "bin/sigstore.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/sigstore/node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/sigstore/node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/sigstore/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/sigstore/node_modules/make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", - "dev": true, - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/sigstore/node_modules/minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-2.1.0.tgz", + "integrity": "sha512-kPIj+ZLkyI3QaM0qX8V/nSsweYND3W448pwkDgS6CQ74MfhEkIR8ToK5Iyx46KJYRjseVcD3Rp9zAmUAj6ZjPw==", "dev": true, "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "@sigstore/bundle": "^2.1.0", + "@sigstore/protobuf-specs": "^0.2.1", + "@sigstore/sign": "^2.1.0", + "@sigstore/tuf": "^2.1.0" }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/sigstore/node_modules/minipass-fetch/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/sisteransi": { @@ -12972,10 +12736,25 @@ "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==", "dev": true }, + "node_modules/socket.io-client": { + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.3.tgz", + "integrity": "sha512-nU+ywttCyBitXIl9Xe0RSEfek4LneYkJxCeNnKCuhwoH4jGXO1ipIUw/VA/+Vvv2G1MTym11fzFC0SxkrcfXDw==", + "dev": true, + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/socket.io-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.1.tgz", - "integrity": "sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", "dev": true, "dependencies": { "@socket.io/component-emitter": "~3.1.0", @@ -13011,17 +12790,17 @@ } }, "node_modules/socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz", + "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", "dev": true, "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "socks": "^2.7.1" }, "engines": { - "node": ">= 10" + "node": ">= 14" } }, "node_modules/source-map": { @@ -13174,15 +12953,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/ssri/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -13192,6 +12962,22 @@ "node": ">= 0.6" } }, + "node_modules/stream-throttle": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz", + "integrity": "sha512-889+B9vN9dq7/vLbGyuHeZ6/ctf5sNuGWsDy89uNxkFTAgzy0eK7+w5fL3KLNRTkLle7EgZGvHUphZW0Q26MnQ==", + "dev": true, + "dependencies": { + "commander": "^2.2.0", + "limiter": "^1.0.5" + }, + "bin": { + "throttleproxy": "bin/throttleproxy.js" + }, + "engines": { + "node": ">= 0.10.0" + } + }, "node_modules/streamroller": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.3.tgz", @@ -13320,12 +13106,6 @@ "node": ">=0.10" } }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -13376,6 +13156,15 @@ "node": ">=8" } }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/teamcity-service-messages": { "version": "0.1.14", "resolved": "https://registry.npmjs.org/teamcity-service-messages/-/teamcity-service-messages-0.1.14.tgz", @@ -13383,9 +13172,9 @@ "dev": true }, "node_modules/terser": { - "version": "5.19.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", - "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.24.0.tgz", + "integrity": "sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -13545,12 +13334,6 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", @@ -13599,42 +13382,6 @@ "node": ">=0.6" } }, - "node_modules/tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", - "dev": true, - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie/node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "dev": true, - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -13743,106 +13490,22 @@ } }, "node_modules/tslib": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", - "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/tuf-js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.7.tgz", - "integrity": "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-2.1.0.tgz", + "integrity": "sha512-eD7YPPjVlMzdggrOeE8zwoegUaG/rt6Bt3jwoQPunRiNVzgcCE009UDFJKJjG+Gk9wFu6W/Vi+P5d/5QpdD9jA==", "dev": true, "dependencies": { - "@tufjs/models": "1.0.4", + "@tufjs/models": "2.0.0", "debug": "^4.3.4", - "make-fetch-happen": "^11.1.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/tuf-js/node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/tuf-js/node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/tuf-js/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/tuf-js/node_modules/make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", - "dev": true, - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/tuf-js/node_modules/minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", - "dev": true, - "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/tuf-js/node_modules/minipass-fetch/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, + "make-fetch-happen": "^13.0.0" + }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/type-fest": { @@ -13877,16 +13540,16 @@ "dev": true }, "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=14.17" } }, "node_modules/ua-parser-js": { @@ -13921,6 +13584,18 @@ "node": ">=0.8.0" } }, + "node_modules/undici": { + "version": "5.27.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.27.2.tgz", + "integrity": "sha512-iS857PdOEy/y3wlM3yRp+6SNQQ6xU0mmZcwRSriqk+et/cwWAtwmIGf6WkoDN2EK/AMdCO/dfXzIwi+rFMrjjQ==", + "dev": true, + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -14042,16 +13717,6 @@ "punycode": "^2.1.0" } }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -14108,14 +13773,14 @@ } }, "node_modules/vite": { - "version": "4.4.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.7.tgz", - "integrity": "sha512-6pYf9QJ1mHylfVh39HpuSfMPojPSKVxZvnclX1K1FyZ1PXDOcLBibdq5t1qxJSnL63ca8Wf4zts6mD8u8oc9Fw==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.1.tgz", + "integrity": "sha512-AXXFaAJ8yebyqzoNB9fu2pHoo/nWX+xZlaRwoeYUxEqBO+Zj4msE5G+BhGBll9lYEKv9Hfks52PAF2X7qDYXQA==", "dev": true, "dependencies": { "esbuild": "^0.18.10", - "postcss": "^8.4.26", - "rollup": "^3.25.2" + "postcss": "^8.4.27", + "rollup": "^3.27.1" }, "bin": { "vite": "bin/vite.js" @@ -14171,33 +13836,11 @@ "node": ">=0.10.0" } }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", - "dev": true, - "dependencies": { - "browser-process-hrtime": "^1.0.0" - } - }, "node_modules/w3c-keyname": { "version": "2.2.6", "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.6.tgz", "integrity": "sha512-f+fciywl1SJEniZHD6H+kUO8gOnwIr7f4ijKA6+ZvJFjeGi1r4PDLl53Ayud9O/rk64RqgoQine0feoeOU0kXg==" }, - "node_modules/w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dev": true, - "dependencies": { - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/watchpack": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", @@ -14253,19 +13896,10 @@ "defaults": "^1.0.3" } }, - "node_modules/webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true, - "engines": { - "node": ">=10.4" - } - }, "node_modules/webpack": { - "version": "5.88.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", - "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", + "version": "5.89.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", + "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -14396,6 +14030,15 @@ } } }, + "node_modules/webpack-dev-server/node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, "node_modules/webpack-dev-server/node_modules/webpack-dev-middleware": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", @@ -14420,9 +14063,9 @@ } }, "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.14.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", - "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", "dev": true, "engines": { "node": ">=10.0.0" @@ -14441,12 +14084,13 @@ } }, "node_modules/webpack-merge": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz", - "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", "dev": true, "dependencies": { "clone-deep": "^4.0.1", + "flat": "^5.0.2", "wildcard": "^2.0.0" }, "engines": { @@ -14568,35 +14212,6 @@ "node": ">=0.8.0" } }, - "node_modules/whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, - "dependencies": { - "iconv-lite": "0.4.24" - } - }, - "node_modules/whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true - }, - "node_modules/whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", - "dev": true, - "dependencies": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -14609,15 +14224,6 @@ "which": "bin/which" } }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, "node_modules/wildcard": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", @@ -14758,17 +14364,14 @@ } } }, - "node_modules/xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true + "node_modules/xmlhttprequest-ssl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", + "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } }, "node_modules/y18n": { "version": "5.0.8", @@ -14839,9 +14442,9 @@ } }, "node_modules/zone.js": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.13.0.tgz", - "integrity": "sha512-7m3hNNyswsdoDobCkYNAy5WiUulkMd3+fWaGT9ij6iq3Zr/IwJo4RMCYPSDjT+r7tnPErmY9sZpKhWQ8S5k6XQ==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.14.3.tgz", + "integrity": "sha512-jYoNqF046Q+JfcZSItRSt+oXFcpXL88yq7XAZjb/NKTS7w2hHpKjRJ3VlFD1k75wMaRRXNUt5vrZVlygiMyHbA==", "dependencies": { "tslib": "^2.3.0" } @@ -14859,12 +14462,12 @@ } }, "@angular-devkit/architect": { - "version": "0.1602.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1602.10.tgz", - "integrity": "sha512-FwemQXh3edqA/S6zPpsqKei5v7gt0R0WpjJoAJaz+FOpfDwij1fwnKr88XINY8xcefTcQaTDQxJZheJShA/hHw==", + "version": "0.1700.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1700.9.tgz", + "integrity": "sha512-B8OeUrvJj5JsfOJIibpoVjvuZzthPFxf1LvuUXTyQcqDUscJAe/RJBc2woT6ss13Iv/HWt8mgaMPP4CccckdNg==", "dev": true, "requires": { - "@angular-devkit/core": "16.2.10", + "@angular-devkit/core": "17.0.9", "rxjs": "7.8.1" }, "dependencies": { @@ -14880,292 +14483,269 @@ } }, "@angular-devkit/build-angular": { - "version": "16.2.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.2.10.tgz", - "integrity": "sha512-msB/qjIsAOySDxdU5DpcX2sWGUEJOFIO03O9+HbtLwf3NDfe74mFfejxuKlHJXIJdgpM2Zc948M6+618QKpUYA==", + "version": "17.0.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-17.0.9.tgz", + "integrity": "sha512-yH6AfR2/CXrp05dIFQCroyl6Eaq8mS6tt4P7yS48+KXvAbQq2KzYW+TrDD4flFXe3qLVQGFpds3jE2auiwhHsA==", "dev": true, "requires": { "@ampproject/remapping": "2.2.1", - "@angular-devkit/architect": "0.1602.10", - "@angular-devkit/build-webpack": "0.1602.10", - "@angular-devkit/core": "16.2.10", - "@babel/core": "7.22.9", - "@babel/generator": "7.22.9", + "@angular-devkit/architect": "0.1700.9", + "@angular-devkit/build-webpack": "0.1700.9", + "@angular-devkit/core": "17.0.9", + "@babel/core": "7.23.2", + "@babel/generator": "7.23.0", "@babel/helper-annotate-as-pure": "7.22.5", "@babel/helper-split-export-declaration": "7.22.6", - "@babel/plugin-proposal-async-generator-functions": "7.20.7", + "@babel/plugin-transform-async-generator-functions": "7.23.2", "@babel/plugin-transform-async-to-generator": "7.22.5", - "@babel/plugin-transform-runtime": "7.22.9", - "@babel/preset-env": "7.22.9", - "@babel/runtime": "7.22.6", - "@babel/template": "7.22.5", + "@babel/plugin-transform-runtime": "7.23.2", + "@babel/preset-env": "7.23.2", + "@babel/runtime": "7.23.2", "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "16.2.10", + "@ngtools/webpack": "17.0.9", "@vitejs/plugin-basic-ssl": "1.0.1", "ansi-colors": "4.1.3", - "autoprefixer": "10.4.14", + "autoprefixer": "10.4.16", "babel-loader": "9.1.3", "babel-plugin-istanbul": "6.1.1", + "browser-sync": "2.29.3", "browserslist": "^4.21.5", "chokidar": "3.5.3", "copy-webpack-plugin": "11.0.0", "critters": "0.0.20", "css-loader": "6.8.1", - "esbuild": "0.18.17", - "esbuild-wasm": "0.18.17", + "esbuild": "0.19.5", + "esbuild-wasm": "0.19.5", "fast-glob": "3.3.1", - "guess-parser": "0.4.22", - "https-proxy-agent": "5.0.1", - "inquirer": "8.2.4", + "http-proxy-middleware": "2.0.6", + "https-proxy-agent": "7.0.2", + "inquirer": "9.2.11", "jsonc-parser": "3.2.0", "karma-source-map-support": "1.4.0", - "less": "4.1.3", + "less": "4.2.0", "less-loader": "11.1.0", "license-webpack-plugin": "4.0.2", "loader-utils": "3.2.1", - "magic-string": "0.30.1", + "magic-string": "0.30.5", "mini-css-extract-plugin": "2.7.6", "mrmime": "1.0.1", "open": "8.4.2", "ora": "5.4.1", "parse5-html-rewriting-stream": "7.0.0", - "picomatch": "2.3.1", - "piscina": "4.0.0", + "picomatch": "3.0.1", + "piscina": "4.1.0", "postcss": "8.4.31", "postcss-loader": "7.3.3", "resolve-url-loader": "5.0.0", "rxjs": "7.8.1", - "sass": "1.64.1", + "sass": "1.69.5", "sass-loader": "13.3.2", "semver": "7.5.4", "source-map-loader": "4.0.1", "source-map-support": "0.5.21", - "terser": "5.19.2", + "terser": "5.24.0", "text-table": "0.2.0", "tree-kill": "1.2.2", - "tslib": "2.6.1", - "vite": "4.4.7", - "webpack": "5.88.2", + "tslib": "2.6.2", + "undici": "5.27.2", + "vite": "4.5.1", + "webpack": "5.89.0", "webpack-dev-middleware": "6.1.1", "webpack-dev-server": "4.15.1", - "webpack-merge": "5.9.0", + "webpack-merge": "5.10.0", "webpack-subresource-integrity": "5.1.0" }, "dependencies": { - "@babel/core": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", - "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.9", - "@babel/helper-compilation-targets": "^7.22.9", - "@babel/helper-module-transforms": "^7.22.9", - "@babel/helpers": "^7.22.6", - "@babel/parser": "^7.22.7", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.8", - "@babel/types": "^7.22.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.1" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, "@esbuild/android-arm": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.17.tgz", - "integrity": "sha512-wHsmJG/dnL3OkpAcwbgoBTTMHVi4Uyou3F5mf58ZtmUyIKfcdA7TROav/6tCzET4A3QW2Q2FC+eFneMU+iyOxg==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.5.tgz", + "integrity": "sha512-bhvbzWFF3CwMs5tbjf3ObfGqbl/17ict2/uwOSfr3wmxDE6VdS2GqY/FuzIPe0q0bdhj65zQsvqfArI9MY6+AA==", "dev": true, "optional": true }, "@esbuild/android-arm64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.17.tgz", - "integrity": "sha512-9np+YYdNDed5+Jgr1TdWBsozZ85U1Oa3xW0c7TWqH0y2aGghXtZsuT8nYRbzOMcl0bXZXjOGbksoTtVOlWrRZg==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.5.tgz", + "integrity": "sha512-5d1OkoJxnYQfmC+Zd8NBFjkhyCNYwM4n9ODrycTFY6Jk1IGiZ+tjVJDDSwDt77nK+tfpGP4T50iMtVi4dEGzhQ==", "dev": true, "optional": true }, "@esbuild/android-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.17.tgz", - "integrity": "sha512-O+FeWB/+xya0aLg23hHEM2E3hbfwZzjqumKMSIqcHbNvDa+dza2D0yLuymRBQQnC34CWrsJUXyH2MG5VnLd6uw==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.5.tgz", + "integrity": "sha512-9t+28jHGL7uBdkBjL90QFxe7DVA+KGqWlHCF8ChTKyaKO//VLuoBricQCgwhOjA1/qOczsw843Fy4cbs4H3DVA==", "dev": true, "optional": true }, "@esbuild/darwin-arm64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.17.tgz", - "integrity": "sha512-M9uJ9VSB1oli2BE/dJs3zVr9kcCBBsE883prage1NWz6pBS++1oNn/7soPNS3+1DGj0FrkSvnED4Bmlu1VAE9g==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.5.tgz", + "integrity": "sha512-mvXGcKqqIqyKoxq26qEDPHJuBYUA5KizJncKOAf9eJQez+L9O+KfvNFu6nl7SCZ/gFb2QPaRqqmG0doSWlgkqw==", "dev": true, "optional": true }, "@esbuild/darwin-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.17.tgz", - "integrity": "sha512-XDre+J5YeIJDMfp3n0279DFNrGCXlxOuGsWIkRb1NThMZ0BsrWXoTg23Jer7fEXQ9Ye5QjrvXpxnhzl3bHtk0g==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.5.tgz", + "integrity": "sha512-Ly8cn6fGLNet19s0X4unjcniX24I0RqjPv+kurpXabZYSXGM4Pwpmf85WHJN3lAgB8GSth7s5A0r856S+4DyiA==", "dev": true, "optional": true }, "@esbuild/freebsd-arm64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.17.tgz", - "integrity": "sha512-cjTzGa3QlNfERa0+ptykyxs5A6FEUQQF0MuilYXYBGdBxD3vxJcKnzDlhDCa1VAJCmAxed6mYhA2KaJIbtiNuQ==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.5.tgz", + "integrity": "sha512-GGDNnPWTmWE+DMchq1W8Sd0mUkL+APvJg3b11klSGUDvRXh70JqLAO56tubmq1s2cgpVCSKYywEiKBfju8JztQ==", "dev": true, "optional": true }, "@esbuild/freebsd-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.17.tgz", - "integrity": "sha512-sOxEvR8d7V7Kw8QqzxWc7bFfnWnGdaFBut1dRUYtu+EIRXefBc/eIsiUiShnW0hM3FmQ5Zf27suDuHsKgZ5QrA==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.5.tgz", + "integrity": "sha512-1CCwDHnSSoA0HNwdfoNY0jLfJpd7ygaLAp5EHFos3VWJCRX9DMwWODf96s9TSse39Br7oOTLryRVmBoFwXbuuQ==", "dev": true, "optional": true }, "@esbuild/linux-arm": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.17.tgz", - "integrity": "sha512-2d3Lw6wkwgSLC2fIvXKoMNGVaeY8qdN0IC3rfuVxJp89CRfA3e3VqWifGDfuakPmp90+ZirmTfye1n4ncjv2lg==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.5.tgz", + "integrity": "sha512-lrWXLY/vJBzCPC51QN0HM71uWgIEpGSjSZZADQhq7DKhPcI6NH1IdzjfHkDQws2oNpJKpR13kv7/pFHBbDQDwQ==", "dev": true, "optional": true }, "@esbuild/linux-arm64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.17.tgz", - "integrity": "sha512-c9w3tE7qA3CYWjT+M3BMbwMt+0JYOp3vCMKgVBrCl1nwjAlOMYzEo+gG7QaZ9AtqZFj5MbUc885wuBBmu6aADQ==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.5.tgz", + "integrity": "sha512-o3vYippBmSrjjQUCEEiTZ2l+4yC0pVJD/Dl57WfPwwlvFkrxoSO7rmBZFii6kQB3Wrn/6GwJUPLU5t52eq2meA==", "dev": true, "optional": true }, "@esbuild/linux-ia32": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.17.tgz", - "integrity": "sha512-1DS9F966pn5pPnqXYz16dQqWIB0dmDfAQZd6jSSpiT9eX1NzKh07J6VKR3AoXXXEk6CqZMojiVDSZi1SlmKVdg==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.5.tgz", + "integrity": "sha512-MkjHXS03AXAkNp1KKkhSKPOCYztRtK+KXDNkBa6P78F8Bw0ynknCSClO/ztGszILZtyO/lVKpa7MolbBZ6oJtQ==", "dev": true, "optional": true }, "@esbuild/linux-loong64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.17.tgz", - "integrity": "sha512-EvLsxCk6ZF0fpCB6w6eOI2Fc8KW5N6sHlIovNe8uOFObL2O+Mr0bflPHyHwLT6rwMg9r77WOAWb2FqCQrVnwFg==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.5.tgz", + "integrity": "sha512-42GwZMm5oYOD/JHqHska3Jg0r+XFb/fdZRX+WjADm3nLWLcIsN27YKtqxzQmGNJgu0AyXg4HtcSK9HuOk3v1Dw==", "dev": true, "optional": true }, "@esbuild/linux-mips64el": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.17.tgz", - "integrity": "sha512-e0bIdHA5p6l+lwqTE36NAW5hHtw2tNRmHlGBygZC14QObsA3bD4C6sXLJjvnDIjSKhW1/0S3eDy+QmX/uZWEYQ==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.5.tgz", + "integrity": "sha512-kcjndCSMitUuPJobWCnwQ9lLjiLZUR3QLQmlgaBfMX23UEa7ZOrtufnRds+6WZtIS9HdTXqND4yH8NLoVVIkcg==", "dev": true, "optional": true }, "@esbuild/linux-ppc64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.17.tgz", - "integrity": "sha512-BAAilJ0M5O2uMxHYGjFKn4nJKF6fNCdP1E0o5t5fvMYYzeIqy2JdAP88Az5LHt9qBoUa4tDaRpfWt21ep5/WqQ==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.5.tgz", + "integrity": "sha512-yJAxJfHVm0ZbsiljbtFFP1BQKLc8kUF6+17tjQ78QjqjAQDnhULWiTA6u0FCDmYT1oOKS9PzZ2z0aBI+Mcyj7Q==", "dev": true, "optional": true }, "@esbuild/linux-riscv64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.17.tgz", - "integrity": "sha512-Wh/HW2MPnC3b8BqRSIme/9Zhab36PPH+3zam5pqGRH4pE+4xTrVLx2+XdGp6fVS3L2x+DrsIcsbMleex8fbE6g==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.5.tgz", + "integrity": "sha512-5u8cIR/t3gaD6ad3wNt1MNRstAZO+aNyBxu2We8X31bA8XUNyamTVQwLDA1SLoPCUehNCymhBhK3Qim1433Zag==", "dev": true, "optional": true }, "@esbuild/linux-s390x": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.17.tgz", - "integrity": "sha512-j/34jAl3ul3PNcK3pfI0NSlBANduT2UO5kZ7FCaK33XFv3chDhICLY8wJJWIhiQ+YNdQ9dxqQctRg2bvrMlYgg==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.5.tgz", + "integrity": "sha512-Z6JrMyEw/EmZBD/OFEFpb+gao9xJ59ATsoTNlj39jVBbXqoZm4Xntu6wVmGPB/OATi1uk/DB+yeDPv2E8PqZGw==", "dev": true, "optional": true }, "@esbuild/linux-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.17.tgz", - "integrity": "sha512-QM50vJ/y+8I60qEmFxMoxIx4de03pGo2HwxdBeFd4nMh364X6TIBZ6VQ5UQmPbQWUVWHWws5MmJXlHAXvJEmpQ==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.5.tgz", + "integrity": "sha512-psagl+2RlK1z8zWZOmVdImisMtrUxvwereIdyJTmtmHahJTKb64pAcqoPlx6CewPdvGvUKe2Jw+0Z/0qhSbG1A==", "dev": true, "optional": true }, "@esbuild/netbsd-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.17.tgz", - "integrity": "sha512-/jGlhWR7Sj9JPZHzXyyMZ1RFMkNPjC6QIAan0sDOtIo2TYk3tZn5UDrkE0XgsTQCxWTTOcMPf9p6Rh2hXtl5TQ==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.5.tgz", + "integrity": "sha512-kL2l+xScnAy/E/3119OggX8SrWyBEcqAh8aOY1gr4gPvw76la2GlD4Ymf832UCVbmuWeTf2adkZDK+h0Z/fB4g==", "dev": true, "optional": true }, "@esbuild/openbsd-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.17.tgz", - "integrity": "sha512-rSEeYaGgyGGf4qZM2NonMhMOP/5EHp4u9ehFiBrg7stH6BYEEjlkVREuDEcQ0LfIl53OXLxNbfuIj7mr5m29TA==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.5.tgz", + "integrity": "sha512-sPOfhtzFufQfTBgRnE1DIJjzsXukKSvZxloZbkJDG383q0awVAq600pc1nfqBcl0ice/WN9p4qLc39WhBShRTA==", "dev": true, "optional": true }, "@esbuild/sunos-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.17.tgz", - "integrity": "sha512-Y7ZBbkLqlSgn4+zot4KUNYst0bFoO68tRgI6mY2FIM+b7ZbyNVtNbDP5y8qlu4/knZZ73fgJDlXID+ohY5zt5g==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.5.tgz", + "integrity": "sha512-dGZkBXaafuKLpDSjKcB0ax0FL36YXCvJNnztjKV+6CO82tTYVDSH2lifitJ29jxRMoUhgkg9a+VA/B03WK5lcg==", "dev": true, "optional": true }, "@esbuild/win32-arm64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.17.tgz", - "integrity": "sha512-bwPmTJsEQcbZk26oYpc4c/8PvTY3J5/QK8jM19DVlEsAB41M39aWovWoHtNm78sd6ip6prilxeHosPADXtEJFw==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.5.tgz", + "integrity": "sha512-dWVjD9y03ilhdRQ6Xig1NWNgfLtf2o/STKTS+eZuF90fI2BhbwD6WlaiCGKptlqXlURVB5AUOxUj09LuwKGDTg==", "dev": true, "optional": true }, "@esbuild/win32-ia32": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.17.tgz", - "integrity": "sha512-H/XaPtPKli2MhW+3CQueo6Ni3Avggi6hP/YvgkEe1aSaxw+AeO8MFjq8DlgfTd9Iz4Yih3QCZI6YLMoyccnPRg==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.5.tgz", + "integrity": "sha512-4liggWIA4oDgUxqpZwrDhmEfAH4d0iljanDOK7AnVU89T6CzHon/ony8C5LeOdfgx60x5cnQJFZwEydVlYx4iw==", "dev": true, "optional": true }, "@esbuild/win32-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.17.tgz", - "integrity": "sha512-fGEb8f2BSA3CW7riJVurug65ACLuQAzKq0SSqkY2b2yHHH0MzDfbLyKIGzHwOI/gkHcxM/leuSW6D5w/LMNitA==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.5.tgz", + "integrity": "sha512-czTrygUsB/jlM8qEW5MD8bgYU2Xg14lo6kBDXW6HdxKjh8M5PzETGiSHaz9MtbXBYDloHNUAUW2tMiKW4KM9Mw==", "dev": true, "optional": true }, + "@ngtools/webpack": { + "version": "17.0.9", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-17.0.9.tgz", + "integrity": "sha512-ilbzwW30NaccrhYbdY3jy/ZpbC0l7W6+L2Cd3dzHFQ1gZGckibDdMzjibW/vyq/vRf0xr25+oBVIqUn8kZ606g==", + "dev": true, + "requires": {} + }, "esbuild": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.17.tgz", - "integrity": "sha512-1GJtYnUxsJreHYA0Y+iQz2UEykonY66HNWOb0yXYZi9/kNrORUEHVg87eQsCtqh59PEJ5YVZJO98JHznMJSWjg==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.5.tgz", + "integrity": "sha512-bUxalY7b1g8vNhQKdB24QDmHeY4V4tw/s6Ak5z+jJX9laP5MoQseTOMemAr0gxssjNcH0MCViG8ONI2kksvfFQ==", "dev": true, "optional": true, "requires": { - "@esbuild/android-arm": "0.18.17", - "@esbuild/android-arm64": "0.18.17", - "@esbuild/android-x64": "0.18.17", - "@esbuild/darwin-arm64": "0.18.17", - "@esbuild/darwin-x64": "0.18.17", - "@esbuild/freebsd-arm64": "0.18.17", - "@esbuild/freebsd-x64": "0.18.17", - "@esbuild/linux-arm": "0.18.17", - "@esbuild/linux-arm64": "0.18.17", - "@esbuild/linux-ia32": "0.18.17", - "@esbuild/linux-loong64": "0.18.17", - "@esbuild/linux-mips64el": "0.18.17", - "@esbuild/linux-ppc64": "0.18.17", - "@esbuild/linux-riscv64": "0.18.17", - "@esbuild/linux-s390x": "0.18.17", - "@esbuild/linux-x64": "0.18.17", - "@esbuild/netbsd-x64": "0.18.17", - "@esbuild/openbsd-x64": "0.18.17", - "@esbuild/sunos-x64": "0.18.17", - "@esbuild/win32-arm64": "0.18.17", - "@esbuild/win32-ia32": "0.18.17", - "@esbuild/win32-x64": "0.18.17" + "@esbuild/android-arm": "0.19.5", + "@esbuild/android-arm64": "0.19.5", + "@esbuild/android-x64": "0.19.5", + "@esbuild/darwin-arm64": "0.19.5", + "@esbuild/darwin-x64": "0.19.5", + "@esbuild/freebsd-arm64": "0.19.5", + "@esbuild/freebsd-x64": "0.19.5", + "@esbuild/linux-arm": "0.19.5", + "@esbuild/linux-arm64": "0.19.5", + "@esbuild/linux-ia32": "0.19.5", + "@esbuild/linux-loong64": "0.19.5", + "@esbuild/linux-mips64el": "0.19.5", + "@esbuild/linux-ppc64": "0.19.5", + "@esbuild/linux-riscv64": "0.19.5", + "@esbuild/linux-s390x": "0.19.5", + "@esbuild/linux-x64": "0.19.5", + "@esbuild/netbsd-x64": "0.19.5", + "@esbuild/openbsd-x64": "0.19.5", + "@esbuild/sunos-x64": "0.19.5", + "@esbuild/win32-arm64": "0.19.5", + "@esbuild/win32-ia32": "0.19.5", + "@esbuild/win32-x64": "0.19.5" } }, "lru-cache": { @@ -15177,6 +14757,12 @@ "yallist": "^4.0.0" } }, + "picomatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", + "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", + "dev": true + }, "rxjs": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", @@ -15198,12 +14784,12 @@ } }, "@angular-devkit/build-webpack": { - "version": "0.1602.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1602.10.tgz", - "integrity": "sha512-H7HiFKbZl/xVxpr1RH05SGawTpA1417wvr2nFGRu2OiePd0lPr6pIhcq8F8gt7JcA8yZKKaqjn2gU+6um2MFLg==", + "version": "0.1700.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1700.9.tgz", + "integrity": "sha512-NBpTb5kdnTePtNirsJQFXfOIFKTPdDqJe0b0sI3FI860po7uvUFu1m5pL5QSkJLmdqrjfPkNq7svGf7NlHQ8JA==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1602.10", + "@angular-devkit/architect": "0.1700.9", "rxjs": "7.8.1" }, "dependencies": { @@ -15219,19 +14805,25 @@ } }, "@angular-devkit/core": { - "version": "16.2.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.10.tgz", - "integrity": "sha512-eo7suLDjyu5bSlEr4TluYkFm4v2PVLSAPgnau8XHHlN5Yg4P/BZ00ve7LA7C9S1gzRSCrxQhK5ki4rnoFTo5zg==", + "version": "17.0.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.0.9.tgz", + "integrity": "sha512-r5jqwpWOgowqe9KSDqJ3iSbmsEt2XPjSvRG4DSI2T9s31bReoMtreo8b7wkRa2B3hbcDnstFbn8q27VvJDqRaQ==", "dev": true, "requires": { "ajv": "8.12.0", "ajv-formats": "2.1.1", "jsonc-parser": "3.2.0", - "picomatch": "2.3.1", + "picomatch": "3.0.1", "rxjs": "7.8.1", "source-map": "0.7.4" }, "dependencies": { + "picomatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", + "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", + "dev": true + }, "rxjs": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", @@ -15244,14 +14836,14 @@ } }, "@angular-devkit/schematics": { - "version": "16.2.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.2.10.tgz", - "integrity": "sha512-UCfPJKVNekb21bWRbzyx81tfHN3x8vU4ZMX/VA6xALg//QalMB7NOkkXBAssthnLastkyzkUtlvApTp2+R+EkQ==", + "version": "17.0.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.0.9.tgz", + "integrity": "sha512-5ti7g45F2KjDJS0DbgnOGI1GyKxGpn4XsKTYJFJrSAWj6VpuvPy/DINRrXNuRVo09VPEkqA+IW7QwaG9icptQg==", "dev": true, "requires": { - "@angular-devkit/core": "16.2.10", + "@angular-devkit/core": "17.0.9", "jsonc-parser": "3.2.0", - "magic-string": "0.30.1", + "magic-string": "0.30.5", "ora": "5.4.1", "rxjs": "7.8.1" }, @@ -15268,9 +14860,9 @@ } }, "@angular/animations": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-16.2.12.tgz", - "integrity": "sha512-MD0ElviEfAJY8qMOd6/jjSSvtqER2RDAi0lxe6EtUacC1DHCYkaPrKW4vLqY+tmZBg1yf+6n+uS77pXcHHcA3w==", + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.0.8.tgz", + "integrity": "sha512-iKJ2s4ZqVoGS9tSRBuuwYEWTV+Rw6b4zDY1rqiXvbZrpNRxfzYr6s+aYsLQQEindZ4hzxgp9j60FJ8aE/g4w6A==", "requires": { "tslib": "^2.3.0" } @@ -15296,26 +14888,26 @@ } }, "@angular/cli": { - "version": "16.2.10", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-16.2.10.tgz", - "integrity": "sha512-zDqlD+rXFuYZP169c2v35HkMbkchVCft5sS+VpoCCgYTk2rwxpeYkjJ8DQZztZJZRXQ+EMpkv/TubswmDro2zA==", + "version": "17.0.9", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-17.0.9.tgz", + "integrity": "sha512-a1rLAu3TNU5d56ozBnx9UZchJDKC8qMvZL4ThJhcaTUJb0Cj//gqLJdNdMcB0p1Ve9lmmAQ3J17+2Xij1u3sNg==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1602.10", - "@angular-devkit/core": "16.2.10", - "@angular-devkit/schematics": "16.2.10", - "@schematics/angular": "16.2.10", + "@angular-devkit/architect": "0.1700.9", + "@angular-devkit/core": "17.0.9", + "@angular-devkit/schematics": "17.0.9", + "@schematics/angular": "17.0.9", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.3", "ini": "4.1.1", - "inquirer": "8.2.4", + "inquirer": "9.2.11", "jsonc-parser": "3.2.0", - "npm-package-arg": "10.1.0", - "npm-pick-manifest": "8.0.1", + "npm-package-arg": "11.0.1", + "npm-pick-manifest": "9.0.0", "open": "8.4.2", "ora": "5.4.1", - "pacote": "15.2.0", - "resolve": "1.22.2", + "pacote": "17.0.4", + "resolve": "1.22.8", "semver": "7.5.4", "symbol-observable": "4.0.0", "yargs": "17.7.2" @@ -15342,25 +14934,25 @@ } }, "@angular/common": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-16.2.12.tgz", - "integrity": "sha512-B+WY/cT2VgEaz9HfJitBmgdk4I333XG/ybC98CMC4Wz8E49T8yzivmmxXB3OD6qvjcOB6ftuicl6WBqLbZNg2w==", + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.0.8.tgz", + "integrity": "sha512-fFfwtdg7H+OkqnvV/ENu8F8KGfgIiH16DDbQqYY5KQyyQB+SMsoVW29F1fGx6Y30s7ZlsLOy6cHhgrw74itkSw==", "requires": { "tslib": "^2.3.0" } }, "@angular/compiler": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-16.2.12.tgz", - "integrity": "sha512-6SMXUgSVekGM7R6l1Z9rCtUGtlg58GFmgbpMCsGf+VXxP468Njw8rjT2YZkf5aEPxEuRpSHhDYjqz7n14cwCXQ==", + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.0.8.tgz", + "integrity": "sha512-48jWypuhBGTrUUbkz1vB9gjbKKZ3hpuJ2DUUncd331Yw4tqkqZQbBa/E3ei4IHiCxEvW2uX3lI4AwlhuozmUtA==", "requires": { "tslib": "^2.3.0" } }, "@angular/compiler-cli": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-16.2.12.tgz", - "integrity": "sha512-pWSrr152562ujh6lsFZR8NfNc5Ljj+zSTQO44DsuB0tZjwEpnRcjJEgzuhGXr+CoiBf+jTSPZKemtSktDk5aaA==", + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.0.8.tgz", + "integrity": "sha512-ny2SMVgl+icjMuU5ZM57yFGUrhjR0hNxfCn0otAD3jUFliz/Onu9l6EPRKA5Cr8MZx3mg3rTLSBMD17YT8rsOg==", "dev": true, "requires": { "@babel/core": "7.23.2", @@ -15374,17 +14966,17 @@ } }, "@angular/core": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-16.2.12.tgz", - "integrity": "sha512-GLLlDeke/NjroaLYOks0uyzFVo6HyLl7VOm0K1QpLXnYvW63W9Ql/T3yguRZa7tRkOAeFZ3jw+1wnBD4O8MoUA==", + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.0.8.tgz", + "integrity": "sha512-tzYsK24LdkNuKNJK6efF4XOqspvF/qOe9j/n1Y61a6mNvFwsJFGbcmdZMby4hI/YRm6oIDoIIFjSep8ycp6Pbw==", "requires": { "tslib": "^2.3.0" } }, "@angular/forms": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-16.2.12.tgz", - "integrity": "sha512-1Eao89hlBgLR3v8tU91vccn21BBKL06WWxl7zLpQmG6Hun+2jrThgOE4Pf3os4fkkbH4Apj0tWL2fNIWe/blbw==", + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-17.0.8.tgz", + "integrity": "sha512-WZBHbMQjaSovAzOMhKqZN+m7eUPGfOzh9rKFKvj6UQLIJ9qSpEpqlvL0omU1z/47s3XXeLiBzomMiRfQISJvvw==", "requires": { "tslib": "^2.3.0" } @@ -15445,25 +15037,25 @@ } }, "@angular/platform-browser": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-16.2.12.tgz", - "integrity": "sha512-NnH7ju1iirmVEsUq432DTm0nZBGQsBrU40M3ZeVHMQ2subnGiyUs3QyzDz8+VWLL/T5xTxWLt9BkDn65vgzlIQ==", + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.0.8.tgz", + "integrity": "sha512-XaI+p2AxQaIHzR761lhPUf4OcOp46WDW0IfbvOzaezHE+8r81joZyVSDQPgXSa/aRfI58YhcfUavuGqyU3PphA==", "requires": { "tslib": "^2.3.0" } }, "@angular/platform-browser-dynamic": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-16.2.12.tgz", - "integrity": "sha512-ya54jerNgreCVAR278wZavwjrUWImMr2F8yM5n9HBvsMBbFaAQ83anwbOEiHEF2BlR+gJiEBLfpuPRMw20pHqw==", + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.0.8.tgz", + "integrity": "sha512-BIXNKnfBZb8sdluQ7WIhIXFuVnsJJ0SV+aiMKzQ7B6XhWoAXZQnlvON2thydjIIVuCvaF3YmWTbILI2K8YZ2jQ==", "requires": { "tslib": "^2.3.0" } }, "@angular/router": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-16.2.12.tgz", - "integrity": "sha512-aU6QnYSza005V9P3W6PpkieL56O0IHps96DjqI1RS8yOJUl3THmokqYN4Fm5+HXy4f390FN9i6ftadYQDKeWmA==", + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-17.0.8.tgz", + "integrity": "sha512-ptphcRe1RG/mIS60R7ZPilkkrxautqB0sOhds3h5VP3g628G1a2HWzvnmvjEfpJWDMFivV32VJMMBtTLqGr+0Q==", "requires": { "tslib": "^2.3.0" } @@ -15485,9 +15077,9 @@ } }, "@babel/compat-data": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz", - "integrity": "sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", "dev": true }, "@babel/core": { @@ -15525,17 +15117,6 @@ "jsesc": "^2.5.1" } }, - "@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - } - }, "convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -15551,12 +15132,12 @@ } }, "@babel/generator": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", - "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, "requires": { - "@babel/types": "^7.22.5", + "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -15581,14 +15162,14 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", "dev": true, "requires": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -15602,17 +15183,17 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", - "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.7.tgz", + "integrity": "sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.23.0", "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-replace-supers": "^7.22.20", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", "semver": "^6.3.1" @@ -15646,9 +15227,9 @@ } }, "@babel/helper-define-polyfill-provider": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz", - "integrity": "sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==", + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz", + "integrity": "sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==", "dev": true, "requires": { "@babel/helper-compilation-targets": "^7.22.6", @@ -15672,19 +15253,6 @@ "requires": { "@babel/template": "^7.22.15", "@babel/types": "^7.23.0" - }, - "dependencies": { - "@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - } - } } }, "@babel/helper-hoist-variables": { @@ -15804,9 +15372,9 @@ "dev": true }, "@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", "dev": true }, "@babel/helper-wrap-function": { @@ -15818,19 +15386,6 @@ "@babel/helper-function-name": "^7.22.5", "@babel/template": "^7.22.15", "@babel/types": "^7.22.19" - }, - "dependencies": { - "@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - } - } } }, "@babel/helpers": { @@ -15842,19 +15397,6 @@ "@babel/template": "^7.22.15", "@babel/traverse": "^7.23.4", "@babel/types": "^7.23.4" - }, - "dependencies": { - "@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - } - } } }, "@babel/highlight": { @@ -15894,18 +15436,6 @@ "@babel/plugin-transform-optional-chaining": "^7.23.3" } }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", - "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - } - }, "@babel/plugin-proposal-private-property-in-object": { "version": "7.21.0-placeholder-for-preset-env.2", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", @@ -15913,16 +15443,6 @@ "dev": true, "requires": {} }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, "@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", @@ -16096,9 +15616,9 @@ } }, "@babel/plugin-transform-async-generator-functions": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.4.tgz", - "integrity": "sha512-efdkfPhHYTtn0G6n2ddrESE91fgXxjlqLsnUtPWnJs4a4mZIbUaK7ffqKIIUKXSHwcDvaCVX6GXkaJJFqtX7jw==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz", + "integrity": "sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.22.20", @@ -16158,16 +15678,15 @@ } }, "@babel/plugin-transform-classes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.3.tgz", - "integrity": "sha512-FGEQmugvAEu2QtgtU0uTASXevfLMFfBeVCIIdcQhn/uBQsMTjBajdnAtanQlOcuihWh10PZ7+HWvc7NtBwP74w==", + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz", + "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-replace-supers": "^7.22.20", "@babel/helper-split-export-declaration": "^7.22.6", @@ -16182,19 +15701,6 @@ "requires": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/template": "^7.22.15" - }, - "dependencies": { - "@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - } - } } }, "@babel/plugin-transform-destructuring": { @@ -16256,12 +15762,13 @@ } }, "@babel/plugin-transform-for-of": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.3.tgz", - "integrity": "sha512-X8jSm8X1CMwxmK878qsUGJRmbysKNbdpTv/O1/v0LuY/ZkZrng5WYiekYSdg9m09OTmDDUWeEDsTE+17WYbAZw==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", + "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" } }, "@babel/plugin-transform-function-name": { @@ -16499,16 +16006,16 @@ } }, "@babel/plugin-transform-runtime": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.9.tgz", - "integrity": "sha512-9KjBH61AGJetCPYp/IEyLEp47SyybZb0nDRpBvmtEkm+rUIwxdlKpyNHI1TmsGkeuLclJdleQHRZ8XLBnnh8CQ==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.2.tgz", + "integrity": "sha512-XOntj6icgzMS58jPVtQpiuF6ZFWxQiJavISGx5KGjRj+3gqZr8+N6Kx+N9BApWzgS+DOjIZfXXj0ZesenOWDyA==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.4", - "babel-plugin-polyfill-corejs3": "^0.8.2", - "babel-plugin-polyfill-regenerator": "^0.5.1", + "babel-plugin-polyfill-corejs2": "^0.4.6", + "babel-plugin-polyfill-corejs3": "^0.8.5", + "babel-plugin-polyfill-regenerator": "^0.5.3", "semver": "^6.3.1" }, "dependencies": { @@ -16606,17 +16113,17 @@ } }, "@babel/preset-env": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.9.tgz", - "integrity": "sha512-wNi5H/Emkhll/bqPjsjQorSykrlfY5OWakd6AulLvMEytpKasMVUpVy8RL4qBIBs5Ac6/5i0/Rv0b/Fg6Eag/g==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.2.tgz", + "integrity": "sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ==", "dev": true, "requires": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-compilation-targets": "^7.22.9", + "@babel/compat-data": "^7.23.2", + "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.15", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.15", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", @@ -16637,58 +16144,58 @@ "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.22.5", - "@babel/plugin-transform-async-generator-functions": "^7.22.7", + "@babel/plugin-transform-async-generator-functions": "^7.23.2", "@babel/plugin-transform-async-to-generator": "^7.22.5", "@babel/plugin-transform-block-scoped-functions": "^7.22.5", - "@babel/plugin-transform-block-scoping": "^7.22.5", + "@babel/plugin-transform-block-scoping": "^7.23.0", "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-class-static-block": "^7.22.5", - "@babel/plugin-transform-classes": "^7.22.6", + "@babel/plugin-transform-class-static-block": "^7.22.11", + "@babel/plugin-transform-classes": "^7.22.15", "@babel/plugin-transform-computed-properties": "^7.22.5", - "@babel/plugin-transform-destructuring": "^7.22.5", + "@babel/plugin-transform-destructuring": "^7.23.0", "@babel/plugin-transform-dotall-regex": "^7.22.5", "@babel/plugin-transform-duplicate-keys": "^7.22.5", - "@babel/plugin-transform-dynamic-import": "^7.22.5", + "@babel/plugin-transform-dynamic-import": "^7.22.11", "@babel/plugin-transform-exponentiation-operator": "^7.22.5", - "@babel/plugin-transform-export-namespace-from": "^7.22.5", - "@babel/plugin-transform-for-of": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.11", + "@babel/plugin-transform-for-of": "^7.22.15", "@babel/plugin-transform-function-name": "^7.22.5", - "@babel/plugin-transform-json-strings": "^7.22.5", + "@babel/plugin-transform-json-strings": "^7.22.11", "@babel/plugin-transform-literals": "^7.22.5", - "@babel/plugin-transform-logical-assignment-operators": "^7.22.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.11", "@babel/plugin-transform-member-expression-literals": "^7.22.5", - "@babel/plugin-transform-modules-amd": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.22.5", - "@babel/plugin-transform-modules-systemjs": "^7.22.5", + "@babel/plugin-transform-modules-amd": "^7.23.0", + "@babel/plugin-transform-modules-commonjs": "^7.23.0", + "@babel/plugin-transform-modules-systemjs": "^7.23.0", "@babel/plugin-transform-modules-umd": "^7.22.5", "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", "@babel/plugin-transform-new-target": "^7.22.5", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.5", - "@babel/plugin-transform-numeric-separator": "^7.22.5", - "@babel/plugin-transform-object-rest-spread": "^7.22.5", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", + "@babel/plugin-transform-numeric-separator": "^7.22.11", + "@babel/plugin-transform-object-rest-spread": "^7.22.15", "@babel/plugin-transform-object-super": "^7.22.5", - "@babel/plugin-transform-optional-catch-binding": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.6", - "@babel/plugin-transform-parameters": "^7.22.5", + "@babel/plugin-transform-optional-catch-binding": "^7.22.11", + "@babel/plugin-transform-optional-chaining": "^7.23.0", + "@babel/plugin-transform-parameters": "^7.22.15", "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/plugin-transform-private-property-in-object": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.11", "@babel/plugin-transform-property-literals": "^7.22.5", - "@babel/plugin-transform-regenerator": "^7.22.5", + "@babel/plugin-transform-regenerator": "^7.22.10", "@babel/plugin-transform-reserved-words": "^7.22.5", "@babel/plugin-transform-shorthand-properties": "^7.22.5", "@babel/plugin-transform-spread": "^7.22.5", "@babel/plugin-transform-sticky-regex": "^7.22.5", "@babel/plugin-transform-template-literals": "^7.22.5", "@babel/plugin-transform-typeof-symbol": "^7.22.5", - "@babel/plugin-transform-unicode-escapes": "^7.22.5", + "@babel/plugin-transform-unicode-escapes": "^7.22.10", "@babel/plugin-transform-unicode-property-regex": "^7.22.5", "@babel/plugin-transform-unicode-regex": "^7.22.5", "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.4", - "babel-plugin-polyfill-corejs3": "^0.8.2", - "babel-plugin-polyfill-regenerator": "^0.5.1", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "@babel/types": "^7.23.0", + "babel-plugin-polyfill-corejs2": "^0.4.6", + "babel-plugin-polyfill-corejs3": "^0.8.5", + "babel-plugin-polyfill-regenerator": "^0.5.3", "core-js-compat": "^3.31.0", "semver": "^6.3.1" }, @@ -16702,14 +16209,12 @@ } }, "@babel/preset-modules": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6.tgz", - "integrity": "sha512-ID2yj6K/4lKfhuU3+EX4UvNbIt7eACFbHmNUjzA+ep+B5971CknnA/9DEWKbRokfbbtblxxxXFJJrH47UEAMVg==", + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", "@babel/types": "^7.4.4", "esutils": "^2.0.2" } @@ -16721,23 +16226,23 @@ "dev": true }, "@babel/runtime": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", - "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", + "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", "dev": true, "requires": { - "regenerator-runtime": "^0.13.11" + "regenerator-runtime": "^0.14.0" } }, "@babel/template": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "requires": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" } }, "@babel/traverse": { @@ -16949,6 +16454,12 @@ "dev": true, "optional": true }, + "@fastify/busboy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz", + "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==", + "dev": true + }, "@floating-ui/core": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.2.0.tgz", @@ -16962,12 +16473,6 @@ "@floating-ui/core": "^1.2.0" } }, - "@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "dev": true - }, "@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -17107,6 +16612,15 @@ "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", "dev": true }, + "@ljharb/through": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.11.tgz", + "integrity": "sha512-ccfcIDlogiXNq5KcbAwbaO7lMh3Tm1i3khMPYpxlK8hH/W53zN81KM9coerRLOnTGu3nfXIniAmQbRI9OxbC0w==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, "@material/animation": { "version": "15.0.0-canary.51f9c0c28.0", "resolved": "https://registry.npmjs.org/@material/animation/-/animation-15.0.0-canary.51f9c0c28.0.tgz", @@ -17859,13 +17373,6 @@ "tslib": "^2.1.0" } }, - "@ngtools/webpack": { - "version": "16.2.10", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.2.10.tgz", - "integrity": "sha512-XAVn59zP3ztuKDtw92Xc9+64RK4u4c9g8y5GgtjIWeOwgNXl8bYhAo3uTZzrSrOu96DFZGjsmghFab/7/C2pDg==", - "dev": true, - "requires": {} - }, "@ngx-translate/core": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-14.0.0.tgz", @@ -17908,6 +17415,27 @@ "fastq": "^1.6.0" } }, + "@npmcli/agent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.0.tgz", + "integrity": "sha512-2yThA1Es98orMkpSLVqlDZAMPK3jHJhifP2gnNUdk1754uZ8yI5c+ulCoVG+WlntQA6MzhrURMXjSd9Z7dJ2/Q==", + "dev": true, + "requires": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.1" + }, + "dependencies": { + "lru-cache": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", + "dev": true + } + } + }, "@npmcli/fs": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", @@ -17918,34 +17446,40 @@ } }, "@npmcli/git": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", - "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.4.tgz", + "integrity": "sha512-nr6/WezNzuYUppzXRaYu/W4aT5rLxdXqEFupbh6e/ovlYFQ8hpu1UUPV3Ir/YTl+74iXl2ZOMlGzudh9ZPUchQ==", "dev": true, "requires": { - "@npmcli/promise-spawn": "^6.0.0", - "lru-cache": "^7.4.4", - "npm-pick-manifest": "^8.0.0", + "@npmcli/promise-spawn": "^7.0.0", + "lru-cache": "^10.0.1", + "npm-pick-manifest": "^9.0.0", "proc-log": "^3.0.0", "promise-inflight": "^1.0.1", "promise-retry": "^2.0.1", "semver": "^7.3.5", - "which": "^3.0.0" + "which": "^4.0.0" }, "dependencies": { + "isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true + }, "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", "dev": true }, "which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "dev": true, "requires": { - "isexe": "^2.0.0" + "isexe": "^3.1.1" } } } @@ -17960,16 +17494,6 @@ "npm-normalize-package-bin": "^3.0.0" } }, - "@npmcli/move-file": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", - "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", - "dev": true, - "requires": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - } - }, "@npmcli/node-gyp": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", @@ -17977,45 +17501,57 @@ "dev": true }, "@npmcli/promise-spawn": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", - "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.1.tgz", + "integrity": "sha512-P4KkF9jX3y+7yFUxgcUdDtLy+t4OlDGuEBLNs57AZsfSfg+uV6MLndqGpnl4831ggaEdXwR50XFoZP4VFtHolg==", "dev": true, "requires": { - "which": "^3.0.0" + "which": "^4.0.0" }, "dependencies": { + "isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true + }, "which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "dev": true, "requires": { - "isexe": "^2.0.0" + "isexe": "^3.1.1" } } } }, "@npmcli/run-script": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.2.tgz", - "integrity": "sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-7.0.3.tgz", + "integrity": "sha512-ZMWGLHpzMq3rBGIwPyeaoaleaLMvrBrH8nugHxTi5ACkJZXTxXPtVuEH91ifgtss5hUwJQ2VDnzDBWPmz78rvg==", "dev": true, "requires": { "@npmcli/node-gyp": "^3.0.0", - "@npmcli/promise-spawn": "^6.0.0", - "node-gyp": "^9.0.0", + "@npmcli/promise-spawn": "^7.0.0", + "node-gyp": "^10.0.0", "read-package-json-fast": "^3.0.0", - "which": "^3.0.0" + "which": "^4.0.0" }, "dependencies": { + "isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true + }, "which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "dev": true, "requires": { - "isexe": "^2.0.0" + "isexe": "^3.1.1" } } } @@ -18028,23 +17564,23 @@ "optional": true }, "@schematics/angular": { - "version": "16.2.10", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.2.10.tgz", - "integrity": "sha512-PXmoswvN7qknTsXDmEvhZ9UG+awwWnQ/1Jd/eqqQx08iAaAT81OsXj1bN7eSs6tEGBKGjPb6q2xzuiECAdymzg==", + "version": "17.0.9", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.0.9.tgz", + "integrity": "sha512-XPaHAhobxdQMswH8wSrfToKN7wmGJFh/K5jq/3J+78KeSBZStYxZkVIQbvJkSU8Y1MsdVaeMYKDE8rjFN83OYA==", "dev": true, "requires": { - "@angular-devkit/core": "16.2.10", - "@angular-devkit/schematics": "16.2.10", + "@angular-devkit/core": "17.0.9", + "@angular-devkit/schematics": "17.0.9", "jsonc-parser": "3.2.0" } }, "@sigstore/bundle": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-1.1.0.tgz", - "integrity": "sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.1.0.tgz", + "integrity": "sha512-89uOo6yh/oxaU8AeOUnVrTdVMcGk9Q1hJa7Hkvalc6G3Z3CupWk4Xe9djSgJm9fMkH69s0P0cVHUoKSOemLdng==", "dev": true, "requires": { - "@sigstore/protobuf-specs": "^0.2.0" + "@sigstore/protobuf-specs": "^0.2.1" } }, "@sigstore/protobuf-specs": { @@ -18054,92 +17590,24 @@ "dev": true }, "@sigstore/sign": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-1.0.0.tgz", - "integrity": "sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA==", - "dev": true, - "requires": { - "@sigstore/bundle": "^1.1.0", - "@sigstore/protobuf-specs": "^0.2.0", - "make-fetch-happen": "^11.0.1" - }, - "dependencies": { - "@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true - }, - "http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "requires": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - } - }, - "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true - }, - "make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", - "dev": true, - "requires": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - } - }, - "minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", - "dev": true, - "requires": { - "encoding": "^0.1.13", - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "dependencies": { - "minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true - } - } - } + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.2.0.tgz", + "integrity": "sha512-AAbmnEHDQv6CSfrWA5wXslGtzLPtAtHZleKOgxdQYvx/s76Fk6T6ZVt7w2IGV9j1UrFeBocTTQxaXG2oRrDhYA==", + "dev": true, + "requires": { + "@sigstore/bundle": "^2.1.0", + "@sigstore/protobuf-specs": "^0.2.1", + "make-fetch-happen": "^13.0.0" } }, "@sigstore/tuf": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.3.tgz", - "integrity": "sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.2.0.tgz", + "integrity": "sha512-KKATZ5orWfqd9ZG6MN8PtCIx4eevWSuGRKQvofnWXRpyMyUEpmrzg5M5BrCpjM+NfZ0RbNGOh5tCz/P2uoRqOA==", "dev": true, "requires": { - "@sigstore/protobuf-specs": "^0.2.0", - "tuf-js": "^1.1.7" + "@sigstore/protobuf-specs": "^0.2.1", + "tuf-js": "^2.1.0" } }, "@socket.io/component-emitter": { @@ -18148,26 +17616,20 @@ "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", "dev": true }, - "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true - }, "@tufjs/canonical-json": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz", - "integrity": "sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", + "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", "dev": true }, "@tufjs/models": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.4.tgz", - "integrity": "sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-2.0.0.tgz", + "integrity": "sha512-c8nj8BaOExmZKO2DXhDfegyhSGcG9E/mPN3U13L+/PsoWm1uaGiHHjxqSHQiasDBQwDA3aHuw9+9spYAP1qvvg==", "dev": true, "requires": { - "@tufjs/canonical-json": "1.0.0", - "minimatch": "^9.0.0" + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^9.0.3" } }, "@types/body-parser": { @@ -18310,18 +17772,18 @@ "dev": true }, "@types/node-forge": { - "version": "1.3.10", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.10.tgz", - "integrity": "sha512-y6PJDYN4xYBxwd22l+OVH35N+1fCYWiuC3aiP2SlXVE6Lo7SS+rSx9r89hLxrP4pn6n1lBGhHJ12pj3F3Mpttw==", + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", "dev": true, "requires": { "@types/node": "*" } }, "@types/qs": { - "version": "6.9.10", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz", - "integrity": "sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==", + "version": "6.9.11", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", + "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==", "dev": true }, "@types/range-parser": { @@ -18537,69 +17999,6 @@ "@xtuc/long": "4.2.2" } }, - "@wessberg/ts-evaluator": { - "version": "0.0.27", - "resolved": "https://registry.npmjs.org/@wessberg/ts-evaluator/-/ts-evaluator-0.0.27.tgz", - "integrity": "sha512-7gOpVm3yYojUp/Yn7F4ZybJRxyqfMNf0LXK5KJiawbPfL0XTsJV+0mgrEDjOIR6Bi0OYk2Cyg4tjFu1r8MCZaA==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "jsdom": "^16.4.0", - "object-path": "^0.11.5", - "tslib": "^2.0.3" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, "@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -18625,9 +18024,9 @@ "dev": true }, "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", "dev": true }, "accepts": { @@ -18646,30 +18045,6 @@ "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", "dev": true }, - "acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true - } - } - }, "acorn-import-assertions": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", @@ -18729,21 +18104,12 @@ } }, "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "agentkeepalive": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", - "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", "dev": true, "requires": { - "humanize-ms": "^1.2.1" + "debug": "^4.3.4" } }, "aggregate-error": { @@ -18841,22 +18207,6 @@ "picomatch": "^2.0.4" } }, - "aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - }, - "are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - } - }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -18867,31 +18217,49 @@ } }, "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "async-each-series": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz", + "integrity": "sha512-p4jj6Fws4Iy2m0iCmI2am2ZNZCgbdgE+P8F/8csmn2vx7ixXrO2zGcuNsD46X5uZSVecmkEy/M06X2vG8KD6dQ==", "dev": true }, "autoprefixer": { - "version": "10.4.14", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", - "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", + "version": "10.4.16", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", + "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", "dev": true, "requires": { - "browserslist": "^4.21.5", - "caniuse-lite": "^1.0.30001464", - "fraction.js": "^4.2.0", + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001538", + "fraction.js": "^4.3.6", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", "postcss-value-parser": "^4.2.0" } }, + "axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "dev": true, + "requires": { + "follow-redirects": "^1.14.0" + } + }, "babel-loader": { "version": "9.1.3", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", @@ -18916,13 +18284,13 @@ } }, "babel-plugin-polyfill-corejs2": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz", - "integrity": "sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==", + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.7.tgz", + "integrity": "sha512-LidDk/tEGDfuHW2DWh/Hgo4rmnw3cduK6ZkOI1NPFceSK3n/yAGeOsNT7FLnSGHkXj3RHGSEVkN3FsCTY6w2CQ==", "dev": true, "requires": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.3", + "@babel/helper-define-polyfill-provider": "^0.4.4", "semver": "^6.3.1" }, "dependencies": { @@ -18935,22 +18303,22 @@ } }, "babel-plugin-polyfill-corejs3": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz", - "integrity": "sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz", + "integrity": "sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==", "dev": true, "requires": { - "@babel/helper-define-polyfill-provider": "^0.4.3", + "@babel/helper-define-polyfill-provider": "^0.4.4", "core-js-compat": "^3.33.1" } }, "babel-plugin-polyfill-regenerator": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz", - "integrity": "sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.4.tgz", + "integrity": "sha512-S/x2iOCvDaCASLYsOOgWOq4bCfKYVqvO/uxjkaYyZ3rVsVE3CeAI/c84NpyuBBymEgNvHgjEot3a9/Z/kXvqsg==", "dev": true, "requires": { - "@babel/helper-define-polyfill-provider": "^0.4.3" + "@babel/helper-define-polyfill-provider": "^0.4.4" } }, "balanced-match": { @@ -19037,60 +18405,318 @@ } } }, - "bonjour-service": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", - "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", - "dev": true, - "requires": { - "array-flatten": "^2.1.2", - "dns-equal": "^1.0.0", - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "bonjour-service": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", + "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-sync": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.29.3.tgz", + "integrity": "sha512-NiM38O6XU84+MN+gzspVmXV2fTOoe+jBqIBx3IBdhZrdeURr6ZgznJr/p+hQ+KzkKEiGH/GcC4SQFSL0jV49bg==", + "dev": true, + "requires": { + "browser-sync-client": "^2.29.3", + "browser-sync-ui": "^2.29.3", + "bs-recipes": "1.3.4", + "chalk": "4.1.2", + "chokidar": "^3.5.1", + "connect": "3.6.6", + "connect-history-api-fallback": "^1", + "dev-ip": "^1.0.1", + "easy-extender": "^2.3.4", + "eazy-logger": "^4.0.1", + "etag": "^1.8.1", + "fresh": "^0.5.2", + "fs-extra": "3.0.1", + "http-proxy": "^1.18.1", + "immutable": "^3", + "localtunnel": "^2.0.1", + "micromatch": "^4.0.2", + "opn": "5.3.0", + "portscanner": "2.2.0", + "raw-body": "^2.3.2", + "resp-modifier": "6.0.2", + "rx": "4.1.0", + "send": "0.16.2", + "serve-index": "1.9.1", + "serve-static": "1.13.2", + "server-destroy": "1.0.1", + "socket.io": "^4.4.1", + "ua-parser-js": "^1.0.33", + "yargs": "^17.3.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "connect": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", + "integrity": "sha512-OO7axMmPpu/2XuX1+2Yrg0ddju31B6xLZMWkJ5rYBu4YRmRVlOjvlY6kw2FJKiAzyxGwnrDUAG4s1Pf0sbBMCQ==", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.0", + "parseurl": "~1.3.2", + "utils-merge": "1.0.1" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha512-ejnvM9ZXYzp6PUPUyQBMBf0Co5VX2gr5H2VQe2Ui2jWXNlxv+PYZo8wpAymJNJdLsG1R4p+M4aynF8KuoUEwRw==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "unpipe": "~1.0.0" + } + }, + "fs-extra": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", + "integrity": "sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^3.0.0", + "universalify": "^0.1.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "immutable": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", + "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==", + "dev": true + }, + "jsonfile": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", + "integrity": "sha512-oBko6ZHlubVB5mRFkur5vgYR1UyqX+S6Y/oCfLhqNdcc2fYFlDpIoNc7AfKS1KOGcnNAkvsr0grLck9ANM815w==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha512-wuTCPGlJONk/a1kqZ4fQM2+908lC7fa7nPYpTC1EhnvqLX/IICbeP1OZGDtA374trpSq68YubKUMo8oRhN46yg==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "ua-parser-js": { + "version": "1.0.37", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.37.tgz", + "integrity": "sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==", + "dev": true + } + } + }, + "browser-sync-client": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.29.3.tgz", + "integrity": "sha512-4tK5JKCl7v/3aLbmCBMzpufiYLsB1+UI+7tUXCCp5qF0AllHy/jAqYu6k7hUF3hYtlClKpxExWaR+rH+ny07wQ==", "dev": true, "requires": { - "balanced-match": "^1.0.0" + "etag": "1.8.1", + "fresh": "0.5.2", + "mitt": "^1.1.3" } }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "browser-sync-ui": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.29.3.tgz", + "integrity": "sha512-kBYOIQjU/D/3kYtUIJtj82e797Egk1FB2broqItkr3i4eF1qiHbFCG6srksu9gWhfmuM/TNG76jMfzAdxEPakg==", "dev": true, "requires": { - "fill-range": "^7.0.1" + "async-each-series": "0.1.1", + "chalk": "4.1.2", + "connect-history-api-fallback": "^1", + "immutable": "^3", + "server-destroy": "1.0.1", + "socket.io-client": "^4.4.1", + "stream-throttle": "^0.1.3" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "immutable": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", + "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, "browserslist": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", - "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", + "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001541", - "electron-to-chromium": "^1.4.535", - "node-releases": "^2.0.13", + "caniuse-lite": "^1.0.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" } }, + "bs-recipes": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz", + "integrity": "sha512-BXvDkqhDNxXEjeGM8LFkSbR+jzmP/CYpCiVKYn+soB1dDldeU15EBNDkwVXndKuX35wnNUaPd0qSoQEAkmQtMw==", + "dev": true + }, "buffer": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", @@ -19123,17 +18749,17 @@ "dev": true }, "cacache": { - "version": "17.1.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", - "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", + "version": "18.0.2", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.2.tgz", + "integrity": "sha512-r3NU8h/P+4lVUHfeRw1dtgQYar3DZMm4/cm2bZgOvrFC/su7budSOeqh52VJIC4U4iG1WWwV6vRW0znqBvxNuw==", "dev": true, "requires": { "@npmcli/fs": "^3.1.0", "fs-minipass": "^3.0.0", "glob": "^10.2.2", - "lru-cache": "^7.7.1", + "lru-cache": "^10.0.1", "minipass": "^7.0.3", - "minipass-collect": "^1.0.2", + "minipass-collect": "^2.0.1", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "p-map": "^4.0.0", @@ -19143,15 +18769,9 @@ }, "dependencies": { "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true - }, - "minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", "dev": true } } @@ -19179,9 +18799,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001564", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001564.tgz", - "integrity": "sha512-DqAOf+rhof+6GVx1y+xzbFPeOumfQnhYzVnZD6LAXijR77yPtm9mfOcqOnT3mpnJiZVT+kwLAFnRlZcIz+c6bg==", + "version": "1.0.30001576", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001576.tgz", + "integrity": "sha512-ff5BdakGe2P3SQsMsiqmt1Lc8221NR1VzHj5jXN5vBny9A6fpze94HiVV/n7XRosOlsShJcvMv5mdnpjOGCEgg==", "dev": true }, "chalk": { @@ -19251,9 +18871,9 @@ "dev": true }, "cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", "dev": true }, "cliui": { @@ -19299,27 +18919,12 @@ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, "colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -19421,15 +19026,9 @@ } }, "connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", "dev": true }, "content-disposition": { @@ -19500,12 +19099,12 @@ } }, "core-js-compat": { - "version": "3.33.3", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.3.tgz", - "integrity": "sha512-cNzGqFsh3Ot+529GIXacjTJ7kegdt5fPXxCBVS1G0iaZpuo/tBz399ymceLJveQhFFZ8qThHiP3fzuoQjKN2ow==", + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.0.tgz", + "integrity": "sha512-5blwFAddknKeNgsjBzilkdQ0+YK8L1PfqPYq40NOYMYFSS38qj+hpTcLLWwpIwA2A5bje/x5jmVn2tzUMg9IVw==", "dev": true, "requires": { - "browserslist": "^4.22.1" + "browserslist": "^4.22.2" } }, "core-util-is": { @@ -19682,46 +19281,12 @@ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true }, - "cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true - }, - "cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "requires": { - "cssom": "~0.3.6" - }, - "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - } - } - }, "custom-event": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", "dev": true }, - "data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dev": true, - "requires": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - } - }, "date-format": { "version": "4.0.14", "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", @@ -19737,12 +19302,6 @@ "ms": "2.1.2" } }, - "decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", - "dev": true - }, "default-gateway": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", @@ -19767,18 +19326,6 @@ "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "dev": true }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true - }, "depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -19923,6 +19470,12 @@ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "dev": true }, + "dev-ip": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", + "integrity": "sha512-LmVkry/oDShEgSZPNgqCIp2/TlqtExeGmymru3uCELnfyjY11IzpAproLYs+1X88fXO6DBoYP3ul2Xo2yz2j6A==", + "dev": true + }, "di": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", @@ -19938,12 +19491,6 @@ "path-type": "^4.0.0" } }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", - "dev": true - }, "dns-packet": { "version": "5.6.1", "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", @@ -19982,23 +19529,6 @@ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true }, - "domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "dev": true, - "requires": { - "webidl-conversions": "^5.0.0" - }, - "dependencies": { - "webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true - } - } - }, "domhandler": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", @@ -20025,6 +19555,75 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true }, + "easy-extender": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz", + "integrity": "sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==", + "dev": true, + "requires": { + "lodash": "^4.17.10" + } + }, + "eazy-logger": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-4.0.1.tgz", + "integrity": "sha512-2GSFtnnC6U4IEKhEI7+PvdxrmjJ04mdsj3wHZTFiw0tUtG4HCWzTr13ZYTk8XOGnA1xQMaDljoBOYlk3D/MMSw==", + "dev": true, + "requires": { + "chalk": "4.1.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -20032,9 +19631,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.4.592", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.592.tgz", - "integrity": "sha512-D3NOkROIlF+d5ixnz7pAf3Lu/AuWpd6AYgI9O67GQXMXTcCP1gJQRotOq35eQy5Sb4hez33XH1YdTtILA7Udww==", + "version": "1.4.626", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.626.tgz", + "integrity": "sha512-f7/be56VjRRQk+Ric6PmIrEtPcIqsn3tElyAu9Sh6egha2VLJ82qwkcOdcnT06W+Pb6RUulV1ckzrGbKzVcTHg==", "dev": true }, "emoji-regex": { @@ -20095,6 +19694,34 @@ "ws": "~8.2.3" } }, + "engine.io-client": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.3.tgz", + "integrity": "sha512-9Z0qLB0NIisTRt1DZ/8U2k12RJn8yls/nXMZLn+/N8hANT3TcYjKFKcwbw5zFQiN4NTde3TSY9zb79e1ij6j9Q==", + "dev": true, + "requires": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.11.0", + "xmlhttprequest-ssl": "~2.0.0" + }, + "dependencies": { + "engine.io-parser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.1.tgz", + "integrity": "sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==", + "dev": true + }, + "ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "dev": true, + "requires": {} + } + } + }, "engine.io-parser": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz", @@ -20191,9 +19818,9 @@ } }, "esbuild-wasm": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.18.17.tgz", - "integrity": "sha512-9OHGcuRzy+I8ziF9FzjfKLWAPbvi0e/metACVg9k6bK+SI4FFxeV6PcZsz8RIVaMD4YNehw+qj6UMR3+qj/EuQ==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.19.5.tgz", + "integrity": "sha512-7zmLLn2QCj93XfMmHtzrDJ1UBuOHB2CZz1ghoCEZiRajxjUvHsF40PnbzFIY/pmesqPRaEtEWii0uzsTbnAgrA==", "dev": true }, "escalade": { @@ -20202,45 +19829,18 @@ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "source-map": "~0.6.1" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true - } - } - }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, "eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -20372,12 +19972,6 @@ "vary": "~1.1.2" }, "dependencies": { - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true - }, "cookie": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", @@ -20408,12 +20002,59 @@ "unpipe": "~1.0.0" } }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, "statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -20561,6 +20202,12 @@ "path-exists": "^4.0.0" } }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true + }, "flatted": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", @@ -20591,17 +20238,6 @@ } } }, - "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, "forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -20609,9 +20245,9 @@ "dev": true }, "fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", "dev": true }, "fresh": { @@ -20638,14 +20274,6 @@ "dev": true, "requires": { "minipass": "^7.0.3" - }, - "dependencies": { - "minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true - } } }, "fs-monkey": { @@ -20668,27 +20296,11 @@ "optional": true }, "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true }, - "gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "dev": true, - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - } - }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -20794,15 +20406,6 @@ "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, - "guess-parser": { - "version": "0.4.22", - "resolved": "https://registry.npmjs.org/guess-parser/-/guess-parser-0.4.22.tgz", - "integrity": "sha512-KcUWZ5ACGaBM69SbqwVIuWGoSAgD+9iJnchR9j/IarVI1jHVeXv+bUXBIMeqVMSKt3zrn0Dgf9UpcOEpPBLbSg==", - "dev": true, - "requires": { - "@wessberg/ts-evaluator": "0.0.27" - } - }, "handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", @@ -20851,11 +20454,14 @@ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true + "hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "requires": { + "function-bind": "^1.1.2" + } }, "hdr-histogram-js": { "version": "2.0.3", @@ -20875,18 +20481,18 @@ "dev": true }, "hosted-git-info": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", - "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.1.tgz", + "integrity": "sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==", "dev": true, "requires": { - "lru-cache": "^7.5.1" + "lru-cache": "^10.0.1" }, "dependencies": { "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", "dev": true } } @@ -20935,15 +20541,6 @@ } } }, - "html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "dev": true, - "requires": { - "whatwg-encoding": "^1.0.5" - } - }, "html-entities": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", @@ -21019,14 +20616,13 @@ } }, "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", + "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", "dev": true, "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" + "agent-base": "^7.1.0", + "debug": "^4.3.4" } }, "http-proxy-middleware": { @@ -21043,12 +20639,12 @@ } }, "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", + "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", "dev": true, "requires": { - "agent-base": "6", + "agent-base": "^7.0.2", "debug": "4" } }, @@ -21058,15 +20654,6 @@ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true }, - "humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "dev": true, - "requires": { - "ms": "^2.0.0" - } - }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -21096,9 +20683,9 @@ "dev": true }, "ignore-walk": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.3.tgz", - "integrity": "sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.4.tgz", + "integrity": "sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw==", "dev": true, "requires": { "minimatch": "^9.0.0" @@ -21147,12 +20734,6 @@ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -21176,26 +20757,26 @@ "dev": true }, "inquirer": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", - "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", + "version": "9.2.11", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.11.tgz", + "integrity": "sha512-B2LafrnnhbRzCWfAdOXisUzL89Kg8cVJlYmhqoi3flSiV/TveO+nsXwgKr9h9PIo+J1hz7nBSk6gegRIMBBf7g==", "dev": true, "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", + "@ljharb/through": "^2.3.9", + "ansi-escapes": "^4.3.2", + "chalk": "^5.3.0", "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", + "cli-width": "^4.1.0", + "external-editor": "^3.1.0", + "figures": "^5.0.0", "lodash": "^4.17.21", - "mute-stream": "0.0.8", + "mute-stream": "1.0.0", "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.5.5", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6", - "wrap-ansi": "^7.0.0" + "run-async": "^3.0.0", + "rxjs": "^7.8.1", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0" }, "dependencies": { "ansi-styles": { @@ -21208,14 +20789,10 @@ } }, "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true }, "color-convert": { "version": "2.0.1", @@ -21232,19 +20809,46 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "figures": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", + "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", "dev": true, "requires": { - "has-flag": "^4.0.0" + "escape-string-regexp": "^5.0.0", + "is-unicode-supported": "^1.2.0" + } + }, + "is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true + }, + "rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "requires": { + "tslib": "^2.1.0" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" } } } @@ -21283,12 +20887,12 @@ } }, "is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dev": true, "requires": { - "has": "^1.0.3" + "hasown": "^2.0.0" } }, "is-docker": { @@ -21346,6 +20950,15 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "is-number-like": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", + "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", + "dev": true, + "requires": { + "lodash.isfinite": "^3.3.2" + } + }, "is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -21367,12 +20980,6 @@ "isobject": "^3.0.1" } }, - "is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, "is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -21574,50 +21181,6 @@ "esprima": "^4.0.0" } }, - "jsdom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", - "dev": true, - "requires": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" - }, - "dependencies": { - "ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, - "requires": {} - } - } - }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -21873,9 +21436,9 @@ } }, "less": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz", - "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz", + "integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==", "dev": true, "requires": { "copy-anything": "^2.0.1", @@ -21942,6 +21505,12 @@ "webpack-sources": "^3.0.0" } }, + "limiter": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", + "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==", + "dev": true + }, "lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -21960,6 +21529,50 @@ "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", "dev": true }, + "localtunnel": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.2.tgz", + "integrity": "sha512-n418Cn5ynvJd7m/N1d9WVJISLJF/ellZnfsLnx8WBWGzxv/ntNcFkJ1o6se5quUhCplfLGBNL5tYHiq5WF3Nug==", + "dev": true, + "requires": { + "axios": "0.21.4", + "debug": "4.3.2", + "openurl": "1.1.1", + "yargs": "17.1.1" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "yargs": { + "version": "17.1.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz", + "integrity": "sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + } + } + }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -21981,6 +21594,12 @@ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, + "lodash.isfinite": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", + "integrity": "sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==", + "dev": true + }, "log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -22088,9 +21707,9 @@ } }, "magic-string": { - "version": "0.30.1", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", - "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", + "version": "0.30.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", + "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", "dev": true, "requires": { "@jridgewell/sourcemap-codec": "^1.4.15" @@ -22101,178 +21720,45 @@ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "dev": true - } - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "make-fetch-happen": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", - "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", - "dev": true, - "requires": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" - }, - "dependencies": { - "@npmcli/fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", - "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", - "dev": true, - "requires": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - } - }, - "@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true - }, - "cacache": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", - "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", - "dev": true, - "requires": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^2.0.0" - } - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - } - }, - "http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "requires": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - } - }, - "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + } + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true - }, - "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "ssri": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", - "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", - "dev": true, - "requires": { - "minipass": "^3.1.1" - } - }, - "unique-filename": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", - "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", - "dev": true, - "requires": { - "unique-slug": "^3.0.0" - } - }, - "unique-slug": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", - "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } } } }, + "make-fetch-happen": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz", + "integrity": "sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==", + "dev": true, + "requires": { + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "ssri": "^10.0.0" + } + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -22380,52 +21866,30 @@ "dev": true }, "minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "dev": true }, "minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", + "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", "dev": true, "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } + "minipass": "^7.0.3" } }, "minipass-fetch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", - "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", + "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", "dev": true, "requires": { "encoding": "^0.1.13", - "minipass": "^3.1.6", + "minipass": "^7.0.3", "minipass-sized": "^1.0.3", "minizlib": "^2.1.2" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } } }, "minipass-flush": { @@ -22530,6 +21994,12 @@ } } }, + "mitt": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", + "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==", + "dev": true + }, "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -22559,9 +22029,9 @@ } }, "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", "dev": true }, "nanoid": { @@ -22635,9 +22105,9 @@ } }, "ngx-infinite-scroll": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/ngx-infinite-scroll/-/ngx-infinite-scroll-16.0.0.tgz", - "integrity": "sha512-bzyNYd+wVlUUxcopRVr2DAa81eEc8vITtKVvb+c7R1uy8hWPTlxOEXf3L1qA4FMwTEzCQ9b37TXzlJji3qBy+A==", + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/ngx-infinite-scroll/-/ngx-infinite-scroll-17.0.0.tgz", + "integrity": "sha512-pQXLuRiuhRuDKD3nmgyW1V08JVNBepmk6nb8qjHc5hgsWNts01+R/p33rYcRDzcut6/PWqGyrZ9o9i8swzMYMA==", "requires": { "tslib": "^2.3.0" } @@ -22684,97 +22154,69 @@ "dev": true }, "node-gyp": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz", - "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.0.1.tgz", + "integrity": "sha512-gg3/bHehQfZivQVfqIyy8wTdSymF9yTyP4CJifK73imyNMU8AIGQE2pUa7dNWfmMeG9cDVF2eehiRMv0LC1iAg==", "dev": true, "requires": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", - "glob": "^7.1.4", + "glob": "^10.3.10", "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", + "make-fetch-happen": "^13.0.0", + "nopt": "^7.0.0", + "proc-log": "^3.0.0", "semver": "^7.3.5", "tar": "^6.1.2", - "which": "^2.0.2" + "which": "^4.0.0" }, "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } + "isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true }, "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "dev": true, "requires": { - "isexe": "^2.0.0" + "isexe": "^3.1.1" } } } }, "node-gyp-build": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.7.0.tgz", - "integrity": "sha512-PbZERfeFdrHQOOXiAKOY0VPbykZy90ndPKk0d+CFDegTKmWp1VgOTz2xACVbr1BjCWxrQp68CXtvNsveFhqDJg==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.0.tgz", + "integrity": "sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==", "dev": true, "optional": true }, "node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true }, "nopt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", + "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==", "dev": true, "requires": { - "abbrev": "^1.0.0" + "abbrev": "^2.0.0" } }, "normalize-package-data": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", - "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.0.tgz", + "integrity": "sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==", "dev": true, "requires": { - "hosted-git-info": "^6.0.0", + "hosted-git-info": "^7.0.0", "is-core-module": "^2.8.1", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" @@ -22817,119 +22259,51 @@ "dev": true }, "npm-package-arg": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", - "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.1.tgz", + "integrity": "sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==", "dev": true, "requires": { - "hosted-git-info": "^6.0.0", + "hosted-git-info": "^7.0.0", "proc-log": "^3.0.0", "semver": "^7.3.5", "validate-npm-package-name": "^5.0.0" } }, "npm-packlist": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz", - "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-8.0.2.tgz", + "integrity": "sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==", "dev": true, "requires": { - "ignore-walk": "^6.0.0" + "ignore-walk": "^6.0.4" } }, "npm-pick-manifest": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz", - "integrity": "sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.0.0.tgz", + "integrity": "sha512-VfvRSs/b6n9ol4Qb+bDwNGUXutpy76x6MARw/XssevE0TnctIKcmklJZM5Z7nqs5z5aW+0S63pgCNbpkUNNXBg==", "dev": true, "requires": { "npm-install-checks": "^6.0.0", "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^10.0.0", + "npm-package-arg": "^11.0.0", "semver": "^7.3.5" } }, "npm-registry-fetch": { - "version": "14.0.5", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz", - "integrity": "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==", + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-16.1.0.tgz", + "integrity": "sha512-PQCELXKt8Azvxnt5Y85GseQDJJlglTFM9L9U9gkv2y4e9s0k3GVDdOx3YoB6gm2Do0hlkzC39iCGXby+Wve1Bw==", "dev": true, "requires": { - "make-fetch-happen": "^11.0.0", - "minipass": "^5.0.0", + "make-fetch-happen": "^13.0.0", + "minipass": "^7.0.2", "minipass-fetch": "^3.0.0", "minipass-json-stream": "^1.0.1", "minizlib": "^2.1.2", - "npm-package-arg": "^10.0.0", + "npm-package-arg": "^11.0.0", "proc-log": "^3.0.0" - }, - "dependencies": { - "@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true - }, - "http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "requires": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - } - }, - "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true - }, - "make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", - "dev": true, - "requires": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - } - }, - "minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", - "dev": true, - "requires": { - "encoding": "^0.1.13", - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "dependencies": { - "minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true - } - } - } } }, "npm-run-path": { @@ -22941,18 +22315,6 @@ "path-key": "^3.0.0" } }, - "npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "dev": true, - "requires": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - } - }, "nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", @@ -22962,12 +22324,6 @@ "boolbase": "^1.0.0" } }, - "nwsapi": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", - "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", - "dev": true - }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -22980,12 +22336,6 @@ "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", "dev": true }, - "object-path": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.8.tgz", - "integrity": "sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==", - "dev": true - }, "obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", @@ -23036,6 +22386,29 @@ "is-wsl": "^2.2.0" } }, + "openurl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", + "integrity": "sha512-d/gTkTb1i1GKz5k3XE3XFV/PxQ1k45zDqGP2OA7YhgsaLoqm6qRvARAZOFer1fcXritWlGBRCu/UgeS4HAnXAA==", + "dev": true + }, + "opn": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", + "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + }, + "dependencies": { + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "dev": true + } + } + }, "ora": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", @@ -23167,27 +22540,27 @@ "dev": true }, "pacote": { - "version": "15.2.0", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz", - "integrity": "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==", + "version": "17.0.4", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-17.0.4.tgz", + "integrity": "sha512-eGdLHrV/g5b5MtD5cTPyss+JxOlaOloSMG3UwPMAvL8ywaLJ6beONPF40K4KKl/UI6q5hTKCJq5rCu8tkF+7Dg==", "dev": true, "requires": { - "@npmcli/git": "^4.0.0", + "@npmcli/git": "^5.0.0", "@npmcli/installed-package-contents": "^2.0.1", - "@npmcli/promise-spawn": "^6.0.1", - "@npmcli/run-script": "^6.0.0", - "cacache": "^17.0.0", + "@npmcli/promise-spawn": "^7.0.0", + "@npmcli/run-script": "^7.0.0", + "cacache": "^18.0.0", "fs-minipass": "^3.0.0", - "minipass": "^5.0.0", - "npm-package-arg": "^10.0.0", - "npm-packlist": "^7.0.0", - "npm-pick-manifest": "^8.0.0", - "npm-registry-fetch": "^14.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^11.0.0", + "npm-packlist": "^8.0.0", + "npm-pick-manifest": "^9.0.0", + "npm-registry-fetch": "^16.0.0", "proc-log": "^3.0.0", "promise-retry": "^2.0.1", - "read-package-json": "^6.0.0", + "read-package-json": "^7.0.0", "read-package-json-fast": "^3.0.0", - "sigstore": "^1.3.0", + "sigstore": "^2.0.0", "ssri": "^10.0.0", "tar": "^6.1.11" } @@ -23225,12 +22598,6 @@ "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", "dev": true }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, "parse5-html-rewriting-stream": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz", @@ -23361,9 +22728,9 @@ "optional": true }, "piscina": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.0.0.tgz", - "integrity": "sha512-641nAmJS4k4iqpNUqfggqUBUMmlw0ZoM5VZKdQkV2e970Inn3Tk9kroCc1wpsYLD07vCwpys5iY0d3xI/9WkTg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.1.0.tgz", + "integrity": "sha512-sjbLMi3sokkie+qmtZpkfMCUJTpbxJm/wvaPzU28vmYSsTSW8xk9JcFUsbqGJdtPpIQ9tuj+iDcTtgZjwnOSig==", "dev": true, "requires": { "eventemitter-asyncresource": "^1.0.0", @@ -23426,6 +22793,16 @@ } } }, + "portscanner": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz", + "integrity": "sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==", + "dev": true, + "requires": { + "async": "^2.6.0", + "is-number-like": "^1.0.3" + } + }, "postcss": { "version": "8.4.31", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", @@ -23653,12 +23030,6 @@ "dev": true, "optional": true }, - "psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true - }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -23680,12 +23051,6 @@ "side-channel": "^1.0.4" } }, - "querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -23720,21 +23085,21 @@ } }, "read-package-json": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.4.tgz", - "integrity": "sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-7.0.0.tgz", + "integrity": "sha512-uL4Z10OKV4p6vbdvIXB+OzhInYtIozl/VxUBPgNkBuUi2DeRonnuspmaVAMcrkmfjKGNmRndyQAbE7/AmzGwFg==", "dev": true, "requires": { "glob": "^10.2.2", "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^5.0.0", + "normalize-package-data": "^6.0.0", "npm-normalize-package-bin": "^3.0.0" }, "dependencies": { "json-parse-even-better-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", - "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz", + "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==", "dev": true } } @@ -23750,9 +23115,9 @@ }, "dependencies": { "json-parse-even-better-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", - "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz", + "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==", "dev": true } } @@ -23787,9 +23152,9 @@ } }, "reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.14.tgz", + "integrity": "sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==", "dev": true }, "regenerate": { @@ -23808,9 +23173,9 @@ } }, "regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", "dev": true }, "regenerator-transform": { @@ -23884,12 +23249,12 @@ "dev": true }, "resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "requires": { - "is-core-module": "^2.11.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -23919,15 +23284,61 @@ "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "resp-modifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz", + "integrity": "sha512-U1+0kWC/+4ncRFYqQWTx/3qkfE6a4B/h3XXgmXypfa0SPZ3t7cbbaFk297PjQS/yov24R18h6OZe6iZwj3NSLw==", + "dev": true, + "requires": { + "debug": "^2.2.0", + "minimatch": "^3.0.2" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true } } @@ -24024,9 +23435,9 @@ "integrity": "sha512-85aZYCxweiD5J8yTEbw+E6A27zSnLPNDL0WfPdw3YYodq7WjnTKo0q4dtyQ2gz23iPT8Q9CUyJtAaUNcTxRf5Q==" }, "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", + "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", "dev": true }, "run-parallel": { @@ -24038,6 +23449,12 @@ "queue-microtask": "^1.2.2" } }, + "rx": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", + "integrity": "sha512-CiaiuN6gapkdl+cZUr67W6I8jquN4lkak3vtIsIWCl4XIPP8ffsoyN6/+PuGXnQy8Cu8W2y9Xxh31Rq4M6wUug==", + "dev": true + }, "rxjs": { "version": "7.5.7", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz", @@ -24073,9 +23490,9 @@ "integrity": "sha512-LRneZZRXNgjzwG4bDQdOTSbze3fHm1EAKN/8bePxnlEZiBmkYEDggaHbuvHI9/hoqHbGfsEA7tWS9GhYHZBBsw==" }, "sass": { - "version": "1.64.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.64.1.tgz", - "integrity": "sha512-16rRACSOFEE8VN7SCgBu1MpYCyN7urj9At898tyzdXFhC+a+yOX5dXwAR7L8/IdPJ1NB8OYoXmD55DM30B2kEQ==", + "version": "1.69.5", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.69.5.tgz", + "integrity": "sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ==", "dev": true, "requires": { "chokidar": ">=3.0.0 <4.0.0", @@ -24099,15 +23516,6 @@ "dev": true, "optional": true }, - "saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "requires": { - "xmlchars": "^2.2.0" - } - }, "schema-utils": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", @@ -24166,24 +23574,24 @@ } }, "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", "dev": true, "requires": { "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", + "depd": "~1.1.2", + "destroy": "~1.0.4", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" }, "dependencies": { "debug": { @@ -24193,32 +23601,69 @@ "dev": true, "requires": { "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } } }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==", + "dev": true + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", "dev": true }, "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", "dev": true }, "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", "dev": true } } @@ -24295,21 +23740,21 @@ } }, "serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", "dev": true, "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" + "parseurl": "~1.3.2", + "send": "0.16.2" } }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "server-destroy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", + "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==", "dev": true }, "setprototypeof": { @@ -24366,84 +23811,15 @@ "dev": true }, "sigstore": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.9.0.tgz", - "integrity": "sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-2.1.0.tgz", + "integrity": "sha512-kPIj+ZLkyI3QaM0qX8V/nSsweYND3W448pwkDgS6CQ74MfhEkIR8ToK5Iyx46KJYRjseVcD3Rp9zAmUAj6ZjPw==", "dev": true, "requires": { - "@sigstore/bundle": "^1.1.0", - "@sigstore/protobuf-specs": "^0.2.0", - "@sigstore/sign": "^1.0.0", - "@sigstore/tuf": "^1.0.3", - "make-fetch-happen": "^11.0.1" - }, - "dependencies": { - "@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true - }, - "http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "requires": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - } - }, - "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true - }, - "make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", - "dev": true, - "requires": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - } - }, - "minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", - "dev": true, - "requires": { - "encoding": "^0.1.13", - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "dependencies": { - "minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true - } - } - } + "@sigstore/bundle": "^2.1.0", + "@sigstore/protobuf-specs": "^0.2.1", + "@sigstore/sign": "^2.1.0", + "@sigstore/tuf": "^2.1.0" } }, "sisteransi": { @@ -24484,10 +23860,22 @@ "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==", "dev": true }, + "socket.io-client": { + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.3.tgz", + "integrity": "sha512-nU+ywttCyBitXIl9Xe0RSEfek4LneYkJxCeNnKCuhwoH4jGXO1ipIUw/VA/+Vvv2G1MTym11fzFC0SxkrcfXDw==", + "dev": true, + "requires": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.5.2", + "socket.io-parser": "~4.2.4" + } + }, "socket.io-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.1.tgz", - "integrity": "sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", "dev": true, "requires": { "@socket.io/component-emitter": "~3.1.0", @@ -24516,14 +23904,14 @@ } }, "socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz", + "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", "dev": true, "requires": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "socks": "^2.7.1" } }, "source-map": { @@ -24650,14 +24038,6 @@ "dev": true, "requires": { "minipass": "^7.0.3" - }, - "dependencies": { - "minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true - } } }, "statuses": { @@ -24666,6 +24046,16 @@ "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true }, + "stream-throttle": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz", + "integrity": "sha512-889+B9vN9dq7/vLbGyuHeZ6/ctf5sNuGWsDy89uNxkFTAgzy0eK7+w5fL3KLNRTkLle7EgZGvHUphZW0Q26MnQ==", + "dev": true, + "requires": { + "commander": "^2.2.0", + "limiter": "^1.0.5" + } + }, "streamroller": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.3.tgz", @@ -24759,12 +24149,6 @@ "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", "dev": true }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, "tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -24804,6 +24188,12 @@ } } } + }, + "minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true } } }, @@ -24814,9 +24204,9 @@ "dev": true }, "terser": { - "version": "5.19.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", - "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.24.0.tgz", + "integrity": "sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==", "dev": true, "requires": { "@jridgewell/source-map": "^0.3.3", @@ -24928,12 +24318,6 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, "thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", @@ -24970,35 +24354,6 @@ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true }, - "tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", - "dev": true, - "requires": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "dependencies": { - "universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true - } - } - }, - "tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "dev": true, - "requires": { - "punycode": "^2.1.1" - } - }, "tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -25079,87 +24434,19 @@ } }, "tslib": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", - "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "tuf-js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.7.tgz", - "integrity": "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-2.1.0.tgz", + "integrity": "sha512-eD7YPPjVlMzdggrOeE8zwoegUaG/rt6Bt3jwoQPunRiNVzgcCE009UDFJKJjG+Gk9wFu6W/Vi+P5d/5QpdD9jA==", "dev": true, "requires": { - "@tufjs/models": "1.0.4", + "@tufjs/models": "2.0.0", "debug": "^4.3.4", - "make-fetch-happen": "^11.1.1" - }, - "dependencies": { - "@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true - }, - "http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "requires": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - } - }, - "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true - }, - "make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", - "dev": true, - "requires": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - } - }, - "minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", - "dev": true, - "requires": { - "encoding": "^0.1.13", - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "dependencies": { - "minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true - } - } - } + "make-fetch-happen": "^13.0.0" } }, "type-fest": { @@ -25185,9 +24472,9 @@ "dev": true }, "typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", "dev": true }, "ua-parser-js": { @@ -25203,6 +24490,15 @@ "dev": true, "optional": true }, + "undici": { + "version": "5.27.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.27.2.tgz", + "integrity": "sha512-iS857PdOEy/y3wlM3yRp+6SNQQ6xU0mmZcwRSriqk+et/cwWAtwmIGf6WkoDN2EK/AMdCO/dfXzIwi+rFMrjjQ==", + "dev": true, + "requires": { + "@fastify/busboy": "^2.0.0" + } + }, "unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -25280,16 +24576,6 @@ "punycode": "^2.1.0" } }, - "url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -25334,15 +24620,15 @@ "dev": true }, "vite": { - "version": "4.4.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.7.tgz", - "integrity": "sha512-6pYf9QJ1mHylfVh39HpuSfMPojPSKVxZvnclX1K1FyZ1PXDOcLBibdq5t1qxJSnL63ca8Wf4zts6mD8u8oc9Fw==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.1.tgz", + "integrity": "sha512-AXXFaAJ8yebyqzoNB9fu2pHoo/nWX+xZlaRwoeYUxEqBO+Zj4msE5G+BhGBll9lYEKv9Hfks52PAF2X7qDYXQA==", "dev": true, "requires": { "esbuild": "^0.18.10", "fsevents": "~2.3.2", - "postcss": "^8.4.26", - "rollup": "^3.25.2" + "postcss": "^8.4.27", + "rollup": "^3.27.1" } }, "void-elements": { @@ -25351,29 +24637,11 @@ "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", "dev": true }, - "w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "requires": { - "browser-process-hrtime": "^1.0.0" - } - }, "w3c-keyname": { "version": "2.2.6", "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.6.tgz", "integrity": "sha512-f+fciywl1SJEniZHD6H+kUO8gOnwIr7f4ijKA6+ZvJFjeGi1r4PDLl53Ayud9O/rk64RqgoQine0feoeOU0kXg==" }, - "w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dev": true, - "requires": { - "xml-name-validator": "^3.0.0" - } - }, "watchpack": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", @@ -25419,16 +24687,10 @@ "defaults": "^1.0.3" } }, - "webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true - }, "webpack": { - "version": "5.88.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", - "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", + "version": "5.89.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", + "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.3", @@ -25556,6 +24818,12 @@ "ws": "^8.13.0" }, "dependencies": { + "connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true + }, "webpack-dev-middleware": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", @@ -25570,21 +24838,22 @@ } }, "ws": { - "version": "8.14.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", - "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", "dev": true, "requires": {} } } }, "webpack-merge": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz", - "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", "dev": true, "requires": { "clone-deep": "^4.0.1", + "flat": "^5.0.2", "wildcard": "^2.0.0" } }, @@ -25620,32 +24889,6 @@ "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "dev": true }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, - "requires": { - "iconv-lite": "0.4.24" - } - }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true - }, - "whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", - "dev": true, - "requires": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - } - }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -25655,15 +24898,6 @@ "isexe": "^2.0.0" } }, - "wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, "wildcard": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", @@ -25763,16 +24997,10 @@ "dev": true, "requires": {} }, - "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "xmlhttprequest-ssl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", + "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", "dev": true }, "y18n": { @@ -25828,9 +25056,9 @@ "dev": true }, "zone.js": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.13.0.tgz", - "integrity": "sha512-7m3hNNyswsdoDobCkYNAy5WiUulkMd3+fWaGT9ij6iq3Zr/IwJo4RMCYPSDjT+r7tnPErmY9sZpKhWQ8S5k6XQ==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.14.3.tgz", + "integrity": "sha512-jYoNqF046Q+JfcZSItRSt+oXFcpXL88yq7XAZjb/NKTS7w2hHpKjRJ3VlFD1k75wMaRRXNUt5vrZVlygiMyHbA==", "requires": { "tslib": "^2.3.0" } diff --git a/package.json b/package.json index 987ed15b..1b9c4b9a 100644 --- a/package.json +++ b/package.json @@ -16,32 +16,32 @@ }, "private": true, "dependencies": { - "@angular/animations": "^16.2.0", + "@angular/animations": "^17.0.8", "@angular/cdk": "^16.0.0", - "@angular/common": "^16.2.0", - "@angular/compiler": "^16.2.0", - "@angular/core": "^16.2.0", - "@angular/forms": "^16.2.0", + "@angular/common": "^17.0.8", + "@angular/compiler": "^17.0.8", + "@angular/core": "^17.0.8", + "@angular/forms": "^17.0.8", "@angular/material": "^16.0.0", - "@angular/platform-browser": "^16.2.0", - "@angular/platform-browser-dynamic": "^16.2.0", - "@angular/router": "^16.2.0", + "@angular/platform-browser": "^17.0.8", + "@angular/platform-browser-dynamic": "^17.0.8", + "@angular/router": "^17.0.8", "@ngx-translate/core": "^14.0.0", "@ngx-translate/http-loader": "^7.0.0", "angular-auth-oidc-client": "^14.1.5", "lorem-ipsum": "^2.0.8", "ngx-editor": "^15.3.0", - "ngx-infinite-scroll": "^16.0.0", + "ngx-infinite-scroll": "^17.0.0", "ngx-skeleton-loader": "^7.0.0", "ngx-translate-routes": "^1.4.1", "rxjs": "~7.5.0", "tslib": "^2.3.0", - "zone.js": "~0.13.0" + "zone.js": "~0.14.0" }, "devDependencies": { - "@angular-devkit/build-angular": "^16.2.0", - "@angular/cli": "~16.2.0", - "@angular/compiler-cli": "^16.2.0", + "@angular-devkit/build-angular": "^17.0.9", + "@angular/cli": "~17.0.9", + "@angular/compiler-cli": "^17.0.8", "@types/jasmine": "~4.0.0", "dependency-cruiser": "^12.10.1", "jasmine-core": "~4.3.0", @@ -50,6 +50,6 @@ "karma-coverage": "~2.2.0", "karma-jasmine": "~5.1.0", "karma-jasmine-html-reporter": "~2.0.0", - "typescript": "~4.9.3" + "typescript": "~5.2.0" } } \ No newline at end of file From 95c6de58b0f3bb5e3a83a6508dc7a5ca30e12ce9 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Wed, 10 Jan 2024 13:13:04 -0500 Subject: [PATCH 104/165] added selectors for each component of a feature module --- src/app/features/about/about.component.ts | 1 + src/app/features/blog/blog.component.ts | 1 + src/app/features/bookmarks/bookmarks.component.ts | 1 + src/app/features/dashboard/dashboard.component.ts | 1 + src/app/features/events/events.component.ts | 1 + src/app/features/friends/friends.component.ts | 1 + src/app/features/groups/groups.component.ts | 1 + src/app/features/home/home.component.ts | 1 + src/app/features/invite/invite.component.ts | 1 + src/app/features/login/login.component.ts | 1 + src/app/features/members/members.component.ts | 1 + src/app/features/messages/messages.component.ts | 1 + src/app/features/missions/missions.component.ts | 1 + src/app/features/news-feed/news-feed.component.ts | 1 + src/app/features/privacy/privacy.component.ts | 1 + src/app/features/profile/profile.component.ts | 1 + src/app/features/register/register.component.ts | 1 + src/app/features/search/search.component.ts | 1 + src/app/features/settings/settings.component.ts | 1 + src/app/features/splash/splash.component.ts | 1 + src/app/features/stats/stats.component.ts | 1 + src/app/features/terms/terms.component.ts | 1 + src/app/features/the-wire/the-wire.component.ts | 1 + src/app/shared/components/not-found/not-found.component.ts | 1 + 24 files changed, 24 insertions(+) diff --git a/src/app/features/about/about.component.ts b/src/app/features/about/about.component.ts index dd3eb1d3..9898f7a2 100644 --- a/src/app/features/about/about.component.ts +++ b/src/app/features/about/about.component.ts @@ -1,6 +1,7 @@ import { Component, OnInit } from '@angular/core'; @Component({ + selector: 'app-about', templateUrl: './about.component.html', styleUrls: ['./about.component.scss'] }) diff --git a/src/app/features/blog/blog.component.ts b/src/app/features/blog/blog.component.ts index ef244a31..85025858 100644 --- a/src/app/features/blog/blog.component.ts +++ b/src/app/features/blog/blog.component.ts @@ -1,6 +1,7 @@ import { Component, OnInit } from '@angular/core'; @Component({ + selector: 'app-blog', templateUrl: './blog.component.html', styleUrls: ['./blog.component.scss'] }) diff --git a/src/app/features/bookmarks/bookmarks.component.ts b/src/app/features/bookmarks/bookmarks.component.ts index 31aa6df8..ad30b149 100644 --- a/src/app/features/bookmarks/bookmarks.component.ts +++ b/src/app/features/bookmarks/bookmarks.component.ts @@ -1,6 +1,7 @@ import { Component, OnInit } from '@angular/core'; @Component({ + selector: 'app-bookmarks', templateUrl: './bookmarks.component.html', styleUrls: ['./bookmarks.component.scss'] }) diff --git a/src/app/features/dashboard/dashboard.component.ts b/src/app/features/dashboard/dashboard.component.ts index bac84c11..843c80f8 100644 --- a/src/app/features/dashboard/dashboard.component.ts +++ b/src/app/features/dashboard/dashboard.component.ts @@ -1,6 +1,7 @@ import { Component, OnInit } from '@angular/core'; @Component({ + selector: 'app-dashboard', templateUrl: './dashboard.component.html', styleUrls: ['./dashboard.component.scss'] }) diff --git a/src/app/features/events/events.component.ts b/src/app/features/events/events.component.ts index 372919fb..5c17dba8 100644 --- a/src/app/features/events/events.component.ts +++ b/src/app/features/events/events.component.ts @@ -1,6 +1,7 @@ import { Component } from '@angular/core'; @Component({ + selector: 'app-events', templateUrl: './events.component.html', styleUrls: ['./events.component.scss'] }) diff --git a/src/app/features/friends/friends.component.ts b/src/app/features/friends/friends.component.ts index 66599c1f..b0dadeca 100644 --- a/src/app/features/friends/friends.component.ts +++ b/src/app/features/friends/friends.component.ts @@ -1,6 +1,7 @@ import { Component, OnInit } from '@angular/core'; @Component({ + selector: 'app-friends', templateUrl: './friends.component.html', styleUrls: ['./friends.component.scss'] }) diff --git a/src/app/features/groups/groups.component.ts b/src/app/features/groups/groups.component.ts index 0d598384..f9072010 100644 --- a/src/app/features/groups/groups.component.ts +++ b/src/app/features/groups/groups.component.ts @@ -1,6 +1,7 @@ import { Component, OnInit } from '@angular/core'; @Component({ + selector: 'app-groups', templateUrl: './groups.component.html', styleUrls: ['./groups.component.scss'] }) diff --git a/src/app/features/home/home.component.ts b/src/app/features/home/home.component.ts index f761da29..82027b38 100644 --- a/src/app/features/home/home.component.ts +++ b/src/app/features/home/home.component.ts @@ -13,6 +13,7 @@ import { Group } from '../groups/models/group'; import { GroupService } from 'src/app/core/services/group.service'; @Component({ + selector: 'app-home', templateUrl: './home.component.html', styleUrls: ['./home.component.scss'] }) diff --git a/src/app/features/invite/invite.component.ts b/src/app/features/invite/invite.component.ts index 0987a6f5..029239bd 100644 --- a/src/app/features/invite/invite.component.ts +++ b/src/app/features/invite/invite.component.ts @@ -1,6 +1,7 @@ import { Component, OnInit } from '@angular/core'; @Component({ + selector: 'app-invite', templateUrl: './invite.component.html', styleUrls: ['./invite.component.scss'] }) diff --git a/src/app/features/login/login.component.ts b/src/app/features/login/login.component.ts index cabad7e5..749aa010 100644 --- a/src/app/features/login/login.component.ts +++ b/src/app/features/login/login.component.ts @@ -3,6 +3,7 @@ import { TranslateService } from '@ngx-translate/core'; import { Translations } from 'src/app/core/services/translations.service'; @Component({ + selector: 'app-login', templateUrl: './login.component.html', styleUrls: ['./login.component.scss'] }) diff --git a/src/app/features/members/members.component.ts b/src/app/features/members/members.component.ts index d693a51d..13b1f635 100644 --- a/src/app/features/members/members.component.ts +++ b/src/app/features/members/members.component.ts @@ -1,6 +1,7 @@ import { Component, OnInit } from '@angular/core'; @Component({ + selector: 'app-members', templateUrl: './members.component.html', styleUrls: ['./members.component.scss'] }) diff --git a/src/app/features/messages/messages.component.ts b/src/app/features/messages/messages.component.ts index 906eaa5a..d9523aa5 100644 --- a/src/app/features/messages/messages.component.ts +++ b/src/app/features/messages/messages.component.ts @@ -1,6 +1,7 @@ import { Component, OnInit } from '@angular/core'; @Component({ + selector: 'app-messages', templateUrl: './messages.component.html', styleUrls: ['./messages.component.scss'] }) diff --git a/src/app/features/missions/missions.component.ts b/src/app/features/missions/missions.component.ts index 9bcd73c4..85ec3148 100644 --- a/src/app/features/missions/missions.component.ts +++ b/src/app/features/missions/missions.component.ts @@ -1,6 +1,7 @@ import { Component, OnInit } from '@angular/core'; @Component({ + selector: 'app-missions', templateUrl: './missions.component.html', styleUrls: ['./missions.component.scss'] }) diff --git a/src/app/features/news-feed/news-feed.component.ts b/src/app/features/news-feed/news-feed.component.ts index fad59108..2ff4b61a 100644 --- a/src/app/features/news-feed/news-feed.component.ts +++ b/src/app/features/news-feed/news-feed.component.ts @@ -1,6 +1,7 @@ import { Component, OnInit } from '@angular/core'; @Component({ + selector: 'app-news-feed', templateUrl: './news-feed.component.html', styleUrls: ['./news-feed.component.scss'] }) diff --git a/src/app/features/privacy/privacy.component.ts b/src/app/features/privacy/privacy.component.ts index addd7ed3..2e61e303 100644 --- a/src/app/features/privacy/privacy.component.ts +++ b/src/app/features/privacy/privacy.component.ts @@ -1,6 +1,7 @@ import { Component, OnInit } from '@angular/core'; @Component({ + selector: 'app-privacy', templateUrl: './privacy.component.html', styleUrls: ['./privacy.component.scss'] }) diff --git a/src/app/features/profile/profile.component.ts b/src/app/features/profile/profile.component.ts index de706c99..29ea4ff3 100644 --- a/src/app/features/profile/profile.component.ts +++ b/src/app/features/profile/profile.component.ts @@ -1,6 +1,7 @@ import { Component, OnInit } from '@angular/core'; @Component({ + selector: 'app-profile', templateUrl: './profile.component.html', styleUrls: ['./profile.component.scss'] }) diff --git a/src/app/features/register/register.component.ts b/src/app/features/register/register.component.ts index 61ca7bb3..8f62eda0 100644 --- a/src/app/features/register/register.component.ts +++ b/src/app/features/register/register.component.ts @@ -1,6 +1,7 @@ import { Component, OnInit } from '@angular/core'; @Component({ + selector: 'app-register', templateUrl: './register.component.html', styleUrls: ['./register.component.scss'] }) diff --git a/src/app/features/search/search.component.ts b/src/app/features/search/search.component.ts index 1075bdc7..41e5ce94 100644 --- a/src/app/features/search/search.component.ts +++ b/src/app/features/search/search.component.ts @@ -1,6 +1,7 @@ import { Component, OnInit } from '@angular/core'; @Component({ + selector: 'app-search', templateUrl: './search.component.html', styleUrls: ['./search.component.scss'] }) diff --git a/src/app/features/settings/settings.component.ts b/src/app/features/settings/settings.component.ts index 3b30c151..232b5ddc 100644 --- a/src/app/features/settings/settings.component.ts +++ b/src/app/features/settings/settings.component.ts @@ -1,6 +1,7 @@ import { Component, OnInit } from '@angular/core'; @Component({ + selector: 'app-settings', templateUrl: './settings.component.html', styleUrls: ['./settings.component.scss'] }) diff --git a/src/app/features/splash/splash.component.ts b/src/app/features/splash/splash.component.ts index 10593c86..ae711dcb 100644 --- a/src/app/features/splash/splash.component.ts +++ b/src/app/features/splash/splash.component.ts @@ -1,6 +1,7 @@ import { Component, OnInit } from '@angular/core'; @Component({ + selector: 'app-splash', templateUrl: './splash.component.html', styleUrls: ['./splash.component.scss'] }) diff --git a/src/app/features/stats/stats.component.ts b/src/app/features/stats/stats.component.ts index d59c3dd7..7df50bc7 100644 --- a/src/app/features/stats/stats.component.ts +++ b/src/app/features/stats/stats.component.ts @@ -1,6 +1,7 @@ import { Component, OnInit } from '@angular/core'; @Component({ + selector: 'app-stats', templateUrl: './stats.component.html', styleUrls: ['./stats.component.scss'] }) diff --git a/src/app/features/terms/terms.component.ts b/src/app/features/terms/terms.component.ts index 34743806..c0c88bf8 100644 --- a/src/app/features/terms/terms.component.ts +++ b/src/app/features/terms/terms.component.ts @@ -1,6 +1,7 @@ import { Component, OnInit } from '@angular/core'; @Component({ + selector: 'app-terms', templateUrl: './terms.component.html', styleUrls: ['./terms.component.scss'] }) diff --git a/src/app/features/the-wire/the-wire.component.ts b/src/app/features/the-wire/the-wire.component.ts index f1c626a2..b31955c1 100644 --- a/src/app/features/the-wire/the-wire.component.ts +++ b/src/app/features/the-wire/the-wire.component.ts @@ -1,6 +1,7 @@ import { Component, OnInit } from '@angular/core'; @Component({ + selector: 'app-the-wire', templateUrl: './the-wire.component.html', styleUrls: ['./the-wire.component.scss'] }) diff --git a/src/app/shared/components/not-found/not-found.component.ts b/src/app/shared/components/not-found/not-found.component.ts index f724734d..90b58159 100644 --- a/src/app/shared/components/not-found/not-found.component.ts +++ b/src/app/shared/components/not-found/not-found.component.ts @@ -1,6 +1,7 @@ import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; @Component({ + selector: 'app-not-found', templateUrl: './not-found.component.html', styleUrls: ['./not-found.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, From 1b2c299af8749636b92449c31f01188b323b12ac Mon Sep 17 00:00:00 2001 From: doug0102 Date: Wed, 10 Jan 2024 13:28:35 -0500 Subject: [PATCH 105/165] fix alignment of icons in the input component --- src/app/shared/components/input/input.component.html | 5 +++-- src/app/shared/components/input/input.component.scss | 5 +---- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/app/shared/components/input/input.component.html b/src/app/shared/components/input/input.component.html index 0f3d5838..e2f330ac 100644 --- a/src/app/shared/components/input/input.component.html +++ b/src/app/shared/components/input/input.component.html @@ -13,6 +13,9 @@ + + + - - Date: Wed, 10 Jan 2024 13:34:42 -0500 Subject: [PATCH 106/165] Event page (#197) * wip * wip * wip * wip - formControl and eventService added * event page layout int completed * wip - temp event cards rendered * event page completed * wip - changes reviewed requested * wip - requested changes made, still aligning search-icon * input removed for searchIcon and form --- src/app/features/events/events.component.html | 93 ++++++++++++++++++- src/app/features/events/events.component.scss | 39 ++++++++ .../features/events/events.component.spec.ts | 20 +++- src/app/features/events/events.component.ts | 20 +++- src/app/shared/shared.module.ts | 3 +- src/assets/i18n/translations.en.ts | 15 ++- src/assets/i18n/translations.fr.ts | 15 ++- 7 files changed, 195 insertions(+), 10 deletions(-) diff --git a/src/app/features/events/events.component.html b/src/app/features/events/events.component.html index f2f77fd0..5306862d 100644 --- a/src/app/features/events/events.component.html +++ b/src/app/features/events/events.component.html @@ -1 +1,92 @@ -

events works!

+ + + + + + +
+
+ + +
+
+ + + +
+ + +
+ + \ No newline at end of file diff --git a/src/app/features/events/events.component.scss b/src/app/features/events/events.component.scss index e69de29b..be2e4235 100644 --- a/src/app/features/events/events.component.scss +++ b/src/app/features/events/events.component.scss @@ -0,0 +1,39 @@ + +:host { + + .search-input-form { + .search-container { + align-items: center; + } + } + + .upcoming-events-content { + .upcoming-events-top { + padding-top: 3%; + padding-bottom: 5%; + } + .upcoming-events-bottom { + padding-bottom: 5%; + } + .click-for-more { + text-align: center; + text-decoration: underline; + font-weight: bold; + } + } + + .previous-events-content { + .previous-events-top { + padding-bottom: 5%; + } + .previous-events-bottom { + padding-bottom: 5%; + } + .click-for-more { + text-align: center; + text-decoration: underline; + font-weight: bold; + } + } + +} \ No newline at end of file diff --git a/src/app/features/events/events.component.spec.ts b/src/app/features/events/events.component.spec.ts index c18bbd5b..229c0ebd 100644 --- a/src/app/features/events/events.component.spec.ts +++ b/src/app/features/events/events.component.spec.ts @@ -1,14 +1,32 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { EventsComponent } from './events.component'; +import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core'; +import { FormControlPipe } from 'src/app/shared/pipes/form-control/form-control.pipe'; +import { HttpClient, HttpClientModule } from '@angular/common/http'; +import { TypescriptLoader } from 'src/app/core/helpers/typescript-loader'; +import { RouterTestingModule } from '@angular/router/testing'; describe('EventsComponent', () => { let component: EventsComponent; + let translateService: TranslateService; let fixture: ComponentFixture; beforeEach(() => { TestBed.configureTestingModule({ - declarations: [EventsComponent] + declarations: [EventsComponent, FormControlPipe], + imports: [ + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useFactory: (http: HttpClient) => new TypescriptLoader (http, 'translations'), + deps: [ HttpClient ] + } + }), + HttpClientModule, + RouterTestingModule + ], + providers: [ TranslateService, HttpClient ] }); fixture = TestBed.createComponent(EventsComponent); component = fixture.componentInstance; diff --git a/src/app/features/events/events.component.ts b/src/app/features/events/events.component.ts index 372919fb..f44aa008 100644 --- a/src/app/features/events/events.component.ts +++ b/src/app/features/events/events.component.ts @@ -1,4 +1,9 @@ -import { Component } from '@angular/core'; +import { Component, Input } from '@angular/core'; +import { FormControl, FormGroup } from '@angular/forms'; +import { CoreRoutes } from 'src/app/core/constants/routes.constants'; +import { Translations } from 'src/app/core/services/translations.service'; +import { MaterialButtonType } from 'src/app/shared/models/material-button-type'; +import { EventService } from 'src/app/core/services/event.service'; @Component({ templateUrl: './events.component.html', @@ -6,4 +11,17 @@ import { Component } from '@angular/core'; }) export class EventsComponent { + routes = CoreRoutes; + form: FormGroup = new FormGroup({}); + searchIcon: string = 'fa-solid fa-magnifying-glass'; + eventsPage: number = 1; + loadingEvents: boolean = true; + materialButtonType = MaterialButtonType; + + constructor(public translations: Translations, + public eventService: EventService) {} + + ngOnInit(): void { + this.form.addControl("eventSearchBar", new FormControl("", [])); + } } diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index ca9afa87..94081134 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -125,7 +125,8 @@ import { ListComponent } from './components/list/list.component'; BlogFormComponent, EventFormComponent, PollFormComponent, - ListComponent + ListComponent, + FormControlPipe ], providers: [ { diff --git a/src/assets/i18n/translations.en.ts b/src/assets/i18n/translations.en.ts index 32f23cd4..b1671d0d 100644 --- a/src/assets/i18n/translations.en.ts +++ b/src/assets/i18n/translations.en.ts @@ -61,6 +61,8 @@ export default { "settings": "Settings", "thewire": "The Wire", "unauthorized": "Unauthorized", + "upcoming_events": "Up Coming Events", + "previous_events": "Previous Events", "forbidden": "Forbidden", "communities": "Communities", "notfound": "Not Found" @@ -77,7 +79,8 @@ export default { "moreEvents": "More events", "moreConnections": "More connections", "moreGroups": "More groups" - } + }, + "more": "See more" }, "header": { "home": { @@ -208,7 +211,8 @@ export default { }, "banner": { "welcome": "WELCOME", - "gccollab": "TO GCCollab" + "gccollab": "TO GCCollab", + "event": "Events" }, "newsCard": { "like": { @@ -269,6 +273,9 @@ export default { "alt": "A profile picture" }, "event": { + "search": { + "title": "Search events" + }, "date_time": "Date & Time:", "location": "Location:", "host": "Host:", @@ -306,6 +313,7 @@ export default { "save": "Save", "saved_image": "Saved Image", "create": "Create", + "search": "Search events", "post": { "post": "Post" }, @@ -338,7 +346,8 @@ export default { "single_day": "One day event", "multi_day": "Multi-day event", "start_date": "Start date", - "end_date": "End date" + "end_date": "End date", + "search": " " }, "poll": { "description": "Poll description / question", diff --git a/src/assets/i18n/translations.fr.ts b/src/assets/i18n/translations.fr.ts index aa0db99a..73e2971f 100644 --- a/src/assets/i18n/translations.fr.ts +++ b/src/assets/i18n/translations.fr.ts @@ -61,6 +61,8 @@ const fr: typeof import('./translations.en').default = { "settings": "Réglages", "thewire": "Le fil", "unauthorized": "Non autorisé", + "upcoming_events": "Événements à venir", + "previous_events": "Événements précédents", "forbidden": "Interdit", "communities": "Communautés", "notfound": "Pas trouvé" @@ -77,8 +79,9 @@ const fr: typeof import('./translations.en').default = { "moreEvents": "Plus d'événements", "moreConnections": "Plus de connexions", "moreGroups": "Plus des groupes" + }, + "more": "Voir Plus" - } }, "header": { "home": { @@ -209,7 +212,8 @@ const fr: typeof import('./translations.en').default = { }, "banner": { "welcome": "BIENVENUE", - "gccollab": "À GCCollab" + "gccollab": "À GCCollab", + "event": "Événements" }, "newsCard": { "like": { @@ -270,6 +274,9 @@ const fr: typeof import('./translations.en').default = { "alt": "Une photo de profil" }, "event": { + "search": { + "title": "Search events" + }, "date_time": "Date & Heure:", "location": "Emplacement:", "host": "Hôte:", @@ -307,6 +314,7 @@ const fr: typeof import('./translations.en').default = { "save": "Sauvegarder", "saved_image": "Image enregistrée", "create": "Créer", + "search": "Rechercher des événements", "post": { "post": "Poste" }, @@ -339,7 +347,8 @@ const fr: typeof import('./translations.en').default = { "single_day": "Événement d'une journée", "multi_day": "Événement sur plusieurs jours", "start_date": "Date de début", - "end_date": "Date de fin" + "end_date": "Date de fin", + "search": " " }, "poll": { "description": "Description/question du sondage", From ce2d9c3e6227ee5d5ae3a602d12480910fc72145 Mon Sep 17 00:00:00 2001 From: Shea Date: Wed, 10 Jan 2024 18:35:26 +0000 Subject: [PATCH 107/165] Dependency Graph ignore-deploy --- dependency-graph.svg | 3474 +++++++++++++++++++++--------------------- 1 file changed, 1755 insertions(+), 1719 deletions(-) diff --git a/dependency-graph.svg b/dependency-graph.svg index ae648c10..11f0f525 100644 --- a/dependency-graph.svg +++ b/dependency-graph.svg @@ -4,280 +4,280 @@ - - + + dependency-cruiser output - + cluster_src - -src + +src cluster_src/app - -app + +app cluster_src/app/core - -core + +core cluster_src/app/core/auth - -auth + +auth cluster_src/app/core/constants - -constants + +constants cluster_src/app/core/guards - -guards + +guards cluster_src/app/core/helpers - -helpers + +helpers cluster_src/app/core/interceptors - -interceptors + +interceptors cluster_src/app/core/interfaces - -interfaces + +interfaces cluster_src/app/core/models - -models + +models cluster_src/app/core/services - -services + +services cluster_src/app/features - -features + +features cluster_src/app/features/about - -about + +about cluster_src/app/features/blog - -blog + +blog cluster_src/app/features/bookmarks - -bookmarks + +bookmarks cluster_src/app/features/dashboard - -dashboard + +dashboard cluster_src/app/features/events - -events + +events cluster_src/app/features/events/components - -components + +components cluster_src/app/features/events/components/event-card - -event-card + +event-card cluster_src/app/features/events/components/event-list - -event-list + +event-list cluster_src/app/features/events/components/event - -event + +event cluster_src/app/features/events/models - -models + +models cluster_src/app/features/events/resolvers - -resolvers + +resolvers cluster_src/app/features/friends - -friends + +friends cluster_src/app/features/groups - -groups + +groups cluster_src/app/features/groups/components - -components + +components cluster_src/app/features/groups/components/group-card - -group-card + +group-card cluster_src/app/features/groups/components/group-list - -group-list + +group-list cluster_src/app/features/groups/components/group - -group + +group cluster_src/app/features/groups/models - -models + +models cluster_src/app/features/home - -home + +home cluster_src/app/features/invite - -invite + +invite cluster_src/app/features/login - -login + +login cluster_src/app/features/members - -members + +members cluster_src/app/features/messages - -messages + +messages cluster_src/app/features/missions - -missions + +missions cluster_src/app/features/news-feed - -news-feed + +news-feed cluster_src/app/features/news-feed/components - -components + +components cluster_src/app/features/news-feed/components/news-card - -news-card + +news-card cluster_src/app/features/news-feed/components/news-list - -news-list + +news-list cluster_src/app/features/news-feed/models - -models + +models cluster_src/app/features/privacy - -privacy + +privacy cluster_src/app/features/profile - -profile + +profile cluster_src/app/features/profile/components - -components + +components cluster_src/app/features/profile/components/post - -post + +post cluster_src/app/features/profile/components/profile-card - -profile-card + +profile-card cluster_src/app/features/profile/components/profile-list - -profile-list + +profile-list cluster_src/app/features/register - -register + +register cluster_src/app/features/search - -search + +search cluster_src/app/features/settings - -settings + +settings cluster_src/app/features/splash - -splash + +splash cluster_src/app/features/stats - -stats + +stats cluster_src/app/features/terms - -terms + +terms cluster_src/app/features/the-wire - -the-wire + +the-wire cluster_src/app/shared @@ -396,13 +396,13 @@ cluster_src/app/shared/factories - -factories + +factories cluster_src/app/shared/models - -models + +models cluster_src/app/shared/pipes @@ -426,13 +426,13 @@ cluster_src/assets - -assets + +assets cluster_src/assets/i18n - -i18n + +i18n cluster_src/environments @@ -443,8 +443,8 @@ src/app/app-routing.module.ts - -app-routing.module.ts + +app-routing.module.ts @@ -452,482 +452,482 @@ src/app/core/constants/routes.constants.ts - -routes.constants.ts + +routes.constants.ts src/app/app-routing.module.ts->src/app/core/constants/routes.constants.ts - - + + src/app/core/guards/auth.guard.ts - -auth.guard.ts + +auth.guard.ts src/app/app-routing.module.ts->src/app/core/guards/auth.guard.ts - - + + src/app/core/guards/interceptor.guard.ts - -interceptor.guard.ts + +interceptor.guard.ts src/app/app-routing.module.ts->src/app/core/guards/interceptor.guard.ts - - + + src/app/core/guards/login.guard.ts - -login.guard.ts + +login.guard.ts src/app/app-routing.module.ts->src/app/core/guards/login.guard.ts - - + + src/app/core/guards/redirect.guard.ts - -redirect.guard.ts + +redirect.guard.ts src/app/app-routing.module.ts->src/app/core/guards/redirect.guard.ts - - + + src/app/core/services/translations.service.ts - -translations.service.ts + +translations.service.ts src/app/app-routing.module.ts->src/app/core/services/translations.service.ts - - + + src/app/features/about/about.module.ts - -about.module.ts + +about.module.ts src/app/app-routing.module.ts->src/app/features/about/about.module.ts - - - - + + + + src/app/features/blog/blog.module.ts - -blog.module.ts + +blog.module.ts src/app/app-routing.module.ts->src/app/features/blog/blog.module.ts - - - - + + + + src/app/features/bookmarks/bookmarks.module.ts - -bookmarks.module.ts + +bookmarks.module.ts src/app/app-routing.module.ts->src/app/features/bookmarks/bookmarks.module.ts - - - - + + + + src/app/features/dashboard/dashboard.module.ts - -dashboard.module.ts + +dashboard.module.ts src/app/app-routing.module.ts->src/app/features/dashboard/dashboard.module.ts - - - - + + + + src/app/features/events/events.module.ts - -events.module.ts + +events.module.ts src/app/app-routing.module.ts->src/app/features/events/events.module.ts - - - - + + + + src/app/features/friends/friends.module.ts - -friends.module.ts + +friends.module.ts src/app/app-routing.module.ts->src/app/features/friends/friends.module.ts - - - - + + + + src/app/features/groups/groups.module.ts - -groups.module.ts + +groups.module.ts src/app/app-routing.module.ts->src/app/features/groups/groups.module.ts - - - - + + + + src/app/features/home/home.module.ts - -home.module.ts + +home.module.ts src/app/app-routing.module.ts->src/app/features/home/home.module.ts - - - - + + + + src/app/features/invite/invite.module.ts - -invite.module.ts + +invite.module.ts src/app/app-routing.module.ts->src/app/features/invite/invite.module.ts - - - - + + + + src/app/features/login/login.module.ts - -login.module.ts + +login.module.ts src/app/app-routing.module.ts->src/app/features/login/login.module.ts - - - - + + + + src/app/features/members/members.module.ts - -members.module.ts + +members.module.ts src/app/app-routing.module.ts->src/app/features/members/members.module.ts - - - - + + + + src/app/features/messages/messages.module.ts - -messages.module.ts + +messages.module.ts src/app/app-routing.module.ts->src/app/features/messages/messages.module.ts - - - - + + + + src/app/features/missions/missions.module.ts - -missions.module.ts + +missions.module.ts src/app/app-routing.module.ts->src/app/features/missions/missions.module.ts - - - - + + + + src/app/features/news-feed/news-feed.module.ts - -news-feed.module.ts + +news-feed.module.ts src/app/app-routing.module.ts->src/app/features/news-feed/news-feed.module.ts - - - - + + + + src/app/features/privacy/privacy.module.ts - -privacy.module.ts + +privacy.module.ts src/app/app-routing.module.ts->src/app/features/privacy/privacy.module.ts - - - - + + + + src/app/features/profile/profile.module.ts - -profile.module.ts + +profile.module.ts src/app/app-routing.module.ts->src/app/features/profile/profile.module.ts - - - - + + + + src/app/features/register/register.module.ts - -register.module.ts + +register.module.ts src/app/app-routing.module.ts->src/app/features/register/register.module.ts - - - - + + + + src/app/features/search/search.module.ts - -search.module.ts + +search.module.ts src/app/app-routing.module.ts->src/app/features/search/search.module.ts - - - - + + + + src/app/features/settings/settings.module.ts - -settings.module.ts + +settings.module.ts src/app/app-routing.module.ts->src/app/features/settings/settings.module.ts - - - - + + + + src/app/features/splash/splash.module.ts - -splash.module.ts + +splash.module.ts src/app/app-routing.module.ts->src/app/features/splash/splash.module.ts - - - - + + + + src/app/features/stats/stats.module.ts - -stats.module.ts + +stats.module.ts src/app/app-routing.module.ts->src/app/features/stats/stats.module.ts - - - - + + + + src/app/features/terms/terms.module.ts - -terms.module.ts + +terms.module.ts src/app/app-routing.module.ts->src/app/features/terms/terms.module.ts - - - - + + + + src/app/features/the-wire/the-wire.module.ts - -the-wire.module.ts + +the-wire.module.ts src/app/app-routing.module.ts->src/app/features/the-wire/the-wire.module.ts - - - - + + + + @@ -941,7 +941,7 @@ src/app/app-routing.module.ts->src/app/shared/components/forbidden/forbidden.component.ts - + @@ -956,7 +956,7 @@ src/app/app-routing.module.ts->src/app/shared/components/not-found/not-found.component.ts - + @@ -971,23 +971,23 @@ src/app/app-routing.module.ts->src/app/shared/components/unauthorized/unauthorized.component.ts - + src/app/core/services/session-storage.service.ts - -session-storage.service.ts + +session-storage.service.ts src/app/core/guards/auth.guard.ts->src/app/core/services/session-storage.service.ts - - + + @@ -1001,29 +1001,29 @@ src/app/core/guards/auth.guard.ts->src/environments/environment.ts - - + + src/app/core/guards/interceptor.guard.ts->src/app/core/services/session-storage.service.ts - - + + src/assets/i18n/translations.en.ts - -translations.en.ts + +translations.en.ts src/app/core/services/translations.service.ts->src/assets/i18n/translations.en.ts - - + + @@ -1037,205 +1037,205 @@ src/app/features/about/about.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/about/about-routing.module.ts - -about-routing.module.ts + +about-routing.module.ts src/app/features/about/about.module.ts->src/app/features/about/about-routing.module.ts - - + + src/app/features/about/about.component.ts - -about.component.ts + +about.component.ts src/app/features/about/about.module.ts->src/app/features/about/about.component.ts - - + + src/app/features/blog/blog.module.ts->src/app/shared/shared.module.ts - - - + + + src/app/features/blog/blog-routing.module.ts - -blog-routing.module.ts + +blog-routing.module.ts src/app/features/blog/blog.module.ts->src/app/features/blog/blog-routing.module.ts - - + + src/app/features/bookmarks/bookmarks.module.ts->src/app/shared/shared.module.ts - - - + + + src/app/features/bookmarks/bookmarks-routing.module.ts - -bookmarks-routing.module.ts + +bookmarks-routing.module.ts src/app/features/bookmarks/bookmarks.module.ts->src/app/features/bookmarks/bookmarks-routing.module.ts - - + + src/app/features/dashboard/dashboard.module.ts->src/app/shared/shared.module.ts - - - + + + src/app/features/dashboard/dashboard-routing.module.ts - -dashboard-routing.module.ts + +dashboard-routing.module.ts src/app/features/dashboard/dashboard.module.ts->src/app/features/dashboard/dashboard-routing.module.ts - - + + - + src/app/features/events/events.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/events/components/event-card/event-card.component.ts - -event-card.component.ts + +event-card.component.ts - + src/app/features/events/events.module.ts->src/app/features/events/components/event-card/event-card.component.ts - - + + src/app/features/events/components/event-list/event-list.component.ts - -event-list.component.ts + +event-list.component.ts - + src/app/features/events/events.module.ts->src/app/features/events/components/event-list/event-list.component.ts - - + + src/app/features/events/components/event/event.component.ts - -event.component.ts + +event.component.ts - + src/app/features/events/events.module.ts->src/app/features/events/components/event/event.component.ts - - + + src/app/features/events/events-routing.module.ts - -events-routing.module.ts + +events-routing.module.ts - + src/app/features/events/events.module.ts->src/app/features/events/events-routing.module.ts - - + + - + src/app/features/friends/friends.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/friends/friends-routing.module.ts - - -friends-routing.module.ts + + +friends-routing.module.ts - + src/app/features/friends/friends.module.ts->src/app/features/friends/friends-routing.module.ts - - + + - + src/app/features/groups/groups.module.ts->src/app/shared/shared.module.ts - + @@ -1244,648 +1244,648 @@ src/app/features/groups/components/group-card/group-card.component.ts - -group-card.component.ts + +group-card.component.ts - + src/app/features/groups/groups.module.ts->src/app/features/groups/components/group-card/group-card.component.ts - - + + - + src/app/features/groups/components/group-list/group-list.component.ts - - -group-list.component.ts + + +group-list.component.ts - + src/app/features/groups/groups.module.ts->src/app/features/groups/components/group-list/group-list.component.ts - - + + - + src/app/features/groups/components/group/group.component.ts - - -group.component.ts + + +group.component.ts - + src/app/features/groups/groups.module.ts->src/app/features/groups/components/group/group.component.ts - - + + - + src/app/features/groups/groups-routing.module.ts - - -groups-routing.module.ts + + +groups-routing.module.ts - + src/app/features/groups/groups.module.ts->src/app/features/groups/groups-routing.module.ts - - + + - + src/app/features/home/home.module.ts->src/app/features/events/events.module.ts - - - - + + + + - + src/app/features/home/home.module.ts->src/app/features/groups/groups.module.ts - - - - + + + + - + src/app/features/home/home.module.ts->src/app/features/news-feed/news-feed.module.ts - - - - + + + + - + src/app/features/home/home.module.ts->src/app/features/profile/profile.module.ts - - - - + + + + - + src/app/features/home/home.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/home/home-routing.module.ts - - -home-routing.module.ts + + +home-routing.module.ts - + src/app/features/home/home.module.ts->src/app/features/home/home-routing.module.ts - - + + - + src/app/features/home/home.component.ts - - -home.component.ts + + +home.component.ts - + src/app/features/home/home.module.ts->src/app/features/home/home.component.ts - - + + - + src/app/features/invite/invite.module.ts->src/app/shared/shared.module.ts - + - - + + - + src/app/features/invite/invite-routing.module.ts - - -invite-routing.module.ts + + +invite-routing.module.ts - + src/app/features/invite/invite.module.ts->src/app/features/invite/invite-routing.module.ts - - + + - + src/app/features/login/login.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/login/login-routing.module.ts - - -login-routing.module.ts + + +login-routing.module.ts - + src/app/features/login/login.module.ts->src/app/features/login/login-routing.module.ts - - + + - + src/app/features/login/login.component.ts - - -login.component.ts + + +login.component.ts - + src/app/features/login/login.module.ts->src/app/features/login/login.component.ts - - + + - + src/app/features/members/members.module.ts->src/app/shared/shared.module.ts - + - + src/app/features/members/members-routing.module.ts - - -members-routing.module.ts + + +members-routing.module.ts - + src/app/features/members/members.module.ts->src/app/features/members/members-routing.module.ts - - + + - + src/app/features/messages/messages.module.ts->src/app/shared/shared.module.ts - - - + + + - + src/app/features/messages/messages-routing.module.ts - - -messages-routing.module.ts + + +messages-routing.module.ts - + src/app/features/messages/messages.module.ts->src/app/features/messages/messages-routing.module.ts - - + + - + src/app/features/missions/missions.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/missions/missions-routing.module.ts - - -missions-routing.module.ts + + +missions-routing.module.ts - + src/app/features/missions/missions.module.ts->src/app/features/missions/missions-routing.module.ts - - + + - + src/app/features/news-feed/news-feed.module.ts->src/app/shared/shared.module.ts - - - - + + + + src/app/features/news-feed/components/news-card/news-card.component.ts - -news-card.component.ts + +news-card.component.ts - + src/app/features/news-feed/news-feed.module.ts->src/app/features/news-feed/components/news-card/news-card.component.ts - - + + - + src/app/features/news-feed/components/news-list/news-list.component.ts - - -news-list.component.ts + + +news-list.component.ts - + src/app/features/news-feed/news-feed.module.ts->src/app/features/news-feed/components/news-list/news-list.component.ts - - + + - + src/app/features/news-feed/news-feed-routing.module.ts - - -news-feed-routing.module.ts + + +news-feed-routing.module.ts - + src/app/features/news-feed/news-feed.module.ts->src/app/features/news-feed/news-feed-routing.module.ts - - + + - + src/app/features/privacy/privacy.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/privacy/privacy-routing.module.ts - - -privacy-routing.module.ts + + +privacy-routing.module.ts - + src/app/features/privacy/privacy.module.ts->src/app/features/privacy/privacy-routing.module.ts - - + + - + src/app/features/privacy/privacy.component.ts - - -privacy.component.ts + + +privacy.component.ts - + src/app/features/privacy/privacy.module.ts->src/app/features/privacy/privacy.component.ts - - + + - + src/app/features/profile/profile.module.ts->src/app/shared/shared.module.ts - + - + src/app/features/profile/components/profile-card/profile-card.component.ts - -profile-card.component.ts + +profile-card.component.ts - + src/app/features/profile/profile.module.ts->src/app/features/profile/components/profile-card/profile-card.component.ts - - + + - + src/app/features/profile/components/post/post.component.ts - - -post.component.ts + + +post.component.ts - + src/app/features/profile/profile.module.ts->src/app/features/profile/components/post/post.component.ts - - + + - + src/app/features/profile/components/profile-list/profile-list.component.ts - - -profile-list.component.ts + + +profile-list.component.ts - + src/app/features/profile/profile.module.ts->src/app/features/profile/components/profile-list/profile-list.component.ts - - + + - + src/app/features/profile/profile-routing.module.ts - - -profile-routing.module.ts + + +profile-routing.module.ts - + src/app/features/profile/profile.module.ts->src/app/features/profile/profile-routing.module.ts - - + + - + src/app/features/register/register.module.ts->src/app/shared/shared.module.ts - + - + - + src/app/features/register/register-routing.module.ts - - -register-routing.module.ts + + +register-routing.module.ts - + src/app/features/register/register.module.ts->src/app/features/register/register-routing.module.ts - - + + - + src/app/features/register/register.component.ts - - -register.component.ts + + +register.component.ts - + src/app/features/register/register.module.ts->src/app/features/register/register.component.ts - - + + - + src/app/features/search/search.module.ts->src/app/shared/shared.module.ts - - - + + + - + src/app/features/search/search-routing.module.ts - - -search-routing.module.ts + + +search-routing.module.ts - + src/app/features/search/search.module.ts->src/app/features/search/search-routing.module.ts - - + + - + src/app/features/settings/settings.module.ts->src/app/shared/shared.module.ts - + - + src/app/features/settings/settings-routing.module.ts - - -settings-routing.module.ts + + +settings-routing.module.ts - + src/app/features/settings/settings.module.ts->src/app/features/settings/settings-routing.module.ts - - + + - + src/app/features/splash/splash.module.ts->src/app/shared/shared.module.ts - - - + + + - + src/app/features/splash/splash-routing.module.ts - - -splash-routing.module.ts + + +splash-routing.module.ts - + src/app/features/splash/splash.module.ts->src/app/features/splash/splash-routing.module.ts - - + + - + src/app/features/splash/splash.component.ts - - -splash.component.ts + + +splash.component.ts - + src/app/features/splash/splash.module.ts->src/app/features/splash/splash.component.ts - - + + - + src/app/features/stats/stats.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/stats/stats-routing.module.ts - - -stats-routing.module.ts + + +stats-routing.module.ts - + src/app/features/stats/stats.module.ts->src/app/features/stats/stats-routing.module.ts - - + + - + src/app/features/stats/stats.component.ts - - -stats.component.ts + + +stats.component.ts - + src/app/features/stats/stats.module.ts->src/app/features/stats/stats.component.ts - - + + - + src/app/features/terms/terms.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/terms/terms-routing.module.ts - - -terms-routing.module.ts + + +terms-routing.module.ts - + src/app/features/terms/terms.module.ts->src/app/features/terms/terms-routing.module.ts - - + + - + src/app/features/terms/terms.component.ts - - -terms.component.ts + + +terms.component.ts - + src/app/features/terms/terms.module.ts->src/app/features/terms/terms.component.ts - - + + - + src/app/features/the-wire/the-wire.module.ts->src/app/shared/shared.module.ts - - - - + + + + - + src/app/features/the-wire/the-wire-routing.module.ts - - -the-wire-routing.module.ts + + +the-wire-routing.module.ts - + src/app/features/the-wire/the-wire.module.ts->src/app/features/the-wire/the-wire-routing.module.ts - - + + src/app/app.component.spec.ts - -app.component.spec.ts + +app.component.spec.ts @@ -1893,196 +1893,196 @@ src/app/app.component.ts - -app.component.ts + +app.component.ts src/app/app.component.spec.ts->src/app/app.component.ts - - + + src/app/core/auth/auth.module.ts - -auth.module.ts + +auth.module.ts src/app/app.component.spec.ts->src/app/core/auth/auth.module.ts - - + + src/app/core/helpers/typescript-loader.ts - -typescript-loader.ts + +typescript-loader.ts src/app/app.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/app.component.ts->src/app/core/constants/routes.constants.ts - - + + src/app/app.component.ts->src/app/core/services/translations.service.ts - - + + src/app/core/services/language-storage.service.ts - -language-storage.service.ts + +language-storage.service.ts src/app/app.component.ts->src/app/core/services/language-storage.service.ts - - + + src/app/core/auth/auth.module.ts->src/app/core/services/session-storage.service.ts - - + + src/app/core/auth/auth.module.ts->src/environments/environment.ts - - + + src/app/core/services/local-storage-ref.service.ts - -local-storage-ref.service.ts + +local-storage-ref.service.ts src/app/core/services/language-storage.service.ts->src/app/core/services/local-storage-ref.service.ts - - + + src/app/app.module.ts - -app.module.ts + +app.module.ts src/app/app.module.ts->src/app/app-routing.module.ts - - - - + + + + src/app/app.module.ts->src/app/app.component.ts - - + + src/app/app.module.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/core/core.module.ts - -core.module.ts + +core.module.ts src/app/app.module.ts->src/app/core/core.module.ts - - - - + + + + src/app/core/services/title.service.ts - -title.service.ts + +title.service.ts src/app/app.module.ts->src/app/core/services/title.service.ts - - + + src/app/features/events/events.component.ts - -events.component.ts + +events.component.ts src/app/app.module.ts->src/app/features/events/events.component.ts - - + + src/app/features/groups/groups.component.ts - -groups.component.ts + +groups.component.ts src/app/app.module.ts->src/app/features/groups/groups.component.ts - - + + src/app/app.module.ts->src/app/shared/shared.module.ts - + @@ -2090,60 +2090,102 @@ src/app/core/core.module.ts->src/app/core/auth/auth.module.ts - - + + src/app/core/core.module.ts->src/app/core/helpers/typescript-loader.ts - - + + + + + +src/app/core/core.module.ts->src/app/app.module.ts + + + + + + + +src/app/features/events/events.component.ts->src/app/core/constants/routes.constants.ts + + + + + +src/app/features/events/events.component.ts->src/app/core/services/translations.service.ts + + + + + +src/app/core/services/event.service.ts + + +event.service.ts + + + + + +src/app/features/events/events.component.ts->src/app/core/services/event.service.ts + + + + + +src/app/shared/models/material-button-type.ts + + +material-button-type.ts + + - - -src/app/core/core.module.ts->src/app/app.module.ts - - - - + + +src/app/features/events/events.component.ts->src/app/shared/models/material-button-type.ts + + - + src/app/shared/shared.module.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/shared.module.ts->src/app/shared/components/forbidden/forbidden.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/not-found/not-found.component.ts - + src/app/shared/shared.module.ts->src/app/shared/components/unauthorized/unauthorized.component.ts - + src/app/shared/shared.module.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/shared.module.ts->src/app/app.module.ts - - - - + + + + @@ -2155,22 +2197,22 @@ - + src/app/shared/shared.module.ts->src/app/shared/components/banner/banner.component.ts - + src/app/shared/pipes/form-control/form-control.pipe.ts - + form-control.pipe.ts - + src/app/shared/shared.module.ts->src/app/shared/pipes/form-control/form-control.pipe.ts @@ -2185,7 +2227,7 @@ - + src/app/shared/shared.module.ts->src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.ts @@ -2200,7 +2242,7 @@ - + src/app/shared/shared.module.ts->src/app/shared/components/blog-form/blog-form.component.ts @@ -2215,7 +2257,7 @@ - + src/app/shared/shared.module.ts->src/app/shared/components/button/button.component.ts @@ -2230,7 +2272,7 @@ - + src/app/shared/shared.module.ts->src/app/shared/components/calendar-button/calendar-button.component.ts @@ -2245,7 +2287,7 @@ - + src/app/shared/shared.module.ts->src/app/shared/components/editor/editor.component.ts @@ -2254,16 +2296,16 @@ src/app/shared/factories/editor-config.factory.ts - -editor-config.factory.ts + +editor-config.factory.ts - + src/app/shared/shared.module.ts->src/app/shared/factories/editor-config.factory.ts - - + + @@ -2275,7 +2317,7 @@ - + src/app/shared/shared.module.ts->src/app/shared/components/editor/menu/editor-menu/editor-menu.component.ts @@ -2290,7 +2332,7 @@ - + src/app/shared/shared.module.ts->src/app/shared/components/event-form/event-form.component.ts @@ -2305,7 +2347,7 @@ - + src/app/shared/shared.module.ts->src/app/shared/components/file-select/file-select.component.ts @@ -2320,7 +2362,7 @@ - + src/app/shared/shared.module.ts->src/app/shared/components/footer/footer.component.ts @@ -2335,7 +2377,7 @@ - + src/app/shared/shared.module.ts->src/app/shared/components/header/header.component.ts @@ -2350,7 +2392,7 @@ - + src/app/shared/shared.module.ts->src/app/shared/components/input/input.component.ts @@ -2365,7 +2407,7 @@ - + src/app/shared/shared.module.ts->src/app/shared/components/language-selector/language-selector.component.ts @@ -2380,7 +2422,7 @@ - + src/app/shared/shared.module.ts->src/app/shared/components/list/list.component.ts @@ -2395,7 +2437,7 @@ - + src/app/shared/shared.module.ts->src/app/shared/components/page-title/page-title.component.ts @@ -2410,7 +2452,7 @@ - + src/app/shared/shared.module.ts->src/app/shared/components/poll-form/poll-form.component.ts @@ -2425,7 +2467,7 @@ - + src/app/shared/shared.module.ts->src/app/shared/components/post-form/post-form.component.ts @@ -2440,7 +2482,7 @@ - + src/app/shared/shared.module.ts->src/app/shared/components/profile-pic/profile-pic.component.ts @@ -2455,7 +2497,7 @@ - + src/app/shared/shared.module.ts->src/app/shared/pipes/form-group/form-group.pipe.ts @@ -2463,93 +2505,93 @@ src/app/core/services/session-storage.service.ts->src/app/core/services/local-storage-ref.service.ts - - + + src/app/core/guards/auth.guard.spec.ts - -auth.guard.spec.ts + +auth.guard.spec.ts src/app/core/guards/auth.guard.spec.ts->src/app/core/guards/auth.guard.ts - - + + src/app/core/guards/auth.guard.spec.ts->src/app/core/auth/auth.module.ts - - + + src/app/core/guards/auth.guard.spec.ts->src/app/core/services/session-storage.service.ts - - + + src/app/core/guards/interceptor.guard.spec.ts - -interceptor.guard.spec.ts + +interceptor.guard.spec.ts src/app/core/guards/interceptor.guard.spec.ts->src/app/core/guards/interceptor.guard.ts - - + + src/app/core/guards/login.guard.spec.ts - -login.guard.spec.ts + +login.guard.spec.ts src/app/core/guards/login.guard.spec.ts->src/app/core/guards/login.guard.ts - - + + src/app/core/guards/login.guard.spec.ts->src/app/core/auth/auth.module.ts - - + + src/app/core/guards/redirect.guard.spec.ts - -redirect.guard.spec.ts + +redirect.guard.spec.ts src/app/core/guards/redirect.guard.spec.ts->src/app/core/guards/redirect.guard.ts - - + + src/app/core/guards/role.guard.spec.ts - -role.guard.spec.ts + +role.guard.spec.ts @@ -2557,23 +2599,23 @@ src/app/core/guards/role.guard.ts - -role.guard.ts + +role.guard.ts src/app/core/guards/role.guard.spec.ts->src/app/core/guards/role.guard.ts - - + + src/app/core/interceptors/error.interceptor.spec.ts - -error.interceptor.spec.ts + +error.interceptor.spec.ts @@ -2581,23 +2623,23 @@ src/app/core/interceptors/error.interceptor.ts - -error.interceptor.ts + +error.interceptor.ts src/app/core/interceptors/error.interceptor.spec.ts->src/app/core/interceptors/error.interceptor.ts - - + + src/app/core/interfaces/card-component.interface.ts - -card-component.interface.ts + +card-component.interface.ts @@ -2605,23 +2647,23 @@ src/app/shared/models/card-size.ts - -card-size.ts + +card-size.ts src/app/core/interfaces/card-component.interface.ts->src/app/shared/models/card-size.ts - - + + src/app/core/interfaces/list-service.interface.ts - -list-service.interface.ts + +list-service.interface.ts @@ -2629,8 +2671,8 @@ src/app/core/models/blog.model.ts - -blog.model.ts + +blog.model.ts @@ -2638,101 +2680,101 @@ src/app/core/models/person.model.ts - -person.model.ts + +person.model.ts src/app/core/models/blog.model.ts->src/app/core/models/person.model.ts - - + + src/app/features/news-feed/models/INewsItem.ts - -INewsItem.ts + +INewsItem.ts src/app/core/models/blog.model.ts->src/app/features/news-feed/models/INewsItem.ts - - + + src/app/core/models/location.model.ts - -location.model.ts + +location.model.ts src/app/core/models/person.model.ts->src/app/core/models/location.model.ts - - + + - + src/app/features/news-feed/models/INewsItem.ts->src/app/core/models/person.model.ts - - + + src/app/core/models/poll.model.ts - -poll.model.ts + +poll.model.ts src/app/core/models/poll.model.ts->src/app/core/models/person.model.ts - - + + src/app/core/models/poll.model.ts->src/app/features/news-feed/models/INewsItem.ts - - + + src/app/core/models/post.model.ts - -post.model.ts + +post.model.ts src/app/core/models/post.model.ts->src/app/core/models/person.model.ts - - + + src/app/core/models/post.model.ts->src/app/features/news-feed/models/INewsItem.ts - - + + src/app/core/services/debounce.service.spec.ts - -debounce.service.spec.ts + +debounce.service.spec.ts @@ -2740,239 +2782,221 @@ src/app/core/services/debounce.service.ts - -debounce.service.ts + +debounce.service.ts src/app/core/services/debounce.service.spec.ts->src/app/core/services/debounce.service.ts - - + + src/app/core/services/event.service.spec.ts - -event.service.spec.ts - - - - - -src/app/core/services/event.service.ts - - -event.service.ts + +event.service.spec.ts src/app/core/services/event.service.spec.ts->src/app/core/services/event.service.ts - - + + src/app/core/services/event.service.ts->src/app/core/interfaces/list-service.interface.ts - - + + src/app/core/services/event.service.ts->src/app/core/models/location.model.ts - - + + src/app/core/services/group.service.ts - -group.service.ts + +group.service.ts src/app/core/services/event.service.ts->src/app/core/services/group.service.ts - - + + src/app/core/services/people.service.ts - -people.service.ts + +people.service.ts src/app/core/services/event.service.ts->src/app/core/services/people.service.ts - - + + src/app/core/services/event.service.ts->src/app/features/events/components/event-card/event-card.component.ts - - + + src/app/features/events/models/event.ts - -event.ts + +event.ts src/app/core/services/event.service.ts->src/app/features/events/models/event.ts - - + + src/app/core/services/group.service.ts->src/app/core/interfaces/list-service.interface.ts - - + + src/app/core/services/group.service.ts->src/app/features/groups/components/group-card/group-card.component.ts - - + + src/app/features/groups/models/group.ts - -group.ts + +group.ts src/app/core/services/group.service.ts->src/app/features/groups/models/group.ts - - + + src/app/core/services/people.service.ts->src/app/core/interfaces/list-service.interface.ts - - + + src/app/core/services/people.service.ts->src/app/core/models/person.model.ts - - + + src/app/core/services/people.service.ts->src/app/core/models/location.model.ts - - + + src/app/core/services/people.service.ts->src/app/features/profile/components/profile-card/profile-card.component.ts - - + + src/app/features/events/components/event-card/event-card.component.ts->src/app/core/constants/routes.constants.ts - - + + src/app/features/events/components/event-card/event-card.component.ts->src/app/core/services/translations.service.ts - - + + src/app/features/events/components/event-card/event-card.component.ts->src/app/core/interfaces/card-component.interface.ts - - + + src/app/features/events/components/event-card/event-card.component.ts->src/app/shared/models/card-size.ts - - + + src/app/features/events/components/event-card/event-card.component.ts->src/app/features/events/models/event.ts - - - - - -src/app/shared/models/material-button-type.ts - - -material-button-type.ts - - + + src/app/features/events/components/event-card/event-card.component.ts->src/app/shared/models/material-button-type.ts - - + + src/app/shared/models/tooltip-direction.ts - -tooltip-direction.ts + +tooltip-direction.ts src/app/features/events/components/event-card/event-card.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/features/events/models/event.ts->src/app/core/models/person.model.ts - - + + - + src/app/features/events/models/event.ts->src/app/core/models/location.model.ts - - + + - + src/app/features/events/models/event.ts->src/app/features/groups/models/group.ts - - + + src/app/core/services/focus-tracking.service.spec.ts - -focus-tracking.service.spec.ts + +focus-tracking.service.spec.ts @@ -2980,98 +3004,98 @@ src/app/core/services/focus-tracking.service.ts - -focus-tracking.service.ts + +focus-tracking.service.ts src/app/core/services/focus-tracking.service.spec.ts->src/app/core/services/focus-tracking.service.ts - - + + src/app/core/services/group.service.spec.ts - -group.service.spec.ts + +group.service.spec.ts src/app/core/services/group.service.spec.ts->src/app/core/services/group.service.ts - - + + - + src/app/features/groups/components/group-card/group-card.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/features/groups/components/group-card/group-card.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/groups/components/group-card/group-card.component.ts->src/app/core/interfaces/card-component.interface.ts - - + + - + src/app/features/groups/components/group-card/group-card.component.ts->src/app/shared/models/card-size.ts - - + + - + src/app/features/groups/components/group-card/group-card.component.ts->src/app/features/groups/models/group.ts - - + + src/app/core/services/language-storage.service.spec.ts - -language-storage.service.spec.ts + +language-storage.service.spec.ts src/app/core/services/language-storage.service.spec.ts->src/app/core/services/language-storage.service.ts - - + + src/app/core/services/local-storage-ref.service.spec.ts - -local-storage-ref.service.spec.ts + +local-storage-ref.service.spec.ts src/app/core/services/local-storage-ref.service.spec.ts->src/app/core/services/local-storage-ref.service.ts - - + + src/app/core/services/news.service.spec.ts - -news.service.spec.ts + +news.service.spec.ts @@ -3079,1288 +3103,1300 @@ src/app/core/services/news.service.ts - -news.service.ts + +news.service.ts src/app/core/services/news.service.spec.ts->src/app/core/services/news.service.ts - - + + src/app/core/services/news.service.ts->src/app/core/interfaces/list-service.interface.ts - - + + src/app/core/services/news.service.ts->src/app/core/models/blog.model.ts - - + + src/app/core/services/news.service.ts->src/app/features/news-feed/models/INewsItem.ts - - + + src/app/core/services/news.service.ts->src/app/core/models/poll.model.ts - - + + src/app/core/services/news.service.ts->src/app/core/models/post.model.ts - - + + src/app/core/services/news.service.ts->src/app/core/services/people.service.ts - - + + src/app/core/services/news.service.ts->src/app/features/news-feed/components/news-card/news-card.component.ts - - + + - + src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/core/interfaces/card-component.interface.ts - - + + - + src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/shared/models/card-size.ts - - + + - + src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/core/models/blog.model.ts - - + + - + src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/features/news-feed/models/INewsItem.ts - - + + - + src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/core/models/poll.model.ts - - + + - + src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/core/models/post.model.ts - - + + - + src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/shared/models/material-button-type.ts - - + + src/app/core/services/people.service.spec.ts - -people.service.spec.ts + +people.service.spec.ts src/app/core/services/people.service.spec.ts->src/app/core/services/people.service.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/core/interfaces/card-component.interface.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/shared/models/card-size.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/core/models/person.model.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/shared/models/tooltip-direction.ts - - + + src/app/core/services/session-storage.service.spec.ts - -session-storage.service.spec.ts + +session-storage.service.spec.ts src/app/core/services/session-storage.service.spec.ts->src/app/core/services/session-storage.service.ts - - + + src/app/core/services/title.service.spec.ts - -title.service.spec.ts + +title.service.spec.ts src/app/core/services/title.service.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/core/services/title.service.spec.ts->src/app/core/services/title.service.ts - - + + src/app/features/about/about-routing.module.ts->src/app/features/about/about.component.ts - - + + src/app/features/about/about.component.spec.ts - -about.component.spec.ts + +about.component.spec.ts src/app/features/about/about.component.spec.ts->src/app/features/about/about.component.ts - - + + src/app/features/blog/blog.component.ts - -blog.component.ts + +blog.component.ts src/app/features/blog/blog-routing.module.ts->src/app/features/blog/blog.component.ts - - + + src/app/features/blog/blog.component.spec.ts - -blog.component.spec.ts + +blog.component.spec.ts src/app/features/blog/blog.component.spec.ts->src/app/features/blog/blog.component.ts - - + + src/app/features/bookmarks/bookmarks.component.ts - -bookmarks.component.ts + +bookmarks.component.ts src/app/features/bookmarks/bookmarks-routing.module.ts->src/app/features/bookmarks/bookmarks.component.ts - - + + src/app/features/bookmarks/bookmarks.component.spec.ts - -bookmarks.component.spec.ts + +bookmarks.component.spec.ts src/app/features/bookmarks/bookmarks.component.spec.ts->src/app/features/bookmarks/bookmarks.component.ts - - + + src/app/features/dashboard/dashboard.component.ts - -dashboard.component.ts + +dashboard.component.ts src/app/features/dashboard/dashboard-routing.module.ts->src/app/features/dashboard/dashboard.component.ts - - + + src/app/features/dashboard/dashboard.component.spec.ts - -dashboard.component.spec.ts + +dashboard.component.spec.ts src/app/features/dashboard/dashboard.component.spec.ts->src/app/features/dashboard/dashboard.component.ts - - + + src/app/features/events/components/event-card/event-card.component.spec.ts - -event-card.component.spec.ts + +event-card.component.spec.ts src/app/features/events/components/event-card/event-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/features/events/components/event-card/event-card.component.spec.ts->src/app/features/events/components/event-card/event-card.component.ts - - + + src/app/features/events/components/event-list/event-list.component.spec.ts - -event-list.component.spec.ts + +event-list.component.spec.ts src/app/features/events/components/event-list/event-list.component.spec.ts->src/app/features/events/components/event-list/event-list.component.ts - - + + src/app/features/events/components/event-list/event-list.component.ts->src/app/shared/models/card-size.ts - - + + src/app/features/events/components/event-list/event-list.component.ts->src/app/features/events/models/event.ts - - + + src/app/features/events/components/event/event.component.spec.ts - -event.component.spec.ts + +event.component.spec.ts src/app/features/events/components/event/event.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + src/app/features/events/components/event/event.component.spec.ts->src/app/features/events/components/event/event.component.ts - - + + src/app/features/events/components/event/event.component.ts->src/app/core/constants/routes.constants.ts - - + + src/app/features/events/components/event/event.component.ts->src/app/core/services/translations.service.ts - - + + src/app/features/events/components/event/event.component.ts->src/app/core/services/event.service.ts - - + + src/app/features/events/components/event/event.component.ts->src/app/features/events/models/event.ts - - + + src/app/features/events/components/event/event.component.ts->src/app/shared/models/material-button-type.ts - - + + src/app/features/events/components/event/event.component.ts->src/app/shared/models/tooltip-direction.ts - - + + src/app/features/events/components/event/event.component.ts->src/app/shared/components/banner/banner.component.ts - + src/app/shared/models/input-type.ts - -input-type.ts + +input-type.ts src/app/features/events/components/event/event.component.ts->src/app/shared/models/input-type.ts - - + + src/app/features/events/events-routing.module.ts->src/app/core/services/translations.service.ts - - + + src/app/features/events/events-routing.module.ts->src/app/features/events/events.component.ts - - + + src/app/features/events/events-routing.module.ts->src/app/features/events/components/event/event.component.ts - - + + src/app/features/events/events.component.spec.ts - -events.component.spec.ts + +events.component.spec.ts + + +src/app/features/events/events.component.spec.ts->src/app/core/helpers/typescript-loader.ts + + + src/app/features/events/events.component.spec.ts->src/app/features/events/events.component.ts - - + + + + + +src/app/features/events/events.component.spec.ts->src/app/shared/pipes/form-control/form-control.pipe.ts + + - + src/app/features/events/resolvers/event.resolver.ts - - -event.resolver.ts + + +event.resolver.ts - + src/app/features/events/resolvers/event.resolver.ts->src/app/core/services/event.service.ts - - + + - + src/app/features/events/resolvers/event.resolver.ts->src/app/features/events/models/event.ts - - + + - + src/app/features/friends/friends.component.ts - - -friends.component.ts + + +friends.component.ts - + src/app/features/friends/friends-routing.module.ts->src/app/features/friends/friends.component.ts - - + + - + src/app/features/friends/friends.component.spec.ts - - -friends.component.spec.ts + + +friends.component.spec.ts - + src/app/features/friends/friends.component.spec.ts->src/app/features/friends/friends.component.ts - - + + - + src/app/features/groups/components/group-card/group-card.component.spec.ts - - -group-card.component.spec.ts + + +group-card.component.spec.ts - + src/app/features/groups/components/group-card/group-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/groups/components/group-card/group-card.component.spec.ts->src/app/features/groups/components/group-card/group-card.component.ts - - + + - + src/app/features/groups/components/group-list/group-list.component.spec.ts - - -group-list.component.spec.ts + + +group-list.component.spec.ts - + src/app/features/groups/components/group-list/group-list.component.spec.ts->src/app/features/groups/components/group-list/group-list.component.ts - - + + - + src/app/features/groups/components/group-list/group-list.component.ts->src/app/features/groups/models/group.ts - - + + - + src/app/features/groups/components/group/group.component.spec.ts - - -group.component.spec.ts + + +group.component.spec.ts - + src/app/features/groups/components/group/group.component.spec.ts->src/app/features/groups/components/group/group.component.ts - - + + - + src/app/features/groups/groups-routing.module.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/groups/groups-routing.module.ts->src/app/features/groups/groups.component.ts - - + + - + src/app/features/groups/groups-routing.module.ts->src/app/features/groups/components/group/group.component.ts - - + + - + src/app/features/groups/groups.component.spec.ts - - -groups.component.spec.ts + + +groups.component.spec.ts - + src/app/features/groups/groups.component.spec.ts->src/app/features/groups/groups.component.ts - - + + - + src/app/features/home/home-routing.module.ts->src/app/features/home/home.component.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/models/person.model.ts - - + + - + src/app/features/home/home.component.ts->src/app/features/news-feed/models/INewsItem.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/services/event.service.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/services/group.service.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/services/people.service.ts - - + + - + src/app/features/home/home.component.ts->src/app/features/events/models/event.ts - - + + - + src/app/features/home/home.component.ts->src/app/features/groups/models/group.ts - - + + - + src/app/features/home/home.component.ts->src/app/core/services/news.service.ts - - + + - + src/app/features/home/home.component.ts->src/app/shared/models/input-type.ts - - + + - + src/app/features/home/home.component.spec.ts - - -home.component.spec.ts + + +home.component.spec.ts - + src/app/features/home/home.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/home/home.component.spec.ts->src/app/features/home/home.component.ts - - + + - + src/app/features/invite/invite.component.ts - - -invite.component.ts + + +invite.component.ts - + src/app/features/invite/invite-routing.module.ts->src/app/features/invite/invite.component.ts - - + + - + src/app/features/invite/invite.component.spec.ts - - -invite.component.spec.ts + + +invite.component.spec.ts - + src/app/features/invite/invite.component.spec.ts->src/app/features/invite/invite.component.ts - - + + - + src/app/features/login/login-routing.module.ts->src/app/features/login/login.component.ts - - + + - + src/app/features/login/login.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/login/login.component.spec.ts - - -login.component.spec.ts + + +login.component.spec.ts - + src/app/features/login/login.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/login/login.component.spec.ts->src/app/features/login/login.component.ts - - + + - + src/app/features/members/members.component.ts - - -members.component.ts + + +members.component.ts - + src/app/features/members/members-routing.module.ts->src/app/features/members/members.component.ts - - + + - + src/app/features/members/members.component.spec.ts - - -members.component.spec.ts + + +members.component.spec.ts - + src/app/features/members/members.component.spec.ts->src/app/features/members/members.component.ts - - + + - + src/app/features/messages/messages.component.ts - - -messages.component.ts + + +messages.component.ts - + src/app/features/messages/messages-routing.module.ts->src/app/features/messages/messages.component.ts - - + + - + src/app/features/messages/messages.component.spec.ts - - -messages.component.spec.ts + + +messages.component.spec.ts - + src/app/features/messages/messages.component.spec.ts->src/app/features/messages/messages.component.ts - - + + - + src/app/features/missions/missions.component.ts - - -missions.component.ts + + +missions.component.ts - + src/app/features/missions/missions-routing.module.ts->src/app/features/missions/missions.component.ts - - + + - + src/app/features/missions/missions.component.spec.ts - - -missions.component.spec.ts + + +missions.component.spec.ts - + src/app/features/missions/missions.component.spec.ts->src/app/features/missions/missions.component.ts - - + + - + src/app/features/news-feed/components/news-card/news-card.component.spec.ts - - -news-card.component.spec.ts + + +news-card.component.spec.ts - + src/app/features/news-feed/components/news-card/news-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/news-feed/components/news-card/news-card.component.spec.ts->src/app/features/news-feed/components/news-card/news-card.component.ts - - + + - + src/app/features/news-feed/components/news-list/news-list.component.spec.ts - - -news-list.component.spec.ts + + +news-list.component.spec.ts - + src/app/features/news-feed/components/news-list/news-list.component.spec.ts->src/app/features/news-feed/components/news-list/news-list.component.ts - - + + - + src/app/features/news-feed/components/news-list/news-list.component.ts->src/app/features/news-feed/models/INewsItem.ts - - + + - + src/app/features/news-feed/news-feed.component.ts - - -news-feed.component.ts + + +news-feed.component.ts - + src/app/features/news-feed/news-feed-routing.module.ts->src/app/features/news-feed/news-feed.component.ts - - + + - + src/app/features/news-feed/news-feed.component.spec.ts - - -news-feed.component.spec.ts + + +news-feed.component.spec.ts - + src/app/features/news-feed/news-feed.component.spec.ts->src/app/features/news-feed/news-feed.component.ts - - + + - + src/app/features/privacy/privacy-routing.module.ts->src/app/features/privacy/privacy.component.ts - - + + - + src/app/features/privacy/privacy.component.spec.ts - - -privacy.component.spec.ts + + +privacy.component.spec.ts - + src/app/features/privacy/privacy.component.spec.ts->src/app/features/privacy/privacy.component.ts - - + + - + src/app/features/profile/components/post/post.component.spec.ts - - -post.component.spec.ts + + +post.component.spec.ts - + src/app/features/profile/components/post/post.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/profile/components/post/post.component.spec.ts->src/app/features/profile/components/post/post.component.ts - - + + - + src/app/features/profile/components/post/post.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/features/profile/components/post/post.component.ts->src/app/core/services/session-storage.service.ts - - + + - + src/app/features/profile/components/post/post.component.ts->src/app/core/models/person.model.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.spec.ts - - -profile-card.component.spec.ts + + +profile-card.component.spec.ts - + src/app/features/profile/components/profile-card/profile-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/features/profile/components/profile-card/profile-card.component.spec.ts->src/app/features/profile/components/profile-card/profile-card.component.ts - - + + - + src/app/features/profile/components/profile-list/profile-list.component.spec.ts - - -profile-list.component.spec.ts + + +profile-list.component.spec.ts - + src/app/features/profile/components/profile-list/profile-list.component.spec.ts->src/app/features/profile/components/profile-list/profile-list.component.ts - - + + - + src/app/features/profile/components/profile-list/profile-list.component.ts->src/app/core/models/person.model.ts - - + + - + src/app/features/profile/profile.component.ts - - -profile.component.ts + + +profile.component.ts - + src/app/features/profile/profile-routing.module.ts->src/app/features/profile/profile.component.ts - - + + - + src/app/features/profile/profile.component.spec.ts - - -profile.component.spec.ts + + +profile.component.spec.ts - + src/app/features/profile/profile.component.spec.ts->src/app/features/profile/profile.component.ts - - + + - + src/app/features/register/register-routing.module.ts->src/app/features/register/register.component.ts - - + + - + src/app/features/register/register.component.spec.ts - - -register.component.spec.ts + + +register.component.spec.ts - + src/app/features/register/register.component.spec.ts->src/app/features/register/register.component.ts - - + + - + src/app/features/search/search.component.ts - - -search.component.ts + + +search.component.ts - + src/app/features/search/search-routing.module.ts->src/app/features/search/search.component.ts - - + + - + src/app/features/search/search.component.spec.ts - - -search.component.spec.ts + + +search.component.spec.ts - + src/app/features/search/search.component.spec.ts->src/app/features/search/search.component.ts - - + + - + src/app/features/settings/settings.component.ts - - -settings.component.ts + + +settings.component.ts - + src/app/features/settings/settings-routing.module.ts->src/app/features/settings/settings.component.ts - - + + - + src/app/features/settings/settings.component.spec.ts - - -settings.component.spec.ts + + +settings.component.spec.ts - + src/app/features/settings/settings.component.spec.ts->src/app/features/settings/settings.component.ts - - + + - + src/app/features/splash/splash-routing.module.ts->src/app/features/splash/splash.component.ts - - + + - + src/app/features/splash/splash.component.spec.ts - - -splash.component.spec.ts + + +splash.component.spec.ts - + src/app/features/splash/splash.component.spec.ts->src/app/features/splash/splash.component.ts - - + + - + src/app/features/stats/stats-routing.module.ts->src/app/features/stats/stats.component.ts - - + + - + src/app/features/stats/stats.component.spec.ts - - -stats.component.spec.ts + + +stats.component.spec.ts - + src/app/features/stats/stats.component.spec.ts->src/app/features/stats/stats.component.ts - - + + - + src/app/features/terms/terms-routing.module.ts->src/app/features/terms/terms.component.ts - - + + - + src/app/features/terms/terms.component.spec.ts - - -terms.component.spec.ts + + +terms.component.spec.ts - + src/app/features/terms/terms.component.spec.ts->src/app/features/terms/terms.component.ts - - + + - + src/app/features/the-wire/the-wire.component.ts - - -the-wire.component.ts + + +the-wire.component.ts - + src/app/features/the-wire/the-wire-routing.module.ts->src/app/features/the-wire/the-wire.component.ts - - + + - + src/app/features/the-wire/the-wire.component.spec.ts - - -the-wire.component.spec.ts + + +the-wire.component.spec.ts - + src/app/features/the-wire/the-wire.component.spec.ts->src/app/features/the-wire/the-wire.component.ts - - + + - + src/app/shared/components/banner/banner.component.spec.ts - + banner.component.spec.ts - + src/app/shared/components/banner/banner.component.spec.ts->src/app/shared/components/banner/banner.component.ts - + src/app/shared/components/blog-form/blog-form.component.spec.ts - + blog-form.component.spec.ts - + src/app/shared/components/blog-form/blog-form.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/blog-form/blog-form.component.spec.ts->src/app/shared/pipes/form-control/form-control.pipe.ts - + src/app/shared/components/blog-form/blog-form.component.spec.ts->src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.ts - + src/app/shared/components/blog-form/blog-form.component.spec.ts->src/app/shared/components/blog-form/blog-form.component.ts - + src/app/shared/components/blog-form/blog-form.component.ts->src/app/core/services/translations.service.ts - - + + @@ -4372,67 +4408,67 @@ - + src/app/shared/components/button/button.component.spec.ts->src/app/shared/components/button/button.component.ts - + src/app/shared/components/button/button.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/shared/components/button/button.component.ts->src/app/shared/models/tooltip-direction.ts - - + + src/app/shared/models/button-type.ts - -button-type.ts + +button-type.ts - + src/app/shared/components/button/button.component.ts->src/app/shared/models/button-type.ts - - + + src/app/shared/models/material-color.ts - -material-color.ts + +material-color.ts - + src/app/shared/components/button/button.component.ts->src/app/shared/models/material-color.ts - - + + src/app/shared/models/theme.ts - -theme.ts + +theme.ts - + src/app/shared/components/button/button.component.ts->src/app/shared/models/theme.ts - - + + @@ -4444,28 +4480,28 @@ - + src/app/shared/components/calendar-button/calendar-button.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/calendar-button/calendar-button.component.spec.ts->src/app/shared/components/calendar-button/calendar-button.component.ts - + src/app/shared/components/calendar-button/calendar-button.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/calendar-button/calendar-button.component.ts->src/app/shared/models/tooltip-direction.ts - - + + @@ -4477,40 +4513,40 @@ - + src/app/shared/components/editor/editor.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/editor/editor.component.spec.ts->src/app/shared/components/editor/editor.component.ts - + src/app/shared/components/editor/editor.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/editor/editor.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/shared/components/editor/editor.component.ts->src/app/shared/factories/editor-config.factory.ts - - + + - + src/app/shared/factories/editor-config.factory.ts->src/app/core/services/translations.service.ts - - + + @@ -4522,28 +4558,28 @@ - + src/app/shared/components/event-form/event-form.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/event-form/event-form.component.spec.ts->src/app/shared/pipes/form-control/form-control.pipe.ts - + src/app/shared/components/event-form/event-form.component.spec.ts->src/app/shared/components/event-form/event-form.component.ts - + src/app/shared/components/event-form/event-form.component.ts->src/app/core/services/translations.service.ts - - + + @@ -4555,46 +4591,46 @@ - + src/app/shared/components/file-select/file-select.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/file-select/file-select.component.spec.ts->src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.ts - + src/app/shared/components/file-select/file-select.component.spec.ts->src/app/shared/components/file-select/file-select.component.ts - + src/app/shared/components/file-select/file-select.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/file-select/file-select.component.ts->src/app/core/services/focus-tracking.service.ts - - + + - + src/app/shared/components/file-select/file-select.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/shared/components/file-select/file-select.component.ts->src/app/shared/models/theme.ts - - + + @@ -4606,28 +4642,28 @@ - + src/app/shared/components/footer/footer.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/footer/footer.component.spec.ts->src/app/shared/components/footer/footer.component.ts - + src/app/shared/components/footer/footer.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/shared/components/footer/footer.component.ts->src/app/core/services/translations.service.ts - - + + @@ -4639,7 +4675,7 @@ - + src/app/shared/components/forbidden/forbidden.component.spec.ts->src/app/shared/components/forbidden/forbidden.component.ts @@ -4654,46 +4690,46 @@ - + src/app/shared/components/header/header.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/header/header.component.spec.ts->src/app/shared/components/header/header.component.ts - + src/app/shared/components/header/header.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/shared/components/header/header.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/header/header.component.ts->src/app/core/models/person.model.ts - - + + - + src/app/shared/components/header/header.component.ts->src/app/core/services/people.service.ts - - + + - + src/app/shared/components/header/header.component.ts->src/app/shared/models/material-button-type.ts - - + + @@ -4705,40 +4741,40 @@ - + src/app/shared/components/input/input.component.spec.ts->src/app/shared/components/input/input.component.ts - + src/app/shared/components/input/input.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/input/input.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/shared/components/input/input.component.ts->src/app/shared/models/tooltip-direction.ts - - + + - + src/app/shared/components/input/input.component.ts->src/app/shared/models/input-type.ts - - + + - + src/app/shared/components/input/input.component.ts->src/app/shared/models/theme.ts - - + + @@ -4750,49 +4786,49 @@ - + src/app/shared/components/language-selector/language-selector.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.spec.ts->src/app/shared/components/language-selector/language-selector.component.ts - + src/app/shared/components/language-selector/language-selector.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.ts->src/app/shared/models/material-button-type.ts - - + + - + src/app/shared/components/language-selector/language-selector.component.ts->src/app/shared/models/theme.ts - - + + src/app/shared/models/language.ts - -language.ts + +language.ts - + src/app/shared/components/language-selector/language-selector.component.ts->src/app/shared/models/language.ts - - + + @@ -4804,37 +4840,37 @@ - + src/app/shared/components/list/list.component.spec.ts->src/app/shared/components/list/list.component.ts - + src/app/shared/components/list/list.component.ts->src/app/shared/models/card-size.ts - - + + - + src/app/shared/components/list/list.component.ts->src/app/core/interfaces/list-service.interface.ts - - + + src/app/shared/models/orientation.ts - -orientation.ts + +orientation.ts - + src/app/shared/components/list/list.component.ts->src/app/shared/models/orientation.ts - - + + @@ -4846,7 +4882,7 @@ - + src/app/shared/components/not-found/not-found.component.spec.ts->src/app/shared/components/not-found/not-found.component.ts @@ -4861,13 +4897,13 @@ - + src/app/shared/components/page-title/page-title.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/page-title/page-title.component.spec.ts->src/app/shared/components/page-title/page-title.component.ts @@ -4882,34 +4918,34 @@ - + src/app/shared/components/poll-form/poll-form.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/poll-form/poll-form.component.spec.ts->src/app/shared/pipes/form-control/form-control.pipe.ts - + src/app/shared/components/poll-form/poll-form.component.spec.ts->src/app/shared/components/poll-form/poll-form.component.ts - + src/app/shared/components/poll-form/poll-form.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/poll-form/poll-form.component.ts->src/app/shared/models/tooltip-direction.ts - - + + @@ -4921,28 +4957,28 @@ - + src/app/shared/components/post-form/post-form.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/post-form/post-form.component.spec.ts->src/app/shared/pipes/form-control/form-control.pipe.ts - + src/app/shared/components/post-form/post-form.component.spec.ts->src/app/shared/components/post-form/post-form.component.ts - + src/app/shared/components/post-form/post-form.component.ts->src/app/core/services/translations.service.ts - - + + @@ -4954,34 +4990,34 @@ - + src/app/shared/components/profile-pic/profile-pic.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.spec.ts->src/app/shared/components/profile-pic/profile-pic.component.ts - + src/app/shared/components/profile-pic/profile-pic.component.ts->src/app/core/constants/routes.constants.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.ts->src/app/core/services/translations.service.ts - - + + - + src/app/shared/components/profile-pic/profile-pic.component.ts->src/app/core/models/person.model.ts - - + + @@ -4993,7 +5029,7 @@ - + src/app/shared/components/unauthorized/unauthorized.component.spec.ts->src/app/shared/components/unauthorized/unauthorized.component.ts @@ -5008,7 +5044,7 @@ - + src/app/shared/pipes/form-control/form-control.pipe.spec.ts->src/app/shared/pipes/form-control/form-control.pipe.ts @@ -5023,7 +5059,7 @@ - + src/app/shared/pipes/form-group/form-group.pipe.spec.ts->src/app/shared/pipes/form-group/form-group.pipe.ts @@ -5038,7 +5074,7 @@ - + src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.spec.ts->src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.ts @@ -5047,16 +5083,16 @@ src/assets/i18n/translations.fr.ts - -translations.fr.ts + +translations.fr.ts - + src/assets/i18n/translations.fr.ts->src/assets/i18n/translations.en.ts - - + + @@ -5080,29 +5116,29 @@ src/main.ts - -main.ts + +main.ts - + src/main.ts->src/app/app.module.ts - - + + - + src/main.ts->src/environments/environment.ts - + src/polyfills.ts - -polyfills.ts + +polyfills.ts @@ -5110,8 +5146,8 @@ src/test.ts - -test.ts + +test.ts From 57bc287d2331c2a6a219af54d83bb70991b4960d Mon Sep 17 00:00:00 2001 From: doug0102 Date: Wed, 10 Jan 2024 15:46:46 -0500 Subject: [PATCH 108/165] update node version for workflows --- .github/workflows/dependency-graph.yml | 2 +- .github/workflows/deploy-dev.yml | 2 +- .github/workflows/deploy-pr.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/dependency-graph.yml b/.github/workflows/dependency-graph.yml index 2835a3a8..8b26e422 100644 --- a/.github/workflows/dependency-graph.yml +++ b/.github/workflows/dependency-graph.yml @@ -9,7 +9,7 @@ on: branches: ["main"] env: - NODE_VERSION: '16.14.2' + NODE_VERSION: '18.10.0' jobs: if_merged: diff --git a/.github/workflows/deploy-dev.yml b/.github/workflows/deploy-dev.yml index d6cb730d..3b018cc8 100644 --- a/.github/workflows/deploy-dev.yml +++ b/.github/workflows/deploy-dev.yml @@ -12,7 +12,7 @@ on: env: AZURE_WEBAPP_NAME: gccollab-dev AZURE_WEBAPP_PACKAGE_PATH: './dist/gccollab-frontend' - NODE_VERSION: '16.14.2' + NODE_VERSION: '18.10.0' jobs: build-test-and-deploy: diff --git a/.github/workflows/deploy-pr.yml b/.github/workflows/deploy-pr.yml index f8dfe9e0..d7fb5a6d 100644 --- a/.github/workflows/deploy-pr.yml +++ b/.github/workflows/deploy-pr.yml @@ -11,7 +11,7 @@ on: env: AZURE_WEBAPP_NAME: gccollab-dev-pr-${{ github.event.number }} AZURE_WEBAPP_PACKAGE_PATH: './dist/gccollab-frontend' - NODE_VERSION: '16.14.2' + NODE_VERSION: '18.10.0' ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }} LOCATION: canadaeast SECRET_NAME: PR_${{ github.event.number }} From 5ca4bbbe2dded00682319bb2e5c4ea17769dd90d Mon Sep 17 00:00:00 2001 From: doug0102 Date: Wed, 10 Jan 2024 17:02:38 -0500 Subject: [PATCH 109/165] workflows node v18.13.0 --- .github/workflows/dependency-graph.yml | 2 +- .github/workflows/deploy-dev.yml | 2 +- .github/workflows/deploy-pr.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/dependency-graph.yml b/.github/workflows/dependency-graph.yml index 8b26e422..f862cb6f 100644 --- a/.github/workflows/dependency-graph.yml +++ b/.github/workflows/dependency-graph.yml @@ -9,7 +9,7 @@ on: branches: ["main"] env: - NODE_VERSION: '18.10.0' + NODE_VERSION: '18.13.0' jobs: if_merged: diff --git a/.github/workflows/deploy-dev.yml b/.github/workflows/deploy-dev.yml index 3b018cc8..7c31aec4 100644 --- a/.github/workflows/deploy-dev.yml +++ b/.github/workflows/deploy-dev.yml @@ -12,7 +12,7 @@ on: env: AZURE_WEBAPP_NAME: gccollab-dev AZURE_WEBAPP_PACKAGE_PATH: './dist/gccollab-frontend' - NODE_VERSION: '18.10.0' + NODE_VERSION: '18.13.0' jobs: build-test-and-deploy: diff --git a/.github/workflows/deploy-pr.yml b/.github/workflows/deploy-pr.yml index d7fb5a6d..0ac75f76 100644 --- a/.github/workflows/deploy-pr.yml +++ b/.github/workflows/deploy-pr.yml @@ -11,7 +11,7 @@ on: env: AZURE_WEBAPP_NAME: gccollab-dev-pr-${{ github.event.number }} AZURE_WEBAPP_PACKAGE_PATH: './dist/gccollab-frontend' - NODE_VERSION: '18.10.0' + NODE_VERSION: '18.13.0' ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }} LOCATION: canadaeast SECRET_NAME: PR_${{ github.event.number }} From a1ea57f1788b9fe0b51bcb11c894d67c6a8e43db Mon Sep 17 00:00:00 2001 From: doug0102 Date: Fri, 12 Jan 2024 11:07:33 -0500 Subject: [PATCH 110/165] update node versions for workflow, added pre-commit hook --- .github/hooks/pre-commit | 1 + package.json | 3 ++- src/scripts/nodeSyncWorkflows.js | 35 ++++++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 .github/hooks/pre-commit create mode 100644 src/scripts/nodeSyncWorkflows.js diff --git a/.github/hooks/pre-commit b/.github/hooks/pre-commit new file mode 100644 index 00000000..e34ef38c --- /dev/null +++ b/.github/hooks/pre-commit @@ -0,0 +1 @@ +npm run node-sync \ No newline at end of file diff --git a/package.json b/package.json index 1b9c4b9a..5725ce8b 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,8 @@ "test": "ng test", "install-graphviz-linux": "sudo apt install graphviz", "install-graphviz-win": "winget install -e --id Graphviz.Graphviz --accept-package-agreements --accept-source-agreements --disable-interactivity && set PATH=%PATH%;C:\\Program Files\\Graphviz\\bin;", - "depcruise": "depcruise src --include-only \"^src\" --config --output-type dot | dot -T svg > dependency-graph.svg" + "depcruise": "depcruise src --include-only \"^src\" --config --output-type dot | dot -T svg > dependency-graph.svg", + "node-sync": "node ./src/scripts/nodeSyncWorkflows.js" }, "private": true, "dependencies": { diff --git a/src/scripts/nodeSyncWorkflows.js b/src/scripts/nodeSyncWorkflows.js new file mode 100644 index 00000000..4c6c389c --- /dev/null +++ b/src/scripts/nodeSyncWorkflows.js @@ -0,0 +1,35 @@ +const { exec } = require('child_process'); +const fs = require('fs'); + +// These need to be manually updated if we are adding/removing workflow files. +const workflowFilePaths = [ + '.github/workflows/dependency-graph.yml', + '.github/workflows/deploy-dev.yml', + '.github/workflows/deploy-pr.yml', +]; + +exec('npm run ng v', (error, stdout, stderr) => { + + if (error) { + console.error(`Error: ${error.message}`); + return; + } + if (stderr) { + console.error(`stderr: ${stderr}`); + return; + } + + const nodeVersionMatch = stdout.match(/Node:\s+(\d+\.\d+\.\d+)/); + const nodeVersion = '10.0.0'; //nodeVersionMatch ? nodeVersionMatch[1] : null; + + if (nodeVersion) { + for (let i = 0; i < workflowFilePaths.length; i++) { + + let workflowFileContent = fs.readFileSync(workflowFilePaths[i], 'utf8'); + workflowFileContent = workflowFileContent.replace(/NODE_VERSION: ['"]\d+\.\d+\.\d+['"]/, `NODE_VERSION: '${nodeVersion}'`); + fs.writeFileSync(workflowFilePaths[i], workflowFileContent); + + console.log(`${workflowFilePaths[i]} updated to use Node.js version ${nodeVersion}`); + } + } +}); From 0fa73f65b2733af2e4b4be196f233a0f0494ebd9 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Fri, 12 Jan 2024 11:07:57 -0500 Subject: [PATCH 111/165] test --- .github/hooks/pre-commit | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/hooks/pre-commit b/.github/hooks/pre-commit index e34ef38c..e56fd608 100644 --- a/.github/hooks/pre-commit +++ b/.github/hooks/pre-commit @@ -1 +1 @@ -npm run node-sync \ No newline at end of file +npm run node-sync \ No newline at end of file From a189e5d8a1c10ffbcae71ba50279a59ba7ce6f23 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Fri, 12 Jan 2024 11:09:13 -0500 Subject: [PATCH 112/165] test --- .github/hooks/pre-commit | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/hooks/pre-commit b/.github/hooks/pre-commit index e56fd608..e34ef38c 100644 --- a/.github/hooks/pre-commit +++ b/.github/hooks/pre-commit @@ -1 +1 @@ -npm run node-sync \ No newline at end of file +npm run node-sync \ No newline at end of file From 8649434309a3fd72a5ded0a8a245d3f2769362eb Mon Sep 17 00:00:00 2001 From: doug0102 Date: Wed, 17 Jan 2024 09:26:48 -0500 Subject: [PATCH 113/165] pre-commit hook update --- .github/hooks/pre-commit | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/.github/hooks/pre-commit b/.github/hooks/pre-commit index e34ef38c..1c5cba0f 100644 --- a/.github/hooks/pre-commit +++ b/.github/hooks/pre-commit @@ -1 +1,10 @@ -npm run node-sync \ No newline at end of file +@echo off + +rem Sync git workflow Node.js versions with the app +npm run node-sync + +rem Run linter +npm run ng lint + +rem Run tests +npm run ng test \ No newline at end of file From b9803f2a00486ad7d8b975f6fdcc9cd093cca6ae Mon Sep 17 00:00:00 2001 From: doug0102 Date: Wed, 17 Jan 2024 09:35:16 -0500 Subject: [PATCH 114/165] minor --- .github/hooks/pre-commit | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/hooks/pre-commit b/.github/hooks/pre-commit index 1c5cba0f..385dd241 100644 --- a/.github/hooks/pre-commit +++ b/.github/hooks/pre-commit @@ -3,8 +3,8 @@ rem Sync git workflow Node.js versions with the app npm run node-sync -rem Run linter -npm run ng lint +rem Run linter +#npm run ng lint rem Run tests npm run ng test \ No newline at end of file From 21462c19e4928bb3743e7f076ea8159821c1e9e0 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Wed, 17 Jan 2024 09:50:52 -0500 Subject: [PATCH 115/165] pre-commit hook with node version sync --- .github/hooks/pre-commit | 10 ---------- .github/workflows/dependency-graph.yml | 2 +- .github/workflows/deploy-dev.yml | 2 +- .github/workflows/deploy-pr.yml | 2 +- src/scripts/nodeSyncWorkflows.js | 2 +- 5 files changed, 4 insertions(+), 14 deletions(-) delete mode 100644 .github/hooks/pre-commit diff --git a/.github/hooks/pre-commit b/.github/hooks/pre-commit deleted file mode 100644 index 385dd241..00000000 --- a/.github/hooks/pre-commit +++ /dev/null @@ -1,10 +0,0 @@ -@echo off - -rem Sync git workflow Node.js versions with the app -npm run node-sync - -rem Run linter -#npm run ng lint - -rem Run tests -npm run ng test \ No newline at end of file diff --git a/.github/workflows/dependency-graph.yml b/.github/workflows/dependency-graph.yml index f862cb6f..b054c6c0 100644 --- a/.github/workflows/dependency-graph.yml +++ b/.github/workflows/dependency-graph.yml @@ -9,7 +9,7 @@ on: branches: ["main"] env: - NODE_VERSION: '18.13.0' + NODE_VERSION: '10.0.0' jobs: if_merged: diff --git a/.github/workflows/deploy-dev.yml b/.github/workflows/deploy-dev.yml index 7c31aec4..bb8fd524 100644 --- a/.github/workflows/deploy-dev.yml +++ b/.github/workflows/deploy-dev.yml @@ -12,7 +12,7 @@ on: env: AZURE_WEBAPP_NAME: gccollab-dev AZURE_WEBAPP_PACKAGE_PATH: './dist/gccollab-frontend' - NODE_VERSION: '18.13.0' + NODE_VERSION: '10.0.0' jobs: build-test-and-deploy: diff --git a/.github/workflows/deploy-pr.yml b/.github/workflows/deploy-pr.yml index 0ac75f76..daeb147b 100644 --- a/.github/workflows/deploy-pr.yml +++ b/.github/workflows/deploy-pr.yml @@ -11,7 +11,7 @@ on: env: AZURE_WEBAPP_NAME: gccollab-dev-pr-${{ github.event.number }} AZURE_WEBAPP_PACKAGE_PATH: './dist/gccollab-frontend' - NODE_VERSION: '18.13.0' + NODE_VERSION: '10.0.0' ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }} LOCATION: canadaeast SECRET_NAME: PR_${{ github.event.number }} diff --git a/src/scripts/nodeSyncWorkflows.js b/src/scripts/nodeSyncWorkflows.js index 4c6c389c..ce9b7e6c 100644 --- a/src/scripts/nodeSyncWorkflows.js +++ b/src/scripts/nodeSyncWorkflows.js @@ -20,7 +20,7 @@ exec('npm run ng v', (error, stdout, stderr) => { } const nodeVersionMatch = stdout.match(/Node:\s+(\d+\.\d+\.\d+)/); - const nodeVersion = '10.0.0'; //nodeVersionMatch ? nodeVersionMatch[1] : null; + const nodeVersion = nodeVersionMatch ? nodeVersionMatch[1] : null; if (nodeVersion) { for (let i = 0; i < workflowFilePaths.length; i++) { From f1cde66075a8bfc60eeccf736b6cf616f7b22d00 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Wed, 17 Jan 2024 10:00:54 -0500 Subject: [PATCH 116/165] added version controlled hooks --- .github/workflows/dependency-graph.yml | 2 +- .github/workflows/deploy-dev.yml | 2 +- .github/workflows/deploy-pr.yml | 2 +- hooks/pre-commit | 2 ++ 4 files changed, 5 insertions(+), 3 deletions(-) create mode 100644 hooks/pre-commit diff --git a/.github/workflows/dependency-graph.yml b/.github/workflows/dependency-graph.yml index b054c6c0..f862cb6f 100644 --- a/.github/workflows/dependency-graph.yml +++ b/.github/workflows/dependency-graph.yml @@ -9,7 +9,7 @@ on: branches: ["main"] env: - NODE_VERSION: '10.0.0' + NODE_VERSION: '18.13.0' jobs: if_merged: diff --git a/.github/workflows/deploy-dev.yml b/.github/workflows/deploy-dev.yml index bb8fd524..7c31aec4 100644 --- a/.github/workflows/deploy-dev.yml +++ b/.github/workflows/deploy-dev.yml @@ -12,7 +12,7 @@ on: env: AZURE_WEBAPP_NAME: gccollab-dev AZURE_WEBAPP_PACKAGE_PATH: './dist/gccollab-frontend' - NODE_VERSION: '10.0.0' + NODE_VERSION: '18.13.0' jobs: build-test-and-deploy: diff --git a/.github/workflows/deploy-pr.yml b/.github/workflows/deploy-pr.yml index daeb147b..0ac75f76 100644 --- a/.github/workflows/deploy-pr.yml +++ b/.github/workflows/deploy-pr.yml @@ -11,7 +11,7 @@ on: env: AZURE_WEBAPP_NAME: gccollab-dev-pr-${{ github.event.number }} AZURE_WEBAPP_PACKAGE_PATH: './dist/gccollab-frontend' - NODE_VERSION: '10.0.0' + NODE_VERSION: '18.13.0' ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }} LOCATION: canadaeast SECRET_NAME: PR_${{ github.event.number }} diff --git a/hooks/pre-commit b/hooks/pre-commit new file mode 100644 index 00000000..be4178d4 --- /dev/null +++ b/hooks/pre-commit @@ -0,0 +1,2 @@ +#!/bin/sh +npm run node-sync \ No newline at end of file From 5f379a963272e004c638e20aa926c837ce569c00 Mon Sep 17 00:00:00 2001 From: Shea Date: Wed, 17 Jan 2024 15:04:24 +0000 Subject: [PATCH 117/165] Dependency Graph ignore-deploy --- dependency-graph.svg | 5151 +----------------------------------------- 1 file changed, 14 insertions(+), 5137 deletions(-) diff --git a/dependency-graph.svg b/dependency-graph.svg index 11f0f525..9a6a5565 100644 --- a/dependency-graph.svg +++ b/dependency-graph.svg @@ -4,5150 +4,27 @@ - - + + dependency-cruiser output - + cluster_src - -src + +src -cluster_src/app - -app +cluster_src/scripts + +scripts - -cluster_src/app/core - -core - - -cluster_src/app/core/auth - -auth - - -cluster_src/app/core/constants - -constants - - -cluster_src/app/core/guards - -guards - - -cluster_src/app/core/helpers - -helpers - - -cluster_src/app/core/interceptors - -interceptors - - -cluster_src/app/core/interfaces - -interfaces - - -cluster_src/app/core/models - -models - - -cluster_src/app/core/services - -services - - -cluster_src/app/features - -features - - -cluster_src/app/features/about - -about - - -cluster_src/app/features/blog - -blog - - -cluster_src/app/features/bookmarks - -bookmarks - - -cluster_src/app/features/dashboard - -dashboard - - -cluster_src/app/features/events - -events - - -cluster_src/app/features/events/components - -components - - -cluster_src/app/features/events/components/event-card - -event-card - - -cluster_src/app/features/events/components/event-list - -event-list - - -cluster_src/app/features/events/components/event - -event - - -cluster_src/app/features/events/models - -models - - -cluster_src/app/features/events/resolvers - -resolvers - - -cluster_src/app/features/friends - -friends - - -cluster_src/app/features/groups - -groups - - -cluster_src/app/features/groups/components - -components - - -cluster_src/app/features/groups/components/group-card - -group-card - - -cluster_src/app/features/groups/components/group-list - -group-list - - -cluster_src/app/features/groups/components/group - -group - - -cluster_src/app/features/groups/models - -models - - -cluster_src/app/features/home - -home - - -cluster_src/app/features/invite - -invite - - -cluster_src/app/features/login - -login - - -cluster_src/app/features/members - -members - - -cluster_src/app/features/messages - -messages - - -cluster_src/app/features/missions - -missions - - -cluster_src/app/features/news-feed - -news-feed - - -cluster_src/app/features/news-feed/components - -components - - -cluster_src/app/features/news-feed/components/news-card - -news-card - - -cluster_src/app/features/news-feed/components/news-list - -news-list - - -cluster_src/app/features/news-feed/models - -models - - -cluster_src/app/features/privacy - -privacy - - -cluster_src/app/features/profile - -profile - - -cluster_src/app/features/profile/components - -components - - -cluster_src/app/features/profile/components/post - -post - - -cluster_src/app/features/profile/components/profile-card - -profile-card - - -cluster_src/app/features/profile/components/profile-list - -profile-list - - -cluster_src/app/features/register - -register - - -cluster_src/app/features/search - -search - - -cluster_src/app/features/settings - -settings - - -cluster_src/app/features/splash - -splash - - -cluster_src/app/features/stats - -stats - - -cluster_src/app/features/terms - -terms - - -cluster_src/app/features/the-wire - -the-wire - - -cluster_src/app/shared - -shared - - -cluster_src/app/shared/components - -components - - -cluster_src/app/shared/components/banner - -banner - - -cluster_src/app/shared/components/blog-form - -blog-form - - -cluster_src/app/shared/components/button - -button - - -cluster_src/app/shared/components/calendar-button - -calendar-button - - -cluster_src/app/shared/components/editor - -editor - - -cluster_src/app/shared/components/editor/menu - -menu - - -cluster_src/app/shared/components/editor/menu/editor-menu - -editor-menu - - -cluster_src/app/shared/components/event-form - -event-form - - -cluster_src/app/shared/components/file-select - -file-select - - -cluster_src/app/shared/components/footer - -footer - - -cluster_src/app/shared/components/forbidden - -forbidden - - -cluster_src/app/shared/components/header - -header - - -cluster_src/app/shared/components/input - -input - - -cluster_src/app/shared/components/language-selector - -language-selector - - -cluster_src/app/shared/components/list - -list - - -cluster_src/app/shared/components/not-found - -not-found - - -cluster_src/app/shared/components/page-title - -page-title - - -cluster_src/app/shared/components/poll-form - -poll-form - - -cluster_src/app/shared/components/post-form - -post-form - - -cluster_src/app/shared/components/profile-pic - -profile-pic - - -cluster_src/app/shared/components/unauthorized - -unauthorized - - -cluster_src/app/shared/factories - -factories - - -cluster_src/app/shared/models - -models - - -cluster_src/app/shared/pipes - -pipes - - -cluster_src/app/shared/pipes/form-control - -form-control - - -cluster_src/app/shared/pipes/form-group - -form-group - - -cluster_src/app/shared/pipes/truncate-file-name - -truncate-file-name - - -cluster_src/assets - -assets - - -cluster_src/assets/i18n - -i18n - - -cluster_src/environments - -environments - - + -src/app/app-routing.module.ts - - -app-routing.module.ts - - - - - -src/app/core/constants/routes.constants.ts - - -routes.constants.ts - - - - - -src/app/app-routing.module.ts->src/app/core/constants/routes.constants.ts - - - - - -src/app/core/guards/auth.guard.ts - - -auth.guard.ts - - - - - -src/app/app-routing.module.ts->src/app/core/guards/auth.guard.ts - - - - - -src/app/core/guards/interceptor.guard.ts - - -interceptor.guard.ts - - - - - -src/app/app-routing.module.ts->src/app/core/guards/interceptor.guard.ts - - - - - -src/app/core/guards/login.guard.ts - - -login.guard.ts - - - - - -src/app/app-routing.module.ts->src/app/core/guards/login.guard.ts - - - - - -src/app/core/guards/redirect.guard.ts - - -redirect.guard.ts - - - - - -src/app/app-routing.module.ts->src/app/core/guards/redirect.guard.ts - - - - - -src/app/core/services/translations.service.ts - - -translations.service.ts - - - - - -src/app/app-routing.module.ts->src/app/core/services/translations.service.ts - - - - - -src/app/features/about/about.module.ts - - -about.module.ts - - - - - -src/app/app-routing.module.ts->src/app/features/about/about.module.ts - - - - - - - -src/app/features/blog/blog.module.ts - - -blog.module.ts - - - - - -src/app/app-routing.module.ts->src/app/features/blog/blog.module.ts - - - - - - - -src/app/features/bookmarks/bookmarks.module.ts - - -bookmarks.module.ts - - - - - -src/app/app-routing.module.ts->src/app/features/bookmarks/bookmarks.module.ts - - - - - - - -src/app/features/dashboard/dashboard.module.ts - - -dashboard.module.ts - - - - - -src/app/app-routing.module.ts->src/app/features/dashboard/dashboard.module.ts - - - - - - - -src/app/features/events/events.module.ts - - -events.module.ts - - - - - -src/app/app-routing.module.ts->src/app/features/events/events.module.ts - - - - - - - -src/app/features/friends/friends.module.ts - - -friends.module.ts - - - - - -src/app/app-routing.module.ts->src/app/features/friends/friends.module.ts - - - - - - - -src/app/features/groups/groups.module.ts - - -groups.module.ts - - - - - -src/app/app-routing.module.ts->src/app/features/groups/groups.module.ts - - - - - - - -src/app/features/home/home.module.ts - - -home.module.ts - - - - - -src/app/app-routing.module.ts->src/app/features/home/home.module.ts - - - - - - - -src/app/features/invite/invite.module.ts - - -invite.module.ts - - - - - -src/app/app-routing.module.ts->src/app/features/invite/invite.module.ts - - - - - - - -src/app/features/login/login.module.ts - - -login.module.ts - - - - - -src/app/app-routing.module.ts->src/app/features/login/login.module.ts - - - - - - - -src/app/features/members/members.module.ts - - -members.module.ts - - - - - -src/app/app-routing.module.ts->src/app/features/members/members.module.ts - - - - - - - -src/app/features/messages/messages.module.ts - - -messages.module.ts - - - - - -src/app/app-routing.module.ts->src/app/features/messages/messages.module.ts - - - - - - - -src/app/features/missions/missions.module.ts - - -missions.module.ts - - - - - -src/app/app-routing.module.ts->src/app/features/missions/missions.module.ts - - - - - - - -src/app/features/news-feed/news-feed.module.ts - - -news-feed.module.ts - - - - - -src/app/app-routing.module.ts->src/app/features/news-feed/news-feed.module.ts - - - - - - - -src/app/features/privacy/privacy.module.ts - - -privacy.module.ts - - - - - -src/app/app-routing.module.ts->src/app/features/privacy/privacy.module.ts - - - - - - - -src/app/features/profile/profile.module.ts - - -profile.module.ts - - - - - -src/app/app-routing.module.ts->src/app/features/profile/profile.module.ts - - - - - - - -src/app/features/register/register.module.ts - - -register.module.ts - - - - - -src/app/app-routing.module.ts->src/app/features/register/register.module.ts - - - - - - - -src/app/features/search/search.module.ts - - -search.module.ts - - - - - -src/app/app-routing.module.ts->src/app/features/search/search.module.ts - - - - - - - -src/app/features/settings/settings.module.ts - - -settings.module.ts - - - - - -src/app/app-routing.module.ts->src/app/features/settings/settings.module.ts - - - - - - - -src/app/features/splash/splash.module.ts - - -splash.module.ts - - - - - -src/app/app-routing.module.ts->src/app/features/splash/splash.module.ts - - - - - - - -src/app/features/stats/stats.module.ts - - -stats.module.ts - - - - - -src/app/app-routing.module.ts->src/app/features/stats/stats.module.ts - - - - - - - -src/app/features/terms/terms.module.ts - - -terms.module.ts - - - - - -src/app/app-routing.module.ts->src/app/features/terms/terms.module.ts - - - - - - - -src/app/features/the-wire/the-wire.module.ts - - -the-wire.module.ts - - - - - -src/app/app-routing.module.ts->src/app/features/the-wire/the-wire.module.ts - - - - - - - -src/app/shared/components/forbidden/forbidden.component.ts - - -forbidden.component.ts - - - - - -src/app/app-routing.module.ts->src/app/shared/components/forbidden/forbidden.component.ts - - - - - -src/app/shared/components/not-found/not-found.component.ts - - -not-found.component.ts - - - - - -src/app/app-routing.module.ts->src/app/shared/components/not-found/not-found.component.ts - - - - - -src/app/shared/components/unauthorized/unauthorized.component.ts - - -unauthorized.component.ts - - - - - -src/app/app-routing.module.ts->src/app/shared/components/unauthorized/unauthorized.component.ts - - - - - -src/app/core/services/session-storage.service.ts - - -session-storage.service.ts - - - - - -src/app/core/guards/auth.guard.ts->src/app/core/services/session-storage.service.ts - - - - - -src/environments/environment.ts - - -environment.ts - - - - - -src/app/core/guards/auth.guard.ts->src/environments/environment.ts - - - - - -src/app/core/guards/interceptor.guard.ts->src/app/core/services/session-storage.service.ts - - - - - -src/assets/i18n/translations.en.ts - - -translations.en.ts - - - - - -src/app/core/services/translations.service.ts->src/assets/i18n/translations.en.ts - - - - - -src/app/shared/shared.module.ts - - -shared.module.ts - - - - - -src/app/features/about/about.module.ts->src/app/shared/shared.module.ts - - - - - - - -src/app/features/about/about-routing.module.ts - - -about-routing.module.ts - - - - - -src/app/features/about/about.module.ts->src/app/features/about/about-routing.module.ts - - - - - -src/app/features/about/about.component.ts - - -about.component.ts - - - - - -src/app/features/about/about.module.ts->src/app/features/about/about.component.ts - - - - - -src/app/features/blog/blog.module.ts->src/app/shared/shared.module.ts - - - - - - - -src/app/features/blog/blog-routing.module.ts - - -blog-routing.module.ts - - - - - -src/app/features/blog/blog.module.ts->src/app/features/blog/blog-routing.module.ts - - - - - -src/app/features/bookmarks/bookmarks.module.ts->src/app/shared/shared.module.ts - - - - - - - -src/app/features/bookmarks/bookmarks-routing.module.ts - - -bookmarks-routing.module.ts - - - - - -src/app/features/bookmarks/bookmarks.module.ts->src/app/features/bookmarks/bookmarks-routing.module.ts - - - - - -src/app/features/dashboard/dashboard.module.ts->src/app/shared/shared.module.ts - - - - - - - -src/app/features/dashboard/dashboard-routing.module.ts - - -dashboard-routing.module.ts - - - - - -src/app/features/dashboard/dashboard.module.ts->src/app/features/dashboard/dashboard-routing.module.ts - - - - - -src/app/features/events/events.module.ts->src/app/shared/shared.module.ts - - - - - - - -src/app/features/events/components/event-card/event-card.component.ts - - -event-card.component.ts - - - - - -src/app/features/events/events.module.ts->src/app/features/events/components/event-card/event-card.component.ts - - - - - -src/app/features/events/components/event-list/event-list.component.ts - - -event-list.component.ts - - - - - -src/app/features/events/events.module.ts->src/app/features/events/components/event-list/event-list.component.ts - - - - - -src/app/features/events/components/event/event.component.ts - - -event.component.ts - - - - - -src/app/features/events/events.module.ts->src/app/features/events/components/event/event.component.ts - - - - - -src/app/features/events/events-routing.module.ts - - -events-routing.module.ts - - - - - -src/app/features/events/events.module.ts->src/app/features/events/events-routing.module.ts - - - - - -src/app/features/friends/friends.module.ts->src/app/shared/shared.module.ts - - - - - - - -src/app/features/friends/friends-routing.module.ts - - -friends-routing.module.ts - - - - - -src/app/features/friends/friends.module.ts->src/app/features/friends/friends-routing.module.ts - - - - - -src/app/features/groups/groups.module.ts->src/app/shared/shared.module.ts - - - - - - - -src/app/features/groups/components/group-card/group-card.component.ts - - -group-card.component.ts - - - - - -src/app/features/groups/groups.module.ts->src/app/features/groups/components/group-card/group-card.component.ts - - - - - -src/app/features/groups/components/group-list/group-list.component.ts - - -group-list.component.ts - - - - - -src/app/features/groups/groups.module.ts->src/app/features/groups/components/group-list/group-list.component.ts - - - - - -src/app/features/groups/components/group/group.component.ts - - -group.component.ts - - - - - -src/app/features/groups/groups.module.ts->src/app/features/groups/components/group/group.component.ts - - - - - -src/app/features/groups/groups-routing.module.ts - - -groups-routing.module.ts - - - - - -src/app/features/groups/groups.module.ts->src/app/features/groups/groups-routing.module.ts - - - - - -src/app/features/home/home.module.ts->src/app/features/events/events.module.ts - - - - - - - -src/app/features/home/home.module.ts->src/app/features/groups/groups.module.ts - - - - - - - -src/app/features/home/home.module.ts->src/app/features/news-feed/news-feed.module.ts - - - - - - - -src/app/features/home/home.module.ts->src/app/features/profile/profile.module.ts - - - - - - - -src/app/features/home/home.module.ts->src/app/shared/shared.module.ts - - - - - - - -src/app/features/home/home-routing.module.ts - - -home-routing.module.ts - - - - - -src/app/features/home/home.module.ts->src/app/features/home/home-routing.module.ts - - - - - -src/app/features/home/home.component.ts - - -home.component.ts - - - - - -src/app/features/home/home.module.ts->src/app/features/home/home.component.ts - - - - - -src/app/features/invite/invite.module.ts->src/app/shared/shared.module.ts - - - - - - - -src/app/features/invite/invite-routing.module.ts - - -invite-routing.module.ts - - - - - -src/app/features/invite/invite.module.ts->src/app/features/invite/invite-routing.module.ts - - - - - -src/app/features/login/login.module.ts->src/app/shared/shared.module.ts - - - - - - - -src/app/features/login/login-routing.module.ts - - -login-routing.module.ts - - - - - -src/app/features/login/login.module.ts->src/app/features/login/login-routing.module.ts - - - - - -src/app/features/login/login.component.ts - - -login.component.ts - - - - - -src/app/features/login/login.module.ts->src/app/features/login/login.component.ts - - - - - -src/app/features/members/members.module.ts->src/app/shared/shared.module.ts - - - - - - - -src/app/features/members/members-routing.module.ts - - -members-routing.module.ts - - - - - -src/app/features/members/members.module.ts->src/app/features/members/members-routing.module.ts - - - - - -src/app/features/messages/messages.module.ts->src/app/shared/shared.module.ts - - - - - - - -src/app/features/messages/messages-routing.module.ts - - -messages-routing.module.ts - - - - - -src/app/features/messages/messages.module.ts->src/app/features/messages/messages-routing.module.ts - - - - - -src/app/features/missions/missions.module.ts->src/app/shared/shared.module.ts - - - - - - - -src/app/features/missions/missions-routing.module.ts - - -missions-routing.module.ts - - - - - -src/app/features/missions/missions.module.ts->src/app/features/missions/missions-routing.module.ts - - - - - -src/app/features/news-feed/news-feed.module.ts->src/app/shared/shared.module.ts - - - - - - - -src/app/features/news-feed/components/news-card/news-card.component.ts - - -news-card.component.ts - - - - - -src/app/features/news-feed/news-feed.module.ts->src/app/features/news-feed/components/news-card/news-card.component.ts - - - - - -src/app/features/news-feed/components/news-list/news-list.component.ts - - -news-list.component.ts - - - - - -src/app/features/news-feed/news-feed.module.ts->src/app/features/news-feed/components/news-list/news-list.component.ts - - - - - -src/app/features/news-feed/news-feed-routing.module.ts - - -news-feed-routing.module.ts - - - - - -src/app/features/news-feed/news-feed.module.ts->src/app/features/news-feed/news-feed-routing.module.ts - - - - - -src/app/features/privacy/privacy.module.ts->src/app/shared/shared.module.ts - - - - - - - -src/app/features/privacy/privacy-routing.module.ts - - -privacy-routing.module.ts - - - - - -src/app/features/privacy/privacy.module.ts->src/app/features/privacy/privacy-routing.module.ts - - - - - -src/app/features/privacy/privacy.component.ts - - -privacy.component.ts - - - - - -src/app/features/privacy/privacy.module.ts->src/app/features/privacy/privacy.component.ts - - - - - -src/app/features/profile/profile.module.ts->src/app/shared/shared.module.ts - - - - - - - -src/app/features/profile/components/profile-card/profile-card.component.ts - - -profile-card.component.ts - - - - - -src/app/features/profile/profile.module.ts->src/app/features/profile/components/profile-card/profile-card.component.ts - - - - - -src/app/features/profile/components/post/post.component.ts - - -post.component.ts - - - - - -src/app/features/profile/profile.module.ts->src/app/features/profile/components/post/post.component.ts - - - - - -src/app/features/profile/components/profile-list/profile-list.component.ts - - -profile-list.component.ts - - - - - -src/app/features/profile/profile.module.ts->src/app/features/profile/components/profile-list/profile-list.component.ts - - - - - -src/app/features/profile/profile-routing.module.ts - - -profile-routing.module.ts - - - - - -src/app/features/profile/profile.module.ts->src/app/features/profile/profile-routing.module.ts - - - - - -src/app/features/register/register.module.ts->src/app/shared/shared.module.ts - - - - - - - -src/app/features/register/register-routing.module.ts - - -register-routing.module.ts - - - - - -src/app/features/register/register.module.ts->src/app/features/register/register-routing.module.ts - - - - - -src/app/features/register/register.component.ts - - -register.component.ts - - - - - -src/app/features/register/register.module.ts->src/app/features/register/register.component.ts - - - - - -src/app/features/search/search.module.ts->src/app/shared/shared.module.ts - - - - - - - -src/app/features/search/search-routing.module.ts - - -search-routing.module.ts - - - - - -src/app/features/search/search.module.ts->src/app/features/search/search-routing.module.ts - - - - - -src/app/features/settings/settings.module.ts->src/app/shared/shared.module.ts - - - - - - - -src/app/features/settings/settings-routing.module.ts - - -settings-routing.module.ts - - - - - -src/app/features/settings/settings.module.ts->src/app/features/settings/settings-routing.module.ts - - - - - -src/app/features/splash/splash.module.ts->src/app/shared/shared.module.ts - - - - - - - -src/app/features/splash/splash-routing.module.ts - - -splash-routing.module.ts - - - - - -src/app/features/splash/splash.module.ts->src/app/features/splash/splash-routing.module.ts - - - - - -src/app/features/splash/splash.component.ts - - -splash.component.ts - - - - - -src/app/features/splash/splash.module.ts->src/app/features/splash/splash.component.ts - - - - - -src/app/features/stats/stats.module.ts->src/app/shared/shared.module.ts - - - - - - - -src/app/features/stats/stats-routing.module.ts - - -stats-routing.module.ts - - - - - -src/app/features/stats/stats.module.ts->src/app/features/stats/stats-routing.module.ts - - - - - -src/app/features/stats/stats.component.ts - - -stats.component.ts - - - - - -src/app/features/stats/stats.module.ts->src/app/features/stats/stats.component.ts - - - - - -src/app/features/terms/terms.module.ts->src/app/shared/shared.module.ts - - - - - - - -src/app/features/terms/terms-routing.module.ts - - -terms-routing.module.ts - - - - - -src/app/features/terms/terms.module.ts->src/app/features/terms/terms-routing.module.ts - - - - - -src/app/features/terms/terms.component.ts - - -terms.component.ts - - - - - -src/app/features/terms/terms.module.ts->src/app/features/terms/terms.component.ts - - - - - -src/app/features/the-wire/the-wire.module.ts->src/app/shared/shared.module.ts - - - - - - - -src/app/features/the-wire/the-wire-routing.module.ts - - -the-wire-routing.module.ts - - - - - -src/app/features/the-wire/the-wire.module.ts->src/app/features/the-wire/the-wire-routing.module.ts - - - - - -src/app/app.component.spec.ts - - -app.component.spec.ts - - - - - -src/app/app.component.ts - - -app.component.ts - - - - - -src/app/app.component.spec.ts->src/app/app.component.ts - - - - - -src/app/core/auth/auth.module.ts - - -auth.module.ts - - - - - -src/app/app.component.spec.ts->src/app/core/auth/auth.module.ts - - - - - -src/app/core/helpers/typescript-loader.ts - - -typescript-loader.ts - - - - - -src/app/app.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - - - - -src/app/app.component.ts->src/app/core/constants/routes.constants.ts - - - - - -src/app/app.component.ts->src/app/core/services/translations.service.ts - - - - - -src/app/core/services/language-storage.service.ts - - -language-storage.service.ts - - - - - -src/app/app.component.ts->src/app/core/services/language-storage.service.ts - - - - - -src/app/core/auth/auth.module.ts->src/app/core/services/session-storage.service.ts - - - - - -src/app/core/auth/auth.module.ts->src/environments/environment.ts - - - - - -src/app/core/services/local-storage-ref.service.ts - - -local-storage-ref.service.ts - - - - - -src/app/core/services/language-storage.service.ts->src/app/core/services/local-storage-ref.service.ts - - - - - -src/app/app.module.ts - - -app.module.ts - - - - - -src/app/app.module.ts->src/app/app-routing.module.ts - - - - - - - -src/app/app.module.ts->src/app/app.component.ts - - - - - -src/app/app.module.ts->src/app/core/helpers/typescript-loader.ts - - - - - -src/app/core/core.module.ts - - -core.module.ts - - - - - -src/app/app.module.ts->src/app/core/core.module.ts - - - - - - - -src/app/core/services/title.service.ts - - -title.service.ts - - - - - -src/app/app.module.ts->src/app/core/services/title.service.ts - - - - - -src/app/features/events/events.component.ts - - -events.component.ts - - - - - -src/app/app.module.ts->src/app/features/events/events.component.ts - - - - - -src/app/features/groups/groups.component.ts - - -groups.component.ts - - - - - -src/app/app.module.ts->src/app/features/groups/groups.component.ts - - - - - -src/app/app.module.ts->src/app/shared/shared.module.ts - - - - - - - -src/app/core/core.module.ts->src/app/core/auth/auth.module.ts - - - - - -src/app/core/core.module.ts->src/app/core/helpers/typescript-loader.ts - - - - - -src/app/core/core.module.ts->src/app/app.module.ts - - - - - - - -src/app/features/events/events.component.ts->src/app/core/constants/routes.constants.ts - - - - - -src/app/features/events/events.component.ts->src/app/core/services/translations.service.ts - - - - - -src/app/core/services/event.service.ts - - -event.service.ts - - - - - -src/app/features/events/events.component.ts->src/app/core/services/event.service.ts - - - - - -src/app/shared/models/material-button-type.ts - - -material-button-type.ts - - - - - -src/app/features/events/events.component.ts->src/app/shared/models/material-button-type.ts - - - - - -src/app/shared/shared.module.ts->src/app/core/services/translations.service.ts - - - - - -src/app/shared/shared.module.ts->src/app/shared/components/forbidden/forbidden.component.ts - - - - - -src/app/shared/shared.module.ts->src/app/shared/components/not-found/not-found.component.ts - - - - - -src/app/shared/shared.module.ts->src/app/shared/components/unauthorized/unauthorized.component.ts - - - - - -src/app/shared/shared.module.ts->src/app/core/helpers/typescript-loader.ts - - - - - -src/app/shared/shared.module.ts->src/app/app.module.ts - - - - - - - -src/app/shared/components/banner/banner.component.ts - - -banner.component.ts - - - - - -src/app/shared/shared.module.ts->src/app/shared/components/banner/banner.component.ts - - - - - -src/app/shared/pipes/form-control/form-control.pipe.ts - - -form-control.pipe.ts - - - - - -src/app/shared/shared.module.ts->src/app/shared/pipes/form-control/form-control.pipe.ts - - - - - -src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.ts - - -truncate-file-name.pipe.ts - - - - - -src/app/shared/shared.module.ts->src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.ts - - - - - -src/app/shared/components/blog-form/blog-form.component.ts - - -blog-form.component.ts - - - - - -src/app/shared/shared.module.ts->src/app/shared/components/blog-form/blog-form.component.ts - - - - - -src/app/shared/components/button/button.component.ts - - -button.component.ts - - - - - -src/app/shared/shared.module.ts->src/app/shared/components/button/button.component.ts - - - - - -src/app/shared/components/calendar-button/calendar-button.component.ts - - -calendar-button.component.ts - - - - - -src/app/shared/shared.module.ts->src/app/shared/components/calendar-button/calendar-button.component.ts - - - - - -src/app/shared/components/editor/editor.component.ts - - -editor.component.ts - - - - - -src/app/shared/shared.module.ts->src/app/shared/components/editor/editor.component.ts - - - - - -src/app/shared/factories/editor-config.factory.ts - - -editor-config.factory.ts - - - - - -src/app/shared/shared.module.ts->src/app/shared/factories/editor-config.factory.ts - - - - - -src/app/shared/components/editor/menu/editor-menu/editor-menu.component.ts - - -editor-menu.component.ts - - - - - -src/app/shared/shared.module.ts->src/app/shared/components/editor/menu/editor-menu/editor-menu.component.ts - - - - - -src/app/shared/components/event-form/event-form.component.ts - - -event-form.component.ts - - - - - -src/app/shared/shared.module.ts->src/app/shared/components/event-form/event-form.component.ts - - - - - -src/app/shared/components/file-select/file-select.component.ts - - -file-select.component.ts - - - - - -src/app/shared/shared.module.ts->src/app/shared/components/file-select/file-select.component.ts - - - - - -src/app/shared/components/footer/footer.component.ts - - -footer.component.ts - - - - - -src/app/shared/shared.module.ts->src/app/shared/components/footer/footer.component.ts - - - - - -src/app/shared/components/header/header.component.ts - - -header.component.ts - - - - - -src/app/shared/shared.module.ts->src/app/shared/components/header/header.component.ts - - - - - -src/app/shared/components/input/input.component.ts - - -input.component.ts - - - - - -src/app/shared/shared.module.ts->src/app/shared/components/input/input.component.ts - - - - - -src/app/shared/components/language-selector/language-selector.component.ts - - -language-selector.component.ts - - - - - -src/app/shared/shared.module.ts->src/app/shared/components/language-selector/language-selector.component.ts - - - - - -src/app/shared/components/list/list.component.ts - - -list.component.ts - - - - - -src/app/shared/shared.module.ts->src/app/shared/components/list/list.component.ts - - - - - -src/app/shared/components/page-title/page-title.component.ts - - -page-title.component.ts - - - - - -src/app/shared/shared.module.ts->src/app/shared/components/page-title/page-title.component.ts - - - - - -src/app/shared/components/poll-form/poll-form.component.ts - - -poll-form.component.ts - - - - - -src/app/shared/shared.module.ts->src/app/shared/components/poll-form/poll-form.component.ts - - - - - -src/app/shared/components/post-form/post-form.component.ts - - -post-form.component.ts - - - - - -src/app/shared/shared.module.ts->src/app/shared/components/post-form/post-form.component.ts - - - - - -src/app/shared/components/profile-pic/profile-pic.component.ts - - -profile-pic.component.ts - - - - - -src/app/shared/shared.module.ts->src/app/shared/components/profile-pic/profile-pic.component.ts - - - - - -src/app/shared/pipes/form-group/form-group.pipe.ts - - -form-group.pipe.ts - - - - - -src/app/shared/shared.module.ts->src/app/shared/pipes/form-group/form-group.pipe.ts - - - - - -src/app/core/services/session-storage.service.ts->src/app/core/services/local-storage-ref.service.ts - - - - - -src/app/core/guards/auth.guard.spec.ts - - -auth.guard.spec.ts - - - - - -src/app/core/guards/auth.guard.spec.ts->src/app/core/guards/auth.guard.ts - - - - - -src/app/core/guards/auth.guard.spec.ts->src/app/core/auth/auth.module.ts - - - - - -src/app/core/guards/auth.guard.spec.ts->src/app/core/services/session-storage.service.ts - - - - - -src/app/core/guards/interceptor.guard.spec.ts - - -interceptor.guard.spec.ts - - - - - -src/app/core/guards/interceptor.guard.spec.ts->src/app/core/guards/interceptor.guard.ts - - - - - -src/app/core/guards/login.guard.spec.ts - - -login.guard.spec.ts - - - - - -src/app/core/guards/login.guard.spec.ts->src/app/core/guards/login.guard.ts - - - - - -src/app/core/guards/login.guard.spec.ts->src/app/core/auth/auth.module.ts - - - - - -src/app/core/guards/redirect.guard.spec.ts - - -redirect.guard.spec.ts - - - - - -src/app/core/guards/redirect.guard.spec.ts->src/app/core/guards/redirect.guard.ts - - - - - -src/app/core/guards/role.guard.spec.ts - - -role.guard.spec.ts - - - - - -src/app/core/guards/role.guard.ts - - -role.guard.ts - - - - - -src/app/core/guards/role.guard.spec.ts->src/app/core/guards/role.guard.ts - - - - - -src/app/core/interceptors/error.interceptor.spec.ts - - -error.interceptor.spec.ts - - - - - -src/app/core/interceptors/error.interceptor.ts - - -error.interceptor.ts - - - - - -src/app/core/interceptors/error.interceptor.spec.ts->src/app/core/interceptors/error.interceptor.ts - - - - - -src/app/core/interfaces/card-component.interface.ts - - -card-component.interface.ts - - - - - -src/app/shared/models/card-size.ts - - -card-size.ts - - - - - -src/app/core/interfaces/card-component.interface.ts->src/app/shared/models/card-size.ts - - - - - -src/app/core/interfaces/list-service.interface.ts - - -list-service.interface.ts - - - - - -src/app/core/models/blog.model.ts - - -blog.model.ts - - - - - -src/app/core/models/person.model.ts - - -person.model.ts - - - - - -src/app/core/models/blog.model.ts->src/app/core/models/person.model.ts - - - - - -src/app/features/news-feed/models/INewsItem.ts - - -INewsItem.ts - - - - - -src/app/core/models/blog.model.ts->src/app/features/news-feed/models/INewsItem.ts - - - - - -src/app/core/models/location.model.ts - - -location.model.ts - - - - - -src/app/core/models/person.model.ts->src/app/core/models/location.model.ts - - - - - -src/app/features/news-feed/models/INewsItem.ts->src/app/core/models/person.model.ts - - - - - -src/app/core/models/poll.model.ts - - -poll.model.ts - - - - - -src/app/core/models/poll.model.ts->src/app/core/models/person.model.ts - - - - - -src/app/core/models/poll.model.ts->src/app/features/news-feed/models/INewsItem.ts - - - - - -src/app/core/models/post.model.ts - - -post.model.ts - - - - - -src/app/core/models/post.model.ts->src/app/core/models/person.model.ts - - - - - -src/app/core/models/post.model.ts->src/app/features/news-feed/models/INewsItem.ts - - - - - -src/app/core/services/debounce.service.spec.ts - - -debounce.service.spec.ts - - - - - -src/app/core/services/debounce.service.ts - - -debounce.service.ts - - - - - -src/app/core/services/debounce.service.spec.ts->src/app/core/services/debounce.service.ts - - - - - -src/app/core/services/event.service.spec.ts - - -event.service.spec.ts - - - - - -src/app/core/services/event.service.spec.ts->src/app/core/services/event.service.ts - - - - - -src/app/core/services/event.service.ts->src/app/core/interfaces/list-service.interface.ts - - - - - -src/app/core/services/event.service.ts->src/app/core/models/location.model.ts - - - - - -src/app/core/services/group.service.ts - - -group.service.ts - - - - - -src/app/core/services/event.service.ts->src/app/core/services/group.service.ts - - - - - -src/app/core/services/people.service.ts - - -people.service.ts - - - - - -src/app/core/services/event.service.ts->src/app/core/services/people.service.ts - - - - - -src/app/core/services/event.service.ts->src/app/features/events/components/event-card/event-card.component.ts - - - - - -src/app/features/events/models/event.ts - - -event.ts - - - - - -src/app/core/services/event.service.ts->src/app/features/events/models/event.ts - - - - - -src/app/core/services/group.service.ts->src/app/core/interfaces/list-service.interface.ts - - - - - -src/app/core/services/group.service.ts->src/app/features/groups/components/group-card/group-card.component.ts - - - - - -src/app/features/groups/models/group.ts - - -group.ts - - - - - -src/app/core/services/group.service.ts->src/app/features/groups/models/group.ts - - - - - -src/app/core/services/people.service.ts->src/app/core/interfaces/list-service.interface.ts - - - - - -src/app/core/services/people.service.ts->src/app/core/models/person.model.ts - - - - - -src/app/core/services/people.service.ts->src/app/core/models/location.model.ts - - - - - -src/app/core/services/people.service.ts->src/app/features/profile/components/profile-card/profile-card.component.ts - - - - - -src/app/features/events/components/event-card/event-card.component.ts->src/app/core/constants/routes.constants.ts - - - - - -src/app/features/events/components/event-card/event-card.component.ts->src/app/core/services/translations.service.ts - - - - - -src/app/features/events/components/event-card/event-card.component.ts->src/app/core/interfaces/card-component.interface.ts - - - - - -src/app/features/events/components/event-card/event-card.component.ts->src/app/shared/models/card-size.ts - - - - - -src/app/features/events/components/event-card/event-card.component.ts->src/app/features/events/models/event.ts - - - - - -src/app/features/events/components/event-card/event-card.component.ts->src/app/shared/models/material-button-type.ts - - - - - -src/app/shared/models/tooltip-direction.ts - - -tooltip-direction.ts - - - - - -src/app/features/events/components/event-card/event-card.component.ts->src/app/shared/models/tooltip-direction.ts - - - - - -src/app/features/events/models/event.ts->src/app/core/models/person.model.ts - - - - - -src/app/features/events/models/event.ts->src/app/core/models/location.model.ts - - - - - -src/app/features/events/models/event.ts->src/app/features/groups/models/group.ts - - - - - -src/app/core/services/focus-tracking.service.spec.ts - - -focus-tracking.service.spec.ts - - - - - -src/app/core/services/focus-tracking.service.ts - - -focus-tracking.service.ts - - - - - -src/app/core/services/focus-tracking.service.spec.ts->src/app/core/services/focus-tracking.service.ts - - - - - -src/app/core/services/group.service.spec.ts - - -group.service.spec.ts - - - - - -src/app/core/services/group.service.spec.ts->src/app/core/services/group.service.ts - - - - - -src/app/features/groups/components/group-card/group-card.component.ts->src/app/core/constants/routes.constants.ts - - - - - -src/app/features/groups/components/group-card/group-card.component.ts->src/app/core/services/translations.service.ts - - - - - -src/app/features/groups/components/group-card/group-card.component.ts->src/app/core/interfaces/card-component.interface.ts - - - - - -src/app/features/groups/components/group-card/group-card.component.ts->src/app/shared/models/card-size.ts - - - - - -src/app/features/groups/components/group-card/group-card.component.ts->src/app/features/groups/models/group.ts - - - - - -src/app/core/services/language-storage.service.spec.ts - - -language-storage.service.spec.ts - - - - - -src/app/core/services/language-storage.service.spec.ts->src/app/core/services/language-storage.service.ts - - - - - -src/app/core/services/local-storage-ref.service.spec.ts - - -local-storage-ref.service.spec.ts - - - - - -src/app/core/services/local-storage-ref.service.spec.ts->src/app/core/services/local-storage-ref.service.ts - - - - - -src/app/core/services/news.service.spec.ts - - -news.service.spec.ts - - - - - -src/app/core/services/news.service.ts - - -news.service.ts - - - - - -src/app/core/services/news.service.spec.ts->src/app/core/services/news.service.ts - - - - - -src/app/core/services/news.service.ts->src/app/core/interfaces/list-service.interface.ts - - - - - -src/app/core/services/news.service.ts->src/app/core/models/blog.model.ts - - - - - -src/app/core/services/news.service.ts->src/app/features/news-feed/models/INewsItem.ts - - - - - -src/app/core/services/news.service.ts->src/app/core/models/poll.model.ts - - - - - -src/app/core/services/news.service.ts->src/app/core/models/post.model.ts - - - - - -src/app/core/services/news.service.ts->src/app/core/services/people.service.ts - - - - - -src/app/core/services/news.service.ts->src/app/features/news-feed/components/news-card/news-card.component.ts - - - - - -src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/core/services/translations.service.ts - - - - - -src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/core/interfaces/card-component.interface.ts - - - - - -src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/shared/models/card-size.ts - - - - - -src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/core/models/blog.model.ts - - - - - -src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/features/news-feed/models/INewsItem.ts - - - - - -src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/core/models/poll.model.ts - - - - - -src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/core/models/post.model.ts - - - - - -src/app/features/news-feed/components/news-card/news-card.component.ts->src/app/shared/models/material-button-type.ts - - - - - -src/app/core/services/people.service.spec.ts - - -people.service.spec.ts - - - - - -src/app/core/services/people.service.spec.ts->src/app/core/services/people.service.ts - - - - - -src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/core/constants/routes.constants.ts - - - - - -src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/core/services/translations.service.ts - - - - - -src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/core/interfaces/card-component.interface.ts - - - - - -src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/shared/models/card-size.ts - - - - - -src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/core/models/person.model.ts - - - - - -src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/shared/models/material-button-type.ts - - - - - -src/app/features/profile/components/profile-card/profile-card.component.ts->src/app/shared/models/tooltip-direction.ts - - - - - -src/app/core/services/session-storage.service.spec.ts - - -session-storage.service.spec.ts - - - - - -src/app/core/services/session-storage.service.spec.ts->src/app/core/services/session-storage.service.ts - - - - - -src/app/core/services/title.service.spec.ts - - -title.service.spec.ts - - - - - -src/app/core/services/title.service.spec.ts->src/app/core/helpers/typescript-loader.ts - - - - - -src/app/core/services/title.service.spec.ts->src/app/core/services/title.service.ts - - - - - -src/app/features/about/about-routing.module.ts->src/app/features/about/about.component.ts - - - - - -src/app/features/about/about.component.spec.ts - - -about.component.spec.ts - - - - - -src/app/features/about/about.component.spec.ts->src/app/features/about/about.component.ts - - - - - -src/app/features/blog/blog.component.ts - - -blog.component.ts - - - - - -src/app/features/blog/blog-routing.module.ts->src/app/features/blog/blog.component.ts - - - - - -src/app/features/blog/blog.component.spec.ts - - -blog.component.spec.ts - - - - - -src/app/features/blog/blog.component.spec.ts->src/app/features/blog/blog.component.ts - - - - - -src/app/features/bookmarks/bookmarks.component.ts - - -bookmarks.component.ts - - - - - -src/app/features/bookmarks/bookmarks-routing.module.ts->src/app/features/bookmarks/bookmarks.component.ts - - - - - -src/app/features/bookmarks/bookmarks.component.spec.ts - - -bookmarks.component.spec.ts - - - - - -src/app/features/bookmarks/bookmarks.component.spec.ts->src/app/features/bookmarks/bookmarks.component.ts - - - - - -src/app/features/dashboard/dashboard.component.ts - - -dashboard.component.ts - - - - - -src/app/features/dashboard/dashboard-routing.module.ts->src/app/features/dashboard/dashboard.component.ts - - - - - -src/app/features/dashboard/dashboard.component.spec.ts - - -dashboard.component.spec.ts - - - - - -src/app/features/dashboard/dashboard.component.spec.ts->src/app/features/dashboard/dashboard.component.ts - - - - - -src/app/features/events/components/event-card/event-card.component.spec.ts - - -event-card.component.spec.ts - - - - - -src/app/features/events/components/event-card/event-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - - - - -src/app/features/events/components/event-card/event-card.component.spec.ts->src/app/features/events/components/event-card/event-card.component.ts - - - - - -src/app/features/events/components/event-list/event-list.component.spec.ts - - -event-list.component.spec.ts - - - - - -src/app/features/events/components/event-list/event-list.component.spec.ts->src/app/features/events/components/event-list/event-list.component.ts - - - - - -src/app/features/events/components/event-list/event-list.component.ts->src/app/shared/models/card-size.ts - - - - - -src/app/features/events/components/event-list/event-list.component.ts->src/app/features/events/models/event.ts - - - - - -src/app/features/events/components/event/event.component.spec.ts - - -event.component.spec.ts - - - - - -src/app/features/events/components/event/event.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - - - - -src/app/features/events/components/event/event.component.spec.ts->src/app/features/events/components/event/event.component.ts - - - - - -src/app/features/events/components/event/event.component.ts->src/app/core/constants/routes.constants.ts - - - - - -src/app/features/events/components/event/event.component.ts->src/app/core/services/translations.service.ts - - - - - -src/app/features/events/components/event/event.component.ts->src/app/core/services/event.service.ts - - - - - -src/app/features/events/components/event/event.component.ts->src/app/features/events/models/event.ts - - - - - -src/app/features/events/components/event/event.component.ts->src/app/shared/models/material-button-type.ts - - - - - -src/app/features/events/components/event/event.component.ts->src/app/shared/models/tooltip-direction.ts - - - - - -src/app/features/events/components/event/event.component.ts->src/app/shared/components/banner/banner.component.ts - - - - - -src/app/shared/models/input-type.ts - - -input-type.ts - - - - - -src/app/features/events/components/event/event.component.ts->src/app/shared/models/input-type.ts - - - - - -src/app/features/events/events-routing.module.ts->src/app/core/services/translations.service.ts - - - - - -src/app/features/events/events-routing.module.ts->src/app/features/events/events.component.ts - - - - - -src/app/features/events/events-routing.module.ts->src/app/features/events/components/event/event.component.ts - - - - - -src/app/features/events/events.component.spec.ts - - -events.component.spec.ts - - - - - -src/app/features/events/events.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - - - - -src/app/features/events/events.component.spec.ts->src/app/features/events/events.component.ts - - - - - -src/app/features/events/events.component.spec.ts->src/app/shared/pipes/form-control/form-control.pipe.ts - - - - - -src/app/features/events/resolvers/event.resolver.ts - - -event.resolver.ts - - - - - -src/app/features/events/resolvers/event.resolver.ts->src/app/core/services/event.service.ts - - - - - -src/app/features/events/resolvers/event.resolver.ts->src/app/features/events/models/event.ts - - - - - -src/app/features/friends/friends.component.ts - - -friends.component.ts - - - - - -src/app/features/friends/friends-routing.module.ts->src/app/features/friends/friends.component.ts - - - - - -src/app/features/friends/friends.component.spec.ts - - -friends.component.spec.ts - - - - - -src/app/features/friends/friends.component.spec.ts->src/app/features/friends/friends.component.ts - - - - - -src/app/features/groups/components/group-card/group-card.component.spec.ts - - -group-card.component.spec.ts - - - - - -src/app/features/groups/components/group-card/group-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - - - - -src/app/features/groups/components/group-card/group-card.component.spec.ts->src/app/features/groups/components/group-card/group-card.component.ts - - - - - -src/app/features/groups/components/group-list/group-list.component.spec.ts - - -group-list.component.spec.ts - - - - - -src/app/features/groups/components/group-list/group-list.component.spec.ts->src/app/features/groups/components/group-list/group-list.component.ts - - - - - -src/app/features/groups/components/group-list/group-list.component.ts->src/app/features/groups/models/group.ts - - - - - -src/app/features/groups/components/group/group.component.spec.ts - - -group.component.spec.ts - - - - - -src/app/features/groups/components/group/group.component.spec.ts->src/app/features/groups/components/group/group.component.ts - - - - - -src/app/features/groups/groups-routing.module.ts->src/app/core/services/translations.service.ts - - - - - -src/app/features/groups/groups-routing.module.ts->src/app/features/groups/groups.component.ts - - - - - -src/app/features/groups/groups-routing.module.ts->src/app/features/groups/components/group/group.component.ts - - - - - -src/app/features/groups/groups.component.spec.ts - - -groups.component.spec.ts - - - - - -src/app/features/groups/groups.component.spec.ts->src/app/features/groups/groups.component.ts - - - - - -src/app/features/home/home-routing.module.ts->src/app/features/home/home.component.ts - - - - - -src/app/features/home/home.component.ts->src/app/core/constants/routes.constants.ts - - - - - -src/app/features/home/home.component.ts->src/app/core/services/translations.service.ts - - - - - -src/app/features/home/home.component.ts->src/app/core/models/person.model.ts - - - - - -src/app/features/home/home.component.ts->src/app/features/news-feed/models/INewsItem.ts - - - - - -src/app/features/home/home.component.ts->src/app/core/services/event.service.ts - - - - - -src/app/features/home/home.component.ts->src/app/core/services/group.service.ts - - - - - -src/app/features/home/home.component.ts->src/app/core/services/people.service.ts - - - - - -src/app/features/home/home.component.ts->src/app/features/events/models/event.ts - - - - - -src/app/features/home/home.component.ts->src/app/features/groups/models/group.ts - - - - - -src/app/features/home/home.component.ts->src/app/core/services/news.service.ts - - - - - -src/app/features/home/home.component.ts->src/app/shared/models/input-type.ts - - - - - -src/app/features/home/home.component.spec.ts - - -home.component.spec.ts - - - - - -src/app/features/home/home.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - - - - -src/app/features/home/home.component.spec.ts->src/app/features/home/home.component.ts - - - - - -src/app/features/invite/invite.component.ts - - -invite.component.ts - - - - - -src/app/features/invite/invite-routing.module.ts->src/app/features/invite/invite.component.ts - - - - - -src/app/features/invite/invite.component.spec.ts - - -invite.component.spec.ts - - - - - -src/app/features/invite/invite.component.spec.ts->src/app/features/invite/invite.component.ts - - - - - -src/app/features/login/login-routing.module.ts->src/app/features/login/login.component.ts - - - - - -src/app/features/login/login.component.ts->src/app/core/services/translations.service.ts - - - - - -src/app/features/login/login.component.spec.ts - - -login.component.spec.ts - - - - - -src/app/features/login/login.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - - - - -src/app/features/login/login.component.spec.ts->src/app/features/login/login.component.ts - - - - - -src/app/features/members/members.component.ts - - -members.component.ts - - - - - -src/app/features/members/members-routing.module.ts->src/app/features/members/members.component.ts - - - - - -src/app/features/members/members.component.spec.ts - - -members.component.spec.ts - - - - - -src/app/features/members/members.component.spec.ts->src/app/features/members/members.component.ts - - - - - -src/app/features/messages/messages.component.ts - - -messages.component.ts - - - - - -src/app/features/messages/messages-routing.module.ts->src/app/features/messages/messages.component.ts - - - - - -src/app/features/messages/messages.component.spec.ts - - -messages.component.spec.ts - - - - - -src/app/features/messages/messages.component.spec.ts->src/app/features/messages/messages.component.ts - - - - - -src/app/features/missions/missions.component.ts - - -missions.component.ts - - - - - -src/app/features/missions/missions-routing.module.ts->src/app/features/missions/missions.component.ts - - - - - -src/app/features/missions/missions.component.spec.ts - - -missions.component.spec.ts - - - - - -src/app/features/missions/missions.component.spec.ts->src/app/features/missions/missions.component.ts - - - - - -src/app/features/news-feed/components/news-card/news-card.component.spec.ts - - -news-card.component.spec.ts - - - - - -src/app/features/news-feed/components/news-card/news-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - - - - -src/app/features/news-feed/components/news-card/news-card.component.spec.ts->src/app/features/news-feed/components/news-card/news-card.component.ts - - - - - -src/app/features/news-feed/components/news-list/news-list.component.spec.ts - - -news-list.component.spec.ts - - - - - -src/app/features/news-feed/components/news-list/news-list.component.spec.ts->src/app/features/news-feed/components/news-list/news-list.component.ts - - - - - -src/app/features/news-feed/components/news-list/news-list.component.ts->src/app/features/news-feed/models/INewsItem.ts - - - - - -src/app/features/news-feed/news-feed.component.ts - - -news-feed.component.ts - - - - - -src/app/features/news-feed/news-feed-routing.module.ts->src/app/features/news-feed/news-feed.component.ts - - - - - -src/app/features/news-feed/news-feed.component.spec.ts - - -news-feed.component.spec.ts - - - - - -src/app/features/news-feed/news-feed.component.spec.ts->src/app/features/news-feed/news-feed.component.ts - - - - - -src/app/features/privacy/privacy-routing.module.ts->src/app/features/privacy/privacy.component.ts - - - - - -src/app/features/privacy/privacy.component.spec.ts - - -privacy.component.spec.ts - - - - - -src/app/features/privacy/privacy.component.spec.ts->src/app/features/privacy/privacy.component.ts - - - - - -src/app/features/profile/components/post/post.component.spec.ts - - -post.component.spec.ts - - - - - -src/app/features/profile/components/post/post.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - - - - -src/app/features/profile/components/post/post.component.spec.ts->src/app/features/profile/components/post/post.component.ts - - - - - -src/app/features/profile/components/post/post.component.ts->src/app/core/services/translations.service.ts - - - - - -src/app/features/profile/components/post/post.component.ts->src/app/core/services/session-storage.service.ts - - - - - -src/app/features/profile/components/post/post.component.ts->src/app/core/models/person.model.ts - - - - - -src/app/features/profile/components/profile-card/profile-card.component.spec.ts - - -profile-card.component.spec.ts - - - - - -src/app/features/profile/components/profile-card/profile-card.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - - - - -src/app/features/profile/components/profile-card/profile-card.component.spec.ts->src/app/features/profile/components/profile-card/profile-card.component.ts - - - - - -src/app/features/profile/components/profile-list/profile-list.component.spec.ts - - -profile-list.component.spec.ts - - - - - -src/app/features/profile/components/profile-list/profile-list.component.spec.ts->src/app/features/profile/components/profile-list/profile-list.component.ts - - - - - -src/app/features/profile/components/profile-list/profile-list.component.ts->src/app/core/models/person.model.ts - - - - - -src/app/features/profile/profile.component.ts - - -profile.component.ts - - - - - -src/app/features/profile/profile-routing.module.ts->src/app/features/profile/profile.component.ts - - - - - -src/app/features/profile/profile.component.spec.ts - - -profile.component.spec.ts - - - - - -src/app/features/profile/profile.component.spec.ts->src/app/features/profile/profile.component.ts - - - - - -src/app/features/register/register-routing.module.ts->src/app/features/register/register.component.ts - - - - - -src/app/features/register/register.component.spec.ts - - -register.component.spec.ts - - - - - -src/app/features/register/register.component.spec.ts->src/app/features/register/register.component.ts - - - - - -src/app/features/search/search.component.ts - - -search.component.ts - - - - - -src/app/features/search/search-routing.module.ts->src/app/features/search/search.component.ts - - - - - -src/app/features/search/search.component.spec.ts - - -search.component.spec.ts - - - - - -src/app/features/search/search.component.spec.ts->src/app/features/search/search.component.ts - - - - - -src/app/features/settings/settings.component.ts - - -settings.component.ts - - - - - -src/app/features/settings/settings-routing.module.ts->src/app/features/settings/settings.component.ts - - - - - -src/app/features/settings/settings.component.spec.ts - - -settings.component.spec.ts - - - - - -src/app/features/settings/settings.component.spec.ts->src/app/features/settings/settings.component.ts - - - - - -src/app/features/splash/splash-routing.module.ts->src/app/features/splash/splash.component.ts - - - - - -src/app/features/splash/splash.component.spec.ts - - -splash.component.spec.ts - - - - - -src/app/features/splash/splash.component.spec.ts->src/app/features/splash/splash.component.ts - - - - - -src/app/features/stats/stats-routing.module.ts->src/app/features/stats/stats.component.ts - - - - - -src/app/features/stats/stats.component.spec.ts - - -stats.component.spec.ts - - - - - -src/app/features/stats/stats.component.spec.ts->src/app/features/stats/stats.component.ts - - - - - -src/app/features/terms/terms-routing.module.ts->src/app/features/terms/terms.component.ts - - - - - -src/app/features/terms/terms.component.spec.ts - - -terms.component.spec.ts - - - - - -src/app/features/terms/terms.component.spec.ts->src/app/features/terms/terms.component.ts - - - - - -src/app/features/the-wire/the-wire.component.ts - - -the-wire.component.ts - - - - - -src/app/features/the-wire/the-wire-routing.module.ts->src/app/features/the-wire/the-wire.component.ts - - - - - -src/app/features/the-wire/the-wire.component.spec.ts - - -the-wire.component.spec.ts - - - - - -src/app/features/the-wire/the-wire.component.spec.ts->src/app/features/the-wire/the-wire.component.ts - - - - - -src/app/shared/components/banner/banner.component.spec.ts - - -banner.component.spec.ts - - - - - -src/app/shared/components/banner/banner.component.spec.ts->src/app/shared/components/banner/banner.component.ts - - - - - -src/app/shared/components/blog-form/blog-form.component.spec.ts - - -blog-form.component.spec.ts - - - - - -src/app/shared/components/blog-form/blog-form.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - - - - -src/app/shared/components/blog-form/blog-form.component.spec.ts->src/app/shared/pipes/form-control/form-control.pipe.ts - - - - - -src/app/shared/components/blog-form/blog-form.component.spec.ts->src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.ts - - - - - -src/app/shared/components/blog-form/blog-form.component.spec.ts->src/app/shared/components/blog-form/blog-form.component.ts - - - - - -src/app/shared/components/blog-form/blog-form.component.ts->src/app/core/services/translations.service.ts - - - - - -src/app/shared/components/button/button.component.spec.ts - - -button.component.spec.ts - - - - - -src/app/shared/components/button/button.component.spec.ts->src/app/shared/components/button/button.component.ts - - - - - -src/app/shared/components/button/button.component.ts->src/app/shared/models/material-button-type.ts - - - - - -src/app/shared/components/button/button.component.ts->src/app/shared/models/tooltip-direction.ts - - - - - -src/app/shared/models/button-type.ts - - -button-type.ts - - - - - -src/app/shared/components/button/button.component.ts->src/app/shared/models/button-type.ts - - - - - -src/app/shared/models/material-color.ts - - -material-color.ts - - - - - -src/app/shared/components/button/button.component.ts->src/app/shared/models/material-color.ts - - - - - -src/app/shared/models/theme.ts - - -theme.ts - - - - - -src/app/shared/components/button/button.component.ts->src/app/shared/models/theme.ts - - - - - -src/app/shared/components/calendar-button/calendar-button.component.spec.ts - - -calendar-button.component.spec.ts - - - - - -src/app/shared/components/calendar-button/calendar-button.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - - - - -src/app/shared/components/calendar-button/calendar-button.component.spec.ts->src/app/shared/components/calendar-button/calendar-button.component.ts - - - - - -src/app/shared/components/calendar-button/calendar-button.component.ts->src/app/core/services/translations.service.ts - - - - - -src/app/shared/components/calendar-button/calendar-button.component.ts->src/app/shared/models/tooltip-direction.ts - - - - - -src/app/shared/components/editor/editor.component.spec.ts - - -editor.component.spec.ts - - - - - -src/app/shared/components/editor/editor.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - - - - -src/app/shared/components/editor/editor.component.spec.ts->src/app/shared/components/editor/editor.component.ts - - - - - -src/app/shared/components/editor/editor.component.ts->src/app/core/services/translations.service.ts - - - - - -src/app/shared/components/editor/editor.component.ts->src/app/shared/models/tooltip-direction.ts - - - - - -src/app/shared/components/editor/editor.component.ts->src/app/shared/factories/editor-config.factory.ts - - - - - -src/app/shared/factories/editor-config.factory.ts->src/app/core/services/translations.service.ts - - - - - -src/app/shared/components/event-form/event-form.component.spec.ts - - -event-form.component.spec.ts - - - - - -src/app/shared/components/event-form/event-form.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - - - - -src/app/shared/components/event-form/event-form.component.spec.ts->src/app/shared/pipes/form-control/form-control.pipe.ts - - - - - -src/app/shared/components/event-form/event-form.component.spec.ts->src/app/shared/components/event-form/event-form.component.ts - - - - - -src/app/shared/components/event-form/event-form.component.ts->src/app/core/services/translations.service.ts - - - - - -src/app/shared/components/file-select/file-select.component.spec.ts - - -file-select.component.spec.ts - - - - - -src/app/shared/components/file-select/file-select.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - - - - -src/app/shared/components/file-select/file-select.component.spec.ts->src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.ts - - - - - -src/app/shared/components/file-select/file-select.component.spec.ts->src/app/shared/components/file-select/file-select.component.ts - - - - - -src/app/shared/components/file-select/file-select.component.ts->src/app/core/services/translations.service.ts - - - - - -src/app/shared/components/file-select/file-select.component.ts->src/app/core/services/focus-tracking.service.ts - - - - - -src/app/shared/components/file-select/file-select.component.ts->src/app/shared/models/tooltip-direction.ts - - - - - -src/app/shared/components/file-select/file-select.component.ts->src/app/shared/models/theme.ts - - - - - -src/app/shared/components/footer/footer.component.spec.ts - - -footer.component.spec.ts - - - - - -src/app/shared/components/footer/footer.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - - - - -src/app/shared/components/footer/footer.component.spec.ts->src/app/shared/components/footer/footer.component.ts - - - - - -src/app/shared/components/footer/footer.component.ts->src/app/core/constants/routes.constants.ts - - - - - -src/app/shared/components/footer/footer.component.ts->src/app/core/services/translations.service.ts - - - - - -src/app/shared/components/forbidden/forbidden.component.spec.ts - - -forbidden.component.spec.ts - - - - - -src/app/shared/components/forbidden/forbidden.component.spec.ts->src/app/shared/components/forbidden/forbidden.component.ts - - - - - -src/app/shared/components/header/header.component.spec.ts - - -header.component.spec.ts - - - - - -src/app/shared/components/header/header.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - - - - -src/app/shared/components/header/header.component.spec.ts->src/app/shared/components/header/header.component.ts - - - - - -src/app/shared/components/header/header.component.ts->src/app/core/constants/routes.constants.ts - - - - - -src/app/shared/components/header/header.component.ts->src/app/core/services/translations.service.ts - - - - - -src/app/shared/components/header/header.component.ts->src/app/core/models/person.model.ts - - - - - -src/app/shared/components/header/header.component.ts->src/app/core/services/people.service.ts - - - - - -src/app/shared/components/header/header.component.ts->src/app/shared/models/material-button-type.ts - - - - - -src/app/shared/components/input/input.component.spec.ts - - -input.component.spec.ts - - - - - -src/app/shared/components/input/input.component.spec.ts->src/app/shared/components/input/input.component.ts - - - - - -src/app/shared/components/input/input.component.ts->src/app/core/services/translations.service.ts - - - - - -src/app/shared/components/input/input.component.ts->src/app/shared/models/material-button-type.ts - - - - - -src/app/shared/components/input/input.component.ts->src/app/shared/models/tooltip-direction.ts - - - - - -src/app/shared/components/input/input.component.ts->src/app/shared/models/input-type.ts - - - - - -src/app/shared/components/input/input.component.ts->src/app/shared/models/theme.ts - - - - - -src/app/shared/components/language-selector/language-selector.component.spec.ts - - -language-selector.component.spec.ts - - - - - -src/app/shared/components/language-selector/language-selector.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - - - - -src/app/shared/components/language-selector/language-selector.component.spec.ts->src/app/shared/components/language-selector/language-selector.component.ts - - - - - -src/app/shared/components/language-selector/language-selector.component.ts->src/app/core/services/translations.service.ts - - - - - -src/app/shared/components/language-selector/language-selector.component.ts->src/app/shared/models/material-button-type.ts - - - - - -src/app/shared/components/language-selector/language-selector.component.ts->src/app/shared/models/theme.ts - - - - - -src/app/shared/models/language.ts - - -language.ts - - - - - -src/app/shared/components/language-selector/language-selector.component.ts->src/app/shared/models/language.ts - - - - - -src/app/shared/components/list/list.component.spec.ts - - -list.component.spec.ts - - - - - -src/app/shared/components/list/list.component.spec.ts->src/app/shared/components/list/list.component.ts - - - - - -src/app/shared/components/list/list.component.ts->src/app/shared/models/card-size.ts - - - - - -src/app/shared/components/list/list.component.ts->src/app/core/interfaces/list-service.interface.ts - - - - - -src/app/shared/models/orientation.ts - - -orientation.ts - - - - - -src/app/shared/components/list/list.component.ts->src/app/shared/models/orientation.ts - - - - - -src/app/shared/components/not-found/not-found.component.spec.ts - - -not-found.component.spec.ts - - - - - -src/app/shared/components/not-found/not-found.component.spec.ts->src/app/shared/components/not-found/not-found.component.ts - - - - - -src/app/shared/components/page-title/page-title.component.spec.ts - - -page-title.component.spec.ts - - - - - -src/app/shared/components/page-title/page-title.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - - - - -src/app/shared/components/page-title/page-title.component.spec.ts->src/app/shared/components/page-title/page-title.component.ts - - - - - -src/app/shared/components/poll-form/poll-form.component.spec.ts - - -poll-form.component.spec.ts - - - - - -src/app/shared/components/poll-form/poll-form.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - - - - -src/app/shared/components/poll-form/poll-form.component.spec.ts->src/app/shared/pipes/form-control/form-control.pipe.ts - - - - - -src/app/shared/components/poll-form/poll-form.component.spec.ts->src/app/shared/components/poll-form/poll-form.component.ts - - - - - -src/app/shared/components/poll-form/poll-form.component.ts->src/app/core/services/translations.service.ts - - - - - -src/app/shared/components/poll-form/poll-form.component.ts->src/app/shared/models/tooltip-direction.ts - - - - - -src/app/shared/components/post-form/post-form.component.spec.ts - - -post-form.component.spec.ts - - - - - -src/app/shared/components/post-form/post-form.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - - - - -src/app/shared/components/post-form/post-form.component.spec.ts->src/app/shared/pipes/form-control/form-control.pipe.ts - - - - - -src/app/shared/components/post-form/post-form.component.spec.ts->src/app/shared/components/post-form/post-form.component.ts - - - - - -src/app/shared/components/post-form/post-form.component.ts->src/app/core/services/translations.service.ts - - - - - -src/app/shared/components/profile-pic/profile-pic.component.spec.ts - - -profile-pic.component.spec.ts - - - - - -src/app/shared/components/profile-pic/profile-pic.component.spec.ts->src/app/core/helpers/typescript-loader.ts - - - - - -src/app/shared/components/profile-pic/profile-pic.component.spec.ts->src/app/shared/components/profile-pic/profile-pic.component.ts - - - - - -src/app/shared/components/profile-pic/profile-pic.component.ts->src/app/core/constants/routes.constants.ts - - - - - -src/app/shared/components/profile-pic/profile-pic.component.ts->src/app/core/services/translations.service.ts - - - - - -src/app/shared/components/profile-pic/profile-pic.component.ts->src/app/core/models/person.model.ts - - - - - -src/app/shared/components/unauthorized/unauthorized.component.spec.ts - - -unauthorized.component.spec.ts - - - - - -src/app/shared/components/unauthorized/unauthorized.component.spec.ts->src/app/shared/components/unauthorized/unauthorized.component.ts - - - - - -src/app/shared/pipes/form-control/form-control.pipe.spec.ts - - -form-control.pipe.spec.ts - - - - - -src/app/shared/pipes/form-control/form-control.pipe.spec.ts->src/app/shared/pipes/form-control/form-control.pipe.ts - - - - - -src/app/shared/pipes/form-group/form-group.pipe.spec.ts - - -form-group.pipe.spec.ts - - - - - -src/app/shared/pipes/form-group/form-group.pipe.spec.ts->src/app/shared/pipes/form-group/form-group.pipe.ts - - - - - -src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.spec.ts - - -truncate-file-name.pipe.spec.ts - - - - - -src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.spec.ts->src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.ts - - - - - -src/assets/i18n/translations.fr.ts - - -translations.fr.ts - - - - - -src/assets/i18n/translations.fr.ts->src/assets/i18n/translations.en.ts - - - - - -src/environments/environment.pr.ts - - -environment.pr.ts - - - - - -src/environments/environment.prod.ts - - -environment.prod.ts - - - - - -src/main.ts - - -main.ts - - - - - -src/main.ts->src/app/app.module.ts - - - - - -src/main.ts->src/environments/environment.ts - - - - - -src/polyfills.ts - - -polyfills.ts - - - - - -src/test.ts - - -test.ts +src/scripts/nodeSyncWorkflows.js + + +nodeSyncWorkflows.js From 48f6cc9af2af5b8b366937318a2319f4154b7df7 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Wed, 17 Jan 2024 11:53:21 -0500 Subject: [PATCH 118/165] add eslint to the project setup workflow to run lint when pr open/reopen/sync on main --- .eslintrc.json | 47 + .github/workflows/lint.yml | 26 + angular.json | 14 +- package-lock.json | 4353 ++++++++++++++++- package.json | 11 +- src/app/app-routing.module.ts | 2 +- src/app/app.component.spec.ts | 16 +- src/app/app.component.ts | 12 +- src/app/core/guards/interceptor.guard.ts | 2 +- src/app/core/guards/redirect.guard.ts | 2 +- src/app/core/helpers/typescript-loader.ts | 2 +- .../interfaces/card-component.interface.ts | 1 + src/scripts/nodeSyncWorkflows.js | 1 + 13 files changed, 4227 insertions(+), 262 deletions(-) create mode 100644 .eslintrc.json create mode 100644 .github/workflows/lint.yml diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 00000000..db226e9d --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,47 @@ +{ + "root": true, + "ignorePatterns": [ + "projects/**/*" + ], + "overrides": [ + { + "files": [ + "*.ts" + ], + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:@angular-eslint/recommended", + "plugin:@angular-eslint/template/process-inline-templates" + ], + "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": [ + "plugin:@angular-eslint/template/recommended", + "plugin:@angular-eslint/template/accessibility" + ], + "rules": {} + } + ] +} diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 00000000..fca708af --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,26 @@ +name: Lint + +on: + pull_request: + types: [opened, reopened, synchronize] + branches: main + +env: + NODE_VERSION: '18.13.0' + +jobs: + lint: + name: Run code linter + runs-on: windows-latest + steps: + - uses: actions/checkout@v3 + - name: Use Node.js ${{ env.NODE_VERSION }} + uses: actions/setup-node@v1 + with: + node-version: ${{ env.NODE_VERSION }} + + - name: Install + run: npm install + + - name: Lint + run: npm run ng lint \ No newline at end of file diff --git a/angular.json b/angular.json index 2bc01076..c4457a10 100644 --- a/angular.json +++ b/angular.json @@ -139,11 +139,23 @@ ], "scripts": [] } + }, + "lint": { + "builder": "@angular-eslint/builder:lint", + "options": { + "lintFilePatterns": [ + "src/**/*.ts", + "src/**/*.html" + ] + } } } } }, "cli": { - "analytics": false + "analytics": false, + "schematicCollections": [ + "@angular-eslint/schematics" + ] } } diff --git a/package-lock.json b/package-lock.json index 740cf69a..24e74446 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,10 +32,18 @@ }, "devDependencies": { "@angular-devkit/build-angular": "^17.0.9", + "@angular-eslint/builder": "17.2.0", + "@angular-eslint/eslint-plugin": "17.2.0", + "@angular-eslint/eslint-plugin-template": "17.2.0", + "@angular-eslint/schematics": "17.2.0", + "@angular-eslint/template-parser": "17.2.0", "@angular/cli": "~17.0.9", "@angular/compiler-cli": "^17.0.8", "@types/jasmine": "~4.0.0", + "@typescript-eslint/eslint-plugin": "6.18.0", + "@typescript-eslint/parser": "6.18.0", "dependency-cruiser": "^12.10.1", + "eslint": "^8.56.0", "jasmine-core": "~4.3.0", "karma": "~6.4.0", "karma-chrome-launcher": "~3.1.0", @@ -45,6 +53,15 @@ "typescript": "~5.2.0" } }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@ampproject/remapping": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", @@ -762,6 +779,150 @@ "tslib": "^2.1.0" } }, + "node_modules/@angular-eslint/builder": { + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-17.2.0.tgz", + "integrity": "sha512-xPxgCTPcnFRT8OYs9R5UZVAtzVouIIfdMOqTcB847Cev4H8kqRz0gO5aqkQiL+0erwnLf8D4nRzMTJjSBpQQNw==", + "dev": true, + "dependencies": { + "@nx/devkit": "17.2.8", + "nx": "17.2.8" + }, + "peerDependencies": { + "eslint": "^7.20.0 || ^8.0.0", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/bundled-angular-compiler": { + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-17.2.0.tgz", + "integrity": "sha512-uBvPbPE2JxqpdLs//Nd5+TRLgjxDxvTYgmGFTKI9Eo98krqps+rhSQCRSHWACukzc25X3Q4ITHfvjODQL8qQkg==", + "dev": true + }, + "node_modules/@angular-eslint/eslint-plugin": { + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-17.2.0.tgz", + "integrity": "sha512-8A3hD/11N6QEchsAGggTPmNsa0GS5p44t930slMsxrTvdSlKAo56FzVdxwSkOcejKIJs57oWxoKvtK4UyLYkeA==", + "dev": true, + "dependencies": { + "@angular-eslint/utils": "17.2.0", + "@typescript-eslint/utils": "6.18.0" + }, + "peerDependencies": { + "eslint": "^7.20.0 || ^8.0.0", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/eslint-plugin-template": { + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-17.2.0.tgz", + "integrity": "sha512-CkcAOWWqNwX0FXeLwJu0Vctso8q/NPHJ95R2Cy8hjwuMyFF83/vDouyeIjYC+SRv6hbevmNa+BbdYXhQZinIHw==", + "dev": true, + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "17.2.0", + "@angular-eslint/utils": "17.2.0", + "@typescript-eslint/type-utils": "6.18.0", + "@typescript-eslint/utils": "6.18.0", + "aria-query": "5.3.0", + "axobject-query": "4.0.0" + }, + "peerDependencies": { + "eslint": "^7.20.0 || ^8.0.0", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/schematics": { + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-17.2.0.tgz", + "integrity": "sha512-lV2+2H3Hf6FCJfM+cddJ/7ss3qc99OO2wuvTjGNH512mP75tvfLakV+e6TFFdzK0km+ceXvB2VqNXMSShB4PVQ==", + "dev": true, + "dependencies": { + "@angular-eslint/eslint-plugin": "17.2.0", + "@angular-eslint/eslint-plugin-template": "17.2.0", + "@nx/devkit": "17.2.8", + "ignore": "5.3.0", + "nx": "17.2.8", + "strip-json-comments": "3.1.1", + "tmp": "0.2.1" + }, + "peerDependencies": { + "@angular/cli": ">= 17.0.0 < 18.0.0" + } + }, + "node_modules/@angular-eslint/schematics/node_modules/ignore": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@angular-eslint/schematics/node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/@angular-eslint/template-parser": { + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-17.2.0.tgz", + "integrity": "sha512-Js9w1IXWPvXEjd05bWkZzRaLw0g0mJPztAWOj3DiU7H9LKkautQq0zZu02cAAnXZim2CsAagEh2GmGjhaYvoKg==", + "dev": true, + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "17.2.0", + "eslint-scope": "^8.0.0" + }, + "peerDependencies": { + "eslint": "^7.20.0 || ^8.0.0", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/template-parser/node_modules/eslint-scope": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.0.tgz", + "integrity": "sha512-zj3Byw6jX4TcFCJmxOzLt6iol5FAr9xQyZZSQjEzW2UiCJXLwXdRIKCYVFftnpZckaC9Ps9xlC7jB8tSeWWOaw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@angular-eslint/template-parser/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@angular-eslint/utils": { + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-17.2.0.tgz", + "integrity": "sha512-J7DsFKb5yxv8te8LQvChNn6MBvKulcBx+jtHX1uen+uuuv8XhZuVMZXS0rolUkdl1Q0mBeHpkuO2q6Vh17pqbQ==", + "dev": true, + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "17.2.0", + "@typescript-eslint/utils": "6.18.0" + }, + "peerDependencies": { + "eslint": "^7.20.0 || ^8.0.0", + "typescript": "*" + } + }, "node_modules/@angular/animations": { "version": "17.0.8", "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.0.8.tgz", @@ -3202,6 +3363,151 @@ "node": ">=12" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.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" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "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" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/@fastify/busboy": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz", @@ -3224,6 +3530,61 @@ "@floating-ui/core": "^1.2.0" } }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "dev": true + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -3345,6 +3706,18 @@ "node": ">=8" } }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -4423,49 +4796,261 @@ "node": "^16.13.0 || >=18.0.0" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "node_modules/@nrwl/devkit": { + "version": "17.2.8", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-17.2.8.tgz", + "integrity": "sha512-l2dFy5LkWqSA45s6pee6CoqJeluH+sjRdVnAAQfjLHRNSx6mFAKblyzq5h1f4P0EUCVVVqLs+kVqmNx5zxYqvw==", "dev": true, - "optional": true, - "engines": { - "node": ">=14" + "dependencies": { + "@nx/devkit": "17.2.8" } }, - "node_modules/@schematics/angular": { - "version": "17.0.9", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.0.9.tgz", - "integrity": "sha512-XPaHAhobxdQMswH8wSrfToKN7wmGJFh/K5jq/3J+78KeSBZStYxZkVIQbvJkSU8Y1MsdVaeMYKDE8rjFN83OYA==", + "node_modules/@nrwl/tao": { + "version": "17.2.8", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-17.2.8.tgz", + "integrity": "sha512-Qpk5YKeJ+LppPL/wtoDyNGbJs2MsTi6qyX/RdRrEc8lc4bk6Cw3Oul1qTXCI6jT0KzTz+dZtd0zYD/G7okkzvg==", "dev": true, "dependencies": { - "@angular-devkit/core": "17.0.9", - "@angular-devkit/schematics": "17.0.9", - "jsonc-parser": "3.2.0" + "nx": "17.2.8", + "tslib": "^2.3.0" }, - "engines": { - "node": "^18.13.0 || >=20.9.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" + "bin": { + "tao": "index.js" } }, - "node_modules/@sigstore/bundle": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.1.0.tgz", - "integrity": "sha512-89uOo6yh/oxaU8AeOUnVrTdVMcGk9Q1hJa7Hkvalc6G3Z3CupWk4Xe9djSgJm9fMkH69s0P0cVHUoKSOemLdng==", + "node_modules/@nx/devkit": { + "version": "17.2.8", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-17.2.8.tgz", + "integrity": "sha512-6LtiQihtZwqz4hSrtT5cCG5XMCWppG6/B8c1kNksg97JuomELlWyUyVF+sxmeERkcLYFaKPTZytP0L3dmCFXaw==", "dev": true, "dependencies": { - "@sigstore/protobuf-specs": "^0.2.1" + "@nrwl/devkit": "17.2.8", + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "ignore": "^5.0.4", + "semver": "7.5.3", + "tmp": "~0.2.1", + "tslib": "^2.3.0" }, - "engines": { - "node": "^16.14.0 || >=18.0.0" + "peerDependencies": { + "nx": ">= 16 <= 18" } }, - "node_modules/@sigstore/protobuf-specs": { + "node_modules/@nx/devkit/node_modules/tmp": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz", - "integrity": "sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==", - "dev": true, + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/@nx/nx-darwin-arm64": { + "version": "17.2.8", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-17.2.8.tgz", + "integrity": "sha512-dMb0uxug4hM7tusISAU1TfkDK3ixYmzc1zhHSZwpR7yKJIyKLtUpBTbryt8nyso37AS1yH+dmfh2Fj2WxfBHTg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-darwin-x64": { + "version": "17.2.8", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-17.2.8.tgz", + "integrity": "sha512-0cXzp1tGr7/6lJel102QiLA4NkaLCkQJj6VzwbwuvmuCDxPbpmbz7HC1tUteijKBtOcdXit1/MEoEU007To8Bw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-freebsd-x64": { + "version": "17.2.8", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-17.2.8.tgz", + "integrity": "sha512-YFMgx5Qpp2btCgvaniDGdu7Ctj56bfFvbbaHQWmOeBPK1krNDp2mqp8HK6ZKOfEuDJGOYAp7HDtCLvdZKvJxzA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm-gnueabihf": { + "version": "17.2.8", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-17.2.8.tgz", + "integrity": "sha512-iN2my6MrhLRkVDtdivQHugK8YmR7URo1wU9UDuHQ55z3tEcny7LV3W9NSsY9UYPK/FrxdDfevj0r2hgSSdhnzA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm64-gnu": { + "version": "17.2.8", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-17.2.8.tgz", + "integrity": "sha512-Iy8BjoW6mOKrSMiTGujUcNdv+xSM1DALTH6y3iLvNDkGbjGK1Re6QNnJAzqcXyDpv32Q4Fc57PmuexyysZxIGg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm64-musl": { + "version": "17.2.8", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-17.2.8.tgz", + "integrity": "sha512-9wkAxWzknjpzdofL1xjtU6qPFF1PHlvKCZI3hgEYJDo4mQiatGI+7Ttko+lx/ZMP6v4+Umjtgq7+qWrApeKamQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-x64-gnu": { + "version": "17.2.8", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-17.2.8.tgz", + "integrity": "sha512-sjG1bwGsjLxToasZ3lShildFsF0eyeGu+pOQZIp9+gjFbeIkd19cTlCnHrOV9hoF364GuKSXQyUlwtFYFR4VTQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-x64-musl": { + "version": "17.2.8", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-17.2.8.tgz", + "integrity": "sha512-QiakXZ1xBCIptmkGEouLHQbcM4klQkcr+kEaz2PlNwy/sW3gH1b/1c0Ed5J1AN9xgQxWspriAONpScYBRgxdhA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-win32-arm64-msvc": { + "version": "17.2.8", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-17.2.8.tgz", + "integrity": "sha512-XBWUY/F/GU3vKN9CAxeI15gM4kr3GOBqnzFZzoZC4qJt2hKSSUEWsMgeZtsMgeqEClbi4ZyCCkY7YJgU32WUGA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-win32-x64-msvc": { + "version": "17.2.8", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-17.2.8.tgz", + "integrity": "sha512-HTqDv+JThlLzbcEm/3f+LbS5/wYQWzb5YDXbP1wi7nlCTihNZOLNqGOkEmwlrR5tAdNHPRpHSmkYg4305W0CtA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@schematics/angular": { + "version": "17.0.9", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.0.9.tgz", + "integrity": "sha512-XPaHAhobxdQMswH8wSrfToKN7wmGJFh/K5jq/3J+78KeSBZStYxZkVIQbvJkSU8Y1MsdVaeMYKDE8rjFN83OYA==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "17.0.9", + "@angular-devkit/schematics": "17.0.9", + "jsonc-parser": "3.2.0" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@sigstore/bundle": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.1.0.tgz", + "integrity": "sha512-89uOo6yh/oxaU8AeOUnVrTdVMcGk9Q1hJa7Hkvalc6G3Z3CupWk4Xe9djSgJm9fMkH69s0P0cVHUoKSOemLdng==", + "dev": true, + "dependencies": { + "@sigstore/protobuf-specs": "^0.2.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/protobuf-specs": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz", + "integrity": "sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==", + "dev": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -4497,6 +5082,12 @@ "node": "^16.14.0 || >=18.0.0" } }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, "node_modules/@socket.io/component-emitter": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", @@ -4647,9 +5238,9 @@ "dev": true }, "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, "node_modules/@types/mime": { @@ -4691,6 +5282,12 @@ "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", "dev": true }, + "node_modules/@types/semver": { + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", + "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", + "dev": true + }, "node_modules/@types/send": { "version": "0.17.4", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", @@ -4739,73 +5336,379 @@ "@types/node": "*" } }, - "node_modules/@vitejs/plugin-basic-ssl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.0.1.tgz", - "integrity": "sha512-pcub+YbFtFhaGRTo1832FQHQSHvMrlb43974e2eS8EKleR3p1cDdkJFPci1UhwkEf1J9Bz+wKBSzqpKp7nNj2A==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.18.0.tgz", + "integrity": "sha512-3lqEvQUdCozi6d1mddWqd+kf8KxmGq2Plzx36BlkjuQe3rSTm/O98cLf0A4uDO+a5N1KD2SeEEl6fW97YHY+6w==", "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.18.0", + "@typescript-eslint/type-utils": "6.18.0", + "@typescript-eslint/utils": "6.18.0", + "@typescript-eslint/visitor-keys": "6.18.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, "engines": { - "node": ">=14.6.0" + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0" + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "node_modules/@typescript-eslint/parser": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.18.0.tgz", + "integrity": "sha512-v6uR68SFvqhNQT41frCMCQpsP+5vySy6IdgjlzUWoo7ALCnpaWYcz/Ij2k4L8cEsL0wkvOviCMpjmtRtHNOKzA==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" + "@typescript-eslint/scope-manager": "6.18.0", + "@typescript-eslint/types": "6.18.0", + "@typescript-eslint/typescript-estree": "6.18.0", + "@typescript-eslint/visitor-keys": "6.18.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.18.0.tgz", + "integrity": "sha512-o/UoDT2NgOJ2VfHpfr+KBY2ErWvCySNUIX/X7O9g8Zzt/tXdpfEU43qbNk8LVuWUT2E0ptzTWXh79i74PP0twA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.18.0", + "@typescript-eslint/visitor-keys": "6.18.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.18.0.tgz", + "integrity": "sha512-ZeMtrXnGmTcHciJN1+u2CigWEEXgy1ufoxtWcHORt5kGvpjjIlK9MUhzHm4RM8iVy6dqSaZA/6PVkX6+r+ChjQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.18.0", + "@typescript-eslint/utils": "6.18.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.18.0.tgz", + "integrity": "sha512-/RFVIccwkwSdW/1zeMx3hADShWbgBxBnV/qSrex6607isYjj05t36P6LyONgqdUrNLl5TYU8NIKdHUYpFvExkA==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.18.0.tgz", + "integrity": "sha512-klNvl+Ql4NsBNGB4W9TZ2Od03lm7aGvTbs0wYaFYsplVPhr+oeXjlPZCDI4U9jgJIDK38W1FKhacCFzCC+nbIg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.18.0", + "@typescript-eslint/visitor-keys": "6.18.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.18.0.tgz", + "integrity": "sha512-wiKKCbUeDPGaYEYQh1S580dGxJ/V9HI7K5sbGAVklyf+o5g3O+adnS4UNJajplF4e7z2q0uVBaTdT/yLb4XAVA==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.18.0", + "@typescript-eslint/types": "6.18.0", + "@typescript-eslint/typescript-estree": "6.18.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.18.0.tgz", + "integrity": "sha512-1wetAlSZpewRDb2h9p/Q8kRjdGuqdTAQbkJIOUMLug2LBLG+QOjiWoSj6/3B/hA9/tVTFFdtiKvAYoYnSRW/RA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.18.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@vitejs/plugin-basic-ssl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.0.1.tgz", + "integrity": "sha512-pcub+YbFtFhaGRTo1832FQHQSHvMrlb43974e2eS8EKleR3p1cDdkJFPci1UhwkEf1J9Bz+wKBSzqpKp7nNj2A==", + "dev": true, + "engines": { + "node": ">=14.6.0" + }, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" } }, "node_modules/@webassemblyjs/ieee754": { @@ -4915,6 +5818,37 @@ "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", "dev": true }, + "node_modules/@yarnpkg/parsers": { + "version": "3.0.0-rc.46", + "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.0-rc.46.tgz", + "integrity": "sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==", + "dev": true, + "dependencies": { + "js-yaml": "^3.10.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.15.0" + } + }, + "node_modules/@zkochan/js-yaml": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.6.tgz", + "integrity": "sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@zkochan/js-yaml/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "node_modules/abab": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", @@ -5191,12 +6125,30 @@ "sprintf-js": "~1.0.2" } }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/async": { "version": "2.6.4", "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", @@ -5215,6 +6167,12 @@ "node": ">=0.8.0" } }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, "node_modules/autoprefixer": { "version": "10.4.16", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", @@ -5261,6 +6219,15 @@ "follow-redirects": "^1.14.0" } }, + "node_modules/axobject-query": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.0.0.tgz", + "integrity": "sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==", + "dev": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, "node_modules/babel-loader": { "version": "9.1.3", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", @@ -6161,6 +7128,18 @@ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -6656,6 +7635,12 @@ } } }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, "node_modules/default-gateway": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", @@ -6689,6 +7674,15 @@ "node": ">=8" } }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -6866,6 +7860,15 @@ "node": ">=8" } }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", @@ -6900,6 +7903,15 @@ "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", "dev": true }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -6924,6 +7936,18 @@ "node": ">=6" } }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/dom-serialize": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", @@ -6991,6 +8015,33 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, + "node_modules/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "node_modules/dotenv-expand": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz", + "integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -7097,6 +8148,21 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "dev": true }, + "node_modules/ejs": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "dev": true, + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/electron-to-chromium": { "version": "1.4.626", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.626.tgz", @@ -7150,6 +8216,15 @@ "node": ">=0.10.0" } }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, "node_modules/engine.io": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.0.tgz", @@ -7236,6 +8311,18 @@ "node": ">=10.13.0" } }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/ent": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", @@ -7367,20 +8454,397 @@ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "engines": { - "node": ">=0.8.0" + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.56.0", + "@humanwhocodes/config-array": "^0.11.13", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "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" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": ">=8.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" } }, "node_modules/esprima": { @@ -7396,6 +8860,27 @@ "node": ">=4" } }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -7692,6 +9177,12 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, "node_modules/fastq": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", @@ -7728,6 +9219,39 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -7823,16 +9347,30 @@ "flat": "cli.js" } }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", "dev": true, "funding": [ { @@ -7877,6 +9415,20 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -7908,6 +9460,12 @@ "node": ">= 0.6" } }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, "node_modules/fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -8120,6 +9678,12 @@ "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, "node_modules/handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", @@ -9103,11 +10667,221 @@ "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/jasmine-core": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.3.0.tgz", - "integrity": "sha512-qybtBUesniQdW6n+QIHMng2vDOHscIC/dEXjW+JzO9+LoAZMb03RCUC5xFOv/btSKPm1xL42fn+RjlU4oB42Lg==", - "dev": true + "node_modules/jake": { + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "dev": true, + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jake/node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", + "dev": true + }, + "node_modules/jake/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/jake/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jake/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jake/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jake/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jake/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jake/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jasmine-core": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.3.0.tgz", + "integrity": "sha512-qybtBUesniQdW6n+QIHMng2vDOHscIC/dEXjW+JzO9+LoAZMb03RCUC5xFOv/btSKPm1xL42fn+RjlU4oB42Lg==", + "dev": true + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-diff/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-diff/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-diff/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-diff/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } }, "node_modules/jest-worker": { "version": "27.5.1", @@ -9187,6 +10961,12 @@ "node": ">=4" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -9199,6 +10979,12 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -9458,6 +11244,15 @@ "node": ">=10" } }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -9588,6 +11383,19 @@ "node": ">=0.10.0" } }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/license-webpack-plugin": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", @@ -9727,6 +11535,12 @@ "integrity": "sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==", "dev": true }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -10316,6 +12130,12 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, "node_modules/needle": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz", @@ -10521,6 +12341,12 @@ "node": "^16.13.0 || >=18.0.0" } }, + "node_modules/node-machine-id": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/node-machine-id/-/node-machine-id-1.1.12.tgz", + "integrity": "sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==", + "dev": true + }, "node_modules/node-releases": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", @@ -10596,100 +12422,391 @@ "semver": "^7.1.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.1.tgz", + "integrity": "sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==", + "dev": true, + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-packlist": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-8.0.2.tgz", + "integrity": "sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==", + "dev": true, + "dependencies": { + "ignore-walk": "^6.0.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-pick-manifest": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.0.0.tgz", + "integrity": "sha512-VfvRSs/b6n9ol4Qb+bDwNGUXutpy76x6MARw/XssevE0TnctIKcmklJZM5Z7nqs5z5aW+0S63pgCNbpkUNNXBg==", + "dev": true, + "dependencies": { + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^11.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-registry-fetch": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-16.1.0.tgz", + "integrity": "sha512-PQCELXKt8Azvxnt5Y85GseQDJJlglTFM9L9U9gkv2y4e9s0k3GVDdOx3YoB6gm2Do0hlkzC39iCGXby+Wve1Bw==", + "dev": true, + "dependencies": { + "make-fetch-happen": "^13.0.0", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^11.0.0", + "proc-log": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nx": { + "version": "17.2.8", + "resolved": "https://registry.npmjs.org/nx/-/nx-17.2.8.tgz", + "integrity": "sha512-rM5zXbuXLEuqQqcjVjClyvHwRJwt+NVImR2A6KFNG40Z60HP6X12wAxxeLHF5kXXTDRU0PFhf/yACibrpbPrAw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@nrwl/tao": "17.2.8", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "3.0.0-rc.46", + "@zkochan/js-yaml": "0.0.6", + "axios": "^1.5.1", + "chalk": "^4.1.0", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^8.0.1", + "dotenv": "~16.3.1", + "dotenv-expand": "~10.0.0", + "enquirer": "~2.3.6", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^11.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "jest-diff": "^29.4.1", + "js-yaml": "4.1.0", + "jsonc-parser": "3.2.0", + "lines-and-columns": "~2.0.3", + "minimatch": "3.0.5", + "node-machine-id": "1.1.12", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "semver": "7.5.3", + "string-width": "^4.2.3", + "strong-log-transformer": "^2.1.0", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "bin": { + "nx": "bin/nx.js", + "nx-cloud": "bin/nx-cloud.js" + }, + "optionalDependencies": { + "@nx/nx-darwin-arm64": "17.2.8", + "@nx/nx-darwin-x64": "17.2.8", + "@nx/nx-freebsd-x64": "17.2.8", + "@nx/nx-linux-arm-gnueabihf": "17.2.8", + "@nx/nx-linux-arm64-gnu": "17.2.8", + "@nx/nx-linux-arm64-musl": "17.2.8", + "@nx/nx-linux-x64-gnu": "17.2.8", + "@nx/nx-linux-x64-musl": "17.2.8", + "@nx/nx-win32-arm64-msvc": "17.2.8", + "@nx/nx-win32-x64-msvc": "17.2.8" + }, + "peerDependencies": { + "@swc-node/register": "^1.6.7", + "@swc/core": "^1.3.85" + }, + "peerDependenciesMeta": { + "@swc-node/register": { + "optional": true + }, + "@swc/core": { + "optional": true + } + } + }, + "node_modules/nx/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/nx/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/nx/node_modules/axios": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.5.tgz", + "integrity": "sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==", + "dev": true, + "dependencies": { + "follow-redirects": "^1.15.4", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/nx/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/nx/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/nx/node_modules/cli-spinners": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nx/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/nx/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/nx/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/nx/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/nx/node_modules/glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" } }, - "node_modules/npm-normalize-package-bin": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", - "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "node_modules/nx/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/npm-package-arg": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.1.tgz", - "integrity": "sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==", + "node_modules/nx/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "dependencies": { - "hosted-git-info": "^7.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" + "argparse": "^2.0.1" }, - "engines": { - "node": "^16.14.0 || >=18.0.0" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/npm-packlist": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-8.0.2.tgz", - "integrity": "sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==", + "node_modules/nx/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, "dependencies": { - "ignore-walk": "^6.0.4" + "universalify": "^2.0.0" }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/npm-pick-manifest": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.0.0.tgz", - "integrity": "sha512-VfvRSs/b6n9ol4Qb+bDwNGUXutpy76x6MARw/XssevE0TnctIKcmklJZM5Z7nqs5z5aW+0S63pgCNbpkUNNXBg==", + "node_modules/nx/node_modules/lines-and-columns": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", + "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", "dev": true, - "dependencies": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^11.0.0", - "semver": "^7.3.5" - }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/npm-registry-fetch": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-16.1.0.tgz", - "integrity": "sha512-PQCELXKt8Azvxnt5Y85GseQDJJlglTFM9L9U9gkv2y4e9s0k3GVDdOx3YoB6gm2Do0hlkzC39iCGXby+Wve1Bw==", + "node_modules/nx/node_modules/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", "dev": true, "dependencies": { - "make-fetch-happen": "^13.0.0", - "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^11.0.0", - "proc-log": "^3.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "*" } }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "node_modules/nx/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "path-key": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "node_modules/nx/node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", "dev": true, "dependencies": { - "boolbase": "^1.0.0" + "rimraf": "^3.0.0" }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/nx/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" } }, "node_modules/object-assign": { @@ -10805,6 +12922,23 @@ "node": ">=4" } }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/ora": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", @@ -11474,6 +13608,15 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/pretty-bytes": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", @@ -11486,6 +13629,32 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/proc-log": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", @@ -11639,6 +13808,12 @@ "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, "node_modules/prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", @@ -11732,6 +13907,12 @@ "node": ">= 0.8" } }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, "node_modules/read-package-json": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-7.0.0.tgz", @@ -12354,9 +14535,9 @@ } }, "node_modules/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -13073,6 +15254,35 @@ "node": ">=6" } }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strong-log-transformer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", + "integrity": "sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==", + "dev": true, + "dependencies": { + "duplexer": "^0.1.1", + "minimist": "^1.2.0", + "through": "^2.3.4" + }, + "bin": { + "sl-log-transformer": "bin/sl-log-transformer.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -13132,6 +15342,22 @@ "node": ">=10" } }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/tar/node_modules/fs-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", @@ -13334,6 +15560,12 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", @@ -13391,6 +15623,18 @@ "tree-kill": "cli.js" } }, + "node_modules/ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/tsconfig-paths": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.1.2.tgz", @@ -13508,6 +15752,18 @@ "node": "^16.14.0 || >=18.0.0" } }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/type-fest": { "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", @@ -14451,6 +16707,12 @@ } }, "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true + }, "@ampproject/remapping": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", @@ -14859,6 +17121,116 @@ } } }, + "@angular-eslint/builder": { + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-17.2.0.tgz", + "integrity": "sha512-xPxgCTPcnFRT8OYs9R5UZVAtzVouIIfdMOqTcB847Cev4H8kqRz0gO5aqkQiL+0erwnLf8D4nRzMTJjSBpQQNw==", + "dev": true, + "requires": { + "@nx/devkit": "17.2.8", + "nx": "17.2.8" + } + }, + "@angular-eslint/bundled-angular-compiler": { + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-17.2.0.tgz", + "integrity": "sha512-uBvPbPE2JxqpdLs//Nd5+TRLgjxDxvTYgmGFTKI9Eo98krqps+rhSQCRSHWACukzc25X3Q4ITHfvjODQL8qQkg==", + "dev": true + }, + "@angular-eslint/eslint-plugin": { + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-17.2.0.tgz", + "integrity": "sha512-8A3hD/11N6QEchsAGggTPmNsa0GS5p44t930slMsxrTvdSlKAo56FzVdxwSkOcejKIJs57oWxoKvtK4UyLYkeA==", + "dev": true, + "requires": { + "@angular-eslint/utils": "17.2.0", + "@typescript-eslint/utils": "6.18.0" + } + }, + "@angular-eslint/eslint-plugin-template": { + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-17.2.0.tgz", + "integrity": "sha512-CkcAOWWqNwX0FXeLwJu0Vctso8q/NPHJ95R2Cy8hjwuMyFF83/vDouyeIjYC+SRv6hbevmNa+BbdYXhQZinIHw==", + "dev": true, + "requires": { + "@angular-eslint/bundled-angular-compiler": "17.2.0", + "@angular-eslint/utils": "17.2.0", + "@typescript-eslint/type-utils": "6.18.0", + "@typescript-eslint/utils": "6.18.0", + "aria-query": "5.3.0", + "axobject-query": "4.0.0" + } + }, + "@angular-eslint/schematics": { + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-17.2.0.tgz", + "integrity": "sha512-lV2+2H3Hf6FCJfM+cddJ/7ss3qc99OO2wuvTjGNH512mP75tvfLakV+e6TFFdzK0km+ceXvB2VqNXMSShB4PVQ==", + "dev": true, + "requires": { + "@angular-eslint/eslint-plugin": "17.2.0", + "@angular-eslint/eslint-plugin-template": "17.2.0", + "@nx/devkit": "17.2.8", + "ignore": "5.3.0", + "nx": "17.2.8", + "strip-json-comments": "3.1.1", + "tmp": "0.2.1" + }, + "dependencies": { + "ignore": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "dev": true + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + } + } + } + }, + "@angular-eslint/template-parser": { + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-17.2.0.tgz", + "integrity": "sha512-Js9w1IXWPvXEjd05bWkZzRaLw0g0mJPztAWOj3DiU7H9LKkautQq0zZu02cAAnXZim2CsAagEh2GmGjhaYvoKg==", + "dev": true, + "requires": { + "@angular-eslint/bundled-angular-compiler": "17.2.0", + "eslint-scope": "^8.0.0" + }, + "dependencies": { + "eslint-scope": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.0.tgz", + "integrity": "sha512-zj3Byw6jX4TcFCJmxOzLt6iol5FAr9xQyZZSQjEzW2UiCJXLwXdRIKCYVFftnpZckaC9Ps9xlC7jB8tSeWWOaw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "@angular-eslint/utils": { + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-17.2.0.tgz", + "integrity": "sha512-J7DsFKb5yxv8te8LQvChNn6MBvKulcBx+jtHX1uen+uuuv8XhZuVMZXS0rolUkdl1Q0mBeHpkuO2q6Vh17pqbQ==", + "dev": true, + "requires": { + "@angular-eslint/bundled-angular-compiler": "17.2.0", + "@typescript-eslint/utils": "6.18.0" + } + }, "@angular/animations": { "version": "17.0.8", "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.0.8.tgz", @@ -16447,12 +18819,119 @@ "dev": true, "optional": true }, - "@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "dev": true, - "optional": true + "@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "dev": true, + "optional": true + }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true + }, + "@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.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" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + } + } + }, + "@eslint/js": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "dev": true }, "@fastify/busboy": { "version": "2.1.0", @@ -16473,6 +18952,50 @@ "@floating-ui/core": "^1.2.0" } }, + "@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true + }, + "@humanwhocodes/object-schema": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "dev": true + }, "@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -16557,6 +19080,15 @@ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true }, + "@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "requires": { + "@sinclair/typebox": "^0.27.8" + } + }, "@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -17556,6 +20088,121 @@ } } }, + "@nrwl/devkit": { + "version": "17.2.8", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-17.2.8.tgz", + "integrity": "sha512-l2dFy5LkWqSA45s6pee6CoqJeluH+sjRdVnAAQfjLHRNSx6mFAKblyzq5h1f4P0EUCVVVqLs+kVqmNx5zxYqvw==", + "dev": true, + "requires": { + "@nx/devkit": "17.2.8" + } + }, + "@nrwl/tao": { + "version": "17.2.8", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-17.2.8.tgz", + "integrity": "sha512-Qpk5YKeJ+LppPL/wtoDyNGbJs2MsTi6qyX/RdRrEc8lc4bk6Cw3Oul1qTXCI6jT0KzTz+dZtd0zYD/G7okkzvg==", + "dev": true, + "requires": { + "nx": "17.2.8", + "tslib": "^2.3.0" + } + }, + "@nx/devkit": { + "version": "17.2.8", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-17.2.8.tgz", + "integrity": "sha512-6LtiQihtZwqz4hSrtT5cCG5XMCWppG6/B8c1kNksg97JuomELlWyUyVF+sxmeERkcLYFaKPTZytP0L3dmCFXaw==", + "dev": true, + "requires": { + "@nrwl/devkit": "17.2.8", + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "ignore": "^5.0.4", + "semver": "7.5.3", + "tmp": "~0.2.1", + "tslib": "^2.3.0" + }, + "dependencies": { + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + } + } + } + }, + "@nx/nx-darwin-arm64": { + "version": "17.2.8", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-17.2.8.tgz", + "integrity": "sha512-dMb0uxug4hM7tusISAU1TfkDK3ixYmzc1zhHSZwpR7yKJIyKLtUpBTbryt8nyso37AS1yH+dmfh2Fj2WxfBHTg==", + "dev": true, + "optional": true + }, + "@nx/nx-darwin-x64": { + "version": "17.2.8", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-17.2.8.tgz", + "integrity": "sha512-0cXzp1tGr7/6lJel102QiLA4NkaLCkQJj6VzwbwuvmuCDxPbpmbz7HC1tUteijKBtOcdXit1/MEoEU007To8Bw==", + "dev": true, + "optional": true + }, + "@nx/nx-freebsd-x64": { + "version": "17.2.8", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-17.2.8.tgz", + "integrity": "sha512-YFMgx5Qpp2btCgvaniDGdu7Ctj56bfFvbbaHQWmOeBPK1krNDp2mqp8HK6ZKOfEuDJGOYAp7HDtCLvdZKvJxzA==", + "dev": true, + "optional": true + }, + "@nx/nx-linux-arm-gnueabihf": { + "version": "17.2.8", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-17.2.8.tgz", + "integrity": "sha512-iN2my6MrhLRkVDtdivQHugK8YmR7URo1wU9UDuHQ55z3tEcny7LV3W9NSsY9UYPK/FrxdDfevj0r2hgSSdhnzA==", + "dev": true, + "optional": true + }, + "@nx/nx-linux-arm64-gnu": { + "version": "17.2.8", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-17.2.8.tgz", + "integrity": "sha512-Iy8BjoW6mOKrSMiTGujUcNdv+xSM1DALTH6y3iLvNDkGbjGK1Re6QNnJAzqcXyDpv32Q4Fc57PmuexyysZxIGg==", + "dev": true, + "optional": true + }, + "@nx/nx-linux-arm64-musl": { + "version": "17.2.8", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-17.2.8.tgz", + "integrity": "sha512-9wkAxWzknjpzdofL1xjtU6qPFF1PHlvKCZI3hgEYJDo4mQiatGI+7Ttko+lx/ZMP6v4+Umjtgq7+qWrApeKamQ==", + "dev": true, + "optional": true + }, + "@nx/nx-linux-x64-gnu": { + "version": "17.2.8", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-17.2.8.tgz", + "integrity": "sha512-sjG1bwGsjLxToasZ3lShildFsF0eyeGu+pOQZIp9+gjFbeIkd19cTlCnHrOV9hoF364GuKSXQyUlwtFYFR4VTQ==", + "dev": true, + "optional": true + }, + "@nx/nx-linux-x64-musl": { + "version": "17.2.8", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-17.2.8.tgz", + "integrity": "sha512-QiakXZ1xBCIptmkGEouLHQbcM4klQkcr+kEaz2PlNwy/sW3gH1b/1c0Ed5J1AN9xgQxWspriAONpScYBRgxdhA==", + "dev": true, + "optional": true + }, + "@nx/nx-win32-arm64-msvc": { + "version": "17.2.8", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-17.2.8.tgz", + "integrity": "sha512-XBWUY/F/GU3vKN9CAxeI15gM4kr3GOBqnzFZzoZC4qJt2hKSSUEWsMgeZtsMgeqEClbi4ZyCCkY7YJgU32WUGA==", + "dev": true, + "optional": true + }, + "@nx/nx-win32-x64-msvc": { + "version": "17.2.8", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-17.2.8.tgz", + "integrity": "sha512-HTqDv+JThlLzbcEm/3f+LbS5/wYQWzb5YDXbP1wi7nlCTihNZOLNqGOkEmwlrR5tAdNHPRpHSmkYg4305W0CtA==", + "dev": true, + "optional": true + }, "@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -17610,6 +20257,12 @@ "tuf-js": "^2.1.0" } }, + "@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, "@socket.io/component-emitter": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", @@ -17754,9 +20407,9 @@ "dev": true }, "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, "@types/mime": { @@ -17798,6 +20451,12 @@ "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", "dev": true }, + "@types/semver": { + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", + "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", + "dev": true + }, "@types/send": { "version": "0.17.4", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", @@ -17828,23 +20487,210 @@ "@types/node": "*" } }, - "@types/sockjs": { - "version": "0.3.36", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", - "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/ws": { + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@typescript-eslint/eslint-plugin": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.18.0.tgz", + "integrity": "sha512-3lqEvQUdCozi6d1mddWqd+kf8KxmGq2Plzx36BlkjuQe3rSTm/O98cLf0A4uDO+a5N1KD2SeEEl6fW97YHY+6w==", + "dev": true, + "requires": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.18.0", + "@typescript-eslint/type-utils": "6.18.0", + "@typescript-eslint/utils": "6.18.0", + "@typescript-eslint/visitor-keys": "6.18.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/parser": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.18.0.tgz", + "integrity": "sha512-v6uR68SFvqhNQT41frCMCQpsP+5vySy6IdgjlzUWoo7ALCnpaWYcz/Ij2k4L8cEsL0wkvOviCMpjmtRtHNOKzA==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "6.18.0", + "@typescript-eslint/types": "6.18.0", + "@typescript-eslint/typescript-estree": "6.18.0", + "@typescript-eslint/visitor-keys": "6.18.0", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.18.0.tgz", + "integrity": "sha512-o/UoDT2NgOJ2VfHpfr+KBY2ErWvCySNUIX/X7O9g8Zzt/tXdpfEU43qbNk8LVuWUT2E0ptzTWXh79i74PP0twA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.18.0", + "@typescript-eslint/visitor-keys": "6.18.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.18.0.tgz", + "integrity": "sha512-ZeMtrXnGmTcHciJN1+u2CigWEEXgy1ufoxtWcHORt5kGvpjjIlK9MUhzHm4RM8iVy6dqSaZA/6PVkX6+r+ChjQ==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "6.18.0", + "@typescript-eslint/utils": "6.18.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + } + }, + "@typescript-eslint/types": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.18.0.tgz", + "integrity": "sha512-/RFVIccwkwSdW/1zeMx3hADShWbgBxBnV/qSrex6607isYjj05t36P6LyONgqdUrNLl5TYU8NIKdHUYpFvExkA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.18.0.tgz", + "integrity": "sha512-klNvl+Ql4NsBNGB4W9TZ2Od03lm7aGvTbs0wYaFYsplVPhr+oeXjlPZCDI4U9jgJIDK38W1FKhacCFzCC+nbIg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.18.0", + "@typescript-eslint/visitor-keys": "6.18.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "dependencies": { + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + } + } + }, + "@typescript-eslint/utils": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.18.0.tgz", + "integrity": "sha512-wiKKCbUeDPGaYEYQh1S580dGxJ/V9HI7K5sbGAVklyf+o5g3O+adnS4UNJajplF4e7z2q0uVBaTdT/yLb4XAVA==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.18.0", + "@typescript-eslint/types": "6.18.0", + "@typescript-eslint/typescript-estree": "6.18.0", + "semver": "^7.5.4" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.18.0.tgz", + "integrity": "sha512-1wetAlSZpewRDb2h9p/Q8kRjdGuqdTAQbkJIOUMLug2LBLG+QOjiWoSj6/3B/hA9/tVTFFdtiKvAYoYnSRW/RA==", "dev": true, "requires": { - "@types/node": "*" + "@typescript-eslint/types": "6.18.0", + "eslint-visitor-keys": "^3.4.1" } }, - "@types/ws": { - "version": "8.5.10", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", - "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", - "dev": true, - "requires": { - "@types/node": "*" - } + "@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true }, "@vitejs/plugin-basic-ssl": { "version": "1.0.1", @@ -18017,6 +20863,33 @@ "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", "dev": true }, + "@yarnpkg/parsers": { + "version": "3.0.0-rc.46", + "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.0-rc.46.tgz", + "integrity": "sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==", + "dev": true, + "requires": { + "js-yaml": "^3.10.0", + "tslib": "^2.4.0" + } + }, + "@zkochan/js-yaml": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.6.tgz", + "integrity": "sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + } + } + }, "abab": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", @@ -18216,12 +21089,27 @@ "sprintf-js": "~1.0.2" } }, + "aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "requires": { + "dequal": "^2.0.3" + } + }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, "async": { "version": "2.6.4", "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", @@ -18237,6 +21125,12 @@ "integrity": "sha512-p4jj6Fws4Iy2m0iCmI2am2ZNZCgbdgE+P8F/8csmn2vx7ixXrO2zGcuNsD46X5uZSVecmkEy/M06X2vG8KD6dQ==", "dev": true }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, "autoprefixer": { "version": "10.4.16", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", @@ -18260,6 +21154,15 @@ "follow-redirects": "^1.14.0" } }, + "axobject-query": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.0.0.tgz", + "integrity": "sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==", + "dev": true, + "requires": { + "dequal": "^2.0.3" + } + }, "babel-loader": { "version": "9.1.3", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", @@ -18925,6 +21828,15 @@ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -19302,6 +22214,12 @@ "ms": "2.1.2" } }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, "default-gateway": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", @@ -19326,6 +22244,12 @@ "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "dev": true }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true + }, "depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -19458,6 +22382,12 @@ } } }, + "dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true + }, "destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", @@ -19482,6 +22412,12 @@ "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", "dev": true }, + "diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true + }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -19500,6 +22436,15 @@ "@leichtgewicht/ip-codec": "^2.0.1" } }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, "dom-serialize": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", @@ -19549,6 +22494,24 @@ "domhandler": "^5.0.3" } }, + "dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "dev": true + }, + "dotenv-expand": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz", + "integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==", + "dev": true + }, + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, "eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -19630,6 +22593,15 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "dev": true }, + "ejs": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "dev": true, + "requires": { + "jake": "^10.8.5" + } + }, "electron-to-chromium": { "version": "1.4.626", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.626.tgz", @@ -19676,6 +22648,15 @@ } } }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, "engine.io": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.0.tgz", @@ -19738,6 +22719,15 @@ "tapable": "^2.2.0" } }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, "ent": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", @@ -19817,30 +22807,268 @@ "@esbuild/win32-x64": "0.18.20" } }, - "esbuild-wasm": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.19.5.tgz", - "integrity": "sha512-7zmLLn2QCj93XfMmHtzrDJ1UBuOHB2CZz1ghoCEZiRajxjUvHsF40PnbzFIY/pmesqPRaEtEWii0uzsTbnAgrA==", - "dev": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, + "esbuild-wasm": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.19.5.tgz", + "integrity": "sha512-7zmLLn2QCj93XfMmHtzrDJ1UBuOHB2CZz1ghoCEZiRajxjUvHsF40PnbzFIY/pmesqPRaEtEWii0uzsTbnAgrA==", + "dev": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "eslint": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.56.0", + "@humanwhocodes/config-array": "^0.11.13", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + } + } + }, "eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -19851,12 +23079,54 @@ "estraverse": "^4.1.1" } }, + "eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true + }, + "espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "requires": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "dependencies": { + "acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true + } + } + }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, + "esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, "esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -20105,6 +23375,12 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, "fastq": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", @@ -20132,6 +23408,35 @@ "escape-string-regexp": "^1.0.5" } }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "requires": { + "minimatch": "^5.0.1" + }, + "dependencies": { + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -20208,16 +23513,27 @@ "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true }, + "flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "requires": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + } + }, "flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", "dev": true }, "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", "dev": true }, "foreground-child": { @@ -20238,6 +23554,17 @@ } } }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, "forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -20256,6 +23583,12 @@ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, "fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -20406,6 +23739,12 @@ "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, "handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", @@ -21105,30 +24444,187 @@ } } }, - "istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", - "dev": true, - "requires": { - "@isaacs/cliui": "^8.0.2", - "@pkgjs/parseargs": "^0.11.0" - } - }, - "jasmine-core": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.3.0.tgz", - "integrity": "sha512-qybtBUesniQdW6n+QIHMng2vDOHscIC/dEXjW+JzO9+LoAZMb03RCUC5xFOv/btSKPm1xL42fn+RjlU4oB42Lg==", + "istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "requires": { + "@isaacs/cliui": "^8.0.2", + "@pkgjs/parseargs": "^0.11.0" + } + }, + "jake": { + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "dev": true, + "requires": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jasmine-core": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.3.0.tgz", + "integrity": "sha512-qybtBUesniQdW6n+QIHMng2vDOHscIC/dEXjW+JzO9+LoAZMb03RCUC5xFOv/btSKPm1xL42fn+RjlU4oB42Lg==", + "dev": true + }, + "jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true }, "jest-worker": { @@ -21187,6 +24683,12 @@ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, "json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -21199,6 +24701,12 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, "json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -21407,6 +24915,15 @@ "source-map-support": "^0.5.5" } }, + "keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "requires": { + "json-buffer": "3.0.1" + } + }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -21496,6 +25013,16 @@ "klona": "^2.0.4" } }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, "license-webpack-plugin": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", @@ -21600,6 +25127,12 @@ "integrity": "sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==", "dev": true }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, "log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -22040,6 +25573,12 @@ "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", "dev": true }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, "needle": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz", @@ -22195,6 +25734,12 @@ "dev": true, "optional": true }, + "node-machine-id": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/node-machine-id/-/node-machine-id-1.1.12.tgz", + "integrity": "sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==", + "dev": true + }, "node-releases": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", @@ -22324,6 +25869,227 @@ "boolbase": "^1.0.0" } }, + "nx": { + "version": "17.2.8", + "resolved": "https://registry.npmjs.org/nx/-/nx-17.2.8.tgz", + "integrity": "sha512-rM5zXbuXLEuqQqcjVjClyvHwRJwt+NVImR2A6KFNG40Z60HP6X12wAxxeLHF5kXXTDRU0PFhf/yACibrpbPrAw==", + "dev": true, + "requires": { + "@nrwl/tao": "17.2.8", + "@nx/nx-darwin-arm64": "17.2.8", + "@nx/nx-darwin-x64": "17.2.8", + "@nx/nx-freebsd-x64": "17.2.8", + "@nx/nx-linux-arm-gnueabihf": "17.2.8", + "@nx/nx-linux-arm64-gnu": "17.2.8", + "@nx/nx-linux-arm64-musl": "17.2.8", + "@nx/nx-linux-x64-gnu": "17.2.8", + "@nx/nx-linux-x64-musl": "17.2.8", + "@nx/nx-win32-arm64-msvc": "17.2.8", + "@nx/nx-win32-x64-msvc": "17.2.8", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "3.0.0-rc.46", + "@zkochan/js-yaml": "0.0.6", + "axios": "^1.5.1", + "chalk": "^4.1.0", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^8.0.1", + "dotenv": "~16.3.1", + "dotenv-expand": "~10.0.0", + "enquirer": "~2.3.6", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^11.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "jest-diff": "^29.4.1", + "js-yaml": "4.1.0", + "jsonc-parser": "3.2.0", + "lines-and-columns": "~2.0.3", + "minimatch": "3.0.5", + "node-machine-id": "1.1.12", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "semver": "7.5.3", + "string-width": "^4.2.3", + "strong-log-transformer": "^2.1.0", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "axios": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.5.tgz", + "integrity": "sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==", + "dev": true, + "requires": { + "follow-redirects": "^1.15.4", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "cli-spinners": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "dev": true + }, + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "lines-and-columns": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", + "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", + "dev": true + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + } + }, + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true + } + } + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -22409,6 +26175,20 @@ } } }, + "optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "requires": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + } + }, "ora": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", @@ -22877,12 +26657,37 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, "pretty-bytes": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", "dev": true }, + "pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "requires": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, "proc-log": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", @@ -23023,6 +26828,12 @@ } } }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", @@ -23084,6 +26895,12 @@ "unpipe": "1.0.0" } }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, "read-package-json": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-7.0.0.tgz", @@ -23545,9 +27362,9 @@ } }, "semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -24128,6 +27945,23 @@ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "strong-log-transformer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", + "integrity": "sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==", + "dev": true, + "requires": { + "duplexer": "^0.1.1", + "minimist": "^1.2.0", + "through": "^2.3.4" + } + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -24197,6 +28031,19 @@ } } }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + }, "teamcity-service-messages": { "version": "0.1.14", "resolved": "https://registry.npmjs.org/teamcity-service-messages/-/teamcity-service-messages-0.1.14.tgz", @@ -24318,6 +28165,12 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, "thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", @@ -24360,6 +28213,13 @@ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true }, + "ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "dev": true, + "requires": {} + }, "tsconfig-paths": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.1.2.tgz", @@ -24449,6 +28309,15 @@ "make-fetch-happen": "^13.0.0" } }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, "type-fest": { "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", diff --git a/package.json b/package.json index 5725ce8b..537b8dd3 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,8 @@ "install-graphviz-linux": "sudo apt install graphviz", "install-graphviz-win": "winget install -e --id Graphviz.Graphviz --accept-package-agreements --accept-source-agreements --disable-interactivity && set PATH=%PATH%;C:\\Program Files\\Graphviz\\bin;", "depcruise": "depcruise src --include-only \"^src\" --config --output-type dot | dot -T svg > dependency-graph.svg", - "node-sync": "node ./src/scripts/nodeSyncWorkflows.js" + "node-sync": "node ./src/scripts/nodeSyncWorkflows.js", + "lint": "ng lint" }, "private": true, "dependencies": { @@ -41,10 +42,18 @@ }, "devDependencies": { "@angular-devkit/build-angular": "^17.0.9", + "@angular-eslint/builder": "17.2.0", + "@angular-eslint/eslint-plugin": "17.2.0", + "@angular-eslint/eslint-plugin-template": "17.2.0", + "@angular-eslint/schematics": "17.2.0", + "@angular-eslint/template-parser": "17.2.0", "@angular/cli": "~17.0.9", "@angular/compiler-cli": "^17.0.8", "@types/jasmine": "~4.0.0", + "@typescript-eslint/eslint-plugin": "6.18.0", + "@typescript-eslint/parser": "6.18.0", "dependency-cruiser": "^12.10.1", + "eslint": "^8.56.0", "jasmine-core": "~4.3.0", "karma": "~6.4.0", "karma-chrome-launcher": "~3.1.0", diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 82df9820..d32b43cc 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -11,7 +11,7 @@ import { UnauthorizedComponent } from './shared/components/unauthorized/unauthor import { ForbiddenComponent } from './shared/components/forbidden/forbidden.component'; import { Translations } from './core/services/translations.service'; -let translations = Translations.getInstance(); +const translations = Translations.getInstance(); const routes: Routes = [ { diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts index 53633451..e4057946 100644 --- a/src/app/app.component.spec.ts +++ b/src/app/app.component.spec.ts @@ -1,12 +1,12 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { AppComponent } from './app.component'; -import { AuthConfigModule } from './core/auth/auth.module'; +// import { ComponentFixture, TestBed } from '@angular/core/testing'; +// import { RouterTestingModule } from '@angular/router/testing'; +// import { AppComponent } from './app.component'; +// import { AuthConfigModule } from './core/auth/auth.module'; -import { HttpClient, HttpClientModule } from '@angular/common/http'; -import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; -import { TranslateService } from '@ngx-translate/core'; -import { TypescriptLoader } from './core/helpers/typescript-loader'; +// import { HttpClient, HttpClientModule } from '@angular/common/http'; +// import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; +// import { TranslateService } from '@ngx-translate/core'; +// import { TypescriptLoader } from './core/helpers/typescript-loader'; // describe('AppComponent', () => { // let component: AppComponent; diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 68991706..ccf673f3 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -1,4 +1,4 @@ -import { Component, OnDestroy } from '@angular/core'; +import { Component, OnDestroy, OnInit } from '@angular/core'; import { ActivatedRoute, NavigationEnd, Router, RouterEvent }from '@angular/router'; import { filter, Subscription } from 'rxjs'; import { CoreRoutes } from './core/constants/routes.constants'; @@ -14,7 +14,7 @@ import { Translations } from './core/services/translations.service'; templateUrl: './app.component.html', styleUrls: ['./app.component.scss'] }) -export class AppComponent implements OnDestroy { +export class AppComponent implements OnInit, OnDestroy { showHeaderFooter: boolean = true; showSearchBar: boolean = false; @@ -60,18 +60,18 @@ export class AppComponent implements OnDestroy { } initTranslationService(): void { - this.langChangeSub = this.translateService.onLangChange.subscribe(({lang, translations}) => { + this.langChangeSub = this.translateService.onLangChange.subscribe(({lang}) => { this.languageStorageService.setLanguage(lang); }); - let savedLang = this.languageStorageService.getLanguage(); + const savedLang = this.languageStorageService.getLanguage(); if (savedLang !== null && (savedLang == 'en' || 'fr')) { this.translateService.setDefaultLang(savedLang); this.translateService.use(savedLang); } else { - let browserLang = this.translateService.getBrowserLang(); + const browserLang = this.translateService.getBrowserLang(); if (browserLang && (browserLang == 'en' || 'fr')) { this.translateService.setDefaultLang(browserLang); @@ -83,7 +83,7 @@ export class AppComponent implements OnDestroy { initRouteChangeSubscription(): void { this.routeChangeSub = this.router.events.pipe(filter(e => e instanceof NavigationEnd)).subscribe((e) => { let url = (e as RouterEvent).url; - let queryIndex = url.indexOf('?'); + const queryIndex = url.indexOf('?'); url = url.substring(1, queryIndex > -1 ? queryIndex : undefined); if (url === CoreRoutes.Splash) { diff --git a/src/app/core/guards/interceptor.guard.ts b/src/app/core/guards/interceptor.guard.ts index 58ed5c60..7298309b 100644 --- a/src/app/core/guards/interceptor.guard.ts +++ b/src/app/core/guards/interceptor.guard.ts @@ -24,7 +24,7 @@ export class InterceptorGuard { route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable | Promise | boolean | UrlTree { - let retUrl = this.sessionStorageService.read(this.returnUrlKey); + const retUrl = this.sessionStorageService.read(this.returnUrlKey); if (retUrl) { diff --git a/src/app/core/guards/redirect.guard.ts b/src/app/core/guards/redirect.guard.ts index 53a1b00a..803fcbef 100644 --- a/src/app/core/guards/redirect.guard.ts +++ b/src/app/core/guards/redirect.guard.ts @@ -14,7 +14,7 @@ export class RedirectGuard { canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean { - let externalUrl = route.data['externalUrl']; + const externalUrl = route.data['externalUrl']; if (externalUrl) { window.open(externalUrl, '_blank')?.focus(); diff --git a/src/app/core/helpers/typescript-loader.ts b/src/app/core/helpers/typescript-loader.ts index caeb9126..e1083769 100644 --- a/src/app/core/helpers/typescript-loader.ts +++ b/src/app/core/helpers/typescript-loader.ts @@ -14,7 +14,7 @@ export class TypescriptLoader implements TranslateLoader { return this.http.get(url, { responseType: 'text' }).pipe( map(response => { - let obj = response.substring(response.indexOf('{'), response.lastIndexOf('}') + 1); + const obj = response.substring(response.indexOf('{'), response.lastIndexOf('}') + 1); const translations = eval(JSON.parse(obj)); for (const [key, value] of Object.entries(translations.routes)) { diff --git a/src/app/core/interfaces/card-component.interface.ts b/src/app/core/interfaces/card-component.interface.ts index ec31cf75..d146c313 100644 --- a/src/app/core/interfaces/card-component.interface.ts +++ b/src/app/core/interfaces/card-component.interface.ts @@ -1,6 +1,7 @@ import { CardSize } from "src/app/shared/models/card-size"; export interface ICardComponent { + //eslint-disable-next-line model?: any; cardSize: CardSize | string; loading: boolean; diff --git a/src/scripts/nodeSyncWorkflows.js b/src/scripts/nodeSyncWorkflows.js index ce9b7e6c..ce4c3a4e 100644 --- a/src/scripts/nodeSyncWorkflows.js +++ b/src/scripts/nodeSyncWorkflows.js @@ -6,6 +6,7 @@ const workflowFilePaths = [ '.github/workflows/dependency-graph.yml', '.github/workflows/deploy-dev.yml', '.github/workflows/deploy-pr.yml', + '.github/workflows/lint.yml', ]; exec('npm run ng v', (error, stdout, stderr) => { From ef0c5b1bf495ace1e9a4b0ab9bbc25191f7b7c6c Mon Sep 17 00:00:00 2001 From: Adii <73539670+AdiMakkar@users.noreply.github.com> Date: Wed, 17 Jan 2024 13:59:06 -0500 Subject: [PATCH 119/165] click function is using a callback (#214) * click function is using a callback * requested changes for callback applied --- .../events/components/event-card/event-card.component.html | 4 ++-- .../events/components/event-card/event-card.component.ts | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/app/features/events/components/event-card/event-card.component.html b/src/app/features/events/components/event-card/event-card.component.html index 5dd11a7a..0729d522 100644 --- a/src/app/features/events/components/event-card/event-card.component.html +++ b/src/app/features/events/components/event-card/event-card.component.html @@ -37,7 +37,7 @@ [tooltipDirection]="tooltipDirection.Above" [disabled]="loading || model?.canceled == true || isPast()" [theme]="model?.declined ? 'disabled' : 'secondary-2'" - (click)="confirmEvent()"> + [clickFunc]="confirmEventCallback"> @@ -52,7 +52,7 @@ [ariaLabel]="(model?.declined ? translations.eventCard.decline.aria_off : translations.eventCard.decline.aria_on) | translate" [disabled]="loading || model?.canceled == true || isPast()" [theme]="model?.confirmed ? 'disabled' : 'error'" - (click)="declineEvent()"> + [clickFunc]="declineEventCallback"> diff --git a/src/app/features/events/components/event-card/event-card.component.ts b/src/app/features/events/components/event-card/event-card.component.ts index f96f1903..55c12e90 100644 --- a/src/app/features/events/components/event-card/event-card.component.ts +++ b/src/app/features/events/components/event-card/event-card.component.ts @@ -25,6 +25,9 @@ export class EventCardComponent implements ICardComponent { tooltipDirection = TooltipDirection; routes = CoreRoutes; + confirmEventCallback: Function = this.confirmEvent.bind(this); + declineEventCallback: Function = this.declineEvent.bind(this); + constructor(public translations: Translations, private router: Router) { } From 4e4ae5ff85b4182661379fb43870aff0dde3e994 Mon Sep 17 00:00:00 2001 From: Adii <73539670+AdiMakkar@users.noreply.github.com> Date: Wed, 17 Jan 2024 13:59:19 -0500 Subject: [PATCH 120/165] Bug fix out of date event (#215) * out of events restored for upcoming events * wip - out of date issue for the past events on event page persists * bug reverted to the original scope * out of date issue fixed --- src/app/core/services/event.service.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/app/core/services/event.service.ts b/src/app/core/services/event.service.ts index 06653ad1..35bdc044 100644 --- a/src/app/core/services/event.service.ts +++ b/src/app/core/services/event.service.ts @@ -145,7 +145,9 @@ export class EventService implements IListService { private randomDate() { let startDate = new Date(); - let endDate = new Date('2023/12/31'); + startDate.setDate(startDate.getDate() - 7); + let endDate = new Date(); + endDate.setFullYear(endDate.getFullYear() + 1); return new Date(startDate.getTime() + Math.random() * (endDate.getTime() - startDate.getTime())); } From b860209bd2ee8095fa9c7d41c35f691df7bc4e3d Mon Sep 17 00:00:00 2001 From: doug0102 Date: Fri, 26 Jan 2024 10:24:30 -0500 Subject: [PATCH 121/165] fix linting errors. added rule to ignore angular test files. --- .eslintignore | 1 + src/app/core/guards/interceptor.guard.ts | 6 ++--- src/app/core/guards/login.guard.ts | 6 ++--- src/app/core/guards/role.guard.ts | 6 ++--- .../core/interfaces/list-service.interface.ts | 1 + src/app/core/services/debounce.service.ts | 6 ++--- src/app/core/services/event.service.ts | 10 ++++----- src/app/core/services/group.service.ts | 4 ++-- src/app/core/services/news.service.ts | 6 ++--- src/app/core/services/people.service.ts | 4 ++-- .../core/services/session-storage.service.ts | 2 +- src/app/core/services/translations.service.ts | 1 + src/app/features/about/about.component.ts | 7 ++---- src/app/features/blog/blog.component.ts | 6 ++--- .../features/bookmarks/bookmarks.component.ts | 7 ++---- .../features/dashboard/dashboard.component.ts | 7 ++---- .../event-card/event-card.component.html | 10 ++++----- .../event-list/event-list.component.html | 2 +- .../components/event/event.component.ts | 2 +- .../features/events/events-routing.module.ts | 2 +- src/app/features/events/events.component.ts | 4 ++-- src/app/features/friends/friends.component.ts | 8 ++----- .../group-card/group-card.component.html | 2 +- .../group-list/group-list.component.html | 2 +- .../features/groups/groups-routing.module.ts | 2 +- src/app/features/groups/groups.component.ts | 7 ++---- src/app/features/invite/invite.component.ts | 7 ++---- src/app/features/login/login.component.html | 1 - src/app/features/login/login.component.ts | 11 +++------- src/app/features/members/members.component.ts | 7 ++---- .../features/messages/messages.component.ts | 7 ++---- .../features/missions/missions.component.ts | 7 ++---- .../news-card/news-card.component.ts | 6 ++--- .../news-list/news-list.component.html | 2 +- .../features/news-feed/news-feed.component.ts | 7 ++---- src/app/features/privacy/privacy.component.ts | 7 ++---- .../profile/components/post/post.component.ts | 8 +++---- .../profile-list/profile-list.component.html | 2 +- src/app/features/profile/profile.component.ts | 7 ++---- .../features/register/register.component.ts | 7 ++---- src/app/features/search/search.component.ts | 7 ++---- .../features/settings/settings.component.ts | 7 ++---- src/app/features/splash/splash.component.ts | 7 ++---- src/app/features/stats/stats.component.ts | 7 ++---- src/app/features/terms/terms.component.ts | 7 ++---- .../features/the-wire/the-wire.component.ts | 7 ++---- .../blog-form/blog-form.component.ts | 1 + .../components/button/button.component.html | 15 +++++++------ .../components/button/button.component.ts | 11 ++++------ .../calendar-button.component.html | 3 ++- .../components/editor/editor.component.html | 3 ++- .../components/editor/editor.component.ts | 13 ++++++----- .../menu/editor-menu/editor-menu.component.ts | 2 +- .../event-form/event-form.component.html | 22 +++++++++---------- .../event-form/event-form.component.ts | 5 +++-- .../file-select/file-select.component.ts | 13 ++++++----- .../components/footer/footer.component.ts | 8 +++---- .../forbidden/forbidden.component.ts | 7 ++---- .../components/header/header.component.html | 18 +++++++-------- .../components/header/header.component.ts | 1 + .../components/input/input.component.html | 4 +++- .../components/input/input.component.ts | 5 ++++- .../language-selector.component.ts | 2 +- .../shared/components/list/list.component.ts | 7 +++--- .../not-found/not-found.component.ts | 7 ++---- .../poll-form/poll-form.component.ts | 1 + .../post-form/post-form.component.ts | 1 + .../profile-pic/profile-pic.component.html | 2 ++ .../profile-pic/profile-pic.component.ts | 1 + .../unauthorized/unauthorized.component.ts | 7 ++---- src/app/shared/shared.module.ts | 1 + src/assets/i18n/translations.en.ts | 1 + src/assets/i18n/translations.fr.ts | 1 + 73 files changed, 176 insertions(+), 235 deletions(-) create mode 100644 .eslintignore diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 00000000..e8a560ed --- /dev/null +++ b/.eslintignore @@ -0,0 +1 @@ +**/*.spec.ts \ No newline at end of file diff --git a/src/app/core/guards/interceptor.guard.ts b/src/app/core/guards/interceptor.guard.ts index 7298309b..b00d788c 100644 --- a/src/app/core/guards/interceptor.guard.ts +++ b/src/app/core/guards/interceptor.guard.ts @@ -1,5 +1,5 @@ import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, Router, RouterStateSnapshot, UrlTree } from '@angular/router'; +import { Router, UrlTree } from '@angular/router'; import { Observable } from 'rxjs'; import { SessionStorageService } from '../services/session-storage.service'; @@ -20,9 +20,7 @@ export class InterceptorGuard { private router: Router ) {} - canActivate( - route: ActivatedRouteSnapshot, - state: RouterStateSnapshot): Observable | Promise | boolean | UrlTree { + canActivate(): Observable | Promise | boolean | UrlTree { const retUrl = this.sessionStorageService.read(this.returnUrlKey); diff --git a/src/app/core/guards/login.guard.ts b/src/app/core/guards/login.guard.ts index 37b28f38..f4071c39 100644 --- a/src/app/core/guards/login.guard.ts +++ b/src/app/core/guards/login.guard.ts @@ -1,5 +1,5 @@ import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, Router, RouterStateSnapshot, UrlTree } from '@angular/router'; +import { Router, UrlTree } from '@angular/router'; import { OidcSecurityService } from 'angular-auth-oidc-client'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; @@ -15,9 +15,7 @@ import { map } from 'rxjs/operators'; export class LoginGuard { constructor(private oidcSecurityService: OidcSecurityService, private router: Router) {} - canActivate( - route: ActivatedRouteSnapshot, - state: RouterStateSnapshot): Observable | Promise | boolean | UrlTree { + canActivate(): Observable | Promise | boolean | UrlTree { return this.oidcSecurityService.isAuthenticated$.pipe( map(({ isAuthenticated }) => { if (!isAuthenticated) { diff --git a/src/app/core/guards/role.guard.ts b/src/app/core/guards/role.guard.ts index 0103cfc2..624602d3 100644 --- a/src/app/core/guards/role.guard.ts +++ b/src/app/core/guards/role.guard.ts @@ -1,14 +1,12 @@ import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree } from '@angular/router'; +import { UrlTree } from '@angular/router'; import { Observable } from 'rxjs'; @Injectable({ providedIn: 'root' }) export class RoleGuard { - canActivate( - route: ActivatedRouteSnapshot, - state: RouterStateSnapshot): Observable | Promise | boolean | UrlTree { + canActivate(): Observable | Promise | boolean | UrlTree { return true; } diff --git a/src/app/core/interfaces/list-service.interface.ts b/src/app/core/interfaces/list-service.interface.ts index f423ae2a..a93e90ff 100644 --- a/src/app/core/interfaces/list-service.interface.ts +++ b/src/app/core/interfaces/list-service.interface.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ import { Observable } from "rxjs"; export interface IListService { diff --git a/src/app/core/services/debounce.service.ts b/src/app/core/services/debounce.service.ts index 39065a24..ad00cb1a 100644 --- a/src/app/core/services/debounce.service.ts +++ b/src/app/core/services/debounce.service.ts @@ -6,18 +6,18 @@ import { Observable, Subject, debounceTime } from 'rxjs'; }) export class DebounceService { - private debounceSubject = new Subject(); + private debounceSubject = new Subject<() => unknown>(); constructor() { } - debounce(fn: Function, delay: number): void { + debounce(fn: () => unknown, delay: number): void { this.debounceSubject.next(fn); this.debounceSubject.pipe(debounceTime(delay)).subscribe((func) => { func(); }); } - getDebouncedObservable(delay: number): Observable { + getDebouncedObservable(delay: number): Observable<() => unknown> { return this.debounceSubject.pipe(debounceTime(delay)); } } diff --git a/src/app/core/services/event.service.ts b/src/app/core/services/event.service.ts index 06653ad1..c228b5b5 100644 --- a/src/app/core/services/event.service.ts +++ b/src/app/core/services/event.service.ts @@ -61,7 +61,7 @@ export class EventService implements IListService { } } - let observable: Observable = new Observable((subscriber) => { + const observable: Observable = new Observable((subscriber) => { setTimeout(() => { subscriber.next(response); subscriber.complete(); @@ -73,7 +73,7 @@ export class EventService implements IListService { getMany(count: number = 10, delay: number = this.delay): Observable { - let observable: Observable = new Observable((subscriber) => { + const observable: Observable = new Observable((subscriber) => { setTimeout(() => { subscriber.next(this.events.slice(0, count > this.events.length ? this.events.length : count)); subscriber.complete(); @@ -120,7 +120,7 @@ export class EventService implements IListService { private randomEventDescription(): string { let description: string = ''; - let paragraphs = (Math.random() * 4) + 1; + const paragraphs = (Math.random() * 4) + 1; for (let i = 0; i < paragraphs; i++) { description += this.lorem.generateSentences(Math.floor(Math.random() * 10) + 4); @@ -144,8 +144,8 @@ export class EventService implements IListService { } private randomDate() { - let startDate = new Date(); - let endDate = new Date('2023/12/31'); + const startDate = new Date(); + const endDate = new Date('2023/12/31'); return new Date(startDate.getTime() + Math.random() * (endDate.getTime() - startDate.getTime())); } diff --git a/src/app/core/services/group.service.ts b/src/app/core/services/group.service.ts index a68ef6e4..1d947fb7 100644 --- a/src/app/core/services/group.service.ts +++ b/src/app/core/services/group.service.ts @@ -40,7 +40,7 @@ import { GroupCardComponent } from 'src/app/features/groups/components/group-car } } - let observable: Observable = new Observable((subscriber) => { + const observable: Observable = new Observable((subscriber) => { setTimeout(() => { subscriber.next(response); subscriber.complete(); @@ -51,7 +51,7 @@ import { GroupCardComponent } from 'src/app/features/groups/components/group-car } getMany(count: number = 10, delay: number = this.delay): Observable { - let observable: Observable = new Observable((subscriber) => { + const observable: Observable = new Observable((subscriber) => { setTimeout(() => { subscriber.next(this.groups.slice(0, count > this.groups.length ? this.groups.length : count)); subscriber.complete(); diff --git a/src/app/core/services/news.service.ts b/src/app/core/services/news.service.ts index eab8e09c..032253b5 100644 --- a/src/app/core/services/news.service.ts +++ b/src/app/core/services/news.service.ts @@ -59,7 +59,7 @@ export class NewsService implements IListService { } } - let observable: Observable = new Observable((subscriber) => { + const observable: Observable = new Observable((subscriber) => { setTimeout(() => { subscriber.next(response); subscriber.complete(); @@ -70,7 +70,7 @@ export class NewsService implements IListService { } getMany(count: number = 10, delay: number = 5000): Observable { - let observable: Observable = new Observable((subscriber) => { + const observable: Observable = new Observable((subscriber) => { setTimeout(() => { subscriber.next(this.newsItems.slice(0, count > this.newsItems.length ? this.newsItems.length : count)); subscriber.complete(); @@ -124,7 +124,7 @@ export class NewsService implements IListService { private randomContent(): string { let content: string = ''; - let paragraphs = (Math.random() * 4) + 1; + const paragraphs = (Math.random() * 4) + 1; for (let i = 0; i < paragraphs; i++) { content += this.lorem.generateSentences(Math.floor(Math.random() * 10) + 4); diff --git a/src/app/core/services/people.service.ts b/src/app/core/services/people.service.ts index 6887c615..31f7d20f 100644 --- a/src/app/core/services/people.service.ts +++ b/src/app/core/services/people.service.ts @@ -41,7 +41,7 @@ export class PeopleService implements IListService { } } - let observable: Observable = new Observable((subscriber) => { + const observable: Observable = new Observable((subscriber) => { setTimeout(() => { subscriber.next(response); subscriber.complete(); @@ -53,7 +53,7 @@ export class PeopleService implements IListService { getMany(count: number = 10, delay: number = this.delay): Observable { - let observable: Observable = new Observable((subscriber) => { + const observable: Observable = new Observable((subscriber) => { setTimeout(() => { subscriber.next(this.people.slice(0, count > this.people.length ? this.people.length : count)); subscriber.complete(); diff --git a/src/app/core/services/session-storage.service.ts b/src/app/core/services/session-storage.service.ts index 28ca3956..c55a8dcc 100644 --- a/src/app/core/services/session-storage.service.ts +++ b/src/app/core/services/session-storage.service.ts @@ -17,7 +17,7 @@ export class SessionStorageService implements AbstractSecurityStorage { return this._localStorage.getItem(key); } - write(key: string, value: any): void { + write(key: string, value: string): void { this._localStorage.setItem(key, value); } diff --git a/src/app/core/services/translations.service.ts b/src/app/core/services/translations.service.ts index d8efa7d5..7d59669c 100644 --- a/src/app/core/services/translations.service.ts +++ b/src/app/core/services/translations.service.ts @@ -2,6 +2,7 @@ import { Injectable } from "@angular/core"; import { default as translations } from "src/assets/i18n/translations.en"; export function GenericClass(): new () => Props { + // eslint-disable-next-line @typescript-eslint/no-explicit-any return class {} as any; } diff --git a/src/app/features/about/about.component.ts b/src/app/features/about/about.component.ts index 9898f7a2..bc100bd0 100644 --- a/src/app/features/about/about.component.ts +++ b/src/app/features/about/about.component.ts @@ -1,15 +1,12 @@ -import { Component, OnInit } from '@angular/core'; +import { Component } from '@angular/core'; @Component({ selector: 'app-about', templateUrl: './about.component.html', styleUrls: ['./about.component.scss'] }) -export class AboutComponent implements OnInit { +export class AboutComponent { constructor() { } - ngOnInit(): void { - } - } diff --git a/src/app/features/blog/blog.component.ts b/src/app/features/blog/blog.component.ts index 85025858..4e33d0da 100644 --- a/src/app/features/blog/blog.component.ts +++ b/src/app/features/blog/blog.component.ts @@ -1,15 +1,13 @@ -import { Component, OnInit } from '@angular/core'; +import { Component } from '@angular/core'; @Component({ selector: 'app-blog', templateUrl: './blog.component.html', styleUrls: ['./blog.component.scss'] }) -export class BlogComponent implements OnInit { +export class BlogComponent { constructor() { } - ngOnInit(): void { - } } diff --git a/src/app/features/bookmarks/bookmarks.component.ts b/src/app/features/bookmarks/bookmarks.component.ts index ad30b149..d335900f 100644 --- a/src/app/features/bookmarks/bookmarks.component.ts +++ b/src/app/features/bookmarks/bookmarks.component.ts @@ -1,15 +1,12 @@ -import { Component, OnInit } from '@angular/core'; +import { Component } from '@angular/core'; @Component({ selector: 'app-bookmarks', templateUrl: './bookmarks.component.html', styleUrls: ['./bookmarks.component.scss'] }) -export class BookmarksComponent implements OnInit { +export class BookmarksComponent { constructor() { } - ngOnInit(): void { - } - } diff --git a/src/app/features/dashboard/dashboard.component.ts b/src/app/features/dashboard/dashboard.component.ts index 843c80f8..d3e7c044 100644 --- a/src/app/features/dashboard/dashboard.component.ts +++ b/src/app/features/dashboard/dashboard.component.ts @@ -1,15 +1,12 @@ -import { Component, OnInit } from '@angular/core'; +import { Component } from '@angular/core'; @Component({ selector: 'app-dashboard', templateUrl: './dashboard.component.html', styleUrls: ['./dashboard.component.scss'] }) -export class DashboardComponent implements OnInit { +export class DashboardComponent { constructor() { } - ngOnInit(): void { - } - } diff --git a/src/app/features/events/components/event-card/event-card.component.html b/src/app/features/events/components/event-card/event-card.component.html index 5dd11a7a..dfd73c0e 100644 --- a/src/app/features/events/components/event-card/event-card.component.html +++ b/src/app/features/events/components/event-card/event-card.component.html @@ -14,7 +14,7 @@
@@ -35,7 +35,7 @@ [tooltip]="(model?.confirmed ? translations.eventCard.confirm.tooltip_off : translations.eventCard.confirm.tooltip_on) | translate" [ariaLabel]="(model?.confirmed ? translations.eventCard.confirm.aria_off : translations.eventCard.confirm.aria_on) | translate" [tooltipDirection]="tooltipDirection.Above" - [disabled]="loading || model?.canceled == true || isPast()" + [disabled]="loading || model?.canceled === true || isPast()" [theme]="model?.declined ? 'disabled' : 'secondary-2'" (click)="confirmEvent()">
- + {{translations.eventCard.alt | translate}}
@@ -84,7 +84,7 @@
diff --git a/src/app/features/events/components/event-list/event-list.component.html b/src/app/features/events/components/event-list/event-list.component.html index d89a5e29..927aca57 100644 --- a/src/app/features/events/components/event-list/event-list.component.html +++ b/src/app/features/events/components/event-list/event-list.component.html @@ -13,7 +13,7 @@
-
+
There is nothing to display.
\ No newline at end of file diff --git a/src/app/features/events/components/event/event.component.ts b/src/app/features/events/components/event/event.component.ts index e1ef28c1..40df91fd 100644 --- a/src/app/features/events/components/event/event.component.ts +++ b/src/app/features/events/components/event/event.component.ts @@ -1,4 +1,4 @@ -import { ChangeDetectionStrategy, Component, ElementRef, Input, OnInit, ViewChild, inject } from '@angular/core'; +import { Component, Input, OnInit, inject } from '@angular/core'; import { ViewportScroller } from "@angular/common"; import { Translations } from 'src/app/core/services/translations.service'; diff --git a/src/app/features/events/events-routing.module.ts b/src/app/features/events/events-routing.module.ts index 8236f73d..7e1a63dd 100644 --- a/src/app/features/events/events-routing.module.ts +++ b/src/app/features/events/events-routing.module.ts @@ -5,7 +5,7 @@ import { EventsComponent } from './events.component'; import { Translations } from 'src/app/core/services/translations.service'; import { EventComponent } from './components/event/event.component'; -let translations = Translations.getInstance(); +const translations = Translations.getInstance(); const routes: Routes = [ { diff --git a/src/app/features/events/events.component.ts b/src/app/features/events/events.component.ts index d9d81af6..c96bacc5 100644 --- a/src/app/features/events/events.component.ts +++ b/src/app/features/events/events.component.ts @@ -1,4 +1,4 @@ -import { Component, Input } from '@angular/core'; +import { Component, OnInit } from '@angular/core'; import { FormControl, FormGroup } from '@angular/forms'; import { CoreRoutes } from 'src/app/core/constants/routes.constants'; import { Translations } from 'src/app/core/services/translations.service'; @@ -10,7 +10,7 @@ import { EventService } from 'src/app/core/services/event.service'; templateUrl: './events.component.html', styleUrls: ['./events.component.scss'] }) -export class EventsComponent { +export class EventsComponent implements OnInit { routes = CoreRoutes; form: FormGroup = new FormGroup({}); diff --git a/src/app/features/friends/friends.component.ts b/src/app/features/friends/friends.component.ts index b0dadeca..dd286779 100644 --- a/src/app/features/friends/friends.component.ts +++ b/src/app/features/friends/friends.component.ts @@ -1,15 +1,11 @@ -import { Component, OnInit } from '@angular/core'; +import { Component } from '@angular/core'; @Component({ selector: 'app-friends', templateUrl: './friends.component.html', styleUrls: ['./friends.component.scss'] }) -export class FriendsComponent implements OnInit { +export class FriendsComponent { constructor() { } - - ngOnInit(): void { - } - } diff --git a/src/app/features/groups/components/group-card/group-card.component.html b/src/app/features/groups/components/group-card/group-card.component.html index 52e6bda9..35911664 100644 --- a/src/app/features/groups/components/group-card/group-card.component.html +++ b/src/app/features/groups/components/group-card/group-card.component.html @@ -2,7 +2,7 @@
- +
diff --git a/src/app/features/groups/components/group-list/group-list.component.html b/src/app/features/groups/components/group-list/group-list.component.html index 38b04dad..5b631ae4 100644 --- a/src/app/features/groups/components/group-list/group-list.component.html +++ b/src/app/features/groups/components/group-list/group-list.component.html @@ -9,7 +9,7 @@
-
+
There is nothing to display.
\ No newline at end of file diff --git a/src/app/features/groups/groups-routing.module.ts b/src/app/features/groups/groups-routing.module.ts index 4afbf4d6..aa1748ec 100644 --- a/src/app/features/groups/groups-routing.module.ts +++ b/src/app/features/groups/groups-routing.module.ts @@ -4,7 +4,7 @@ import { GroupsComponent } from './groups.component'; import { GroupComponent } from './components/group/group.component'; import { Translations } from 'src/app/core/services/translations.service'; -let translations = Translations.getInstance(); +const translations = Translations.getInstance(); const routes: Routes = [ { diff --git a/src/app/features/groups/groups.component.ts b/src/app/features/groups/groups.component.ts index f9072010..e9f9408b 100644 --- a/src/app/features/groups/groups.component.ts +++ b/src/app/features/groups/groups.component.ts @@ -1,15 +1,12 @@ -import { Component, OnInit } from '@angular/core'; +import { Component } from '@angular/core'; @Component({ selector: 'app-groups', templateUrl: './groups.component.html', styleUrls: ['./groups.component.scss'] }) -export class GroupsComponent implements OnInit { +export class GroupsComponent { constructor() { } - ngOnInit(): void { - } - } diff --git a/src/app/features/invite/invite.component.ts b/src/app/features/invite/invite.component.ts index 029239bd..44638d8d 100644 --- a/src/app/features/invite/invite.component.ts +++ b/src/app/features/invite/invite.component.ts @@ -1,15 +1,12 @@ -import { Component, OnInit } from '@angular/core'; +import { Component } from '@angular/core'; @Component({ selector: 'app-invite', templateUrl: './invite.component.html', styleUrls: ['./invite.component.scss'] }) -export class InviteComponent implements OnInit { +export class InviteComponent { constructor() { } - ngOnInit(): void { - } - } diff --git a/src/app/features/login/login.component.html b/src/app/features/login/login.component.html index c55e4e3c..147cfc4f 100644 --- a/src/app/features/login/login.component.html +++ b/src/app/features/login/login.component.html @@ -1,2 +1 @@ -{{ translations.titles.login | translate }}

login works!

diff --git a/src/app/features/login/login.component.ts b/src/app/features/login/login.component.ts index 749aa010..5485ab13 100644 --- a/src/app/features/login/login.component.ts +++ b/src/app/features/login/login.component.ts @@ -1,17 +1,12 @@ -import { Component, OnInit } from '@angular/core'; -import { TranslateService } from '@ngx-translate/core'; -import { Translations } from 'src/app/core/services/translations.service'; +import { Component } from '@angular/core'; @Component({ selector: 'app-login', templateUrl: './login.component.html', styleUrls: ['./login.component.scss'] }) -export class LoginComponent implements OnInit { +export class LoginComponent { - constructor(public translations: Translations) { } - - ngOnInit(): void { - } + constructor() { } } diff --git a/src/app/features/members/members.component.ts b/src/app/features/members/members.component.ts index 13b1f635..c6944b41 100644 --- a/src/app/features/members/members.component.ts +++ b/src/app/features/members/members.component.ts @@ -1,15 +1,12 @@ -import { Component, OnInit } from '@angular/core'; +import { Component } from '@angular/core'; @Component({ selector: 'app-members', templateUrl: './members.component.html', styleUrls: ['./members.component.scss'] }) -export class MembersComponent implements OnInit { +export class MembersComponent { constructor() { } - ngOnInit(): void { - } - } diff --git a/src/app/features/messages/messages.component.ts b/src/app/features/messages/messages.component.ts index d9523aa5..de5f50a0 100644 --- a/src/app/features/messages/messages.component.ts +++ b/src/app/features/messages/messages.component.ts @@ -1,15 +1,12 @@ -import { Component, OnInit } from '@angular/core'; +import { Component } from '@angular/core'; @Component({ selector: 'app-messages', templateUrl: './messages.component.html', styleUrls: ['./messages.component.scss'] }) -export class MessagesComponent implements OnInit { +export class MessagesComponent { constructor() { } - ngOnInit(): void { - } - } diff --git a/src/app/features/missions/missions.component.ts b/src/app/features/missions/missions.component.ts index 85ec3148..e5ae3bd4 100644 --- a/src/app/features/missions/missions.component.ts +++ b/src/app/features/missions/missions.component.ts @@ -1,15 +1,12 @@ -import { Component, OnInit } from '@angular/core'; +import { Component } from '@angular/core'; @Component({ selector: 'app-missions', templateUrl: './missions.component.html', styleUrls: ['./missions.component.scss'] }) -export class MissionsComponent implements OnInit { +export class MissionsComponent { constructor() { } - ngOnInit(): void { - } - } diff --git a/src/app/features/news-feed/components/news-card/news-card.component.ts b/src/app/features/news-feed/components/news-card/news-card.component.ts index 449013db..bd61480d 100644 --- a/src/app/features/news-feed/components/news-card/news-card.component.ts +++ b/src/app/features/news-feed/components/news-card/news-card.component.ts @@ -28,15 +28,15 @@ export class NewsCardComponent implements ICardComponent { constructor(public translations: Translations) {} - isPost(instance: any): boolean { + isPost(instance: INewsItem): boolean { return instance instanceof Post } - isBlog(instance: any): boolean { + isBlog(instance: INewsItem): boolean { return instance instanceof Blog } - isPoll(instance: any): boolean { + isPoll(instance: INewsItem): boolean { return instance instanceof Poll } } diff --git a/src/app/features/news-feed/components/news-list/news-list.component.html b/src/app/features/news-feed/components/news-list/news-list.component.html index 281b1ab4..a718ce4d 100644 --- a/src/app/features/news-feed/components/news-list/news-list.component.html +++ b/src/app/features/news-feed/components/news-list/news-list.component.html @@ -4,7 +4,7 @@
-
+
There is nothing to display.
diff --git a/src/app/features/news-feed/news-feed.component.ts b/src/app/features/news-feed/news-feed.component.ts index 2ff4b61a..19267bf2 100644 --- a/src/app/features/news-feed/news-feed.component.ts +++ b/src/app/features/news-feed/news-feed.component.ts @@ -1,15 +1,12 @@ -import { Component, OnInit } from '@angular/core'; +import { Component } from '@angular/core'; @Component({ selector: 'app-news-feed', templateUrl: './news-feed.component.html', styleUrls: ['./news-feed.component.scss'] }) -export class NewsFeedComponent implements OnInit { +export class NewsFeedComponent { constructor() { } - ngOnInit(): void { - } - } diff --git a/src/app/features/privacy/privacy.component.ts b/src/app/features/privacy/privacy.component.ts index 2e61e303..92f37acd 100644 --- a/src/app/features/privacy/privacy.component.ts +++ b/src/app/features/privacy/privacy.component.ts @@ -1,15 +1,12 @@ -import { Component, OnInit } from '@angular/core'; +import { Component } from '@angular/core'; @Component({ selector: 'app-privacy', templateUrl: './privacy.component.html', styleUrls: ['./privacy.component.scss'] }) -export class PrivacyComponent implements OnInit { +export class PrivacyComponent { constructor() { } - ngOnInit(): void { - } - } diff --git a/src/app/features/profile/components/post/post.component.ts b/src/app/features/profile/components/post/post.component.ts index ca4e2a60..4282364b 100644 --- a/src/app/features/profile/components/post/post.component.ts +++ b/src/app/features/profile/components/post/post.component.ts @@ -1,4 +1,4 @@ -import { Component, Input } from '@angular/core'; +import { Component, Input, OnDestroy, OnInit } from '@angular/core'; import { Person } from 'src/app/core/models/person.model'; import { Translations } from 'src/app/core/services/translations.service'; import { FormGroup } from '@angular/forms'; @@ -11,7 +11,7 @@ import { Subscription } from 'rxjs'; templateUrl: './post.component.html', styleUrls: ['./post.component.scss'] }) -export class PostComponent { +export class PostComponent implements OnInit, OnDestroy { @Input() profile!: Person; @Input() loading: boolean = false; @@ -27,8 +27,8 @@ export class PostComponent { formChanges: boolean[] = []; selectedIndex = 0; - saveCallback: Function = this.save.bind(this); - submitCallback: Function = this.submit.bind(this); + saveCallback: () => void = this.save.bind(this); + submitCallback: () => void = this.submit.bind(this); selectedForm: FormGroup = this.formGroups[this.selectedIndex]; creating: boolean = false; diff --git a/src/app/features/profile/components/profile-list/profile-list.component.html b/src/app/features/profile/components/profile-list/profile-list.component.html index 4f25c67d..b5c9df37 100644 --- a/src/app/features/profile/components/profile-list/profile-list.component.html +++ b/src/app/features/profile/components/profile-list/profile-list.component.html @@ -13,7 +13,7 @@
-
+
There is nothing to display.
\ No newline at end of file diff --git a/src/app/features/profile/profile.component.ts b/src/app/features/profile/profile.component.ts index 29ea4ff3..7a634292 100644 --- a/src/app/features/profile/profile.component.ts +++ b/src/app/features/profile/profile.component.ts @@ -1,15 +1,12 @@ -import { Component, OnInit } from '@angular/core'; +import { Component } from '@angular/core'; @Component({ selector: 'app-profile', templateUrl: './profile.component.html', styleUrls: ['./profile.component.scss'] }) -export class ProfileComponent implements OnInit { +export class ProfileComponent { constructor() { } - ngOnInit(): void { - } - } diff --git a/src/app/features/register/register.component.ts b/src/app/features/register/register.component.ts index 8f62eda0..10a2fcd8 100644 --- a/src/app/features/register/register.component.ts +++ b/src/app/features/register/register.component.ts @@ -1,15 +1,12 @@ -import { Component, OnInit } from '@angular/core'; +import { Component } from '@angular/core'; @Component({ selector: 'app-register', templateUrl: './register.component.html', styleUrls: ['./register.component.scss'] }) -export class RegisterComponent implements OnInit { +export class RegisterComponent { constructor() { } - ngOnInit(): void { - } - } diff --git a/src/app/features/search/search.component.ts b/src/app/features/search/search.component.ts index 41e5ce94..f15d765f 100644 --- a/src/app/features/search/search.component.ts +++ b/src/app/features/search/search.component.ts @@ -1,15 +1,12 @@ -import { Component, OnInit } from '@angular/core'; +import { Component } from '@angular/core'; @Component({ selector: 'app-search', templateUrl: './search.component.html', styleUrls: ['./search.component.scss'] }) -export class SearchComponent implements OnInit { +export class SearchComponent { constructor() { } - ngOnInit(): void { - } - } diff --git a/src/app/features/settings/settings.component.ts b/src/app/features/settings/settings.component.ts index 232b5ddc..aaae6d24 100644 --- a/src/app/features/settings/settings.component.ts +++ b/src/app/features/settings/settings.component.ts @@ -1,15 +1,12 @@ -import { Component, OnInit } from '@angular/core'; +import { Component } from '@angular/core'; @Component({ selector: 'app-settings', templateUrl: './settings.component.html', styleUrls: ['./settings.component.scss'] }) -export class SettingsComponent implements OnInit { +export class SettingsComponent { constructor() { } - ngOnInit(): void { - } - } diff --git a/src/app/features/splash/splash.component.ts b/src/app/features/splash/splash.component.ts index ae711dcb..c378b425 100644 --- a/src/app/features/splash/splash.component.ts +++ b/src/app/features/splash/splash.component.ts @@ -1,15 +1,12 @@ -import { Component, OnInit } from '@angular/core'; +import { Component } from '@angular/core'; @Component({ selector: 'app-splash', templateUrl: './splash.component.html', styleUrls: ['./splash.component.scss'] }) -export class SplashComponent implements OnInit { +export class SplashComponent { constructor() { } - ngOnInit(): void { - } - } diff --git a/src/app/features/stats/stats.component.ts b/src/app/features/stats/stats.component.ts index 7df50bc7..895dbd86 100644 --- a/src/app/features/stats/stats.component.ts +++ b/src/app/features/stats/stats.component.ts @@ -1,15 +1,12 @@ -import { Component, OnInit } from '@angular/core'; +import { Component } from '@angular/core'; @Component({ selector: 'app-stats', templateUrl: './stats.component.html', styleUrls: ['./stats.component.scss'] }) -export class StatsComponent implements OnInit { +export class StatsComponent { constructor() { } - ngOnInit(): void { - } - } diff --git a/src/app/features/terms/terms.component.ts b/src/app/features/terms/terms.component.ts index c0c88bf8..82d60666 100644 --- a/src/app/features/terms/terms.component.ts +++ b/src/app/features/terms/terms.component.ts @@ -1,15 +1,12 @@ -import { Component, OnInit } from '@angular/core'; +import { Component } from '@angular/core'; @Component({ selector: 'app-terms', templateUrl: './terms.component.html', styleUrls: ['./terms.component.scss'] }) -export class TermsComponent implements OnInit { +export class TermsComponent { constructor() { } - ngOnInit(): void { - } - } diff --git a/src/app/features/the-wire/the-wire.component.ts b/src/app/features/the-wire/the-wire.component.ts index b31955c1..09d33746 100644 --- a/src/app/features/the-wire/the-wire.component.ts +++ b/src/app/features/the-wire/the-wire.component.ts @@ -1,15 +1,12 @@ -import { Component, OnInit } from '@angular/core'; +import { Component } from '@angular/core'; @Component({ selector: 'app-the-wire', templateUrl: './the-wire.component.html', styleUrls: ['./the-wire.component.scss'] }) -export class TheWireComponent implements OnInit { +export class TheWireComponent { constructor() { } - ngOnInit(): void { - } - } diff --git a/src/app/shared/components/blog-form/blog-form.component.ts b/src/app/shared/components/blog-form/blog-form.component.ts index 930a4e85..0feb09d3 100644 --- a/src/app/shared/components/blog-form/blog-form.component.ts +++ b/src/app/shared/components/blog-form/blog-form.component.ts @@ -1,5 +1,6 @@ import { Component, Input, OnDestroy, OnInit } from '@angular/core'; import { FormControl, FormGroup, Validators } from '@angular/forms'; +// eslint-disable-next-line @typescript-eslint/no-unused-vars import { TranslateService } from '@ngx-translate/core'; import { Translations } from 'src/app/core/services/translations.service'; import { Validators as EditorValidators } from 'ngx-editor'; diff --git a/src/app/shared/components/button/button.component.html b/src/app/shared/components/button/button.component.html index 85cb2d3a..ced02f33 100644 --- a/src/app/shared/components/button/button.component.html +++ b/src/app/shared/components/button/button.component.html @@ -1,4 +1,5 @@ - + +

+

+
diff --git a/src/app/features/home/home.component.scss b/src/app/features/home/home.component.scss index 6c465fa5..c843d509 100644 --- a/src/app/features/home/home.component.scss +++ b/src/app/features/home/home.component.scss @@ -1,43 +1,44 @@ -@import '../../../assets/scss/partials/layout'; -@import '../../../assets/scss/partials/colors'; - -:host { - .news-container { - width: 66%; - padding-right: $grid-step; - - app-post { - display: block; - padding-bottom: 40px; - } - - > div { - padding: 0 22px 0 22px; - } - } - - section { - .click-for-more { - text-align: center; - font-weight: 700; - padding: 10px 0; - - a { - color: $primary-2; - } - - a:hover, a:focus { - text-decoration: underline; - } - } - } - - section:not(:last-child) { - padding-bottom: 44px; - } - - app-news-list { - padding-top: 40px; - display: block; - } -} \ No newline at end of file +@import "../../../assets/scss/partials/layout"; +@import "../../../assets/scss/partials/colors"; + +:host { + .news-container { + width: 66%; + padding-right: $grid-step; + + app-post { + display: block; + padding-bottom: 40px; + } + + > div { + padding: 0 22px 0 22px; + } + } + + section { + .click-for-more { + text-align: center; + font-weight: 700; + padding: 10px 0; + + a { + color: $primary-2; + } + + a:hover, + a:focus { + text-decoration: underline; + } + } + } + + section:not(:last-child) { + padding-bottom: 44px; + } + + app-news-list { + padding-top: 40px; + display: block; + } +} diff --git a/src/app/features/home/home.component.spec.ts b/src/app/features/home/home.component.spec.ts index 2369513e..7540ad0d 100644 --- a/src/app/features/home/home.component.spec.ts +++ b/src/app/features/home/home.component.spec.ts @@ -14,23 +14,20 @@ describe('HomeComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ HomeComponent ], - imports: [ + declarations: [HomeComponent], + imports: [ TranslateModule.forRoot({ loader: { provide: TranslateLoader, - useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), - deps: [ HttpClient ] - } + useFactory: (http: HttpClient) => + new TypescriptLoader(http, 'translations'), + deps: [HttpClient], + }, }), - HttpClientModule + HttpClientModule, ], - providers: [ - TranslateService, - HttpClient, - ] - }) - .compileComponents(); + providers: [TranslateService, HttpClient], + }).compileComponents(); translateService = TestBed.inject(TranslateService); fixture = TestBed.createComponent(HomeComponent); diff --git a/src/app/features/home/home.component.ts b/src/app/features/home/home.component.ts index 82027b38..9e0dd97d 100644 --- a/src/app/features/home/home.component.ts +++ b/src/app/features/home/home.component.ts @@ -15,10 +15,9 @@ import { GroupService } from 'src/app/core/services/group.service'; @Component({ selector: 'app-home', templateUrl: './home.component.html', - styleUrls: ['./home.component.scss'] + styleUrls: ['./home.component.scss'], }) export class HomeComponent implements OnInit { - inputType = InputType.Password; routes = CoreRoutes; @@ -42,13 +41,13 @@ export class HomeComponent implements OnInit { groupsPage: number = 1; loadingGroups: boolean = true; - constructor(public translations: Translations, - public newsService: NewsService, - public eventService: EventService, - public peopleService: PeopleService, - public groupService: GroupService) { - - } + constructor( + public translations: Translations, + public newsService: NewsService, + public eventService: EventService, + public peopleService: PeopleService, + public groupService: GroupService, + ) {} ngOnInit(): void { this.newsService.getMany(10, 5000).subscribe((newsItems: INewsItem[]) => { @@ -74,7 +73,7 @@ export class HomeComponent implements OnInit { onNewsScroll(): void { this.loadingNews = true; - + this.newsService.getMany(10, 3000).subscribe((newsItems: INewsItem[]) => { this.newsItems.push(...newsItems); this.loadingNews = false; @@ -100,5 +99,4 @@ export class HomeComponent implements OnInit { console.log('Connection Declined'); console.log(person); } - } diff --git a/src/app/features/home/home.module.ts b/src/app/features/home/home.module.ts index 06ca5220..398416ef 100644 --- a/src/app/features/home/home.module.ts +++ b/src/app/features/home/home.module.ts @@ -9,11 +9,8 @@ import { GroupsModule } from '../groups/groups.module'; import { EventsModule } from '../events/events.module'; import { ProfileModule } from '../profile/profile.module'; - @NgModule({ - declarations: [ - HomeComponent - ], + declarations: [HomeComponent], imports: [ CommonModule, HomeRoutingModule, @@ -21,7 +18,7 @@ import { ProfileModule } from '../profile/profile.module'; NewsFeedModule, GroupsModule, EventsModule, - ProfileModule - ] + ProfileModule, + ], }) -export class HomeModule { } +export class HomeModule {} diff --git a/src/app/features/invite/invite-routing.module.ts b/src/app/features/invite/invite-routing.module.ts index 4c2212ad..c1cdf46d 100644 --- a/src/app/features/invite/invite-routing.module.ts +++ b/src/app/features/invite/invite-routing.module.ts @@ -6,16 +6,16 @@ const routes: Routes = [ { path: '', pathMatch: 'full', - component: InviteComponent + component: InviteComponent, }, { path: '**', - redirectTo: '' - } + redirectTo: '', + }, ]; @NgModule({ imports: [RouterModule.forChild(routes)], - exports: [RouterModule] + exports: [RouterModule], }) -export class InviteRoutingModule { } +export class InviteRoutingModule {} diff --git a/src/app/features/invite/invite.component.spec.ts b/src/app/features/invite/invite.component.spec.ts index e05d6ce0..6218be34 100644 --- a/src/app/features/invite/invite.component.spec.ts +++ b/src/app/features/invite/invite.component.spec.ts @@ -8,9 +8,8 @@ describe('InviteComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ InviteComponent ] - }) - .compileComponents(); + declarations: [InviteComponent], + }).compileComponents(); fixture = TestBed.createComponent(InviteComponent); component = fixture.componentInstance; diff --git a/src/app/features/invite/invite.component.ts b/src/app/features/invite/invite.component.ts index 44638d8d..bb1274f8 100644 --- a/src/app/features/invite/invite.component.ts +++ b/src/app/features/invite/invite.component.ts @@ -3,10 +3,8 @@ import { Component } from '@angular/core'; @Component({ selector: 'app-invite', templateUrl: './invite.component.html', - styleUrls: ['./invite.component.scss'] + styleUrls: ['./invite.component.scss'], }) export class InviteComponent { - - constructor() { } - + constructor() {} } diff --git a/src/app/features/invite/invite.module.ts b/src/app/features/invite/invite.module.ts index 0c05766c..cda75bd4 100644 --- a/src/app/features/invite/invite.module.ts +++ b/src/app/features/invite/invite.module.ts @@ -4,13 +4,8 @@ import { CommonModule } from '@angular/common'; import { InviteRoutingModule } from './invite-routing.module'; import { SharedModule } from 'src/app/shared/shared.module'; - @NgModule({ declarations: [], - imports: [ - CommonModule, - InviteRoutingModule, - SharedModule - ] + imports: [CommonModule, InviteRoutingModule, SharedModule], }) -export class InviteModule { } +export class InviteModule {} diff --git a/src/app/features/login/login-routing.module.ts b/src/app/features/login/login-routing.module.ts index 4343f037..a9f3dbf9 100644 --- a/src/app/features/login/login-routing.module.ts +++ b/src/app/features/login/login-routing.module.ts @@ -6,16 +6,16 @@ const routes: Routes = [ { path: '', pathMatch: 'full', - component: LoginComponent + component: LoginComponent, }, { path: '**', - redirectTo: '' - } + redirectTo: '', + }, ]; @NgModule({ imports: [RouterModule.forChild(routes)], - exports: [RouterModule] + exports: [RouterModule], }) -export class LoginRoutingModule { } +export class LoginRoutingModule {} diff --git a/src/app/features/login/login.component.spec.ts b/src/app/features/login/login.component.spec.ts index 7570e0c1..892bb7da 100644 --- a/src/app/features/login/login.component.spec.ts +++ b/src/app/features/login/login.component.spec.ts @@ -13,20 +13,20 @@ describe('LoginComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ LoginComponent ], - imports: [ + declarations: [LoginComponent], + imports: [ TranslateModule.forRoot({ loader: { provide: TranslateLoader, - useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), - deps: [ HttpClient ] - } + useFactory: (http: HttpClient) => + new TypescriptLoader(http, 'translations'), + deps: [HttpClient], + }, }), - HttpClientModule + HttpClientModule, ], - providers: [ TranslateService, HttpClient ] - }) - .compileComponents(); + providers: [TranslateService, HttpClient], + }).compileComponents(); translateService = TestBed.inject(TranslateService); fixture = TestBed.createComponent(LoginComponent); diff --git a/src/app/features/login/login.component.ts b/src/app/features/login/login.component.ts index 5485ab13..222b2735 100644 --- a/src/app/features/login/login.component.ts +++ b/src/app/features/login/login.component.ts @@ -3,10 +3,8 @@ import { Component } from '@angular/core'; @Component({ selector: 'app-login', templateUrl: './login.component.html', - styleUrls: ['./login.component.scss'] + styleUrls: ['./login.component.scss'], }) export class LoginComponent { - - constructor() { } - + constructor() {} } diff --git a/src/app/features/login/login.module.ts b/src/app/features/login/login.module.ts index fb52f051..f9778257 100644 --- a/src/app/features/login/login.module.ts +++ b/src/app/features/login/login.module.ts @@ -5,13 +5,7 @@ import { SharedModule } from 'src/app/shared/shared.module'; import { LoginRoutingModule } from './login-routing.module'; @NgModule({ - declarations: [ - LoginComponent - ], - imports: [ - CommonModule, - LoginRoutingModule, - SharedModule, - ] + declarations: [LoginComponent], + imports: [CommonModule, LoginRoutingModule, SharedModule], }) -export class LoginModule { } +export class LoginModule {} diff --git a/src/app/features/members/members-routing.module.ts b/src/app/features/members/members-routing.module.ts index e3410beb..cb73e199 100644 --- a/src/app/features/members/members-routing.module.ts +++ b/src/app/features/members/members-routing.module.ts @@ -6,16 +6,16 @@ const routes: Routes = [ { path: '', pathMatch: 'full', - component: MembersComponent + component: MembersComponent, }, { path: '**', - redirectTo: '' - } + redirectTo: '', + }, ]; @NgModule({ imports: [RouterModule.forChild(routes)], - exports: [RouterModule] + exports: [RouterModule], }) -export class MembersRoutingModule { } +export class MembersRoutingModule {} diff --git a/src/app/features/members/members.component.spec.ts b/src/app/features/members/members.component.spec.ts index f626726f..73222543 100644 --- a/src/app/features/members/members.component.spec.ts +++ b/src/app/features/members/members.component.spec.ts @@ -8,9 +8,8 @@ describe('MembersComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ MembersComponent ] - }) - .compileComponents(); + declarations: [MembersComponent], + }).compileComponents(); fixture = TestBed.createComponent(MembersComponent); component = fixture.componentInstance; diff --git a/src/app/features/members/members.component.ts b/src/app/features/members/members.component.ts index c6944b41..825ab5e0 100644 --- a/src/app/features/members/members.component.ts +++ b/src/app/features/members/members.component.ts @@ -3,10 +3,8 @@ import { Component } from '@angular/core'; @Component({ selector: 'app-members', templateUrl: './members.component.html', - styleUrls: ['./members.component.scss'] + styleUrls: ['./members.component.scss'], }) export class MembersComponent { - - constructor() { } - + constructor() {} } diff --git a/src/app/features/members/members.module.ts b/src/app/features/members/members.module.ts index 5a10f8fb..b8a3d40a 100644 --- a/src/app/features/members/members.module.ts +++ b/src/app/features/members/members.module.ts @@ -4,13 +4,8 @@ import { CommonModule } from '@angular/common'; import { MembersRoutingModule } from './members-routing.module'; import { SharedModule } from 'src/app/shared/shared.module'; - @NgModule({ declarations: [], - imports: [ - CommonModule, - MembersRoutingModule, - SharedModule - ] + imports: [CommonModule, MembersRoutingModule, SharedModule], }) -export class MembersModule { } +export class MembersModule {} diff --git a/src/app/features/messages/messages-routing.module.ts b/src/app/features/messages/messages-routing.module.ts index d7750fdb..ea9f94ee 100644 --- a/src/app/features/messages/messages-routing.module.ts +++ b/src/app/features/messages/messages-routing.module.ts @@ -6,16 +6,16 @@ const routes: Routes = [ { path: '', pathMatch: 'full', - component: MessagesComponent + component: MessagesComponent, }, { path: '**', - redirectTo: '' - } + redirectTo: '', + }, ]; @NgModule({ imports: [RouterModule.forChild(routes)], - exports: [RouterModule] + exports: [RouterModule], }) -export class MessagesRoutingModule { } +export class MessagesRoutingModule {} diff --git a/src/app/features/messages/messages.component.spec.ts b/src/app/features/messages/messages.component.spec.ts index a674793b..8659cd86 100644 --- a/src/app/features/messages/messages.component.spec.ts +++ b/src/app/features/messages/messages.component.spec.ts @@ -8,9 +8,8 @@ describe('MessagesComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ MessagesComponent ] - }) - .compileComponents(); + declarations: [MessagesComponent], + }).compileComponents(); fixture = TestBed.createComponent(MessagesComponent); component = fixture.componentInstance; diff --git a/src/app/features/messages/messages.component.ts b/src/app/features/messages/messages.component.ts index de5f50a0..c1d674d3 100644 --- a/src/app/features/messages/messages.component.ts +++ b/src/app/features/messages/messages.component.ts @@ -3,10 +3,8 @@ import { Component } from '@angular/core'; @Component({ selector: 'app-messages', templateUrl: './messages.component.html', - styleUrls: ['./messages.component.scss'] + styleUrls: ['./messages.component.scss'], }) export class MessagesComponent { - - constructor() { } - + constructor() {} } diff --git a/src/app/features/messages/messages.module.ts b/src/app/features/messages/messages.module.ts index 46b42729..f8986a44 100644 --- a/src/app/features/messages/messages.module.ts +++ b/src/app/features/messages/messages.module.ts @@ -4,13 +4,8 @@ import { CommonModule } from '@angular/common'; import { MessagesRoutingModule } from './messages-routing.module'; import { SharedModule } from 'src/app/shared/shared.module'; - @NgModule({ declarations: [], - imports: [ - CommonModule, - MessagesRoutingModule, - SharedModule - ] + imports: [CommonModule, MessagesRoutingModule, SharedModule], }) -export class MessagesModule { } +export class MessagesModule {} diff --git a/src/app/features/missions/missions-routing.module.ts b/src/app/features/missions/missions-routing.module.ts index 4b6f96c2..8f3e0112 100644 --- a/src/app/features/missions/missions-routing.module.ts +++ b/src/app/features/missions/missions-routing.module.ts @@ -6,16 +6,16 @@ const routes: Routes = [ { path: '', pathMatch: 'full', - component: MissionsComponent + component: MissionsComponent, }, { path: '**', - redirectTo: '' - } + redirectTo: '', + }, ]; @NgModule({ imports: [RouterModule.forChild(routes)], - exports: [RouterModule] + exports: [RouterModule], }) -export class MissionsRoutingModule { } +export class MissionsRoutingModule {} diff --git a/src/app/features/missions/missions.component.spec.ts b/src/app/features/missions/missions.component.spec.ts index 3a179402..159992bf 100644 --- a/src/app/features/missions/missions.component.spec.ts +++ b/src/app/features/missions/missions.component.spec.ts @@ -8,9 +8,8 @@ describe('MissionsComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ MissionsComponent ] - }) - .compileComponents(); + declarations: [MissionsComponent], + }).compileComponents(); fixture = TestBed.createComponent(MissionsComponent); component = fixture.componentInstance; diff --git a/src/app/features/missions/missions.component.ts b/src/app/features/missions/missions.component.ts index e5ae3bd4..50d3f7c9 100644 --- a/src/app/features/missions/missions.component.ts +++ b/src/app/features/missions/missions.component.ts @@ -3,10 +3,8 @@ import { Component } from '@angular/core'; @Component({ selector: 'app-missions', templateUrl: './missions.component.html', - styleUrls: ['./missions.component.scss'] + styleUrls: ['./missions.component.scss'], }) export class MissionsComponent { - - constructor() { } - + constructor() {} } diff --git a/src/app/features/missions/missions.module.ts b/src/app/features/missions/missions.module.ts index 84f87662..afada997 100644 --- a/src/app/features/missions/missions.module.ts +++ b/src/app/features/missions/missions.module.ts @@ -4,13 +4,8 @@ import { CommonModule } from '@angular/common'; import { MissionsRoutingModule } from './missions-routing.module'; import { SharedModule } from 'src/app/shared/shared.module'; - @NgModule({ declarations: [], - imports: [ - CommonModule, - MissionsRoutingModule, - SharedModule - ] + imports: [CommonModule, MissionsRoutingModule, SharedModule], }) -export class MissionsModule { } +export class MissionsModule {} diff --git a/src/app/features/news-feed/components/news-card/news-card.component.html b/src/app/features/news-feed/components/news-card/news-card.component.html index 28d6a7c9..ac77736f 100644 --- a/src/app/features/news-feed/components/news-card/news-card.component.html +++ b/src/app/features/news-feed/components/news-card/news-card.component.html @@ -1,93 +1,111 @@ +
+ +
-
- -
- -
- - - - -
- - - - {{ model?.author?.firstName + ' ' + model?.author?.lastName }} - - - {{ model?.author?.jobTitle }} - - +
+ + + + +
- - + + + {{ model?.author?.firstName + " " + model?.author?.lastName }} + + + {{ model?.author?.jobTitle }} + + - -

-
+ + + +

+
- -

-
+ +

+
- -

-
-
+ +

+
+
- - -
+ + + - -
+ +
+ + + + {{ + model ? (model.likes > 0 ? model.likes + (liked ? 1 : 0) : "") : "" + }} + + + + {{ model?.comments }} + - - - - {{ model ? (model.likes > 0 ? model.likes + (liked ? 1 : 0) : '') : ''}} - - - - - {{ model?.comments }} - - - - - -
+ + + +
-
- - - - -
-
-
\ No newline at end of file +
+ + + + +
+ + diff --git a/src/app/features/news-feed/components/news-card/news-card.component.scss b/src/app/features/news-feed/components/news-card/news-card.component.scss index 13fa229b..10c310a8 100644 --- a/src/app/features/news-feed/components/news-card/news-card.component.scss +++ b/src/app/features/news-feed/components/news-card/news-card.component.scss @@ -1,84 +1,84 @@ -@import "../../../../../assets//scss/partials/colors"; -@import "../../../../../assets//scss/partials/font-weights"; - -$title-padding: 90px; - -:host { - mat-card { - border: 1px solid $neutral-300; - box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25); - border-radius: 10px; - padding: 0 10px; - - .profile-wrapper { - position: absolute; - left: -20px; - top: -20px; - width: 100px; - height: 100px; - border-radius: 50%; - background-color: $background; - padding: 5px; - box-shadow: 0px 2px 4px 1px rgba(0, 0, 0, 0.25); - } - - mat-card-header { - padding: 32px 0 0 calc(16px + $title-padding); - - mat-card-title { - font-size: 20px; - font-weight: $bold; - } - - mat-card-subtitle { - font-size: 16px; - } - } - - mat-card-content { - padding-top: 15px; - padding-bottom: 10px; - } - - mat-card-actions { - padding-bottom: 10px; - padding-left: 0; - padding-right: 0; - - > div { - display: flex; - width: 50%; - align-items: center; - } - - .right-actions { - app-button { - float: right; - } - } - - i.fa-solid { - color: $primary-2; - } - - .right-actions { - flex-direction: row-reverse; - } - } - - .loading-header { - padding: 32px 0 0 calc(16px + $title-padding); - - ngx-skeleton-loader { - display: block; - width: 50%; - } - } - } - - ::ng-deep button:focus { - color: $primary-1; - } -} - -// https://stackoverflow.com/a/57759753/6479757 \ No newline at end of file +@import "../../../../../assets//scss/partials/colors"; +@import "../../../../../assets//scss/partials/font-weights"; + +$title-padding: 90px; + +:host { + mat-card { + border: 1px solid $neutral-300; + box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25); + border-radius: 10px; + padding: 0 10px; + + .profile-wrapper { + position: absolute; + left: -20px; + top: -20px; + width: 100px; + height: 100px; + border-radius: 50%; + background-color: $background; + padding: 5px; + box-shadow: 0px 2px 4px 1px rgba(0, 0, 0, 0.25); + } + + mat-card-header { + padding: 32px 0 0 calc(16px + $title-padding); + + mat-card-title { + font-size: 20px; + font-weight: $bold; + } + + mat-card-subtitle { + font-size: 16px; + } + } + + mat-card-content { + padding-top: 15px; + padding-bottom: 10px; + } + + mat-card-actions { + padding-bottom: 10px; + padding-left: 0; + padding-right: 0; + + > div { + display: flex; + width: 50%; + align-items: center; + } + + .right-actions { + app-button { + float: right; + } + } + + i.fa-solid { + color: $primary-2; + } + + .right-actions { + flex-direction: row-reverse; + } + } + + .loading-header { + padding: 32px 0 0 calc(16px + $title-padding); + + ngx-skeleton-loader { + display: block; + width: 50%; + } + } + } + + ::ng-deep button:focus { + color: $primary-1; + } +} + +// https://stackoverflow.com/a/57759753/6479757 diff --git a/src/app/features/news-feed/components/news-card/news-card.component.spec.ts b/src/app/features/news-feed/components/news-card/news-card.component.spec.ts index 512a2959..5fbdb561 100644 --- a/src/app/features/news-feed/components/news-card/news-card.component.spec.ts +++ b/src/app/features/news-feed/components/news-card/news-card.component.spec.ts @@ -1,7 +1,11 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { NewsCardComponent } from './news-card.component'; -import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core'; +import { + TranslateLoader, + TranslateModule, + TranslateService, +} from '@ngx-translate/core'; import { HttpClient, HttpClientModule } from '@angular/common/http'; import { TypescriptLoader } from 'src/app/core/helpers/typescript-loader'; @@ -17,13 +21,14 @@ describe('NewsCardComponent', () => { TranslateModule.forRoot({ loader: { provide: TranslateLoader, - useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), - deps: [ HttpClient ] - } + useFactory: (http: HttpClient) => + new TypescriptLoader(http, 'translations'), + deps: [HttpClient], + }, }), - HttpClientModule + HttpClientModule, ], - providers: [ TranslateService, HttpClient ] + providers: [TranslateService, HttpClient], }); }); diff --git a/src/app/features/news-feed/components/news-card/news-card.component.ts b/src/app/features/news-feed/components/news-card/news-card.component.ts index bd61480d..bd1f400f 100644 --- a/src/app/features/news-feed/components/news-card/news-card.component.ts +++ b/src/app/features/news-feed/components/news-card/news-card.component.ts @@ -13,10 +13,9 @@ import { CardSize } from 'src/app/shared/models/card-size'; selector: 'app-news-card', templateUrl: './news-card.component.html', styleUrls: ['./news-card.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class NewsCardComponent implements ICardComponent { - @Input() model?: INewsItem; @Input() cardSize: CardSize = CardSize.Large; @Input() loading: boolean = false; @@ -29,14 +28,14 @@ export class NewsCardComponent implements ICardComponent { constructor(public translations: Translations) {} isPost(instance: INewsItem): boolean { - return instance instanceof Post + return instance instanceof Post; } isBlog(instance: INewsItem): boolean { - return instance instanceof Blog + return instance instanceof Blog; } isPoll(instance: INewsItem): boolean { - return instance instanceof Poll + return instance instanceof Poll; } } diff --git a/src/app/features/news-feed/components/news-list/news-list.component.html b/src/app/features/news-feed/components/news-list/news-list.component.html index a718ce4d..12820783 100644 --- a/src/app/features/news-feed/components/news-list/news-list.component.html +++ b/src/app/features/news-feed/components/news-list/news-list.component.html @@ -1,16 +1,15 @@
+
+ +
-
- -
- -
- There is nothing to display. -
+
+ There is nothing to display. +
-
-
- -
+
+
+
-
\ No newline at end of file +
+
diff --git a/src/app/features/news-feed/components/news-list/news-list.component.scss b/src/app/features/news-feed/components/news-list/news-list.component.scss index a068ce5c..8875988e 100644 --- a/src/app/features/news-feed/components/news-list/news-list.component.scss +++ b/src/app/features/news-feed/components/news-list/news-list.component.scss @@ -1,14 +1,14 @@ -:host { - .news-list-container { - overflow: visible; - - .news-card-wrapper { - padding-bottom: 40px; - } - - > div:not(.news-card-wrapper) { - font-size: 18px; - font-weight: 600; - } - } -} \ No newline at end of file +:host { + .news-list-container { + overflow: visible; + + .news-card-wrapper { + padding-bottom: 40px; + } + + > div:not(.news-card-wrapper) { + font-size: 18px; + font-weight: 600; + } + } +} diff --git a/src/app/features/news-feed/components/news-list/news-list.component.spec.ts b/src/app/features/news-feed/components/news-list/news-list.component.spec.ts index b373d053..7689842b 100644 --- a/src/app/features/news-feed/components/news-list/news-list.component.spec.ts +++ b/src/app/features/news-feed/components/news-list/news-list.component.spec.ts @@ -8,7 +8,7 @@ describe('NewsListComponent', () => { beforeEach(() => { TestBed.configureTestingModule({ - declarations: [NewsListComponent] + declarations: [NewsListComponent], }); fixture = TestBed.createComponent(NewsListComponent); component = fixture.componentInstance; diff --git a/src/app/features/news-feed/components/news-list/news-list.component.ts b/src/app/features/news-feed/components/news-list/news-list.component.ts index 75b4ba52..90aca8f6 100644 --- a/src/app/features/news-feed/components/news-list/news-list.component.ts +++ b/src/app/features/news-feed/components/news-list/news-list.component.ts @@ -5,7 +5,7 @@ import { INewsItem } from '../../models/INewsItem'; selector: 'app-news-list', templateUrl: './news-list.component.html', styleUrls: ['./news-list.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class NewsListComponent { @Input() model: INewsItem[] = []; @@ -16,7 +16,7 @@ export class NewsListComponent { constructor() { this.loadingItems = []; - + for (let i = 0; i < this.loadingCount; i++) { this.loadingItems.push(i); } diff --git a/src/app/features/news-feed/models/INewsItem.ts b/src/app/features/news-feed/models/INewsItem.ts index 126d29c6..7af9baac 100644 --- a/src/app/features/news-feed/models/INewsItem.ts +++ b/src/app/features/news-feed/models/INewsItem.ts @@ -1,10 +1,10 @@ -import { Person } from "src/app/core/models/person.model"; - -export interface INewsItem { - id: string; - author: Person; - authoredDate: Date; - content: string; - comments: number; - likes: number; -} \ No newline at end of file +import { Person } from 'src/app/core/models/person.model'; + +export interface INewsItem { + id: string; + author: Person; + authoredDate: Date; + content: string; + comments: number; + likes: number; +} diff --git a/src/app/features/news-feed/news-feed-routing.module.ts b/src/app/features/news-feed/news-feed-routing.module.ts index dea2f62e..6423966a 100644 --- a/src/app/features/news-feed/news-feed-routing.module.ts +++ b/src/app/features/news-feed/news-feed-routing.module.ts @@ -6,16 +6,16 @@ const routes: Routes = [ { path: '', pathMatch: 'full', - component: NewsFeedComponent + component: NewsFeedComponent, }, { path: '**', - redirectTo: '' - } + redirectTo: '', + }, ]; @NgModule({ imports: [RouterModule.forChild(routes)], - exports: [RouterModule] + exports: [RouterModule], }) -export class NewsFeedRoutingModule { } +export class NewsFeedRoutingModule {} diff --git a/src/app/features/news-feed/news-feed.component.spec.ts b/src/app/features/news-feed/news-feed.component.spec.ts index 98b06f94..aca96c62 100644 --- a/src/app/features/news-feed/news-feed.component.spec.ts +++ b/src/app/features/news-feed/news-feed.component.spec.ts @@ -8,9 +8,8 @@ describe('NewsFeedComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ NewsFeedComponent ] - }) - .compileComponents(); + declarations: [NewsFeedComponent], + }).compileComponents(); fixture = TestBed.createComponent(NewsFeedComponent); component = fixture.componentInstance; diff --git a/src/app/features/news-feed/news-feed.component.ts b/src/app/features/news-feed/news-feed.component.ts index 19267bf2..990032a3 100644 --- a/src/app/features/news-feed/news-feed.component.ts +++ b/src/app/features/news-feed/news-feed.component.ts @@ -3,10 +3,8 @@ import { Component } from '@angular/core'; @Component({ selector: 'app-news-feed', templateUrl: './news-feed.component.html', - styleUrls: ['./news-feed.component.scss'] + styleUrls: ['./news-feed.component.scss'], }) export class NewsFeedComponent { - - constructor() { } - + constructor() {} } diff --git a/src/app/features/news-feed/news-feed.module.ts b/src/app/features/news-feed/news-feed.module.ts index f0727c47..d9b06d9d 100644 --- a/src/app/features/news-feed/news-feed.module.ts +++ b/src/app/features/news-feed/news-feed.module.ts @@ -4,27 +4,14 @@ import { CommonModule } from '@angular/common'; import { NewsFeedRoutingModule } from './news-feed-routing.module'; import { SharedModule } from 'src/app/shared/shared.module'; -import {MatCardModule} from '@angular/material/card'; +import { MatCardModule } from '@angular/material/card'; import { NewsCardComponent } from './components/news-card/news-card.component'; import { NewsListComponent } from './components/news-list/news-list.component'; - - @NgModule({ - declarations: [ - NewsCardComponent, - NewsListComponent, - ], - imports: [ - CommonModule, - NewsFeedRoutingModule, - SharedModule, - MatCardModule, - ], - exports: [ - NewsCardComponent, - NewsListComponent - ] + declarations: [NewsCardComponent, NewsListComponent], + imports: [CommonModule, NewsFeedRoutingModule, SharedModule, MatCardModule], + exports: [NewsCardComponent, NewsListComponent], }) -export class NewsFeedModule { } +export class NewsFeedModule {} diff --git a/src/app/features/privacy/privacy-routing.module.ts b/src/app/features/privacy/privacy-routing.module.ts index 842e56be..1ba42e67 100644 --- a/src/app/features/privacy/privacy-routing.module.ts +++ b/src/app/features/privacy/privacy-routing.module.ts @@ -6,16 +6,16 @@ const routes: Routes = [ { path: '', pathMatch: 'full', - component: PrivacyComponent + component: PrivacyComponent, }, { path: '**', - redirectTo: '' - } + redirectTo: '', + }, ]; @NgModule({ imports: [RouterModule.forChild(routes)], - exports: [RouterModule] + exports: [RouterModule], }) -export class PrivacyRoutingModule { } +export class PrivacyRoutingModule {} diff --git a/src/app/features/privacy/privacy.component.spec.ts b/src/app/features/privacy/privacy.component.spec.ts index 525d9cd4..7f0490b1 100644 --- a/src/app/features/privacy/privacy.component.spec.ts +++ b/src/app/features/privacy/privacy.component.spec.ts @@ -8,9 +8,8 @@ describe('PrivacyComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ PrivacyComponent ] - }) - .compileComponents(); + declarations: [PrivacyComponent], + }).compileComponents(); fixture = TestBed.createComponent(PrivacyComponent); component = fixture.componentInstance; diff --git a/src/app/features/privacy/privacy.component.ts b/src/app/features/privacy/privacy.component.ts index 92f37acd..bb87cf34 100644 --- a/src/app/features/privacy/privacy.component.ts +++ b/src/app/features/privacy/privacy.component.ts @@ -3,10 +3,8 @@ import { Component } from '@angular/core'; @Component({ selector: 'app-privacy', templateUrl: './privacy.component.html', - styleUrls: ['./privacy.component.scss'] + styleUrls: ['./privacy.component.scss'], }) export class PrivacyComponent { - - constructor() { } - + constructor() {} } diff --git a/src/app/features/privacy/privacy.module.ts b/src/app/features/privacy/privacy.module.ts index be5191cd..e3bfba7d 100644 --- a/src/app/features/privacy/privacy.module.ts +++ b/src/app/features/privacy/privacy.module.ts @@ -5,13 +5,7 @@ import { PrivacyRoutingModule } from './privacy-routing.module'; import { SharedModule } from 'src/app/shared/shared.module'; @NgModule({ - declarations: [ - PrivacyComponent - ], - imports: [ - CommonModule, - PrivacyRoutingModule, - SharedModule - ] + declarations: [PrivacyComponent], + imports: [CommonModule, PrivacyRoutingModule, SharedModule], }) -export class PrivacyModule { } +export class PrivacyModule {} diff --git a/src/app/features/profile/components/post/post.component.html b/src/app/features/profile/components/post/post.component.html index 1a846246..3697e05c 100644 --- a/src/app/features/profile/components/post/post.component.html +++ b/src/app/features/profile/components/post/post.component.html @@ -1,100 +1,123 @@ -
- -
- -
- - - - -
+
+ +
- - - {{ profile.firstName + ' ' + profile.lastName }} - - - {{ profile.jobTitle }} - - +
+ + + + +
- + + + {{ profile.firstName + " " + profile.lastName }} + + + {{ profile.jobTitle }} + + -
- - {{ translations.forms.placeholder | translate }} -
+ +
+ + {{ translations.forms.placeholder | translate }} +
- - - + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - -
+ + +
- -
- - {{ translations.forms.save | translate }} - -
-
- -
{{ translations.forms.create | translate }}
- -
-
-
-
\ No newline at end of file + +
+ + {{ translations.forms.save | translate }} + +
+
+ +
{{ translations.forms.create | translate }}
+ +
+
+
+ diff --git a/src/app/features/profile/components/post/post.component.scss b/src/app/features/profile/components/post/post.component.scss index 933a7e90..577f72d2 100644 --- a/src/app/features/profile/components/post/post.component.scss +++ b/src/app/features/profile/components/post/post.component.scss @@ -1,121 +1,122 @@ -@import "../../../../../assets//scss/partials/colors"; -@import "../../../../../assets//scss/partials/font-weights"; - -$title-padding: 90px; - -:host { - mat-card { - mat-card-content { - padding-top: 30px; - - .gcc-post-placeholder { - display: flex; - padding: 12px 17px; - border: 2px solid $neutral-300; - border-radius: 10px; - align-items: center; - margin-bottom: 16px; - cursor: pointer; - - i { - padding-right: 16px; - } - - i,span { - color: $neutral-900; - } - } - - .gcc-cancel-editing { - position: absolute; - top: 112px; - right: 26px; - - ::ng-deep { - color: $primary-1; - } - } - } - - mat-card-actions { - padding: 0px 16px 24px 16px !important; - - .right-actions { - i { - color: $primary-1-contrast; - } - } - } - } - - mat-card { - border: 1px solid $neutral-300; - box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25); - border-radius: 10px; - padding: 0 10px; - - .profile-wrapper { - position: absolute; - left: -20px; - top: -20px; - width: 100px; - height: 100px; - border-radius: 50%; - background-color: $background; - padding: 5px; - box-shadow: 0px 2px 4px 1px rgba(0, 0, 0, 0.25); - } - - mat-card-header { - padding: 32px 0 0 calc(16px + $title-padding); - - mat-card-title { - font-size: 20px; - font-weight: $bold; - } - - mat-card-subtitle { - font-size: 16px; - } - } - - mat-card-actions { - padding-bottom: 10px; - padding-left: 0; - padding-right: 0; - - > div { - display: flex; - width: 50%; - align-items: center; - } - - .right-actions { - app-button { - float: right; - } - } - - i.fa-solid { - color: $primary-2; - } - - .right-actions { - flex-direction: row-reverse; - } - } - - .loading-header { - padding: 32px 0 0 calc(16px + $title-padding); - - ngx-skeleton-loader { - display: block; - width: 50%; - } - } - } - - ::ng-deep button:focus { - color: $primary-1; - } -} +@import "../../../../../assets//scss/partials/colors"; +@import "../../../../../assets//scss/partials/font-weights"; + +$title-padding: 90px; + +:host { + mat-card { + mat-card-content { + padding-top: 30px; + + .gcc-post-placeholder { + display: flex; + padding: 12px 17px; + border: 2px solid $neutral-300; + border-radius: 10px; + align-items: center; + margin-bottom: 16px; + cursor: pointer; + + i { + padding-right: 16px; + } + + i, + span { + color: $neutral-900; + } + } + + .gcc-cancel-editing { + position: absolute; + top: 112px; + right: 26px; + + ::ng-deep { + color: $primary-1; + } + } + } + + mat-card-actions { + padding: 0px 16px 24px 16px !important; + + .right-actions { + i { + color: $primary-1-contrast; + } + } + } + } + + mat-card { + border: 1px solid $neutral-300; + box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25); + border-radius: 10px; + padding: 0 10px; + + .profile-wrapper { + position: absolute; + left: -20px; + top: -20px; + width: 100px; + height: 100px; + border-radius: 50%; + background-color: $background; + padding: 5px; + box-shadow: 0px 2px 4px 1px rgba(0, 0, 0, 0.25); + } + + mat-card-header { + padding: 32px 0 0 calc(16px + $title-padding); + + mat-card-title { + font-size: 20px; + font-weight: $bold; + } + + mat-card-subtitle { + font-size: 16px; + } + } + + mat-card-actions { + padding-bottom: 10px; + padding-left: 0; + padding-right: 0; + + > div { + display: flex; + width: 50%; + align-items: center; + } + + .right-actions { + app-button { + float: right; + } + } + + i.fa-solid { + color: $primary-2; + } + + .right-actions { + flex-direction: row-reverse; + } + } + + .loading-header { + padding: 32px 0 0 calc(16px + $title-padding); + + ngx-skeleton-loader { + display: block; + width: 50%; + } + } + } + + ::ng-deep button:focus { + color: $primary-1; + } +} diff --git a/src/app/features/profile/components/post/post.component.spec.ts b/src/app/features/profile/components/post/post.component.spec.ts index b9a20dd9..498ec8e4 100644 --- a/src/app/features/profile/components/post/post.component.spec.ts +++ b/src/app/features/profile/components/post/post.component.spec.ts @@ -1,7 +1,11 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { PostComponent } from './post.component'; -import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core'; +import { + TranslateLoader, + TranslateModule, + TranslateService, +} from '@ngx-translate/core'; import { HttpClient, HttpClientModule } from '@angular/common/http'; import { TypescriptLoader } from 'src/app/core/helpers/typescript-loader'; import { RouterTestingModule } from '@angular/router/testing'; @@ -18,14 +22,15 @@ describe('PostComponent', () => { TranslateModule.forRoot({ loader: { provide: TranslateLoader, - useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), - deps: [ HttpClient ] - } + useFactory: (http: HttpClient) => + new TypescriptLoader(http, 'translations'), + deps: [HttpClient], + }, }), HttpClientModule, - RouterTestingModule + RouterTestingModule, ], - providers: [ TranslateService, HttpClient ] + providers: [TranslateService, HttpClient], }); fixture = TestBed.createComponent(PostComponent); component = fixture.componentInstance; @@ -42,4 +47,4 @@ describe('PostComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); -}); \ No newline at end of file +}); diff --git a/src/app/features/profile/components/post/post.component.ts b/src/app/features/profile/components/post/post.component.ts index 4282364b..6673eb76 100644 --- a/src/app/features/profile/components/post/post.component.ts +++ b/src/app/features/profile/components/post/post.component.ts @@ -9,10 +9,9 @@ import { Subscription } from 'rxjs'; @Component({ selector: 'app-post', templateUrl: './post.component.html', - styleUrls: ['./post.component.scss'] + styleUrls: ['./post.component.scss'], }) export class PostComponent implements OnInit, OnDestroy { - @Input() profile!: Person; @Input() loading: boolean = false; @Input() editing: boolean = false; @@ -21,7 +20,7 @@ export class PostComponent implements OnInit, OnDestroy { new FormGroup({}), new FormGroup({}), new FormGroup({}), - new FormGroup({}) + new FormGroup({}), ]; formWatchSubs: Subscription[] = []; formChanges: boolean[] = []; @@ -32,28 +31,27 @@ export class PostComponent implements OnInit, OnDestroy { selectedForm: FormGroup = this.formGroups[this.selectedIndex]; creating: boolean = false; - constructor(public translations: Translations, - private sessionStorageService: SessionStorageService) { - - } + constructor( + public translations: Translations, + private sessionStorageService: SessionStorageService, + ) {} ngOnInit(): void { - this.formGroups.forEach(formGroup => { + this.formGroups.forEach((formGroup) => { // Create a boolean to track when a FormGroup value has changed this.formChanges.push(false); // Create a subscription that watches each FormGroup for changes this.formWatchSubs.push( - formGroup.valueChanges.subscribe(() =>{ + formGroup.valueChanges.subscribe(() => { this.formChanges[this.selectedIndex] = true; - }) + }), ); }); } ngOnDestroy(): void { - this.formWatchSubs.forEach(formWatch => { - if (formWatch) - formWatch.unsubscribe(); + this.formWatchSubs.forEach((formWatch) => { + if (formWatch) formWatch.unsubscribe(); }); } @@ -63,7 +61,12 @@ export class PostComponent implements OnInit, OnDestroy { } toggleEditing(event: Event) { - if (!this.creating && (event instanceof KeyboardEvent && (event.key == 'Enter' || event.key == 'Space')) || event instanceof KeyboardEvent == false) { + if ( + (!this.creating && + event instanceof KeyboardEvent && + (event.key == 'Enter' || event.key == 'Space')) || + event instanceof KeyboardEvent == false + ) { this.editing = !this.editing; this.selectedIndex = 0; this.selectedForm = this.formGroups[this.selectedIndex]; @@ -71,7 +74,7 @@ export class PostComponent implements OnInit, OnDestroy { } formHasValues(formGroup: FormGroup): boolean { - return Object.keys(formGroup.value).some(k => !!formGroup.value[k]); + return Object.keys(formGroup.value).some((k) => !!formGroup.value[k]); } formReady(formGroup: FormGroup): boolean { @@ -86,13 +89,20 @@ export class PostComponent implements OnInit, OnDestroy { } save(): void { - const formGroupJSON = JSON.stringify(this.formGroups[this.selectedIndex].value); - this.sessionStorageService.write('gccollab-make-a-' + this.getTypeFromIndex(this.selectedIndex), formGroupJSON); + const formGroupJSON = JSON.stringify( + this.formGroups[this.selectedIndex].value, + ); + this.sessionStorageService.write( + 'gccollab-make-a-' + this.getTypeFromIndex(this.selectedIndex), + formGroupJSON, + ); this.formChanges[this.selectedIndex] = false; } load(): void { - const savedFormGroupJSON = this.sessionStorageService.read('gccollab-make-a-' + this.getTypeFromIndex(this.selectedIndex)); + const savedFormGroupJSON = this.sessionStorageService.read( + 'gccollab-make-a-' + this.getTypeFromIndex(this.selectedIndex), + ); if (savedFormGroupJSON) { const savedFormData = JSON.parse(savedFormGroupJSON); for (const [key] of Object.entries(this.selectedForm.controls)) { @@ -106,7 +116,9 @@ export class PostComponent implements OnInit, OnDestroy { if (this.selectedForm.status === 'VALID') { this.creating = true; this.selectedForm.disable(); - this.sessionStorageService.remove('gccollab-make-a-' + this.getTypeFromIndex(this.selectedIndex)); + this.sessionStorageService.remove( + 'gccollab-make-a-' + this.getTypeFromIndex(this.selectedIndex), + ); // TODO: Setup mock service for posting forms setTimeout(() => { @@ -118,18 +130,17 @@ export class PostComponent implements OnInit, OnDestroy { } private getTypeFromIndex(index: number): string { - switch(index) { + switch (index) { case 0: - return "post"; + return 'post'; case 1: - return "blog"; + return 'blog'; case 2: - return "event"; + return 'event'; case 3: - return "poll"; + return 'poll'; default: - return "error"; + return 'error'; } } } - diff --git a/src/app/features/profile/components/profile-card/profile-card.component.html b/src/app/features/profile/components/profile-card/profile-card.component.html index 6e2741de..fad44f8e 100644 --- a/src/app/features/profile/components/profile-card/profile-card.component.html +++ b/src/app/features/profile/components/profile-card/profile-card.component.html @@ -1,55 +1,94 @@ + +
+ +
+
- -
- - -
-
+ +
+ {{ model?.firstName + " " + model?.lastName }} +
+
+ {{ model?.jobTitle }} +
+ +
- -
- {{ model?.firstName + ' ' + model?.lastName }} -
-
- {{ model?.jobTitle }} -
- -
+ + + + + + - - - - - - - - - - - - - - -
\ No newline at end of file + + + + + + + diff --git a/src/app/features/profile/components/profile-card/profile-card.component.scss b/src/app/features/profile/components/profile-card/profile-card.component.scss index 89bee269..6ee8ed8e 100644 --- a/src/app/features/profile/components/profile-card/profile-card.component.scss +++ b/src/app/features/profile/components/profile-card/profile-card.component.scss @@ -1,70 +1,70 @@ -@import "../../../../../assets//scss/partials/colors"; - -:host { - mat-card { - border: 1px solid $neutral-300; - box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25); - border-radius: 10px; - - mat-card-header { - .profile-wrapper { - width: 100px; - height: 100px; - border-radius: 50%; - background-color: #fff; - padding: 5px; - box-shadow: 0px 2px 4px 1px rgba(0, 0, 0, 0.25); - margin: auto; - } - } - - mat-card-content { - padding: 20px 12px; - - >div { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - } - - >div:first-child { - font-weight: 700; - } - - ngx-skeleton-loader { - width: 50%; - display: block; - margin: auto; - } - } - - mat-card-actions { - gap: 20px; - - app-button:first-child { - margin-left: auto; - } - - app-button:last-child { - margin-right: auto; - } - - .confirm { - color: $secondary-2; - } - - .decline { - color: $error-red; - } - - .disabled { - color: $neutral-200 !important; - } - - i { - font-size: xx-large; - } - } - } -} \ No newline at end of file +@import "../../../../../assets//scss/partials/colors"; + +:host { + mat-card { + border: 1px solid $neutral-300; + box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25); + border-radius: 10px; + + mat-card-header { + .profile-wrapper { + width: 100px; + height: 100px; + border-radius: 50%; + background-color: #fff; + padding: 5px; + box-shadow: 0px 2px 4px 1px rgba(0, 0, 0, 0.25); + margin: auto; + } + } + + mat-card-content { + padding: 20px 12px; + + > div { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + } + + > div:first-child { + font-weight: 700; + } + + ngx-skeleton-loader { + width: 50%; + display: block; + margin: auto; + } + } + + mat-card-actions { + gap: 20px; + + app-button:first-child { + margin-left: auto; + } + + app-button:last-child { + margin-right: auto; + } + + .confirm { + color: $secondary-2; + } + + .decline { + color: $error-red; + } + + .disabled { + color: $neutral-200 !important; + } + + i { + font-size: xx-large; + } + } + } +} diff --git a/src/app/features/profile/components/profile-card/profile-card.component.spec.ts b/src/app/features/profile/components/profile-card/profile-card.component.spec.ts index 8f6fc8fe..310cc222 100644 --- a/src/app/features/profile/components/profile-card/profile-card.component.spec.ts +++ b/src/app/features/profile/components/profile-card/profile-card.component.spec.ts @@ -1,7 +1,11 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ProfileCardComponent } from './profile-card.component'; -import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core'; +import { + TranslateLoader, + TranslateModule, + TranslateService, +} from '@ngx-translate/core'; import { HttpClient, HttpClientModule } from '@angular/common/http'; import { TypescriptLoader } from 'src/app/core/helpers/typescript-loader'; @@ -17,13 +21,14 @@ describe('ProfileCardComponent', () => { TranslateModule.forRoot({ loader: { provide: TranslateLoader, - useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), - deps: [ HttpClient ] - } + useFactory: (http: HttpClient) => + new TypescriptLoader(http, 'translations'), + deps: [HttpClient], + }, }), - HttpClientModule + HttpClientModule, ], - providers: [ TranslateService, HttpClient ] + providers: [TranslateService, HttpClient], }); }); diff --git a/src/app/features/profile/components/profile-card/profile-card.component.ts b/src/app/features/profile/components/profile-card/profile-card.component.ts index 0c364944..172af735 100644 --- a/src/app/features/profile/components/profile-card/profile-card.component.ts +++ b/src/app/features/profile/components/profile-card/profile-card.component.ts @@ -1,4 +1,10 @@ -import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core'; +import { + ChangeDetectionStrategy, + Component, + EventEmitter, + Input, + Output, +} from '@angular/core'; import { Router } from '@angular/router'; import { CoreRoutes } from 'src/app/core/constants/routes.constants'; import { ICardComponent } from 'src/app/core/interfaces/card-component.interface'; @@ -12,7 +18,7 @@ import { TooltipDirection } from 'src/app/shared/models/tooltip-direction'; selector: 'app-profile-card', templateUrl: './profile-card.component.html', styleUrls: ['./profile-card.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class ProfileCardComponent implements ICardComponent { @Input() model?: Person; @@ -29,33 +35,28 @@ export class ProfileCardComponent implements ICardComponent { confirmed: boolean = false; declined: boolean = false; - constructor(public translations: Translations, private router: Router) { - - } + constructor( + public translations: Translations, + private router: Router, + ) {} clickConfirm() { if (this.model) { - this.confirmed = !this.confirmed; - if (this.confirmed && this.declined) - this.declined = false; + if (this.confirmed && this.declined) this.declined = false; - if (this.confirmed) - this.confirm.emit(this.model); + if (this.confirmed) this.confirm.emit(this.model); } } clickDecline() { if (this.model) { - this.declined = !this.declined; - - if (this.declined && this.confirmed) - this.confirmed = false; - if (this.declined) - this.decline.emit(this.model); + if (this.declined && this.confirmed) this.confirmed = false; + + if (this.declined) this.decline.emit(this.model); } } diff --git a/src/app/features/profile/components/profile-list/profile-list.component.html b/src/app/features/profile/components/profile-list/profile-list.component.html index b5c9df37..dfdd22f7 100644 --- a/src/app/features/profile/components/profile-list/profile-list.component.html +++ b/src/app/features/profile/components/profile-list/profile-list.component.html @@ -1,19 +1,20 @@
+
+ + +
-
- - +
+
+
+
-
-
- -
-
- -
- There is nothing to display. -
-
\ No newline at end of file +
+ There is nothing to display. +
+
diff --git a/src/app/features/profile/components/profile-list/profile-list.component.scss b/src/app/features/profile/components/profile-list/profile-list.component.scss index 1420723b..5541c09f 100644 --- a/src/app/features/profile/components/profile-list/profile-list.component.scss +++ b/src/app/features/profile/components/profile-list/profile-list.component.scss @@ -1,7 +1,7 @@ -:host { - .profile-list-container { - .profile-card-wrapper:not(:last-child) { - padding-bottom: 12px; - } - } -} \ No newline at end of file +:host { + .profile-list-container { + .profile-card-wrapper:not(:last-child) { + padding-bottom: 12px; + } + } +} diff --git a/src/app/features/profile/components/profile-list/profile-list.component.spec.ts b/src/app/features/profile/components/profile-list/profile-list.component.spec.ts index 672e6ca9..584374bb 100644 --- a/src/app/features/profile/components/profile-list/profile-list.component.spec.ts +++ b/src/app/features/profile/components/profile-list/profile-list.component.spec.ts @@ -8,7 +8,7 @@ describe('ProfileListComponent', () => { beforeEach(() => { TestBed.configureTestingModule({ - declarations: [ProfileListComponent] + declarations: [ProfileListComponent], }); fixture = TestBed.createComponent(ProfileListComponent); component = fixture.componentInstance; diff --git a/src/app/features/profile/components/profile-list/profile-list.component.ts b/src/app/features/profile/components/profile-list/profile-list.component.ts index 2dcde2f8..44e61545 100644 --- a/src/app/features/profile/components/profile-list/profile-list.component.ts +++ b/src/app/features/profile/components/profile-list/profile-list.component.ts @@ -1,11 +1,17 @@ -import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core'; +import { + ChangeDetectionStrategy, + Component, + EventEmitter, + Input, + Output, +} from '@angular/core'; import { Person } from 'src/app/core/models/person.model'; @Component({ selector: 'app-profile-list', templateUrl: './profile-list.component.html', styleUrls: ['./profile-list.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class ProfileListComponent { @Input() model?: Person[]; @@ -19,7 +25,7 @@ export class ProfileListComponent { constructor() { this.loadingItems = []; - + for (let i = 0; i < this.loadingCount; i++) { this.loadingItems.push(i); } diff --git a/src/app/features/profile/profile-routing.module.ts b/src/app/features/profile/profile-routing.module.ts index 4affd77c..5cf09fb3 100644 --- a/src/app/features/profile/profile-routing.module.ts +++ b/src/app/features/profile/profile-routing.module.ts @@ -6,16 +6,16 @@ const routes: Routes = [ { path: '', pathMatch: 'full', - component: ProfileComponent + component: ProfileComponent, }, { path: '**', - redirectTo: '' - } + redirectTo: '', + }, ]; @NgModule({ imports: [RouterModule.forChild(routes)], - exports: [RouterModule] + exports: [RouterModule], }) -export class ProfileRoutingModule { } +export class ProfileRoutingModule {} diff --git a/src/app/features/profile/profile.component.spec.ts b/src/app/features/profile/profile.component.spec.ts index 246039d7..b8b42769 100644 --- a/src/app/features/profile/profile.component.spec.ts +++ b/src/app/features/profile/profile.component.spec.ts @@ -8,9 +8,8 @@ describe('ProfileComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ ProfileComponent ] - }) - .compileComponents(); + declarations: [ProfileComponent], + }).compileComponents(); fixture = TestBed.createComponent(ProfileComponent); component = fixture.componentInstance; diff --git a/src/app/features/profile/profile.component.ts b/src/app/features/profile/profile.component.ts index 7a634292..9d2ed30d 100644 --- a/src/app/features/profile/profile.component.ts +++ b/src/app/features/profile/profile.component.ts @@ -3,10 +3,8 @@ import { Component } from '@angular/core'; @Component({ selector: 'app-profile', templateUrl: './profile.component.html', - styleUrls: ['./profile.component.scss'] + styleUrls: ['./profile.component.scss'], }) export class ProfileComponent { - - constructor() { } - + constructor() {} } diff --git a/src/app/features/profile/profile.module.ts b/src/app/features/profile/profile.module.ts index b0d848e9..b223369d 100644 --- a/src/app/features/profile/profile.module.ts +++ b/src/app/features/profile/profile.module.ts @@ -9,13 +9,8 @@ import { MatTabsModule } from '@angular/material/tabs'; import { ProfileListComponent } from './components/profile-list/profile-list.component'; import { PostComponent } from './components/post/post.component'; - @NgModule({ - declarations: [ - ProfileCardComponent, - ProfileListComponent, - PostComponent - ], + declarations: [ProfileCardComponent, ProfileListComponent, PostComponent], imports: [ CommonModule, ProfileRoutingModule, @@ -23,10 +18,6 @@ import { PostComponent } from './components/post/post.component'; MatCardModule, MatTabsModule, ], - exports: [ - ProfileCardComponent, - ProfileListComponent, - PostComponent - ] + exports: [ProfileCardComponent, ProfileListComponent, PostComponent], }) -export class ProfileModule { } +export class ProfileModule {} diff --git a/src/app/features/register/register-routing.module.ts b/src/app/features/register/register-routing.module.ts index 1c22c747..7637fe93 100644 --- a/src/app/features/register/register-routing.module.ts +++ b/src/app/features/register/register-routing.module.ts @@ -6,16 +6,16 @@ const routes: Routes = [ { path: '', pathMatch: 'full', - component: RegisterComponent + component: RegisterComponent, }, { path: '**', - redirectTo: '' - } + redirectTo: '', + }, ]; @NgModule({ imports: [RouterModule.forChild(routes)], - exports: [RouterModule] + exports: [RouterModule], }) -export class RegisterRoutingModule { } +export class RegisterRoutingModule {} diff --git a/src/app/features/register/register.component.spec.ts b/src/app/features/register/register.component.spec.ts index f9755337..052dbca4 100644 --- a/src/app/features/register/register.component.spec.ts +++ b/src/app/features/register/register.component.spec.ts @@ -8,9 +8,8 @@ describe('RegisterComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ RegisterComponent ] - }) - .compileComponents(); + declarations: [RegisterComponent], + }).compileComponents(); fixture = TestBed.createComponent(RegisterComponent); component = fixture.componentInstance; diff --git a/src/app/features/register/register.component.ts b/src/app/features/register/register.component.ts index 10a2fcd8..1ae531ec 100644 --- a/src/app/features/register/register.component.ts +++ b/src/app/features/register/register.component.ts @@ -3,10 +3,8 @@ import { Component } from '@angular/core'; @Component({ selector: 'app-register', templateUrl: './register.component.html', - styleUrls: ['./register.component.scss'] + styleUrls: ['./register.component.scss'], }) export class RegisterComponent { - - constructor() { } - + constructor() {} } diff --git a/src/app/features/register/register.module.ts b/src/app/features/register/register.module.ts index 518fe375..97acadaf 100644 --- a/src/app/features/register/register.module.ts +++ b/src/app/features/register/register.module.ts @@ -5,13 +5,7 @@ import { RegisterRoutingModule } from './register-routing.module'; import { SharedModule } from 'src/app/shared/shared.module'; @NgModule({ - declarations: [ - RegisterComponent - ], - imports: [ - CommonModule, - RegisterRoutingModule, - SharedModule - ] + declarations: [RegisterComponent], + imports: [CommonModule, RegisterRoutingModule, SharedModule], }) -export class RegisterModule { } +export class RegisterModule {} diff --git a/src/app/features/search/search-routing.module.ts b/src/app/features/search/search-routing.module.ts index 72d4ad43..029392fa 100644 --- a/src/app/features/search/search-routing.module.ts +++ b/src/app/features/search/search-routing.module.ts @@ -6,16 +6,16 @@ const routes: Routes = [ { path: '', pathMatch: 'full', - component: SearchComponent + component: SearchComponent, }, { path: '**', - redirectTo: '' - } + redirectTo: '', + }, ]; @NgModule({ imports: [RouterModule.forChild(routes)], - exports: [RouterModule] + exports: [RouterModule], }) -export class SearchRoutingModule { } +export class SearchRoutingModule {} diff --git a/src/app/features/search/search.component.spec.ts b/src/app/features/search/search.component.spec.ts index eb69af99..bb8443bf 100644 --- a/src/app/features/search/search.component.spec.ts +++ b/src/app/features/search/search.component.spec.ts @@ -8,9 +8,8 @@ describe('SearchComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ SearchComponent ] - }) - .compileComponents(); + declarations: [SearchComponent], + }).compileComponents(); fixture = TestBed.createComponent(SearchComponent); component = fixture.componentInstance; diff --git a/src/app/features/search/search.component.ts b/src/app/features/search/search.component.ts index f15d765f..7258877c 100644 --- a/src/app/features/search/search.component.ts +++ b/src/app/features/search/search.component.ts @@ -3,10 +3,8 @@ import { Component } from '@angular/core'; @Component({ selector: 'app-search', templateUrl: './search.component.html', - styleUrls: ['./search.component.scss'] + styleUrls: ['./search.component.scss'], }) export class SearchComponent { - - constructor() { } - + constructor() {} } diff --git a/src/app/features/search/search.module.ts b/src/app/features/search/search.module.ts index 6ab4da5c..a6d4cc4e 100644 --- a/src/app/features/search/search.module.ts +++ b/src/app/features/search/search.module.ts @@ -4,13 +4,8 @@ import { CommonModule } from '@angular/common'; import { SearchRoutingModule } from './search-routing.module'; import { SharedModule } from 'src/app/shared/shared.module'; - @NgModule({ declarations: [], - imports: [ - CommonModule, - SearchRoutingModule, - SharedModule - ] + imports: [CommonModule, SearchRoutingModule, SharedModule], }) -export class SearchModule { } +export class SearchModule {} diff --git a/src/app/features/settings/settings-routing.module.ts b/src/app/features/settings/settings-routing.module.ts index 3930909c..40b25410 100644 --- a/src/app/features/settings/settings-routing.module.ts +++ b/src/app/features/settings/settings-routing.module.ts @@ -6,16 +6,16 @@ const routes: Routes = [ { path: '', pathMatch: 'full', - component: SettingsComponent + component: SettingsComponent, }, { path: '**', - redirectTo: '' - } + redirectTo: '', + }, ]; @NgModule({ imports: [RouterModule.forChild(routes)], - exports: [RouterModule] + exports: [RouterModule], }) -export class SettingsRoutingModule { } +export class SettingsRoutingModule {} diff --git a/src/app/features/settings/settings.component.spec.ts b/src/app/features/settings/settings.component.spec.ts index c39ac205..3d99c95a 100644 --- a/src/app/features/settings/settings.component.spec.ts +++ b/src/app/features/settings/settings.component.spec.ts @@ -8,9 +8,8 @@ describe('SettingsComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ SettingsComponent ] - }) - .compileComponents(); + declarations: [SettingsComponent], + }).compileComponents(); fixture = TestBed.createComponent(SettingsComponent); component = fixture.componentInstance; diff --git a/src/app/features/settings/settings.component.ts b/src/app/features/settings/settings.component.ts index aaae6d24..18989e7b 100644 --- a/src/app/features/settings/settings.component.ts +++ b/src/app/features/settings/settings.component.ts @@ -3,10 +3,8 @@ import { Component } from '@angular/core'; @Component({ selector: 'app-settings', templateUrl: './settings.component.html', - styleUrls: ['./settings.component.scss'] + styleUrls: ['./settings.component.scss'], }) export class SettingsComponent { - - constructor() { } - + constructor() {} } diff --git a/src/app/features/settings/settings.module.ts b/src/app/features/settings/settings.module.ts index b10f0000..3a0f04a1 100644 --- a/src/app/features/settings/settings.module.ts +++ b/src/app/features/settings/settings.module.ts @@ -4,13 +4,8 @@ import { CommonModule } from '@angular/common'; import { SettingsRoutingModule } from './settings-routing.module'; import { SharedModule } from 'src/app/shared/shared.module'; - @NgModule({ declarations: [], - imports: [ - CommonModule, - SettingsRoutingModule, - SharedModule - ] + imports: [CommonModule, SettingsRoutingModule, SharedModule], }) -export class SettingsModule { } +export class SettingsModule {} diff --git a/src/app/features/splash/splash-routing.module.ts b/src/app/features/splash/splash-routing.module.ts index 0c7205d1..1af0f4ee 100644 --- a/src/app/features/splash/splash-routing.module.ts +++ b/src/app/features/splash/splash-routing.module.ts @@ -6,16 +6,16 @@ const routes: Routes = [ { path: '', pathMatch: 'full', - component: SplashComponent + component: SplashComponent, }, { path: '**', - redirectTo: '' - } + redirectTo: '', + }, ]; @NgModule({ imports: [RouterModule.forChild(routes)], - exports: [RouterModule] + exports: [RouterModule], }) -export class SplashRoutingModule { } +export class SplashRoutingModule {} diff --git a/src/app/features/splash/splash.component.spec.ts b/src/app/features/splash/splash.component.spec.ts index 8f9bc183..74b4fcab 100644 --- a/src/app/features/splash/splash.component.spec.ts +++ b/src/app/features/splash/splash.component.spec.ts @@ -8,9 +8,8 @@ describe('SplashComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ SplashComponent ] - }) - .compileComponents(); + declarations: [SplashComponent], + }).compileComponents(); fixture = TestBed.createComponent(SplashComponent); component = fixture.componentInstance; diff --git a/src/app/features/splash/splash.component.ts b/src/app/features/splash/splash.component.ts index c378b425..ea56446c 100644 --- a/src/app/features/splash/splash.component.ts +++ b/src/app/features/splash/splash.component.ts @@ -3,10 +3,8 @@ import { Component } from '@angular/core'; @Component({ selector: 'app-splash', templateUrl: './splash.component.html', - styleUrls: ['./splash.component.scss'] + styleUrls: ['./splash.component.scss'], }) export class SplashComponent { - - constructor() { } - + constructor() {} } diff --git a/src/app/features/splash/splash.module.ts b/src/app/features/splash/splash.module.ts index 4bd1a66e..cae84312 100644 --- a/src/app/features/splash/splash.module.ts +++ b/src/app/features/splash/splash.module.ts @@ -5,13 +5,7 @@ import { SplashRoutingModule } from './splash-routing.module'; import { SharedModule } from 'src/app/shared/shared.module'; @NgModule({ - declarations: [ - SplashComponent - ], - imports: [ - CommonModule, - SplashRoutingModule, - SharedModule - ] + declarations: [SplashComponent], + imports: [CommonModule, SplashRoutingModule, SharedModule], }) -export class SplashModule { } +export class SplashModule {} diff --git a/src/app/features/stats/stats-routing.module.ts b/src/app/features/stats/stats-routing.module.ts index 371ac310..313e2a10 100644 --- a/src/app/features/stats/stats-routing.module.ts +++ b/src/app/features/stats/stats-routing.module.ts @@ -6,16 +6,16 @@ const routes: Routes = [ { path: '', pathMatch: 'full', - component: StatsComponent + component: StatsComponent, }, { path: '**', - redirectTo: '' - } + redirectTo: '', + }, ]; @NgModule({ imports: [RouterModule.forChild(routes)], - exports: [RouterModule] + exports: [RouterModule], }) -export class StatsRoutingModule { } +export class StatsRoutingModule {} diff --git a/src/app/features/stats/stats.component.spec.ts b/src/app/features/stats/stats.component.spec.ts index 70981277..6316fb09 100644 --- a/src/app/features/stats/stats.component.spec.ts +++ b/src/app/features/stats/stats.component.spec.ts @@ -8,9 +8,8 @@ describe('StatsComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ StatsComponent ] - }) - .compileComponents(); + declarations: [StatsComponent], + }).compileComponents(); fixture = TestBed.createComponent(StatsComponent); component = fixture.componentInstance; diff --git a/src/app/features/stats/stats.component.ts b/src/app/features/stats/stats.component.ts index 895dbd86..bf966534 100644 --- a/src/app/features/stats/stats.component.ts +++ b/src/app/features/stats/stats.component.ts @@ -3,10 +3,8 @@ import { Component } from '@angular/core'; @Component({ selector: 'app-stats', templateUrl: './stats.component.html', - styleUrls: ['./stats.component.scss'] + styleUrls: ['./stats.component.scss'], }) export class StatsComponent { - - constructor() { } - + constructor() {} } diff --git a/src/app/features/stats/stats.module.ts b/src/app/features/stats/stats.module.ts index a60e72c6..cf6c7bcc 100644 --- a/src/app/features/stats/stats.module.ts +++ b/src/app/features/stats/stats.module.ts @@ -5,15 +5,8 @@ import { StatsRoutingModule } from './stats-routing.module'; import { StatsComponent } from './stats.component'; import { SharedModule } from 'src/app/shared/shared.module'; - @NgModule({ - declarations: [ - StatsComponent - ], - imports: [ - CommonModule, - StatsRoutingModule, - SharedModule - ] + declarations: [StatsComponent], + imports: [CommonModule, StatsRoutingModule, SharedModule], }) -export class StatsModule { } +export class StatsModule {} diff --git a/src/app/features/terms/terms-routing.module.ts b/src/app/features/terms/terms-routing.module.ts index 6b6b06e7..fa8d7947 100644 --- a/src/app/features/terms/terms-routing.module.ts +++ b/src/app/features/terms/terms-routing.module.ts @@ -6,16 +6,16 @@ const routes: Routes = [ { path: '', pathMatch: 'full', - component: TermsComponent + component: TermsComponent, }, { path: '**', - redirectTo: '' - } + redirectTo: '', + }, ]; @NgModule({ imports: [RouterModule.forChild(routes)], - exports: [RouterModule] + exports: [RouterModule], }) -export class TermsRoutingModule { } +export class TermsRoutingModule {} diff --git a/src/app/features/terms/terms.component.spec.ts b/src/app/features/terms/terms.component.spec.ts index bf1cbeaa..f25bef8c 100644 --- a/src/app/features/terms/terms.component.spec.ts +++ b/src/app/features/terms/terms.component.spec.ts @@ -8,9 +8,8 @@ describe('TermsComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ TermsComponent ] - }) - .compileComponents(); + declarations: [TermsComponent], + }).compileComponents(); fixture = TestBed.createComponent(TermsComponent); component = fixture.componentInstance; diff --git a/src/app/features/terms/terms.component.ts b/src/app/features/terms/terms.component.ts index 82d60666..fc2a7042 100644 --- a/src/app/features/terms/terms.component.ts +++ b/src/app/features/terms/terms.component.ts @@ -3,10 +3,8 @@ import { Component } from '@angular/core'; @Component({ selector: 'app-terms', templateUrl: './terms.component.html', - styleUrls: ['./terms.component.scss'] + styleUrls: ['./terms.component.scss'], }) export class TermsComponent { - - constructor() { } - + constructor() {} } diff --git a/src/app/features/terms/terms.module.ts b/src/app/features/terms/terms.module.ts index 8122eec7..38279c7d 100644 --- a/src/app/features/terms/terms.module.ts +++ b/src/app/features/terms/terms.module.ts @@ -4,15 +4,8 @@ import { TermsComponent } from './terms.component'; import { TermsRoutingModule } from './terms-routing.module'; import { SharedModule } from 'src/app/shared/shared.module'; - @NgModule({ - declarations: [ - TermsComponent - ], - imports: [ - CommonModule, - TermsRoutingModule, - SharedModule - ] + declarations: [TermsComponent], + imports: [CommonModule, TermsRoutingModule, SharedModule], }) -export class TermsModule { } +export class TermsModule {} diff --git a/src/app/features/the-wire/the-wire-routing.module.ts b/src/app/features/the-wire/the-wire-routing.module.ts index df739bb4..1826f50c 100644 --- a/src/app/features/the-wire/the-wire-routing.module.ts +++ b/src/app/features/the-wire/the-wire-routing.module.ts @@ -6,16 +6,16 @@ const routes: Routes = [ { path: '', pathMatch: 'full', - component: TheWireComponent + component: TheWireComponent, }, { path: '**', - redirectTo: '' - } + redirectTo: '', + }, ]; @NgModule({ imports: [RouterModule.forChild(routes)], - exports: [RouterModule] + exports: [RouterModule], }) -export class TheWireRoutingModule { } +export class TheWireRoutingModule {} diff --git a/src/app/features/the-wire/the-wire.component.spec.ts b/src/app/features/the-wire/the-wire.component.spec.ts index 83699b48..7827d102 100644 --- a/src/app/features/the-wire/the-wire.component.spec.ts +++ b/src/app/features/the-wire/the-wire.component.spec.ts @@ -8,9 +8,8 @@ describe('TheWireComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ TheWireComponent ] - }) - .compileComponents(); + declarations: [TheWireComponent], + }).compileComponents(); fixture = TestBed.createComponent(TheWireComponent); component = fixture.componentInstance; diff --git a/src/app/features/the-wire/the-wire.component.ts b/src/app/features/the-wire/the-wire.component.ts index 09d33746..76c3d538 100644 --- a/src/app/features/the-wire/the-wire.component.ts +++ b/src/app/features/the-wire/the-wire.component.ts @@ -3,10 +3,8 @@ import { Component } from '@angular/core'; @Component({ selector: 'app-the-wire', templateUrl: './the-wire.component.html', - styleUrls: ['./the-wire.component.scss'] + styleUrls: ['./the-wire.component.scss'], }) export class TheWireComponent { - - constructor() { } - + constructor() {} } diff --git a/src/app/features/the-wire/the-wire.module.ts b/src/app/features/the-wire/the-wire.module.ts index a67cfa5a..d4c51e47 100644 --- a/src/app/features/the-wire/the-wire.module.ts +++ b/src/app/features/the-wire/the-wire.module.ts @@ -4,13 +4,8 @@ import { CommonModule } from '@angular/common'; import { TheWireRoutingModule } from './the-wire-routing.module'; import { SharedModule } from 'src/app/shared/shared.module'; - @NgModule({ declarations: [], - imports: [ - CommonModule, - TheWireRoutingModule, - SharedModule - ] + imports: [CommonModule, TheWireRoutingModule, SharedModule], }) -export class TheWireModule { } +export class TheWireModule {} diff --git a/src/app/shared/components/banner/banner.component.html b/src/app/shared/components/banner/banner.component.html index 9a1bda1a..31502da6 100644 --- a/src/app/shared/components/banner/banner.component.html +++ b/src/app/shared/components/banner/banner.component.html @@ -1,8 +1,15 @@ - diff --git a/src/app/shared/components/banner/banner.component.scss b/src/app/shared/components/banner/banner.component.scss index c5174c18..e204d752 100644 --- a/src/app/shared/components/banner/banner.component.scss +++ b/src/app/shared/components/banner/banner.component.scss @@ -18,11 +18,11 @@ background-size: cover !important; background-repeat: no-repeat !important; margin-top: 0; - + img { width: 100%; } - + .banner-content-container { height: 100%; margin: 0 $gutter-desktop; @@ -31,13 +31,13 @@ color: $primary-1-contrast; cursor: default; } - + ngx-skeleton-loader { display: block; height: 100%; - + ::ng-deep { - >div { + > div { height: 100%; } } @@ -51,4 +51,4 @@ .gcc-header-expanded { margin-top: $header-height-expanded-desktop; -} \ No newline at end of file +} diff --git a/src/app/shared/components/banner/banner.component.spec.ts b/src/app/shared/components/banner/banner.component.spec.ts index a87a2cef..a388a997 100644 --- a/src/app/shared/components/banner/banner.component.spec.ts +++ b/src/app/shared/components/banner/banner.component.spec.ts @@ -7,13 +7,10 @@ describe('PageTitleComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ BannerComponent ], - imports: [ - ], - providers: [ - ] - }) - .compileComponents(); + declarations: [BannerComponent], + imports: [], + providers: [], + }).compileComponents(); fixture = TestBed.createComponent(BannerComponent); component = fixture.componentInstance; diff --git a/src/app/shared/components/banner/banner.component.ts b/src/app/shared/components/banner/banner.component.ts index 9fffb503..12ec2000 100644 --- a/src/app/shared/components/banner/banner.component.ts +++ b/src/app/shared/components/banner/banner.component.ts @@ -3,15 +3,13 @@ import { Component, Input } from '@angular/core'; @Component({ selector: 'app-banner', templateUrl: './banner.component.html', - styleUrls: ['./banner.component.scss'] + styleUrls: ['./banner.component.scss'], }) - export class BannerComponent { - @Input() model: Banner | null = null; @Input() headerExpanded: boolean = false; @Input() loading: boolean = false; - + constructor() { if (!this.model) { this.model = new Banner(); @@ -25,4 +23,4 @@ export class Banner { constructor(backgroundImage: string = '../../../../assets/image/banner.svg') { this.backgroundImage = backgroundImage; } -} \ No newline at end of file +} diff --git a/src/app/shared/components/blog-form/blog-form.component.html b/src/app/shared/components/blog-form/blog-form.component.html index 77569d18..3b69d927 100644 --- a/src/app/shared/components/blog-form/blog-form.component.html +++ b/src/app/shared/components/blog-form/blog-form.component.html @@ -1,42 +1,51 @@ -
- - - - - - - - - - - - - - - -
\ No newline at end of file +
+ + + + + + + + + + + + + + +
diff --git a/src/app/shared/components/blog-form/blog-form.component.scss b/src/app/shared/components/blog-form/blog-form.component.scss index 8f95e9d6..6011a665 100644 --- a/src/app/shared/components/blog-form/blog-form.component.scss +++ b/src/app/shared/components/blog-form/blog-form.component.scss @@ -1,49 +1,58 @@ -@import "../../../../assets/scss/partials/colors"; - -:host { - .cover-photo-upload { - display: flex; - align-items: center; - justify-content: center; - height: 200px; - border: 2px solid $neutral-300; - border-radius: 10px; - margin-bottom: 16px; - margin-top: 5px; - } - - .cover-photo-upload.error { - border-color: $error-red; - } - - .required-star { - color: $error-red; - } - - input + app-input { - ::ng-deep { - .gcc-input-wrapper { - padding-top: 5px; - } - } - } - - mat-error { - position: absolute; - padding-left: 16px; - margin-top: -16px; - -webkit-font-smoothing: antialiased; - font-family: var(--mdc-typography-caption-font-family, var(--mdc-typography-font-family, Inter)); - font-size: var(--mdc-typography-caption-font-size, 12px); - line-height: var(--mdc-typography-caption-line-height, 20px); - font-weight: var(--mdc-typography-caption-font-weight, 400); - letter-spacing: var(--mdc-typography-caption-letter-spacing, 0.0333333333em); - -webkit-text-decoration: var(--mdc-typography-caption-text-decoration, inherit); - text-decoration: var(--mdc-typography-caption-text-decoration, inherit); - text-transform: var(--mdc-typography-caption-text-transform, none); - } - - app-editor { - padding-bottom: 16px; - } -} \ No newline at end of file +@import "../../../../assets/scss/partials/colors"; + +:host { + .cover-photo-upload { + display: flex; + align-items: center; + justify-content: center; + height: 200px; + border: 2px solid $neutral-300; + border-radius: 10px; + margin-bottom: 16px; + margin-top: 5px; + } + + .cover-photo-upload.error { + border-color: $error-red; + } + + .required-star { + color: $error-red; + } + + input + app-input { + ::ng-deep { + .gcc-input-wrapper { + padding-top: 5px; + } + } + } + + mat-error { + position: absolute; + padding-left: 16px; + margin-top: -16px; + -webkit-font-smoothing: antialiased; + font-family: var( + --mdc-typography-caption-font-family, + var(--mdc-typography-font-family, Inter) + ); + font-size: var(--mdc-typography-caption-font-size, 12px); + line-height: var(--mdc-typography-caption-line-height, 20px); + font-weight: var(--mdc-typography-caption-font-weight, 400); + letter-spacing: var( + --mdc-typography-caption-letter-spacing, + 0.0333333333em + ); + -webkit-text-decoration: var( + --mdc-typography-caption-text-decoration, + inherit + ); + text-decoration: var(--mdc-typography-caption-text-decoration, inherit); + text-transform: var(--mdc-typography-caption-text-transform, none); + } + + app-editor { + padding-bottom: 16px; + } +} diff --git a/src/app/shared/components/blog-form/blog-form.component.spec.ts b/src/app/shared/components/blog-form/blog-form.component.spec.ts index c539e268..a3d9507b 100644 --- a/src/app/shared/components/blog-form/blog-form.component.spec.ts +++ b/src/app/shared/components/blog-form/blog-form.component.spec.ts @@ -1,7 +1,11 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { BlogFormComponent } from './blog-form.component'; -import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core'; +import { + TranslateLoader, + TranslateModule, + TranslateService, +} from '@ngx-translate/core'; import { HttpClient, HttpClientModule } from '@angular/common/http'; import { TypescriptLoader } from 'src/app/core/helpers/typescript-loader'; import { RouterTestingModule } from '@angular/router/testing'; @@ -19,14 +23,15 @@ describe('BlogFormComponent', () => { TranslateModule.forRoot({ loader: { provide: TranslateLoader, - useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), - deps: [ HttpClient ] - } + useFactory: (http: HttpClient) => + new TypescriptLoader(http, 'translations'), + deps: [HttpClient], + }, }), HttpClientModule, - RouterTestingModule + RouterTestingModule, ], - providers: [ TranslateService, HttpClient ] + providers: [TranslateService, HttpClient], }); fixture = TestBed.createComponent(BlogFormComponent); component = fixture.componentInstance; diff --git a/src/app/shared/components/blog-form/blog-form.component.ts b/src/app/shared/components/blog-form/blog-form.component.ts index 0feb09d3..c91c7fce 100644 --- a/src/app/shared/components/blog-form/blog-form.component.ts +++ b/src/app/shared/components/blog-form/blog-form.component.ts @@ -17,24 +17,38 @@ export class BlogFormComponent implements OnInit, OnDestroy { publisher: '', coverPhoto: '', coverPhotoAlt: '', - description: '' - } + description: '', + }; maxBlogLength: number = 2000; - constructor(public translations: Translations) { - - } + constructor(public translations: Translations) {} ngOnInit(): void { for (const [key, value] of Object.entries(this.model)) { if (!this.form.controls[key]) { if (key == 'description') - this.form.addControl(key, new FormControl(value, [EditorValidators.required(), EditorValidators.maxLength(this.maxBlogLength)])); + this.form.addControl( + key, + new FormControl(value, [ + EditorValidators.required(), + EditorValidators.maxLength(this.maxBlogLength), + ]), + ); else if (key == 'coverPhoto') - this.form.addControl(key, new FormControl(value, [Validators.required])); + this.form.addControl( + key, + new FormControl(value, [Validators.required]), + ); else - this.form.addControl(key, new FormControl(value, [Validators.required, Validators.minLength(3), Validators.maxLength(30)])); + this.form.addControl( + key, + new FormControl(value, [ + Validators.required, + Validators.minLength(3), + Validators.maxLength(30), + ]), + ); } else { this.form.controls[key].setValue(value); } diff --git a/src/app/shared/components/button/button.component.html b/src/app/shared/components/button/button.component.html index ced02f33..a2651e40 100644 --- a/src/app/shared/components/button/button.component.html +++ b/src/app/shared/components/button/button.component.html @@ -1,207 +1,235 @@ - + - + - + - + - + - + - + - - \ No newline at end of file + + diff --git a/src/app/shared/components/button/button.component.scss b/src/app/shared/components/button/button.component.scss index d231c71d..12ed108e 100644 --- a/src/app/shared/components/button/button.component.scss +++ b/src/app/shared/components/button/button.component.scss @@ -1,168 +1,171 @@ -@import "../../../../assets/scss/partials/colors"; - -:host { - position: sticky; - - button { - margin: 0; - padding: 0; - } - - // RAISED - button.mat-raised-button[theme="primary-1"]:not([disabled="true"]) { - background: $primary-1; - color: $primary-1-contrast; - } - button.mat-raised-button[theme="primary-2"]:not([disabled="true"]) { - background: $primary-2; - color: $primary-2-contrast; - } - button.mat-raised-button[theme="secondary-1"]:not([disabled="true"]) { - background: $secondary-1; - color: $secondary-1-contrast; - } - button.mat-raised-button[theme="secondary-2"]:not([disabled="true"]) { - background: $secondary-2; - color: $secondary-2-contrast; - } - button.mat-raised-button[theme="error"]:not([disabled="true"]) { - background: $error-red; - color: $error-red-contrast; - } - button.mat-raised-button[theme="white"]:not([disabled="true"]) { - background: #fff; - color: $neutral-900; - } - button.mat-raised-button[theme="black"]:not([disabled="true"]) { - background: $neutral-900; - color: $secondary-2-contrast; - } - button.mat-raised-button[disabled="true"], - button.mat-raised-button[theme="disabled"] { - background: #9e9e9e; - color: $secondary-2-contrast; - } - - // ICON - button.mat-icon-button[theme="primary-1"]:not([disabled="true"]) { - color: $primary-1; - } - button.mat-icon-button[theme="primary-2"]:not([disabled="true"]) { - color: $primary-2; - } - button.mat-icon-button[theme="secondary-1"]:not([disabled="true"]) { - color: $secondary-1; - } - button.mat-icon-button[theme="secondary-2"]:not([disabled="true"]) { - color: $secondary-2; - } - button.mat-icon-button[theme="error"]:not([disabled="true"]) { - color: $error-red; - } - button.mat-icon-button[theme="white"]:not([disabled="true"]) { - color: #fff; - } - button.mat-icon-button[theme="black"]:not([disabled="true"]) { - color: $neutral-900; - } - button.mat-icon-button[disabled="true"], - button.mat-icon-button[theme="disabled"] { - color: #9e9e9e; - } - - // STROKED - button.mat-stroked-button { - border-radius: 10px; - border-width: 2px; - border-style: solid; - - .gcc-button-inner { - color: #000; - } - } - button.mat-stroked-button[theme="primary-1"]:not([disabled="true"]) { - border-color: $primary-1; - ::ng-deep i { - color: $primary-1; - } - } - button.mat-stroked-button[theme="primary-2"]:not([disabled="true"]) { - border-color: $primary-2; - ::ng-deep i { - color: $primary-2; - } - } - button.mat-stroked-button[theme="secondary-1"]:not([disabled="true"]) { - border-color: $secondary-1; - ::ng-deep i { - color: $secondary-1; - } - } - button.mat-stroked-button[theme="secondary-2"]:not([disabled="true"]) { - border-color: $secondary-2; - ::ng-deep i { - color: $secondary-2; - } - } - button.mat-stroked-button[theme="error"]:not([disabled="true"]) { - border-color: $error-red; - ::ng-deep i { - color: $error-red; - } - } - button.mat-stroked-button[theme="white"]:not([disabled="true"]) { - border-color: #fff; - ::ng-deep i { - color: #fff; - } - } - button.mat-stroked-button[theme="black"]:not([disabled="true"]) { - border-color: $neutral-900; - ::ng-deep i { - color: $neutral-900; - } - } - button.mat-stroked-button[disabled="true"], - button.mat-stroked-button[theme="disabled"], - button.mat-outlined-button[disabled="true"], - button.mat-outlined-button[theme="disabled"] { - border-color: $neutral-300; - ::ng-deep .gcc-button-inner { - color: $neutral-300; - - i { - color: $neutral-300; - } - } - } - - .gcc-button-inner { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - gap: 5px; - - .mat-icon { - display:flex; - align-self:center; - } - } - - ::ng-deep { - .mat-mdc-button:not(:disabled) { - color: inherit; - } - - .mat-mdc-button .mdc-button__label, .mat-mdc-unelevated-button .mdc-button__label, .mat-mdc-raised-button .mdc-button__label, .mat-mdc-outlined-button .mdc-button__label { - padding: 0 16px 0 16px; - } - - .mat-mdc-button .mat-mdc-button-touch-target, - .mat-mdc-unelevated-button .mat-mdc-button-touch-target, - .mat-mdc-raised-button .mat-mdc-button-touch-target, - .mat-mdc-outlined-button .mat-mdc-button-touch-target { - height: 100%; - } - } -} \ No newline at end of file +@import "../../../../assets/scss/partials/colors"; + +:host { + position: sticky; + + button { + margin: 0; + padding: 0; + } + + // RAISED + button.mat-raised-button[theme="primary-1"]:not([disabled="true"]) { + background: $primary-1; + color: $primary-1-contrast; + } + button.mat-raised-button[theme="primary-2"]:not([disabled="true"]) { + background: $primary-2; + color: $primary-2-contrast; + } + button.mat-raised-button[theme="secondary-1"]:not([disabled="true"]) { + background: $secondary-1; + color: $secondary-1-contrast; + } + button.mat-raised-button[theme="secondary-2"]:not([disabled="true"]) { + background: $secondary-2; + color: $secondary-2-contrast; + } + button.mat-raised-button[theme="error"]:not([disabled="true"]) { + background: $error-red; + color: $error-red-contrast; + } + button.mat-raised-button[theme="white"]:not([disabled="true"]) { + background: #fff; + color: $neutral-900; + } + button.mat-raised-button[theme="black"]:not([disabled="true"]) { + background: $neutral-900; + color: $secondary-2-contrast; + } + button.mat-raised-button[disabled="true"], + button.mat-raised-button[theme="disabled"] { + background: #9e9e9e; + color: $secondary-2-contrast; + } + + // ICON + button.mat-icon-button[theme="primary-1"]:not([disabled="true"]) { + color: $primary-1; + } + button.mat-icon-button[theme="primary-2"]:not([disabled="true"]) { + color: $primary-2; + } + button.mat-icon-button[theme="secondary-1"]:not([disabled="true"]) { + color: $secondary-1; + } + button.mat-icon-button[theme="secondary-2"]:not([disabled="true"]) { + color: $secondary-2; + } + button.mat-icon-button[theme="error"]:not([disabled="true"]) { + color: $error-red; + } + button.mat-icon-button[theme="white"]:not([disabled="true"]) { + color: #fff; + } + button.mat-icon-button[theme="black"]:not([disabled="true"]) { + color: $neutral-900; + } + button.mat-icon-button[disabled="true"], + button.mat-icon-button[theme="disabled"] { + color: #9e9e9e; + } + + // STROKED + button.mat-stroked-button { + border-radius: 10px; + border-width: 2px; + border-style: solid; + + .gcc-button-inner { + color: #000; + } + } + button.mat-stroked-button[theme="primary-1"]:not([disabled="true"]) { + border-color: $primary-1; + ::ng-deep i { + color: $primary-1; + } + } + button.mat-stroked-button[theme="primary-2"]:not([disabled="true"]) { + border-color: $primary-2; + ::ng-deep i { + color: $primary-2; + } + } + button.mat-stroked-button[theme="secondary-1"]:not([disabled="true"]) { + border-color: $secondary-1; + ::ng-deep i { + color: $secondary-1; + } + } + button.mat-stroked-button[theme="secondary-2"]:not([disabled="true"]) { + border-color: $secondary-2; + ::ng-deep i { + color: $secondary-2; + } + } + button.mat-stroked-button[theme="error"]:not([disabled="true"]) { + border-color: $error-red; + ::ng-deep i { + color: $error-red; + } + } + button.mat-stroked-button[theme="white"]:not([disabled="true"]) { + border-color: #fff; + ::ng-deep i { + color: #fff; + } + } + button.mat-stroked-button[theme="black"]:not([disabled="true"]) { + border-color: $neutral-900; + ::ng-deep i { + color: $neutral-900; + } + } + button.mat-stroked-button[disabled="true"], + button.mat-stroked-button[theme="disabled"], + button.mat-outlined-button[disabled="true"], + button.mat-outlined-button[theme="disabled"] { + border-color: $neutral-300; + ::ng-deep .gcc-button-inner { + color: $neutral-300; + + i { + color: $neutral-300; + } + } + } + + .gcc-button-inner { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + gap: 5px; + + .mat-icon { + display: flex; + align-self: center; + } + } + + ::ng-deep { + .mat-mdc-button:not(:disabled) { + color: inherit; + } + + .mat-mdc-button .mdc-button__label, + .mat-mdc-unelevated-button .mdc-button__label, + .mat-mdc-raised-button .mdc-button__label, + .mat-mdc-outlined-button .mdc-button__label { + padding: 0 16px 0 16px; + } + + .mat-mdc-button .mat-mdc-button-touch-target, + .mat-mdc-unelevated-button .mat-mdc-button-touch-target, + .mat-mdc-raised-button .mat-mdc-button-touch-target, + .mat-mdc-outlined-button .mat-mdc-button-touch-target { + height: 100%; + } + } +} diff --git a/src/app/shared/components/button/button.component.spec.ts b/src/app/shared/components/button/button.component.spec.ts index d9564d8f..73daafe5 100644 --- a/src/app/shared/components/button/button.component.spec.ts +++ b/src/app/shared/components/button/button.component.spec.ts @@ -8,9 +8,8 @@ describe('ButtonComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ ButtonComponent ] - }) - .compileComponents(); + declarations: [ButtonComponent], + }).compileComponents(); fixture = TestBed.createComponent(ButtonComponent); component = fixture.componentInstance; diff --git a/src/app/shared/components/button/button.component.ts b/src/app/shared/components/button/button.component.ts index b084a990..78acb93f 100644 --- a/src/app/shared/components/button/button.component.ts +++ b/src/app/shared/components/button/button.component.ts @@ -9,10 +9,9 @@ import { Theme } from '../../models/theme'; selector: 'app-button', templateUrl: './button.component.html', styleUrls: ['./button.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class ButtonComponent { - @Input() btnId!: string; @Input() name!: string; @Input() value!: string; @@ -20,7 +19,8 @@ export class ButtonComponent { @Input() tooltipDirection: TooltipDirection = TooltipDirection.Below; @Input() ariaLabel!: string; @Input() type: ButtonType | string = ButtonType.Button; - @Input() matButtonType: MaterialButtonType | string = MaterialButtonType.Raised; + @Input() matButtonType: MaterialButtonType | string = + MaterialButtonType.Raised; @Input() matColor: MaterialColor | string = ''; @Input() disabled: boolean = false; @Input() autofocus: boolean = false; @@ -33,6 +33,5 @@ export class ButtonComponent { public materialButtonType = MaterialButtonType; - constructor() { } - + constructor() {} } diff --git a/src/app/shared/components/calendar-button/calendar-button.component.html b/src/app/shared/components/calendar-button/calendar-button.component.html index ddfe72eb..1dc9d1ee 100644 --- a/src/app/shared/components/calendar-button/calendar-button.component.html +++ b/src/app/shared/components/calendar-button/calendar-button.component.html @@ -1,18 +1,26 @@ -
-
- {{ model | date:'LLL' | uppercase }} -
-
- {{ model | date:'dd' }} -
+
+
+ {{ model | date: "LLL" | uppercase }} +
+
+ {{ model | date: "dd" }} +
- \ No newline at end of file + diff --git a/src/app/shared/components/calendar-button/calendar-button.component.scss b/src/app/shared/components/calendar-button/calendar-button.component.scss index 1657ccd5..6ddeb3ec 100644 --- a/src/app/shared/components/calendar-button/calendar-button.component.scss +++ b/src/app/shared/components/calendar-button/calendar-button.component.scss @@ -1,62 +1,61 @@ -@import "../../../../assets/scss/partials/colors"; - -:host { - display: block; - container-type: inline-size; - container-name: calendar; - - .event-calendar { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - width: 100%; - height: 100%; - border-radius: 12px; - color: $secondary-2-contrast; - background: $secondary-2-gradient; - cursor: pointer; - - @container calendar (min-width: 65px) { - div:first-child { - font-weight: 400; - font-size: 20px; - } - - div:last-child { - font-weight: 700; - font-size: 24px; - } - } - - @container calendar (min-width: 120px) { - div:first-child { - font-weight: 400; - font-size: 36px; - } - - div:last-child { - font-weight: 700; - font-size: 52px; - } - } - } - - .event-calendar.canceled { - background: $error-red-gradient; - } - - .event-calendar.past { - background: $neutral-700 !important; - } - - .event-calendar-loading { - - ::ng-deep >div { - width: 100%; - height: 100%; - border-radius: 12px; - margin: 0; - } - } -} +@import "../../../../assets/scss/partials/colors"; + +:host { + display: block; + container-type: inline-size; + container-name: calendar; + + .event-calendar { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + width: 100%; + height: 100%; + border-radius: 12px; + color: $secondary-2-contrast; + background: $secondary-2-gradient; + cursor: pointer; + + @container calendar (min-width: 65px) { + div:first-child { + font-weight: 400; + font-size: 20px; + } + + div:last-child { + font-weight: 700; + font-size: 24px; + } + } + + @container calendar (min-width: 120px) { + div:first-child { + font-weight: 400; + font-size: 36px; + } + + div:last-child { + font-weight: 700; + font-size: 52px; + } + } + } + + .event-calendar.canceled { + background: $error-red-gradient; + } + + .event-calendar.past { + background: $neutral-700 !important; + } + + .event-calendar-loading { + ::ng-deep > div { + width: 100%; + height: 100%; + border-radius: 12px; + margin: 0; + } + } +} diff --git a/src/app/shared/components/calendar-button/calendar-button.component.spec.ts b/src/app/shared/components/calendar-button/calendar-button.component.spec.ts index 3221bf58..923540a9 100644 --- a/src/app/shared/components/calendar-button/calendar-button.component.spec.ts +++ b/src/app/shared/components/calendar-button/calendar-button.component.spec.ts @@ -1,7 +1,11 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { CalendarButtonComponent } from './calendar-button.component'; -import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core'; +import { + TranslateLoader, + TranslateModule, + TranslateService, +} from '@ngx-translate/core'; import { HttpClient, HttpClientModule } from '@angular/common/http'; import { TypescriptLoader } from 'src/app/core/helpers/typescript-loader'; @@ -17,13 +21,14 @@ describe('CalendarButtonComponent', () => { TranslateModule.forRoot({ loader: { provide: TranslateLoader, - useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), - deps: [ HttpClient ] - } + useFactory: (http: HttpClient) => + new TypescriptLoader(http, 'translations'), + deps: [HttpClient], + }, }), - HttpClientModule + HttpClientModule, ], - providers: [ TranslateService, HttpClient ] + providers: [TranslateService, HttpClient], }); }); diff --git a/src/app/shared/components/calendar-button/calendar-button.component.ts b/src/app/shared/components/calendar-button/calendar-button.component.ts index 748b4147..03ec53b1 100644 --- a/src/app/shared/components/calendar-button/calendar-button.component.ts +++ b/src/app/shared/components/calendar-button/calendar-button.component.ts @@ -6,10 +6,9 @@ import { TooltipDirection } from 'src/app/shared/models/tooltip-direction'; selector: 'app-calendar-button', templateUrl: './calendar-button.component.html', styleUrls: ['./calendar-button.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class CalendarButtonComponent { - @Input() model: Date | undefined; @Input() tooltip: string = ''; @Input() aria: string = ''; @@ -17,17 +16,13 @@ export class CalendarButtonComponent { @Input() canceled: boolean = false; @Input() loading: boolean = false; - constructor(public translations: Translations) - { } - - click() { + constructor(public translations: Translations) {} - } + click() {} isPast(): boolean { - if (this.model && this.model < new Date()) - return true; - + if (this.model && this.model < new Date()) return true; + return false; } } diff --git a/src/app/shared/components/editor/editor.component.html b/src/app/shared/components/editor/editor.component.html index 532f57ee..a9d2c9f6 100644 --- a/src/app/shared/components/editor/editor.component.html +++ b/src/app/shared/components/editor/editor.component.html @@ -1,64 +1,106 @@ - - {{ label }} -
*
- - - + + {{ label }} +
*
+ + +
-
- - - - -
- {{ characterCount }} / {{ maxCharacters }} -
+
+ + + + +
+ {{ characterCount }} / {{ maxCharacters }} +
- {{ hint }} + {{ hint }} - - {{ translations.input.error.minLength | translate }} {{ control.errors!['minlength'].requiredLength }}. + + {{ translations.input.error.minLength | translate }} + {{ control.errors!["minlength"].requiredLength }}. - - {{ translations.input.error.maxLength | translate }} {{ control.errors!['maxlength'].requiredLength }}. + + {{ translations.input.error.maxLength | translate }} + {{ control.errors!["maxlength"].requiredLength }}. - {{ label }} {{ translations.input.error.required | translate }} + {{ label }} {{ translations.input.error.required | translate }} - + - \ No newline at end of file + diff --git a/src/app/shared/components/editor/editor.component.scss b/src/app/shared/components/editor/editor.component.scss index 1fe12eee..fd325d3a 100644 --- a/src/app/shared/components/editor/editor.component.scss +++ b/src/app/shared/components/editor/editor.component.scss @@ -1,163 +1,173 @@ -@import "../../../../assets/scss/partials/colors"; - -:host { - display: block; - width: 100%; - - .NgxEditor__Wrapper { - position: relative; - max-width: 100%; - max-height: 100%; - border-radius: 10px; - border: 2px solid $neutral-300; - - ngx-editor-menu { - ::ng-deep { - .NgxEditor__MenuBar { - border-top-left-radius: 10px; - border-top-right-radius: 10px; - border-bottom: 2px solid $neutral-300; - - ngx-toggle-command { - svg { - pointer-events: none; - } - } - - ngx-dropdown { - .NgxEditor__Dropdown--Item { - font-weight: bold; - } - .NgxEditor__Dropdown--Item:nth-child(1) { - font-size: 2em; - } - .NgxEditor__Dropdown--Item:nth-child(2) { - font-size: 1.5em; - } - .NgxEditor__Dropdown--Item:nth-child(3) { - font-size: 1.33em; - } - .NgxEditor__Dropdown--Item:nth-child(4) { - font-size: 1.17em; - } - .NgxEditor__Dropdown--Item:nth-child(5) { - font-size: 0.83em; - } - .NgxEditor__Dropdown--Item:nth-child(6) { - font-size: 0.67em; - } - } - } - } - } - - ngx-editor { - ::ng-deep { - .NgxEditor { - border-bottom-left-radius: 10px; - border-bottom-right-radius: 10px; - } - } - } - - .character-count { - text-align: right; - margin: 0 10px 4px 0; - color: $neutral-500; - pointer-events: none; - } - - .character-count.error { - color: #e92020; - font-weight: 500; - } - } - - .NgxEditor__Wrapper.focus { - border-color: $primary-1; - - ngx-editor-menu { - ::ng-deep { - .NgxEditor__MenuBar { - border-color: $primary-1; - } - } - } - } - - .NgxEditor__Wrapper.error:not(.disabled) { - border-color: $error-red; - - ngx-editor-menu { - ::ng-deep { - .NgxEditor__MenuBar { - border-color: $error-red; - } - } - } - } - - mat-label { - font-size: 18px; - font-weight: 600; - display: inline-block; - padding-bottom: 8px; - - .required-star { - display: inline-block; - color: $error-red; - } - - i { - margin-left: 5px; - cursor: pointer; - color: $primary-1; - } - } - - mat-label.disabled { - color: $neutral-300; - - .required-star, i { - color: $neutral-300 !important; - } - - .NgxEditor__Wrapper.error { - border-color: $neutral-300; - - ngx-editor-menu { - ::ng-deep { - .NgxEditor__MenuBar { - border-color: $neutral-300; - } - } - } - } - } - - .disabled ngx-editor ::ng-deep .NgxEditor__Content--Disabled { - color: $neutral-300 !important; - } - - mat-hint { - font-size: smaller; - font-style: italic; - color: #757575; - padding: 0 16px; - display: block; - } - - mat-error { - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - font-family: var(--mdc-typography-caption-font-family, var(--mdc-typography-font-family, Inter)); - font-size: var(--mdc-typography-caption-font-size, 12px); - line-height: var(--mdc-typography-caption-line-height, 20px); - font-weight: var(--mdc-typography-caption-font-weight, 400); - letter-spacing: var(--mdc-typography-caption-letter-spacing, 0.0333333333em); - -webkit-text-decoration: var(--mdc-typography-caption-text-decoration, inherit); - text-decoration: var(--mdc-typography-caption-text-decoration, inherit); - text-transform: var(--mdc-typography-caption-text-transform, none); - padding: 0 16px; - } -} \ No newline at end of file +@import "../../../../assets/scss/partials/colors"; + +:host { + display: block; + width: 100%; + + .NgxEditor__Wrapper { + position: relative; + max-width: 100%; + max-height: 100%; + border-radius: 10px; + border: 2px solid $neutral-300; + + ngx-editor-menu { + ::ng-deep { + .NgxEditor__MenuBar { + border-top-left-radius: 10px; + border-top-right-radius: 10px; + border-bottom: 2px solid $neutral-300; + + ngx-toggle-command { + svg { + pointer-events: none; + } + } + + ngx-dropdown { + .NgxEditor__Dropdown--Item { + font-weight: bold; + } + .NgxEditor__Dropdown--Item:nth-child(1) { + font-size: 2em; + } + .NgxEditor__Dropdown--Item:nth-child(2) { + font-size: 1.5em; + } + .NgxEditor__Dropdown--Item:nth-child(3) { + font-size: 1.33em; + } + .NgxEditor__Dropdown--Item:nth-child(4) { + font-size: 1.17em; + } + .NgxEditor__Dropdown--Item:nth-child(5) { + font-size: 0.83em; + } + .NgxEditor__Dropdown--Item:nth-child(6) { + font-size: 0.67em; + } + } + } + } + } + + ngx-editor { + ::ng-deep { + .NgxEditor { + border-bottom-left-radius: 10px; + border-bottom-right-radius: 10px; + } + } + } + + .character-count { + text-align: right; + margin: 0 10px 4px 0; + color: $neutral-500; + pointer-events: none; + } + + .character-count.error { + color: #e92020; + font-weight: 500; + } + } + + .NgxEditor__Wrapper.focus { + border-color: $primary-1; + + ngx-editor-menu { + ::ng-deep { + .NgxEditor__MenuBar { + border-color: $primary-1; + } + } + } + } + + .NgxEditor__Wrapper.error:not(.disabled) { + border-color: $error-red; + + ngx-editor-menu { + ::ng-deep { + .NgxEditor__MenuBar { + border-color: $error-red; + } + } + } + } + + mat-label { + font-size: 18px; + font-weight: 600; + display: inline-block; + padding-bottom: 8px; + + .required-star { + display: inline-block; + color: $error-red; + } + + i { + margin-left: 5px; + cursor: pointer; + color: $primary-1; + } + } + + mat-label.disabled { + color: $neutral-300; + + .required-star, + i { + color: $neutral-300 !important; + } + + .NgxEditor__Wrapper.error { + border-color: $neutral-300; + + ngx-editor-menu { + ::ng-deep { + .NgxEditor__MenuBar { + border-color: $neutral-300; + } + } + } + } + } + + .disabled ngx-editor ::ng-deep .NgxEditor__Content--Disabled { + color: $neutral-300 !important; + } + + mat-hint { + font-size: smaller; + font-style: italic; + color: #757575; + padding: 0 16px; + display: block; + } + + mat-error { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: var( + --mdc-typography-caption-font-family, + var(--mdc-typography-font-family, Inter) + ); + font-size: var(--mdc-typography-caption-font-size, 12px); + line-height: var(--mdc-typography-caption-line-height, 20px); + font-weight: var(--mdc-typography-caption-font-weight, 400); + letter-spacing: var( + --mdc-typography-caption-letter-spacing, + 0.0333333333em + ); + -webkit-text-decoration: var( + --mdc-typography-caption-text-decoration, + inherit + ); + text-decoration: var(--mdc-typography-caption-text-decoration, inherit); + text-transform: var(--mdc-typography-caption-text-transform, none); + padding: 0 16px; + } +} diff --git a/src/app/shared/components/editor/editor.component.spec.ts b/src/app/shared/components/editor/editor.component.spec.ts index 05052215..3079e304 100644 --- a/src/app/shared/components/editor/editor.component.spec.ts +++ b/src/app/shared/components/editor/editor.component.spec.ts @@ -14,23 +14,20 @@ describe('EditorComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ EditorComponent ], - imports: [ + declarations: [EditorComponent], + imports: [ TranslateModule.forRoot({ loader: { provide: TranslateLoader, - useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), - deps: [ HttpClient ] - } + useFactory: (http: HttpClient) => + new TypescriptLoader(http, 'translations'), + deps: [HttpClient], + }, }), - HttpClientModule + HttpClientModule, ], - providers: [ - TranslateService, - HttpClient, - ] - }) - .compileComponents(); + providers: [TranslateService, HttpClient], + }).compileComponents(); translateService = TestBed.inject(TranslateService); fixture = TestBed.createComponent(EditorComponent); diff --git a/src/app/shared/components/editor/editor.component.ts b/src/app/shared/components/editor/editor.component.ts index 1f553271..9d734437 100644 --- a/src/app/shared/components/editor/editor.component.ts +++ b/src/app/shared/components/editor/editor.component.ts @@ -1,10 +1,26 @@ -import { AfterContentInit, AfterViewInit, Component, ElementRef, EventEmitter, Input, OnDestroy, OnInit, Output, ViewChild, forwardRef } from '@angular/core'; +import { + AfterContentInit, + AfterViewInit, + Component, + ElementRef, + EventEmitter, + Input, + OnDestroy, + OnInit, + Output, + ViewChild, + forwardRef, +} from '@angular/core'; import { TranslateService } from '@ngx-translate/core'; import { Editor, NgxEditorService, Toolbar } from 'ngx-editor'; import { ngxEditorLocals } from '../../factories/editor-config.factory'; import { Subscription } from 'rxjs/internal/Subscription'; import { Translations } from 'src/app/core/services/translations.service'; -import { ControlValueAccessor, FormControl, NG_VALUE_ACCESSOR } from '@angular/forms'; +import { + ControlValueAccessor, + FormControl, + NG_VALUE_ACCESSOR, +} from '@angular/forms'; import { TooltipDirection } from '../../models/tooltip-direction'; // https://sibiraj-s.github.io/ngx-editor/en/introduction/ @@ -20,32 +36,39 @@ import { TooltipDirection } from '../../models/tooltip-direction'; }, ], }) -export class EditorComponent implements OnInit, OnDestroy, AfterViewInit, AfterContentInit, ControlValueAccessor { +export class EditorComponent + implements + OnInit, + OnDestroy, + AfterViewInit, + AfterContentInit, + ControlValueAccessor +{ @Input() html!: string; @Input() required: boolean = false; - @Input({required: true}) label!: string; + @Input({ required: true }) label!: string; @Input() hint!: string; @Input() autofocus: boolean = false; - @Input({required: true}) control!: FormControl; + @Input({ required: true }) control!: FormControl; @Input() minCharacters: number = 0; @Input() maxCharacters: number = Number.MAX_VALUE; @Output() htmlChange = new EventEmitter(); @ViewChild('gccEditor') editorViewChild!: ElementRef; - + editor: Editor; toolbar: Toolbar = [ ['bold', 'italic'], ['underline', 'strike'], ['code', 'blockquote'], ['ordered_list', 'bullet_list'], - [ { heading: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'] }], + [{ heading: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'] }], ['link', 'image'], ['align_left', 'align_center', 'align_right', 'align_justify'], ['horizontal_rule', 'format_clear'], ]; - + showHint: boolean = false; hasFocus: boolean = false; characterCount: number = 0; @@ -56,17 +79,17 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit, AfterC // eslint-disable-next-line @typescript-eslint/no-unused-vars onChange = (_: unknown) => {}; onTouched = () => {}; - + private langChangeSub!: Subscription; private keydownRef = this.handleKeyDown.bind(this); private ariaRef = this.toggleAria.bind(this); private dropdownRef = this.handleDropDown.bind(this); constructor( - public translations: Translations, - private translateService: TranslateService, - private ngxEditorService: NgxEditorService, - private elementRef: ElementRef + public translations: Translations, + private translateService: TranslateService, + private ngxEditorService: NgxEditorService, + private elementRef: ElementRef, ) { this.editor = new Editor({ history: true, @@ -77,11 +100,10 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit, AfterC this.langChangeSub = this.translateService.onLangChange.subscribe(() => { this.onLangChange(); }); - } + } ngOnInit(): void { - if (!this.editor) - this.editor = new Editor(); + if (!this.editor) this.editor = new Editor(); if (!this.html) { this.html = ''; @@ -91,8 +113,7 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit, AfterC } ngAfterContentInit(): void { - if (this.control && this.html != '') - this.updateCharacterCount(this.html); + if (this.control && this.html != '') this.updateCharacterCount(this.html); } ngAfterViewInit() { @@ -100,9 +121,13 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit, AfterC this.focusChange = new MutationObserver((mutations: MutationRecord[]) => { mutations.forEach(() => { - const classList = this.editorViewChild.nativeElement?.children[1]?.children[0]?.children[0]?.classList; + const classList = + this.editorViewChild.nativeElement?.children[1]?.children[0] + ?.children[0]?.classList; if (classList) { - this.hasFocus = Array.from(classList).includes('ProseMirror-focused') ? true : false; + this.hasFocus = Array.from(classList).includes('ProseMirror-focused') + ? true + : false; if (this.control && !this.hasFocus) { this.control.markAsTouched(); @@ -112,26 +137,23 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit, AfterC }); }); - const node = this.editorViewChild.nativeElement?.children[1]?.children[0]?.children[0]; + const node = + this.editorViewChild.nativeElement?.children[1]?.children[0]?.children[0]; if (node instanceof Node) { this.focusChange.observe(node, { attributeFilter: ['class'], }); } - if (this.autofocus) - this.editor.commands.focus(); + if (this.autofocus) this.editor.commands.focus(); } ngOnDestroy(): void { - if (this.editor) - this.editor.destroy(); + if (this.editor) this.editor.destroy(); - if (this.langChangeSub) - this.langChangeSub.unsubscribe(); + if (this.langChangeSub) this.langChangeSub.unsubscribe(); - if (this.focusChange) - this.focusChange.disconnect(); + if (this.focusChange) this.focusChange.disconnect(); } updateCharacterCount(content: string, markAsTouched: boolean = false) { @@ -149,82 +171,120 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit, AfterC } onLangChange(): void { - this.ngxEditorService.config.locals = ngxEditorLocals(this.translateService, this.translations); + this.ngxEditorService.config.locals = ngxEditorLocals( + this.translateService, + this.translations, + ); setTimeout(() => { this.addAccessibility( - '[title="' + this.translateService.instant(this.translations.editor.bold) + '"]', - this.translateService.instant(this.translations.editor.bold) + '[title="' + + this.translateService.instant(this.translations.editor.bold) + + '"]', + this.translateService.instant(this.translations.editor.bold), ); this.addAccessibility( - '[title="' + this.translateService.instant(this.translations.editor.italic) + '"]', - this.translateService.instant(this.translations.editor.italic) + '[title="' + + this.translateService.instant(this.translations.editor.italic) + + '"]', + this.translateService.instant(this.translations.editor.italic), ); this.addAccessibility( - '[title="' + this.translateService.instant(this.translations.editor.underline) + '"]', - this.translateService.instant(this.translations.editor.underline) + '[title="' + + this.translateService.instant(this.translations.editor.underline) + + '"]', + this.translateService.instant(this.translations.editor.underline), ); this.addAccessibility( - '[title="' + this.translateService.instant(this.translations.editor.strike) + '"]', - this.translateService.instant(this.translations.editor.strike) + '[title="' + + this.translateService.instant(this.translations.editor.strike) + + '"]', + this.translateService.instant(this.translations.editor.strike), ); this.addAccessibility( - '[title="' + this.translateService.instant(this.translations.editor.code) + '"]', - this.translateService.instant(this.translations.editor.code) + '[title="' + + this.translateService.instant(this.translations.editor.code) + + '"]', + this.translateService.instant(this.translations.editor.code), ); this.addAccessibility( - '[title="' + this.translateService.instant(this.translations.editor.blockquote) + '"]', - this.translateService.instant(this.translations.editor.blockquote) + '[title="' + + this.translateService.instant(this.translations.editor.blockquote) + + '"]', + this.translateService.instant(this.translations.editor.blockquote), ); this.addAccessibility( - '[title="' + this.translateService.instant(this.translations.editor.orderedlist) + '"]', - this.translateService.instant(this.translations.editor.orderedlist) + '[title="' + + this.translateService.instant(this.translations.editor.orderedlist) + + '"]', + this.translateService.instant(this.translations.editor.orderedlist), ); this.addAccessibility( - '[title="' + this.translateService.instant(this.translations.editor.bulletlist) + '"]', - this.translateService.instant(this.translations.editor.bulletlist) + '[title="' + + this.translateService.instant(this.translations.editor.bulletlist) + + '"]', + this.translateService.instant(this.translations.editor.bulletlist), ); this.addAccessibility( - '[title="' + this.translateService.instant(this.translations.editor.linkinsert) + '"]', - this.translateService.instant(this.translations.editor.linkinsert) + '[title="' + + this.translateService.instant(this.translations.editor.linkinsert) + + '"]', + this.translateService.instant(this.translations.editor.linkinsert), ); this.addAccessibility( - '[title="' + this.translateService.instant(this.translations.editor.imginsert) + '"]', - this.translateService.instant(this.translations.editor.imginsert) + '[title="' + + this.translateService.instant(this.translations.editor.imginsert) + + '"]', + this.translateService.instant(this.translations.editor.imginsert), ); this.addAccessibility( - '[title="' + this.translateService.instant(this.translations.editor.alignleft) + '"]', - this.translateService.instant(this.translations.editor.alignleft) + '[title="' + + this.translateService.instant(this.translations.editor.alignleft) + + '"]', + this.translateService.instant(this.translations.editor.alignleft), ); this.addAccessibility( - '[title="' + this.translateService.instant(this.translations.editor.aligncenter) + '"]', - this.translateService.instant(this.translations.editor.aligncenter) + '[title="' + + this.translateService.instant(this.translations.editor.aligncenter) + + '"]', + this.translateService.instant(this.translations.editor.aligncenter), ); this.addAccessibility( - '[title="' + this.translateService.instant(this.translations.editor.alignright) + '"]', - this.translateService.instant(this.translations.editor.alignright) + '[title="' + + this.translateService.instant(this.translations.editor.alignright) + + '"]', + this.translateService.instant(this.translations.editor.alignright), ); this.addAccessibility( - '[title="' + this.translateService.instant(this.translations.editor.alignjustify) + '"]', - this.translateService.instant(this.translations.editor.alignjustify) + '[title="' + + this.translateService.instant(this.translations.editor.alignjustify) + + '"]', + this.translateService.instant(this.translations.editor.alignjustify), ); this.addAccessibility( - '[title="' + this.translateService.instant(this.translations.editor.horizontalrule) + '"]', - this.translateService.instant(this.translations.editor.horizontalrule) + '[title="' + + this.translateService.instant( + this.translations.editor.horizontalrule, + ) + + '"]', + this.translateService.instant(this.translations.editor.horizontalrule), ); this.addAccessibility( - '[title="' + this.translateService.instant(this.translations.editor.formatclear) + '"]', - this.translateService.instant(this.translations.editor.formatclear) + '[title="' + + this.translateService.instant(this.translations.editor.formatclear) + + '"]', + this.translateService.instant(this.translations.editor.formatclear), ); this.addAccessibility( - '.NgxEditor__Dropdown .NgxEditor__Dropdown--Text', - this.translateService.instant(this.translations.editor.title) + '.NgxEditor__Dropdown .NgxEditor__Dropdown--Text', + this.translateService.instant(this.translations.editor.title), ); }, 500); } addAccessibility(selector: string, ariaLabel: string): void { - const el: HTMLElement = this.elementRef.nativeElement.querySelectorAll(selector)[0]; + const el: HTMLElement = + this.elementRef.nativeElement.querySelectorAll(selector)[0]; if (el) { el.removeEventListener('keydown', this.keydownRef); @@ -234,9 +294,15 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit, AfterC el.removeEventListener('keydown', this.dropdownRef); el.removeEventListener('click', this.dropdownRef); } - + el.setAttribute('tabIndex', '0'); - el.setAttribute('ariaLabel', el.classList.contains('NgxEditor__MenuItem--Active') ? ariaLabel + this.translateService.instant(this.translations.editor.enabled) : ariaLabel); + el.setAttribute( + 'ariaLabel', + el.classList.contains('NgxEditor__MenuItem--Active') + ? ariaLabel + + this.translateService.instant(this.translations.editor.enabled) + : ariaLabel, + ); el.addEventListener('keydown', this.keydownRef); el.addEventListener('click', this.ariaRef); @@ -245,27 +311,29 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit, AfterC el.addEventListener('keydown', this.dropdownRef); el.addEventListener('click', this.dropdownRef); } - } else - console.warn(selector + " not found."); + } else console.warn(selector + ' not found.'); } // TODO: Aria labels for drop down (enabled/disabled) handleDropDown(event: Event): void { - if (event instanceof KeyboardEvent && (event.key != 'Enter' && event.key != ' ')) + if ( + event instanceof KeyboardEvent && + event.key != 'Enter' && + event.key != ' ' + ) return; setTimeout(() => { - if (event.target instanceof HTMLElement && - event.target.className.includes('NgxEditor__Dropdown--Selected') && - event.target.nextSibling) { - + if ( + event.target instanceof HTMLElement && + event.target.className.includes('NgxEditor__Dropdown--Selected') && + event.target.nextSibling + ) { event.target.nextSibling.childNodes.forEach((el) => { - if (el instanceof HTMLElement) - el.setAttribute('tabIndex', '0'); - el.addEventListener('keydown', (event) => { - if (event instanceof KeyboardEvent) - this.handleKeyDown(event); - }); + if (el instanceof HTMLElement) el.setAttribute('tabIndex', '0'); + el.addEventListener('keydown', (event) => { + if (event instanceof KeyboardEvent) this.handleKeyDown(event); + }); }); } }, 0); @@ -279,14 +347,24 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit, AfterC this.toggleAria(event); } } - + toggleAria(event: Event) { setTimeout(() => { if (event.target instanceof HTMLElement) { - if (event.target.classList.contains('NgxEditor__MenuItem--Active') || event.target.classList.contains('NgxEditor__Dropdown--Active')) { - event.target.setAttribute('ariaLabel', this.cleanAriaLable(event.target) + this.translateService.instant(this.translations.editor.enabled)); + if ( + event.target.classList.contains('NgxEditor__MenuItem--Active') || + event.target.classList.contains('NgxEditor__Dropdown--Active') + ) { + event.target.setAttribute( + 'ariaLabel', + this.cleanAriaLable(event.target) + + this.translateService.instant(this.translations.editor.enabled), + ); } else { - event.target.setAttribute('ariaLabel', this.cleanAriaLable(event.target)); + event.target.setAttribute( + 'ariaLabel', + this.cleanAriaLable(event.target), + ); } } }, 250); @@ -295,7 +373,10 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit, AfterC cleanAriaLable(el: HTMLElement): string { const ariaLabel = el.getAttribute('ariaLabel'); if (ariaLabel) { - return ariaLabel.replaceAll(this.translateService.instant(this.translations.editor.enabled), ''); + return ariaLabel.replaceAll( + this.translateService.instant(this.translations.editor.enabled), + '', + ); } return ''; } @@ -327,7 +408,7 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit, AfterC // eslint-disable-next-line @typescript-eslint/no-explicit-any registerOnChange(fn: any): void { - this.onChange = fn; + this.onChange = fn; } // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -335,7 +416,7 @@ export class EditorComponent implements OnInit, OnDestroy, AfterViewInit, AfterC this.onTouched = fn; } - onInputChange(value: string) { + onInputChange(value: string) { this.html = value; this.onChange(this.html); this.htmlChange.emit(this.html); diff --git a/src/app/shared/components/editor/menu/editor-menu/editor-menu.component.html b/src/app/shared/components/editor/menu/editor-menu/editor-menu.component.html index f523a01a..472b14d8 100644 --- a/src/app/shared/components/editor/menu/editor-menu/editor-menu.component.html +++ b/src/app/shared/components/editor/menu/editor-menu/editor-menu.component.html @@ -1,7 +1,12 @@
-
+
CodeMirror -
\ No newline at end of file +
diff --git a/src/app/shared/components/editor/menu/editor-menu/editor-menu.component.ts b/src/app/shared/components/editor/menu/editor-menu/editor-menu.component.ts index 27cb91f4..173381b5 100644 --- a/src/app/shared/components/editor/menu/editor-menu/editor-menu.component.ts +++ b/src/app/shared/components/editor/menu/editor-menu/editor-menu.component.ts @@ -9,7 +9,7 @@ import { isNodeActive } from 'ngx-editor/helpers'; @Component({ selector: 'app-editor-menu', templateUrl: './editor-menu.component.html', - styleUrls: ['./editor-menu.component.scss'] + styleUrls: ['./editor-menu.component.scss'], }) export class EditorMenuComponent implements OnInit { constructor() {} @@ -55,5 +55,4 @@ export class EditorMenuComponent implements OnInit { this.editor.registerPlugin(plugin); } - } diff --git a/src/app/shared/components/event-form/event-form.component.html b/src/app/shared/components/event-form/event-form.component.html index 16f8b1ec..c004c2d3 100644 --- a/src/app/shared/components/event-form/event-form.component.html +++ b/src/app/shared/components/event-form/event-form.component.html @@ -1,162 +1,213 @@
- - {{ translations.forms.event.type_of_event | translate }} -
*
-
- - - - {{ translations.forms.event.in_person | translate }} - - - {{ translations.forms.event.hybrid | translate }} - - - {{ translations.forms.event.online | translate }} - - + + {{ translations.forms.event.type_of_event | translate }} +
*
+
- - + + + {{ translations.forms.event.in_person | translate }} + + + {{ translations.forms.event.hybrid | translate }} + + + {{ translations.forms.event.online | translate }} + + - - + + - - {{ translations.forms.event.event_language | translate }} -
*
-
- - - - {{ translations.forms.event.english | translate }} - - - {{ translations.forms.event.french | translate }} - - - {{ translations.forms.event.bilingual | translate }} - - - - - - - - + + - - + + {{ translations.forms.event.event_language | translate }} +
*
+
- - {{ translations.forms.event.duration | translate }} -
*
-
- - - - {{ translations.forms.event.single_day | translate }} - - - {{ translations.forms.event.multi_day | translate }} - - + + + {{ translations.forms.event.english | translate }} + + + {{ translations.forms.event.french | translate }} + + + {{ translations.forms.event.bilingual | translate }} + + -
-
- - - - - - -
- -
- - - - - -
+ + + + + + + + + + + {{ translations.forms.event.duration | translate }} +
*
+
+ + + + {{ translations.forms.event.single_day | translate }} + + + {{ translations.forms.event.multi_day | translate }} + + + +
+
+ + + + + + +
+ +
+ + + + +
+
diff --git a/src/app/shared/components/event-form/event-form.component.scss b/src/app/shared/components/event-form/event-form.component.scss index bd463aa5..667fb97a 100644 --- a/src/app/shared/components/event-form/event-form.component.scss +++ b/src/app/shared/components/event-form/event-form.component.scss @@ -1,28 +1,28 @@ -@import "../../../../assets/scss/partials/colors"; - -mat-label { - font-size: 18px; - font-weight: 600; - display: inline-block; - padding-bottom: 8px; - - .required-star { - display: inline-block; - color: $error-red; - } -} - -mat-radio-group { - display: block; - margin-bottom: 16px; -} - -app-editor { - margin-bottom: 16px; -} - -.gcc-date-time-picker { - display: flex; - align-items: flex-end; - gap: 50px; -} \ No newline at end of file +@import "../../../../assets/scss/partials/colors"; + +mat-label { + font-size: 18px; + font-weight: 600; + display: inline-block; + padding-bottom: 8px; + + .required-star { + display: inline-block; + color: $error-red; + } +} + +mat-radio-group { + display: block; + margin-bottom: 16px; +} + +app-editor { + margin-bottom: 16px; +} + +.gcc-date-time-picker { + display: flex; + align-items: flex-end; + gap: 50px; +} diff --git a/src/app/shared/components/event-form/event-form.component.spec.ts b/src/app/shared/components/event-form/event-form.component.spec.ts index 72af617a..79fe86b3 100644 --- a/src/app/shared/components/event-form/event-form.component.spec.ts +++ b/src/app/shared/components/event-form/event-form.component.spec.ts @@ -1,7 +1,11 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { EventFormComponent } from './event-form.component'; -import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core'; +import { + TranslateLoader, + TranslateModule, + TranslateService, +} from '@ngx-translate/core'; import { HttpClient, HttpClientModule } from '@angular/common/http'; import { TypescriptLoader } from 'src/app/core/helpers/typescript-loader'; import { RouterTestingModule } from '@angular/router/testing'; @@ -19,14 +23,15 @@ describe('EventFormComponent', () => { TranslateModule.forRoot({ loader: { provide: TranslateLoader, - useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), - deps: [ HttpClient ] - } + useFactory: (http: HttpClient) => + new TypescriptLoader(http, 'translations'), + deps: [HttpClient], + }, }), HttpClientModule, - RouterTestingModule + RouterTestingModule, ], - providers: [ TranslateService, HttpClient ] + providers: [TranslateService, HttpClient], }); fixture = TestBed.createComponent(EventFormComponent); component = fixture.componentInstance; diff --git a/src/app/shared/components/event-form/event-form.component.ts b/src/app/shared/components/event-form/event-form.component.ts index 7e44d00c..e7791e43 100644 --- a/src/app/shared/components/event-form/event-form.component.ts +++ b/src/app/shared/components/event-form/event-form.component.ts @@ -1,4 +1,10 @@ -import { AfterContentInit, Component, Input, OnDestroy, OnInit } from '@angular/core'; +import { + AfterContentInit, + Component, + Input, + OnDestroy, + OnInit, +} from '@angular/core'; import { FormControl, FormGroup, Validators } from '@angular/forms'; // eslint-disable-next-line @typescript-eslint/no-unused-vars import { TranslateService } from '@ngx-translate/core'; @@ -8,7 +14,7 @@ import { Validators as EditorValidators } from 'ngx-editor'; @Component({ selector: 'app-event-form', templateUrl: './event-form.component.html', - styleUrls: ['./event-form.component.scss'] + styleUrls: ['./event-form.component.scss'], }) export class EventFormComponent implements OnInit, OnDestroy, AfterContentInit { @Input() form: FormGroup = new FormGroup({}); @@ -24,8 +30,8 @@ export class EventFormComponent implements OnInit, OnDestroy, AfterContentInit { eventStartDate: '', eventStartTime: '12:00', eventEndDate: '', - eventEndTime: '13:00' - } + eventEndTime: '13:00', + }; eventType = EventType; eventLanguage = EventLanguage; @@ -35,17 +41,28 @@ export class EventFormComponent implements OnInit, OnDestroy, AfterContentInit { private minValidator = Validators.minLength(3); private maxValidator = Validators.maxLength(30); - constructor(public translations: Translations) { - - } + constructor(public translations: Translations) {} ngOnInit(): void { for (const [key, value] of Object.entries(this.model)) { if (!this.form.controls[key]) { if (key == 'eventDescription') - this.form.addControl(key, new FormControl(value, [EditorValidators.required(), EditorValidators.maxLength(this.maxCharacters)])); + this.form.addControl( + key, + new FormControl(value, [ + EditorValidators.required(), + EditorValidators.maxLength(this.maxCharacters), + ]), + ); else - this.form.addControl(key, new FormControl(value, [Validators.required, this.minValidator, this.maxValidator])); + this.form.addControl( + key, + new FormControl(value, [ + Validators.required, + this.minValidator, + this.maxValidator, + ]), + ); } else { this.form.controls[key].setValue(value); } @@ -95,46 +112,54 @@ export class EventFormComponent implements OnInit, OnDestroy, AfterContentInit { } private removeValidators(controlName: string): void { - this.form.controls[controlName]?.removeValidators([Validators.required, this.minValidator, this.maxValidator]); + this.form.controls[controlName]?.removeValidators([ + Validators.required, + this.minValidator, + this.maxValidator, + ]); this.form.controls[controlName]?.clearValidators(); this.form.controls[controlName]?.updateValueAndValidity(); } private addValidators(controlName: string): void { - this.form.controls[controlName]?.addValidators([Validators.required, this.minValidator, this.maxValidator]); + this.form.controls[controlName]?.addValidators([ + Validators.required, + this.minValidator, + this.maxValidator, + ]); this.form.controls[controlName]?.clearValidators(); this.form.controls[controlName]?.updateValueAndValidity(); } } export interface IEventForm { - eventType: EventType | string, - eventOrganizerName: string, - eventName: string, - eventLanguage: EventLanguage | string, - eventDescription: string, - eventLocation: string, - eventOnlinePlatform: string, - eventDuration: EventDuration | string, - eventStartDate: string, - eventStartTime: string, - eventEndDate: string - eventEndTime: string + eventType: EventType | string; + eventOrganizerName: string; + eventName: string; + eventLanguage: EventLanguage | string; + eventDescription: string; + eventLocation: string; + eventOnlinePlatform: string; + eventDuration: EventDuration | string; + eventStartDate: string; + eventStartTime: string; + eventEndDate: string; + eventEndTime: string; } enum EventType { - InPerson = "In Person", - Hybrid = "Hybrid", - Online = "Online" + InPerson = 'In Person', + Hybrid = 'Hybrid', + Online = 'Online', } enum EventDuration { - Single = "Single", - Multi = "Multi" + Single = 'Single', + Multi = 'Multi', } enum EventLanguage { - English = "English", - French = "French", - Bilingual = "Bilingual" + English = 'English', + French = 'French', + Bilingual = 'Bilingual', } diff --git a/src/app/shared/components/file-select/file-select.component.html b/src/app/shared/components/file-select/file-select.component.html index 5f1402f2..0a3e520b 100644 --- a/src/app/shared/components/file-select/file-select.component.html +++ b/src/app/shared/components/file-select/file-select.component.html @@ -1,40 +1,79 @@
- +
-
- +
+
- - - {{ control && control.value ? (photoName ? (photoName | truncateFileName: 18) : translations.forms.saved_image | translate) : label }} - * - + + + {{ + control && control.value + ? photoName + ? (photoName | truncateFileName: 18) + : (translations.forms.saved_image | translate) + : label + }} + * + - - - * + + + * - {{ error }} + {{ error }} - - {{ label + ' ' + (translations.input.error.required | translate) }} + + {{ label + " " + (translations.input.error.required | translate) }} - \ No newline at end of file + diff --git a/src/app/shared/components/file-select/file-select.component.scss b/src/app/shared/components/file-select/file-select.component.scss index 252c1bac..8906bb88 100644 --- a/src/app/shared/components/file-select/file-select.component.scss +++ b/src/app/shared/components/file-select/file-select.component.scss @@ -1,51 +1,60 @@ -@import "../../../../assets/scss/partials/colors"; - -:host { - .form { - display: flex; - align-items: center; - justify-content: center; - height: 200px; - border: 2px solid $neutral-300; - border-radius: 10px; - margin-bottom: 16px; - margin-top: 5px; - } - - .form.error { - border-color: $error-red; - } - - .required-star { - color: $error-red; - } - - .required-star.icon { - position: absolute; - top: 0; - right: 5px; - } - - input + app-input { - ::ng-deep { - .gcc-input-wrapper { - padding-top: 5px; - } - } - } - - mat-error { - position: absolute; - padding-left: 16px; - margin-top: -16px; - -webkit-font-smoothing: antialiased; - font-family: var(--mdc-typography-caption-font-family, var(--mdc-typography-font-family, Inter)); - font-size: var(--mdc-typography-caption-font-size, 12px); - line-height: var(--mdc-typography-caption-line-height, 20px); - font-weight: var(--mdc-typography-caption-font-weight, 400); - letter-spacing: var(--mdc-typography-caption-letter-spacing, 0.0333333333em); - -webkit-text-decoration: var(--mdc-typography-caption-text-decoration, inherit); - text-decoration: var(--mdc-typography-caption-text-decoration, inherit); - text-transform: var(--mdc-typography-caption-text-transform, none); - } -} \ No newline at end of file +@import "../../../../assets/scss/partials/colors"; + +:host { + .form { + display: flex; + align-items: center; + justify-content: center; + height: 200px; + border: 2px solid $neutral-300; + border-radius: 10px; + margin-bottom: 16px; + margin-top: 5px; + } + + .form.error { + border-color: $error-red; + } + + .required-star { + color: $error-red; + } + + .required-star.icon { + position: absolute; + top: 0; + right: 5px; + } + + input + app-input { + ::ng-deep { + .gcc-input-wrapper { + padding-top: 5px; + } + } + } + + mat-error { + position: absolute; + padding-left: 16px; + margin-top: -16px; + -webkit-font-smoothing: antialiased; + font-family: var( + --mdc-typography-caption-font-family, + var(--mdc-typography-font-family, Inter) + ); + font-size: var(--mdc-typography-caption-font-size, 12px); + line-height: var(--mdc-typography-caption-line-height, 20px); + font-weight: var(--mdc-typography-caption-font-weight, 400); + letter-spacing: var( + --mdc-typography-caption-letter-spacing, + 0.0333333333em + ); + -webkit-text-decoration: var( + --mdc-typography-caption-text-decoration, + inherit + ); + text-decoration: var(--mdc-typography-caption-text-decoration, inherit); + text-transform: var(--mdc-typography-caption-text-transform, none); + } +} diff --git a/src/app/shared/components/file-select/file-select.component.spec.ts b/src/app/shared/components/file-select/file-select.component.spec.ts index 3e6851de..82aa72b8 100644 --- a/src/app/shared/components/file-select/file-select.component.spec.ts +++ b/src/app/shared/components/file-select/file-select.component.spec.ts @@ -1,7 +1,11 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { FileSelectComponent } from './file-select.component'; -import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core'; +import { + TranslateLoader, + TranslateModule, + TranslateService, +} from '@ngx-translate/core'; import { HttpClient, HttpClientModule } from '@angular/common/http'; import { TypescriptLoader } from 'src/app/core/helpers/typescript-loader'; import { RouterTestingModule } from '@angular/router/testing'; @@ -19,14 +23,15 @@ describe('FileSelectComponent', () => { TranslateModule.forRoot({ loader: { provide: TranslateLoader, - useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), - deps: [ HttpClient ] - } + useFactory: (http: HttpClient) => + new TypescriptLoader(http, 'translations'), + deps: [HttpClient], + }, }), HttpClientModule, - RouterTestingModule + RouterTestingModule, ], - providers: [ TranslateService, HttpClient ] + providers: [TranslateService, HttpClient], }); fixture = TestBed.createComponent(FileSelectComponent); component = fixture.componentInstance; diff --git a/src/app/shared/components/file-select/file-select.component.ts b/src/app/shared/components/file-select/file-select.component.ts index d8847dfe..a8c8a3f8 100644 --- a/src/app/shared/components/file-select/file-select.component.ts +++ b/src/app/shared/components/file-select/file-select.component.ts @@ -1,4 +1,11 @@ -import { Component, ElementRef, Input, OnDestroy, OnInit, ViewChild } from '@angular/core'; +import { + Component, + ElementRef, + Input, + OnDestroy, + OnInit, + ViewChild, +} from '@angular/core'; import { FormControl, Validators } from '@angular/forms'; import { Theme } from '../../models/theme'; import { TooltipDirection } from '../../models/tooltip-direction'; @@ -10,11 +17,11 @@ import { TranslateService } from '@ngx-translate/core'; @Component({ selector: 'app-file-select', templateUrl: './file-select.component.html', - styleUrls: ['./file-select.component.scss'] + styleUrls: ['./file-select.component.scss'], }) export class FileSelectComponent implements OnInit, OnDestroy { - @Input({required: true}) label: string = ''; - @Input({required: true}) control!: FormControl; + @Input({ required: true }) label: string = ''; + @Input({ required: true }) control!: FormControl; @Input() fileType: FileType | string = FileType.Image; @Input() view: FileSelectView | string = FileSelectView.Form; // TODO: Icon/Button @Input() tooltip!: string; @@ -22,7 +29,7 @@ export class FileSelectComponent implements OnInit, OnDestroy { @Input() ariaLabel!: string; // Should only be used for FileSelectView.Icon @Input() theme: Theme | string = Theme.Primary1; - // All + // All @Input() maxSize: number = 3145728; // Bytes @Input() ignoreExt: string[] = []; @@ -30,7 +37,7 @@ export class FileSelectComponent implements OnInit, OnDestroy { @Input() maxLength: number = Number.MAX_SAFE_INTEGER; @Input() minLength: number = 0; - // Photo + // Photo @Input() maxWidth: number = 1920; @Input() maxHeight: number = 1080; @Input() minWidth: number = 25; @@ -48,27 +55,99 @@ export class FileSelectComponent implements OnInit, OnDestroy { private focusSub!: Subscription; private textExtensions = [ - 'txt', 'csv', 'json', 'xml', 'html', 'md', 'log', - 'pdf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', - 'odt', 'ods', 'odp', 'rtf', 'tex', 'epub' + 'txt', + 'csv', + 'json', + 'xml', + 'html', + 'md', + 'log', + 'pdf', + 'doc', + 'docx', + 'xls', + 'xlsx', + 'ppt', + 'pptx', + 'odt', + 'ods', + 'odp', + 'rtf', + 'tex', + 'epub', ]; private imageExtensions = [ - 'jpg', 'jpeg', 'png', 'gif', 'bmp', - 'tiff', 'webp', 'svg', 'ico' + 'jpg', + 'jpeg', + 'png', + 'gif', + 'bmp', + 'tiff', + 'webp', + 'svg', + 'ico', ]; private audioExtensions = [ - 'mp3', 'wav', 'ogg', 'aac', 'wma', 'flac', - 'm4a', 'ac3', 'amr', 'aiff', 'au' - ]; + 'mp3', + 'wav', + 'ogg', + 'aac', + 'wma', + 'flac', + 'm4a', + 'ac3', + 'amr', + 'aiff', + 'au', + ]; private videoExtensions = [ - 'mp4', 'avi', 'mkv', 'mov', 'wmv', 'flv', - 'webm', 'mpeg', 'm4v', '3gp', 'ogg' + 'mp4', + 'avi', + 'mkv', + 'mov', + 'wmv', + 'flv', + 'webm', + 'mpeg', + 'm4v', + '3gp', + 'ogg', ]; private blacklist: string[] = [ - 'c', 'cgi', 'pl', 'class', 'cpp', 'cs', 'h', 'java', 'php', - 'py', 'sh', 'swift', 'vb', 'asp', 'aspx', 'cer', 'cfm', - 'css', 'htm', 'html', 'js', 'jsp', 'part', 'rss', 'xhtml', - 'apk', 'bat', 'bin', 'com', 'exe', 'gadget', 'jar', 'msi', 'wsf' + 'c', + 'cgi', + 'pl', + 'class', + 'cpp', + 'cs', + 'h', + 'java', + 'php', + 'py', + 'sh', + 'swift', + 'vb', + 'asp', + 'aspx', + 'cer', + 'cfm', + 'css', + 'htm', + 'html', + 'js', + 'jsp', + 'part', + 'rss', + 'xhtml', + 'apk', + 'bat', + 'bin', + 'com', + 'exe', + 'gadget', + 'jar', + 'msi', + 'wsf', ]; clickCallback: () => unknown = this.openFilePicker.bind(this); @@ -78,28 +157,31 @@ export class FileSelectComponent implements OnInit, OnDestroy { private previousTranslation: string | undefined; private previousError: string | undefined; - constructor(private focusTrackingService: FocusTrackingService, - public translations: Translations, private translateService: TranslateService) { + constructor( + private focusTrackingService: FocusTrackingService, + public translations: Translations, + private translateService: TranslateService, + ) { this.langChangeSub = this.translateService.onLangChange.subscribe(() => { this.onLangChange(); }); } ngOnInit(): void { - this.focusSub = this.focusTrackingService.getAppFocusObservable().subscribe((isInFocus) => { - this.appInFocus = isInFocus; - if (isInFocus && this.filePickerHasOpened) { - this.control.markAsTouched(); - } - }); + this.focusSub = this.focusTrackingService + .getAppFocusObservable() + .subscribe((isInFocus) => { + this.appInFocus = isInFocus; + if (isInFocus && this.filePickerHasOpened) { + this.control.markAsTouched(); + } + }); } ngOnDestroy(): void { - if (this.focusSub) - this.focusSub.unsubscribe(); + if (this.focusSub) this.focusSub.unsubscribe(); - if (this.langChangeSub) - this.langChangeSub.unsubscribe(); + if (this.langChangeSub) this.langChangeSub.unsubscribe(); } openFilePicker(): void { @@ -119,37 +201,44 @@ export class FileSelectComponent implements OnInit, OnDestroy { if (selectedFile) { if (!this.isCorrectExtension(selectedFile.name)) { this.setError(this.translations.file_select.error.extension); - } - else if (selectedFile.size > this.maxSize) { - this.setError(this.translations.file_select.error.size, this.maxSize / 1024 + " KB."); - } - else { - - this.loadFile(selectedFile).then((dataURL) => { - - if (this.fileType == FileType.Text && dataURL.length > this.maxLength) { - return this.setError(this.translations.file_select.error.characters, this.maxLength.toString()); - } - else if (this.fileType == FileType.Image) { - this.isCorrectDimensions(selectedFile).then((result) => { - if (result !== true) - return this.setError(result as string); - }); - } - - this.control.setValue(dataURL); - this.photoName = selectedFile.name; - this.clearError(); - }).catch((error) => { - this.setError(this.translateService.instant(this.translations.file_select.error.read)); - console.error(error); - }); + } else if (selectedFile.size > this.maxSize) { + this.setError( + this.translations.file_select.error.size, + this.maxSize / 1024 + ' KB.', + ); + } else { + this.loadFile(selectedFile) + .then((dataURL) => { + if ( + this.fileType == FileType.Text && + dataURL.length > this.maxLength + ) { + return this.setError( + this.translations.file_select.error.characters, + this.maxLength.toString(), + ); + } else if (this.fileType == FileType.Image) { + this.isCorrectDimensions(selectedFile).then((result) => { + if (result !== true) return this.setError(result as string); + }); + } + + this.control.setValue(dataURL); + this.photoName = selectedFile.name; + this.clearError(); + }) + .catch((error) => { + this.setError( + this.translateService.instant( + this.translations.file_select.error.read, + ), + ); + console.error(error); + }); } - } - else - this.control.markAsTouched(); + } else this.control.markAsTouched(); } - + private loadFile(file: File): Promise { return new Promise((resolve, reject) => { const reader = new FileReader(); @@ -167,12 +256,11 @@ export class FileSelectComponent implements OnInit, OnDestroy { private isCorrectExtension(fileName: string): boolean { const fileExtension = fileName.split('.').pop(); - if (!fileExtension) - return false; + if (!fileExtension) return false; let valid = true; - switch(this.fileType) { + switch (this.fileType) { case FileType.Text: valid = this.textExtensions.includes(fileExtension.toLowerCase()); break; @@ -193,7 +281,13 @@ export class FileSelectComponent implements OnInit, OnDestroy { return valid && !this.blacklist.includes(fileExtension.toLowerCase()); } - private isCorrectDimensions(file: File, maxWidth: number = this.maxWidth, maxHeight: number = this.maxHeight, minWidth: number = this.minWidth, minHeight: number = this.minHeight): Promise { + private isCorrectDimensions( + file: File, + maxWidth: number = this.maxWidth, + maxHeight: number = this.maxHeight, + minWidth: number = this.minWidth, + minHeight: number = this.minHeight, + ): Promise { return new Promise((resolve) => { const img = new Image(); @@ -205,12 +299,23 @@ export class FileSelectComponent implements OnInit, OnDestroy { const isSmall = width <= minWidth || height <= minHeight; if (!isLarge && !isSmall) { - resolve(true); + resolve(true); } else { - - resolve(isLarge ? - this.translateService.instant(this.translations.file_select.error.img_large) + this.maxWidth + "x" + this.maxHeight : - this.translateService.instant(this.translations.file_select.error.img_small) + this.minWidth + "x" + this.minHeight); + resolve( + isLarge + ? this.translateService.instant( + this.translations.file_select.error.img_large, + ) + + this.maxWidth + + 'x' + + this.maxHeight + : this.translateService.instant( + this.translations.file_select.error.img_small, + ) + + this.minWidth + + 'x' + + this.minHeight, + ); } }; @@ -236,21 +341,20 @@ export class FileSelectComponent implements OnInit, OnDestroy { } private onLangChange() { - if (this.error) - this.setError(this.previousTranslation, this.previousError); + if (this.error) this.setError(this.previousTranslation, this.previousError); } } enum FileType { - Text = "text/plain, application/pdf, application/msword, application/vnd.openxmlformats-officedocument.wordprocessingml.document, application/vnd.ms-excel, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", - Image = "image/*", - Audio = "audio/*", - Video = "video/*", - All = "*/*" + Text = 'text/plain, application/pdf, application/msword, application/vnd.openxmlformats-officedocument.wordprocessingml.document, application/vnd.ms-excel, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + Image = 'image/*', + Audio = 'audio/*', + Video = 'video/*', + All = '*/*', } enum FileSelectView { - Button = "button", - Form = "form", - Icon = "icon" -} \ No newline at end of file + Button = 'button', + Form = 'form', + Icon = 'icon', +} diff --git a/src/app/shared/components/footer/footer.component.html b/src/app/shared/components/footer/footer.component.html index 66d2dd0a..0c4aa4f0 100644 --- a/src/app/shared/components/footer/footer.component.html +++ b/src/app/shared/components/footer/footer.component.html @@ -1,68 +1,77 @@ \ No newline at end of file +
+ diff --git a/src/app/shared/components/footer/footer.component.scss b/src/app/shared/components/footer/footer.component.scss index fdccb079..9c6296b0 100644 --- a/src/app/shared/components/footer/footer.component.scss +++ b/src/app/shared/components/footer/footer.component.scss @@ -1,95 +1,95 @@ -@import "../../../../assets/scss/partials/colors"; -@import "../../../../assets/scss/partials/layout"; - -footer { - width: 100vw; - background: $primary-1-gradient; - - h3 { - font-size: x-large; - } - - .footer-body { - padding: 12px $gutter-desktop; - - .footer-list { - display: flex; - flex-wrap: wrap; - justify-content: space-between; - align-items: stretch; - padding: 8px; - - ul { - list-style: none; - padding-left: 0; - margin-top: 5px; - } - - li { - margin-bottom: 14px; - - a { - color: white; - } - } - - .footer-column { - flex: 1; - flex-direction: column; - color: white; - align-items: flex-start; - display: flex; - padding-top: 12px; - - section { - flex-direction: column; - - h3 { - font-weight: bold; - color: white; - } - - li:not(:last-child) { - margin-bottom: 20px; - } - - a { - display: flex; - flex: 1; - text-decoration: none; - color: white; - } - - a:visited { - color: white; - } - } - } - - section:nth-child(2) { - margin: 0 1px; - } - - section:last-child { - max-width: 400px; - } - - .canada-logo-container { - display: flex; - float: right; - margin-left: auto; - margin-top: 13px; - width: 100%; - height: 100%; - - img { - float: right; - width: 100%; - margin: 20px; - margin-top: 125px; - filter: brightness(0) invert(1); - } - } - } - } -} \ No newline at end of file +@import "../../../../assets/scss/partials/colors"; +@import "../../../../assets/scss/partials/layout"; + +footer { + width: 100vw; + background: $primary-1-gradient; + + h3 { + font-size: x-large; + } + + .footer-body { + padding: 12px $gutter-desktop; + + .footer-list { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + align-items: stretch; + padding: 8px; + + ul { + list-style: none; + padding-left: 0; + margin-top: 5px; + } + + li { + margin-bottom: 14px; + + a { + color: white; + } + } + + .footer-column { + flex: 1; + flex-direction: column; + color: white; + align-items: flex-start; + display: flex; + padding-top: 12px; + + section { + flex-direction: column; + + h3 { + font-weight: bold; + color: white; + } + + li:not(:last-child) { + margin-bottom: 20px; + } + + a { + display: flex; + flex: 1; + text-decoration: none; + color: white; + } + + a:visited { + color: white; + } + } + } + + section:nth-child(2) { + margin: 0 1px; + } + + section:last-child { + max-width: 400px; + } + + .canada-logo-container { + display: flex; + float: right; + margin-left: auto; + margin-top: 13px; + width: 100%; + height: 100%; + + img { + float: right; + width: 100%; + margin: 20px; + margin-top: 125px; + filter: brightness(0) invert(1); + } + } + } + } +} diff --git a/src/app/shared/components/footer/footer.component.spec.ts b/src/app/shared/components/footer/footer.component.spec.ts index 6c670e34..914e6b0c 100644 --- a/src/app/shared/components/footer/footer.component.spec.ts +++ b/src/app/shared/components/footer/footer.component.spec.ts @@ -14,20 +14,20 @@ describe('FooterComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ FooterComponent ], - imports: [ + declarations: [FooterComponent], + imports: [ TranslateModule.forRoot({ loader: { provide: TranslateLoader, - useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), - deps: [ HttpClient ] - } + useFactory: (http: HttpClient) => + new TypescriptLoader(http, 'translations'), + deps: [HttpClient], + }, }), - HttpClientModule + HttpClientModule, ], - providers: [ TranslateService, HttpClient ] - }) - .compileComponents(); + providers: [TranslateService, HttpClient], + }).compileComponents(); translateService = TestBed.inject(TranslateService); fixture = TestBed.createComponent(FooterComponent); diff --git a/src/app/shared/components/footer/footer.component.ts b/src/app/shared/components/footer/footer.component.ts index cdcef855..f21805be 100644 --- a/src/app/shared/components/footer/footer.component.ts +++ b/src/app/shared/components/footer/footer.component.ts @@ -11,9 +11,7 @@ import { Translations } from 'src/app/core/services/translations.service'; changeDetection: ChangeDetectionStrategy.OnPush, }) export class FooterComponent { - routes = CoreRoutes; - constructor(public translations: Translations) { } - + constructor(public translations: Translations) {} } diff --git a/src/app/shared/components/forbidden/forbidden.component.spec.ts b/src/app/shared/components/forbidden/forbidden.component.spec.ts index 0fb94312..664bfaef 100644 --- a/src/app/shared/components/forbidden/forbidden.component.spec.ts +++ b/src/app/shared/components/forbidden/forbidden.component.spec.ts @@ -8,9 +8,8 @@ describe('ForbiddenComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ ForbiddenComponent ] - }) - .compileComponents(); + declarations: [ForbiddenComponent], + }).compileComponents(); fixture = TestBed.createComponent(ForbiddenComponent); component = fixture.componentInstance; diff --git a/src/app/shared/components/forbidden/forbidden.component.ts b/src/app/shared/components/forbidden/forbidden.component.ts index 6000b394..c0a1a3e0 100644 --- a/src/app/shared/components/forbidden/forbidden.component.ts +++ b/src/app/shared/components/forbidden/forbidden.component.ts @@ -7,7 +7,5 @@ import { ChangeDetectionStrategy, Component } from '@angular/core'; changeDetection: ChangeDetectionStrategy.OnPush, }) export class ForbiddenComponent { - - constructor() { } - + constructor() {} } diff --git a/src/app/shared/components/header/header.component.html b/src/app/shared/components/header/header.component.html index 251e5517..86fe73be 100644 --- a/src/app/shared/components/header/header.component.html +++ b/src/app/shared/components/header/header.component.html @@ -1,88 +1,130 @@ - - + - +
- - + + - - + + - - + + - - + + - +
@@ -90,13 +132,19 @@ -
\ No newline at end of file + diff --git a/src/app/shared/components/header/header.component.scss b/src/app/shared/components/header/header.component.scss index 0a51cbea..9a5c0a82 100644 --- a/src/app/shared/components/header/header.component.scss +++ b/src/app/shared/components/header/header.component.scss @@ -3,114 +3,119 @@ @import "../../../../assets//scss/partials/layout"; :host { - z-index: 3; - - mat-toolbar { - background: $primary-1-gradient; - position: fixed; - box-shadow: 0 3px 5px -1px #0003, 0 6px 10px #00000024, 0 1px 18px #0000001f; - transition: height 1s; - - mat-toolbar-row { - padding: 0; + z-index: 3; + + mat-toolbar { + background: $primary-1-gradient; + position: fixed; + box-shadow: + 0 3px 5px -1px #0003, + 0 6px 10px #00000024, + 0 1px 18px #0000001f; + transition: height 1s; + + mat-toolbar-row { + padding: 0; + } + + mat-toolbar-row:first-child { + height: $header-height-desktop; + padding-left: $gutter-desktop; + + div[class^="header-"] { + flex: 1; + } + + .gcc-logo { + height: 85px; + width: 85px; + min-height: 85px; + min-width: 85px; + border-radius: 50%; + background-color: $primary-1-dark; + + > div { + line-height: 85px; + text-align: center; + font-size: xx-large; + cursor: default; } + } + + .header-links { + display: flex; + flex-direction: row; + align-items: flex-start; + padding: 0px; + gap: 33px; + font-weight: 400; + padding-left: $gutter-desktop; - mat-toolbar-row:first-child { - height: $header-height-desktop; - padding-left: $gutter-desktop; - - div[class^="header-"] { - flex: 1; - } - - .gcc-logo { - height: 85px; - width: 85px; - min-height: 85px; - min-width: 85px; - border-radius: 50%; - background-color: $primary-1-dark; - - > div { - line-height: 85px; - text-align: center; - font-size: xx-large; - cursor: default; - } - } - - .header-links { - display: flex; - flex-direction: row; - align-items: flex-start; - padding: 0px; - gap: 33px; - font-weight: 400; - padding-left: $gutter-desktop; - - a, a:visited { - color: $primary-1-contrast; - transition: all 0.15s; - } - - .selected { - text-decoration: underline; - font-weight: 700; - text-underline-offset: 3px; - } - } - - .header-actions { - justify-content: flex-end; - display: inline-flex; - padding-left: 40px; - padding-right: calc($gutter-desktop / 2); - align-items: center; - gap: 7px; - - app-language-selector, .profile-btn { - ::ng-deep button { - padding: 0; - } - } - - app-profile-pic { - width: 52px; - height: 52px; - line-height: 10px; - } - } + a, + a:visited { + color: $primary-1-contrast; + transition: all 0.15s; } - - .header-search { - width: 100%; - min-width: 500px; - - form { - align-items: center; - display: flex; - } - - input { - width: 100%; - height: 30px; - border: 2px solid white; - border-radius: 12px; - padding-left: 6px; - outline-width: 0; - } - - app-button { - margin-left: -53px; - color: $primary-1; - } + + .selected { + text-decoration: underline; + font-weight: 700; + text-underline-offset: 3px; } + } + + .header-actions { + justify-content: flex-end; + display: inline-flex; + padding-left: 40px; + padding-right: calc($gutter-desktop / 2); + align-items: center; + gap: 7px; - mat-toolbar-row:not(mat-toolbar-row:first-child) { - height: 80px; - margin-top: -50px; - padding-right: 375px; - padding-left: 320px; + app-language-selector, + .profile-btn { + ::ng-deep button { + padding: 0; + } + } + + app-profile-pic { + width: 52px; + height: 52px; + line-height: 10px; } + } + } + + .header-search { + width: 100%; + min-width: 500px; + + form { + align-items: center; + display: flex; + } + + input { + width: 100%; + height: 30px; + border: 2px solid white; + border-radius: 12px; + padding-left: 6px; + outline-width: 0; + } + + app-button { + margin-left: -53px; + color: $primary-1; + } + } + + mat-toolbar-row:not(mat-toolbar-row:first-child) { + height: 80px; + margin-top: -50px; + padding-right: 375px; + padding-left: 320px; } -} \ No newline at end of file + } +} diff --git a/src/app/shared/components/header/header.component.spec.ts b/src/app/shared/components/header/header.component.spec.ts index d9a1e08c..49fe4566 100644 --- a/src/app/shared/components/header/header.component.spec.ts +++ b/src/app/shared/components/header/header.component.spec.ts @@ -1,7 +1,7 @@ import { LayoutModule } from '@angular/cdk/layout'; import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { MatButtonModule} from '@angular/material/button'; +import { MatButtonModule } from '@angular/material/button'; import { MatTooltipModule } from '@angular/material/tooltip'; import { MatIconModule } from '@angular/material/icon'; import { MatSidenavModule } from '@angular/material/sidenav'; @@ -33,13 +33,14 @@ describe('HeaderComponent', () => { TranslateModule.forRoot({ loader: { provide: TranslateLoader, - useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), - deps: [ HttpClient ] - } + useFactory: (http: HttpClient) => + new TypescriptLoader(http, 'translations'), + deps: [HttpClient], + }, }), - HttpClientModule + HttpClientModule, ], - providers: [ TranslateService, HttpClient ] + providers: [TranslateService, HttpClient], }).compileComponents(); })); diff --git a/src/app/shared/components/header/header.component.ts b/src/app/shared/components/header/header.component.ts index cc968366..67b641bc 100644 --- a/src/app/shared/components/header/header.component.ts +++ b/src/app/shared/components/header/header.component.ts @@ -10,10 +10,9 @@ import { PeopleService } from 'src/app/core/services/people.service'; @Component({ selector: 'app-header', templateUrl: './header.component.html', - styleUrls: ['./header.component.scss'] + styleUrls: ['./header.component.scss'], }) export class HeaderComponent { - @Output() headerToggleEvent = new EventEmitter(); @Input() activeRoute: string = CoreRoutes.Home; @@ -22,11 +21,12 @@ export class HeaderComponent { headerExpanded = false; loadingProfile = true; - user!: Person; + user!: Person; - constructor(public translations: Translations, - peopleService: PeopleService) - { + constructor( + public translations: Translations, + peopleService: PeopleService, + ) { // TODO: Get user from service peopleService.get('0', 0).subscribe((person: Person) => { this.user = person; @@ -34,9 +34,8 @@ export class HeaderComponent { }); } - toggleSearch () { + toggleSearch() { this.headerExpanded = !this.headerExpanded; this.headerToggleEvent.emit(this.headerExpanded); } - } diff --git a/src/app/shared/components/input/input.component.html b/src/app/shared/components/input/input.component.html index 3ea029b3..89eba49a 100644 --- a/src/app/shared/components/input/input.component.html +++ b/src/app/shared/components/input/input.component.html @@ -1,64 +1,101 @@
- - {{ label }} -
*
- - - -
+ + {{ label }} +
*
+ + + +
- + + - + - + + + - - - + + {{ hint }} + - - {{ hint }} - + + {{ translations.input.error.email | translate }} + - - {{ translations.input.error.email | translate }} - - - - {{ translations.input.error.minLength | translate }} {{ control.errors!['minlength'].requiredLength }}. - - - - {{ translations.input.error.maxLength | translate }} {{ control.errors!['maxlength'].requiredLength }}. - - - - {{ label }} {{ translations.input.error.required | translate }} - + + {{ translations.input.error.minLength | translate }} + {{ control.errors!["minlength"].requiredLength }}. + - -
\ No newline at end of file + + {{ translations.input.error.maxLength | translate }} + {{ control.errors!["maxlength"].requiredLength }}. + + + + {{ label }} {{ translations.input.error.required | translate }} + + +
diff --git a/src/app/shared/components/input/input.component.scss b/src/app/shared/components/input/input.component.scss index 90b6aeb1..bf09b4b7 100644 --- a/src/app/shared/components/input/input.component.scss +++ b/src/app/shared/components/input/input.component.scss @@ -1,217 +1,224 @@ -@import "../../../../assets/scss/partials/colors"; - -.gcc-input-wrapper { - font-size: 16px; -} - -mat-label { - font-size: 18px; - font-weight: 600; - display: inline-block; - padding-bottom: 10px; - - .required-star { - display: inline-block; - color: $error-red; - } - - i { - margin-left: 5px; - cursor: pointer; - } -} - -mat-label.disabled { - color: $neutral-300; - - .required-star, i { - color: $neutral-300 !important; - } -} - -mat-form-field { - width: 100%; - - .mat-mdc-form-field { - padding: 0 10px; - } - - input { - width: calc(100% - 65px); - } - - input.icon { - padding-left: 10px !important; - } - - .gcc-input-icon { - color: #1E1E23; - } - - app-button { - display: inline-flex; - } -} - -mat-form-field.mat-form-field-invalid { - .gcc-input-icon { - color: $error-red; - } -} - -.hint-button { - ::ng-deep button { - margin-top: -4px; - } -} - -mat-hint { - font-size: 14px; -} - -::ng-deep { - .mat-mdc-form-field-input-control { - padding: 12px 0px !important; - } - - .mdc-notched-outline__leading, .mdc-notched-outline__trailing { - border-color: $neutral-300 !important; - border-right-width: 2px !important; - border-left-width: 2px !important; - border-bottom-width: 2px !important; - border-top-width: 2px !important; - } - - .mdc-notched-outline__leading { - border-top-left-radius: var(--mdc-shape-small, 10px) !important; - border-bottom-left-radius: var(--mdc-shape-small, 10px) !important; - } - - .mdc-notched-outline__trailing { - border-top-right-radius: var(--mdc-shape-small, 10px) !important; - border-bottom-right-radius: var(--mdc-shape-small, 10px) !important; - } - - .mdc-text-field--outlined { - padding-right: 0 !important; - } - - .mat-mdc-text-field-wrapper.mdc-text-field--outlined .mat-mdc-form-field-infix { - padding-top: 0; - padding-bottom: 0; - } - - - .mat-mdc-form-field-infix { - min-height: unset; - } - - .mdc-text-field--invalid { - .mdc-notched-outline__leading, .mdc-notched-outline__trailing { - border-color: $error-red !important; - } - } - - .mdc-notched-outline__leading { - margin-right: -1px; - } - - input:-webkit-autofill, - input:-webkit-autofill:hover, - input:-webkit-autofill:focus, - input:-webkit-autofill:active{ - -webkit-background-clip: text; - -webkit-text-fill-color: #000; - box-shadow: inset 0 0 20px 20px white; - } -} - -// THEMES -.gcc-input-wrapper.primary-1 { - mat-label i { - color: $primary-1; - } - mat-form-field { - app-button ::ng-deep button:focus { - color: $primary-1; - } - } - mat-form-field.mat-focused .gcc-input-icon { - color: $primary-1; - } - .hint-button ::ng-deep button:focus { - color: $primary-1; - } - - ::ng-deep .mat-focused { - .mdc-notched-outline__leading, .mdc-notched-outline__trailing { - border-color: $primary-1 !important; - } - } -} -.gcc-input-wrapper.primary-2 { - mat-label i { - color: $primary-2; - } - mat-form-field { - app-button ::ng-deep button:focus { - color: $primary-2; - } - } - mat-form-field.mat-focused .gcc-input-icon { - color: $primary-2; - } - .hint-button ::ng-deep button:focus { - color: $primary-2; - } - - ::ng-deep .mat-focused { - .mdc-notched-outline__leading, .mdc-notched-outline__trailing { - border-color: $primary-2 !important; - } - } -} -.gcc-input-wrapper.secondary-1 { - mat-label i { - color: $secondary-1; - } - mat-form-field { - app-button ::ng-deep button:focus { - color: $secondary-1; - } - } - mat-form-field.mat-focused .gcc-input-icon { - color: $secondary-1; - } - .hint-button ::ng-deep button:focus { - color: $secondary-1; - } - - ::ng-deep .mat-focused { - .mdc-notched-outline__leading, .mdc-notched-outline__trailing { - border-color: $secondary-1 !important; - } - } -} -.gcc-input-wrapper.secondary-2 { - mat-label i { - color: $secondary-2; - } - mat-form-field { - app-button ::ng-deep button:focus { - color: $secondary-2; - } - } - mat-form-field.mat-focused .gcc-input-icon { - color: $secondary-2; - } - .hint-button ::ng-deep button:focus { - color: $secondary-2; - } - - ::ng-deep .mat-focused { - .mdc-notched-outline__leading, .mdc-notched-outline__trailing { - border-color: $secondary-2 !important; - } - } -} +@import "../../../../assets/scss/partials/colors"; + +.gcc-input-wrapper { + font-size: 16px; +} + +mat-label { + font-size: 18px; + font-weight: 600; + display: inline-block; + padding-bottom: 10px; + + .required-star { + display: inline-block; + color: $error-red; + } + + i { + margin-left: 5px; + cursor: pointer; + } +} + +mat-label.disabled { + color: $neutral-300; + + .required-star, + i { + color: $neutral-300 !important; + } +} + +mat-form-field { + width: 100%; + + .mat-mdc-form-field { + padding: 0 10px; + } + + input { + width: calc(100% - 65px); + } + + input.icon { + padding-left: 10px !important; + } + + .gcc-input-icon { + color: #1e1e23; + } + + app-button { + display: inline-flex; + } +} + +mat-form-field.mat-form-field-invalid { + .gcc-input-icon { + color: $error-red; + } +} + +.hint-button { + ::ng-deep button { + margin-top: -4px; + } +} + +mat-hint { + font-size: 14px; +} + +::ng-deep { + .mat-mdc-form-field-input-control { + padding: 12px 0px !important; + } + + .mdc-notched-outline__leading, + .mdc-notched-outline__trailing { + border-color: $neutral-300 !important; + border-right-width: 2px !important; + border-left-width: 2px !important; + border-bottom-width: 2px !important; + border-top-width: 2px !important; + } + + .mdc-notched-outline__leading { + border-top-left-radius: var(--mdc-shape-small, 10px) !important; + border-bottom-left-radius: var(--mdc-shape-small, 10px) !important; + } + + .mdc-notched-outline__trailing { + border-top-right-radius: var(--mdc-shape-small, 10px) !important; + border-bottom-right-radius: var(--mdc-shape-small, 10px) !important; + } + + .mdc-text-field--outlined { + padding-right: 0 !important; + } + + .mat-mdc-text-field-wrapper.mdc-text-field--outlined + .mat-mdc-form-field-infix { + padding-top: 0; + padding-bottom: 0; + } + + .mat-mdc-form-field-infix { + min-height: unset; + } + + .mdc-text-field--invalid { + .mdc-notched-outline__leading, + .mdc-notched-outline__trailing { + border-color: $error-red !important; + } + } + + .mdc-notched-outline__leading { + margin-right: -1px; + } + + input:-webkit-autofill, + input:-webkit-autofill:hover, + input:-webkit-autofill:focus, + input:-webkit-autofill:active { + -webkit-background-clip: text; + -webkit-text-fill-color: #000; + box-shadow: inset 0 0 20px 20px white; + } +} + +// THEMES +.gcc-input-wrapper.primary-1 { + mat-label i { + color: $primary-1; + } + mat-form-field { + app-button ::ng-deep button:focus { + color: $primary-1; + } + } + mat-form-field.mat-focused .gcc-input-icon { + color: $primary-1; + } + .hint-button ::ng-deep button:focus { + color: $primary-1; + } + + ::ng-deep .mat-focused { + .mdc-notched-outline__leading, + .mdc-notched-outline__trailing { + border-color: $primary-1 !important; + } + } +} +.gcc-input-wrapper.primary-2 { + mat-label i { + color: $primary-2; + } + mat-form-field { + app-button ::ng-deep button:focus { + color: $primary-2; + } + } + mat-form-field.mat-focused .gcc-input-icon { + color: $primary-2; + } + .hint-button ::ng-deep button:focus { + color: $primary-2; + } + + ::ng-deep .mat-focused { + .mdc-notched-outline__leading, + .mdc-notched-outline__trailing { + border-color: $primary-2 !important; + } + } +} +.gcc-input-wrapper.secondary-1 { + mat-label i { + color: $secondary-1; + } + mat-form-field { + app-button ::ng-deep button:focus { + color: $secondary-1; + } + } + mat-form-field.mat-focused .gcc-input-icon { + color: $secondary-1; + } + .hint-button ::ng-deep button:focus { + color: $secondary-1; + } + + ::ng-deep .mat-focused { + .mdc-notched-outline__leading, + .mdc-notched-outline__trailing { + border-color: $secondary-1 !important; + } + } +} +.gcc-input-wrapper.secondary-2 { + mat-label i { + color: $secondary-2; + } + mat-form-field { + app-button ::ng-deep button:focus { + color: $secondary-2; + } + } + mat-form-field.mat-focused .gcc-input-icon { + color: $secondary-2; + } + .hint-button ::ng-deep button:focus { + color: $secondary-2; + } + + ::ng-deep .mat-focused { + .mdc-notched-outline__leading, + .mdc-notched-outline__trailing { + border-color: $secondary-2 !important; + } + } +} diff --git a/src/app/shared/components/input/input.component.spec.ts b/src/app/shared/components/input/input.component.spec.ts index 067367e9..33ecf99a 100644 --- a/src/app/shared/components/input/input.component.spec.ts +++ b/src/app/shared/components/input/input.component.spec.ts @@ -8,7 +8,7 @@ describe('InputComponent', () => { beforeEach(() => { TestBed.configureTestingModule({ - declarations: [InputComponent] + declarations: [InputComponent], }); fixture = TestBed.createComponent(InputComponent); component = fixture.componentInstance; diff --git a/src/app/shared/components/input/input.component.ts b/src/app/shared/components/input/input.component.ts index fb002ef9..1ec10158 100644 --- a/src/app/shared/components/input/input.component.ts +++ b/src/app/shared/components/input/input.component.ts @@ -1,7 +1,19 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -import { Component, EventEmitter, Input, Output, forwardRef } from '@angular/core'; +import { + Component, + EventEmitter, + Input, + Output, + forwardRef, +} from '@angular/core'; import { InputType } from '../../models/input-type'; -import { ControlValueAccessor, FormControl, FormGroupDirective, NG_VALUE_ACCESSOR, NgForm } from '@angular/forms'; +import { + ControlValueAccessor, + FormControl, + FormGroupDirective, + NG_VALUE_ACCESSOR, + NgForm, +} from '@angular/forms'; import { MaterialButtonType } from '../../models/material-button-type'; import { Translations } from 'src/app/core/services/translations.service'; // eslint-disable-next-line @typescript-eslint/no-unused-vars @@ -23,17 +35,15 @@ import { Theme } from '../../models/theme'; ], }) export class InputComponent implements ControlValueAccessor { - - @Input() inputId!: string; - @Input({required:true}) name!: string; - + @Input({ required: true }) name!: string; + @Input() type: InputType | string = InputType.Text; @Input() control!: FormControl; @Input() errorMatcher: ErrorStateMatcher = new MyErrorStateMatcher(); @Input() value!: string; - @Input({required:true}) label!: string; + @Input({ required: true }) label!: string; @Input() placeholder!: string; @Input() hint!: string; @Input() theme: Theme | string = Theme.Primary1; @@ -55,9 +65,7 @@ export class InputComponent implements ControlValueAccessor { onChange = (_: any) => {}; onTouched = () => {}; - constructor(public translations: Translations) { - - } + constructor(public translations: Translations) {} writeValue(value: any): void { if (value !== undefined) { @@ -66,14 +74,14 @@ export class InputComponent implements ControlValueAccessor { } registerOnChange(fn: any): void { - this.onChange = fn; + this.onChange = fn; } registerOnTouched(fn: any): void { this.onTouched = fn; } - onInputChange(value: string) { + onInputChange(value: string) { this.value = value; this.onChange(this.value); this.valueChange.emit(this.value); @@ -89,8 +97,15 @@ export class InputComponent implements ControlValueAccessor { } class MyErrorStateMatcher implements ErrorStateMatcher { - isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean { + isErrorState( + control: FormControl | null, + form: FormGroupDirective | NgForm | null, + ): boolean { const isSubmitted = form && form.submitted; - return !!(control && control.invalid && (control.dirty || control.touched || isSubmitted)); + return !!( + control && + control.invalid && + (control.dirty || control.touched || isSubmitted) + ); } -} \ No newline at end of file +} diff --git a/src/app/shared/components/language-selector/language-selector.component.html b/src/app/shared/components/language-selector/language-selector.component.html index 064c6d1d..14353d15 100644 --- a/src/app/shared/components/language-selector/language-selector.component.html +++ b/src/app/shared/components/language-selector/language-selector.component.html @@ -1,19 +1,25 @@
- - + +
- - {{ selectedLanguageKey | uppercase }} - \ No newline at end of file + + {{ selectedLanguageKey | uppercase }} + diff --git a/src/app/shared/components/language-selector/language-selector.component.spec.ts b/src/app/shared/components/language-selector/language-selector.component.spec.ts index 7934e0e2..833183a0 100644 --- a/src/app/shared/components/language-selector/language-selector.component.spec.ts +++ b/src/app/shared/components/language-selector/language-selector.component.spec.ts @@ -14,23 +14,20 @@ describe('LanguageSelectorComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ LanguageSelectorComponent ], - imports: [ + declarations: [LanguageSelectorComponent], + imports: [ TranslateModule.forRoot({ loader: { provide: TranslateLoader, - useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), - deps: [ HttpClient ] - } + useFactory: (http: HttpClient) => + new TypescriptLoader(http, 'translations'), + deps: [HttpClient], + }, }), - HttpClientModule + HttpClientModule, ], - providers: [ - TranslateService, - HttpClient, - ] - }) - .compileComponents(); + providers: [TranslateService, HttpClient], + }).compileComponents(); translateService = TestBed.inject(TranslateService); fixture = TestBed.createComponent(LanguageSelectorComponent); diff --git a/src/app/shared/components/language-selector/language-selector.component.ts b/src/app/shared/components/language-selector/language-selector.component.ts index 7b3e942d..3829aa34 100644 --- a/src/app/shared/components/language-selector/language-selector.component.ts +++ b/src/app/shared/components/language-selector/language-selector.component.ts @@ -11,19 +11,21 @@ import { Theme } from '../../models/theme'; styleUrls: ['./language-selector.component.scss'], }) export class LanguageSelectorComponent implements OnInit { - @Input() isToggle: boolean = false; @Input() theme: Theme | string = Theme.Black; - - languages: ILanguage [] = [ - {'key': 'en', 'value': this.translations.languages.english}, - {'key': 'fr', 'value': this.translations.languages.french}, + + languages: ILanguage[] = [ + { key: 'en', value: this.translations.languages.english }, + { key: 'fr', value: this.translations.languages.french }, ]; selectedLanguageKey: string = this.languages[0].key; materialButtonType = MaterialButtonType; id: string = 'gcc-language-selector-btn-en'; - constructor(private translateService: TranslateService, public translations: Translations) { } + constructor( + private translateService: TranslateService, + public translations: Translations, + ) {} ngOnInit(): void { this.findSelectedKey(); @@ -31,9 +33,8 @@ export class LanguageSelectorComponent implements OnInit { findSelectedKey() { const currLang = this.translateService.currentLang; - - if (currLang === undefined) - return; + + if (currLang === undefined) return; for (let i = 0; i < this.languages.length; i++) { if (currLang === this.languages[i].key) { @@ -41,12 +42,15 @@ export class LanguageSelectorComponent implements OnInit { break; } } - + this.id = 'gcc-language-selector-btn-' + this.selectedLanguageKey; } toggle() { - this.selectedLanguageKey = this.selectedLanguageKey == this.languages[0].key ? this.languages[1].key : this.languages[0].key; + this.selectedLanguageKey = + this.selectedLanguageKey == this.languages[0].key + ? this.languages[1].key + : this.languages[0].key; this.update(); } diff --git a/src/app/shared/components/list/list.component.html b/src/app/shared/components/list/list.component.html index 25b70413..e227969c 100644 --- a/src/app/shared/components/list/list.component.html +++ b/src/app/shared/components/list/list.component.html @@ -1,29 +1,57 @@ -
+
+
+ + + +
-
- - - -
+
+ + +
-
- - -
- -
- - - -
-
\ No newline at end of file +
+ + + +
+
diff --git a/src/app/shared/components/list/list.component.scss b/src/app/shared/components/list/list.component.scss index 72d50c7f..8e8e3f63 100644 --- a/src/app/shared/components/list/list.component.scss +++ b/src/app/shared/components/list/list.component.scss @@ -1,21 +1,21 @@ -:host { - //display: flex; - - .gcc-list-container { - display: flex; - overflow: visible; - flex-wrap: wrap; - } - - .gcc-list-item { - flex: 1 1 0px; - } - - .gcc-list-previous, - .gcc-list-next { - display: flex; - align-items: center; - flex-direction: column; - margin: auto; - } -} \ No newline at end of file +:host { + //display: flex; + + .gcc-list-container { + display: flex; + overflow: visible; + flex-wrap: wrap; + } + + .gcc-list-item { + flex: 1 1 0px; + } + + .gcc-list-previous, + .gcc-list-next { + display: flex; + align-items: center; + flex-direction: column; + margin: auto; + } +} diff --git a/src/app/shared/components/list/list.component.spec.ts b/src/app/shared/components/list/list.component.spec.ts index 1b7458c4..8f383c6c 100644 --- a/src/app/shared/components/list/list.component.spec.ts +++ b/src/app/shared/components/list/list.component.spec.ts @@ -8,7 +8,7 @@ describe('ListComponent', () => { beforeEach(() => { TestBed.configureTestingModule({ - declarations: [ListComponent] + declarations: [ListComponent], }); fixture = TestBed.createComponent(ListComponent); component = fixture.componentInstance; diff --git a/src/app/shared/components/list/list.component.ts b/src/app/shared/components/list/list.component.ts index b0f7369b..4378ab2b 100644 --- a/src/app/shared/components/list/list.component.ts +++ b/src/app/shared/components/list/list.component.ts @@ -8,12 +8,11 @@ import { Orientation } from '../../models/orientation'; @Component({ selector: 'app-list', templateUrl: './list.component.html', - styleUrls: ['./list.component.scss'] + styleUrls: ['./list.component.scss'], }) export class ListComponent implements OnInit { - - @Input({required:true}) service!: IListService; - @Input() items: typeof this.service.dataType[] = []; + @Input({ required: true }) service!: IListService; + @Input() items: (typeof this.service.dataType)[] = []; @Input() cardSize: CardSize | string = CardSize.Small; // TODO: Card size on all card components. Make a base component or interface that gets implemented. @Input() orientation: Orientation | string = Orientation.Vertical; @Input() columnGap: number = 10; @@ -31,15 +30,12 @@ export class ListComponent implements OnInit { nextPageCallback: () => unknown = this.nextPage.bind(this); previousPageCallback: () => unknown = this.previousPage.bind(this); - constructor() { - - } - - ngOnInit(): void { + constructor() {} + + ngOnInit(): void { if (this.items.length === 0) { this.loadNext(this.pageSize * (this.paging ? this.pagesToLoad : 1)); - } - else { + } else { this.lastPage = this.items.length / this.pageSize; } } @@ -47,11 +43,13 @@ export class ListComponent implements OnInit { loadNext(count: number = this.pageSize): void { this.loading = true; - this.service?.getMany(count, this.loadTime).subscribe((items: typeof this.service.dataType[]) => { - this.items.push(...items); - this.lastPage = this.items.length / this.pageSize; - this.loading = false; - }); + this.service + ?.getMany(count, this.loadTime) + .subscribe((items: (typeof this.service.dataType)[]) => { + this.items.push(...items); + this.lastPage = this.items.length / this.pageSize; + this.loading = false; + }); } nextPage(): void { @@ -62,8 +60,7 @@ export class ListComponent implements OnInit { } previousPage(): void { - if (this.currentPage > 1) - this.currentPage--; + if (this.currentPage > 1) this.currentPage--; } get startIndex(): number { @@ -74,9 +71,9 @@ export class ListComponent implements OnInit { return this.startIndex + this.pageSize; } - get paginatedItems(): typeof this.service.dataType[] { - return this.loading && this.currentPage === this.lastPage - ? this.items.slice(0, this.pageSize) - : this.items.slice(this.startIndex, this.endIndex); + get paginatedItems(): (typeof this.service.dataType)[] { + return this.loading && this.currentPage === this.lastPage + ? this.items.slice(0, this.pageSize) + : this.items.slice(this.startIndex, this.endIndex); } -} \ No newline at end of file +} diff --git a/src/app/shared/components/not-found/not-found.component.spec.ts b/src/app/shared/components/not-found/not-found.component.spec.ts index 4ab46fe2..dd394bf3 100644 --- a/src/app/shared/components/not-found/not-found.component.spec.ts +++ b/src/app/shared/components/not-found/not-found.component.spec.ts @@ -8,9 +8,8 @@ describe('NotFoundComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ NotFoundComponent ] - }) - .compileComponents(); + declarations: [NotFoundComponent], + }).compileComponents(); fixture = TestBed.createComponent(NotFoundComponent); component = fixture.componentInstance; diff --git a/src/app/shared/components/not-found/not-found.component.ts b/src/app/shared/components/not-found/not-found.component.ts index a19ade82..3dab25bc 100644 --- a/src/app/shared/components/not-found/not-found.component.ts +++ b/src/app/shared/components/not-found/not-found.component.ts @@ -7,7 +7,5 @@ import { ChangeDetectionStrategy, Component } from '@angular/core'; changeDetection: ChangeDetectionStrategy.OnPush, }) export class NotFoundComponent { - - constructor() { } - + constructor() {} } diff --git a/src/app/shared/components/page-title/page-title.component.html b/src/app/shared/components/page-title/page-title.component.html index fc75ff34..632b9bce 100644 --- a/src/app/shared/components/page-title/page-title.component.html +++ b/src/app/shared/components/page-title/page-title.component.html @@ -1,3 +1,3 @@
-

{{ pageTitle }}

+

{{ pageTitle }}

diff --git a/src/app/shared/components/page-title/page-title.component.scss b/src/app/shared/components/page-title/page-title.component.scss index 86557787..71a71899 100644 --- a/src/app/shared/components/page-title/page-title.component.scss +++ b/src/app/shared/components/page-title/page-title.component.scss @@ -1,8 +1,8 @@ -@import "../../../../assets/scss/partials/layout"; - -.page-title { - h1 { - margin-top: $padding-vertical; - margin-bottom: $padding-vertical; - } -} \ No newline at end of file +@import "../../../../assets/scss/partials/layout"; + +.page-title { + h1 { + margin-top: $padding-vertical; + margin-bottom: $padding-vertical; + } +} diff --git a/src/app/shared/components/page-title/page-title.component.spec.ts b/src/app/shared/components/page-title/page-title.component.spec.ts index f81da709..8fc5fa5c 100644 --- a/src/app/shared/components/page-title/page-title.component.spec.ts +++ b/src/app/shared/components/page-title/page-title.component.spec.ts @@ -15,32 +15,32 @@ describe('PageTitleComponent', () => { // TODO: Mock meaningful data const fakeActivatedRoute = { - snapshot: { data: { } } + snapshot: { data: {} }, } as ActivatedRoute; beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ PageTitleComponent ], - imports: [ + declarations: [PageTitleComponent], + imports: [ TranslateModule.forRoot({ loader: { provide: TranslateLoader, - useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), - deps: [ HttpClient ] - } + useFactory: (http: HttpClient) => + new TypescriptLoader(http, 'translations'), + deps: [HttpClient], + }, }), - HttpClientModule + HttpClientModule, ], - providers: [ - TranslateService, - HttpClient, + providers: [ + TranslateService, + HttpClient, { - provide: ActivatedRoute, - useValue: fakeActivatedRoute - } - ] - }) - .compileComponents(); + provide: ActivatedRoute, + useValue: fakeActivatedRoute, + }, + ], + }).compileComponents(); translateService = TestBed.inject(TranslateService); fixture = TestBed.createComponent(PageTitleComponent); diff --git a/src/app/shared/components/page-title/page-title.component.ts b/src/app/shared/components/page-title/page-title.component.ts index 0c109ae7..cb3d1e49 100644 --- a/src/app/shared/components/page-title/page-title.component.ts +++ b/src/app/shared/components/page-title/page-title.component.ts @@ -4,11 +4,10 @@ import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; selector: 'app-page-title', templateUrl: './page-title.component.html', styleUrls: ['./page-title.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class PageTitleComponent { - @Input() pageTitle!: string; - constructor() { } + constructor() {} } diff --git a/src/app/shared/components/poll-form/poll-form.component.html b/src/app/shared/components/poll-form/poll-form.component.html index 9ae879dc..f24c60f2 100644 --- a/src/app/shared/components/poll-form/poll-form.component.html +++ b/src/app/shared/components/poll-form/poll-form.component.html @@ -1,38 +1,47 @@
- - + + -
- - - - - -
+
+ + + + + +
-
- - - {{ translations.forms.poll.option_add | translate }} - -
+
+ + + {{ translations.forms.poll.option_add | translate }} + +
- diff --git a/src/app/shared/components/poll-form/poll-form.component.scss b/src/app/shared/components/poll-form/poll-form.component.scss index 3ed60e49..8b032f8f 100644 --- a/src/app/shared/components/poll-form/poll-form.component.scss +++ b/src/app/shared/components/poll-form/poll-form.component.scss @@ -1,37 +1,37 @@ -:host { - app-editor { - padding-bottom: 30px; - } - - .option-wrapper { - display: flex; - flex-direction: row; - align-items: center; - - app-button { - flex-basis: 0; - padding-left: 10px - } - - app-input { - flex-basis: 100%; - } - } - - .form-actions { - padding: 15px 0 30px 0; - - app-button { - display: table; - - ::ng-deep { - .gcc-button-inner { - letter-spacing: 1px; - } - } - } - app-button:not(:first-child) { - padding-top: 30px - } - } -} \ No newline at end of file +:host { + app-editor { + padding-bottom: 30px; + } + + .option-wrapper { + display: flex; + flex-direction: row; + align-items: center; + + app-button { + flex-basis: 0; + padding-left: 10px; + } + + app-input { + flex-basis: 100%; + } + } + + .form-actions { + padding: 15px 0 30px 0; + + app-button { + display: table; + + ::ng-deep { + .gcc-button-inner { + letter-spacing: 1px; + } + } + } + app-button:not(:first-child) { + padding-top: 30px; + } + } +} diff --git a/src/app/shared/components/poll-form/poll-form.component.spec.ts b/src/app/shared/components/poll-form/poll-form.component.spec.ts index 832e1ba7..0685e2bf 100644 --- a/src/app/shared/components/poll-form/poll-form.component.spec.ts +++ b/src/app/shared/components/poll-form/poll-form.component.spec.ts @@ -1,7 +1,11 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { PollFormComponent } from './poll-form.component'; -import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core'; +import { + TranslateLoader, + TranslateModule, + TranslateService, +} from '@ngx-translate/core'; import { HttpClient, HttpClientModule } from '@angular/common/http'; import { TypescriptLoader } from 'src/app/core/helpers/typescript-loader'; import { RouterTestingModule } from '@angular/router/testing'; @@ -19,14 +23,15 @@ describe('PollFormComponent', () => { TranslateModule.forRoot({ loader: { provide: TranslateLoader, - useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), - deps: [ HttpClient ] - } + useFactory: (http: HttpClient) => + new TypescriptLoader(http, 'translations'), + deps: [HttpClient], + }, }), HttpClientModule, - RouterTestingModule + RouterTestingModule, ], - providers: [ TranslateService, HttpClient ] + providers: [TranslateService, HttpClient], }); fixture = TestBed.createComponent(PollFormComponent); component = fixture.componentInstance; diff --git a/src/app/shared/components/poll-form/poll-form.component.ts b/src/app/shared/components/poll-form/poll-form.component.ts index 7e11bf96..4cc87156 100644 --- a/src/app/shared/components/poll-form/poll-form.component.ts +++ b/src/app/shared/components/poll-form/poll-form.component.ts @@ -9,7 +9,7 @@ import { Validators as EditorValidators } from 'ngx-editor'; @Component({ selector: 'app-poll-form', templateUrl: './poll-form.component.html', - styleUrls: ['./poll-form.component.scss'] + styleUrls: ['./poll-form.component.scss'], }) export class PollFormComponent implements OnInit, OnDestroy { @Input() form: FormGroup = new FormGroup({}); @@ -17,37 +17,36 @@ export class PollFormComponent implements OnInit, OnDestroy { description: '', options: [ { id: 0, value: '' }, - { id: 1, value: '' } + { id: 1, value: '' }, ], - photo: '' - } + photo: '', + }; maxOptions: number = 10; minLength: number = 1; maxLength: number = 240; tooltipDirection = TooltipDirection; - - constructor(public translations: Translations) { - } - + constructor(public translations: Translations) {} + ngOnInit(): void { this.form.addControl( - 'description', - new FormControl( - this.model.description, - [ - EditorValidators.required(), - EditorValidators.maxLength(this.maxLength), - ] - ) + 'description', + new FormControl(this.model.description, [ + EditorValidators.required(), + EditorValidators.maxLength(this.maxLength), + ]), ); for (let i = 0; i < this.model.options.length; i++) { this.form.addControl( - 'option' + i, - new FormControl(this.model.options[i].value, [Validators.required, Validators.minLength(3), Validators.maxLength(30)] - )); + 'option' + i, + new FormControl(this.model.options[i].value, [ + Validators.required, + Validators.minLength(3), + Validators.maxLength(30), + ]), + ); } } @@ -57,17 +56,23 @@ export class PollFormComponent implements OnInit, OnDestroy { addOption(): void { if (this.model.options.length < this.maxOptions) { - this.model.options.push({id: this.model.options[this.model.options.length - 1].id + 1, value: ''}); + this.model.options.push({ + id: this.model.options[this.model.options.length - 1].id + 1, + value: '', + }); this.form.addControl( - 'option' + this.model.options[this.model.options.length - 1].id, - new FormControl('', [Validators.required, Validators.minLength(3), Validators.maxLength(30)]) + 'option' + this.model.options[this.model.options.length - 1].id, + new FormControl('', [ + Validators.required, + Validators.minLength(3), + Validators.maxLength(30), + ]), ); } } removeOption(option: IPollOption): void { - if (this.model.options.length <= 2) - return; + if (this.model.options.length <= 2) return; this.form.removeControl('option' + option.id); @@ -87,6 +92,6 @@ export interface IPollForm { } export interface IPollOption { - id: number, - value: string -} \ No newline at end of file + id: number; + value: string; +} diff --git a/src/app/shared/components/post-form/post-form.component.html b/src/app/shared/components/post-form/post-form.component.html index 3c4770f1..5b3726cd 100644 --- a/src/app/shared/components/post-form/post-form.component.html +++ b/src/app/shared/components/post-form/post-form.component.html @@ -1,10 +1,12 @@
- - -
\ No newline at end of file + + + diff --git a/src/app/shared/components/post-form/post-form.component.scss b/src/app/shared/components/post-form/post-form.component.scss index 9fc2cf1e..d58d9f2c 100644 --- a/src/app/shared/components/post-form/post-form.component.scss +++ b/src/app/shared/components/post-form/post-form.component.scss @@ -1,16 +1,16 @@ -:host { - app-button { - ::ng-deep { - button { - margin: 30px 0; - } - .gcc-button-inner { - letter-spacing: 1px; - } - } - } - - app-editor { - padding-bottom: 16px; - } -} \ No newline at end of file +:host { + app-button { + ::ng-deep { + button { + margin: 30px 0; + } + .gcc-button-inner { + letter-spacing: 1px; + } + } + } + + app-editor { + padding-bottom: 16px; + } +} diff --git a/src/app/shared/components/post-form/post-form.component.spec.ts b/src/app/shared/components/post-form/post-form.component.spec.ts index c1be2494..ced330c6 100644 --- a/src/app/shared/components/post-form/post-form.component.spec.ts +++ b/src/app/shared/components/post-form/post-form.component.spec.ts @@ -1,7 +1,11 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { PostFormComponent } from './post-form.component'; -import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core'; +import { + TranslateLoader, + TranslateModule, + TranslateService, +} from '@ngx-translate/core'; import { HttpClient, HttpClientModule } from '@angular/common/http'; import { TypescriptLoader } from 'src/app/core/helpers/typescript-loader'; import { RouterTestingModule } from '@angular/router/testing'; @@ -19,14 +23,15 @@ describe('PostFormComponent', () => { TranslateModule.forRoot({ loader: { provide: TranslateLoader, - useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), - deps: [ HttpClient ] - } + useFactory: (http: HttpClient) => + new TypescriptLoader(http, 'translations'), + deps: [HttpClient], + }, }), HttpClientModule, - RouterTestingModule + RouterTestingModule, ], - providers: [ TranslateService, HttpClient ] + providers: [TranslateService, HttpClient], }); fixture = TestBed.createComponent(PostFormComponent); component = fixture.componentInstance; diff --git a/src/app/shared/components/post-form/post-form.component.ts b/src/app/shared/components/post-form/post-form.component.ts index ab6681ce..2866da12 100644 --- a/src/app/shared/components/post-form/post-form.component.ts +++ b/src/app/shared/components/post-form/post-form.component.ts @@ -8,32 +8,27 @@ import { Validators } from 'ngx-editor'; @Component({ selector: 'app-post-form', templateUrl: './post-form.component.html', - styleUrls: ['./post-form.component.scss'] + styleUrls: ['./post-form.component.scss'], }) export class PostFormComponent implements OnInit, OnDestroy { @Input() form: FormGroup = new FormGroup({}); @Input() model: IPostForm = { - description: '' - } + description: '', + }; minLength: number = 3; maxLength: number = 240; - constructor(public translations: Translations) { - - } + constructor(public translations: Translations) {} ngOnInit(): void { this.form.addControl( - 'description', - new FormControl( - this.model.description, - [ - Validators.required(), - Validators.minLength(this.minLength), - Validators.maxLength(this.maxLength), - ] - ) + 'description', + new FormControl(this.model.description, [ + Validators.required(), + Validators.minLength(this.minLength), + Validators.maxLength(this.maxLength), + ]), ); } diff --git a/src/app/shared/components/profile-pic/profile-pic.component.html b/src/app/shared/components/profile-pic/profile-pic.component.html index fbf086b6..d53112dd 100644 --- a/src/app/shared/components/profile-pic/profile-pic.component.html +++ b/src/app/shared/components/profile-pic/profile-pic.component.html @@ -1,12 +1,15 @@ - - - \ No newline at end of file + + diff --git a/src/app/shared/components/profile-pic/profile-pic.component.scss b/src/app/shared/components/profile-pic/profile-pic.component.scss index 9b03949b..4c15c25c 100644 --- a/src/app/shared/components/profile-pic/profile-pic.component.scss +++ b/src/app/shared/components/profile-pic/profile-pic.component.scss @@ -1,25 +1,25 @@ -:host { - display: block; - width: 100%; - height: 100%; - - img { - height: 100%; - width: 100%; - border-radius: 50%; - object-fit: cover; - cursor: pointer; - } - - ngx-skeleton-loader { - width: 100%; - height: 100%; - display: block; - - ::ng-deep > div { - width: 100% !important; - height: 100% !important; - margin: 0 !important; - } - } -} \ No newline at end of file +:host { + display: block; + width: 100%; + height: 100%; + + img { + height: 100%; + width: 100%; + border-radius: 50%; + object-fit: cover; + cursor: pointer; + } + + ngx-skeleton-loader { + width: 100%; + height: 100%; + display: block; + + ::ng-deep > div { + width: 100% !important; + height: 100% !important; + margin: 0 !important; + } + } +} diff --git a/src/app/shared/components/profile-pic/profile-pic.component.spec.ts b/src/app/shared/components/profile-pic/profile-pic.component.spec.ts index 85497e12..c753a0df 100644 --- a/src/app/shared/components/profile-pic/profile-pic.component.spec.ts +++ b/src/app/shared/components/profile-pic/profile-pic.component.spec.ts @@ -1,7 +1,11 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ProfilePicComponent } from './profile-pic.component'; -import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core'; +import { + TranslateLoader, + TranslateModule, + TranslateService, +} from '@ngx-translate/core'; import { HttpClient, HttpClientModule } from '@angular/common/http'; import { TypescriptLoader } from 'src/app/core/helpers/typescript-loader'; @@ -17,13 +21,14 @@ describe('ProfilePicComponent', () => { TranslateModule.forRoot({ loader: { provide: TranslateLoader, - useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), - deps: [ HttpClient ] - } + useFactory: (http: HttpClient) => + new TypescriptLoader(http, 'translations'), + deps: [HttpClient], + }, }), - HttpClientModule + HttpClientModule, ], - providers: [ TranslateService, HttpClient ] + providers: [TranslateService, HttpClient], }); }); diff --git a/src/app/shared/components/profile-pic/profile-pic.component.ts b/src/app/shared/components/profile-pic/profile-pic.component.ts index 37bd5171..871cee54 100644 --- a/src/app/shared/components/profile-pic/profile-pic.component.ts +++ b/src/app/shared/components/profile-pic/profile-pic.component.ts @@ -10,16 +10,16 @@ import { CoreRoutes } from 'src/app/core/constants/routes.constants'; selector: 'app-profile-pic', templateUrl: './profile-pic.component.html', styleUrls: ['./profile-pic.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class ProfilePicComponent { - @Input() model: Person | undefined; @Input() loading: boolean = false; - constructor (public translations: Translations, - private router: Router) - {} + constructor( + public translations: Translations, + private router: Router, + ) {} onClick(): void { if (this.model) { diff --git a/src/app/shared/components/unauthorized/unauthorized.component.spec.ts b/src/app/shared/components/unauthorized/unauthorized.component.spec.ts index 38a34fab..1cb7d666 100644 --- a/src/app/shared/components/unauthorized/unauthorized.component.spec.ts +++ b/src/app/shared/components/unauthorized/unauthorized.component.spec.ts @@ -8,9 +8,8 @@ describe('UnauthorizedComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ UnauthorizedComponent ] - }) - .compileComponents(); + declarations: [UnauthorizedComponent], + }).compileComponents(); fixture = TestBed.createComponent(UnauthorizedComponent); component = fixture.componentInstance; diff --git a/src/app/shared/components/unauthorized/unauthorized.component.ts b/src/app/shared/components/unauthorized/unauthorized.component.ts index 19a5d5d2..19118bf0 100644 --- a/src/app/shared/components/unauthorized/unauthorized.component.ts +++ b/src/app/shared/components/unauthorized/unauthorized.component.ts @@ -7,7 +7,5 @@ import { ChangeDetectionStrategy, Component } from '@angular/core'; changeDetection: ChangeDetectionStrategy.OnPush, }) export class UnauthorizedComponent { - - constructor() { } - + constructor() {} } diff --git a/src/app/shared/factories/editor-config.factory.ts b/src/app/shared/factories/editor-config.factory.ts index c3b33862..8a12719a 100644 --- a/src/app/shared/factories/editor-config.factory.ts +++ b/src/app/shared/factories/editor-config.factory.ts @@ -1,47 +1,55 @@ -import { TranslateService } from "@ngx-translate/core/lib/translate.service"; -import { NgxEditorConfig } from "ngx-editor"; -import { Translations } from "src/app/core/services/translations.service"; - -export function ngxEditorConfigFactory(translateService: TranslateService, translations: Translations): NgxEditorConfig { - return { - locals: ngxEditorLocals(translateService, translations) - }; - } - -export function ngxEditorLocals(translateService: TranslateService, translations: Translations) { - return { - bold: translateService.instant(translations.editor.bold), - italic: translateService.instant(translations.editor.italic), - code: translateService.instant(translations.editor.code), - underline: translateService.instant(translations.editor.underline), - strike: translateService.instant(translations.editor.strike), - blockquote: translateService.instant(translations.editor.blockquote), - bullet_list: translateService.instant(translations.editor.bulletlist), - ordered_list: translateService.instant(translations.editor.orderedlist), - heading: translateService.instant(translations.editor.heading), - h1: translateService.instant(translations.editor.h1), - h2: translateService.instant(translations.editor.h2), - h3: translateService.instant(translations.editor.h3), - h4: translateService.instant(translations.editor.h4), - h5: translateService.instant(translations.editor.h5), - h6: translateService.instant(translations.editor.h6), - align_left: translateService.instant(translations.editor.alignleft), - align_center: translateService.instant(translations.editor.aligncenter), - align_right: translateService.instant(translations.editor.alignright), - align_justify: translateService.instant(translations.editor.alignjustify), - text_color: translateService.instant(translations.editor.textcolor), - background_color: translateService.instant(translations.editor.bgcolor), - insertLink: translateService.instant(translations.editor.linkinsert), - removeLink: translateService.instant(translations.editor.linkremove), - insertImage: translateService.instant(translations.editor.imginsert), - url: translateService.instant(translations.editor.url), - text: translateService.instant(translations.editor.text), - openInNewTab: translateService.instant(translations.editor.opennewtab), - insert: translateService.instant(translations.editor.insert), - altText: translateService.instant(translations.editor.alt), - title: translateService.instant(translations.editor.title), - remove: translateService.instant(translations.editor.remove), - horizontal_rule: translateService.instant(translations.editor.horizontalrule), - format_clear: translateService.instant(translations.editor.formatclear), - } -} \ No newline at end of file +import { TranslateService } from '@ngx-translate/core/lib/translate.service'; +import { NgxEditorConfig } from 'ngx-editor'; +import { Translations } from 'src/app/core/services/translations.service'; + +export function ngxEditorConfigFactory( + translateService: TranslateService, + translations: Translations, +): NgxEditorConfig { + return { + locals: ngxEditorLocals(translateService, translations), + }; +} + +export function ngxEditorLocals( + translateService: TranslateService, + translations: Translations, +) { + return { + bold: translateService.instant(translations.editor.bold), + italic: translateService.instant(translations.editor.italic), + code: translateService.instant(translations.editor.code), + underline: translateService.instant(translations.editor.underline), + strike: translateService.instant(translations.editor.strike), + blockquote: translateService.instant(translations.editor.blockquote), + bullet_list: translateService.instant(translations.editor.bulletlist), + ordered_list: translateService.instant(translations.editor.orderedlist), + heading: translateService.instant(translations.editor.heading), + h1: translateService.instant(translations.editor.h1), + h2: translateService.instant(translations.editor.h2), + h3: translateService.instant(translations.editor.h3), + h4: translateService.instant(translations.editor.h4), + h5: translateService.instant(translations.editor.h5), + h6: translateService.instant(translations.editor.h6), + align_left: translateService.instant(translations.editor.alignleft), + align_center: translateService.instant(translations.editor.aligncenter), + align_right: translateService.instant(translations.editor.alignright), + align_justify: translateService.instant(translations.editor.alignjustify), + text_color: translateService.instant(translations.editor.textcolor), + background_color: translateService.instant(translations.editor.bgcolor), + insertLink: translateService.instant(translations.editor.linkinsert), + removeLink: translateService.instant(translations.editor.linkremove), + insertImage: translateService.instant(translations.editor.imginsert), + url: translateService.instant(translations.editor.url), + text: translateService.instant(translations.editor.text), + openInNewTab: translateService.instant(translations.editor.opennewtab), + insert: translateService.instant(translations.editor.insert), + altText: translateService.instant(translations.editor.alt), + title: translateService.instant(translations.editor.title), + remove: translateService.instant(translations.editor.remove), + horizontal_rule: translateService.instant( + translations.editor.horizontalrule, + ), + format_clear: translateService.instant(translations.editor.formatclear), + }; +} diff --git a/src/app/shared/models/button-type.ts b/src/app/shared/models/button-type.ts index e88784f7..0b036797 100644 --- a/src/app/shared/models/button-type.ts +++ b/src/app/shared/models/button-type.ts @@ -1,5 +1,5 @@ -export enum ButtonType { - Button = 'button', - Submit = 'submit', - Reset = 'reset' -} \ No newline at end of file +export enum ButtonType { + Button = 'button', + Submit = 'submit', + Reset = 'reset', +} diff --git a/src/app/shared/models/card-size.ts b/src/app/shared/models/card-size.ts index 3fad75bd..59e3cf42 100644 --- a/src/app/shared/models/card-size.ts +++ b/src/app/shared/models/card-size.ts @@ -1,6 +1,6 @@ -export enum CardSize { - Small = "small", - Medium = "medium", - Large = "large", - Dynamic = "dynamic" -} \ No newline at end of file +export enum CardSize { + Small = 'small', + Medium = 'medium', + Large = 'large', + Dynamic = 'dynamic', +} diff --git a/src/app/shared/models/input-type.ts b/src/app/shared/models/input-type.ts index 2b5c5079..e33e954f 100644 --- a/src/app/shared/models/input-type.ts +++ b/src/app/shared/models/input-type.ts @@ -1,8 +1,8 @@ -export enum InputType { - Text = 'text', - Number = 'number', - Password = 'password', - Email = 'email', - Time = 'time', - Date = 'date' -} \ No newline at end of file +export enum InputType { + Text = 'text', + Number = 'number', + Password = 'password', + Email = 'email', + Time = 'time', + Date = 'date', +} diff --git a/src/app/shared/models/language.ts b/src/app/shared/models/language.ts index 929923f1..6a5f0735 100644 --- a/src/app/shared/models/language.ts +++ b/src/app/shared/models/language.ts @@ -1,4 +1,4 @@ -export interface ILanguage { - key: string; - value: string; -} +export interface ILanguage { + key: string; + value: string; +} diff --git a/src/app/shared/models/material-button-type.ts b/src/app/shared/models/material-button-type.ts index b7b391bf..ac05991f 100644 --- a/src/app/shared/models/material-button-type.ts +++ b/src/app/shared/models/material-button-type.ts @@ -1,9 +1,9 @@ -export enum MaterialButtonType { - Basic = 'mat-button', - Raised = 'mat-raised-button', - Stroked = 'mat-stroked-button', - Flat = 'mat-flat-button', - Icon = 'mat-icon-button', - FAB = 'mat-fab', - MiniFAB = 'mat-mini-fab' -} \ No newline at end of file +export enum MaterialButtonType { + Basic = 'mat-button', + Raised = 'mat-raised-button', + Stroked = 'mat-stroked-button', + Flat = 'mat-flat-button', + Icon = 'mat-icon-button', + FAB = 'mat-fab', + MiniFAB = 'mat-mini-fab', +} diff --git a/src/app/shared/models/material-color.ts b/src/app/shared/models/material-color.ts index e42b7a81..12a396c2 100644 --- a/src/app/shared/models/material-color.ts +++ b/src/app/shared/models/material-color.ts @@ -1,5 +1,5 @@ -export enum MaterialColor { - Primary = 'primary', - Accent = 'accent', - Warn = 'warn', -} \ No newline at end of file +export enum MaterialColor { + Primary = 'primary', + Accent = 'accent', + Warn = 'warn', +} diff --git a/src/app/shared/models/orientation.ts b/src/app/shared/models/orientation.ts index 40293707..39fd0717 100644 --- a/src/app/shared/models/orientation.ts +++ b/src/app/shared/models/orientation.ts @@ -1,4 +1,4 @@ -export enum Orientation { - Vertical = "vertical", - Horizontal = "horizontal" -} \ No newline at end of file +export enum Orientation { + Vertical = 'vertical', + Horizontal = 'horizontal', +} diff --git a/src/app/shared/models/theme.ts b/src/app/shared/models/theme.ts index fe61459b..879336c0 100644 --- a/src/app/shared/models/theme.ts +++ b/src/app/shared/models/theme.ts @@ -1,10 +1,10 @@ -export enum Theme { - Primary1 = 'primary-1', - Primary2 = 'primary-2', - Secondary1 = 'secondary-1', - Secondary2 = 'secondary-2', - Error = 'error', - Disabled = 'disabled', - White = 'white', - Black = 'black' -} \ No newline at end of file +export enum Theme { + Primary1 = 'primary-1', + Primary2 = 'primary-2', + Secondary1 = 'secondary-1', + Secondary2 = 'secondary-2', + Error = 'error', + Disabled = 'disabled', + White = 'white', + Black = 'black', +} diff --git a/src/app/shared/models/tooltip-direction.ts b/src/app/shared/models/tooltip-direction.ts index cf759d5f..42927585 100644 --- a/src/app/shared/models/tooltip-direction.ts +++ b/src/app/shared/models/tooltip-direction.ts @@ -1,8 +1,8 @@ -export enum TooltipDirection { - Above = 'above', - Below = 'below', - Left = 'left', - Right = 'right', - Before = 'before', - After = 'after' -} \ No newline at end of file +export enum TooltipDirection { + Above = 'above', + Below = 'below', + Left = 'left', + Right = 'right', + Before = 'before', + After = 'after', +} diff --git a/src/app/shared/pipes/form-control/form-control.pipe.spec.ts b/src/app/shared/pipes/form-control/form-control.pipe.spec.ts index 174b0f0a..21cea33c 100644 --- a/src/app/shared/pipes/form-control/form-control.pipe.spec.ts +++ b/src/app/shared/pipes/form-control/form-control.pipe.spec.ts @@ -1,8 +1,8 @@ -import { FormControlPipe } from "./form-control.pipe"; - -describe('FormControlPipe', () => { - it('create an instance', () => { - const pipe = new FormControlPipe(); - expect(pipe).toBeTruthy(); - }); -}); +import { FormControlPipe } from './form-control.pipe'; + +describe('FormControlPipe', () => { + it('create an instance', () => { + const pipe = new FormControlPipe(); + expect(pipe).toBeTruthy(); + }); +}); diff --git a/src/app/shared/pipes/form-control/form-control.pipe.ts b/src/app/shared/pipes/form-control/form-control.pipe.ts index 5f66964d..6ee720ad 100644 --- a/src/app/shared/pipes/form-control/form-control.pipe.ts +++ b/src/app/shared/pipes/form-control/form-control.pipe.ts @@ -1,11 +1,11 @@ -import { Pipe, PipeTransform } from "@angular/core"; -import { AbstractControl, FormControl } from "@angular/forms"; - -@Pipe({ - name: 'formControl', -}) -export class FormControlPipe implements PipeTransform { - transform(value: AbstractControl): FormControl { - return value as FormControl; - } -} \ No newline at end of file +import { Pipe, PipeTransform } from '@angular/core'; +import { AbstractControl, FormControl } from '@angular/forms'; + +@Pipe({ + name: 'formControl', +}) +export class FormControlPipe implements PipeTransform { + transform(value: AbstractControl): FormControl { + return value as FormControl; + } +} diff --git a/src/app/shared/pipes/form-group/form-group.pipe.spec.ts b/src/app/shared/pipes/form-group/form-group.pipe.spec.ts index 9e449be5..f2863853 100644 --- a/src/app/shared/pipes/form-group/form-group.pipe.spec.ts +++ b/src/app/shared/pipes/form-group/form-group.pipe.spec.ts @@ -1,8 +1,8 @@ -import { FormGroupPipe } from "./form-group.pipe"; - -describe('FormGroupPipe', () => { - it('create an instance', () => { - const pipe = new FormGroupPipe(); - expect(pipe).toBeTruthy(); - }); -}); \ No newline at end of file +import { FormGroupPipe } from './form-group.pipe'; + +describe('FormGroupPipe', () => { + it('create an instance', () => { + const pipe = new FormGroupPipe(); + expect(pipe).toBeTruthy(); + }); +}); diff --git a/src/app/shared/pipes/form-group/form-group.pipe.ts b/src/app/shared/pipes/form-group/form-group.pipe.ts index 8f7849af..405e709d 100644 --- a/src/app/shared/pipes/form-group/form-group.pipe.ts +++ b/src/app/shared/pipes/form-group/form-group.pipe.ts @@ -1,11 +1,11 @@ -import { Pipe, PipeTransform } from "@angular/core"; -import { AbstractControl, FormGroup } from "@angular/forms"; - -@Pipe({ - name: 'formGroup', -}) -export class FormGroupPipe implements PipeTransform { - transform(value: AbstractControl): FormGroup { - return value as FormGroup; - } -} \ No newline at end of file +import { Pipe, PipeTransform } from '@angular/core'; +import { AbstractControl, FormGroup } from '@angular/forms'; + +@Pipe({ + name: 'formGroup', +}) +export class FormGroupPipe implements PipeTransform { + transform(value: AbstractControl): FormGroup { + return value as FormGroup; + } +} diff --git a/src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.ts b/src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.ts index 9ba826a2..216b87af 100644 --- a/src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.ts +++ b/src/app/shared/pipes/truncate-file-name/truncate-file-name.pipe.ts @@ -1,18 +1,18 @@ import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ - name: 'truncateFileName' + name: 'truncateFileName', }) export class TruncateFileNamePipe implements PipeTransform { transform(fileName: string, maxLength: number): string { const extension = fileName.split('.').pop(); if (extension) { - if (fileName.length - extension.length <= maxLength) { + if (fileName.length - extension.length <= maxLength) { return fileName; } const truncatedName = fileName.substring(0, maxLength); - + return `${truncatedName}...${extension}`; } diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index 87c3b680..2b0304e7 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -2,7 +2,11 @@ import { ModuleWithProviders, NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { LanguageSelectorComponent } from './components/language-selector/language-selector.component'; -import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core'; +import { + TranslateLoader, + TranslateModule, + TranslateService, +} from '@ngx-translate/core'; import { AppModule } from '../app.module'; import { HttpClient } from '@angular/common/http'; @@ -17,7 +21,7 @@ import { TypescriptLoader } from '../core/helpers/typescript-loader'; import { Translations } from '../core/services/translations.service'; import { ButtonComponent } from './components/button/button.component'; -import { MatButtonModule} from '@angular/material/button'; +import { MatButtonModule } from '@angular/material/button'; import { MatIconModule } from '@angular/material/icon'; import { MatTooltipModule } from '@angular/material/tooltip'; import { HeaderComponent } from './components/header/header.component'; @@ -27,14 +31,20 @@ import { MatToolbarModule } from '@angular/material/toolbar'; import { RouterModule } from '@angular/router'; import { BannerComponent } from './components/banner/banner.component'; import { InputComponent } from './components/input/input.component'; -import { MAT_FORM_FIELD_DEFAULT_OPTIONS, MatFormFieldModule } from '@angular/material/form-field'; +import { + MAT_FORM_FIELD_DEFAULT_OPTIONS, + MatFormFieldModule, +} from '@angular/material/form-field'; import { MatInputModule } from '@angular/material/input'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { InfiniteScrollModule } from 'ngx-infinite-scroll'; import { ProfilePicComponent } from './components/profile-pic/profile-pic.component'; import { CalendarButtonComponent } from './components/calendar-button/calendar-button.component'; import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MAT_RADIO_DEFAULT_OPTIONS, MatRadioModule } from '@angular/material/radio'; +import { + MAT_RADIO_DEFAULT_OPTIONS, + MatRadioModule, +} from '@angular/material/radio'; import { MatDatepickerModule } from '@angular/material/datepicker'; import { MatAutocompleteModule } from '@angular/material/autocomplete'; import { EditorMenuComponent } from './components/editor/menu/editor-menu/editor-menu.component'; @@ -49,7 +59,6 @@ import { FormGroupPipe } from './pipes/form-group/form-group.pipe'; import { FileSelectComponent } from './components/file-select/file-select.component'; import { ListComponent } from './components/list/list.component'; - @NgModule({ declarations: [ LanguageSelectorComponent, @@ -62,7 +71,7 @@ import { ListComponent } from './components/list/list.component'; FooterComponent, PageTitleComponent, InputComponent, - BannerComponent, + BannerComponent, ProfilePicComponent, CalendarButtonComponent, EditorMenuComponent, @@ -74,7 +83,7 @@ import { ListComponent } from './components/list/list.component'; FormControlPipe, FormGroupPipe, FileSelectComponent, - ListComponent + ListComponent, ], imports: [ CommonModule, @@ -84,15 +93,14 @@ import { ListComponent } from './components/list/list.component'; TranslateModule.forChild({ loader: { provide: TranslateLoader, - useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), - deps: [HttpClient] + useFactory: (http: HttpClient) => + new TypescriptLoader(http, 'translations'), + deps: [HttpClient], }, isolate: false, - extend: true - }), - NgxEditorModule.forChild({ - + extend: true, }), + NgxEditorModule.forChild({}), MatButtonModule, MatIconModule, MatTooltipModule, @@ -104,7 +112,7 @@ import { ListComponent } from './components/list/list.component'; MatDatepickerModule, MatAutocompleteModule, NgxSkeletonLoaderModule, - InfiniteScrollModule + InfiniteScrollModule, ], exports: [ TranslateModule, @@ -116,7 +124,7 @@ import { ListComponent } from './components/list/list.component'; EditorComponent, ButtonComponent, InputComponent, - BannerComponent, + BannerComponent, NgxSkeletonLoaderModule, InfiniteScrollModule, ProfilePicComponent, @@ -126,8 +134,8 @@ import { ListComponent } from './components/list/list.component'; BlogFormComponent, EventFormComponent, PollFormComponent, - ListComponent, - FormControlPipe + ListComponent, + FormControlPipe, ], providers: [ { @@ -135,22 +143,21 @@ import { ListComponent } from './components/list/list.component'; provide: NGX_EDITOR_CONFIG_TOKEN, deps: [TranslateService, Translations], }, - { - provide: MAT_FORM_FIELD_DEFAULT_OPTIONS, - useValue: { appearance: 'outline' } + { + provide: MAT_FORM_FIELD_DEFAULT_OPTIONS, + useValue: { appearance: 'outline' }, }, { provide: MAT_RADIO_DEFAULT_OPTIONS, useValue: { color: 'primary' }, - } - ] + }, + ], }) export class SharedModule { - static forRoot(): ModuleWithProviders { return { ngModule: SharedModule, - providers: [] // share state with providers (one instance) - } + providers: [], // share state with providers (one instance) + }; } - } \ No newline at end of file +} diff --git a/src/assets/i18n/translations.en.ts b/src/assets/i18n/translations.en.ts index 2e4b9c57..d254801f 100644 --- a/src/assets/i18n/translations.en.ts +++ b/src/assets/i18n/translations.en.ts @@ -1,370 +1,370 @@ -export default { - "app": { - "title": "GCcollab" - }, - "routes": { - "home": "home", - "login": "login", - "register": "register", - "terms": "terms", - "splash": "splash", - "about": "about", - "privacy": "privacy", - "stats": "stats", - "help": "help", - "blog": "blog", - "bookmarks": "bookmarks", - "dashboards": "dashboards", - "events": "events", - "friends": "friends", - "groups": "groups", - "invite": "invite", - "members": "members", - "messages": "messages", - "missions": "missions", - "newsfeed": "newsfeed", - "profile": "profile", - "search": "search", - "settings": "settings", - "thewire": "thewire", - "unauthorized": "unauthorized", - "forbidden": "forbidden" - }, - "titles": { - "home": "Home", - "login": "Login", - "register": "Register", - "terms": "Terms", - "splash": "Splash", - "about": "About", - "privacy": "Privacy", - "stats": "Stats", - "help": "Help", - "blog": "Blog", - "blogs": "Blogs", - "bookmarks": "Bookmarks", - "dashboards": "Dashboards", - "events": "Events", - "event": "Event", - "friends": "Friends", - "groups": "Groups", - "group": "Group", - "invite": "Invite", - "members": "Members", - "messages": "Messages", - "missions": "Careers", - "newsfeed": "Newsfeed", - "poll": "Poll", - "post": "Post", - "profile": "Profile", - "search": "Search", - "settings": "Settings", - "thewire": "The Wire", - "unauthorized": "Unauthorized", - "upcoming_events": "Up Coming Events", - "previous_events": "Previous Events", - "forbidden": "Forbidden", - "communities": "Communities", - "notfound": "Not Found" - }, - "languages": { - "label": "Language", - "english": "English", - "french": "French", - "tooltip": "Select your language", - "aria": "Click to select your language preference" - }, - "features": { - "home": { - "moreEvents": "More events", - "moreConnections": "More connections", - "moreGroups": "More groups" - }, - "more": "See more" - }, - "header": { - "home": { - "title": "Home", - "aria": "Click to go to the home page." - }, - "network": { - "title": "Network", - "aria": "Click to go to your network." - }, - "groups": { - "title": "Groups", - "aria": "Click to go to the groups page." - }, - "jobs": { - "title": "Jobs", - "aria": "Click to go to the jobs page." - }, - "support": { - "title": "Support", - "aria": "Click to go to the support page." - }, - "search": { - "title": "Search GCCollab", - "aria": "Start typing to search GCCollab", - "button": { - "tooltip_on": "Search", - "tooltip_off": "Close search", - "aria_on": "Click to start searching GCCollab", - "aria_off": "Click to close the search bar" - } - }, - "messages" : { - "tooltip": "Messages", - "aria": "Click to view your messages" - }, - "notifications": { - "tooltip": "Notifications", - "aria": "Click to view your notifications" - }, - "profile": { - "tooltip": "Profile", - "aria": "Click to view your profile" - } - }, - "footer": { - "title": { - "about": "About", - "privacy": "Privacy", - "connect": "Support" - }, - "item": { - "about": "About GCCollab", - "privacypolicy": "Privacy Policy", - "terms": "Terms and Conditions of Use", - "stats": "Statistics", - "faq": "FAQs", - "help": "Help / Contact Us", - "twitter": "Twitter", - "github": "GitHub", - "gctools": "GCtools" - } - }, - "editor": { - "placeholder": "Type here...", - "bold": "Bold", - "italic": "Italic", - "code": "Code", - "underline": "Underline", - "strike": "Strike", - "blockquote": "Block Quote", - "bulletlist": "Bullet List", - "orderedlist": "Ordered List", - "heading": "Heading", - "h1": "Header 1", - "h2": "Header 2", - "h3": "Header 3", - "h4": "Header 4", - "h5": "Header 5", - "h6": "Header 6", - "alignleft": "Align Left", - "aligncenter": "Center Align", - "alignright": "Align Right", - "alignjustify": "Align Justify", - "textcolor": "Text Colour", - "bgcolor": "Background Colour", - "linkinsert": "Insert Link", - "linkremove": "Remove Link", - "imginsert": "Insert Image", - "url": "URL", - "text": "Text", - "opennewtab": "Open in New Tab", - "insert": "Insert", - "alt": "Alt Text", - "title": "Title", - "remove": "Remove", - "horizontalrule": "Horizontal Rule", - "formatclear": "Clear Formatting", - "enabled": " enabled" - }, - "input": { - "hint": { - "show": { - "text": "Show hint", - "aria": "Click to show the hint" - }, - "hide": { - "text": "Hide hint", - "aria": "Click to hide the hint" - } - }, - "password": { - "show": { - "text": "Show password", - "aria": "Click to show your password" - }, - "hide": { - "text": "Hide password", - "aria": "Click to hide your password" - } - }, - "error": { - "required": "is required.", - "email": "Please enter a valid email.", - "minLength": "Minimum character length is ", - "maxLength": "Maximum character length is " - } - }, - "banner": { - "welcome": "WELCOME", - "gccollab": "TO GCCollab", - "event": "Events" - }, - "newsCard": { - "like": { - "tooltip": "Like", - "aria_on": "Click to like this.", - "aria_off": "Click to un-like this." - }, - "comment": { - "tooltip": "Comment", - "aria": "Click to add a comment." - }, - "share": { - "tooltip": "Share", - "aria": "Click to share this." - }, - "bookmark": { - "tooltip": "Bookmark", - "aria_on": "Click to bookmark this.", - "aria_off": "Click to un-bookmark this." - } - }, - "eventCard": { - "calendar": { - "tooltip": "View in calendar", - "aria": "Click to view this event in the calendar" - }, - "confirm": { - "tooltip_on": "Confirm event", - "aria_on": "Click to add this event to your calendar", - "tooltip_off": "Remove confirmation", - "aria_off": "Click to remove this event from your calendar" - }, - "decline": { - "tooltip_on": "Decline event", - "aria_on": "Click to decline this event", - "tooltip_off": "Rescind declination", - "aria_off": "Click to rescind your declination of the event" - }, - "alt": "Event image", - "canceled": "Canceled", - "organizer": "Organizer", - "location": "Location" - }, - "profileCard": { - "confirm": { - "tooltip_on": "Add connection", - "aria_on": "Click to add this person to your connections", - "tooltip_off": "Remove connection", - "aria_off": "Click to remove this person from your connections" - }, - "decline": { - "tooltip_on": "Decline connection", - "aria_on": "Click to decline this connection", - "tooltip_off": "Rescind declination", - "aria_off": "Click to rescind your declination of this connection" - } - }, - "profile_pic": { - "alt": "A profile picture" - }, - "event": { - "search": { - "title": "Search events" - }, - "date_time": "Date & Time:", - "location": "Location:", - "host": "Host:", - "event_description": "Event Description", - "event_registration": "Event Registration", - "form": { - "full_name": "Full Name", - "full_name_error": "Your full name is required.", - "email": "Email Address", - "email_error": "Your email address is required.", - "email_confirm": "Confirm Email Address", - "email_confirm_error": "Your email must match.", - "occupation": "Occupation", - "occupation_error": "Your occupation is required.", - "occupation_hint": "This would be your current job title.", - "add_calendar": "Add to my calendar", - "agree_with": "I agree with the ", - "terms_conditions": "terms and conditions", - "register": "REGISTER", - "placeholder": "Type here" - }, - "share": { - "tooltip": "Share", - "aria": "Click to share this event." - }, - "bookmark": { - "tooltip_on": "Bookmark", - "tooltip_off": "Bookmarked", - "aria_on": "Click to bookmark this event.", - "aria_off": "Click to remove this event from your bookmarks." - } - }, - "forms": { - "placeholder": "Type here", - "save": "Save", - "saved_image": "Saved Image", - "create": "Create", - "search": "Search events", - "post": { - "post": "Post" - }, - "blog": { - "name_of_blog": "Name of Blog", - "name_of_publisher": "Name of publisher", - "upload_cover_photo": "Upload a cover photo", - "cover_photo_alt": "Cover photo alt text", - "body": "Body" - }, - "event": { - "type_of_event": "Type of event", - "type_of_event_aria" : "Select an event type", - "in_person": "In-person", - "hybrid": "Hybrid", - "online": "Online", - "name_of_organizer": "Name of organizer", - "name_of_event": "Name of event", - "event_language": "Language of event", - "event_language_aria": "Select a language for your event", - "english": "English", - "french": "French", - "bilingual": "Bilingual", - "body": "Body", - "body_hint": "Start writing.", - "location": "Location", - "platform": "Online streaming platform", - "duration": "Event duration", - "duration_aria": "Select a duration for your event", - "single_day": "One day event", - "multi_day": "Multi-day event", - "start_date": "Start date", - "end_date": "End date", - "search": " " - }, - "poll": { - "description": "Poll description / question", - "option": "Option", - "option_add": "Add an option", - "option_remove": "Remove option" - } - }, - "file_select": { - "error": { - "size": "File is too large. Maximum size allowed is ", - "extension": "The file selected doesn't have an accepted extension.", - "characters": "Files have a maximum character count of ", - "img_small": "Images must be at minimum ", - "img_large": "Images have a maximum of ", - "read": "Error reading the file." - } - } -}; \ No newline at end of file +export default { + app: { + title: 'GCcollab', + }, + routes: { + home: 'home', + login: 'login', + register: 'register', + terms: 'terms', + splash: 'splash', + about: 'about', + privacy: 'privacy', + stats: 'stats', + help: 'help', + blog: 'blog', + bookmarks: 'bookmarks', + dashboards: 'dashboards', + events: 'events', + friends: 'friends', + groups: 'groups', + invite: 'invite', + members: 'members', + messages: 'messages', + missions: 'missions', + newsfeed: 'newsfeed', + profile: 'profile', + search: 'search', + settings: 'settings', + thewire: 'thewire', + unauthorized: 'unauthorized', + forbidden: 'forbidden', + }, + titles: { + home: 'Home', + login: 'Login', + register: 'Register', + terms: 'Terms', + splash: 'Splash', + about: 'About', + privacy: 'Privacy', + stats: 'Stats', + help: 'Help', + blog: 'Blog', + blogs: 'Blogs', + bookmarks: 'Bookmarks', + dashboards: 'Dashboards', + events: 'Events', + event: 'Event', + friends: 'Friends', + groups: 'Groups', + group: 'Group', + invite: 'Invite', + members: 'Members', + messages: 'Messages', + missions: 'Careers', + newsfeed: 'Newsfeed', + poll: 'Poll', + post: 'Post', + profile: 'Profile', + search: 'Search', + settings: 'Settings', + thewire: 'The Wire', + unauthorized: 'Unauthorized', + upcoming_events: 'Up Coming Events', + previous_events: 'Previous Events', + forbidden: 'Forbidden', + communities: 'Communities', + notfound: 'Not Found', + }, + languages: { + label: 'Language', + english: 'English', + french: 'French', + tooltip: 'Select your language', + aria: 'Click to select your language preference', + }, + features: { + home: { + moreEvents: 'More events', + moreConnections: 'More connections', + moreGroups: 'More groups', + }, + more: 'See more', + }, + header: { + home: { + title: 'Home', + aria: 'Click to go to the home page.', + }, + network: { + title: 'Network', + aria: 'Click to go to your network.', + }, + groups: { + title: 'Groups', + aria: 'Click to go to the groups page.', + }, + jobs: { + title: 'Jobs', + aria: 'Click to go to the jobs page.', + }, + support: { + title: 'Support', + aria: 'Click to go to the support page.', + }, + search: { + title: 'Search GCCollab', + aria: 'Start typing to search GCCollab', + button: { + tooltip_on: 'Search', + tooltip_off: 'Close search', + aria_on: 'Click to start searching GCCollab', + aria_off: 'Click to close the search bar', + }, + }, + messages: { + tooltip: 'Messages', + aria: 'Click to view your messages', + }, + notifications: { + tooltip: 'Notifications', + aria: 'Click to view your notifications', + }, + profile: { + tooltip: 'Profile', + aria: 'Click to view your profile', + }, + }, + footer: { + title: { + about: 'About', + privacy: 'Privacy', + connect: 'Support', + }, + item: { + about: 'About GCCollab', + privacypolicy: 'Privacy Policy', + terms: 'Terms and Conditions of Use', + stats: 'Statistics', + faq: 'FAQs', + help: 'Help / Contact Us', + twitter: 'Twitter', + github: 'GitHub', + gctools: 'GCtools', + }, + }, + editor: { + placeholder: 'Type here...', + bold: 'Bold', + italic: 'Italic', + code: 'Code', + underline: 'Underline', + strike: 'Strike', + blockquote: 'Block Quote', + bulletlist: 'Bullet List', + orderedlist: 'Ordered List', + heading: 'Heading', + h1: 'Header 1', + h2: 'Header 2', + h3: 'Header 3', + h4: 'Header 4', + h5: 'Header 5', + h6: 'Header 6', + alignleft: 'Align Left', + aligncenter: 'Center Align', + alignright: 'Align Right', + alignjustify: 'Align Justify', + textcolor: 'Text Colour', + bgcolor: 'Background Colour', + linkinsert: 'Insert Link', + linkremove: 'Remove Link', + imginsert: 'Insert Image', + url: 'URL', + text: 'Text', + opennewtab: 'Open in New Tab', + insert: 'Insert', + alt: 'Alt Text', + title: 'Title', + remove: 'Remove', + horizontalrule: 'Horizontal Rule', + formatclear: 'Clear Formatting', + enabled: ' enabled', + }, + input: { + hint: { + show: { + text: 'Show hint', + aria: 'Click to show the hint', + }, + hide: { + text: 'Hide hint', + aria: 'Click to hide the hint', + }, + }, + password: { + show: { + text: 'Show password', + aria: 'Click to show your password', + }, + hide: { + text: 'Hide password', + aria: 'Click to hide your password', + }, + }, + error: { + required: 'is required.', + email: 'Please enter a valid email.', + minLength: 'Minimum character length is ', + maxLength: 'Maximum character length is ', + }, + }, + banner: { + welcome: 'WELCOME', + gccollab: 'TO GCCollab', + event: 'Events', + }, + newsCard: { + like: { + tooltip: 'Like', + aria_on: 'Click to like this.', + aria_off: 'Click to un-like this.', + }, + comment: { + tooltip: 'Comment', + aria: 'Click to add a comment.', + }, + share: { + tooltip: 'Share', + aria: 'Click to share this.', + }, + bookmark: { + tooltip: 'Bookmark', + aria_on: 'Click to bookmark this.', + aria_off: 'Click to un-bookmark this.', + }, + }, + eventCard: { + calendar: { + tooltip: 'View in calendar', + aria: 'Click to view this event in the calendar', + }, + confirm: { + tooltip_on: 'Confirm event', + aria_on: 'Click to add this event to your calendar', + tooltip_off: 'Remove confirmation', + aria_off: 'Click to remove this event from your calendar', + }, + decline: { + tooltip_on: 'Decline event', + aria_on: 'Click to decline this event', + tooltip_off: 'Rescind declination', + aria_off: 'Click to rescind your declination of the event', + }, + alt: 'Event image', + canceled: 'Canceled', + organizer: 'Organizer', + location: 'Location', + }, + profileCard: { + confirm: { + tooltip_on: 'Add connection', + aria_on: 'Click to add this person to your connections', + tooltip_off: 'Remove connection', + aria_off: 'Click to remove this person from your connections', + }, + decline: { + tooltip_on: 'Decline connection', + aria_on: 'Click to decline this connection', + tooltip_off: 'Rescind declination', + aria_off: 'Click to rescind your declination of this connection', + }, + }, + profile_pic: { + alt: 'A profile picture', + }, + event: { + search: { + title: 'Search events', + }, + date_time: 'Date & Time:', + location: 'Location:', + host: 'Host:', + event_description: 'Event Description', + event_registration: 'Event Registration', + form: { + full_name: 'Full Name', + full_name_error: 'Your full name is required.', + email: 'Email Address', + email_error: 'Your email address is required.', + email_confirm: 'Confirm Email Address', + email_confirm_error: 'Your email must match.', + occupation: 'Occupation', + occupation_error: 'Your occupation is required.', + occupation_hint: 'This would be your current job title.', + add_calendar: 'Add to my calendar', + agree_with: 'I agree with the ', + terms_conditions: 'terms and conditions', + register: 'REGISTER', + placeholder: 'Type here', + }, + share: { + tooltip: 'Share', + aria: 'Click to share this event.', + }, + bookmark: { + tooltip_on: 'Bookmark', + tooltip_off: 'Bookmarked', + aria_on: 'Click to bookmark this event.', + aria_off: 'Click to remove this event from your bookmarks.', + }, + }, + forms: { + placeholder: 'Type here', + save: 'Save', + saved_image: 'Saved Image', + create: 'Create', + search: 'Search events', + post: { + post: 'Post', + }, + blog: { + name_of_blog: 'Name of Blog', + name_of_publisher: 'Name of publisher', + upload_cover_photo: 'Upload a cover photo', + cover_photo_alt: 'Cover photo alt text', + body: 'Body', + }, + event: { + type_of_event: 'Type of event', + type_of_event_aria: 'Select an event type', + in_person: 'In-person', + hybrid: 'Hybrid', + online: 'Online', + name_of_organizer: 'Name of organizer', + name_of_event: 'Name of event', + event_language: 'Language of event', + event_language_aria: 'Select a language for your event', + english: 'English', + french: 'French', + bilingual: 'Bilingual', + body: 'Body', + body_hint: 'Start writing.', + location: 'Location', + platform: 'Online streaming platform', + duration: 'Event duration', + duration_aria: 'Select a duration for your event', + single_day: 'One day event', + multi_day: 'Multi-day event', + start_date: 'Start date', + end_date: 'End date', + search: ' ', + }, + poll: { + description: 'Poll description / question', + option: 'Option', + option_add: 'Add an option', + option_remove: 'Remove option', + }, + }, + file_select: { + error: { + size: 'File is too large. Maximum size allowed is ', + extension: "The file selected doesn't have an accepted extension.", + characters: 'Files have a maximum character count of ', + img_small: 'Images must be at minimum ', + img_large: 'Images have a maximum of ', + read: 'Error reading the file.', + }, + }, +}; diff --git a/src/assets/i18n/translations.fr.ts b/src/assets/i18n/translations.fr.ts index 3676aafb..45945e8f 100644 --- a/src/assets/i18n/translations.fr.ts +++ b/src/assets/i18n/translations.fr.ts @@ -1,372 +1,371 @@ -const fr: typeof import('./translations.en').default = { - "app": { - "title": "GCcollab" - }, - "routes": { - "home": "accueil", - "login": "connexion", - "register": "s'inscrire", - "terms": "conditions", - "splash": "éclaboussure", - "about": "à_propos_de", - "privacy": "intimité", - "stats": "statistiques", - "help": "aider", - "blog": "blog", - "bookmarks": "signets", - "dashboards": "tableaux_de_bord", - "events": "événements", - "friends": "amis", - "groups": "groupes", - "invite": "inviter", - "members": "membres", - "messages": "messages", - "missions": "missions", - "newsfeed": "fil_d'actualité", - "profile": "profil", - "search": "chercher", - "settings": "réglages", - "thewire": "le_fil", - "unauthorized": "non_autorisé", - "forbidden": "interdit" - }, - "titles": { - "home": "Accueil", - "login": "Connexion", - "register": "S'inscrire", - "terms": "Conditions", - "splash": "Éclaboussure", - "about": "À propos de", - "privacy": "Intimité", - "stats": "Statistiques", - "help": "Aider", - "blog": "Blog", - "blogs": "Blogues", - "bookmarks": "Signets", - "dashboards": "Tableaux de bord", - "events": "Événements", - "event": "Événement", - "friends": "Amis", - "groups": "Groupes", - "group": "Groupe", - "invite": "Inviter", - "members": "Membres", - "messages": "Messages", - "missions": "Carrières", - "newsfeed": "Fil d'actualité", - "poll": "Sondage", - "post": "Poste", - "profile": "Profil", - "search": "Chercher", - "settings": "Réglages", - "thewire": "Le fil", - "unauthorized": "Non autorisé", - "upcoming_events": "Événements à venir", - "previous_events": "Événements précédents", - "forbidden": "Interdit", - "communities": "Communautés", - "notfound": "Pas trouvé" - }, - "languages": { - "label": "Langue", - "english": "Anglais", - "french": "Français", - "tooltip": "Choisissez votre langue", - "aria": "Cliquez pour sélectionner votre préférence de langue" - }, - "features": { - "home": { - "moreEvents": "Plus d'événements", - "moreConnections": "Plus de connexions", - "moreGroups": "Plus des groupes" - }, - "more": "Voir Plus" - - }, - "header": { - "home": { - "title": "Accueil", - "aria": "Cliquez pour aller à la page d'accueil." - }, - "network": { - "title": "Réseau", - "aria": "Cliquez pour accéder à votre réseau." - }, - "groups": { - "title": "Groupes", - "aria": "Cliquez pour accéder à la page des groupes." - }, - "jobs": { - "title": "Emplois", - "aria": "Cliquez pour accéder à la page des emplois." - }, - "support": { - "title": "Soutien", - "aria": "Cliquez pour accéder à la page d'assistance." - }, - "search": { - "title": "Rechercher GCCollab", - "aria": "Commencez à taper pour rechercher GCCollab.", - "button": { - "tooltip_on": "Rechercher", - "tooltip_off": "Fermer la recherche", - "aria_on": "Cliquez pour lancer la recherche GCCollab.", - "aria_off": "Cliquez pour fermer la barre de recherche." - } - }, - "messages" : { - "tooltip": "Messages", - "aria": "Cliquez pour voir vos messages" - }, - "notifications": { - "tooltip": "Avis", - "aria": "Cliquez pour afficher vos notifications." - }, - "profile": { - "tooltip": "Profil", - "aria": "Cliquez pour voir votre profil." - } - }, - "footer": { - "title": { - "about": "Infos", - "privacy": "Confidentialité", - "connect": "Restez branchés" - }, - "item": { - "about": "Au sujet de GCcollab", - "privacypolicy": "Politique de confidentialité", - "terms": "Conditions d'utilisation", - "stats": "Statistiques", - "faq": "FAQs", - "help": "Aide / Contactez-nous", - "twitter": "Twitter", - "github": "GitHub", - "gctools": "GCtools" - } - }, - "editor": { - "placeholder": "Écrivez ici...", - "bold": "Gras", - "italic": "Italique", - "code": "Code", - "underline": "Souligner", - "strike": "Grève", - "blockquote": "Citation en bloc", - "bulletlist": "Liste à puces", - "orderedlist": "Liste ordonnée", - "heading": "Titre", - "h1": "En-tête 1", - "h2": "En-tête 2", - "h3": "En-tête 3", - "h4": "En-tête 4", - "h5": "En-tête 5", - "h6": "En-tête 6", - "alignleft": "Alignez à gauche", - "aligncenter": "Aligner au centre", - "alignright": "Aligner à droite", - "alignjustify": "Aligner Justifier", - "textcolor": "Couleur du texte", - "bgcolor": "La couleur d'arrière-plan", - "linkinsert": "Insérer un lien", - "linkremove": "Supprimer le lien", - "imginsert": "Insérer une image", - "url": "URL", - "text": "Texte", - "opennewtab": "Ouvrir dans un nouvel onglet", - "insert": "Insérer", - "alt": "Texte alternatif", - "title": "Titre", - "remove": "Retirer", - "horizontalrule": "La règle horizontale", - "formatclear": "Supprimer le formattage", - "enabled": " activé" - }, - "input": { - "hint": { - "show": { - "text": "Dévoiler un indice", - "aria": "Cliquez pour afficher l'indice" - }, - "hide": { - "text": "Masquer l'indice", - "aria": "Cliquez pour masquer l'indice" - } - }, - "password": { - "show": { - "text": "Montrer le mot de passe", - "aria": "Cliquez pour afficher votre mot de passe" - }, - "hide": { - "text": "Masquer le mot de passe", - "aria": "Cliquez pour masquer votre mot de passe" - } - }, - "error": { - "required": "est requis.", - "email": "Veuillez saisir une adresse e-mail valide.", - "minLength": "La longueur minimale des caractères est ", - "maxLength": "La longueur maximale des caractères est " - } - }, - "banner": { - "welcome": "BIENVENUE", - "gccollab": "À GCCollab", - "event": "Événements" - }, - "newsCard": { - "like": { - "tooltip": "Aimer", - "aria_on": "Cliquez pour aimer.", - "aria_off": "Cliquez pour ne plus aimer." - }, - "comment": { - "tooltip": "Commentaire", - "aria": "Cliquez pour ajouter un commentaire." - }, - "share": { - "tooltip": "Partager", - "aria": "Cliquez pour partager ceci." - }, - "bookmark": { - "tooltip": "Signet", - "aria_on": "Cliquez pour marquer ceci.", - "aria_off": "Cliquez pour dé-marquer ceci." - } - }, - "eventCard": { - "calendar": { - "tooltip": "Afficher dans le calendrier", - "aria": "Cliquez pour voir cet événement dans le calendrier" - }, - "confirm": { - "tooltip_on": "Confirmer l'événement", - "aria_on": "Cliquez pour ajouter cet événement à votre calendrier", - "tooltip_off": "Supprimer la confirmation", - "aria_off": "Cliquez pour supprimer cet événement de votre calendrier" - }, - "decline": { - "tooltip_on": "Refuser l'événement", - "aria_on": "Cliquez pour refuser cet événement", - "tooltip_off": "Annuler la déclinaison", - "aria_off": "Cliquez pour annuler votre déclinaison de l'événement" - }, - "alt": "Image de l'événement", - "canceled": "Annulé", - "organizer": "Organisateur", - "location": "Emplacement" - }, - "profileCard": { - "confirm": { - "tooltip_on": "Ajouter une connexion", - "aria_on": "Cliquez pour ajouter cette personne à vos relations", - "tooltip_off": "Supprimer la connexion", - "aria_off": "Cliquez pour supprimer cette personne de vos relations" - }, - "decline": { - "tooltip_on": "Refuser la connexion", - "aria_on": "Cliquez pour refuser cette connexion", - "tooltip_off": "Annuler la déclinaison", - "aria_off": "Cliquez pour annuler votre refus de cette connexion" - } - }, - "profile_pic": { - "alt": "Une photo de profil" - }, - "event": { - "search": { - "title": "Search events" - }, - "date_time": "Date & Heure:", - "location": "Emplacement:", - "host": "Hôte:", - "event_description": "Description de L'évenement", - "event_registration": "Inscription à L'événement", - "form": { - "full_name": "Nom et Prénom", - "full_name_error": "Votre nom complet est requis.", - "email": "Adresse Email", - "email_error": "Votre adresse e-mail est nécessaire.", - "email_confirm": "Confirmez votre Adresse Email", - "email_confirm_error": "Votre email doit correspondre.", - "occupation": "Profession", - "occupation_error": "Votre profession est requise.", - "occupation_hint": "Ce serait votre titre de poste actuel.", - "add_calendar": "Ajouter à mon calendrier", - "agree_with": "Je suis d'accord avec les ", - "terms_conditions": "termes et conditions", - "register": "REGISTRE", - "placeholder": "Écrivez ici" - }, - "share": { - "tooltip": "Partager", - "aria": "Cliquez pour partager cet événement." - }, - "bookmark": { - "tooltip_on": "Signet", - "tooltip_off": "Favoris", - "aria_on": "Cliquez pour ajouter cet événement à vos favoris.", - "aria_off": "Cliquez pour supprimer cet événement de vos favoris." - } - }, - "forms": { - "placeholder": "Écrivez ici", - "save": "Sauvegarder", - "saved_image": "Image enregistrée", - "create": "Créer", - "search": "Rechercher des événements", - "post": { - "post": "Poste" - }, - "blog": { - "name_of_blog": "Nom du blog", - "name_of_publisher": "Nom de l'éditeur", - "upload_cover_photo": "Téléchargez une photo de couverture", - "cover_photo_alt": "Texte alternatif de la photo de couverture", - "body": "Corps" - }, - "event": { - "type_of_event": "Type d'événement", - "type_of_event_aria" : "Sélectionnez un type d'événement", - "in_person": "En personne", - "hybrid": "Hybride", - "online": "En ligne", - "name_of_organizer": "Nom de l'organisateur", - "name_of_event": "Nom de l'événement", - "event_language": "Langue de l'événement", - "event_language_aria": "Sélectionnez une langue pour votre événement", - "english": "Anglaise", - "french": "Français", - "bilingual": "Bilingue", - "body": "Corps", - "body_hint": "Commencez à écrire.", - "location": "Emplacement", - "platform": "Plateforme de streaming en ligne", - "duration": "Durée de l'événement", - "duration_aria": "Sélectionnez une durée pour votre événement", - "single_day": "Événement d'une journée", - "multi_day": "Événement sur plusieurs jours", - "start_date": "Date de début", - "end_date": "Date de fin", - "search": " " - }, - "poll": { - "description": "Description/question du sondage", - "option": "Option", - "option_add": "Ajouter une option", - "option_remove": "Supprimer l'option" - } - }, - "file_select": { - "error": { - "size": "Le fichier est trop grand. La taille maximale autorisée est ", - "extension": "Le fichier sélectionné n'a pas d'extension acceptée.", - "characters": "Les fichiers ont un nombre maximum de caractères de ", - "img_small": "Les images doivent être au minimum ", - "img_large": "Les images ont un maximum de ", - "read": "Erreur de lecture du fichier." - } - } -}; -export default fr; \ No newline at end of file +const fr: typeof import('./translations.en').default = { + app: { + title: 'GCcollab', + }, + routes: { + home: 'accueil', + login: 'connexion', + register: "s'inscrire", + terms: 'conditions', + splash: 'éclaboussure', + about: 'à_propos_de', + privacy: 'intimité', + stats: 'statistiques', + help: 'aider', + blog: 'blog', + bookmarks: 'signets', + dashboards: 'tableaux_de_bord', + events: 'événements', + friends: 'amis', + groups: 'groupes', + invite: 'inviter', + members: 'membres', + messages: 'messages', + missions: 'missions', + newsfeed: "fil_d'actualité", + profile: 'profil', + search: 'chercher', + settings: 'réglages', + thewire: 'le_fil', + unauthorized: 'non_autorisé', + forbidden: 'interdit', + }, + titles: { + home: 'Accueil', + login: 'Connexion', + register: "S'inscrire", + terms: 'Conditions', + splash: 'Éclaboussure', + about: 'À propos de', + privacy: 'Intimité', + stats: 'Statistiques', + help: 'Aider', + blog: 'Blog', + blogs: 'Blogues', + bookmarks: 'Signets', + dashboards: 'Tableaux de bord', + events: 'Événements', + event: 'Événement', + friends: 'Amis', + groups: 'Groupes', + group: 'Groupe', + invite: 'Inviter', + members: 'Membres', + messages: 'Messages', + missions: 'Carrières', + newsfeed: "Fil d'actualité", + poll: 'Sondage', + post: 'Poste', + profile: 'Profil', + search: 'Chercher', + settings: 'Réglages', + thewire: 'Le fil', + unauthorized: 'Non autorisé', + upcoming_events: 'Événements à venir', + previous_events: 'Événements précédents', + forbidden: 'Interdit', + communities: 'Communautés', + notfound: 'Pas trouvé', + }, + languages: { + label: 'Langue', + english: 'Anglais', + french: 'Français', + tooltip: 'Choisissez votre langue', + aria: 'Cliquez pour sélectionner votre préférence de langue', + }, + features: { + home: { + moreEvents: "Plus d'événements", + moreConnections: 'Plus de connexions', + moreGroups: 'Plus des groupes', + }, + more: 'Voir Plus', + }, + header: { + home: { + title: 'Accueil', + aria: "Cliquez pour aller à la page d'accueil.", + }, + network: { + title: 'Réseau', + aria: 'Cliquez pour accéder à votre réseau.', + }, + groups: { + title: 'Groupes', + aria: 'Cliquez pour accéder à la page des groupes.', + }, + jobs: { + title: 'Emplois', + aria: 'Cliquez pour accéder à la page des emplois.', + }, + support: { + title: 'Soutien', + aria: "Cliquez pour accéder à la page d'assistance.", + }, + search: { + title: 'Rechercher GCCollab', + aria: 'Commencez à taper pour rechercher GCCollab.', + button: { + tooltip_on: 'Rechercher', + tooltip_off: 'Fermer la recherche', + aria_on: 'Cliquez pour lancer la recherche GCCollab.', + aria_off: 'Cliquez pour fermer la barre de recherche.', + }, + }, + messages: { + tooltip: 'Messages', + aria: 'Cliquez pour voir vos messages', + }, + notifications: { + tooltip: 'Avis', + aria: 'Cliquez pour afficher vos notifications.', + }, + profile: { + tooltip: 'Profil', + aria: 'Cliquez pour voir votre profil.', + }, + }, + footer: { + title: { + about: 'Infos', + privacy: 'Confidentialité', + connect: 'Restez branchés', + }, + item: { + about: 'Au sujet de GCcollab', + privacypolicy: 'Politique de confidentialité', + terms: "Conditions d'utilisation", + stats: 'Statistiques', + faq: 'FAQs', + help: 'Aide / Contactez-nous', + twitter: 'Twitter', + github: 'GitHub', + gctools: 'GCtools', + }, + }, + editor: { + placeholder: 'Écrivez ici...', + bold: 'Gras', + italic: 'Italique', + code: 'Code', + underline: 'Souligner', + strike: 'Grève', + blockquote: 'Citation en bloc', + bulletlist: 'Liste à puces', + orderedlist: 'Liste ordonnée', + heading: 'Titre', + h1: 'En-tête 1', + h2: 'En-tête 2', + h3: 'En-tête 3', + h4: 'En-tête 4', + h5: 'En-tête 5', + h6: 'En-tête 6', + alignleft: 'Alignez à gauche', + aligncenter: 'Aligner au centre', + alignright: 'Aligner à droite', + alignjustify: 'Aligner Justifier', + textcolor: 'Couleur du texte', + bgcolor: "La couleur d'arrière-plan", + linkinsert: 'Insérer un lien', + linkremove: 'Supprimer le lien', + imginsert: 'Insérer une image', + url: 'URL', + text: 'Texte', + opennewtab: 'Ouvrir dans un nouvel onglet', + insert: 'Insérer', + alt: 'Texte alternatif', + title: 'Titre', + remove: 'Retirer', + horizontalrule: 'La règle horizontale', + formatclear: 'Supprimer le formattage', + enabled: ' activé', + }, + input: { + hint: { + show: { + text: 'Dévoiler un indice', + aria: "Cliquez pour afficher l'indice", + }, + hide: { + text: "Masquer l'indice", + aria: "Cliquez pour masquer l'indice", + }, + }, + password: { + show: { + text: 'Montrer le mot de passe', + aria: 'Cliquez pour afficher votre mot de passe', + }, + hide: { + text: 'Masquer le mot de passe', + aria: 'Cliquez pour masquer votre mot de passe', + }, + }, + error: { + required: 'est requis.', + email: 'Veuillez saisir une adresse e-mail valide.', + minLength: 'La longueur minimale des caractères est ', + maxLength: 'La longueur maximale des caractères est ', + }, + }, + banner: { + welcome: 'BIENVENUE', + gccollab: 'À GCCollab', + event: 'Événements', + }, + newsCard: { + like: { + tooltip: 'Aimer', + aria_on: 'Cliquez pour aimer.', + aria_off: 'Cliquez pour ne plus aimer.', + }, + comment: { + tooltip: 'Commentaire', + aria: 'Cliquez pour ajouter un commentaire.', + }, + share: { + tooltip: 'Partager', + aria: 'Cliquez pour partager ceci.', + }, + bookmark: { + tooltip: 'Signet', + aria_on: 'Cliquez pour marquer ceci.', + aria_off: 'Cliquez pour dé-marquer ceci.', + }, + }, + eventCard: { + calendar: { + tooltip: 'Afficher dans le calendrier', + aria: 'Cliquez pour voir cet événement dans le calendrier', + }, + confirm: { + tooltip_on: "Confirmer l'événement", + aria_on: 'Cliquez pour ajouter cet événement à votre calendrier', + tooltip_off: 'Supprimer la confirmation', + aria_off: 'Cliquez pour supprimer cet événement de votre calendrier', + }, + decline: { + tooltip_on: "Refuser l'événement", + aria_on: 'Cliquez pour refuser cet événement', + tooltip_off: 'Annuler la déclinaison', + aria_off: "Cliquez pour annuler votre déclinaison de l'événement", + }, + alt: "Image de l'événement", + canceled: 'Annulé', + organizer: 'Organisateur', + location: 'Emplacement', + }, + profileCard: { + confirm: { + tooltip_on: 'Ajouter une connexion', + aria_on: 'Cliquez pour ajouter cette personne à vos relations', + tooltip_off: 'Supprimer la connexion', + aria_off: 'Cliquez pour supprimer cette personne de vos relations', + }, + decline: { + tooltip_on: 'Refuser la connexion', + aria_on: 'Cliquez pour refuser cette connexion', + tooltip_off: 'Annuler la déclinaison', + aria_off: 'Cliquez pour annuler votre refus de cette connexion', + }, + }, + profile_pic: { + alt: 'Une photo de profil', + }, + event: { + search: { + title: 'Search events', + }, + date_time: 'Date & Heure:', + location: 'Emplacement:', + host: 'Hôte:', + event_description: "Description de L'évenement", + event_registration: "Inscription à L'événement", + form: { + full_name: 'Nom et Prénom', + full_name_error: 'Votre nom complet est requis.', + email: 'Adresse Email', + email_error: 'Votre adresse e-mail est nécessaire.', + email_confirm: 'Confirmez votre Adresse Email', + email_confirm_error: 'Votre email doit correspondre.', + occupation: 'Profession', + occupation_error: 'Votre profession est requise.', + occupation_hint: 'Ce serait votre titre de poste actuel.', + add_calendar: 'Ajouter à mon calendrier', + agree_with: "Je suis d'accord avec les ", + terms_conditions: 'termes et conditions', + register: 'REGISTRE', + placeholder: 'Écrivez ici', + }, + share: { + tooltip: 'Partager', + aria: 'Cliquez pour partager cet événement.', + }, + bookmark: { + tooltip_on: 'Signet', + tooltip_off: 'Favoris', + aria_on: 'Cliquez pour ajouter cet événement à vos favoris.', + aria_off: 'Cliquez pour supprimer cet événement de vos favoris.', + }, + }, + forms: { + placeholder: 'Écrivez ici', + save: 'Sauvegarder', + saved_image: 'Image enregistrée', + create: 'Créer', + search: 'Rechercher des événements', + post: { + post: 'Poste', + }, + blog: { + name_of_blog: 'Nom du blog', + name_of_publisher: "Nom de l'éditeur", + upload_cover_photo: 'Téléchargez une photo de couverture', + cover_photo_alt: 'Texte alternatif de la photo de couverture', + body: 'Corps', + }, + event: { + type_of_event: "Type d'événement", + type_of_event_aria: "Sélectionnez un type d'événement", + in_person: 'En personne', + hybrid: 'Hybride', + online: 'En ligne', + name_of_organizer: "Nom de l'organisateur", + name_of_event: "Nom de l'événement", + event_language: "Langue de l'événement", + event_language_aria: 'Sélectionnez une langue pour votre événement', + english: 'Anglaise', + french: 'Français', + bilingual: 'Bilingue', + body: 'Corps', + body_hint: 'Commencez à écrire.', + location: 'Emplacement', + platform: 'Plateforme de streaming en ligne', + duration: "Durée de l'événement", + duration_aria: 'Sélectionnez une durée pour votre événement', + single_day: "Événement d'une journée", + multi_day: 'Événement sur plusieurs jours', + start_date: 'Date de début', + end_date: 'Date de fin', + search: ' ', + }, + poll: { + description: 'Description/question du sondage', + option: 'Option', + option_add: 'Ajouter une option', + option_remove: "Supprimer l'option", + }, + }, + file_select: { + error: { + size: 'Le fichier est trop grand. La taille maximale autorisée est ', + extension: "Le fichier sélectionné n'a pas d'extension acceptée.", + characters: 'Les fichiers ont un nombre maximum de caractères de ', + img_small: 'Les images doivent être au minimum ', + img_large: 'Les images ont un maximum de ', + read: 'Erreur de lecture du fichier.', + }, + }, +}; +export default fr; diff --git a/src/assets/scss/partials/_colors.scss b/src/assets/scss/partials/_colors.scss index 7a4f898f..74c9ab6a 100644 --- a/src/assets/scss/partials/_colors.scss +++ b/src/assets/scss/partials/_colors.scss @@ -1,41 +1,41 @@ -$primary-1: #6C0DBA; -$primary-1-dark: #4A0980; -$primary-1-light: #F6EDFC; -$primary-1-gradient: linear-gradient($primary-1, $primary-1-dark); -$primary-1-contrast: #fff; - -$primary-2: #3B18BA; -$primary-2-dark: #291180; -$primary-2-light: #EDE8FC; -$primary-2-gradient: linear-gradient($primary-2, $primary-2-dark); -$primary-2-contrast: #fff; - -$secondary-1: #AC0DBA; -$secondary-1-dark: #760980; -$secondary-1-light: #FBEDFC; -$secondary-1-gradient: linear-gradient($secondary-1, $secondary-1-dark); -$secondary-1-contrast: #fff; - -$secondary-2: #04A19E; -$secondary-2-dark: #03807D; -$secondary-2-light: #E7FFFF; -$secondary-2-gradient: linear-gradient($secondary-2, $secondary-2-dark); -$secondary-2-contrast: #fff; - -$error-red: #BA0606; -$error-red-dark: #800404; -$error-red-light: #FCEDED; -$error-red-gradient: linear-gradient($error-red, $error-red-dark); -$error-red-contrast: #fff; - -$neutral-900: #2E2C30; -$neutral-800: #47444A; -$neutral-700: #605C63; -$neutral-600: #7A757D; -$neutral-500: #938F96; -$neutral-400: #ADA9B0; -$neutral-300: #C6C3C9; -$neutral-200: #E9E6EB; -$neutral-100: #FBF9FC; - -$background: #fff; \ No newline at end of file +$primary-1: #6c0dba; +$primary-1-dark: #4a0980; +$primary-1-light: #f6edfc; +$primary-1-gradient: linear-gradient($primary-1, $primary-1-dark); +$primary-1-contrast: #fff; + +$primary-2: #3b18ba; +$primary-2-dark: #291180; +$primary-2-light: #ede8fc; +$primary-2-gradient: linear-gradient($primary-2, $primary-2-dark); +$primary-2-contrast: #fff; + +$secondary-1: #ac0dba; +$secondary-1-dark: #760980; +$secondary-1-light: #fbedfc; +$secondary-1-gradient: linear-gradient($secondary-1, $secondary-1-dark); +$secondary-1-contrast: #fff; + +$secondary-2: #04a19e; +$secondary-2-dark: #03807d; +$secondary-2-light: #e7ffff; +$secondary-2-gradient: linear-gradient($secondary-2, $secondary-2-dark); +$secondary-2-contrast: #fff; + +$error-red: #ba0606; +$error-red-dark: #800404; +$error-red-light: #fceded; +$error-red-gradient: linear-gradient($error-red, $error-red-dark); +$error-red-contrast: #fff; + +$neutral-900: #2e2c30; +$neutral-800: #47444a; +$neutral-700: #605c63; +$neutral-600: #7a757d; +$neutral-500: #938f96; +$neutral-400: #ada9b0; +$neutral-300: #c6c3c9; +$neutral-200: #e9e6eb; +$neutral-100: #fbf9fc; + +$background: #fff; diff --git a/src/assets/scss/partials/_font-weights.scss b/src/assets/scss/partials/_font-weights.scss index 85ef6a40..f1fcaf25 100644 --- a/src/assets/scss/partials/_font-weights.scss +++ b/src/assets/scss/partials/_font-weights.scss @@ -1,9 +1,9 @@ -$thin: 100; -$extra-light: 200; -$light: 300; -$regular: 400; -$medium: 500; -$semi-bold: 600; -$bold: 700; -$extra-bold: 800; -$black: 900; \ No newline at end of file +$thin: 100; +$extra-light: 200; +$light: 300; +$regular: 400; +$medium: 500; +$semi-bold: 600; +$bold: 700; +$extra-bold: 800; +$black: 900; diff --git a/src/assets/scss/partials/_header.scss b/src/assets/scss/partials/_header.scss index 6597e016..ded08d45 100644 --- a/src/assets/scss/partials/_header.scss +++ b/src/assets/scss/partials/_header.scss @@ -1,2 +1,2 @@ -$header-height-desktop: 140px;//84px; -$header-height-expanded-desktop: 170px; \ No newline at end of file +$header-height-desktop: 140px; //84px; +$header-height-expanded-desktop: 170px; diff --git a/src/assets/scss/partials/_layout.scss b/src/assets/scss/partials/_layout.scss index a51e2bf6..d89b345c 100644 --- a/src/assets/scss/partials/_layout.scss +++ b/src/assets/scss/partials/_layout.scss @@ -1,6 +1,6 @@ -$gutter-desktop: 120px; -$grid-width: 70px; -$grid-gutter: 30px; -$grid-step: calc($grid-width + $grid-gutter); - -$padding-vertical: 48px; \ No newline at end of file +$gutter-desktop: 120px; +$grid-width: 70px; +$grid-gutter: 30px; +$grid-step: calc($grid-width + $grid-gutter); + +$padding-vertical: 48px; diff --git a/src/assets/scss/partials/_palettes.scss b/src/assets/scss/partials/_palettes.scss index 0cfe5717..7fe559ec 100644 --- a/src/assets/scss/partials/_palettes.scss +++ b/src/assets/scss/partials/_palettes.scss @@ -1,132 +1,133 @@ -$primary-palette: ( - 50: #f5e5f9, - 100: #e5bef0, - 200: #d493e7, - 300: #c266de, - 400: #b440d6, - 500: #6C0DBA, //#a612ce - 600: #9612c8, - 700: #800fc1, - 800: #6c0dba, - 900: #4109b0, - A100: white, - A200: white, - A400: white, - A700: white, - contrast: ( - 50: black, - 100: black, - 200: black, - 300: white, - 400: white, - 500: white, - 600: white, - 700: white, - 800: white, - 900: white, - A100: black, - A200: black, - A400: black, - A700: black, - ) -); - -$secondary-palette: ( - 50: #e0f1f2, - 100: #b1dddd, - 200: #7fc8c7, - 300: #4bb2b0, - 400: #25a19e, - 500: #04A19E, - 600: #01847e, - 700: #02746e, - 800: #05645e, - 900: #064841, - A100: white, - A200: white, - A400: white, - A700: white, - contrast: ( - 50: black, - 100: black, - 200: black, - 300: black, - 400: white, - 500: white, - 600: white, - 700: white, - 800: white, - 900: white, - A100: black, - A200: black, - A400: black, - A700: black, - ) -); - -// TODO : Contrast + fillers -$accent-palette: ( - 50: #FBEDFC, - 100: #badffb, - 200: #8fcbfa, - 300: #61b7f7, - 400: #3ca7f6, - 500: #AC0DBA, - 600: #078ae7, - 700: #0078d4, - 800: #0067c2, - 900: #760980, - A100: white, - A200: white, - A400: white, - A700: white, - contrast: ( - 50: black, - 100: black, - 200: black, - 300: black, - 400: black, - 500: white, - 600: white, - 700: white, - 800: white, - 900: white, - A100: black, - A200: black, - A400: black, - A700: black, - ) -); - -$warn-palette: ( - 50: #ffeaed, - 100: #ffcbce, - 200: #f29793, - 300: #e96e69, - 400: #f24d42, - 500: #f53c23, - 600: #e73024, - 700: #d5241e, - 800: #c81b17, - 900: #ba0606, - A100: #800404, - A200: white, - A400: white, - A700: white, - contrast: ( - 50: black, - 100: black, - 200: black, - 300: black, - 400: black, - 500: white, - 600: white, - 700: white, - 800: white, - 900: white, - A100: white, - A200: black, - A400: black, - A700: black, - ) -); \ No newline at end of file +$primary-palette: ( + 50: #f5e5f9, + 100: #e5bef0, + 200: #d493e7, + 300: #c266de, + 400: #b440d6, + 500: #6c0dba, + //#a612ce + 600: #9612c8, + 700: #800fc1, + 800: #6c0dba, + 900: #4109b0, + A100: white, + A200: white, + A400: white, + A700: white, + contrast: ( + 50: black, + 100: black, + 200: black, + 300: white, + 400: white, + 500: white, + 600: white, + 700: white, + 800: white, + 900: white, + A100: black, + A200: black, + A400: black, + A700: black, + ), +); + +$secondary-palette: ( + 50: #e0f1f2, + 100: #b1dddd, + 200: #7fc8c7, + 300: #4bb2b0, + 400: #25a19e, + 500: #04a19e, + 600: #01847e, + 700: #02746e, + 800: #05645e, + 900: #064841, + A100: white, + A200: white, + A400: white, + A700: white, + contrast: ( + 50: black, + 100: black, + 200: black, + 300: black, + 400: white, + 500: white, + 600: white, + 700: white, + 800: white, + 900: white, + A100: black, + A200: black, + A400: black, + A700: black, + ), +); + +// TODO : Contrast + fillers +$accent-palette: ( + 50: #fbedfc, + 100: #badffb, + 200: #8fcbfa, + 300: #61b7f7, + 400: #3ca7f6, + 500: #ac0dba, + 600: #078ae7, + 700: #0078d4, + 800: #0067c2, + 900: #760980, + A100: white, + A200: white, + A400: white, + A700: white, + contrast: ( + 50: black, + 100: black, + 200: black, + 300: black, + 400: black, + 500: white, + 600: white, + 700: white, + 800: white, + 900: white, + A100: black, + A200: black, + A400: black, + A700: black, + ), +); + +$warn-palette: ( + 50: #ffeaed, + 100: #ffcbce, + 200: #f29793, + 300: #e96e69, + 400: #f24d42, + 500: #f53c23, + 600: #e73024, + 700: #d5241e, + 800: #c81b17, + 900: #ba0606, + A100: #800404, + A200: white, + A400: white, + A700: white, + contrast: ( + 50: black, + 100: black, + 200: black, + 300: black, + 400: black, + 500: white, + 600: white, + 700: white, + 800: white, + 900: white, + A100: white, + A200: black, + A400: black, + A700: black, + ), +); diff --git a/src/environments/environment.pr.ts b/src/environments/environment.pr.ts index 8c3de47b..119bff93 100644 --- a/src/environments/environment.pr.ts +++ b/src/environments/environment.pr.ts @@ -1,9 +1,9 @@ -export const environment = { - production: false, - authGuard: false, // TODO: Switch this to true once we have OAuth working for PR - clientId: "429862", // TODO: Create client during workflow and insert here - baseUrl: "https://dev.account.gccollab.ca/api", - authUrl: "https://dev.account.gccollab.ca/openid", - authLogLevel: 0, - i18nFolder: "./assets/i18n/" -} \ No newline at end of file +export const environment = { + production: false, + authGuard: false, // TODO: Switch this to true once we have OAuth working for PR + clientId: '429862', // TODO: Create client during workflow and insert here + baseUrl: 'https://dev.account.gccollab.ca/api', + authUrl: 'https://dev.account.gccollab.ca/openid', + authLogLevel: 0, + i18nFolder: './assets/i18n/', +}; diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts index b1dcd125..4f93da1c 100644 --- a/src/environments/environment.prod.ts +++ b/src/environments/environment.prod.ts @@ -2,9 +2,9 @@ export const environment = { production: true, authGuard: true, - clientId: "429862", - baseUrl: "https://dev.account.gccollab.ca/api", - authUrl: "https://dev.account.gccollab.ca/openid", + clientId: '429862', + baseUrl: 'https://dev.account.gccollab.ca/api', + authUrl: 'https://dev.account.gccollab.ca/openid', authLogLevel: 0, - i18nFolder: "./assets/i18n/" + i18nFolder: './assets/i18n/', }; diff --git a/src/environments/environment.ts b/src/environments/environment.ts index 9e11493f..73e25f05 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.ts @@ -5,11 +5,11 @@ export const environment = { production: false, authGuard: true, - clientId: "429862", - baseUrl: "https://dev.account.gccollab.ca/api", //Devskim: ignore DS137138 - authUrl: "https://dev.account.gccollab.ca/openid", + clientId: '429862', + baseUrl: 'https://dev.account.gccollab.ca/api', //Devskim: ignore DS137138 + authUrl: 'https://dev.account.gccollab.ca/openid', authLogLevel: 1, - i18nFolder: "./assets/i18n/" + i18nFolder: './assets/i18n/', }; /* diff --git a/src/index.html b/src/index.html index ad4684f2..6935dd4b 100644 --- a/src/index.html +++ b/src/index.html @@ -1,17 +1,23 @@ - - - - - - - - - - - - - - + + + + + + + + + + + + + + diff --git a/src/main.ts b/src/main.ts index c7b673cf..d9a2e7e4 100644 --- a/src/main.ts +++ b/src/main.ts @@ -8,5 +8,6 @@ if (environment.production) { enableProdMode(); } -platformBrowserDynamic().bootstrapModule(AppModule) - .catch(err => console.error(err)); +platformBrowserDynamic() + .bootstrapModule(AppModule) + .catch((err) => console.error(err)); diff --git a/src/polyfills.ts b/src/polyfills.ts index 429bb9ef..e4555ed1 100644 --- a/src/polyfills.ts +++ b/src/polyfills.ts @@ -45,8 +45,7 @@ /*************************************************************************************************** * Zone JS is required by default for Angular itself. */ -import 'zone.js'; // Included with Angular CLI. - +import 'zone.js'; // Included with Angular CLI. /*************************************************************************************************** * APPLICATION IMPORTS diff --git a/src/scripts/nodeSyncWorkflows.js b/src/scripts/nodeSyncWorkflows.js index ce4c3a4e..2b74ec05 100644 --- a/src/scripts/nodeSyncWorkflows.js +++ b/src/scripts/nodeSyncWorkflows.js @@ -1,36 +1,39 @@ -const { exec } = require('child_process'); -const fs = require('fs'); - -// These need to be manually updated if we are adding/removing workflow files. -const workflowFilePaths = [ - '.github/workflows/dependency-graph.yml', - '.github/workflows/deploy-dev.yml', - '.github/workflows/deploy-pr.yml', - '.github/workflows/lint.yml', -]; - -exec('npm run ng v', (error, stdout, stderr) => { - - if (error) { - console.error(`Error: ${error.message}`); - return; - } - if (stderr) { - console.error(`stderr: ${stderr}`); - return; - } - - const nodeVersionMatch = stdout.match(/Node:\s+(\d+\.\d+\.\d+)/); - const nodeVersion = nodeVersionMatch ? nodeVersionMatch[1] : null; - - if (nodeVersion) { - for (let i = 0; i < workflowFilePaths.length; i++) { - - let workflowFileContent = fs.readFileSync(workflowFilePaths[i], 'utf8'); - workflowFileContent = workflowFileContent.replace(/NODE_VERSION: ['"]\d+\.\d+\.\d+['"]/, `NODE_VERSION: '${nodeVersion}'`); - fs.writeFileSync(workflowFilePaths[i], workflowFileContent); - - console.log(`${workflowFilePaths[i]} updated to use Node.js version ${nodeVersion}`); - } - } -}); +const { exec } = require("child_process"); +const fs = require("fs"); + +// These need to be manually updated if we are adding/removing workflow files. +const workflowFilePaths = [ + ".github/workflows/dependency-graph.yml", + ".github/workflows/deploy-dev.yml", + ".github/workflows/deploy-pr.yml", + ".github/workflows/lint.yml", +]; + +exec("npm run ng v", (error, stdout, stderr) => { + if (error) { + console.error(`Error: ${error.message}`); + return; + } + if (stderr) { + console.error(`stderr: ${stderr}`); + return; + } + + const nodeVersionMatch = stdout.match(/Node:\s+(\d+\.\d+\.\d+)/); + const nodeVersion = nodeVersionMatch ? nodeVersionMatch[1] : null; + + if (nodeVersion) { + for (let i = 0; i < workflowFilePaths.length; i++) { + let workflowFileContent = fs.readFileSync(workflowFilePaths[i], "utf8"); + workflowFileContent = workflowFileContent.replace( + /NODE_VERSION: ['"]\d+\.\d+\.\d+['"]/, + `NODE_VERSION: '${nodeVersion}'`, + ); + fs.writeFileSync(workflowFilePaths[i], workflowFileContent); + + console.log( + `${workflowFilePaths[i]} updated to use Node.js version ${nodeVersion}`, + ); + } + } +}); diff --git a/src/silent-renew.html b/src/silent-renew.html index 21396f46..f28afe85 100644 --- a/src/silent-renew.html +++ b/src/silent-renew.html @@ -1,21 +1,23 @@ - - - - - - - silent-renew - - - - - - \ No newline at end of file + + + + + + + silent-renew + + + + + + diff --git a/src/styles.scss b/src/styles.scss index 62098405..9e4cb02d 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -1,21 +1,24 @@ -@import '/src/assets/scss/partials/font-weights'; -@import '/src/assets/scss/partials/layout'; -@import '/src/assets/scss/partials/colors'; +@import "/src/assets/scss/partials/font-weights"; +@import "/src/assets/scss/partials/layout"; +@import "/src/assets/scss/partials/colors"; -html, body { height: 100%; } +html, +body { + height: 100%; +} -body { - margin: 0; - font-family: 'Inter', 'Helvetica Neue', sans-serif; - display: flex; - overflow-x: hidden; +body { + margin: 0; + font-family: "Inter", "Helvetica Neue", sans-serif; + display: flex; + overflow-x: hidden; } app-root { - display: flex; - min-height: 100%; - flex-direction: column; - flex: 1; + display: flex; + min-height: 100%; + flex-direction: column; + flex: 1; } // h1, h2, h3, h4, h5, p, span, a, button, div { @@ -39,61 +42,62 @@ app-root { // } .NgxEditor__Dropdown .NgxEditor__Dropdown--DropdownMenu { - width: fit-content !important; + width: fit-content !important; } a { - text-decoration: none; + text-decoration: none; } app-banner { - .banner-text-top, .banner-text-bottom { - height: 50%; - - div { - display: flex; - height: 100%; - width: 100%; - } + .banner-text-top, + .banner-text-bottom { + height: 50%; + + div { + display: flex; + height: 100%; + width: 100%; + } } .banner-text-top > div { - align-items: flex-end; + align-items: flex-end; } .banner-text-bottom > div { - align-items: flex-start; + align-items: flex-start; } } .page-title { - h1 { - margin-top: 0; - margin-bottom: $padding-vertical; - } + h1 { + margin-top: 0; + margin-bottom: $padding-vertical; + } } .gcc-scroller { - .scroller { - width: 100%; - height: 200px; - overflow-y: scroll; - } - - ::-webkit-scrollbar { - width: 10px; - } - - ::-webkit-scrollbar-track { - background: $primary-1-light; - border-radius: 10px; - } - - ::-webkit-scrollbar-thumb { - background: $primary-1-dark; - border-radius: 10px; - } - - ::-webkit-scrollbar-thumb:hover { - background: $primary-1; - } -} \ No newline at end of file + .scroller { + width: 100%; + height: 200px; + overflow-y: scroll; + } + + ::-webkit-scrollbar { + width: 10px; + } + + ::-webkit-scrollbar-track { + background: $primary-1-light; + border-radius: 10px; + } + + ::-webkit-scrollbar-thumb { + background: $primary-1-dark; + border-radius: 10px; + } + + ::-webkit-scrollbar-thumb:hover { + background: $primary-1; + } +} diff --git a/src/test.ts b/src/test.ts index 51bb0206..b218a9fd 100644 --- a/src/test.ts +++ b/src/test.ts @@ -4,7 +4,7 @@ import 'zone.js/testing'; import { getTestBed } from '@angular/core/testing'; import { BrowserDynamicTestingModule, - platformBrowserDynamicTesting + platformBrowserDynamicTesting, } from '@angular/platform-browser-dynamic/testing'; // First, initialize the Angular testing environment. diff --git a/src/theme.scss b/src/theme.scss index 3ae1a97d..68e11bf5 100644 --- a/src/theme.scss +++ b/src/theme.scss @@ -1,107 +1,109 @@ -// Import Angular Material styles -@use '@angular/material' as mat; -@include mat.core(); - -@import '@angular/material/theming'; -@import url('https://fonts.googleapis.com/css2?family=Inter:wght@100;200;300;400;500;600;700;800;900&display=swap'); - -@import '/src/assets/scss/partials/colors'; -@import '/src/assets/scss/partials/palettes'; - -$theme-primary: mat.define-palette($primary-palette); -$theme-accent: mat.define-palette($accent-palette); -$theme-warn: mat.define-palette($warn-palette); - -$theme-typography: mat.define-typography-config( - $font-family: 'Inter' -); - -$theme: mat.define-light-theme(( - color: ( - primary: $theme-primary, - accent: $theme-accent, - warn: $theme-warn - ), - typography: $theme-typography, - density: 0 -)); - -// Apply theme to all components -@include mat.all-component-themes($theme); - -// Custom Overrides -body { - background-color: $background; - color: #000; -} - -//Component Overrides -.mat-button, -.mat-icon-button, -.mat-raised-button, -.mat-flat-button, -.mat-stroked-button { - padding: 0 1.15em; - margin: 0 .65em; - min-width: 3em; - line-height: 36.4px; -} -.mat-chip { - padding: .5em .85em; - min-height: 2.5em; -} -.material-icons { - font-size: 24px; - font-family: 'Material Icons Outlined', 'Material Icons'; - .mat-badge-content { - font-family: 'Inter'; - } -} -mat-checkbox { - label { - font-size: 16px; - font-style: normal; - font-weight: 400; - a { - color: $primary-1-dark; - } - } -} -mat-tab-header { - margin-right: 65px; - padding-bottom: 30px; - .mat-mdc-tab-labels { - display: inline-flex; - background-color: $neutral-200; - border-radius: 10px; - .mdc-tab__text-label { - font-size: large; - font-weight: 600; - transition: color 0.25s ease; - } - } - .mdc-tab { - height: 40px; - border-radius: 10px; - transition: background-color 0.25s ease; - .mdc-tab__text-label { - color: $neutral-900 !important; - font-weight: 500; - } - } - .mat-mdc-tab:hover, - .mat-mdc-tab.cdk-keyboard-focused { - .mdc-tab__ripple::before { - border-radius: 10px; - } - } - .mdc-tab--active { - background-color: $primary-1; - .mdc-tab__text-label { - color: $primary-1-contrast !important; - } - } - .mdc-tab-indicator { - display: none; - } -} \ No newline at end of file +// Import Angular Material styles +@use "@angular/material" as mat; +@include mat.core(); + +@import "@angular/material/theming"; +@import url("https://fonts.googleapis.com/css2?family=Inter:wght@100;200;300;400;500;600;700;800;900&display=swap"); + +@import "/src/assets/scss/partials/colors"; +@import "/src/assets/scss/partials/palettes"; + +$theme-primary: mat.define-palette($primary-palette); +$theme-accent: mat.define-palette($accent-palette); +$theme-warn: mat.define-palette($warn-palette); + +$theme-typography: mat.define-typography-config( + $font-family: "Inter", +); + +$theme: mat.define-light-theme( + ( + color: ( + primary: $theme-primary, + accent: $theme-accent, + warn: $theme-warn, + ), + typography: $theme-typography, + density: 0, + ) +); + +// Apply theme to all components +@include mat.all-component-themes($theme); + +// Custom Overrides +body { + background-color: $background; + color: #000; +} + +//Component Overrides +.mat-button, +.mat-icon-button, +.mat-raised-button, +.mat-flat-button, +.mat-stroked-button { + padding: 0 1.15em; + margin: 0 0.65em; + min-width: 3em; + line-height: 36.4px; +} +.mat-chip { + padding: 0.5em 0.85em; + min-height: 2.5em; +} +.material-icons { + font-size: 24px; + font-family: "Material Icons Outlined", "Material Icons"; + .mat-badge-content { + font-family: "Inter"; + } +} +mat-checkbox { + label { + font-size: 16px; + font-style: normal; + font-weight: 400; + a { + color: $primary-1-dark; + } + } +} +mat-tab-header { + margin-right: 65px; + padding-bottom: 30px; + .mat-mdc-tab-labels { + display: inline-flex; + background-color: $neutral-200; + border-radius: 10px; + .mdc-tab__text-label { + font-size: large; + font-weight: 600; + transition: color 0.25s ease; + } + } + .mdc-tab { + height: 40px; + border-radius: 10px; + transition: background-color 0.25s ease; + .mdc-tab__text-label { + color: $neutral-900 !important; + font-weight: 500; + } + } + .mat-mdc-tab:hover, + .mat-mdc-tab.cdk-keyboard-focused { + .mdc-tab__ripple::before { + border-radius: 10px; + } + } + .mdc-tab--active { + background-color: $primary-1; + .mdc-tab__text-label { + color: $primary-1-contrast !important; + } + } + .mdc-tab-indicator { + display: none; + } +} diff --git a/tsconfig.app.json b/tsconfig.app.json index 82d91dc4..ff396d4c 100644 --- a/tsconfig.app.json +++ b/tsconfig.app.json @@ -5,11 +5,6 @@ "outDir": "./out-tsc/app", "types": [] }, - "files": [ - "src/main.ts", - "src/polyfills.ts" - ], - "include": [ - "src/**/*.d.ts" - ] + "files": ["src/main.ts", "src/polyfills.ts"], + "include": ["src/**/*.d.ts"] } diff --git a/tsconfig.json b/tsconfig.json index 8ede62ed..d3d4c1b6 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -18,19 +18,15 @@ "importHelpers": true, "target": "ES2022", "module": "es2020", - "lib": [ - "es2020", - "ES2021.String", - "dom" - ], + "lib": ["es2020", "ES2021.String", "dom"], "resolveJsonModule": true, "esModuleInterop": true, - "useDefineForClassFields": false + "useDefineForClassFields": false, }, "angularCompilerOptions": { "enableI18nLegacyMessageIdFormat": false, "strictInjectionParameters": true, "strictInputAccessModifiers": true, - "strictTemplates": true - } + "strictTemplates": true, + }, } diff --git a/tsconfig.spec.json b/tsconfig.spec.json index 092345b0..669344f8 100644 --- a/tsconfig.spec.json +++ b/tsconfig.spec.json @@ -3,16 +3,8 @@ "extends": "./tsconfig.json", "compilerOptions": { "outDir": "./out-tsc/spec", - "types": [ - "jasmine" - ] + "types": ["jasmine"] }, - "files": [ - "src/test.ts", - "src/polyfills.ts" - ], - "include": [ - "src/**/*.spec.ts", - "src/**/*.d.ts" - ] + "files": ["src/test.ts", "src/polyfills.ts"], + "include": ["src/**/*.spec.ts", "src/**/*.d.ts"] } From 1c4d411017c0dbfe6efd796ee692c3cea3af8923 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Fri, 26 Jan 2024 16:13:35 -0500 Subject: [PATCH 125/165] added prettier to pre-commit hook. ignore translation files --- .prettierignore | 2 + hooks/pre-commit | 3 +- src/assets/i18n/translations.en.ts | 738 ++++++++++++++-------------- src/assets/i18n/translations.fr.ts | 739 +++++++++++++++-------------- 4 files changed, 743 insertions(+), 739 deletions(-) diff --git a/.prettierignore b/.prettierignore index e69de29b..c8e06881 100644 --- a/.prettierignore +++ b/.prettierignore @@ -0,0 +1,2 @@ +**/*.en.ts +**/*.fr.ts \ No newline at end of file diff --git a/hooks/pre-commit b/hooks/pre-commit index be4178d4..f6270488 100644 --- a/hooks/pre-commit +++ b/hooks/pre-commit @@ -1,2 +1,3 @@ #!/bin/sh -npm run node-sync \ No newline at end of file +npm run node-sync +npx prettier . --write \ No newline at end of file diff --git a/src/assets/i18n/translations.en.ts b/src/assets/i18n/translations.en.ts index d254801f..eb664c75 100644 --- a/src/assets/i18n/translations.en.ts +++ b/src/assets/i18n/translations.en.ts @@ -1,370 +1,370 @@ export default { - app: { - title: 'GCcollab', - }, - routes: { - home: 'home', - login: 'login', - register: 'register', - terms: 'terms', - splash: 'splash', - about: 'about', - privacy: 'privacy', - stats: 'stats', - help: 'help', - blog: 'blog', - bookmarks: 'bookmarks', - dashboards: 'dashboards', - events: 'events', - friends: 'friends', - groups: 'groups', - invite: 'invite', - members: 'members', - messages: 'messages', - missions: 'missions', - newsfeed: 'newsfeed', - profile: 'profile', - search: 'search', - settings: 'settings', - thewire: 'thewire', - unauthorized: 'unauthorized', - forbidden: 'forbidden', - }, - titles: { - home: 'Home', - login: 'Login', - register: 'Register', - terms: 'Terms', - splash: 'Splash', - about: 'About', - privacy: 'Privacy', - stats: 'Stats', - help: 'Help', - blog: 'Blog', - blogs: 'Blogs', - bookmarks: 'Bookmarks', - dashboards: 'Dashboards', - events: 'Events', - event: 'Event', - friends: 'Friends', - groups: 'Groups', - group: 'Group', - invite: 'Invite', - members: 'Members', - messages: 'Messages', - missions: 'Careers', - newsfeed: 'Newsfeed', - poll: 'Poll', - post: 'Post', - profile: 'Profile', - search: 'Search', - settings: 'Settings', - thewire: 'The Wire', - unauthorized: 'Unauthorized', - upcoming_events: 'Up Coming Events', - previous_events: 'Previous Events', - forbidden: 'Forbidden', - communities: 'Communities', - notfound: 'Not Found', - }, - languages: { - label: 'Language', - english: 'English', - french: 'French', - tooltip: 'Select your language', - aria: 'Click to select your language preference', - }, - features: { - home: { - moreEvents: 'More events', - moreConnections: 'More connections', - moreGroups: 'More groups', - }, - more: 'See more', - }, - header: { - home: { - title: 'Home', - aria: 'Click to go to the home page.', - }, - network: { - title: 'Network', - aria: 'Click to go to your network.', - }, - groups: { - title: 'Groups', - aria: 'Click to go to the groups page.', - }, - jobs: { - title: 'Jobs', - aria: 'Click to go to the jobs page.', - }, - support: { - title: 'Support', - aria: 'Click to go to the support page.', - }, - search: { - title: 'Search GCCollab', - aria: 'Start typing to search GCCollab', - button: { - tooltip_on: 'Search', - tooltip_off: 'Close search', - aria_on: 'Click to start searching GCCollab', - aria_off: 'Click to close the search bar', - }, - }, - messages: { - tooltip: 'Messages', - aria: 'Click to view your messages', - }, - notifications: { - tooltip: 'Notifications', - aria: 'Click to view your notifications', - }, - profile: { - tooltip: 'Profile', - aria: 'Click to view your profile', - }, - }, - footer: { - title: { - about: 'About', - privacy: 'Privacy', - connect: 'Support', - }, - item: { - about: 'About GCCollab', - privacypolicy: 'Privacy Policy', - terms: 'Terms and Conditions of Use', - stats: 'Statistics', - faq: 'FAQs', - help: 'Help / Contact Us', - twitter: 'Twitter', - github: 'GitHub', - gctools: 'GCtools', - }, - }, - editor: { - placeholder: 'Type here...', - bold: 'Bold', - italic: 'Italic', - code: 'Code', - underline: 'Underline', - strike: 'Strike', - blockquote: 'Block Quote', - bulletlist: 'Bullet List', - orderedlist: 'Ordered List', - heading: 'Heading', - h1: 'Header 1', - h2: 'Header 2', - h3: 'Header 3', - h4: 'Header 4', - h5: 'Header 5', - h6: 'Header 6', - alignleft: 'Align Left', - aligncenter: 'Center Align', - alignright: 'Align Right', - alignjustify: 'Align Justify', - textcolor: 'Text Colour', - bgcolor: 'Background Colour', - linkinsert: 'Insert Link', - linkremove: 'Remove Link', - imginsert: 'Insert Image', - url: 'URL', - text: 'Text', - opennewtab: 'Open in New Tab', - insert: 'Insert', - alt: 'Alt Text', - title: 'Title', - remove: 'Remove', - horizontalrule: 'Horizontal Rule', - formatclear: 'Clear Formatting', - enabled: ' enabled', - }, - input: { - hint: { - show: { - text: 'Show hint', - aria: 'Click to show the hint', - }, - hide: { - text: 'Hide hint', - aria: 'Click to hide the hint', - }, - }, - password: { - show: { - text: 'Show password', - aria: 'Click to show your password', - }, - hide: { - text: 'Hide password', - aria: 'Click to hide your password', - }, - }, - error: { - required: 'is required.', - email: 'Please enter a valid email.', - minLength: 'Minimum character length is ', - maxLength: 'Maximum character length is ', - }, - }, - banner: { - welcome: 'WELCOME', - gccollab: 'TO GCCollab', - event: 'Events', - }, - newsCard: { - like: { - tooltip: 'Like', - aria_on: 'Click to like this.', - aria_off: 'Click to un-like this.', - }, - comment: { - tooltip: 'Comment', - aria: 'Click to add a comment.', - }, - share: { - tooltip: 'Share', - aria: 'Click to share this.', - }, - bookmark: { - tooltip: 'Bookmark', - aria_on: 'Click to bookmark this.', - aria_off: 'Click to un-bookmark this.', - }, - }, - eventCard: { - calendar: { - tooltip: 'View in calendar', - aria: 'Click to view this event in the calendar', - }, - confirm: { - tooltip_on: 'Confirm event', - aria_on: 'Click to add this event to your calendar', - tooltip_off: 'Remove confirmation', - aria_off: 'Click to remove this event from your calendar', - }, - decline: { - tooltip_on: 'Decline event', - aria_on: 'Click to decline this event', - tooltip_off: 'Rescind declination', - aria_off: 'Click to rescind your declination of the event', - }, - alt: 'Event image', - canceled: 'Canceled', - organizer: 'Organizer', - location: 'Location', - }, - profileCard: { - confirm: { - tooltip_on: 'Add connection', - aria_on: 'Click to add this person to your connections', - tooltip_off: 'Remove connection', - aria_off: 'Click to remove this person from your connections', - }, - decline: { - tooltip_on: 'Decline connection', - aria_on: 'Click to decline this connection', - tooltip_off: 'Rescind declination', - aria_off: 'Click to rescind your declination of this connection', - }, - }, - profile_pic: { - alt: 'A profile picture', - }, - event: { - search: { - title: 'Search events', - }, - date_time: 'Date & Time:', - location: 'Location:', - host: 'Host:', - event_description: 'Event Description', - event_registration: 'Event Registration', - form: { - full_name: 'Full Name', - full_name_error: 'Your full name is required.', - email: 'Email Address', - email_error: 'Your email address is required.', - email_confirm: 'Confirm Email Address', - email_confirm_error: 'Your email must match.', - occupation: 'Occupation', - occupation_error: 'Your occupation is required.', - occupation_hint: 'This would be your current job title.', - add_calendar: 'Add to my calendar', - agree_with: 'I agree with the ', - terms_conditions: 'terms and conditions', - register: 'REGISTER', - placeholder: 'Type here', - }, - share: { - tooltip: 'Share', - aria: 'Click to share this event.', - }, - bookmark: { - tooltip_on: 'Bookmark', - tooltip_off: 'Bookmarked', - aria_on: 'Click to bookmark this event.', - aria_off: 'Click to remove this event from your bookmarks.', - }, - }, - forms: { - placeholder: 'Type here', - save: 'Save', - saved_image: 'Saved Image', - create: 'Create', - search: 'Search events', - post: { - post: 'Post', - }, - blog: { - name_of_blog: 'Name of Blog', - name_of_publisher: 'Name of publisher', - upload_cover_photo: 'Upload a cover photo', - cover_photo_alt: 'Cover photo alt text', - body: 'Body', - }, - event: { - type_of_event: 'Type of event', - type_of_event_aria: 'Select an event type', - in_person: 'In-person', - hybrid: 'Hybrid', - online: 'Online', - name_of_organizer: 'Name of organizer', - name_of_event: 'Name of event', - event_language: 'Language of event', - event_language_aria: 'Select a language for your event', - english: 'English', - french: 'French', - bilingual: 'Bilingual', - body: 'Body', - body_hint: 'Start writing.', - location: 'Location', - platform: 'Online streaming platform', - duration: 'Event duration', - duration_aria: 'Select a duration for your event', - single_day: 'One day event', - multi_day: 'Multi-day event', - start_date: 'Start date', - end_date: 'End date', - search: ' ', - }, - poll: { - description: 'Poll description / question', - option: 'Option', - option_add: 'Add an option', - option_remove: 'Remove option', - }, - }, - file_select: { - error: { - size: 'File is too large. Maximum size allowed is ', - extension: "The file selected doesn't have an accepted extension.", - characters: 'Files have a maximum character count of ', - img_small: 'Images must be at minimum ', - img_large: 'Images have a maximum of ', - read: 'Error reading the file.', - }, - }, -}; + "app": { + "title": "GCcollab" + }, + "routes": { + "home": "home", + "login": "login", + "register": "register", + "terms": "terms", + "splash": "splash", + "about": "about", + "privacy": "privacy", + "stats": "stats", + "help": "help", + "blog": "blog", + "bookmarks": "bookmarks", + "dashboards": "dashboards", + "events": "events", + "friends": "friends", + "groups": "groups", + "invite": "invite", + "members": "members", + "messages": "messages", + "missions": "missions", + "newsfeed": "newsfeed", + "profile": "profile", + "search": "search", + "settings": "settings", + "thewire": "thewire", + "unauthorized": "unauthorized", + "forbidden": "forbidden" + }, + "titles": { + "home": "Home", + "login": "Login", + "register": "Register", + "terms": "Terms", + "splash": "Splash", + "about": "About", + "privacy": "Privacy", + "stats": "Stats", + "help": "Help", + "blog": "Blog", + "blogs": "Blogs", + "bookmarks": "Bookmarks", + "dashboards": "Dashboards", + "events": "Events", + "event": "Event", + "friends": "Friends", + "groups": "Groups", + "group": "Group", + "invite": "Invite", + "members": "Members", + "messages": "Messages", + "missions": "Careers", + "newsfeed": "Newsfeed", + "poll": "Poll", + "post": "Post", + "profile": "Profile", + "search": "Search", + "settings": "Settings", + "thewire": "The Wire", + "unauthorized": "Unauthorized", + "upcoming_events": "Up Coming Events", + "previous_events": "Previous Events", + "forbidden": "Forbidden", + "communities": "Communities", + "notfound": "Not Found" + }, + "languages": { + "label": "Language", + "english": "English", + "french": "French", + "tooltip": "Select your language", + "aria": "Click to select your language preference" + }, + "features": { + "home": { + "moreEvents": "More events", + "moreConnections": "More connections", + "moreGroups": "More groups" + }, + "more": "See more" + }, + "header": { + "home": { + "title": "Home", + "aria": "Click to go to the home page." + }, + "network": { + "title": "Network", + "aria": "Click to go to your network." + }, + "groups": { + "title": "Groups", + "aria": "Click to go to the groups page." + }, + "jobs": { + "title": "Jobs", + "aria": "Click to go to the jobs page." + }, + "support": { + "title": "Support", + "aria": "Click to go to the support page." + }, + "search": { + "title": "Search GCCollab", + "aria": "Start typing to search GCCollab", + "button": { + "tooltip_on": "Search", + "tooltip_off": "Close search", + "aria_on": "Click to start searching GCCollab", + "aria_off": "Click to close the search bar" + } + }, + "messages" : { + "tooltip": "Messages", + "aria": "Click to view your messages" + }, + "notifications": { + "tooltip": "Notifications", + "aria": "Click to view your notifications" + }, + "profile": { + "tooltip": "Profile", + "aria": "Click to view your profile" + } + }, + "footer": { + "title": { + "about": "About", + "privacy": "Privacy", + "connect": "Support" + }, + "item": { + "about": "About GCCollab", + "privacypolicy": "Privacy Policy", + "terms": "Terms and Conditions of Use", + "stats": "Statistics", + "faq": "FAQs", + "help": "Help / Contact Us", + "twitter": "Twitter", + "github": "GitHub", + "gctools": "GCtools" + } + }, + "editor": { + "placeholder": "Type here...", + "bold": "Bold", + "italic": "Italic", + "code": "Code", + "underline": "Underline", + "strike": "Strike", + "blockquote": "Block Quote", + "bulletlist": "Bullet List", + "orderedlist": "Ordered List", + "heading": "Heading", + "h1": "Header 1", + "h2": "Header 2", + "h3": "Header 3", + "h4": "Header 4", + "h5": "Header 5", + "h6": "Header 6", + "alignleft": "Align Left", + "aligncenter": "Center Align", + "alignright": "Align Right", + "alignjustify": "Align Justify", + "textcolor": "Text Colour", + "bgcolor": "Background Colour", + "linkinsert": "Insert Link", + "linkremove": "Remove Link", + "imginsert": "Insert Image", + "url": "URL", + "text": "Text", + "opennewtab": "Open in New Tab", + "insert": "Insert", + "alt": "Alt Text", + "title": "Title", + "remove": "Remove", + "horizontalrule": "Horizontal Rule", + "formatclear": "Clear Formatting", + "enabled": " enabled" + }, + "input": { + "hint": { + "show": { + "text": "Show hint", + "aria": "Click to show the hint" + }, + "hide": { + "text": "Hide hint", + "aria": "Click to hide the hint" + } + }, + "password": { + "show": { + "text": "Show password", + "aria": "Click to show your password" + }, + "hide": { + "text": "Hide password", + "aria": "Click to hide your password" + } + }, + "error": { + "required": "is required.", + "email": "Please enter a valid email.", + "minLength": "Minimum character length is ", + "maxLength": "Maximum character length is " + } + }, + "banner": { + "welcome": "WELCOME", + "gccollab": "TO GCCollab", + "event": "Events" + }, + "newsCard": { + "like": { + "tooltip": "Like", + "aria_on": "Click to like this.", + "aria_off": "Click to un-like this." + }, + "comment": { + "tooltip": "Comment", + "aria": "Click to add a comment." + }, + "share": { + "tooltip": "Share", + "aria": "Click to share this." + }, + "bookmark": { + "tooltip": "Bookmark", + "aria_on": "Click to bookmark this.", + "aria_off": "Click to un-bookmark this." + } + }, + "eventCard": { + "calendar": { + "tooltip": "View in calendar", + "aria": "Click to view this event in the calendar" + }, + "confirm": { + "tooltip_on": "Confirm event", + "aria_on": "Click to add this event to your calendar", + "tooltip_off": "Remove confirmation", + "aria_off": "Click to remove this event from your calendar" + }, + "decline": { + "tooltip_on": "Decline event", + "aria_on": "Click to decline this event", + "tooltip_off": "Rescind declination", + "aria_off": "Click to rescind your declination of the event" + }, + "alt": "Event image", + "canceled": "Canceled", + "organizer": "Organizer", + "location": "Location" + }, + "profileCard": { + "confirm": { + "tooltip_on": "Add connection", + "aria_on": "Click to add this person to your connections", + "tooltip_off": "Remove connection", + "aria_off": "Click to remove this person from your connections" + }, + "decline": { + "tooltip_on": "Decline connection", + "aria_on": "Click to decline this connection", + "tooltip_off": "Rescind declination", + "aria_off": "Click to rescind your declination of this connection" + } + }, + "profile_pic": { + "alt": "A profile picture" + }, + "event": { + "search": { + "title": "Search events" + }, + "date_time": "Date & Time:", + "location": "Location:", + "host": "Host:", + "event_description": "Event Description", + "event_registration": "Event Registration", + "form": { + "full_name": "Full Name", + "full_name_error": "Your full name is required.", + "email": "Email Address", + "email_error": "Your email address is required.", + "email_confirm": "Confirm Email Address", + "email_confirm_error": "Your email must match.", + "occupation": "Occupation", + "occupation_error": "Your occupation is required.", + "occupation_hint": "This would be your current job title.", + "add_calendar": "Add to my calendar", + "agree_with": "I agree with the ", + "terms_conditions": "terms and conditions", + "register": "REGISTER", + "placeholder": "Type here" + }, + "share": { + "tooltip": "Share", + "aria": "Click to share this event." + }, + "bookmark": { + "tooltip_on": "Bookmark", + "tooltip_off": "Bookmarked", + "aria_on": "Click to bookmark this event.", + "aria_off": "Click to remove this event from your bookmarks." + } + }, + "forms": { + "placeholder": "Type here", + "save": "Save", + "saved_image": "Saved Image", + "create": "Create", + "search": "Search events", + "post": { + "post": "Post" + }, + "blog": { + "name_of_blog": "Name of Blog", + "name_of_publisher": "Name of publisher", + "upload_cover_photo": "Upload a cover photo", + "cover_photo_alt": "Cover photo alt text", + "body": "Body" + }, + "event": { + "type_of_event": "Type of event", + "type_of_event_aria" : "Select an event type", + "in_person": "In-person", + "hybrid": "Hybrid", + "online": "Online", + "name_of_organizer": "Name of organizer", + "name_of_event": "Name of event", + "event_language": "Language of event", + "event_language_aria": "Select a language for your event", + "english": "English", + "french": "French", + "bilingual": "Bilingual", + "body": "Body", + "body_hint": "Start writing.", + "location": "Location", + "platform": "Online streaming platform", + "duration": "Event duration", + "duration_aria": "Select a duration for your event", + "single_day": "One day event", + "multi_day": "Multi-day event", + "start_date": "Start date", + "end_date": "End date", + "search": " " + }, + "poll": { + "description": "Poll description / question", + "option": "Option", + "option_add": "Add an option", + "option_remove": "Remove option" + } + }, + "file_select": { + "error": { + "size": "File is too large. Maximum size allowed is ", + "extension": "The file selected doesn't have an accepted extension.", + "characters": "Files have a maximum character count of ", + "img_small": "Images must be at minimum ", + "img_large": "Images have a maximum of ", + "read": "Error reading the file." + } + } +}; \ No newline at end of file diff --git a/src/assets/i18n/translations.fr.ts b/src/assets/i18n/translations.fr.ts index 45945e8f..da8de6f4 100644 --- a/src/assets/i18n/translations.fr.ts +++ b/src/assets/i18n/translations.fr.ts @@ -1,371 +1,372 @@ const fr: typeof import('./translations.en').default = { - app: { - title: 'GCcollab', - }, - routes: { - home: 'accueil', - login: 'connexion', - register: "s'inscrire", - terms: 'conditions', - splash: 'éclaboussure', - about: 'à_propos_de', - privacy: 'intimité', - stats: 'statistiques', - help: 'aider', - blog: 'blog', - bookmarks: 'signets', - dashboards: 'tableaux_de_bord', - events: 'événements', - friends: 'amis', - groups: 'groupes', - invite: 'inviter', - members: 'membres', - messages: 'messages', - missions: 'missions', - newsfeed: "fil_d'actualité", - profile: 'profil', - search: 'chercher', - settings: 'réglages', - thewire: 'le_fil', - unauthorized: 'non_autorisé', - forbidden: 'interdit', - }, - titles: { - home: 'Accueil', - login: 'Connexion', - register: "S'inscrire", - terms: 'Conditions', - splash: 'Éclaboussure', - about: 'À propos de', - privacy: 'Intimité', - stats: 'Statistiques', - help: 'Aider', - blog: 'Blog', - blogs: 'Blogues', - bookmarks: 'Signets', - dashboards: 'Tableaux de bord', - events: 'Événements', - event: 'Événement', - friends: 'Amis', - groups: 'Groupes', - group: 'Groupe', - invite: 'Inviter', - members: 'Membres', - messages: 'Messages', - missions: 'Carrières', - newsfeed: "Fil d'actualité", - poll: 'Sondage', - post: 'Poste', - profile: 'Profil', - search: 'Chercher', - settings: 'Réglages', - thewire: 'Le fil', - unauthorized: 'Non autorisé', - upcoming_events: 'Événements à venir', - previous_events: 'Événements précédents', - forbidden: 'Interdit', - communities: 'Communautés', - notfound: 'Pas trouvé', - }, - languages: { - label: 'Langue', - english: 'Anglais', - french: 'Français', - tooltip: 'Choisissez votre langue', - aria: 'Cliquez pour sélectionner votre préférence de langue', - }, - features: { - home: { - moreEvents: "Plus d'événements", - moreConnections: 'Plus de connexions', - moreGroups: 'Plus des groupes', - }, - more: 'Voir Plus', - }, - header: { - home: { - title: 'Accueil', - aria: "Cliquez pour aller à la page d'accueil.", - }, - network: { - title: 'Réseau', - aria: 'Cliquez pour accéder à votre réseau.', - }, - groups: { - title: 'Groupes', - aria: 'Cliquez pour accéder à la page des groupes.', - }, - jobs: { - title: 'Emplois', - aria: 'Cliquez pour accéder à la page des emplois.', - }, - support: { - title: 'Soutien', - aria: "Cliquez pour accéder à la page d'assistance.", - }, - search: { - title: 'Rechercher GCCollab', - aria: 'Commencez à taper pour rechercher GCCollab.', - button: { - tooltip_on: 'Rechercher', - tooltip_off: 'Fermer la recherche', - aria_on: 'Cliquez pour lancer la recherche GCCollab.', - aria_off: 'Cliquez pour fermer la barre de recherche.', - }, - }, - messages: { - tooltip: 'Messages', - aria: 'Cliquez pour voir vos messages', - }, - notifications: { - tooltip: 'Avis', - aria: 'Cliquez pour afficher vos notifications.', - }, - profile: { - tooltip: 'Profil', - aria: 'Cliquez pour voir votre profil.', - }, - }, - footer: { - title: { - about: 'Infos', - privacy: 'Confidentialité', - connect: 'Restez branchés', - }, - item: { - about: 'Au sujet de GCcollab', - privacypolicy: 'Politique de confidentialité', - terms: "Conditions d'utilisation", - stats: 'Statistiques', - faq: 'FAQs', - help: 'Aide / Contactez-nous', - twitter: 'Twitter', - github: 'GitHub', - gctools: 'GCtools', - }, - }, - editor: { - placeholder: 'Écrivez ici...', - bold: 'Gras', - italic: 'Italique', - code: 'Code', - underline: 'Souligner', - strike: 'Grève', - blockquote: 'Citation en bloc', - bulletlist: 'Liste à puces', - orderedlist: 'Liste ordonnée', - heading: 'Titre', - h1: 'En-tête 1', - h2: 'En-tête 2', - h3: 'En-tête 3', - h4: 'En-tête 4', - h5: 'En-tête 5', - h6: 'En-tête 6', - alignleft: 'Alignez à gauche', - aligncenter: 'Aligner au centre', - alignright: 'Aligner à droite', - alignjustify: 'Aligner Justifier', - textcolor: 'Couleur du texte', - bgcolor: "La couleur d'arrière-plan", - linkinsert: 'Insérer un lien', - linkremove: 'Supprimer le lien', - imginsert: 'Insérer une image', - url: 'URL', - text: 'Texte', - opennewtab: 'Ouvrir dans un nouvel onglet', - insert: 'Insérer', - alt: 'Texte alternatif', - title: 'Titre', - remove: 'Retirer', - horizontalrule: 'La règle horizontale', - formatclear: 'Supprimer le formattage', - enabled: ' activé', - }, - input: { - hint: { - show: { - text: 'Dévoiler un indice', - aria: "Cliquez pour afficher l'indice", - }, - hide: { - text: "Masquer l'indice", - aria: "Cliquez pour masquer l'indice", - }, - }, - password: { - show: { - text: 'Montrer le mot de passe', - aria: 'Cliquez pour afficher votre mot de passe', - }, - hide: { - text: 'Masquer le mot de passe', - aria: 'Cliquez pour masquer votre mot de passe', - }, - }, - error: { - required: 'est requis.', - email: 'Veuillez saisir une adresse e-mail valide.', - minLength: 'La longueur minimale des caractères est ', - maxLength: 'La longueur maximale des caractères est ', - }, - }, - banner: { - welcome: 'BIENVENUE', - gccollab: 'À GCCollab', - event: 'Événements', - }, - newsCard: { - like: { - tooltip: 'Aimer', - aria_on: 'Cliquez pour aimer.', - aria_off: 'Cliquez pour ne plus aimer.', - }, - comment: { - tooltip: 'Commentaire', - aria: 'Cliquez pour ajouter un commentaire.', - }, - share: { - tooltip: 'Partager', - aria: 'Cliquez pour partager ceci.', - }, - bookmark: { - tooltip: 'Signet', - aria_on: 'Cliquez pour marquer ceci.', - aria_off: 'Cliquez pour dé-marquer ceci.', - }, - }, - eventCard: { - calendar: { - tooltip: 'Afficher dans le calendrier', - aria: 'Cliquez pour voir cet événement dans le calendrier', - }, - confirm: { - tooltip_on: "Confirmer l'événement", - aria_on: 'Cliquez pour ajouter cet événement à votre calendrier', - tooltip_off: 'Supprimer la confirmation', - aria_off: 'Cliquez pour supprimer cet événement de votre calendrier', - }, - decline: { - tooltip_on: "Refuser l'événement", - aria_on: 'Cliquez pour refuser cet événement', - tooltip_off: 'Annuler la déclinaison', - aria_off: "Cliquez pour annuler votre déclinaison de l'événement", - }, - alt: "Image de l'événement", - canceled: 'Annulé', - organizer: 'Organisateur', - location: 'Emplacement', - }, - profileCard: { - confirm: { - tooltip_on: 'Ajouter une connexion', - aria_on: 'Cliquez pour ajouter cette personne à vos relations', - tooltip_off: 'Supprimer la connexion', - aria_off: 'Cliquez pour supprimer cette personne de vos relations', - }, - decline: { - tooltip_on: 'Refuser la connexion', - aria_on: 'Cliquez pour refuser cette connexion', - tooltip_off: 'Annuler la déclinaison', - aria_off: 'Cliquez pour annuler votre refus de cette connexion', - }, - }, - profile_pic: { - alt: 'Une photo de profil', - }, - event: { - search: { - title: 'Search events', - }, - date_time: 'Date & Heure:', - location: 'Emplacement:', - host: 'Hôte:', - event_description: "Description de L'évenement", - event_registration: "Inscription à L'événement", - form: { - full_name: 'Nom et Prénom', - full_name_error: 'Votre nom complet est requis.', - email: 'Adresse Email', - email_error: 'Votre adresse e-mail est nécessaire.', - email_confirm: 'Confirmez votre Adresse Email', - email_confirm_error: 'Votre email doit correspondre.', - occupation: 'Profession', - occupation_error: 'Votre profession est requise.', - occupation_hint: 'Ce serait votre titre de poste actuel.', - add_calendar: 'Ajouter à mon calendrier', - agree_with: "Je suis d'accord avec les ", - terms_conditions: 'termes et conditions', - register: 'REGISTRE', - placeholder: 'Écrivez ici', - }, - share: { - tooltip: 'Partager', - aria: 'Cliquez pour partager cet événement.', - }, - bookmark: { - tooltip_on: 'Signet', - tooltip_off: 'Favoris', - aria_on: 'Cliquez pour ajouter cet événement à vos favoris.', - aria_off: 'Cliquez pour supprimer cet événement de vos favoris.', - }, - }, - forms: { - placeholder: 'Écrivez ici', - save: 'Sauvegarder', - saved_image: 'Image enregistrée', - create: 'Créer', - search: 'Rechercher des événements', - post: { - post: 'Poste', - }, - blog: { - name_of_blog: 'Nom du blog', - name_of_publisher: "Nom de l'éditeur", - upload_cover_photo: 'Téléchargez une photo de couverture', - cover_photo_alt: 'Texte alternatif de la photo de couverture', - body: 'Corps', - }, - event: { - type_of_event: "Type d'événement", - type_of_event_aria: "Sélectionnez un type d'événement", - in_person: 'En personne', - hybrid: 'Hybride', - online: 'En ligne', - name_of_organizer: "Nom de l'organisateur", - name_of_event: "Nom de l'événement", - event_language: "Langue de l'événement", - event_language_aria: 'Sélectionnez une langue pour votre événement', - english: 'Anglaise', - french: 'Français', - bilingual: 'Bilingue', - body: 'Corps', - body_hint: 'Commencez à écrire.', - location: 'Emplacement', - platform: 'Plateforme de streaming en ligne', - duration: "Durée de l'événement", - duration_aria: 'Sélectionnez une durée pour votre événement', - single_day: "Événement d'une journée", - multi_day: 'Événement sur plusieurs jours', - start_date: 'Date de début', - end_date: 'Date de fin', - search: ' ', - }, - poll: { - description: 'Description/question du sondage', - option: 'Option', - option_add: 'Ajouter une option', - option_remove: "Supprimer l'option", - }, - }, - file_select: { - error: { - size: 'Le fichier est trop grand. La taille maximale autorisée est ', - extension: "Le fichier sélectionné n'a pas d'extension acceptée.", - characters: 'Les fichiers ont un nombre maximum de caractères de ', - img_small: 'Les images doivent être au minimum ', - img_large: 'Les images ont un maximum de ', - read: 'Erreur de lecture du fichier.', - }, - }, + "app": { + "title": "GCcollab" + }, + "routes": { + "home": "accueil", + "login": "connexion", + "register": "s'inscrire", + "terms": "conditions", + "splash": "éclaboussure", + "about": "à_propos_de", + "privacy": "intimité", + "stats": "statistiques", + "help": "aider", + "blog": "blog", + "bookmarks": "signets", + "dashboards": "tableaux_de_bord", + "events": "événements", + "friends": "amis", + "groups": "groupes", + "invite": "inviter", + "members": "membres", + "messages": "messages", + "missions": "missions", + "newsfeed": "fil_d'actualité", + "profile": "profil", + "search": "chercher", + "settings": "réglages", + "thewire": "le_fil", + "unauthorized": "non_autorisé", + "forbidden": "interdit" + }, + "titles": { + "home": "Accueil", + "login": "Connexion", + "register": "S'inscrire", + "terms": "Conditions", + "splash": "Éclaboussure", + "about": "À propos de", + "privacy": "Intimité", + "stats": "Statistiques", + "help": "Aider", + "blog": "Blog", + "blogs": "Blogues", + "bookmarks": "Signets", + "dashboards": "Tableaux de bord", + "events": "Événements", + "event": "Événement", + "friends": "Amis", + "groups": "Groupes", + "group": "Groupe", + "invite": "Inviter", + "members": "Membres", + "messages": "Messages", + "missions": "Carrières", + "newsfeed": "Fil d'actualité", + "poll": "Sondage", + "post": "Poste", + "profile": "Profil", + "search": "Chercher", + "settings": "Réglages", + "thewire": "Le fil", + "unauthorized": "Non autorisé", + "upcoming_events": "Événements à venir", + "previous_events": "Événements précédents", + "forbidden": "Interdit", + "communities": "Communautés", + "notfound": "Pas trouvé" + }, + "languages": { + "label": "Langue", + "english": "Anglais", + "french": "Français", + "tooltip": "Choisissez votre langue", + "aria": "Cliquez pour sélectionner votre préférence de langue" + }, + "features": { + "home": { + "moreEvents": "Plus d'événements", + "moreConnections": "Plus de connexions", + "moreGroups": "Plus des groupes" + }, + "more": "Voir Plus" + + }, + "header": { + "home": { + "title": "Accueil", + "aria": "Cliquez pour aller à la page d'accueil." + }, + "network": { + "title": "Réseau", + "aria": "Cliquez pour accéder à votre réseau." + }, + "groups": { + "title": "Groupes", + "aria": "Cliquez pour accéder à la page des groupes." + }, + "jobs": { + "title": "Emplois", + "aria": "Cliquez pour accéder à la page des emplois." + }, + "support": { + "title": "Soutien", + "aria": "Cliquez pour accéder à la page d'assistance." + }, + "search": { + "title": "Rechercher GCCollab", + "aria": "Commencez à taper pour rechercher GCCollab.", + "button": { + "tooltip_on": "Rechercher", + "tooltip_off": "Fermer la recherche", + "aria_on": "Cliquez pour lancer la recherche GCCollab.", + "aria_off": "Cliquez pour fermer la barre de recherche." + } + }, + "messages" : { + "tooltip": "Messages", + "aria": "Cliquez pour voir vos messages" + }, + "notifications": { + "tooltip": "Avis", + "aria": "Cliquez pour afficher vos notifications." + }, + "profile": { + "tooltip": "Profil", + "aria": "Cliquez pour voir votre profil." + } + }, + "footer": { + "title": { + "about": "Infos", + "privacy": "Confidentialité", + "connect": "Restez branchés" + }, + "item": { + "about": "Au sujet de GCcollab", + "privacypolicy": "Politique de confidentialité", + "terms": "Conditions d'utilisation", + "stats": "Statistiques", + "faq": "FAQs", + "help": "Aide / Contactez-nous", + "twitter": "Twitter", + "github": "GitHub", + "gctools": "GCtools" + } + }, + "editor": { + "placeholder": "Écrivez ici...", + "bold": "Gras", + "italic": "Italique", + "code": "Code", + "underline": "Souligner", + "strike": "Grève", + "blockquote": "Citation en bloc", + "bulletlist": "Liste à puces", + "orderedlist": "Liste ordonnée", + "heading": "Titre", + "h1": "En-tête 1", + "h2": "En-tête 2", + "h3": "En-tête 3", + "h4": "En-tête 4", + "h5": "En-tête 5", + "h6": "En-tête 6", + "alignleft": "Alignez à gauche", + "aligncenter": "Aligner au centre", + "alignright": "Aligner à droite", + "alignjustify": "Aligner Justifier", + "textcolor": "Couleur du texte", + "bgcolor": "La couleur d'arrière-plan", + "linkinsert": "Insérer un lien", + "linkremove": "Supprimer le lien", + "imginsert": "Insérer une image", + "url": "URL", + "text": "Texte", + "opennewtab": "Ouvrir dans un nouvel onglet", + "insert": "Insérer", + "alt": "Texte alternatif", + "title": "Titre", + "remove": "Retirer", + "horizontalrule": "La règle horizontale", + "formatclear": "Supprimer le formattage", + "enabled": " activé" + }, + "input": { + "hint": { + "show": { + "text": "Dévoiler un indice", + "aria": "Cliquez pour afficher l'indice" + }, + "hide": { + "text": "Masquer l'indice", + "aria": "Cliquez pour masquer l'indice" + } + }, + "password": { + "show": { + "text": "Montrer le mot de passe", + "aria": "Cliquez pour afficher votre mot de passe" + }, + "hide": { + "text": "Masquer le mot de passe", + "aria": "Cliquez pour masquer votre mot de passe" + } + }, + "error": { + "required": "est requis.", + "email": "Veuillez saisir une adresse e-mail valide.", + "minLength": "La longueur minimale des caractères est ", + "maxLength": "La longueur maximale des caractères est " + } + }, + "banner": { + "welcome": "BIENVENUE", + "gccollab": "À GCCollab", + "event": "Événements" + }, + "newsCard": { + "like": { + "tooltip": "Aimer", + "aria_on": "Cliquez pour aimer.", + "aria_off": "Cliquez pour ne plus aimer." + }, + "comment": { + "tooltip": "Commentaire", + "aria": "Cliquez pour ajouter un commentaire." + }, + "share": { + "tooltip": "Partager", + "aria": "Cliquez pour partager ceci." + }, + "bookmark": { + "tooltip": "Signet", + "aria_on": "Cliquez pour marquer ceci.", + "aria_off": "Cliquez pour dé-marquer ceci." + } + }, + "eventCard": { + "calendar": { + "tooltip": "Afficher dans le calendrier", + "aria": "Cliquez pour voir cet événement dans le calendrier" + }, + "confirm": { + "tooltip_on": "Confirmer l'événement", + "aria_on": "Cliquez pour ajouter cet événement à votre calendrier", + "tooltip_off": "Supprimer la confirmation", + "aria_off": "Cliquez pour supprimer cet événement de votre calendrier" + }, + "decline": { + "tooltip_on": "Refuser l'événement", + "aria_on": "Cliquez pour refuser cet événement", + "tooltip_off": "Annuler la déclinaison", + "aria_off": "Cliquez pour annuler votre déclinaison de l'événement" + }, + "alt": "Image de l'événement", + "canceled": "Annulé", + "organizer": "Organisateur", + "location": "Emplacement" + }, + "profileCard": { + "confirm": { + "tooltip_on": "Ajouter une connexion", + "aria_on": "Cliquez pour ajouter cette personne à vos relations", + "tooltip_off": "Supprimer la connexion", + "aria_off": "Cliquez pour supprimer cette personne de vos relations" + }, + "decline": { + "tooltip_on": "Refuser la connexion", + "aria_on": "Cliquez pour refuser cette connexion", + "tooltip_off": "Annuler la déclinaison", + "aria_off": "Cliquez pour annuler votre refus de cette connexion" + } + }, + "profile_pic": { + "alt": "Une photo de profil" + }, + "event": { + "search": { + "title": "Search events" + }, + "date_time": "Date & Heure:", + "location": "Emplacement:", + "host": "Hôte:", + "event_description": "Description de L'évenement", + "event_registration": "Inscription à L'événement", + "form": { + "full_name": "Nom et Prénom", + "full_name_error": "Votre nom complet est requis.", + "email": "Adresse Email", + "email_error": "Votre adresse e-mail est nécessaire.", + "email_confirm": "Confirmez votre Adresse Email", + "email_confirm_error": "Votre email doit correspondre.", + "occupation": "Profession", + "occupation_error": "Votre profession est requise.", + "occupation_hint": "Ce serait votre titre de poste actuel.", + "add_calendar": "Ajouter à mon calendrier", + "agree_with": "Je suis d'accord avec les ", + "terms_conditions": "termes et conditions", + "register": "REGISTRE", + "placeholder": "Écrivez ici" + }, + "share": { + "tooltip": "Partager", + "aria": "Cliquez pour partager cet événement." + }, + "bookmark": { + "tooltip_on": "Signet", + "tooltip_off": "Favoris", + "aria_on": "Cliquez pour ajouter cet événement à vos favoris.", + "aria_off": "Cliquez pour supprimer cet événement de vos favoris." + } + }, + "forms": { + "placeholder": "Écrivez ici", + "save": "Sauvegarder", + "saved_image": "Image enregistrée", + "create": "Créer", + "search": "Rechercher des événements", + "post": { + "post": "Poste" + }, + "blog": { + "name_of_blog": "Nom du blog", + "name_of_publisher": "Nom de l'éditeur", + "upload_cover_photo": "Téléchargez une photo de couverture", + "cover_photo_alt": "Texte alternatif de la photo de couverture", + "body": "Corps" + }, + "event": { + "type_of_event": "Type d'événement", + "type_of_event_aria" : "Sélectionnez un type d'événement", + "in_person": "En personne", + "hybrid": "Hybride", + "online": "En ligne", + "name_of_organizer": "Nom de l'organisateur", + "name_of_event": "Nom de l'événement", + "event_language": "Langue de l'événement", + "event_language_aria": "Sélectionnez une langue pour votre événement", + "english": "Anglaise", + "french": "Français", + "bilingual": "Bilingue", + "body": "Corps", + "body_hint": "Commencez à écrire.", + "location": "Emplacement", + "platform": "Plateforme de streaming en ligne", + "duration": "Durée de l'événement", + "duration_aria": "Sélectionnez une durée pour votre événement", + "single_day": "Événement d'une journée", + "multi_day": "Événement sur plusieurs jours", + "start_date": "Date de début", + "end_date": "Date de fin", + "search": " " + }, + "poll": { + "description": "Description/question du sondage", + "option": "Option", + "option_add": "Ajouter une option", + "option_remove": "Supprimer l'option" + } + }, + "file_select": { + "error": { + "size": "Le fichier est trop grand. La taille maximale autorisée est ", + "extension": "Le fichier sélectionné n'a pas d'extension acceptée.", + "characters": "Les fichiers ont un nombre maximum de caractères de ", + "img_small": "Les images doivent être au minimum ", + "img_large": "Les images ont un maximum de ", + "read": "Erreur de lecture du fichier." + } + } }; -export default fr; +export default fr; \ No newline at end of file From 98e5cc5689c97791ed640fb24174a11edce27fb6 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Fri, 26 Jan 2024 16:14:20 -0500 Subject: [PATCH 126/165] test hook --- src/app/shared/components/banner/banner.component.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/app/shared/components/banner/banner.component.ts b/src/app/shared/components/banner/banner.component.ts index 12ec2000..aa24ec4e 100644 --- a/src/app/shared/components/banner/banner.component.ts +++ b/src/app/shared/components/banner/banner.component.ts @@ -6,9 +6,7 @@ import { Component, Input } from '@angular/core'; styleUrls: ['./banner.component.scss'], }) export class BannerComponent { - @Input() model: Banner | null = null; - @Input() headerExpanded: boolean = false; - @Input() loading: boolean = false; + @Input() model: Banner | null = null;@Input() headerExpanded: boolean = false;@Input() loading: boolean = false; constructor() { if (!this.model) { From 2519494d3a93f0a47e05b2a0aa02446b643de213 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Fri, 26 Jan 2024 16:16:10 -0500 Subject: [PATCH 127/165] test again --- hooks/pre-commit | 2 +- package.json | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/hooks/pre-commit b/hooks/pre-commit index f6270488..923476c0 100644 --- a/hooks/pre-commit +++ b/hooks/pre-commit @@ -1,3 +1,3 @@ #!/bin/sh npm run node-sync -npx prettier . --write \ No newline at end of file +npm run pretty-code \ No newline at end of file diff --git a/package.json b/package.json index 3471d4a4..f9a26e5f 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "install-graphviz-win": "winget install -e --id Graphviz.Graphviz --accept-package-agreements --accept-source-agreements --disable-interactivity && set PATH=%PATH%;C:\\Program Files\\Graphviz\\bin;", "depcruise": "depcruise src --include-only \"^src\" --config --output-type dot | dot -T svg > dependency-graph.svg", "node-sync": "node ./src/scripts/nodeSyncWorkflows.js", + "pretty-code": "npx prettier . --write", "lint": "ng lint" }, "private": true, From 53ac2ab0acbed50409dd032e9bb1549039ec5b58 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Fri, 26 Jan 2024 16:21:26 -0500 Subject: [PATCH 128/165] test-again --- hooks/pre-commit | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/hooks/pre-commit b/hooks/pre-commit index 923476c0..afa2595d 100644 --- a/hooks/pre-commit +++ b/hooks/pre-commit @@ -1,3 +1,2 @@ #!/bin/sh -npm run node-sync -npm run pretty-code \ No newline at end of file +npm run node-sync && pretty-code \ No newline at end of file From de508d7b67fd3dde8414a313b9ad2e48442d1032 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Fri, 26 Jan 2024 16:25:59 -0500 Subject: [PATCH 129/165] added pretty formatting to workflow --- .github/workflows/{lint.yml => format-lint.yml} | 16 ++++++++++++++-- hooks/pre-commit | 2 +- package.json | 1 - 3 files changed, 15 insertions(+), 4 deletions(-) rename .github/workflows/{lint.yml => format-lint.yml} (50%) diff --git a/.github/workflows/lint.yml b/.github/workflows/format-lint.yml similarity index 50% rename from .github/workflows/lint.yml rename to .github/workflows/format-lint.yml index 10c4429e..8b441889 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/format-lint.yml @@ -1,4 +1,4 @@ -name: Lint +name: Prettier & Lint on: pull_request: @@ -10,10 +10,12 @@ env: jobs: lint: - name: Run code linter + name: Run code formatter & linter runs-on: windows-latest steps: - uses: actions/checkout@v3 + with: + token: ${{ secrets.ACCESS_TOKEN }} - name: Use Node.js ${{ env.NODE_VERSION }} uses: actions/setup-node@v1 with: @@ -22,5 +24,15 @@ jobs: - name: Install run: npm install + - name: Prettier + run: npx prettier . --write + + - name: Commit + run: | + git config --global user.email "shea.wow@hotmail.com" + git config --global user.name Shea Dougherty-Gill + git commit -a -m "Prettier formatting ${{ vars.IGNORE_DEPLOY }}" + git push + - name: Lint run: npm run ng lint diff --git a/hooks/pre-commit b/hooks/pre-commit index afa2595d..be4178d4 100644 --- a/hooks/pre-commit +++ b/hooks/pre-commit @@ -1,2 +1,2 @@ #!/bin/sh -npm run node-sync && pretty-code \ No newline at end of file +npm run node-sync \ No newline at end of file diff --git a/package.json b/package.json index f9a26e5f..3471d4a4 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,6 @@ "install-graphviz-win": "winget install -e --id Graphviz.Graphviz --accept-package-agreements --accept-source-agreements --disable-interactivity && set PATH=%PATH%;C:\\Program Files\\Graphviz\\bin;", "depcruise": "depcruise src --include-only \"^src\" --config --output-type dot | dot -T svg > dependency-graph.svg", "node-sync": "node ./src/scripts/nodeSyncWorkflows.js", - "pretty-code": "npx prettier . --write", "lint": "ng lint" }, "private": true, From d5c7a9fb6b3114430aedf5ceedc866ffe666ad8e Mon Sep 17 00:00:00 2001 From: doug0102 Date: Fri, 26 Jan 2024 16:31:30 -0500 Subject: [PATCH 130/165] fix prettier workflow --- .github/workflows/format-lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/format-lint.yml b/.github/workflows/format-lint.yml index 8b441889..6fde0910 100644 --- a/.github/workflows/format-lint.yml +++ b/.github/workflows/format-lint.yml @@ -32,7 +32,7 @@ jobs: git config --global user.email "shea.wow@hotmail.com" git config --global user.name Shea Dougherty-Gill git commit -a -m "Prettier formatting ${{ vars.IGNORE_DEPLOY }}" - git push + git push origin HEAD:${{ github.ref }} - name: Lint run: npm run ng lint From 5920c58b65f3e03b181156881a047266efc8ecf7 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Fri, 26 Jan 2024 16:37:54 -0500 Subject: [PATCH 131/165] fix workflow --- .github/workflows/format-lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/format-lint.yml b/.github/workflows/format-lint.yml index 6fde0910..d2d946a7 100644 --- a/.github/workflows/format-lint.yml +++ b/.github/workflows/format-lint.yml @@ -32,7 +32,7 @@ jobs: git config --global user.email "shea.wow@hotmail.com" git config --global user.name Shea Dougherty-Gill git commit -a -m "Prettier formatting ${{ vars.IGNORE_DEPLOY }}" - git push origin HEAD:${{ github.ref }} + git push origin HEAD:${{ github.ref_name }} - name: Lint run: npm run ng lint From 9f6de80efed2d09a7bf650871f9438b5c9d6348d Mon Sep 17 00:00:00 2001 From: doug0102 Date: Fri, 26 Jan 2024 16:41:53 -0500 Subject: [PATCH 132/165] fix workflow --- .github/workflows/format-lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/format-lint.yml b/.github/workflows/format-lint.yml index d2d946a7..c5d4ee67 100644 --- a/.github/workflows/format-lint.yml +++ b/.github/workflows/format-lint.yml @@ -32,7 +32,7 @@ jobs: git config --global user.email "shea.wow@hotmail.com" git config --global user.name Shea Dougherty-Gill git commit -a -m "Prettier formatting ${{ vars.IGNORE_DEPLOY }}" - git push origin HEAD:${{ github.ref_name }} + git push origin HEAD:${{ github.head_ref }} - name: Lint run: npm run ng lint From 4c67f28b954cad4cd0b62528fd747c361630810f Mon Sep 17 00:00:00 2001 From: doug0102 Date: Fri, 26 Jan 2024 16:47:01 -0500 Subject: [PATCH 133/165] fix workflows/format-lint.yml --- .github/workflows/format-lint.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/format-lint.yml b/.github/workflows/format-lint.yml index c5d4ee67..f389147b 100644 --- a/.github/workflows/format-lint.yml +++ b/.github/workflows/format-lint.yml @@ -32,6 +32,7 @@ jobs: git config --global user.email "shea.wow@hotmail.com" git config --global user.name Shea Dougherty-Gill git commit -a -m "Prettier formatting ${{ vars.IGNORE_DEPLOY }}" + git pull git push origin HEAD:${{ github.head_ref }} - name: Lint From 680ab18a774868a5ff1c0cd927efae65694c11b3 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Fri, 26 Jan 2024 16:51:20 -0500 Subject: [PATCH 134/165] fix workflows/format-lint.yml --- .github/workflows/format-lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/format-lint.yml b/.github/workflows/format-lint.yml index f389147b..4fd412ac 100644 --- a/.github/workflows/format-lint.yml +++ b/.github/workflows/format-lint.yml @@ -32,7 +32,7 @@ jobs: git config --global user.email "shea.wow@hotmail.com" git config --global user.name Shea Dougherty-Gill git commit -a -m "Prettier formatting ${{ vars.IGNORE_DEPLOY }}" - git pull + git pull ${{ github.server_url }}/${{ github.repository }} ${{ github.head_ref }} git push origin HEAD:${{ github.head_ref }} - name: Lint From 3e76b7e07c70e365c014c08ce207dcb819c5a102 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Mon, 29 Jan 2024 08:48:31 -0500 Subject: [PATCH 135/165] fix workflows/format-lint.yml --- .github/workflows/format-lint.yml | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/.github/workflows/format-lint.yml b/.github/workflows/format-lint.yml index 4fd412ac..12db1961 100644 --- a/.github/workflows/format-lint.yml +++ b/.github/workflows/format-lint.yml @@ -24,16 +24,28 @@ jobs: - name: Install run: npm install - - name: Prettier + - name: Run Prettier run: npx prettier . --write - - name: Commit + # - name: Commit + # run: | + # git config --global user.email "shea.wow@hotmail.com" + # git config --global user.name Shea Dougherty-Gill + # git commit -a -m "Prettier formatting ${{ vars.IGNORE_DEPLOY }}" + # git pull ${{ github.server_url }}/${{ github.repository }} ${{ github.head_ref }} + # git push origin HEAD:${{ github.head_ref }} + + - name: Commit Changes run: | git config --global user.email "shea.wow@hotmail.com" git config --global user.name Shea Dougherty-Gill - git commit -a -m "Prettier formatting ${{ vars.IGNORE_DEPLOY }}" - git pull ${{ github.server_url }}/${{ github.repository }} ${{ github.head_ref }} - git push origin HEAD:${{ github.head_ref }} + git add . + git commit -m "Auto-format code with Prettier" + + - name: Push Changes + uses: ad-m/github-push-action@master + with: + github_token: ${{ secrets.ACCESS_TOKEN }} - name: Lint run: npm run ng lint From 60d8e4ddd443418930b038c14191d67412b03ae8 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Mon, 29 Jan 2024 08:52:32 -0500 Subject: [PATCH 136/165] fix workflows/format-lint.yml --- .github/workflows/format-lint.yml | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/.github/workflows/format-lint.yml b/.github/workflows/format-lint.yml index 12db1961..a3a10f1d 100644 --- a/.github/workflows/format-lint.yml +++ b/.github/workflows/format-lint.yml @@ -24,28 +24,18 @@ jobs: - name: Install run: npm install - - name: Run Prettier + - name: Format Code run: npx prettier . --write - # - name: Commit - # run: | - # git config --global user.email "shea.wow@hotmail.com" - # git config --global user.name Shea Dougherty-Gill - # git commit -a -m "Prettier formatting ${{ vars.IGNORE_DEPLOY }}" - # git pull ${{ github.server_url }}/${{ github.repository }} ${{ github.head_ref }} - # git push origin HEAD:${{ github.head_ref }} - - - name: Commit Changes + - name: Commit run: | git config --global user.email "shea.wow@hotmail.com" git config --global user.name Shea Dougherty-Gill git add . - git commit -m "Auto-format code with Prettier" + git commit -m "Auto-format code with Prettier ${{ vars.IGNORE_DEPLOY }}" - - name: Push Changes - uses: ad-m/github-push-action@master - with: - github_token: ${{ secrets.ACCESS_TOKEN }} + - name: Push + run: git push origin ${{ github.event.pull_request.head.ref }} - name: Lint run: npm run ng lint From 87d1b437715bdf84678da3efddf111f627bd370b Mon Sep 17 00:00:00 2001 From: doug0102 Date: Mon, 29 Jan 2024 09:48:04 -0500 Subject: [PATCH 137/165] update workflows --- .../{format-lint.yml => code-format.yml} | 28 +++++++++---------- .github/workflows/lint.yml | 28 +++++++++++++++++++ 2 files changed, 42 insertions(+), 14 deletions(-) rename .github/workflows/{format-lint.yml => code-format.yml} (58%) create mode 100644 .github/workflows/lint.yml diff --git a/.github/workflows/format-lint.yml b/.github/workflows/code-format.yml similarity index 58% rename from .github/workflows/format-lint.yml rename to .github/workflows/code-format.yml index a3a10f1d..e12e82d9 100644 --- a/.github/workflows/format-lint.yml +++ b/.github/workflows/code-format.yml @@ -1,17 +1,23 @@ -name: Prettier & Lint +# This action will run the code formatter once a pull request is closed that targets main + +name: Code Formatter on: pull_request: - types: [opened, reopened, synchronize] - branches: main + types: + - closed + branches: ["main"] env: NODE_VERSION: "18.13.0" jobs: - lint: - name: Run code formatter & linter - runs-on: windows-latest + if_merged: + if: github.event.pull_request.merged == true + name: Install packages and format code + runs-on: ubuntu-latest + continue-on-error: true + steps: - uses: actions/checkout@v3 with: @@ -31,11 +37,5 @@ jobs: run: | git config --global user.email "shea.wow@hotmail.com" git config --global user.name Shea Dougherty-Gill - git add . - git commit -m "Auto-format code with Prettier ${{ vars.IGNORE_DEPLOY }}" - - - name: Push - run: git push origin ${{ github.event.pull_request.head.ref }} - - - name: Lint - run: npm run ng lint + git commit -a -m "Code formatting ${{ vars.IGNORE_DEPLOY }}" + git push diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 00000000..b5874091 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,28 @@ +name: Lint + +on: + pull_request: + types: [opened, reopened, synchronize] + branches: main + +env: + NODE_VERSION: "18.13.0" + +jobs: + lint: + name: Run linter + runs-on: windows-latest + steps: + - uses: actions/checkout@v3 + with: + token: ${{ secrets.ACCESS_TOKEN }} + - name: Use Node.js ${{ env.NODE_VERSION }} + uses: actions/setup-node@v1 + with: + node-version: ${{ env.NODE_VERSION }} + + - name: Install + run: npm install + + - name: Lint + run: npm run ng lint From 8eac292bad46927f13a2e92ee1de02496fd63546 Mon Sep 17 00:00:00 2001 From: Shea Date: Mon, 29 Jan 2024 14:51:40 +0000 Subject: [PATCH 138/165] Code formatting ignore-deploy --- src/app/shared/components/banner/banner.component.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/app/shared/components/banner/banner.component.ts b/src/app/shared/components/banner/banner.component.ts index aa24ec4e..12ec2000 100644 --- a/src/app/shared/components/banner/banner.component.ts +++ b/src/app/shared/components/banner/banner.component.ts @@ -6,7 +6,9 @@ import { Component, Input } from '@angular/core'; styleUrls: ['./banner.component.scss'], }) export class BannerComponent { - @Input() model: Banner | null = null;@Input() headerExpanded: boolean = false;@Input() loading: boolean = false; + @Input() model: Banner | null = null; + @Input() headerExpanded: boolean = false; + @Input() loading: boolean = false; constructor() { if (!this.model) { From 3c230bb2790dc4a5fdbd3f7f6ced5725934fc2c8 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Mon, 29 Jan 2024 10:14:01 -0500 Subject: [PATCH 139/165] update node sync script use latest version for linter --- .eslintrc.json | 3 +++ src/scripts/nodeSyncWorkflows.js | 1 + 2 files changed, 4 insertions(+) diff --git a/.eslintrc.json b/.eslintrc.json index 6fb3d020..b31baaa7 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,6 +1,9 @@ { "root": true, "ignorePatterns": ["projects/**/*"], + "parserOptions": { + "ecmaVersion": "latest" + }, "overrides": [ { "files": ["*.ts"], diff --git a/src/scripts/nodeSyncWorkflows.js b/src/scripts/nodeSyncWorkflows.js index 2b74ec05..b5ae16dd 100644 --- a/src/scripts/nodeSyncWorkflows.js +++ b/src/scripts/nodeSyncWorkflows.js @@ -7,6 +7,7 @@ const workflowFilePaths = [ ".github/workflows/deploy-dev.yml", ".github/workflows/deploy-pr.yml", ".github/workflows/lint.yml", + ".github/workflows/code-format.yml", ]; exec("npm run ng v", (error, stdout, stderr) => { From c55d677e512db8cabc929363f2aa81d435b7d689 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Tue, 30 Jan 2024 08:15:21 -0500 Subject: [PATCH 140/165] Update workflows to use the new git bot account. --- .github/workflows/code-format.yml | 6 +++--- .github/workflows/dependency-graph.yml | 6 +++--- .github/workflows/deploy-pr.yml | 2 +- .github/workflows/destroy-pr.yml | 2 +- .github/workflows/lint.yml | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/code-format.yml b/.github/workflows/code-format.yml index e12e82d9..6abe3edb 100644 --- a/.github/workflows/code-format.yml +++ b/.github/workflows/code-format.yml @@ -21,7 +21,7 @@ jobs: steps: - uses: actions/checkout@v3 with: - token: ${{ secrets.ACCESS_TOKEN }} + token: ${{ secrets.BOT_ACCESS_TOKEN }} - name: Use Node.js ${{ env.NODE_VERSION }} uses: actions/setup-node@v1 with: @@ -35,7 +35,7 @@ jobs: - name: Commit run: | - git config --global user.email "shea.wow@hotmail.com" - git config --global user.name Shea Dougherty-Gill + git config --global user.email "gccollab.git@gmail.com" + git config --global user.name GCCollab Bot git commit -a -m "Code formatting ${{ vars.IGNORE_DEPLOY }}" git push diff --git a/.github/workflows/dependency-graph.yml b/.github/workflows/dependency-graph.yml index b8df3780..51ce4d70 100644 --- a/.github/workflows/dependency-graph.yml +++ b/.github/workflows/dependency-graph.yml @@ -21,7 +21,7 @@ jobs: steps: - uses: actions/checkout@v3 with: - token: ${{ secrets.ACCESS_TOKEN }} + token: ${{ secrets.BOT_ACCESS_TOKEN }} - name: Use Node.js ${{ env.NODE_VERSION }} uses: actions/setup-node@v1 with: @@ -37,7 +37,7 @@ jobs: - name: Commit run: | - git config --global user.email "shea.wow@hotmail.com" - git config --global user.name Shea Dougherty-Gill + git config --global user.email "gccollab.git@gmail.com" + git config --global user.name GCCollab Bot git commit -a -m "Dependency Graph ${{ vars.IGNORE_DEPLOY }}" git push diff --git a/.github/workflows/deploy-pr.yml b/.github/workflows/deploy-pr.yml index bde56d6b..80091000 100644 --- a/.github/workflows/deploy-pr.yml +++ b/.github/workflows/deploy-pr.yml @@ -11,7 +11,7 @@ env: AZURE_WEBAPP_NAME: gccollab-dev-pr-${{ github.event.number }} AZURE_WEBAPP_PACKAGE_PATH: "./dist/gccollab-frontend" NODE_VERSION: "18.13.0" - ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }} + ACCESS_TOKEN: ${{ secrets.BOT_ACCESS_TOKEN }} LOCATION: canadaeast SECRET_NAME: PR_${{ github.event.number }} diff --git a/.github/workflows/destroy-pr.yml b/.github/workflows/destroy-pr.yml index daa83aa4..ca96d05c 100644 --- a/.github/workflows/destroy-pr.yml +++ b/.github/workflows/destroy-pr.yml @@ -9,7 +9,7 @@ on: env: AZURE_WEBAPP_NAME: gccollab-dev-pr-${{ github.event.number }} - ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }} + ACCESS_TOKEN: ${{ secrets.BOT_ACCESS_TOKEN }} SECRET_NAME: PR_${{ github.event.number }} jobs: diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index b5874091..0036458d 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -15,7 +15,7 @@ jobs: steps: - uses: actions/checkout@v3 with: - token: ${{ secrets.ACCESS_TOKEN }} + token: ${{ secrets.BOT_ACCESS_TOKEN }} - name: Use Node.js ${{ env.NODE_VERSION }} uses: actions/setup-node@v1 with: From 7ba6987da711d43ed580f78d8c7f725916582837 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Tue, 30 Jan 2024 10:27:57 -0500 Subject: [PATCH 141/165] formatting options --- .prettierrc | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/.prettierrc b/.prettierrc index 0967ef42..0dd5f234 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1 +1,11 @@ -{} +{ + "tabWidth": 2, + "useTabs": false, + "singleQuote": true, + "semi": true, + "bracketSpacing": true, + "arrowParens": "avoid", + "trailingComma": "es5", + "bracketSameLine": false, + "printWidth": 140 +} From dbb64d19b50b5a6eac6e41308c88b12c3c5a723b Mon Sep 17 00:00:00 2001 From: doug0102 Date: Tue, 30 Jan 2024 10:29:04 -0500 Subject: [PATCH 142/165] ignore svg file formatting --- .prettierignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.prettierignore b/.prettierignore index c8e06881..d909e80d 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,2 +1,3 @@ **/*.en.ts -**/*.fr.ts \ No newline at end of file +**/*.fr.ts +**/*.svg \ No newline at end of file From 219433a294eba44bcae2d41560a28e6b1ade10a6 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Tue, 30 Jan 2024 15:02:23 -0500 Subject: [PATCH 143/165] increased prettier line width to 192 --- .prettierrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.prettierrc b/.prettierrc index 0dd5f234..df7c85f6 100644 --- a/.prettierrc +++ b/.prettierrc @@ -7,5 +7,5 @@ "arrowParens": "avoid", "trailingComma": "es5", "bracketSameLine": false, - "printWidth": 140 + "printWidth": 192 } From 2b4b7a2c09c64e9ecc6ab97727d26d5f567a40c0 Mon Sep 17 00:00:00 2001 From: GCCollab Date: Tue, 30 Jan 2024 20:10:35 +0000 Subject: [PATCH 144/165] Code formatting ignore-deploy --- .dependency-cruiser.js | 170 +++++++------- .eslintrc.json | 5 +- .github/workflows/code-format.yml | 4 +- .github/workflows/dependency-graph.yml | 4 +- .github/workflows/deploy-dev.yml | 6 +- .github/workflows/deploy-pr.yml | 6 +- .github/workflows/lint.yml | 2 +- karma.conf.js | 24 +- src/app/app-routing.module.ts | 85 ++----- src/app/app.component.html | 12 +- src/app/app.component.scss | 4 +- src/app/app.component.ts | 59 ++--- src/app/app.module.ts | 3 +- src/app/core/core.module.ts | 3 +- src/app/core/guards/auth.guard.ts | 19 +- src/app/core/guards/interceptor.guard.ts | 8 +- src/app/core/guards/login.guard.ts | 10 +- src/app/core/guards/redirect.guard.ts | 9 +- src/app/core/guards/role.guard.ts | 6 +- src/app/core/helpers/typescript-loader.ts | 11 +- .../interceptors/error.interceptor.spec.ts | 2 +- .../core/interceptors/error.interceptor.ts | 12 +- src/app/core/models/blog.model.ts | 2 +- src/app/core/models/location.model.ts | 7 +- src/app/core/models/person.model.ts | 12 +- src/app/core/models/poll.model.ts | 2 +- src/app/core/models/post.model.ts | 2 +- src/app/core/services/debounce.service.ts | 2 +- src/app/core/services/event.service.ts | 28 +-- src/app/core/services/group.service.ts | 29 +-- src/app/core/services/news.service.ts | 42 +--- src/app/core/services/people.service.ts | 52 +---- src/app/core/services/title.service.spec.ts | 3 +- src/app/core/services/title.service.ts | 18 +- src/app/core/services/translations.service.ts | 21 +- .../event-card/event-card.component.html | 131 ++--------- .../event-card/event-card.component.scss | 2 +- .../event-card/event-card.component.spec.ts | 9 +- .../event-card/event-card.component.ts | 19 +- .../event-list/event-list.component.html | 12 +- .../event-list/event-list.component.ts | 8 +- .../components/event/event.component.html | 100 ++------ .../components/event/event.component.scss | 6 +- .../components/event/event.component.spec.ts | 9 +- .../components/event/event.component.ts | 47 +--- src/app/features/events/events.component.html | 51 +---- .../features/events/events.component.spec.ts | 9 +- src/app/features/events/events.component.ts | 2 +- .../events/resolvers/event.resolver.ts | 14 +- .../group-card/group-card.component.html | 20 +- .../group-card/group-card.component.scss | 2 +- .../group-card/group-card.component.spec.ts | 9 +- .../group-card/group-card.component.ts | 2 +- .../group-list/group-list.component.html | 4 +- src/app/features/groups/models/group.ts | 7 +- src/app/features/home/home.component.html | 41 +--- src/app/features/home/home.component.scss | 4 +- src/app/features/home/home.component.spec.ts | 3 +- src/app/features/home/home.component.ts | 2 +- src/app/features/home/home.module.ts | 10 +- .../features/login/login.component.spec.ts | 3 +- .../news-card/news-card.component.html | 48 +--- .../news-card/news-card.component.scss | 4 +- .../news-card/news-card.component.spec.ts | 9 +- .../news-list/news-list.component.html | 4 +- .../components/post/post.component.html | 57 +---- .../components/post/post.component.scss | 4 +- .../components/post/post.component.spec.ts | 9 +- .../profile/components/post/post.component.ts | 41 +--- .../profile-card/profile-card.component.html | 65 +----- .../profile-card/profile-card.component.scss | 2 +- .../profile-card.component.spec.ts | 9 +- .../profile-card/profile-card.component.ts | 10 +- .../profile-list/profile-list.component.html | 11 +- .../profile-list/profile-list.component.ts | 8 +- src/app/features/profile/profile.module.ts | 8 +- .../components/banner/banner.component.html | 13 +- .../components/banner/banner.component.scss | 8 +- .../blog-form/blog-form.component.html | 6 +- .../blog-form/blog-form.component.scss | 17 +- .../blog-form/blog-form.component.spec.ts | 9 +- .../blog-form/blog-form.component.ts | 25 +- .../components/button/button.component.html | 42 +--- .../components/button/button.component.scss | 60 ++--- .../components/button/button.component.ts | 3 +- .../calendar-button.component.html | 12 +- .../calendar-button.component.scss | 2 +- .../calendar-button.component.spec.ts | 9 +- .../components/editor/editor.component.html | 53 +---- .../components/editor/editor.component.scss | 17 +- .../editor/editor.component.spec.ts | 3 +- .../components/editor/editor.component.ts | 215 +++--------------- .../event-form/event-form.component.html | 45 +--- .../event-form/event-form.component.scss | 2 +- .../event-form/event-form.component.spec.ts | 9 +- .../event-form/event-form.component.ts | 39 +--- .../file-select/file-select.component.html | 50 +--- .../file-select/file-select.component.scss | 17 +- .../file-select/file-select.component.spec.ts | 9 +- .../file-select/file-select.component.ts | 140 +++--------- .../components/footer/footer.component.html | 24 +- .../components/footer/footer.component.scss | 4 +- .../footer/footer.component.spec.ts | 3 +- .../components/header/header.component.html | 49 +--- .../components/header/header.component.scss | 8 +- .../header/header.component.spec.ts | 3 +- .../components/header/header.component.ts | 2 +- .../components/input/input.component.html | 50 +--- .../components/input/input.component.scss | 5 +- .../components/input/input.component.ts | 27 +-- .../language-selector.component.html | 6 +- .../language-selector.component.spec.ts | 3 +- .../language-selector.component.ts | 7 +- .../components/list/list.component.html | 30 +-- .../shared/components/list/list.component.ts | 19 +- .../page-title/page-title.component.scss | 2 +- .../page-title/page-title.component.spec.ts | 3 +- .../poll-form/poll-form.component.html | 11 +- .../poll-form/poll-form.component.spec.ts | 9 +- .../poll-form/poll-form.component.ts | 26 +-- .../post-form/post-form.component.spec.ts | 9 +- .../post-form/post-form.component.ts | 9 +- .../profile-pic/profile-pic.component.html | 15 +- .../profile-pic/profile-pic.component.spec.ts | 9 +- .../profile-pic/profile-pic.component.ts | 2 +- .../shared/factories/editor-config.factory.ts | 14 +- src/app/shared/shared.module.ts | 19 +- src/index.html | 10 +- src/main.ts | 2 +- src/scripts/nodeSyncWorkflows.js | 27 +-- src/silent-renew.html | 2 +- src/styles.scss | 8 +- src/test.ts | 10 +- src/theme.scss | 16 +- 134 files changed, 654 insertions(+), 2093 deletions(-) diff --git a/.dependency-cruiser.js b/.dependency-cruiser.js index 25dbe592..954b2745 100644 --- a/.dependency-cruiser.js +++ b/.dependency-cruiser.js @@ -14,165 +14,162 @@ module.exports = { // } // }, { - name: "no-orphans", + name: 'no-orphans', comment: "This is an orphan module - it's likely not used (anymore?). Either use it or " + "remove it. If it's logical this module is an orphan (i.e. it's a config file), " + - "add an exception for it in your dependency-cruiser configuration. By default " + - "this rule does not scrutinize dot-files (e.g. .eslintrc.js), TypeScript declaration " + - "files (.d.ts), tsconfig.json and some of the babel and webpack configs.", - severity: "warn", + 'add an exception for it in your dependency-cruiser configuration. By default ' + + 'this rule does not scrutinize dot-files (e.g. .eslintrc.js), TypeScript declaration ' + + 'files (.d.ts), tsconfig.json and some of the babel and webpack configs.', + severity: 'warn', from: { orphan: true, pathNot: [ - "(^|/)\\.[^/]+\\.(js|cjs|mjs|ts|json)$", // dot files - "\\.d\\.ts$", // TypeScript declaration files - "(^|/)tsconfig\\.json$", // TypeScript config - "(^|/)(babel|webpack)\\.config\\.(js|cjs|mjs|ts|json)$", // other configs + '(^|/)\\.[^/]+\\.(js|cjs|mjs|ts|json)$', // dot files + '\\.d\\.ts$', // TypeScript declaration files + '(^|/)tsconfig\\.json$', // TypeScript config + '(^|/)(babel|webpack)\\.config\\.(js|cjs|mjs|ts|json)$', // other configs ], }, to: {}, }, { - name: "no-deprecated-core", - comment: - "A module depends on a node core module that has been deprecated. Find an alternative - these are " + - "bound to exist - node doesn't deprecate lightly.", - severity: "warn", + name: 'no-deprecated-core', + comment: 'A module depends on a node core module that has been deprecated. Find an alternative - these are ' + "bound to exist - node doesn't deprecate lightly.", + severity: 'warn', from: {}, to: { - dependencyTypes: ["core"], + dependencyTypes: ['core'], path: [ - "^(v8/tools/codemap)$", - "^(v8/tools/consarray)$", - "^(v8/tools/csvparser)$", - "^(v8/tools/logreader)$", - "^(v8/tools/profile_view)$", - "^(v8/tools/profile)$", - "^(v8/tools/SourceMap)$", - "^(v8/tools/splaytree)$", - "^(v8/tools/tickprocessor-driver)$", - "^(v8/tools/tickprocessor)$", - "^(node-inspect/lib/_inspect)$", - "^(node-inspect/lib/internal/inspect_client)$", - "^(node-inspect/lib/internal/inspect_repl)$", - "^(async_hooks)$", - "^(punycode)$", - "^(domain)$", - "^(constants)$", - "^(sys)$", - "^(_linklist)$", - "^(_stream_wrap)$", + '^(v8/tools/codemap)$', + '^(v8/tools/consarray)$', + '^(v8/tools/csvparser)$', + '^(v8/tools/logreader)$', + '^(v8/tools/profile_view)$', + '^(v8/tools/profile)$', + '^(v8/tools/SourceMap)$', + '^(v8/tools/splaytree)$', + '^(v8/tools/tickprocessor-driver)$', + '^(v8/tools/tickprocessor)$', + '^(node-inspect/lib/_inspect)$', + '^(node-inspect/lib/internal/inspect_client)$', + '^(node-inspect/lib/internal/inspect_repl)$', + '^(async_hooks)$', + '^(punycode)$', + '^(domain)$', + '^(constants)$', + '^(sys)$', + '^(_linklist)$', + '^(_stream_wrap)$', ], }, }, { - name: "not-to-deprecated", + name: 'not-to-deprecated', comment: - "This module uses a (version of an) npm module that has been deprecated. Either upgrade to a later " + - "version of that module, or find an alternative. Deprecated modules are a security risk.", - severity: "warn", + 'This module uses a (version of an) npm module that has been deprecated. Either upgrade to a later ' + + 'version of that module, or find an alternative. Deprecated modules are a security risk.', + severity: 'warn', from: {}, to: { - dependencyTypes: ["deprecated"], + dependencyTypes: ['deprecated'], }, }, { - name: "no-non-package-json", - severity: "error", + name: 'no-non-package-json', + severity: 'error', comment: "This module depends on an npm package that isn't in the 'dependencies' section of your package.json. " + "That's problematic as the package either (1) won't be available on live (2 - worse) will be " + - "available on live with an non-guaranteed version. Fix it by adding the package to the dependencies " + - "in your package.json.", + 'available on live with an non-guaranteed version. Fix it by adding the package to the dependencies ' + + 'in your package.json.', from: {}, to: { - dependencyTypes: ["npm-no-pkg", "npm-unknown"], + dependencyTypes: ['npm-no-pkg', 'npm-unknown'], }, }, { - name: "not-to-unresolvable", + name: 'not-to-unresolvable', comment: "This module depends on a module that cannot be found ('resolved to disk'). If it's an npm " + - "module: add it to your package.json. In all other cases you likely already know what to do.", - severity: "error", + 'module: add it to your package.json. In all other cases you likely already know what to do.', + severity: 'error', from: {}, to: { couldNotResolve: true, }, }, { - name: "no-duplicate-dep-types", + name: 'no-duplicate-dep-types', comment: "Likely this module depends on an external ('npm') package that occurs more than once " + - "in your package.json i.e. bot as a devDependencies and in dependencies. This will cause " + - "maintenance problems later on.", - severity: "warn", + 'in your package.json i.e. bot as a devDependencies and in dependencies. This will cause ' + + 'maintenance problems later on.', + severity: 'warn', from: {}, to: { moreThanOneDependencyType: true, // as it's pretty common to have a type import be a type only import // _and_ (e.g.) a devDependency - don't consider type-only dependency // types for this rule - dependencyTypesNot: ["type-only"], + dependencyTypesNot: ['type-only'], }, }, /* rules you might want to tweak for your specific situation: */ { - name: "not-to-spec", + name: 'not-to-spec', comment: - "This module depends on a spec (test) file. The sole responsibility of a spec file is to test code. " + + 'This module depends on a spec (test) file. The sole responsibility of a spec file is to test code. ' + "If there's something in a spec that's of use to other modules, it doesn't have that single " + - "responsibility anymore. Factor it out into (e.g.) a separate utility/ helper or a mock.", - severity: "error", + 'responsibility anymore. Factor it out into (e.g.) a separate utility/ helper or a mock.', + severity: 'error', from: {}, to: { - path: "\\.(spec|test)\\.(js|mjs|cjs|ts|ls|coffee|litcoffee|coffee\\.md)$", + path: '\\.(spec|test)\\.(js|mjs|cjs|ts|ls|coffee|litcoffee|coffee\\.md)$', }, }, { - name: "not-to-dev-dep", - severity: "error", + name: 'not-to-dev-dep', + severity: 'error', comment: "This module depends on an npm package from the 'devDependencies' section of your " + - "package.json. It looks like something that ships to production, though. To prevent problems " + + 'package.json. It looks like something that ships to production, though. To prevent problems ' + "with npm packages that aren't there on production declare it (only!) in the 'dependencies'" + - "section of your package.json. If this module is development only - add it to the " + - "from.pathNot re of the not-to-dev-dep rule in the dependency-cruiser configuration", + 'section of your package.json. If this module is development only - add it to the ' + + 'from.pathNot re of the not-to-dev-dep rule in the dependency-cruiser configuration', from: { - path: "^(src)", - pathNot: - "\\.(spec|test)\\.(js|mjs|cjs|ts|ls|coffee|litcoffee|coffee\\.md)$", + path: '^(src)', + pathNot: '\\.(spec|test)\\.(js|mjs|cjs|ts|ls|coffee|litcoffee|coffee\\.md)$', }, to: { - dependencyTypes: ["npm-dev"], + dependencyTypes: ['npm-dev'], }, }, { - name: "optional-deps-used", - severity: "info", + name: 'optional-deps-used', + severity: 'info', comment: - "This module depends on an npm package that is declared as an optional dependency " + + 'This module depends on an npm package that is declared as an optional dependency ' + "in your package.json. As this makes sense in limited situations only, it's flagged here. " + "If you're using an optional dependency here by design - add an exception to your" + - "dependency-cruiser configuration.", + 'dependency-cruiser configuration.', from: {}, to: { - dependencyTypes: ["npm-optional"], + dependencyTypes: ['npm-optional'], }, }, { - name: "peer-deps-used", + name: 'peer-deps-used', comment: - "This module depends on an npm package that is declared as a peer dependency " + - "in your package.json. This makes sense if your package is e.g. a plugin, but in " + - "other cases - maybe not so much. If the use of a peer dependency is intentional " + - "add an exception to your dependency-cruiser configuration.", - severity: "warn", + 'This module depends on an npm package that is declared as a peer dependency ' + + 'in your package.json. This makes sense if your package is e.g. a plugin, but in ' + + 'other cases - maybe not so much. If the use of a peer dependency is intentional ' + + 'add an exception to your dependency-cruiser configuration.', + severity: 'warn', from: {}, to: { - dependencyTypes: ["npm-peer"], + dependencyTypes: ['npm-peer'], }, }, ], @@ -183,7 +180,7 @@ module.exports = { for a complete list */ doNotFollow: { - path: "node_modules", + path: 'node_modules', }, /* conditions specifying which dependencies to exclude @@ -247,7 +244,7 @@ module.exports = { defaults to './tsconfig.json'. */ tsConfig: { - fileName: "tsconfig.json", + fileName: 'tsconfig.json', }, /* Webpack configuration to use to get resolve options from. @@ -297,7 +294,7 @@ module.exports = { If you have an `exportsFields` attribute in your webpack config, that one will have precedence over the one specified here. */ - exportsFields: ["exports"], + exportsFields: ['exports'], /* List of conditions to check for in the exports field. e.g. use ['imports'] if you're only interested in exposed es6 modules, ['require'] for commonjs, or all conditions at once `(['import', 'require', 'node', 'default']`) @@ -307,7 +304,7 @@ module.exports = { If you have a 'conditionNames' attribute in your webpack config, that one will have precedence over the one specified here. */ - conditionNames: ["import", "require", "node", "default"], + conditionNames: ['import', 'require', 'node', 'default'], /* The extensions, by default are the same as the ones dependency-cruiser can access (run `npx depcruise --info` to see which ones that are in @@ -326,7 +323,7 @@ module.exports = { this if you're not sure, but still use TypeScript. In a future version of dependency-cruiser this will likely become the default. */ - mainFields: ["main", "types"], + mainFields: ['main', 'types'], }, reporterOptions: { dot: { @@ -335,7 +332,7 @@ module.exports = { collapses everything in node_modules to one folder deep so you see the external modules, but not the innards your app depends upon. */ - collapsePattern: "node_modules/(@[^/]+/[^/]+|[^/]+)", + collapsePattern: 'node_modules/(@[^/]+/[^/]+|[^/]+)', /* Options to tweak the appearance of your graph.See https://github.com/sverweij/dependency-cruiser/blob/master/doc/options-reference.md#reporteroptions @@ -416,8 +413,7 @@ module.exports = { dependency graph reporter (`archi`) you probably want to tweak this collapsePattern to your situation. */ - collapsePattern: - "^(packages|src|lib|app|bin|test(s?)|spec(s?))/[^/]+|node_modules/(@[^/]+/[^/]+|[^/]+)", + collapsePattern: '^(packages|src|lib|app|bin|test(s?)|spec(s?))/[^/]+|node_modules/(@[^/]+/[^/]+|[^/]+)', /* Options to tweak the appearance of your graph.See https://github.com/sverweij/dependency-cruiser/blob/master/doc/options-reference.md#reporteroptions diff --git a/.eslintrc.json b/.eslintrc.json index b31baaa7..ec7f9e49 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -35,10 +35,7 @@ }, { "files": ["*.html"], - "extends": [ - "plugin:@angular-eslint/template/recommended", - "plugin:@angular-eslint/template/accessibility" - ], + "extends": ["plugin:@angular-eslint/template/recommended", "plugin:@angular-eslint/template/accessibility"], "rules": {} } ] diff --git a/.github/workflows/code-format.yml b/.github/workflows/code-format.yml index 6abe3edb..80d57591 100644 --- a/.github/workflows/code-format.yml +++ b/.github/workflows/code-format.yml @@ -6,10 +6,10 @@ on: pull_request: types: - closed - branches: ["main"] + branches: ['main'] env: - NODE_VERSION: "18.13.0" + NODE_VERSION: '18.13.0' jobs: if_merged: diff --git a/.github/workflows/dependency-graph.yml b/.github/workflows/dependency-graph.yml index 51ce4d70..d920d4c8 100644 --- a/.github/workflows/dependency-graph.yml +++ b/.github/workflows/dependency-graph.yml @@ -6,10 +6,10 @@ on: pull_request: types: - closed - branches: ["main"] + branches: ['main'] env: - NODE_VERSION: "18.13.0" + NODE_VERSION: '18.13.0' jobs: if_merged: diff --git a/.github/workflows/deploy-dev.yml b/.github/workflows/deploy-dev.yml index 437d7eb3..95763262 100644 --- a/.github/workflows/deploy-dev.yml +++ b/.github/workflows/deploy-dev.yml @@ -10,8 +10,8 @@ on: env: AZURE_WEBAPP_NAME: gccollab-dev - AZURE_WEBAPP_PACKAGE_PATH: "./dist/gccollab-frontend" - NODE_VERSION: "18.13.0" + AZURE_WEBAPP_PACKAGE_PATH: './dist/gccollab-frontend' + NODE_VERSION: '18.13.0' jobs: build-test-and-deploy: @@ -38,7 +38,7 @@ jobs: - name: Test run: npm run test --if-present -- --watch=false --browsers=ChromeHeadless - - name: "Deploy to Azure WebApp" + - name: 'Deploy to Azure WebApp' uses: azure/webapps-deploy@v1 with: app-name: ${{ env.AZURE_WEBAPP_NAME }} diff --git a/.github/workflows/deploy-pr.yml b/.github/workflows/deploy-pr.yml index 80091000..a62e4e16 100644 --- a/.github/workflows/deploy-pr.yml +++ b/.github/workflows/deploy-pr.yml @@ -9,8 +9,8 @@ on: env: AZURE_WEBAPP_NAME: gccollab-dev-pr-${{ github.event.number }} - AZURE_WEBAPP_PACKAGE_PATH: "./dist/gccollab-frontend" - NODE_VERSION: "18.13.0" + AZURE_WEBAPP_PACKAGE_PATH: './dist/gccollab-frontend' + NODE_VERSION: '18.13.0' ACCESS_TOKEN: ${{ secrets.BOT_ACCESS_TOKEN }} LOCATION: canadaeast SECRET_NAME: PR_${{ github.event.number }} @@ -113,7 +113,7 @@ jobs: with: creds: ${{ secrets.AZURE_CREDENTIALS }} - - name: "Deploy to Azure WebApp" + - name: 'Deploy to Azure WebApp' uses: azure/webapps-deploy@v1 with: app-name: ${{ env.AZURE_WEBAPP_NAME }} diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 0036458d..0a5cd467 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -6,7 +6,7 @@ on: branches: main env: - NODE_VERSION: "18.13.0" + NODE_VERSION: '18.13.0' jobs: lint: diff --git a/karma.conf.js b/karma.conf.js index a2ebdd2b..1c8ba225 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -3,14 +3,14 @@ module.exports = function (config) { config.set({ - basePath: "", - frameworks: ["jasmine", "@angular-devkit/build-angular"], + basePath: '', + frameworks: ['jasmine', '@angular-devkit/build-angular'], plugins: [ - require("karma-jasmine"), - require("karma-chrome-launcher"), - require("karma-jasmine-html-reporter"), - require("karma-coverage"), - require("@angular-devkit/build-angular/plugins/karma"), + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage'), + require('@angular-devkit/build-angular/plugins/karma'), ], client: { jasmine: { @@ -25,16 +25,16 @@ module.exports = function (config) { suppressAll: true, // removes the duplicated traces }, coverageReporter: { - dir: require("path").join(__dirname, "./coverage/gccollab-frontend"), - subdir: ".", - reporters: [{ type: "html" }, { type: "text-summary" }], + dir: require('path').join(__dirname, './coverage/gccollab-frontend'), + subdir: '.', + reporters: [{ type: 'html' }, { type: 'text-summary' }], }, - reporters: ["progress", "kjhtml"], + reporters: ['progress', 'kjhtml'], port: 9876, colors: true, logLevel: config.LOG_INFO, autoWatch: true, - browsers: ["Chrome"], + browsers: ['Chrome'], singleRun: false, restartOnFileChange: true, }); diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index e4b450de..c414669c 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -22,8 +22,7 @@ const routes: Routes = [ { path: CoreRoutes.Login, title: translations.titles.login, - loadChildren: () => - import('./features/login/login.module').then((m) => m.LoginModule), + loadChildren: () => import('./features/login/login.module').then(m => m.LoginModule), canActivate: [LoginGuard], data: { title: translations.titles.login, @@ -33,8 +32,7 @@ const routes: Routes = [ { path: CoreRoutes.Home, title: translations.titles.home, - loadChildren: () => - import('./features/home/home.module').then((m) => m.HomeModule), + loadChildren: () => import('./features/home/home.module').then(m => m.HomeModule), canActivate: [InterceptorGuard], data: { title: translations.titles.home, @@ -44,10 +42,7 @@ const routes: Routes = [ { path: CoreRoutes.Register, title: translations.titles.register, - loadChildren: () => - import('./features/register/register.module').then( - (m) => m.RegisterModule, - ), + loadChildren: () => import('./features/register/register.module').then(m => m.RegisterModule), canActivate: [LoginGuard], data: { title: translations.titles.register, @@ -57,8 +52,7 @@ const routes: Routes = [ { path: CoreRoutes.Terms, title: translations.titles.terms, - loadChildren: () => - import('./features/terms/terms.module').then((m) => m.TermsModule), + loadChildren: () => import('./features/terms/terms.module').then(m => m.TermsModule), data: { title: translations.titles.terms, breadcrumb: translations.titles.terms, @@ -67,8 +61,7 @@ const routes: Routes = [ { path: CoreRoutes.Splash, title: translations.titles.splash, - loadChildren: () => - import('./features/splash/splash.module').then((m) => m.SplashModule), + loadChildren: () => import('./features/splash/splash.module').then(m => m.SplashModule), data: { title: translations.titles.splash, breadcrumb: translations.titles.splash, @@ -77,8 +70,7 @@ const routes: Routes = [ { path: CoreRoutes.About, title: translations.titles.about, - loadChildren: () => - import('./features/about/about.module').then((m) => m.AboutModule), + loadChildren: () => import('./features/about/about.module').then(m => m.AboutModule), data: { title: translations.titles.about, breadcrumb: translations.titles.about, @@ -87,8 +79,7 @@ const routes: Routes = [ { path: CoreRoutes.Privacy, title: translations.titles.privacy, - loadChildren: () => - import('./features/privacy/privacy.module').then((m) => m.PrivacyModule), + loadChildren: () => import('./features/privacy/privacy.module').then(m => m.PrivacyModule), data: { title: translations.titles.privacy, breadcrumb: translations.titles.privacy, @@ -97,8 +88,7 @@ const routes: Routes = [ { path: CoreRoutes.Stats, title: translations.titles.stats, - loadChildren: () => - import('./features/stats/stats.module').then((m) => m.StatsModule), + loadChildren: () => import('./features/stats/stats.module').then(m => m.StatsModule), data: { title: translations.titles.stats, breadcrumb: translations.titles.stats, @@ -116,8 +106,7 @@ const routes: Routes = [ { path: CoreRoutes.Blog, title: translations.titles.blog, - loadChildren: () => - import('./features/blog/blog.module').then((m) => m.BlogModule), + loadChildren: () => import('./features/blog/blog.module').then(m => m.BlogModule), data: { title: translations.titles.blog, breadcrumb: translations.titles.blog, @@ -126,10 +115,7 @@ const routes: Routes = [ { path: CoreRoutes.Bookmarks, title: translations.titles.bookmarks, - loadChildren: () => - import('./features/bookmarks/bookmarks.module').then( - (m) => m.BookmarksModule, - ), + loadChildren: () => import('./features/bookmarks/bookmarks.module').then(m => m.BookmarksModule), canActivate: [AuthGuard, InterceptorGuard], data: { title: translations.titles.bookmarks, @@ -139,10 +125,7 @@ const routes: Routes = [ { path: CoreRoutes.Dashboard, title: translations.titles.dashboards, - loadChildren: () => - import('./features/dashboard/dashboard.module').then( - (m) => m.DashboardModule, - ), + loadChildren: () => import('./features/dashboard/dashboard.module').then(m => m.DashboardModule), canActivate: [AuthGuard, InterceptorGuard], data: { title: translations.titles.dashboards, @@ -157,8 +140,7 @@ const routes: Routes = [ { path: CoreRoutes.Events, title: translations.titles.events, - loadChildren: () => - import('./features/events/events.module').then((m) => m.EventsModule), + loadChildren: () => import('./features/events/events.module').then(m => m.EventsModule), data: { title: translations.titles.events, breadcrumb: translations.titles.events, @@ -167,8 +149,7 @@ const routes: Routes = [ { path: CoreRoutes.Friends, title: translations.titles.friends, - loadChildren: () => - import('./features/friends/friends.module').then((m) => m.FriendsModule), + loadChildren: () => import('./features/friends/friends.module').then(m => m.FriendsModule), canActivate: [AuthGuard, InterceptorGuard], data: { title: translations.titles.friends, @@ -178,8 +159,7 @@ const routes: Routes = [ { path: CoreRoutes.Groups, title: translations.titles.groups, - loadChildren: () => - import('./features/groups/groups.module').then((m) => m.GroupsModule), + loadChildren: () => import('./features/groups/groups.module').then(m => m.GroupsModule), canActivate: [AuthGuard, InterceptorGuard], data: { title: translations.titles.groups, @@ -189,8 +169,7 @@ const routes: Routes = [ { path: CoreRoutes.Invite, title: translations.titles.invite, - loadChildren: () => - import('./features/invite/invite.module').then((m) => m.InviteModule), + loadChildren: () => import('./features/invite/invite.module').then(m => m.InviteModule), canActivate: [AuthGuard, InterceptorGuard], data: { title: translations.titles.invite, @@ -200,8 +179,7 @@ const routes: Routes = [ { path: CoreRoutes.Members, title: translations.titles.members, - loadChildren: () => - import('./features/members/members.module').then((m) => m.MembersModule), + loadChildren: () => import('./features/members/members.module').then(m => m.MembersModule), canActivate: [AuthGuard, InterceptorGuard], data: { title: translations.titles.members, @@ -211,10 +189,7 @@ const routes: Routes = [ { path: CoreRoutes.Messages, title: translations.titles.messages, - loadChildren: () => - import('./features/messages/messages.module').then( - (m) => m.MessagesModule, - ), + loadChildren: () => import('./features/messages/messages.module').then(m => m.MessagesModule), canActivate: [AuthGuard, InterceptorGuard], data: { title: translations.titles.messages, @@ -224,10 +199,7 @@ const routes: Routes = [ { path: CoreRoutes.Missions, title: translations.titles.missions, - loadChildren: () => - import('./features/missions/missions.module').then( - (m) => m.MissionsModule, - ), + loadChildren: () => import('./features/missions/missions.module').then(m => m.MissionsModule), data: { title: translations.titles.missions, breadcrumb: translations.titles.missions, @@ -236,10 +208,7 @@ const routes: Routes = [ { path: CoreRoutes.NewsFeed, title: translations.titles.newsfeed, - loadChildren: () => - import('./features/news-feed/news-feed.module').then( - (m) => m.NewsFeedModule, - ), + loadChildren: () => import('./features/news-feed/news-feed.module').then(m => m.NewsFeedModule), canActivate: [AuthGuard, InterceptorGuard], data: { title: translations.titles.newsfeed, @@ -249,8 +218,7 @@ const routes: Routes = [ { path: CoreRoutes.Profile, title: translations.titles.profile, - loadChildren: () => - import('./features/profile/profile.module').then((m) => m.ProfileModule), + loadChildren: () => import('./features/profile/profile.module').then(m => m.ProfileModule), canActivate: [AuthGuard, InterceptorGuard], data: { title: translations.titles.profile, @@ -260,8 +228,7 @@ const routes: Routes = [ { path: CoreRoutes.Search, title: translations.titles.search, - loadChildren: () => - import('./features/search/search.module').then((m) => m.SearchModule), + loadChildren: () => import('./features/search/search.module').then(m => m.SearchModule), data: { title: translations.titles.search, breadcrumb: translations.titles.search, @@ -270,10 +237,7 @@ const routes: Routes = [ { path: CoreRoutes.Settings, title: translations.titles.settings, - loadChildren: () => - import('./features/settings/settings.module').then( - (m) => m.SettingsModule, - ), + loadChildren: () => import('./features/settings/settings.module').then(m => m.SettingsModule), canActivate: [AuthGuard, InterceptorGuard], data: { title: translations.titles.settings, @@ -283,10 +247,7 @@ const routes: Routes = [ { path: CoreRoutes.TheWire, title: translations.titles.thewire, - loadChildren: () => - import('./features/the-wire/the-wire.module').then( - (m) => m.TheWireModule, - ), + loadChildren: () => import('./features/the-wire/the-wire.module').then(m => m.TheWireModule), data: { title: translations.titles.thewire, breadcrumb: translations.titles.thewire, diff --git a/src/app/app.component.html b/src/app/app.component.html index 2e0a4815..1831dcbe 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -1,18 +1,10 @@ - - + -
+
diff --git a/src/app/app.component.scss b/src/app/app.component.scss index e1f5a9ca..1d1f2988 100644 --- a/src/app/app.component.scss +++ b/src/app/app.component.scss @@ -1,5 +1,5 @@ -@import "../assets//scss/partials/layout"; -@import "../assets/scss/partials/header"; +@import '../assets//scss/partials/layout'; +@import '../assets/scss/partials/header'; .gcc-main { flex: 1; diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 5be17099..cf8318d3 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -1,10 +1,5 @@ import { Component, OnDestroy, OnInit } from '@angular/core'; -import { - ActivatedRoute, - NavigationEnd, - Router, - RouterEvent, -} from '@angular/router'; +import { ActivatedRoute, NavigationEnd, Router, RouterEvent } from '@angular/router'; import { filter, Subscription } from 'rxjs'; import { CoreRoutes } from './core/constants/routes.constants'; @@ -34,7 +29,7 @@ export class AppComponent implements OnInit, OnDestroy { private translateService: TranslateService, private languageStorageService: LanguageStorageService, private activatedRoute: ActivatedRoute, - private router: Router, + private router: Router ) {} ngOnInit() { @@ -52,22 +47,18 @@ export class AppComponent implements OnInit, OnDestroy { } initAuthService(): void { - this.checkAuthSub = this.oidcSecurityService - .checkAuth() - .subscribe(({ isAuthenticated, userData, accessToken, idToken }) => { - console.log('Authenticated: ' + isAuthenticated); - console.log('User Data: ' + userData); - console.log('Access Token: ' + accessToken); - console.log('ID Token: ' + idToken); - }); + this.checkAuthSub = this.oidcSecurityService.checkAuth().subscribe(({ isAuthenticated, userData, accessToken, idToken }) => { + console.log('Authenticated: ' + isAuthenticated); + console.log('User Data: ' + userData); + console.log('Access Token: ' + accessToken); + console.log('ID Token: ' + idToken); + }); } initTranslationService(): void { - this.langChangeSub = this.translateService.onLangChange.subscribe( - ({ lang }) => { - this.languageStorageService.setLanguage(lang); - }, - ); + this.langChangeSub = this.translateService.onLangChange.subscribe(({ lang }) => { + this.languageStorageService.setLanguage(lang); + }); const savedLang = this.languageStorageService.getLanguage(); @@ -85,21 +76,19 @@ export class AppComponent implements OnInit, OnDestroy { } initRouteChangeSubscription(): void { - this.routeChangeSub = this.router.events - .pipe(filter((e) => e instanceof NavigationEnd)) - .subscribe((e) => { - let url = (e as RouterEvent).url; - const queryIndex = url.indexOf('?'); - url = url.substring(1, queryIndex > -1 ? queryIndex : undefined); - - if (url === CoreRoutes.Splash) { - this.showHeaderFooter = false; - } else { - this.showHeaderFooter = true; - } - - this.activeRoute = url; - }); + this.routeChangeSub = this.router.events.pipe(filter(e => e instanceof NavigationEnd)).subscribe(e => { + let url = (e as RouterEvent).url; + const queryIndex = url.indexOf('?'); + url = url.substring(1, queryIndex > -1 ? queryIndex : undefined); + + if (url === CoreRoutes.Splash) { + this.showHeaderFooter = false; + } else { + this.showHeaderFooter = true; + } + + this.activeRoute = url; + }); } getRouteData(key: string) { diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 07f89ec1..8af8c14e 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -31,8 +31,7 @@ import { GroupsComponent } from './features/groups/groups.component'; useDefaultLang: true, loader: { provide: TranslateLoader, - useFactory: (http: HttpClient) => - new TypescriptLoader(http, 'translations'), + useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), deps: [HttpClient], }, isolate: false, diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts index 7e47d232..eb605b40 100644 --- a/src/app/core/core.module.ts +++ b/src/app/core/core.module.ts @@ -16,8 +16,7 @@ import { TypescriptLoader } from './helpers/typescript-loader'; TranslateModule.forChild({ loader: { provide: TranslateLoader, - useFactory: (http: HttpClient) => - new TypescriptLoader(http, 'translations'), + useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), deps: [HttpClient], }, isolate: false, diff --git a/src/app/core/guards/auth.guard.ts b/src/app/core/guards/auth.guard.ts index 534e49ad..0233d51b 100644 --- a/src/app/core/guards/auth.guard.ts +++ b/src/app/core/guards/auth.guard.ts @@ -1,9 +1,5 @@ import { Injectable } from '@angular/core'; -import { - ActivatedRouteSnapshot, - RouterStateSnapshot, - UrlTree, -} from '@angular/router'; +import { ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree } from '@angular/router'; import { OidcSecurityService } from 'angular-auth-oidc-client'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; @@ -21,17 +17,10 @@ import { environment } from '../../../environments/environment'; export class AuthGuard { constructor( private oidcSecurityService: OidcSecurityService, - private sessionStorageService: SessionStorageService, + private sessionStorageService: SessionStorageService ) {} - canActivate( - route: ActivatedRouteSnapshot, - state: RouterStateSnapshot, - ): - | Observable - | Promise - | boolean - | UrlTree { + canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable | Promise | boolean | UrlTree { if (!environment.authGuard) return true; return this.oidcSecurityService.isAuthenticated$.pipe( @@ -42,7 +31,7 @@ export class AuthGuard { this.oidcSecurityService.authorize(); return false; - }), + }) ); } } diff --git a/src/app/core/guards/interceptor.guard.ts b/src/app/core/guards/interceptor.guard.ts index 1ab6fcc6..e81319d3 100644 --- a/src/app/core/guards/interceptor.guard.ts +++ b/src/app/core/guards/interceptor.guard.ts @@ -16,14 +16,10 @@ export class InterceptorGuard { constructor( private sessionStorageService: SessionStorageService, - private router: Router, + private router: Router ) {} - canActivate(): - | Observable - | Promise - | boolean - | UrlTree { + canActivate(): Observable | Promise | boolean | UrlTree { const retUrl = this.sessionStorageService.read(this.returnUrlKey); if (retUrl) { diff --git a/src/app/core/guards/login.guard.ts b/src/app/core/guards/login.guard.ts index 1e4ca420..f24ac94e 100644 --- a/src/app/core/guards/login.guard.ts +++ b/src/app/core/guards/login.guard.ts @@ -15,21 +15,17 @@ import { map } from 'rxjs/operators'; export class LoginGuard { constructor( private oidcSecurityService: OidcSecurityService, - private router: Router, + private router: Router ) {} - canActivate(): - | Observable - | Promise - | boolean - | UrlTree { + canActivate(): Observable | Promise | boolean | UrlTree { return this.oidcSecurityService.isAuthenticated$.pipe( map(({ isAuthenticated }) => { if (!isAuthenticated) { return true; } return this.router.parseUrl(''); - }), + }) ); } } diff --git a/src/app/core/guards/redirect.guard.ts b/src/app/core/guards/redirect.guard.ts index 65f6a1b2..7afbec02 100644 --- a/src/app/core/guards/redirect.guard.ts +++ b/src/app/core/guards/redirect.guard.ts @@ -11,18 +11,13 @@ import { ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; export class RedirectGuard { constructor() {} - canActivate( - route: ActivatedRouteSnapshot, - state: RouterStateSnapshot, - ): boolean { + canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean { const externalUrl = route.data['externalUrl']; if (externalUrl) { window.open(externalUrl, '_blank')?.focus(); } else { - console.error( - `RedirectGuard: No externalUrl data provided for the '${state.url}' route.`, - ); + console.error(`RedirectGuard: No externalUrl data provided for the '${state.url}' route.`); } return false; diff --git a/src/app/core/guards/role.guard.ts b/src/app/core/guards/role.guard.ts index 320fa564..d06e4458 100644 --- a/src/app/core/guards/role.guard.ts +++ b/src/app/core/guards/role.guard.ts @@ -6,11 +6,7 @@ import { Observable } from 'rxjs'; providedIn: 'root', }) export class RoleGuard { - canActivate(): - | Observable - | Promise - | boolean - | UrlTree { + canActivate(): Observable | Promise | boolean | UrlTree { return true; } } diff --git a/src/app/core/helpers/typescript-loader.ts b/src/app/core/helpers/typescript-loader.ts index d91bf416..f6152d19 100644 --- a/src/app/core/helpers/typescript-loader.ts +++ b/src/app/core/helpers/typescript-loader.ts @@ -9,18 +9,15 @@ interface TranslationData { export class TypescriptLoader implements TranslateLoader { constructor( private http: HttpClient, - private translationFile: string, + private translationFile: string ) {} public getTranslation(lang: string): Observable { const url = `./assets/i18n/${this.translationFile}.${lang}.ts`; return this.http.get(url, { responseType: 'text' }).pipe( - map((response) => { - const obj = response.substring( - response.indexOf('{'), - response.lastIndexOf('}') + 1, - ); + map(response => { + const obj = response.substring(response.indexOf('{'), response.lastIndexOf('}') + 1); const translations = eval(JSON.parse(obj)); for (const [key, value] of Object.entries(translations.routes)) { @@ -28,7 +25,7 @@ export class TypescriptLoader implements TranslateLoader { } return translations.default || translations; - }), + }) ); } } diff --git a/src/app/core/interceptors/error.interceptor.spec.ts b/src/app/core/interceptors/error.interceptor.spec.ts index 29e9dfce..b7a86999 100644 --- a/src/app/core/interceptors/error.interceptor.spec.ts +++ b/src/app/core/interceptors/error.interceptor.spec.ts @@ -6,7 +6,7 @@ describe('ErrorInterceptor', () => { beforeEach(() => TestBed.configureTestingModule({ providers: [ErrorInterceptor], - }), + }) ); it('should be created', () => { diff --git a/src/app/core/interceptors/error.interceptor.ts b/src/app/core/interceptors/error.interceptor.ts index c38eac01..d822cb89 100644 --- a/src/app/core/interceptors/error.interceptor.ts +++ b/src/app/core/interceptors/error.interceptor.ts @@ -1,20 +1,12 @@ import { Injectable } from '@angular/core'; -import { - HttpRequest, - HttpHandler, - HttpEvent, - HttpInterceptor, -} from '@angular/common/http'; +import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor } from '@angular/common/http'; import { Observable } from 'rxjs'; @Injectable() export class ErrorInterceptor implements HttpInterceptor { constructor() {} - intercept( - request: HttpRequest, - next: HttpHandler, - ): Observable> { + intercept(request: HttpRequest, next: HttpHandler): Observable> { return next.handle(request); } } diff --git a/src/app/core/models/blog.model.ts b/src/app/core/models/blog.model.ts index 442ad98c..51e74030 100644 --- a/src/app/core/models/blog.model.ts +++ b/src/app/core/models/blog.model.ts @@ -8,6 +8,6 @@ export class Blog implements INewsItem { public authoredDate: Date, public content: string, public comments: number, - public likes: number, + public likes: number ) {} } diff --git a/src/app/core/models/location.model.ts b/src/app/core/models/location.model.ts index 94867e0c..9842a461 100644 --- a/src/app/core/models/location.model.ts +++ b/src/app/core/models/location.model.ts @@ -4,12 +4,7 @@ export class Location { province: string; country: string; - constructor( - address: string, - city: string, - province: string, - country: string = 'Canada', - ) { + constructor(address: string, city: string, province: string, country: string = 'Canada') { this.address = address; this.city = city; this.province = province; diff --git a/src/app/core/models/person.model.ts b/src/app/core/models/person.model.ts index cc2e7380..2d670936 100644 --- a/src/app/core/models/person.model.ts +++ b/src/app/core/models/person.model.ts @@ -5,18 +5,10 @@ export class Person { firstName: string | undefined; lastName: string | undefined; jobTitle: string | undefined; - profilePicture: string = - 'https://img.freepik.com/free-icon/user_318-563642.jpg'; + profilePicture: string = 'https://img.freepik.com/free-icon/user_318-563642.jpg'; address: Location | undefined; - constructor( - id: string, - firstName: string, - lastName: string, - jobTitle: string, - address: Location, - profilePicture: string = 'https://img.freepik.com/free-icon/user_318-563642.jpg', - ) { + constructor(id: string, firstName: string, lastName: string, jobTitle: string, address: Location, profilePicture: string = 'https://img.freepik.com/free-icon/user_318-563642.jpg') { this.id = id; this.firstName = firstName; this.lastName = lastName; diff --git a/src/app/core/models/poll.model.ts b/src/app/core/models/poll.model.ts index b9d7dc10..50eeb06a 100644 --- a/src/app/core/models/poll.model.ts +++ b/src/app/core/models/poll.model.ts @@ -8,6 +8,6 @@ export class Poll implements INewsItem { public authoredDate: Date, public content: string, public comments: number, - public likes: number, + public likes: number ) {} } diff --git a/src/app/core/models/post.model.ts b/src/app/core/models/post.model.ts index 0d837919..5fddeabe 100644 --- a/src/app/core/models/post.model.ts +++ b/src/app/core/models/post.model.ts @@ -8,6 +8,6 @@ export class Post implements INewsItem { public authoredDate: Date, public content: string, public comments: number, - public likes: number, + public likes: number ) {} } diff --git a/src/app/core/services/debounce.service.ts b/src/app/core/services/debounce.service.ts index 2cd77871..6fe949cc 100644 --- a/src/app/core/services/debounce.service.ts +++ b/src/app/core/services/debounce.service.ts @@ -11,7 +11,7 @@ export class DebounceService { debounce(fn: () => unknown, delay: number): void { this.debounceSubject.next(fn); - this.debounceSubject.pipe(debounceTime(delay)).subscribe((func) => { + this.debounceSubject.pipe(debounceTime(delay)).subscribe(func => { func(); }); } diff --git a/src/app/core/services/event.service.ts b/src/app/core/services/event.service.ts index 5d3fc4af..8ab9257b 100644 --- a/src/app/core/services/event.service.ts +++ b/src/app/core/services/event.service.ts @@ -58,7 +58,7 @@ export class EventService implements IListService { } } - const observable: Observable = new Observable((subscriber) => { + const observable: Observable = new Observable(subscriber => { setTimeout(() => { subscriber.next(response); subscriber.complete(); @@ -69,14 +69,9 @@ export class EventService implements IListService { } getMany(count: number = 10, delay: number = this.delay): Observable { - const observable: Observable = new Observable((subscriber) => { + const observable: Observable = new Observable(subscriber => { setTimeout(() => { - subscriber.next( - this.events.slice( - 0, - count > this.events.length ? this.events.length : count, - ), - ); + subscriber.next(this.events.slice(0, count > this.events.length ? this.events.length : count)); subscriber.complete(); }, delay); }); @@ -124,9 +119,7 @@ export class EventService implements IListService { const paragraphs = Math.random() * 4 + 1; for (let i = 0; i < paragraphs; i++) { - description += this.lorem.generateSentences( - Math.floor(Math.random() * 10) + 4, - ); + description += this.lorem.generateSentences(Math.floor(Math.random() * 10) + 4); if (i != paragraphs - 1) description += '

'; } @@ -135,13 +128,7 @@ export class EventService implements IListService { } private randomEventType(): string { - const eventTypes: string[] = [ - 'In Person', - 'Workshop', - 'Conference', - 'Roundtable', - 'Charity Event', - ]; + const eventTypes: string[] = ['In Person', 'Workshop', 'Conference', 'Roundtable', 'Charity Event']; return eventTypes[Math.floor(Math.random() * eventTypes.length)]; } @@ -151,10 +138,7 @@ export class EventService implements IListService { const endDate = new Date(); endDate.setFullYear(endDate.getFullYear() + 1); - return new Date( - startDate.getTime() + - Math.random() * (endDate.getTime() - startDate.getTime()), - ); + return new Date(startDate.getTime() + Math.random() * (endDate.getTime() - startDate.getTime())); } private randomLocation(): Location { diff --git a/src/app/core/services/group.service.ts b/src/app/core/services/group.service.ts index 1411a9b9..8d1015f6 100644 --- a/src/app/core/services/group.service.ts +++ b/src/app/core/services/group.service.ts @@ -39,7 +39,7 @@ export class GroupService implements IListService { } } - const observable: Observable = new Observable((subscriber) => { + const observable: Observable = new Observable(subscriber => { setTimeout(() => { subscriber.next(response); subscriber.complete(); @@ -50,14 +50,9 @@ export class GroupService implements IListService { } getMany(count: number = 10, delay: number = this.delay): Observable { - const observable: Observable = new Observable((subscriber) => { + const observable: Observable = new Observable(subscriber => { setTimeout(() => { - subscriber.next( - this.groups.slice( - 0, - count > this.groups.length ? this.groups.length : count, - ), - ); + subscriber.next(this.groups.slice(0, count > this.groups.length ? this.groups.length : count)); subscriber.complete(); }, delay); }); @@ -66,27 +61,13 @@ export class GroupService implements IListService { } private generateRandomGroupItem(): Group { - const group = new Group( - this.id.toString(), - this.randomName(), - this.randomDisplayPicture(), - this.randomGroupStatus(), - ); + const group = new Group(this.id.toString(), this.randomName(), this.randomDisplayPicture(), this.randomGroupStatus()); this.id++; return group; } private randomName(): string { - const names: string[] = [ - 'Web Accessibility', - 'Haibun', - 'OCIO Coffee Chat', - 'ESDC Coffee Chat', - 'GCcollab News', - 'GCconnex News', - 'Belly Flop Olympics', - 'Sleeping Beauties', - ]; + const names: string[] = ['Web Accessibility', 'Haibun', 'OCIO Coffee Chat', 'ESDC Coffee Chat', 'GCcollab News', 'GCconnex News', 'Belly Flop Olympics', 'Sleeping Beauties']; return names[Math.floor(Math.random() * names.length)]; } diff --git a/src/app/core/services/news.service.ts b/src/app/core/services/news.service.ts index f3202008..fdfed150 100644 --- a/src/app/core/services/news.service.ts +++ b/src/app/core/services/news.service.ts @@ -57,7 +57,7 @@ export class NewsService implements IListService { } } - const observable: Observable = new Observable((subscriber) => { + const observable: Observable = new Observable(subscriber => { setTimeout(() => { subscriber.next(response); subscriber.complete(); @@ -68,14 +68,9 @@ export class NewsService implements IListService { } getMany(count: number = 10, delay: number = 5000): Observable { - const observable: Observable = new Observable((subscriber) => { + const observable: Observable = new Observable(subscriber => { setTimeout(() => { - subscriber.next( - this.newsItems.slice( - 0, - count > this.newsItems.length ? this.newsItems.length : count, - ), - ); + subscriber.next(this.newsItems.slice(0, count > this.newsItems.length ? this.newsItems.length : count)); subscriber.complete(); }, delay); }); @@ -88,34 +83,13 @@ export class NewsService implements IListService { switch (Math.floor(Math.random() * 3)) { case 0: - newsItem = new Post( - this.id.toString(), - this.peopleService.people[this.id], - new Date(), - this.randomContent(), - Math.floor(Math.random() * 199) + 1, - Math.floor(Math.random() * 99) + 1, - ); + newsItem = new Post(this.id.toString(), this.peopleService.people[this.id], new Date(), this.randomContent(), Math.floor(Math.random() * 199) + 1, Math.floor(Math.random() * 99) + 1); break; case 1: - newsItem = new Blog( - this.id.toString(), - this.peopleService.people[this.id], - new Date(), - this.randomContent(), - Math.floor(Math.random() * 199) + 1, - Math.floor(Math.random() * 99) + 1, - ); + newsItem = new Blog(this.id.toString(), this.peopleService.people[this.id], new Date(), this.randomContent(), Math.floor(Math.random() * 199) + 1, Math.floor(Math.random() * 99) + 1); break; case 2: - newsItem = new Poll( - this.id.toString(), - this.peopleService.people[this.id], - new Date(), - this.randomContent(), - Math.floor(Math.random() * 199) + 1, - Math.floor(Math.random() * 99) + 1, - ); + newsItem = new Poll(this.id.toString(), this.peopleService.people[this.id], new Date(), this.randomContent(), Math.floor(Math.random() * 199) + 1, Math.floor(Math.random() * 99) + 1); break; } @@ -129,9 +103,7 @@ export class NewsService implements IListService { const paragraphs = Math.random() * 4 + 1; for (let i = 0; i < paragraphs; i++) { - content += this.lorem.generateSentences( - Math.floor(Math.random() * 10) + 4, - ); + content += this.lorem.generateSentences(Math.floor(Math.random() * 10) + 4); if (i != paragraphs - 1) content += '

'; } diff --git a/src/app/core/services/people.service.ts b/src/app/core/services/people.service.ts index ebf3143e..f1e66746 100644 --- a/src/app/core/services/people.service.ts +++ b/src/app/core/services/people.service.ts @@ -40,7 +40,7 @@ export class PeopleService implements IListService { } } - const observable: Observable = new Observable((subscriber) => { + const observable: Observable = new Observable(subscriber => { setTimeout(() => { subscriber.next(response); subscriber.complete(); @@ -50,18 +50,10 @@ export class PeopleService implements IListService { return observable; } - getMany( - count: number = 10, - delay: number = this.delay, - ): Observable { - const observable: Observable = new Observable((subscriber) => { + getMany(count: number = 10, delay: number = this.delay): Observable { + const observable: Observable = new Observable(subscriber => { setTimeout(() => { - subscriber.next( - this.people.slice( - 0, - count > this.people.length ? this.people.length : count, - ), - ); + subscriber.next(this.people.slice(0, count > this.people.length ? this.people.length : count)); subscriber.complete(); }, delay); }); @@ -70,48 +62,18 @@ export class PeopleService implements IListService { } private generateRandomPerson(): Person { - const person = new Person( - this.id.toString(), - this.randomFirstName(), - this.randomLastName(), - this.randomJobTitle(), - this.randomAddress(), - this.randomProfilePic(), - ); + const person = new Person(this.id.toString(), this.randomFirstName(), this.randomLastName(), this.randomJobTitle(), this.randomAddress(), this.randomProfilePic()); this.id++; return person; } private randomFirstName(): string { - const names: string[] = [ - 'Jack', - 'Jill', - 'Bo', - 'Henry', - 'Samantha', - 'Nick', - 'Fabrizio', - 'Charles', - 'Enzo', - 'Robert', - 'Allisa', - ]; + const names: string[] = ['Jack', 'Jill', 'Bo', 'Henry', 'Samantha', 'Nick', 'Fabrizio', 'Charles', 'Enzo', 'Robert', 'Allisa']; return names[Math.floor(Math.random() * names.length)]; } private randomLastName(): string { - const names: string[] = [ - 'Rose', - 'Baker', - 'McDoogle', - 'FancyPants', - 'Campbell', - 'Smith', - 'Anderson', - 'Miller', - 'Taylor', - 'Jones', - ]; + const names: string[] = ['Rose', 'Baker', 'McDoogle', 'FancyPants', 'Campbell', 'Smith', 'Anderson', 'Miller', 'Taylor', 'Jones']; return names[Math.floor(Math.random() * names.length)]; } diff --git a/src/app/core/services/title.service.spec.ts b/src/app/core/services/title.service.spec.ts index 813a1cc7..ce463238 100644 --- a/src/app/core/services/title.service.spec.ts +++ b/src/app/core/services/title.service.spec.ts @@ -17,8 +17,7 @@ describe('TitleService', () => { TranslateModule.forRoot({ loader: { provide: TranslateLoader, - useFactory: (http: HttpClient) => - new TypescriptLoader(http, 'translations'), + useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), deps: [HttpClient], }, }), diff --git a/src/app/core/services/title.service.ts b/src/app/core/services/title.service.ts index d5108079..c98830fd 100644 --- a/src/app/core/services/title.service.ts +++ b/src/app/core/services/title.service.ts @@ -14,15 +14,13 @@ export class TitleService extends TitleStrategy implements OnDestroy { constructor( private translateService: TranslateService, - private readonly title: Title, + private readonly title: Title ) { super(); - this.appTitleSub = this.translateService - .get('app.title') - .subscribe((translatedTitle) => { - this.appTitle = translatedTitle; - }); + this.appTitleSub = this.translateService.get('app.title').subscribe(translatedTitle => { + this.appTitle = translatedTitle; + }); } ngOnDestroy(): void { @@ -34,11 +32,9 @@ export class TitleService extends TitleStrategy implements OnDestroy { override updateTitle(routerState: RouterStateSnapshot): void { const title = this.buildTitle(routerState); if (title) { - this.titleSub = this.translateService - .get(title) - .subscribe((translatedTitle) => { - this.title.setTitle(this.appTitle + ' - ' + translatedTitle); - }); + this.titleSub = this.translateService.get(title).subscribe(translatedTitle => { + this.title.setTitle(this.appTitle + ' - ' + translatedTitle); + }); } else { this.title.setTitle(this.appTitle); } diff --git a/src/app/core/services/translations.service.ts b/src/app/core/services/translations.service.ts index 69dd48ab..f2a06ea8 100644 --- a/src/app/core/services/translations.service.ts +++ b/src/app/core/services/translations.service.ts @@ -10,24 +10,13 @@ function concatIfExistsPath(path: string, suffix: string): string { return path ? `${path}.${suffix}` : suffix; } -function transformObjectToPath( - suffix: string, - objectToTransformOrEndOfPath: T, - path = '', -): T { +function transformObjectToPath(suffix: string, objectToTransformOrEndOfPath: T, path = ''): T { return typeof objectToTransformOrEndOfPath === 'object' - ? Object.entries(objectToTransformOrEndOfPath).reduce( - (objectToTransform, [key, value]) => { - objectToTransform[key as keyof T] = transformObjectToPath( - key, - value, - concatIfExistsPath(path, suffix), - ); + ? Object.entries(objectToTransformOrEndOfPath).reduce((objectToTransform, [key, value]) => { + objectToTransform[key as keyof T] = transformObjectToPath(key, value, concatIfExistsPath(path, suffix)); - return objectToTransform; - }, - {} as T, - ) + return objectToTransform; + }, {} as T) : (concatIfExistsPath(path, suffix) as T); } diff --git a/src/app/features/events/components/event-card/event-card.component.html b/src/app/features/events/components/event-card/event-card.component.html index 1bffa56b..6841ba49 100644 --- a/src/app/features/events/components/event-card/event-card.component.html +++ b/src/app/features/events/components/event-card/event-card.component.html @@ -1,10 +1,6 @@ - +
-
+
{{ model?.title }}
@@ -33,12 +23,7 @@ {{ model?.eventType }}
- +
@@ -46,73 +31,29 @@ class="event-confirm" [ngClass]="model?.declined ? 'disabled' : ''" [matButtonType]="materialButtonType.Icon" - [tooltip]=" - (model?.confirmed - ? translations.eventCard.confirm.tooltip_off - : translations.eventCard.confirm.tooltip_on - ) | translate - " - [ariaLabel]=" - (model?.confirmed - ? translations.eventCard.confirm.aria_off - : translations.eventCard.confirm.aria_on - ) | translate - " + [tooltip]="(model?.confirmed ? translations.eventCard.confirm.tooltip_off : translations.eventCard.confirm.tooltip_on) | translate" + [ariaLabel]="(model?.confirmed ? translations.eventCard.confirm.aria_off : translations.eventCard.confirm.aria_on) | translate" [tooltipDirection]="tooltipDirection.Above" [disabled]="loading || model?.canceled === true || isPast()" [theme]="model?.declined ? 'disabled' : 'secondary-2'" [clickFunc]="confirmEventCallback" > - - - + + - - - + +
@@ -124,18 +65,8 @@
- {{ translations.eventCard.alt | translate }} - + {{ translations.eventCard.alt | translate }} +
@@ -150,48 +81,24 @@ >
-
+
- {{ - translations.eventCard.canceled | translate | uppercase - }} {{ model?.title }} + {{ translations.eventCard.canceled | translate | uppercase }} {{ model?.title }}
- {{ translations.eventCard.organizer | translate }}: {{ model?.organizer }} + {{ translations.eventCard.organizer | translate }}: {{ model?.organizer }}
- {{ translations.eventCard.location | translate }}: {{ model?.location?.address }} + {{ translations.eventCard.location | translate }}: {{ model?.location?.address }}
- +
- + diff --git a/src/app/features/events/components/event-card/event-card.component.scss b/src/app/features/events/components/event-card/event-card.component.scss index 5a43f379..9bbbae95 100644 --- a/src/app/features/events/components/event-card/event-card.component.scss +++ b/src/app/features/events/components/event-card/event-card.component.scss @@ -1,4 +1,4 @@ -@import "../../../../../assets//scss/partials/colors"; +@import '../../../../../assets//scss/partials/colors'; :host { mat-card { diff --git a/src/app/features/events/components/event-card/event-card.component.spec.ts b/src/app/features/events/components/event-card/event-card.component.spec.ts index ed19d88f..585977f5 100644 --- a/src/app/features/events/components/event-card/event-card.component.spec.ts +++ b/src/app/features/events/components/event-card/event-card.component.spec.ts @@ -1,11 +1,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { EventCardComponent } from './event-card.component'; -import { - TranslateLoader, - TranslateModule, - TranslateService, -} from '@ngx-translate/core'; +import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core'; import { HttpClient, HttpClientModule } from '@angular/common/http'; import { TypescriptLoader } from 'src/app/core/helpers/typescript-loader'; @@ -21,8 +17,7 @@ describe('EventCardComponent', () => { TranslateModule.forRoot({ loader: { provide: TranslateLoader, - useFactory: (http: HttpClient) => - new TypescriptLoader(http, 'translations'), + useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), deps: [HttpClient], }, }), diff --git a/src/app/features/events/components/event-card/event-card.component.ts b/src/app/features/events/components/event-card/event-card.component.ts index e0e538cc..abbff592 100644 --- a/src/app/features/events/components/event-card/event-card.component.ts +++ b/src/app/features/events/components/event-card/event-card.component.ts @@ -1,10 +1,4 @@ -import { - ChangeDetectionStrategy, - Component, - EventEmitter, - Input, - Output, -} from '@angular/core'; +import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core'; import { Event } from '../../models/event'; import { Translations } from 'src/app/core/services/translations.service'; import { MaterialButtonType } from 'src/app/shared/models/material-button-type'; @@ -36,15 +30,14 @@ export class EventCardComponent implements ICardComponent { constructor( public translations: Translations, - private router: Router, + private router: Router ) {} confirmEvent() { if (this.model) { this.model.confirmed = !this.model.confirmed; - if (this.model.confirmed && this.model.declined) - this.model.declined = false; + if (this.model.confirmed && this.model.declined) this.model.declined = false; if (this.model.confirmed) this.confirm.emit(this.model); } @@ -54,16 +47,14 @@ export class EventCardComponent implements ICardComponent { if (this.model) { this.model.declined = !this.model.declined; - if (this.model.declined && this.model.confirmed) - this.model.confirmed = false; + if (this.model.declined && this.model.confirmed) this.model.confirmed = false; if (this.model.declined) this.decline.emit(this.model); } } clickEvent() { - if (this.model) - this.router.navigateByUrl(CoreRoutes.Events + '/' + this.model.id); + if (this.model) this.router.navigateByUrl(CoreRoutes.Events + '/' + this.model.id); } isPast(): boolean { diff --git a/src/app/features/events/components/event-list/event-list.component.html b/src/app/features/events/components/event-list/event-list.component.html index bac6d7a6..20b97e68 100644 --- a/src/app/features/events/components/event-list/event-list.component.html +++ b/src/app/features/events/components/event-list/event-list.component.html @@ -1,12 +1,6 @@
- - +
@@ -15,7 +9,5 @@
-
- There is nothing to display. -
+
There is nothing to display.
diff --git a/src/app/features/events/components/event-list/event-list.component.ts b/src/app/features/events/components/event-list/event-list.component.ts index ffde1efc..3699d9da 100644 --- a/src/app/features/events/components/event-list/event-list.component.ts +++ b/src/app/features/events/components/event-list/event-list.component.ts @@ -1,10 +1,4 @@ -import { - ChangeDetectionStrategy, - Component, - EventEmitter, - Input, - Output, -} from '@angular/core'; +import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core'; import { Event } from '../../models/event'; import { CardSize } from 'src/app/shared/models/card-size'; diff --git a/src/app/features/events/components/event/event.component.html b/src/app/features/events/components/event/event.component.html index b295c2a2..79d18544 100644 --- a/src/app/features/events/components/event/event.component.html +++ b/src/app/features/events/components/event/event.component.html @@ -1,5 +1,4 @@ - - + {{ model?.title }} - +
@@ -42,28 +35,14 @@

- - +

@@ -91,19 +70,13 @@

{{ translations.event.date_time | translate }}

- {{ model?.startDate | date: "mediumDate" }} + {{ model?.startDate | date: 'mediumDate' }}

- {{ model?.startDate | date: "h a" }} - - {{ model?.endDate | date: "h a" }} + {{ model?.startDate | date: 'h a' }} - + {{ model?.endDate | date: 'h a' }}

- +
@@ -117,16 +90,8 @@

{{ model?.location?.address }}

-

- {{ model?.location?.city }}, {{ model?.location?.province }} -

- +

{{ model?.location?.city }}, {{ model?.location?.province }}

+
@@ -137,22 +102,11 @@

{{ translations.event.host | translate }}

-

- {{ this.model?.author?.firstName }} {{ this.model?.author?.lastName }} -

- +

{{ this.model?.author?.firstName }} {{ this.model?.author?.lastName }}

+
{{ this.model?.group?.name }} - +
@@ -162,13 +116,7 @@

{{ translations.event.event_description | translate }}

- +
@@ -231,22 +179,12 @@

{{ translations.event.event_registration | translate }}

- + {{ translations.event.form.add_calendar | translate }} - + {{ translations.event.form.agree_with | translate }} {{ translations.event.form.terms_conditions | translate }} @@ -259,9 +197,7 @@

{{ translations.event.event_registration | translate }}

id="gcc-event-register-btn" [name]="'registerBtn'" [disabled]="loading || !formGroup.valid || isPast()" - [ngClass]=" - loading || !formGroup.valid || isPast() ? 'disabled' : 'enabled' - " + [ngClass]="loading || !formGroup.valid || isPast() ? 'disabled' : 'enabled'" class="registerBtn" > {{ translations.event.form.register | translate }} diff --git a/src/app/features/events/components/event/event.component.scss b/src/app/features/events/components/event/event.component.scss index 00cfd99d..1a233a18 100644 --- a/src/app/features/events/components/event/event.component.scss +++ b/src/app/features/events/components/event/event.component.scss @@ -1,6 +1,6 @@ -@import "../../../../../assets/scss/partials/header"; -@import "../../../../../assets//scss/partials/layout"; -@import "../../../../../assets//scss/partials/colors"; +@import '../../../../../assets/scss/partials/header'; +@import '../../../../../assets//scss/partials/layout'; +@import '../../../../../assets//scss/partials/colors'; $calendar-size: 120px; diff --git a/src/app/features/events/components/event/event.component.spec.ts b/src/app/features/events/components/event/event.component.spec.ts index 4b6e78c8..5b205d48 100644 --- a/src/app/features/events/components/event/event.component.spec.ts +++ b/src/app/features/events/components/event/event.component.spec.ts @@ -1,11 +1,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { EventComponent } from './event.component'; -import { - TranslateLoader, - TranslateModule, - TranslateService, -} from '@ngx-translate/core'; +import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core'; import { HttpClient, HttpClientModule } from '@angular/common/http'; import { TypescriptLoader } from 'src/app/core/helpers/typescript-loader'; import { RouterTestingModule } from '@angular/router/testing'; @@ -22,8 +18,7 @@ describe('EventComponent', () => { TranslateModule.forRoot({ loader: { provide: TranslateLoader, - useFactory: (http: HttpClient) => - new TypescriptLoader(http, 'translations'), + useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), deps: [HttpClient], }, }), diff --git a/src/app/features/events/components/event/event.component.ts b/src/app/features/events/components/event/event.component.ts index fad68e65..1c0245f3 100644 --- a/src/app/features/events/components/event/event.component.ts +++ b/src/app/features/events/components/event/event.component.ts @@ -10,13 +10,7 @@ import { InputType } from 'src/app/shared/models/input-type'; import { ActivatedRoute } from '@angular/router'; import { EventService } from 'src/app/core/services/event.service'; import { CoreRoutes } from 'src/app/core/constants/routes.constants'; -import { - FormControl, - FormGroup, - FormGroupDirective, - NgForm, - Validators, -} from '@angular/forms'; +import { FormControl, FormGroup, FormGroupDirective, NgForm, Validators } from '@angular/forms'; import { ErrorStateMatcher } from '@angular/material/core'; @Component({ @@ -51,17 +45,9 @@ export class EventComponent implements OnInit { }; nameFormControl = new FormControl(this.formModel.name, [Validators.required]); - emailFormControl = new FormControl(this.formModel.email, [ - Validators.required, - Validators.email, - ]); - emailConfirmFormControl = new FormControl(this.formModel.emailConfirm, [ - Validators.required, - Validators.email, - ]); - occupationFormControl = new FormControl(this.formModel.occupation, [ - Validators.required, - ]); + emailFormControl = new FormControl(this.formModel.email, [Validators.required, Validators.email]); + emailConfirmFormControl = new FormControl(this.formModel.emailConfirm, [Validators.required, Validators.email]); + occupationFormControl = new FormControl(this.formModel.occupation, [Validators.required]); formGroup = new FormGroup({}); @@ -69,7 +55,7 @@ export class EventComponent implements OnInit { constructor( public translations: Translations, - private viewportScroller: ViewportScroller, + private viewportScroller: ViewportScroller ) { this.formGroup.addControl('name', this.nameFormControl); this.formGroup.addControl('email', this.emailFormControl); @@ -79,13 +65,11 @@ export class EventComponent implements OnInit { ngOnInit(): void { if (!this.model) { - this.eventService - .get(this.route.snapshot.paramMap.get('id'), 3000) - .subscribe((event) => { - this.model = event; - this.banner = this.createBanner(this.model); - this.loading = false; - }); + this.eventService.get(this.route.snapshot.paramMap.get('id'), 3000).subscribe(event => { + this.model = event; + this.banner = this.createBanner(this.model); + this.loading = false; + }); } else { this.banner = this.createBanner(this.model); this.loading = false; @@ -112,15 +96,8 @@ export class EventComponent implements OnInit { /** Error when invalid control is dirty, touched, or submitted. */ export class MyErrorStateMatcher implements ErrorStateMatcher { - isErrorState( - control: FormControl | null, - form: FormGroupDirective | NgForm | null, - ): boolean { + isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean { const isSubmitted = form && form.submitted; - return !!( - control && - control.invalid && - (control.dirty || control.touched || isSubmitted) - ); + return !!(control && control.invalid && (control.dirty || control.touched || isSubmitted)); } } diff --git a/src/app/features/events/events.component.html b/src/app/features/events/events.component.html index 7d7c7b87..b098e41a 100644 --- a/src/app/features/events/events.component.html +++ b/src/app/features/events/events.component.html @@ -6,9 +6,7 @@
- +
@@ -27,28 +25,10 @@
- - +
- - +
- - +
- - +
- - +
diff --git a/src/app/features/events/events.component.spec.ts b/src/app/features/events/events.component.spec.ts index 9c6c462d..aa7587e1 100644 --- a/src/app/features/events/events.component.spec.ts +++ b/src/app/features/events/events.component.spec.ts @@ -1,11 +1,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { EventsComponent } from './events.component'; -import { - TranslateLoader, - TranslateModule, - TranslateService, -} from '@ngx-translate/core'; +import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core'; import { FormControlPipe } from 'src/app/shared/pipes/form-control/form-control.pipe'; import { HttpClient, HttpClientModule } from '@angular/common/http'; import { TypescriptLoader } from 'src/app/core/helpers/typescript-loader'; @@ -23,8 +19,7 @@ describe('EventsComponent', () => { TranslateModule.forRoot({ loader: { provide: TranslateLoader, - useFactory: (http: HttpClient) => - new TypescriptLoader(http, 'translations'), + useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), deps: [HttpClient], }, }), diff --git a/src/app/features/events/events.component.ts b/src/app/features/events/events.component.ts index d4e92d9a..6aab135d 100644 --- a/src/app/features/events/events.component.ts +++ b/src/app/features/events/events.component.ts @@ -20,7 +20,7 @@ export class EventsComponent implements OnInit { constructor( public translations: Translations, - public eventService: EventService, + public eventService: EventService ) {} ngOnInit(): void { diff --git a/src/app/features/events/resolvers/event.resolver.ts b/src/app/features/events/resolvers/event.resolver.ts index 78d7a19e..47ea7d9c 100644 --- a/src/app/features/events/resolvers/event.resolver.ts +++ b/src/app/features/events/resolvers/event.resolver.ts @@ -1,19 +1,11 @@ import { inject } from '@angular/core'; -import { - ActivatedRouteSnapshot, - ResolveFn, - RouterStateSnapshot, -} from '@angular/router'; +import { ActivatedRouteSnapshot, ResolveFn, RouterStateSnapshot } from '@angular/router'; import { EventService } from 'src/app/core/services/event.service'; import { Event } from '../models/event'; import { Observable, filter, take } from 'rxjs'; -export const EventResolver: ResolveFn = ( - route: ActivatedRouteSnapshot, - state: RouterStateSnapshot, - eventService: EventService = inject(EventService), -): Observable => +export const EventResolver: ResolveFn = (route: ActivatedRouteSnapshot, state: RouterStateSnapshot, eventService: EventService = inject(EventService)): Observable => eventService.mockGetEvent(route.paramMap.get('id'), 1500).pipe( filter((event: Event) => !!event), - take(1), + take(1) ); diff --git a/src/app/features/groups/components/group-card/group-card.component.html b/src/app/features/groups/components/group-card/group-card.component.html index 1044a702..17c3b79a 100644 --- a/src/app/features/groups/components/group-card/group-card.component.html +++ b/src/app/features/groups/components/group-card/group-card.component.html @@ -2,33 +2,19 @@
- +
-
+
{{ model?.name }}
{{ model?.groupStatus }}
- + diff --git a/src/app/features/groups/components/group-card/group-card.component.scss b/src/app/features/groups/components/group-card/group-card.component.scss index 916d4acc..bd0f48e4 100644 --- a/src/app/features/groups/components/group-card/group-card.component.scss +++ b/src/app/features/groups/components/group-card/group-card.component.scss @@ -1,4 +1,4 @@ -@import "../../../../../assets//scss/partials/colors"; +@import '../../../../../assets//scss/partials/colors'; $title-padding: 90px; diff --git a/src/app/features/groups/components/group-card/group-card.component.spec.ts b/src/app/features/groups/components/group-card/group-card.component.spec.ts index e079432b..e02e361d 100644 --- a/src/app/features/groups/components/group-card/group-card.component.spec.ts +++ b/src/app/features/groups/components/group-card/group-card.component.spec.ts @@ -1,11 +1,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { GroupCardComponent } from './group-card.component'; -import { - TranslateLoader, - TranslateModule, - TranslateService, -} from '@ngx-translate/core'; +import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core'; import { HttpClient, HttpClientModule } from '@angular/common/http'; import { TypescriptLoader } from 'src/app/core/helpers/typescript-loader'; @@ -21,8 +17,7 @@ describe('GroupCardComponent', () => { TranslateModule.forRoot({ loader: { provide: TranslateLoader, - useFactory: (http: HttpClient) => - new TypescriptLoader(http, 'translations'), + useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), deps: [HttpClient], }, }), diff --git a/src/app/features/groups/components/group-card/group-card.component.ts b/src/app/features/groups/components/group-card/group-card.component.ts index d2acb5ab..56b8a857 100644 --- a/src/app/features/groups/components/group-card/group-card.component.ts +++ b/src/app/features/groups/components/group-card/group-card.component.ts @@ -21,7 +21,7 @@ export class GroupCardComponent implements ICardComponent { constructor( public translations: Translations, - private router: Router, + private router: Router ) {} clickEvent() { diff --git a/src/app/features/groups/components/group-list/group-list.component.html b/src/app/features/groups/components/group-list/group-list.component.html index 512f8b0c..35d75b0b 100644 --- a/src/app/features/groups/components/group-list/group-list.component.html +++ b/src/app/features/groups/components/group-list/group-list.component.html @@ -9,7 +9,5 @@
-
- There is nothing to display. -
+
There is nothing to display.
diff --git a/src/app/features/groups/models/group.ts b/src/app/features/groups/models/group.ts index d5c05340..cf53ff6c 100644 --- a/src/app/features/groups/models/group.ts +++ b/src/app/features/groups/models/group.ts @@ -9,12 +9,7 @@ export class Group { displayPicture: string | undefined; groupStatus: GroupStatus | undefined; - constructor( - id: string, - name: string, - displayPicture: string, - groupStatus: GroupStatus = GroupStatus.Open, - ) { + constructor(id: string, name: string, displayPicture: string, groupStatus: GroupStatus = GroupStatus.Open) { this.id = id; this.name = name; this.displayPicture = displayPicture; diff --git a/src/app/features/home/home.component.html b/src/app/features/home/home.component.html index ec62c0c6..f8fc9e6c 100644 --- a/src/app/features/home/home.component.html +++ b/src/app/features/home/home.component.html @@ -11,44 +11,24 @@
- +
-
+
- + - - +
- - +
{{ translations.features.home.moreEvents | translate }} @@ -58,13 +38,7 @@
- - +
@@ -75,8 +49,7 @@
- - +
diff --git a/src/app/features/home/home.component.scss b/src/app/features/home/home.component.scss index c843d509..8bb839b8 100644 --- a/src/app/features/home/home.component.scss +++ b/src/app/features/home/home.component.scss @@ -1,5 +1,5 @@ -@import "../../../assets/scss/partials/layout"; -@import "../../../assets/scss/partials/colors"; +@import '../../../assets/scss/partials/layout'; +@import '../../../assets/scss/partials/colors'; :host { .news-container { diff --git a/src/app/features/home/home.component.spec.ts b/src/app/features/home/home.component.spec.ts index 7540ad0d..2b597fa5 100644 --- a/src/app/features/home/home.component.spec.ts +++ b/src/app/features/home/home.component.spec.ts @@ -19,8 +19,7 @@ describe('HomeComponent', () => { TranslateModule.forRoot({ loader: { provide: TranslateLoader, - useFactory: (http: HttpClient) => - new TypescriptLoader(http, 'translations'), + useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), deps: [HttpClient], }, }), diff --git a/src/app/features/home/home.component.ts b/src/app/features/home/home.component.ts index 9e0dd97d..352b9f88 100644 --- a/src/app/features/home/home.component.ts +++ b/src/app/features/home/home.component.ts @@ -46,7 +46,7 @@ export class HomeComponent implements OnInit { public newsService: NewsService, public eventService: EventService, public peopleService: PeopleService, - public groupService: GroupService, + public groupService: GroupService ) {} ngOnInit(): void { diff --git a/src/app/features/home/home.module.ts b/src/app/features/home/home.module.ts index 398416ef..608fb4ad 100644 --- a/src/app/features/home/home.module.ts +++ b/src/app/features/home/home.module.ts @@ -11,14 +11,6 @@ import { ProfileModule } from '../profile/profile.module'; @NgModule({ declarations: [HomeComponent], - imports: [ - CommonModule, - HomeRoutingModule, - SharedModule, - NewsFeedModule, - GroupsModule, - EventsModule, - ProfileModule, - ], + imports: [CommonModule, HomeRoutingModule, SharedModule, NewsFeedModule, GroupsModule, EventsModule, ProfileModule], }) export class HomeModule {} diff --git a/src/app/features/login/login.component.spec.ts b/src/app/features/login/login.component.spec.ts index 892bb7da..bdd08811 100644 --- a/src/app/features/login/login.component.spec.ts +++ b/src/app/features/login/login.component.spec.ts @@ -18,8 +18,7 @@ describe('LoginComponent', () => { TranslateModule.forRoot({ loader: { provide: TranslateLoader, - useFactory: (http: HttpClient) => - new TypescriptLoader(http, 'translations'), + useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), deps: [HttpClient], }, }), diff --git a/src/app/features/news-feed/components/news-card/news-card.component.html b/src/app/features/news-feed/components/news-card/news-card.component.html index ac77736f..8485cc88 100644 --- a/src/app/features/news-feed/components/news-card/news-card.component.html +++ b/src/app/features/news-feed/components/news-card/news-card.component.html @@ -1,21 +1,16 @@
- +
- - - - + +
- {{ model?.author?.firstName + " " + model?.author?.lastName }} + {{ model?.author?.firstName + ' ' + model?.author?.lastName }} {{ model?.author?.jobTitle }} @@ -37,13 +32,7 @@ - - + @@ -51,20 +40,12 @@ - - - {{ - model ? (model.likes > 0 ? model.likes + (liked ? 1 : 0) : "") : "" - }} + + {{ model ? (model.likes > 0 ? model.likes + (liked ? 1 : 0) : '') : '' }} - - +
diff --git a/src/app/features/news-feed/components/news-card/news-card.component.scss b/src/app/features/news-feed/components/news-card/news-card.component.scss index 10c310a8..f2807615 100644 --- a/src/app/features/news-feed/components/news-card/news-card.component.scss +++ b/src/app/features/news-feed/components/news-card/news-card.component.scss @@ -1,5 +1,5 @@ -@import "../../../../../assets//scss/partials/colors"; -@import "../../../../../assets//scss/partials/font-weights"; +@import '../../../../../assets//scss/partials/colors'; +@import '../../../../../assets//scss/partials/font-weights'; $title-padding: 90px; diff --git a/src/app/features/news-feed/components/news-card/news-card.component.spec.ts b/src/app/features/news-feed/components/news-card/news-card.component.spec.ts index 5fbdb561..ecf20b6c 100644 --- a/src/app/features/news-feed/components/news-card/news-card.component.spec.ts +++ b/src/app/features/news-feed/components/news-card/news-card.component.spec.ts @@ -1,11 +1,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { NewsCardComponent } from './news-card.component'; -import { - TranslateLoader, - TranslateModule, - TranslateService, -} from '@ngx-translate/core'; +import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core'; import { HttpClient, HttpClientModule } from '@angular/common/http'; import { TypescriptLoader } from 'src/app/core/helpers/typescript-loader'; @@ -21,8 +17,7 @@ describe('NewsCardComponent', () => { TranslateModule.forRoot({ loader: { provide: TranslateLoader, - useFactory: (http: HttpClient) => - new TypescriptLoader(http, 'translations'), + useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), deps: [HttpClient], }, }), diff --git a/src/app/features/news-feed/components/news-list/news-list.component.html b/src/app/features/news-feed/components/news-list/news-list.component.html index 12820783..158e20e7 100644 --- a/src/app/features/news-feed/components/news-list/news-list.component.html +++ b/src/app/features/news-feed/components/news-list/news-list.component.html @@ -3,9 +3,7 @@
-
- There is nothing to display. -
+
There is nothing to display.
diff --git a/src/app/features/profile/components/post/post.component.html b/src/app/features/profile/components/post/post.component.html index 3697e05c..2fca0e4d 100644 --- a/src/app/features/profile/components/post/post.component.html +++ b/src/app/features/profile/components/post/post.component.html @@ -4,15 +4,13 @@
- - - - + +
- {{ profile.firstName + " " + profile.lastName }} + {{ profile.firstName + ' ' + profile.lastName }} {{ profile.jobTitle }} @@ -20,13 +18,7 @@ -
+
{{ translations.forms.placeholder | translate }}
@@ -42,64 +34,37 @@ - - + + - + - + - + - - +
diff --git a/src/app/features/profile/components/post/post.component.scss b/src/app/features/profile/components/post/post.component.scss index 577f72d2..e146cabe 100644 --- a/src/app/features/profile/components/post/post.component.scss +++ b/src/app/features/profile/components/post/post.component.scss @@ -1,5 +1,5 @@ -@import "../../../../../assets//scss/partials/colors"; -@import "../../../../../assets//scss/partials/font-weights"; +@import '../../../../../assets//scss/partials/colors'; +@import '../../../../../assets//scss/partials/font-weights'; $title-padding: 90px; diff --git a/src/app/features/profile/components/post/post.component.spec.ts b/src/app/features/profile/components/post/post.component.spec.ts index 498ec8e4..ff3d208f 100644 --- a/src/app/features/profile/components/post/post.component.spec.ts +++ b/src/app/features/profile/components/post/post.component.spec.ts @@ -1,11 +1,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { PostComponent } from './post.component'; -import { - TranslateLoader, - TranslateModule, - TranslateService, -} from '@ngx-translate/core'; +import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core'; import { HttpClient, HttpClientModule } from '@angular/common/http'; import { TypescriptLoader } from 'src/app/core/helpers/typescript-loader'; import { RouterTestingModule } from '@angular/router/testing'; @@ -22,8 +18,7 @@ describe('PostComponent', () => { TranslateModule.forRoot({ loader: { provide: TranslateLoader, - useFactory: (http: HttpClient) => - new TypescriptLoader(http, 'translations'), + useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), deps: [HttpClient], }, }), diff --git a/src/app/features/profile/components/post/post.component.ts b/src/app/features/profile/components/post/post.component.ts index 6673eb76..d3024bbf 100644 --- a/src/app/features/profile/components/post/post.component.ts +++ b/src/app/features/profile/components/post/post.component.ts @@ -16,12 +16,7 @@ export class PostComponent implements OnInit, OnDestroy { @Input() loading: boolean = false; @Input() editing: boolean = false; - formGroups: FormGroup[] = [ - new FormGroup({}), - new FormGroup({}), - new FormGroup({}), - new FormGroup({}), - ]; + formGroups: FormGroup[] = [new FormGroup({}), new FormGroup({}), new FormGroup({}), new FormGroup({})]; formWatchSubs: Subscription[] = []; formChanges: boolean[] = []; @@ -33,24 +28,24 @@ export class PostComponent implements OnInit, OnDestroy { constructor( public translations: Translations, - private sessionStorageService: SessionStorageService, + private sessionStorageService: SessionStorageService ) {} ngOnInit(): void { - this.formGroups.forEach((formGroup) => { + this.formGroups.forEach(formGroup => { // Create a boolean to track when a FormGroup value has changed this.formChanges.push(false); // Create a subscription that watches each FormGroup for changes this.formWatchSubs.push( formGroup.valueChanges.subscribe(() => { this.formChanges[this.selectedIndex] = true; - }), + }) ); }); } ngOnDestroy(): void { - this.formWatchSubs.forEach((formWatch) => { + this.formWatchSubs.forEach(formWatch => { if (formWatch) formWatch.unsubscribe(); }); } @@ -61,12 +56,7 @@ export class PostComponent implements OnInit, OnDestroy { } toggleEditing(event: Event) { - if ( - (!this.creating && - event instanceof KeyboardEvent && - (event.key == 'Enter' || event.key == 'Space')) || - event instanceof KeyboardEvent == false - ) { + if ((!this.creating && event instanceof KeyboardEvent && (event.key == 'Enter' || event.key == 'Space')) || event instanceof KeyboardEvent == false) { this.editing = !this.editing; this.selectedIndex = 0; this.selectedForm = this.formGroups[this.selectedIndex]; @@ -74,7 +64,7 @@ export class PostComponent implements OnInit, OnDestroy { } formHasValues(formGroup: FormGroup): boolean { - return Object.keys(formGroup.value).some((k) => !!formGroup.value[k]); + return Object.keys(formGroup.value).some(k => !!formGroup.value[k]); } formReady(formGroup: FormGroup): boolean { @@ -89,20 +79,13 @@ export class PostComponent implements OnInit, OnDestroy { } save(): void { - const formGroupJSON = JSON.stringify( - this.formGroups[this.selectedIndex].value, - ); - this.sessionStorageService.write( - 'gccollab-make-a-' + this.getTypeFromIndex(this.selectedIndex), - formGroupJSON, - ); + const formGroupJSON = JSON.stringify(this.formGroups[this.selectedIndex].value); + this.sessionStorageService.write('gccollab-make-a-' + this.getTypeFromIndex(this.selectedIndex), formGroupJSON); this.formChanges[this.selectedIndex] = false; } load(): void { - const savedFormGroupJSON = this.sessionStorageService.read( - 'gccollab-make-a-' + this.getTypeFromIndex(this.selectedIndex), - ); + const savedFormGroupJSON = this.sessionStorageService.read('gccollab-make-a-' + this.getTypeFromIndex(this.selectedIndex)); if (savedFormGroupJSON) { const savedFormData = JSON.parse(savedFormGroupJSON); for (const [key] of Object.entries(this.selectedForm.controls)) { @@ -116,9 +99,7 @@ export class PostComponent implements OnInit, OnDestroy { if (this.selectedForm.status === 'VALID') { this.creating = true; this.selectedForm.disable(); - this.sessionStorageService.remove( - 'gccollab-make-a-' + this.getTypeFromIndex(this.selectedIndex), - ); + this.sessionStorageService.remove('gccollab-make-a-' + this.getTypeFromIndex(this.selectedIndex)); // TODO: Setup mock service for posting forms setTimeout(() => { diff --git a/src/app/features/profile/components/profile-card/profile-card.component.html b/src/app/features/profile/components/profile-card/profile-card.component.html index fad44f8e..53cbda5c 100644 --- a/src/app/features/profile/components/profile-card/profile-card.component.html +++ b/src/app/features/profile/components/profile-card/profile-card.component.html @@ -7,17 +7,12 @@
- {{ model?.firstName + " " + model?.lastName }} + {{ model?.firstName + ' ' + model?.lastName }}
{{ model?.jobTitle }}
- +
@@ -25,70 +20,30 @@ class="confirm" [ngClass]="declined ? 'disabled' : ''" [matButtonType]="materialButtonType.Icon" - [tooltip]=" - (confirmed - ? translations.profileCard.confirm.tooltip_off - : translations.profileCard.confirm.tooltip_on - ) | translate - " - [ariaLabel]=" - (confirmed - ? translations.profileCard.confirm.aria_off - : translations.profileCard.confirm.aria_on - ) | translate - " + [tooltip]="(confirmed ? translations.profileCard.confirm.tooltip_off : translations.profileCard.confirm.tooltip_on) | translate" + [ariaLabel]="(confirmed ? translations.profileCard.confirm.aria_off : translations.profileCard.confirm.aria_on) | translate" [tooltipDirection]="tooltipDirection.Above" [disabled]="loading" [theme]="declined ? 'disabled' : 'secondary-2'" (click)="clickConfirm()" > - - - + +
- - - + + diff --git a/src/app/features/profile/components/profile-card/profile-card.component.scss b/src/app/features/profile/components/profile-card/profile-card.component.scss index 6ee8ed8e..6b2d8e13 100644 --- a/src/app/features/profile/components/profile-card/profile-card.component.scss +++ b/src/app/features/profile/components/profile-card/profile-card.component.scss @@ -1,4 +1,4 @@ -@import "../../../../../assets//scss/partials/colors"; +@import '../../../../../assets//scss/partials/colors'; :host { mat-card { diff --git a/src/app/features/profile/components/profile-card/profile-card.component.spec.ts b/src/app/features/profile/components/profile-card/profile-card.component.spec.ts index 310cc222..627718ef 100644 --- a/src/app/features/profile/components/profile-card/profile-card.component.spec.ts +++ b/src/app/features/profile/components/profile-card/profile-card.component.spec.ts @@ -1,11 +1,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ProfileCardComponent } from './profile-card.component'; -import { - TranslateLoader, - TranslateModule, - TranslateService, -} from '@ngx-translate/core'; +import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core'; import { HttpClient, HttpClientModule } from '@angular/common/http'; import { TypescriptLoader } from 'src/app/core/helpers/typescript-loader'; @@ -21,8 +17,7 @@ describe('ProfileCardComponent', () => { TranslateModule.forRoot({ loader: { provide: TranslateLoader, - useFactory: (http: HttpClient) => - new TypescriptLoader(http, 'translations'), + useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), deps: [HttpClient], }, }), diff --git a/src/app/features/profile/components/profile-card/profile-card.component.ts b/src/app/features/profile/components/profile-card/profile-card.component.ts index 172af735..39cea6ec 100644 --- a/src/app/features/profile/components/profile-card/profile-card.component.ts +++ b/src/app/features/profile/components/profile-card/profile-card.component.ts @@ -1,10 +1,4 @@ -import { - ChangeDetectionStrategy, - Component, - EventEmitter, - Input, - Output, -} from '@angular/core'; +import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core'; import { Router } from '@angular/router'; import { CoreRoutes } from 'src/app/core/constants/routes.constants'; import { ICardComponent } from 'src/app/core/interfaces/card-component.interface'; @@ -37,7 +31,7 @@ export class ProfileCardComponent implements ICardComponent { constructor( public translations: Translations, - private router: Router, + private router: Router ) {} clickConfirm() { diff --git a/src/app/features/profile/components/profile-list/profile-list.component.html b/src/app/features/profile/components/profile-list/profile-list.component.html index dfdd22f7..1617af54 100644 --- a/src/app/features/profile/components/profile-list/profile-list.component.html +++ b/src/app/features/profile/components/profile-list/profile-list.component.html @@ -1,11 +1,6 @@
- - +
@@ -14,7 +9,5 @@
-
- There is nothing to display. -
+
There is nothing to display.
diff --git a/src/app/features/profile/components/profile-list/profile-list.component.ts b/src/app/features/profile/components/profile-list/profile-list.component.ts index 44e61545..968c6a8b 100644 --- a/src/app/features/profile/components/profile-list/profile-list.component.ts +++ b/src/app/features/profile/components/profile-list/profile-list.component.ts @@ -1,10 +1,4 @@ -import { - ChangeDetectionStrategy, - Component, - EventEmitter, - Input, - Output, -} from '@angular/core'; +import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core'; import { Person } from 'src/app/core/models/person.model'; @Component({ diff --git a/src/app/features/profile/profile.module.ts b/src/app/features/profile/profile.module.ts index b223369d..a4134113 100644 --- a/src/app/features/profile/profile.module.ts +++ b/src/app/features/profile/profile.module.ts @@ -11,13 +11,7 @@ import { PostComponent } from './components/post/post.component'; @NgModule({ declarations: [ProfileCardComponent, ProfileListComponent, PostComponent], - imports: [ - CommonModule, - ProfileRoutingModule, - SharedModule, - MatCardModule, - MatTabsModule, - ], + imports: [CommonModule, ProfileRoutingModule, SharedModule, MatCardModule, MatTabsModule], exports: [ProfileCardComponent, ProfileListComponent, PostComponent], }) export class ProfileModule {} diff --git a/src/app/shared/components/banner/banner.component.html b/src/app/shared/components/banner/banner.component.html index 31502da6..f655a442 100644 --- a/src/app/shared/components/banner/banner.component.html +++ b/src/app/shared/components/banner/banner.component.html @@ -1,15 +1,6 @@ - - + diff --git a/src/app/shared/components/calendar-button/calendar-button.component.scss b/src/app/shared/components/calendar-button/calendar-button.component.scss index 6ddeb3ec..3f170b19 100644 --- a/src/app/shared/components/calendar-button/calendar-button.component.scss +++ b/src/app/shared/components/calendar-button/calendar-button.component.scss @@ -1,4 +1,4 @@ -@import "../../../../assets/scss/partials/colors"; +@import '../../../../assets/scss/partials/colors'; :host { display: block; diff --git a/src/app/shared/components/calendar-button/calendar-button.component.spec.ts b/src/app/shared/components/calendar-button/calendar-button.component.spec.ts index 923540a9..19b22cc2 100644 --- a/src/app/shared/components/calendar-button/calendar-button.component.spec.ts +++ b/src/app/shared/components/calendar-button/calendar-button.component.spec.ts @@ -1,11 +1,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { CalendarButtonComponent } from './calendar-button.component'; -import { - TranslateLoader, - TranslateModule, - TranslateService, -} from '@ngx-translate/core'; +import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core'; import { HttpClient, HttpClientModule } from '@angular/common/http'; import { TypescriptLoader } from 'src/app/core/helpers/typescript-loader'; @@ -21,8 +17,7 @@ describe('CalendarButtonComponent', () => { TranslateModule.forRoot({ loader: { provide: TranslateLoader, - useFactory: (http: HttpClient) => - new TypescriptLoader(http, 'translations'), + useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), deps: [HttpClient], }, }), diff --git a/src/app/shared/components/editor/editor.component.html b/src/app/shared/components/editor/editor.component.html index a9d2c9f6..d89398e7 100644 --- a/src/app/shared/components/editor/editor.component.html +++ b/src/app/shared/components/editor/editor.component.html @@ -1,7 +1,4 @@ - + {{ label }}
*
@@ -10,16 +7,8 @@ tabindex="0" [ngClass]="{ 'fa-circle-xmark': showHint, 'fa-circle-question': !showHint }" class="fa-regular" - [matTooltip]=" - showHint - ? (translations.input.hint.hide.text | translate) - : (translations.input.hint.show.text | translate) - " - [attr.aria-label]=" - showHint - ? (translations.input.hint.hide.aria | translate) - : (translations.input.hint.show.aria | translate) - " + [matTooltip]="showHint ? (translations.input.hint.hide.text | translate) : (translations.input.hint.show.text | translate)" + [attr.aria-label]="showHint ? (translations.input.hint.hide.aria | translate) : (translations.input.hint.show.aria | translate)" [matTooltipPosition]="tooltipDirection.Right" (click)="showHint = !showHint" > @@ -35,12 +24,7 @@ error: !hasFocus && control && control.touched && !control.valid }" > - - +
{{ characterCount }} / {{ maxCharacters }} @@ -70,27 +47,17 @@ {{ hint }} - + {{ translations.input.error.minLength | translate }} - {{ control.errors!["minlength"].requiredLength }}. + {{ control.errors!['minlength'].requiredLength }}. - + {{ translations.input.error.maxLength | translate }} - {{ control.errors!["maxlength"].requiredLength }}. + {{ control.errors!['maxlength'].requiredLength }}. - - {{ label }} {{ translations.input.error.required | translate }} - + {{ label }} {{ translations.input.error.required | translate }} diff --git a/src/app/shared/components/editor/editor.component.scss b/src/app/shared/components/editor/editor.component.scss index fd325d3a..26cab441 100644 --- a/src/app/shared/components/editor/editor.component.scss +++ b/src/app/shared/components/editor/editor.component.scss @@ -1,4 +1,4 @@ -@import "../../../../assets/scss/partials/colors"; +@import '../../../../assets/scss/partials/colors'; :host { display: block; @@ -151,21 +151,12 @@ mat-error { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - font-family: var( - --mdc-typography-caption-font-family, - var(--mdc-typography-font-family, Inter) - ); + font-family: var(--mdc-typography-caption-font-family, var(--mdc-typography-font-family, Inter)); font-size: var(--mdc-typography-caption-font-size, 12px); line-height: var(--mdc-typography-caption-line-height, 20px); font-weight: var(--mdc-typography-caption-font-weight, 400); - letter-spacing: var( - --mdc-typography-caption-letter-spacing, - 0.0333333333em - ); - -webkit-text-decoration: var( - --mdc-typography-caption-text-decoration, - inherit - ); + letter-spacing: var(--mdc-typography-caption-letter-spacing, 0.0333333333em); + -webkit-text-decoration: var(--mdc-typography-caption-text-decoration, inherit); text-decoration: var(--mdc-typography-caption-text-decoration, inherit); text-transform: var(--mdc-typography-caption-text-transform, none); padding: 0 16px; diff --git a/src/app/shared/components/editor/editor.component.spec.ts b/src/app/shared/components/editor/editor.component.spec.ts index 3079e304..54222393 100644 --- a/src/app/shared/components/editor/editor.component.spec.ts +++ b/src/app/shared/components/editor/editor.component.spec.ts @@ -19,8 +19,7 @@ describe('EditorComponent', () => { TranslateModule.forRoot({ loader: { provide: TranslateLoader, - useFactory: (http: HttpClient) => - new TypescriptLoader(http, 'translations'), + useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), deps: [HttpClient], }, }), diff --git a/src/app/shared/components/editor/editor.component.ts b/src/app/shared/components/editor/editor.component.ts index 9d734437..7566faa3 100644 --- a/src/app/shared/components/editor/editor.component.ts +++ b/src/app/shared/components/editor/editor.component.ts @@ -1,26 +1,10 @@ -import { - AfterContentInit, - AfterViewInit, - Component, - ElementRef, - EventEmitter, - Input, - OnDestroy, - OnInit, - Output, - ViewChild, - forwardRef, -} from '@angular/core'; +import { AfterContentInit, AfterViewInit, Component, ElementRef, EventEmitter, Input, OnDestroy, OnInit, Output, ViewChild, forwardRef } from '@angular/core'; import { TranslateService } from '@ngx-translate/core'; import { Editor, NgxEditorService, Toolbar } from 'ngx-editor'; import { ngxEditorLocals } from '../../factories/editor-config.factory'; import { Subscription } from 'rxjs/internal/Subscription'; import { Translations } from 'src/app/core/services/translations.service'; -import { - ControlValueAccessor, - FormControl, - NG_VALUE_ACCESSOR, -} from '@angular/forms'; +import { ControlValueAccessor, FormControl, NG_VALUE_ACCESSOR } from '@angular/forms'; import { TooltipDirection } from '../../models/tooltip-direction'; // https://sibiraj-s.github.io/ngx-editor/en/introduction/ @@ -36,14 +20,7 @@ import { TooltipDirection } from '../../models/tooltip-direction'; }, ], }) -export class EditorComponent - implements - OnInit, - OnDestroy, - AfterViewInit, - AfterContentInit, - ControlValueAccessor -{ +export class EditorComponent implements OnInit, OnDestroy, AfterViewInit, AfterContentInit, ControlValueAccessor { @Input() html!: string; @Input() required: boolean = false; @Input({ required: true }) label!: string; @@ -89,7 +66,7 @@ export class EditorComponent public translations: Translations, private translateService: TranslateService, private ngxEditorService: NgxEditorService, - private elementRef: ElementRef, + private elementRef: ElementRef ) { this.editor = new Editor({ history: true, @@ -121,13 +98,9 @@ export class EditorComponent this.focusChange = new MutationObserver((mutations: MutationRecord[]) => { mutations.forEach(() => { - const classList = - this.editorViewChild.nativeElement?.children[1]?.children[0] - ?.children[0]?.classList; + const classList = this.editorViewChild.nativeElement?.children[1]?.children[0]?.children[0]?.classList; if (classList) { - this.hasFocus = Array.from(classList).includes('ProseMirror-focused') - ? true - : false; + this.hasFocus = Array.from(classList).includes('ProseMirror-focused') ? true : false; if (this.control && !this.hasFocus) { this.control.markAsTouched(); @@ -137,8 +110,7 @@ export class EditorComponent }); }); - const node = - this.editorViewChild.nativeElement?.children[1]?.children[0]?.children[0]; + const node = this.editorViewChild.nativeElement?.children[1]?.children[0]?.children[0]; if (node instanceof Node) { this.focusChange.observe(node, { attributeFilter: ['class'], @@ -171,120 +143,31 @@ export class EditorComponent } onLangChange(): void { - this.ngxEditorService.config.locals = ngxEditorLocals( - this.translateService, - this.translations, - ); + this.ngxEditorService.config.locals = ngxEditorLocals(this.translateService, this.translations); setTimeout(() => { - this.addAccessibility( - '[title="' + - this.translateService.instant(this.translations.editor.bold) + - '"]', - this.translateService.instant(this.translations.editor.bold), - ); - this.addAccessibility( - '[title="' + - this.translateService.instant(this.translations.editor.italic) + - '"]', - this.translateService.instant(this.translations.editor.italic), - ); - this.addAccessibility( - '[title="' + - this.translateService.instant(this.translations.editor.underline) + - '"]', - this.translateService.instant(this.translations.editor.underline), - ); - this.addAccessibility( - '[title="' + - this.translateService.instant(this.translations.editor.strike) + - '"]', - this.translateService.instant(this.translations.editor.strike), - ); - this.addAccessibility( - '[title="' + - this.translateService.instant(this.translations.editor.code) + - '"]', - this.translateService.instant(this.translations.editor.code), - ); - this.addAccessibility( - '[title="' + - this.translateService.instant(this.translations.editor.blockquote) + - '"]', - this.translateService.instant(this.translations.editor.blockquote), - ); - this.addAccessibility( - '[title="' + - this.translateService.instant(this.translations.editor.orderedlist) + - '"]', - this.translateService.instant(this.translations.editor.orderedlist), - ); - this.addAccessibility( - '[title="' + - this.translateService.instant(this.translations.editor.bulletlist) + - '"]', - this.translateService.instant(this.translations.editor.bulletlist), - ); - this.addAccessibility( - '[title="' + - this.translateService.instant(this.translations.editor.linkinsert) + - '"]', - this.translateService.instant(this.translations.editor.linkinsert), - ); - this.addAccessibility( - '[title="' + - this.translateService.instant(this.translations.editor.imginsert) + - '"]', - this.translateService.instant(this.translations.editor.imginsert), - ); - this.addAccessibility( - '[title="' + - this.translateService.instant(this.translations.editor.alignleft) + - '"]', - this.translateService.instant(this.translations.editor.alignleft), - ); - this.addAccessibility( - '[title="' + - this.translateService.instant(this.translations.editor.aligncenter) + - '"]', - this.translateService.instant(this.translations.editor.aligncenter), - ); - this.addAccessibility( - '[title="' + - this.translateService.instant(this.translations.editor.alignright) + - '"]', - this.translateService.instant(this.translations.editor.alignright), - ); - this.addAccessibility( - '[title="' + - this.translateService.instant(this.translations.editor.alignjustify) + - '"]', - this.translateService.instant(this.translations.editor.alignjustify), - ); - this.addAccessibility( - '[title="' + - this.translateService.instant( - this.translations.editor.horizontalrule, - ) + - '"]', - this.translateService.instant(this.translations.editor.horizontalrule), - ); - this.addAccessibility( - '[title="' + - this.translateService.instant(this.translations.editor.formatclear) + - '"]', - this.translateService.instant(this.translations.editor.formatclear), - ); - this.addAccessibility( - '.NgxEditor__Dropdown .NgxEditor__Dropdown--Text', - this.translateService.instant(this.translations.editor.title), - ); + this.addAccessibility('[title="' + this.translateService.instant(this.translations.editor.bold) + '"]', this.translateService.instant(this.translations.editor.bold)); + this.addAccessibility('[title="' + this.translateService.instant(this.translations.editor.italic) + '"]', this.translateService.instant(this.translations.editor.italic)); + this.addAccessibility('[title="' + this.translateService.instant(this.translations.editor.underline) + '"]', this.translateService.instant(this.translations.editor.underline)); + this.addAccessibility('[title="' + this.translateService.instant(this.translations.editor.strike) + '"]', this.translateService.instant(this.translations.editor.strike)); + this.addAccessibility('[title="' + this.translateService.instant(this.translations.editor.code) + '"]', this.translateService.instant(this.translations.editor.code)); + this.addAccessibility('[title="' + this.translateService.instant(this.translations.editor.blockquote) + '"]', this.translateService.instant(this.translations.editor.blockquote)); + this.addAccessibility('[title="' + this.translateService.instant(this.translations.editor.orderedlist) + '"]', this.translateService.instant(this.translations.editor.orderedlist)); + this.addAccessibility('[title="' + this.translateService.instant(this.translations.editor.bulletlist) + '"]', this.translateService.instant(this.translations.editor.bulletlist)); + this.addAccessibility('[title="' + this.translateService.instant(this.translations.editor.linkinsert) + '"]', this.translateService.instant(this.translations.editor.linkinsert)); + this.addAccessibility('[title="' + this.translateService.instant(this.translations.editor.imginsert) + '"]', this.translateService.instant(this.translations.editor.imginsert)); + this.addAccessibility('[title="' + this.translateService.instant(this.translations.editor.alignleft) + '"]', this.translateService.instant(this.translations.editor.alignleft)); + this.addAccessibility('[title="' + this.translateService.instant(this.translations.editor.aligncenter) + '"]', this.translateService.instant(this.translations.editor.aligncenter)); + this.addAccessibility('[title="' + this.translateService.instant(this.translations.editor.alignright) + '"]', this.translateService.instant(this.translations.editor.alignright)); + this.addAccessibility('[title="' + this.translateService.instant(this.translations.editor.alignjustify) + '"]', this.translateService.instant(this.translations.editor.alignjustify)); + this.addAccessibility('[title="' + this.translateService.instant(this.translations.editor.horizontalrule) + '"]', this.translateService.instant(this.translations.editor.horizontalrule)); + this.addAccessibility('[title="' + this.translateService.instant(this.translations.editor.formatclear) + '"]', this.translateService.instant(this.translations.editor.formatclear)); + this.addAccessibility('.NgxEditor__Dropdown .NgxEditor__Dropdown--Text', this.translateService.instant(this.translations.editor.title)); }, 500); } addAccessibility(selector: string, ariaLabel: string): void { - const el: HTMLElement = - this.elementRef.nativeElement.querySelectorAll(selector)[0]; + const el: HTMLElement = this.elementRef.nativeElement.querySelectorAll(selector)[0]; if (el) { el.removeEventListener('keydown', this.keydownRef); @@ -296,13 +179,7 @@ export class EditorComponent } el.setAttribute('tabIndex', '0'); - el.setAttribute( - 'ariaLabel', - el.classList.contains('NgxEditor__MenuItem--Active') - ? ariaLabel + - this.translateService.instant(this.translations.editor.enabled) - : ariaLabel, - ); + el.setAttribute('ariaLabel', el.classList.contains('NgxEditor__MenuItem--Active') ? ariaLabel + this.translateService.instant(this.translations.editor.enabled) : ariaLabel); el.addEventListener('keydown', this.keydownRef); el.addEventListener('click', this.ariaRef); @@ -316,22 +193,13 @@ export class EditorComponent // TODO: Aria labels for drop down (enabled/disabled) handleDropDown(event: Event): void { - if ( - event instanceof KeyboardEvent && - event.key != 'Enter' && - event.key != ' ' - ) - return; + if (event instanceof KeyboardEvent && event.key != 'Enter' && event.key != ' ') return; setTimeout(() => { - if ( - event.target instanceof HTMLElement && - event.target.className.includes('NgxEditor__Dropdown--Selected') && - event.target.nextSibling - ) { - event.target.nextSibling.childNodes.forEach((el) => { + if (event.target instanceof HTMLElement && event.target.className.includes('NgxEditor__Dropdown--Selected') && event.target.nextSibling) { + event.target.nextSibling.childNodes.forEach(el => { if (el instanceof HTMLElement) el.setAttribute('tabIndex', '0'); - el.addEventListener('keydown', (event) => { + el.addEventListener('keydown', event => { if (event instanceof KeyboardEvent) this.handleKeyDown(event); }); }); @@ -351,20 +219,10 @@ export class EditorComponent toggleAria(event: Event) { setTimeout(() => { if (event.target instanceof HTMLElement) { - if ( - event.target.classList.contains('NgxEditor__MenuItem--Active') || - event.target.classList.contains('NgxEditor__Dropdown--Active') - ) { - event.target.setAttribute( - 'ariaLabel', - this.cleanAriaLable(event.target) + - this.translateService.instant(this.translations.editor.enabled), - ); + if (event.target.classList.contains('NgxEditor__MenuItem--Active') || event.target.classList.contains('NgxEditor__Dropdown--Active')) { + event.target.setAttribute('ariaLabel', this.cleanAriaLable(event.target) + this.translateService.instant(this.translations.editor.enabled)); } else { - event.target.setAttribute( - 'ariaLabel', - this.cleanAriaLable(event.target), - ); + event.target.setAttribute('ariaLabel', this.cleanAriaLable(event.target)); } } }, 250); @@ -373,10 +231,7 @@ export class EditorComponent cleanAriaLable(el: HTMLElement): string { const ariaLabel = el.getAttribute('ariaLabel'); if (ariaLabel) { - return ariaLabel.replaceAll( - this.translateService.instant(this.translations.editor.enabled), - '', - ); + return ariaLabel.replaceAll(this.translateService.instant(this.translations.editor.enabled), ''); } return ''; } diff --git a/src/app/shared/components/event-form/event-form.component.html b/src/app/shared/components/event-form/event-form.component.html index c004c2d3..6328b756 100644 --- a/src/app/shared/components/event-form/event-form.component.html +++ b/src/app/shared/components/event-form/event-form.component.html @@ -12,22 +12,13 @@ [formControl]="form.controls['eventType'] | formControl" required="true" > - + {{ translations.forms.event.in_person | translate }} - + {{ translations.forms.event.hybrid | translate }} - + {{ translations.forms.event.online | translate }} @@ -66,22 +57,13 @@ [formControl]="form.controls['eventLanguage'] | formControl" required="true" > - + {{ translations.forms.event.english | translate }} - + {{ translations.forms.event.french | translate }} - + {{ translations.forms.event.bilingual | translate }} @@ -133,16 +115,10 @@ [formControl]="form.controls['eventDuration'] | formControl" required="true" > - + {{ translations.forms.event.single_day | translate }} - + {{ translations.forms.event.multi_day | translate }} @@ -179,10 +155,7 @@
-
+
{ TranslateModule.forRoot({ loader: { provide: TranslateLoader, - useFactory: (http: HttpClient) => - new TypescriptLoader(http, 'translations'), + useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), deps: [HttpClient], }, }), diff --git a/src/app/shared/components/event-form/event-form.component.ts b/src/app/shared/components/event-form/event-form.component.ts index e7791e43..e5a8d53f 100644 --- a/src/app/shared/components/event-form/event-form.component.ts +++ b/src/app/shared/components/event-form/event-form.component.ts @@ -1,10 +1,4 @@ -import { - AfterContentInit, - Component, - Input, - OnDestroy, - OnInit, -} from '@angular/core'; +import { AfterContentInit, Component, Input, OnDestroy, OnInit } from '@angular/core'; import { FormControl, FormGroup, Validators } from '@angular/forms'; // eslint-disable-next-line @typescript-eslint/no-unused-vars import { TranslateService } from '@ngx-translate/core'; @@ -46,23 +40,8 @@ export class EventFormComponent implements OnInit, OnDestroy, AfterContentInit { ngOnInit(): void { for (const [key, value] of Object.entries(this.model)) { if (!this.form.controls[key]) { - if (key == 'eventDescription') - this.form.addControl( - key, - new FormControl(value, [ - EditorValidators.required(), - EditorValidators.maxLength(this.maxCharacters), - ]), - ); - else - this.form.addControl( - key, - new FormControl(value, [ - Validators.required, - this.minValidator, - this.maxValidator, - ]), - ); + if (key == 'eventDescription') this.form.addControl(key, new FormControl(value, [EditorValidators.required(), EditorValidators.maxLength(this.maxCharacters)])); + else this.form.addControl(key, new FormControl(value, [Validators.required, this.minValidator, this.maxValidator])); } else { this.form.controls[key].setValue(value); } @@ -112,21 +91,13 @@ export class EventFormComponent implements OnInit, OnDestroy, AfterContentInit { } private removeValidators(controlName: string): void { - this.form.controls[controlName]?.removeValidators([ - Validators.required, - this.minValidator, - this.maxValidator, - ]); + this.form.controls[controlName]?.removeValidators([Validators.required, this.minValidator, this.maxValidator]); this.form.controls[controlName]?.clearValidators(); this.form.controls[controlName]?.updateValueAndValidity(); } private addValidators(controlName: string): void { - this.form.controls[controlName]?.addValidators([ - Validators.required, - this.minValidator, - this.maxValidator, - ]); + this.form.controls[controlName]?.addValidators([Validators.required, this.minValidator, this.maxValidator]); this.form.controls[controlName]?.clearValidators(); this.form.controls[controlName]?.updateValueAndValidity(); } diff --git a/src/app/shared/components/file-select/file-select.component.html b/src/app/shared/components/file-select/file-select.component.html index 0a3e520b..69ded07b 100644 --- a/src/app/shared/components/file-select/file-select.component.html +++ b/src/app/shared/components/file-select/file-select.component.html @@ -13,28 +13,10 @@
- + - {{ - control && control.value - ? photoName - ? (photoName | truncateFileName: 18) - : (translations.forms.saved_image | translate) - : label - }} - * + {{ control && control.value ? (photoName ? (photoName | truncateFileName: 18) : (translations.forms.saved_image | translate)) : label }} + * @@ -47,33 +29,15 @@ [theme]="theme" > - * + * {{ error }} - - {{ label + " " + (translations.input.error.required | translate) }} + + {{ label + ' ' + (translations.input.error.required | translate) }} - + diff --git a/src/app/shared/components/file-select/file-select.component.scss b/src/app/shared/components/file-select/file-select.component.scss index 8906bb88..ec2e4ac6 100644 --- a/src/app/shared/components/file-select/file-select.component.scss +++ b/src/app/shared/components/file-select/file-select.component.scss @@ -1,4 +1,4 @@ -@import "../../../../assets/scss/partials/colors"; +@import '../../../../assets/scss/partials/colors'; :host { .form { @@ -39,21 +39,12 @@ padding-left: 16px; margin-top: -16px; -webkit-font-smoothing: antialiased; - font-family: var( - --mdc-typography-caption-font-family, - var(--mdc-typography-font-family, Inter) - ); + font-family: var(--mdc-typography-caption-font-family, var(--mdc-typography-font-family, Inter)); font-size: var(--mdc-typography-caption-font-size, 12px); line-height: var(--mdc-typography-caption-line-height, 20px); font-weight: var(--mdc-typography-caption-font-weight, 400); - letter-spacing: var( - --mdc-typography-caption-letter-spacing, - 0.0333333333em - ); - -webkit-text-decoration: var( - --mdc-typography-caption-text-decoration, - inherit - ); + letter-spacing: var(--mdc-typography-caption-letter-spacing, 0.0333333333em); + -webkit-text-decoration: var(--mdc-typography-caption-text-decoration, inherit); text-decoration: var(--mdc-typography-caption-text-decoration, inherit); text-transform: var(--mdc-typography-caption-text-transform, none); } diff --git a/src/app/shared/components/file-select/file-select.component.spec.ts b/src/app/shared/components/file-select/file-select.component.spec.ts index 82aa72b8..eb7ddef5 100644 --- a/src/app/shared/components/file-select/file-select.component.spec.ts +++ b/src/app/shared/components/file-select/file-select.component.spec.ts @@ -1,11 +1,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { FileSelectComponent } from './file-select.component'; -import { - TranslateLoader, - TranslateModule, - TranslateService, -} from '@ngx-translate/core'; +import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core'; import { HttpClient, HttpClientModule } from '@angular/common/http'; import { TypescriptLoader } from 'src/app/core/helpers/typescript-loader'; import { RouterTestingModule } from '@angular/router/testing'; @@ -23,8 +19,7 @@ describe('FileSelectComponent', () => { TranslateModule.forRoot({ loader: { provide: TranslateLoader, - useFactory: (http: HttpClient) => - new TypescriptLoader(http, 'translations'), + useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), deps: [HttpClient], }, }), diff --git a/src/app/shared/components/file-select/file-select.component.ts b/src/app/shared/components/file-select/file-select.component.ts index a8c8a3f8..2cfae8b3 100644 --- a/src/app/shared/components/file-select/file-select.component.ts +++ b/src/app/shared/components/file-select/file-select.component.ts @@ -1,11 +1,4 @@ -import { - Component, - ElementRef, - Input, - OnDestroy, - OnInit, - ViewChild, -} from '@angular/core'; +import { Component, ElementRef, Input, OnDestroy, OnInit, ViewChild } from '@angular/core'; import { FormControl, Validators } from '@angular/forms'; import { Theme } from '../../models/theme'; import { TooltipDirection } from '../../models/tooltip-direction'; @@ -54,65 +47,10 @@ export class FileSelectComponent implements OnInit, OnDestroy { private appInFocus: boolean = true; private focusSub!: Subscription; - private textExtensions = [ - 'txt', - 'csv', - 'json', - 'xml', - 'html', - 'md', - 'log', - 'pdf', - 'doc', - 'docx', - 'xls', - 'xlsx', - 'ppt', - 'pptx', - 'odt', - 'ods', - 'odp', - 'rtf', - 'tex', - 'epub', - ]; - private imageExtensions = [ - 'jpg', - 'jpeg', - 'png', - 'gif', - 'bmp', - 'tiff', - 'webp', - 'svg', - 'ico', - ]; - private audioExtensions = [ - 'mp3', - 'wav', - 'ogg', - 'aac', - 'wma', - 'flac', - 'm4a', - 'ac3', - 'amr', - 'aiff', - 'au', - ]; - private videoExtensions = [ - 'mp4', - 'avi', - 'mkv', - 'mov', - 'wmv', - 'flv', - 'webm', - 'mpeg', - 'm4v', - '3gp', - 'ogg', - ]; + private textExtensions = ['txt', 'csv', 'json', 'xml', 'html', 'md', 'log', 'pdf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'odt', 'ods', 'odp', 'rtf', 'tex', 'epub']; + private imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'tiff', 'webp', 'svg', 'ico']; + private audioExtensions = ['mp3', 'wav', 'ogg', 'aac', 'wma', 'flac', 'm4a', 'ac3', 'amr', 'aiff', 'au']; + private videoExtensions = ['mp4', 'avi', 'mkv', 'mov', 'wmv', 'flv', 'webm', 'mpeg', 'm4v', '3gp', 'ogg']; private blacklist: string[] = [ 'c', 'cgi', @@ -160,7 +98,7 @@ export class FileSelectComponent implements OnInit, OnDestroy { constructor( private focusTrackingService: FocusTrackingService, public translations: Translations, - private translateService: TranslateService, + private translateService: TranslateService ) { this.langChangeSub = this.translateService.onLangChange.subscribe(() => { this.onLangChange(); @@ -168,14 +106,12 @@ export class FileSelectComponent implements OnInit, OnDestroy { } ngOnInit(): void { - this.focusSub = this.focusTrackingService - .getAppFocusObservable() - .subscribe((isInFocus) => { - this.appInFocus = isInFocus; - if (isInFocus && this.filePickerHasOpened) { - this.control.markAsTouched(); - } - }); + this.focusSub = this.focusTrackingService.getAppFocusObservable().subscribe(isInFocus => { + this.appInFocus = isInFocus; + if (isInFocus && this.filePickerHasOpened) { + this.control.markAsTouched(); + } + }); } ngOnDestroy(): void { @@ -190,8 +126,7 @@ export class FileSelectComponent implements OnInit, OnDestroy { } onPhotoBlur(): void { - if (this.appInFocus && !this.filePickerHasOpened) - this.control.markAsTouched(); + if (this.appInFocus && !this.filePickerHasOpened) this.control.markAsTouched(); } // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -202,23 +137,14 @@ export class FileSelectComponent implements OnInit, OnDestroy { if (!this.isCorrectExtension(selectedFile.name)) { this.setError(this.translations.file_select.error.extension); } else if (selectedFile.size > this.maxSize) { - this.setError( - this.translations.file_select.error.size, - this.maxSize / 1024 + ' KB.', - ); + this.setError(this.translations.file_select.error.size, this.maxSize / 1024 + ' KB.'); } else { this.loadFile(selectedFile) - .then((dataURL) => { - if ( - this.fileType == FileType.Text && - dataURL.length > this.maxLength - ) { - return this.setError( - this.translations.file_select.error.characters, - this.maxLength.toString(), - ); + .then(dataURL => { + if (this.fileType == FileType.Text && dataURL.length > this.maxLength) { + return this.setError(this.translations.file_select.error.characters, this.maxLength.toString()); } else if (this.fileType == FileType.Image) { - this.isCorrectDimensions(selectedFile).then((result) => { + this.isCorrectDimensions(selectedFile).then(result => { if (result !== true) return this.setError(result as string); }); } @@ -227,12 +153,8 @@ export class FileSelectComponent implements OnInit, OnDestroy { this.photoName = selectedFile.name; this.clearError(); }) - .catch((error) => { - this.setError( - this.translateService.instant( - this.translations.file_select.error.read, - ), - ); + .catch(error => { + this.setError(this.translateService.instant(this.translations.file_select.error.read)); console.error(error); }); } @@ -242,11 +164,11 @@ export class FileSelectComponent implements OnInit, OnDestroy { private loadFile(file: File): Promise { return new Promise((resolve, reject) => { const reader = new FileReader(); - reader.onload = (event) => { + reader.onload = event => { const dataURL = event.target?.result as string; resolve(dataURL); }; - reader.onerror = (error) => { + reader.onerror = error => { reject(error); }; reader.readAsDataURL(file); @@ -286,9 +208,9 @@ export class FileSelectComponent implements OnInit, OnDestroy { maxWidth: number = this.maxWidth, maxHeight: number = this.maxHeight, minWidth: number = this.minWidth, - minHeight: number = this.minHeight, + minHeight: number = this.minHeight ): Promise { - return new Promise((resolve) => { + return new Promise(resolve => { const img = new Image(); img.onload = () => { @@ -303,18 +225,8 @@ export class FileSelectComponent implements OnInit, OnDestroy { } else { resolve( isLarge - ? this.translateService.instant( - this.translations.file_select.error.img_large, - ) + - this.maxWidth + - 'x' + - this.maxHeight - : this.translateService.instant( - this.translations.file_select.error.img_small, - ) + - this.minWidth + - 'x' + - this.minHeight, + ? this.translateService.instant(this.translations.file_select.error.img_large) + this.maxWidth + 'x' + this.maxHeight + : this.translateService.instant(this.translations.file_select.error.img_small) + this.minWidth + 'x' + this.minHeight ); } }; diff --git a/src/app/shared/components/footer/footer.component.html b/src/app/shared/components/footer/footer.component.html index 0c4aa4f0..0079d22a 100644 --- a/src/app/shared/components/footer/footer.component.html +++ b/src/app/shared/components/footer/footer.component.html @@ -10,11 +10,7 @@

{{ translations.footer.title.about | translate }}

  • - + {{ translations.footer.item.gctools | translate }}
  • @@ -44,20 +40,12 @@

    {{ translations.footer.title.privacy | translate }}

    {{ translations.footer.title.connect | translate }}

    diff --git a/src/app/shared/components/footer/footer.component.scss b/src/app/shared/components/footer/footer.component.scss index 9c6296b0..3ccfe8ef 100644 --- a/src/app/shared/components/footer/footer.component.scss +++ b/src/app/shared/components/footer/footer.component.scss @@ -1,5 +1,5 @@ -@import "../../../../assets/scss/partials/colors"; -@import "../../../../assets/scss/partials/layout"; +@import '../../../../assets/scss/partials/colors'; +@import '../../../../assets/scss/partials/layout'; footer { width: 100vw; diff --git a/src/app/shared/components/footer/footer.component.spec.ts b/src/app/shared/components/footer/footer.component.spec.ts index 914e6b0c..ee044be2 100644 --- a/src/app/shared/components/footer/footer.component.spec.ts +++ b/src/app/shared/components/footer/footer.component.spec.ts @@ -19,8 +19,7 @@ describe('FooterComponent', () => { TranslateModule.forRoot({ loader: { provide: TranslateLoader, - useFactory: (http: HttpClient) => - new TypescriptLoader(http, 'translations'), + useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), deps: [HttpClient], }, }), diff --git a/src/app/shared/components/header/header.component.html b/src/app/shared/components/header/header.component.html index 86fe73be..167b6358 100644 --- a/src/app/shared/components/header/header.component.html +++ b/src/app/shared/components/header/header.component.html @@ -56,23 +56,12 @@ - + - + - + - + - - +
    diff --git a/src/app/shared/components/list/list.component.ts b/src/app/shared/components/list/list.component.ts index 4378ab2b..865866a2 100644 --- a/src/app/shared/components/list/list.component.ts +++ b/src/app/shared/components/list/list.component.ts @@ -43,20 +43,17 @@ export class ListComponent implements OnInit { loadNext(count: number = this.pageSize): void { this.loading = true; - this.service - ?.getMany(count, this.loadTime) - .subscribe((items: (typeof this.service.dataType)[]) => { - this.items.push(...items); - this.lastPage = this.items.length / this.pageSize; - this.loading = false; - }); + this.service?.getMany(count, this.loadTime).subscribe((items: (typeof this.service.dataType)[]) => { + this.items.push(...items); + this.lastPage = this.items.length / this.pageSize; + this.loading = false; + }); } nextPage(): void { this.lastPage = ++this.currentPage; - if (this.pageSize * this.currentPage > this.items.length) - this.loadNext(this.pageSize * this.pagesToLoad); + if (this.pageSize * this.currentPage > this.items.length) this.loadNext(this.pageSize * this.pagesToLoad); } previousPage(): void { @@ -72,8 +69,6 @@ export class ListComponent implements OnInit { } get paginatedItems(): (typeof this.service.dataType)[] { - return this.loading && this.currentPage === this.lastPage - ? this.items.slice(0, this.pageSize) - : this.items.slice(this.startIndex, this.endIndex); + return this.loading && this.currentPage === this.lastPage ? this.items.slice(0, this.pageSize) : this.items.slice(this.startIndex, this.endIndex); } } diff --git a/src/app/shared/components/page-title/page-title.component.scss b/src/app/shared/components/page-title/page-title.component.scss index 71a71899..0b8faee3 100644 --- a/src/app/shared/components/page-title/page-title.component.scss +++ b/src/app/shared/components/page-title/page-title.component.scss @@ -1,4 +1,4 @@ -@import "../../../../assets/scss/partials/layout"; +@import '../../../../assets/scss/partials/layout'; .page-title { h1 { diff --git a/src/app/shared/components/page-title/page-title.component.spec.ts b/src/app/shared/components/page-title/page-title.component.spec.ts index 8fc5fa5c..2b1b18f9 100644 --- a/src/app/shared/components/page-title/page-title.component.spec.ts +++ b/src/app/shared/components/page-title/page-title.component.spec.ts @@ -25,8 +25,7 @@ describe('PageTitleComponent', () => { TranslateModule.forRoot({ loader: { provide: TranslateLoader, - useFactory: (http: HttpClient) => - new TypescriptLoader(http, 'translations'), + useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), deps: [HttpClient], }, }), diff --git a/src/app/shared/components/poll-form/poll-form.component.html b/src/app/shared/components/poll-form/poll-form.component.html index f24c60f2..c7b0e349 100644 --- a/src/app/shared/components/poll-form/poll-form.component.html +++ b/src/app/shared/components/poll-form/poll-form.component.html @@ -23,9 +23,7 @@ @@ -34,12 +32,7 @@
    - + {{ translations.forms.poll.option_add | translate }} diff --git a/src/app/shared/components/poll-form/poll-form.component.spec.ts b/src/app/shared/components/poll-form/poll-form.component.spec.ts index 0685e2bf..cf579d5e 100644 --- a/src/app/shared/components/poll-form/poll-form.component.spec.ts +++ b/src/app/shared/components/poll-form/poll-form.component.spec.ts @@ -1,11 +1,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { PollFormComponent } from './poll-form.component'; -import { - TranslateLoader, - TranslateModule, - TranslateService, -} from '@ngx-translate/core'; +import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core'; import { HttpClient, HttpClientModule } from '@angular/common/http'; import { TypescriptLoader } from 'src/app/core/helpers/typescript-loader'; import { RouterTestingModule } from '@angular/router/testing'; @@ -23,8 +19,7 @@ describe('PollFormComponent', () => { TranslateModule.forRoot({ loader: { provide: TranslateLoader, - useFactory: (http: HttpClient) => - new TypescriptLoader(http, 'translations'), + useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), deps: [HttpClient], }, }), diff --git a/src/app/shared/components/poll-form/poll-form.component.ts b/src/app/shared/components/poll-form/poll-form.component.ts index 4cc87156..cbc0145c 100644 --- a/src/app/shared/components/poll-form/poll-form.component.ts +++ b/src/app/shared/components/poll-form/poll-form.component.ts @@ -30,23 +30,10 @@ export class PollFormComponent implements OnInit, OnDestroy { constructor(public translations: Translations) {} ngOnInit(): void { - this.form.addControl( - 'description', - new FormControl(this.model.description, [ - EditorValidators.required(), - EditorValidators.maxLength(this.maxLength), - ]), - ); + this.form.addControl('description', new FormControl(this.model.description, [EditorValidators.required(), EditorValidators.maxLength(this.maxLength)])); for (let i = 0; i < this.model.options.length; i++) { - this.form.addControl( - 'option' + i, - new FormControl(this.model.options[i].value, [ - Validators.required, - Validators.minLength(3), - Validators.maxLength(30), - ]), - ); + this.form.addControl('option' + i, new FormControl(this.model.options[i].value, [Validators.required, Validators.minLength(3), Validators.maxLength(30)])); } } @@ -60,14 +47,7 @@ export class PollFormComponent implements OnInit, OnDestroy { id: this.model.options[this.model.options.length - 1].id + 1, value: '', }); - this.form.addControl( - 'option' + this.model.options[this.model.options.length - 1].id, - new FormControl('', [ - Validators.required, - Validators.minLength(3), - Validators.maxLength(30), - ]), - ); + this.form.addControl('option' + this.model.options[this.model.options.length - 1].id, new FormControl('', [Validators.required, Validators.minLength(3), Validators.maxLength(30)])); } } diff --git a/src/app/shared/components/post-form/post-form.component.spec.ts b/src/app/shared/components/post-form/post-form.component.spec.ts index ced330c6..e0079dad 100644 --- a/src/app/shared/components/post-form/post-form.component.spec.ts +++ b/src/app/shared/components/post-form/post-form.component.spec.ts @@ -1,11 +1,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { PostFormComponent } from './post-form.component'; -import { - TranslateLoader, - TranslateModule, - TranslateService, -} from '@ngx-translate/core'; +import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core'; import { HttpClient, HttpClientModule } from '@angular/common/http'; import { TypescriptLoader } from 'src/app/core/helpers/typescript-loader'; import { RouterTestingModule } from '@angular/router/testing'; @@ -23,8 +19,7 @@ describe('PostFormComponent', () => { TranslateModule.forRoot({ loader: { provide: TranslateLoader, - useFactory: (http: HttpClient) => - new TypescriptLoader(http, 'translations'), + useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), deps: [HttpClient], }, }), diff --git a/src/app/shared/components/post-form/post-form.component.ts b/src/app/shared/components/post-form/post-form.component.ts index 2866da12..2d57b460 100644 --- a/src/app/shared/components/post-form/post-form.component.ts +++ b/src/app/shared/components/post-form/post-form.component.ts @@ -22,14 +22,7 @@ export class PostFormComponent implements OnInit, OnDestroy { constructor(public translations: Translations) {} ngOnInit(): void { - this.form.addControl( - 'description', - new FormControl(this.model.description, [ - Validators.required(), - Validators.minLength(this.minLength), - Validators.maxLength(this.maxLength), - ]), - ); + this.form.addControl('description', new FormControl(this.model.description, [Validators.required(), Validators.minLength(this.minLength), Validators.maxLength(this.maxLength)])); } ngOnDestroy(): void { diff --git a/src/app/shared/components/profile-pic/profile-pic.component.html b/src/app/shared/components/profile-pic/profile-pic.component.html index d53112dd..16efc241 100644 --- a/src/app/shared/components/profile-pic/profile-pic.component.html +++ b/src/app/shared/components/profile-pic/profile-pic.component.html @@ -1,15 +1,4 @@ - - - + + diff --git a/src/app/shared/components/profile-pic/profile-pic.component.spec.ts b/src/app/shared/components/profile-pic/profile-pic.component.spec.ts index c753a0df..2233e6c6 100644 --- a/src/app/shared/components/profile-pic/profile-pic.component.spec.ts +++ b/src/app/shared/components/profile-pic/profile-pic.component.spec.ts @@ -1,11 +1,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ProfilePicComponent } from './profile-pic.component'; -import { - TranslateLoader, - TranslateModule, - TranslateService, -} from '@ngx-translate/core'; +import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core'; import { HttpClient, HttpClientModule } from '@angular/common/http'; import { TypescriptLoader } from 'src/app/core/helpers/typescript-loader'; @@ -21,8 +17,7 @@ describe('ProfilePicComponent', () => { TranslateModule.forRoot({ loader: { provide: TranslateLoader, - useFactory: (http: HttpClient) => - new TypescriptLoader(http, 'translations'), + useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), deps: [HttpClient], }, }), diff --git a/src/app/shared/components/profile-pic/profile-pic.component.ts b/src/app/shared/components/profile-pic/profile-pic.component.ts index 871cee54..022ebbc0 100644 --- a/src/app/shared/components/profile-pic/profile-pic.component.ts +++ b/src/app/shared/components/profile-pic/profile-pic.component.ts @@ -18,7 +18,7 @@ export class ProfilePicComponent { constructor( public translations: Translations, - private router: Router, + private router: Router ) {} onClick(): void { diff --git a/src/app/shared/factories/editor-config.factory.ts b/src/app/shared/factories/editor-config.factory.ts index 8a12719a..37e9d4cf 100644 --- a/src/app/shared/factories/editor-config.factory.ts +++ b/src/app/shared/factories/editor-config.factory.ts @@ -2,19 +2,13 @@ import { TranslateService } from '@ngx-translate/core/lib/translate.service'; import { NgxEditorConfig } from 'ngx-editor'; import { Translations } from 'src/app/core/services/translations.service'; -export function ngxEditorConfigFactory( - translateService: TranslateService, - translations: Translations, -): NgxEditorConfig { +export function ngxEditorConfigFactory(translateService: TranslateService, translations: Translations): NgxEditorConfig { return { locals: ngxEditorLocals(translateService, translations), }; } -export function ngxEditorLocals( - translateService: TranslateService, - translations: Translations, -) { +export function ngxEditorLocals(translateService: TranslateService, translations: Translations) { return { bold: translateService.instant(translations.editor.bold), italic: translateService.instant(translations.editor.italic), @@ -47,9 +41,7 @@ export function ngxEditorLocals( altText: translateService.instant(translations.editor.alt), title: translateService.instant(translations.editor.title), remove: translateService.instant(translations.editor.remove), - horizontal_rule: translateService.instant( - translations.editor.horizontalrule, - ), + horizontal_rule: translateService.instant(translations.editor.horizontalrule), format_clear: translateService.instant(translations.editor.formatclear), }; } diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index 2b0304e7..6e610f33 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -2,11 +2,7 @@ import { ModuleWithProviders, NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { LanguageSelectorComponent } from './components/language-selector/language-selector.component'; -import { - TranslateLoader, - TranslateModule, - TranslateService, -} from '@ngx-translate/core'; +import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core'; import { AppModule } from '../app.module'; import { HttpClient } from '@angular/common/http'; @@ -31,20 +27,14 @@ import { MatToolbarModule } from '@angular/material/toolbar'; import { RouterModule } from '@angular/router'; import { BannerComponent } from './components/banner/banner.component'; import { InputComponent } from './components/input/input.component'; -import { - MAT_FORM_FIELD_DEFAULT_OPTIONS, - MatFormFieldModule, -} from '@angular/material/form-field'; +import { MAT_FORM_FIELD_DEFAULT_OPTIONS, MatFormFieldModule } from '@angular/material/form-field'; import { MatInputModule } from '@angular/material/input'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { InfiniteScrollModule } from 'ngx-infinite-scroll'; import { ProfilePicComponent } from './components/profile-pic/profile-pic.component'; import { CalendarButtonComponent } from './components/calendar-button/calendar-button.component'; import { MatCheckboxModule } from '@angular/material/checkbox'; -import { - MAT_RADIO_DEFAULT_OPTIONS, - MatRadioModule, -} from '@angular/material/radio'; +import { MAT_RADIO_DEFAULT_OPTIONS, MatRadioModule } from '@angular/material/radio'; import { MatDatepickerModule } from '@angular/material/datepicker'; import { MatAutocompleteModule } from '@angular/material/autocomplete'; import { EditorMenuComponent } from './components/editor/menu/editor-menu/editor-menu.component'; @@ -93,8 +83,7 @@ import { ListComponent } from './components/list/list.component'; TranslateModule.forChild({ loader: { provide: TranslateLoader, - useFactory: (http: HttpClient) => - new TypescriptLoader(http, 'translations'), + useFactory: (http: HttpClient) => new TypescriptLoader(http, 'translations'), deps: [HttpClient], }, isolate: false, diff --git a/src/index.html b/src/index.html index 6935dd4b..a60afa82 100644 --- a/src/index.html +++ b/src/index.html @@ -8,14 +8,8 @@ - - + + diff --git a/src/main.ts b/src/main.ts index d9a2e7e4..fa4e0aef 100644 --- a/src/main.ts +++ b/src/main.ts @@ -10,4 +10,4 @@ if (environment.production) { platformBrowserDynamic() .bootstrapModule(AppModule) - .catch((err) => console.error(err)); + .catch(err => console.error(err)); diff --git a/src/scripts/nodeSyncWorkflows.js b/src/scripts/nodeSyncWorkflows.js index b5ae16dd..8c31af4c 100644 --- a/src/scripts/nodeSyncWorkflows.js +++ b/src/scripts/nodeSyncWorkflows.js @@ -1,16 +1,16 @@ -const { exec } = require("child_process"); -const fs = require("fs"); +const { exec } = require('child_process'); +const fs = require('fs'); // These need to be manually updated if we are adding/removing workflow files. const workflowFilePaths = [ - ".github/workflows/dependency-graph.yml", - ".github/workflows/deploy-dev.yml", - ".github/workflows/deploy-pr.yml", - ".github/workflows/lint.yml", - ".github/workflows/code-format.yml", + '.github/workflows/dependency-graph.yml', + '.github/workflows/deploy-dev.yml', + '.github/workflows/deploy-pr.yml', + '.github/workflows/lint.yml', + '.github/workflows/code-format.yml', ]; -exec("npm run ng v", (error, stdout, stderr) => { +exec('npm run ng v', (error, stdout, stderr) => { if (error) { console.error(`Error: ${error.message}`); return; @@ -25,16 +25,11 @@ exec("npm run ng v", (error, stdout, stderr) => { if (nodeVersion) { for (let i = 0; i < workflowFilePaths.length; i++) { - let workflowFileContent = fs.readFileSync(workflowFilePaths[i], "utf8"); - workflowFileContent = workflowFileContent.replace( - /NODE_VERSION: ['"]\d+\.\d+\.\d+['"]/, - `NODE_VERSION: '${nodeVersion}'`, - ); + let workflowFileContent = fs.readFileSync(workflowFilePaths[i], 'utf8'); + workflowFileContent = workflowFileContent.replace(/NODE_VERSION: ['"]\d+\.\d+\.\d+['"]/, `NODE_VERSION: '${nodeVersion}'`); fs.writeFileSync(workflowFilePaths[i], workflowFileContent); - console.log( - `${workflowFilePaths[i]} updated to use Node.js version ${nodeVersion}`, - ); + console.log(`${workflowFilePaths[i]} updated to use Node.js version ${nodeVersion}`); } } }); diff --git a/src/silent-renew.html b/src/silent-renew.html index f28afe85..3fc201f0 100644 --- a/src/silent-renew.html +++ b/src/silent-renew.html @@ -13,7 +13,7 @@ /* The parent window hosts the Angular application */ var parent = window.parent; /* Send the id_token information to the oidc message handler */ - var event = new CustomEvent("oidc-silent-renew-message", { + var event = new CustomEvent('oidc-silent-renew-message', { detail: window.location, }); parent.dispatchEvent(event); diff --git a/src/styles.scss b/src/styles.scss index 9e4cb02d..783068ee 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -1,6 +1,6 @@ -@import "/src/assets/scss/partials/font-weights"; -@import "/src/assets/scss/partials/layout"; -@import "/src/assets/scss/partials/colors"; +@import '/src/assets/scss/partials/font-weights'; +@import '/src/assets/scss/partials/layout'; +@import '/src/assets/scss/partials/colors'; html, body { @@ -9,7 +9,7 @@ body { body { margin: 0; - font-family: "Inter", "Helvetica Neue", sans-serif; + font-family: 'Inter', 'Helvetica Neue', sans-serif; display: flex; overflow-x: hidden; } diff --git a/src/test.ts b/src/test.ts index b218a9fd..0c667e32 100644 --- a/src/test.ts +++ b/src/test.ts @@ -2,13 +2,7 @@ import 'zone.js/testing'; import { getTestBed } from '@angular/core/testing'; -import { - BrowserDynamicTestingModule, - platformBrowserDynamicTesting, -} from '@angular/platform-browser-dynamic/testing'; +import { BrowserDynamicTestingModule, platformBrowserDynamicTesting } from '@angular/platform-browser-dynamic/testing'; // First, initialize the Angular testing environment. -getTestBed().initTestEnvironment( - BrowserDynamicTestingModule, - platformBrowserDynamicTesting(), -); +getTestBed().initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting()); diff --git a/src/theme.scss b/src/theme.scss index 68e11bf5..af646d37 100644 --- a/src/theme.scss +++ b/src/theme.scss @@ -1,19 +1,19 @@ // Import Angular Material styles -@use "@angular/material" as mat; +@use '@angular/material' as mat; @include mat.core(); -@import "@angular/material/theming"; -@import url("https://fonts.googleapis.com/css2?family=Inter:wght@100;200;300;400;500;600;700;800;900&display=swap"); +@import '@angular/material/theming'; +@import url('https://fonts.googleapis.com/css2?family=Inter:wght@100;200;300;400;500;600;700;800;900&display=swap'); -@import "/src/assets/scss/partials/colors"; -@import "/src/assets/scss/partials/palettes"; +@import '/src/assets/scss/partials/colors'; +@import '/src/assets/scss/partials/palettes'; $theme-primary: mat.define-palette($primary-palette); $theme-accent: mat.define-palette($accent-palette); $theme-warn: mat.define-palette($warn-palette); $theme-typography: mat.define-typography-config( - $font-family: "Inter", + $font-family: 'Inter', ); $theme: mat.define-light-theme( @@ -54,9 +54,9 @@ body { } .material-icons { font-size: 24px; - font-family: "Material Icons Outlined", "Material Icons"; + font-family: 'Material Icons Outlined', 'Material Icons'; .mat-badge-content { - font-family: "Inter"; + font-family: 'Inter'; } } mat-checkbox { From 9fb00bdd5e8cd53e28723e1c6db15aa67c957805 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Tue, 30 Jan 2024 16:51:45 -0500 Subject: [PATCH 145/165] added synchronize to the pr deploy workflow. --- .github/workflows/deploy-pr.yml | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/.github/workflows/deploy-pr.yml b/.github/workflows/deploy-pr.yml index 80091000..e3479b5f 100644 --- a/.github/workflows/deploy-pr.yml +++ b/.github/workflows/deploy-pr.yml @@ -4,7 +4,7 @@ name: Deploy PR on: pull_request: - types: [opened, reopened] # TODO: synchronize + types: [opened, reopened, synchronize] branches: main env: @@ -51,8 +51,12 @@ jobs: - name: Get Publishing Profile id: get-publishing-profile run: | - profile=$(az webapp deployment list-publishing-profiles --resource-group ${{ env.AZURE_WEBAPP_NAME }} --name ${{ env.AZURE_WEBAPP_NAME }} --xml | sed -e 's|\"<|<|g' | sed -e 's|>\"|>|g' | sed -e 's|\\"|"|g' | sed -e 's|\\\\|\\|g') - echo "::set-output name=profile::$profile" + if [[ ${{ github.event.action }} != "synchronize" ]]; then + profile=$(az webapp deployment list-publishing-profiles --resource-group ${{ env.AZURE_WEBAPP_NAME }} --name ${{ env.AZURE_WEBAPP_NAME }} --xml | sed -e 's|\"<|<|g' | sed -e 's|>\"|>|g' | sed -e 's|\\"|"|g' | sed -e 's|\\\\|\\|g') + echo "::set-output name=profile::$profile" + else + echo "The publishing profile has already been retrieved." + fi - name: GitHub Auth Login shell: bash @@ -61,8 +65,12 @@ jobs: - uses: actions/checkout@v3 - name: Create Secret run: | - escaped_profile=$(printf "%q" "${{ env.PROFILE }}") - gh secret set "${{ env.SECRET_NAME }}" --body "$escaped_profile" + if [[ ${{ github.event.action }} != "synchronize" ]]; then + escaped_profile=$(printf "%q" "${{ env.PROFILE }}") + gh secret set "${{ env.SECRET_NAME }}" --body "$escaped_profile" + else + echo "The publishing profile secret has already been saved." + fi env: PROFILE: ${{ steps.get-publishing-profile.outputs.profile }} From 472fcf671ad28a74310899932531d150466dfc21 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Tue, 30 Jan 2024 17:18:42 -0500 Subject: [PATCH 146/165] log the publishing profile to debug --- .github/workflows/deploy-pr.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/deploy-pr.yml b/.github/workflows/deploy-pr.yml index e3479b5f..089614cd 100644 --- a/.github/workflows/deploy-pr.yml +++ b/.github/workflows/deploy-pr.yml @@ -56,6 +56,8 @@ jobs: echo "::set-output name=profile::$profile" else echo "The publishing profile has already been retrieved." + profile=$(az webapp deployment list-publishing-profiles --resource-group ${{ env.AZURE_WEBAPP_NAME }} --name ${{ env.AZURE_WEBAPP_NAME }} --xml | sed -e 's|\"<|<|g' | sed -e 's|>\"|>|g' | sed -e 's|\\"|"|g' | sed -e 's|\\\\|\\|g') + echo "$profile" fi - name: GitHub Auth Login From be856648f883d324e53047e6efc43bcd0c6186fe Mon Sep 17 00:00:00 2001 From: doug0102 Date: Tue, 30 Jan 2024 17:38:53 -0500 Subject: [PATCH 147/165] added app setting for web app resource to use scm webdeploy --- .bicep/pr-instance.bicep | 4 ++++ .github/workflows/deploy-pr.yml | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.bicep/pr-instance.bicep b/.bicep/pr-instance.bicep index f38922ac..99837059 100644 --- a/.bicep/pr-instance.bicep +++ b/.bicep/pr-instance.bicep @@ -37,6 +37,10 @@ resource appService 'Microsoft.Web/sites@2022-03-01' = { name: 'WEBSITE_NODE_DEFAULT_VERSION' value: '16.14.2' } + { + name: 'WEBSITE_WEBDEPLOY_USE_SCM' + value: 'true' + } ] } } diff --git a/.github/workflows/deploy-pr.yml b/.github/workflows/deploy-pr.yml index 53cc982b..e0ee4353 100644 --- a/.github/workflows/deploy-pr.yml +++ b/.github/workflows/deploy-pr.yml @@ -1,4 +1,6 @@ # This action will create the azure resources, github secret, github environment, and deploy the app when a PR once is opened. +# https://github.com/Azure/webapps-deploy/issues/28 +# https://stackoverflow.com/questions/64376240/github-action-for-azure-webapp-failed-to-fetch-credentials-from-publish-profile/64376536#64376536 name: Deploy PR @@ -56,8 +58,6 @@ jobs: echo "::set-output name=profile::$profile" else echo "The publishing profile has already been retrieved." - profile=$(az webapp deployment list-publishing-profiles --resource-group ${{ env.AZURE_WEBAPP_NAME }} --name ${{ env.AZURE_WEBAPP_NAME }} --xml | sed -e 's|\"<|<|g' | sed -e 's|>\"|>|g' | sed -e 's|\\"|"|g' | sed -e 's|\\\\|\\|g') - echo "$profile" fi - name: GitHub Auth Login From cc5d66d463c44033a7d6cbe4dc3276eee9032cf6 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Tue, 30 Jan 2024 17:57:28 -0500 Subject: [PATCH 148/165] trigger redeploy --- .github/workflows/deploy-pr.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/deploy-pr.yml b/.github/workflows/deploy-pr.yml index e0ee4353..6e3d144d 100644 --- a/.github/workflows/deploy-pr.yml +++ b/.github/workflows/deploy-pr.yml @@ -1,6 +1,5 @@ # This action will create the azure resources, github secret, github environment, and deploy the app when a PR once is opened. # https://github.com/Azure/webapps-deploy/issues/28 -# https://stackoverflow.com/questions/64376240/github-action-for-azure-webapp-failed-to-fetch-credentials-from-publish-profile/64376536#64376536 name: Deploy PR From 600f1ad0d7951ec6a453315c1b5018f3bb2ac3af Mon Sep 17 00:00:00 2001 From: doug0102 Date: Wed, 31 Jan 2024 11:06:54 -0500 Subject: [PATCH 149/165] trigger redeploy --- .github/workflows/deploy-pr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-pr.yml b/.github/workflows/deploy-pr.yml index 6e3d144d..79193805 100644 --- a/.github/workflows/deploy-pr.yml +++ b/.github/workflows/deploy-pr.yml @@ -1,5 +1,5 @@ # This action will create the azure resources, github secret, github environment, and deploy the app when a PR once is opened. -# https://github.com/Azure/webapps-deploy/issues/28 +# https://github.com/Azure/webapps-deploy/issues/28 name: Deploy PR From 9614d52a8f4e9d13ffa1667f355f257f5554fb8a Mon Sep 17 00:00:00 2001 From: doug0102 Date: Wed, 31 Jan 2024 12:08:23 -0500 Subject: [PATCH 150/165] update bicep pr instance node version using the sync script --- .bicep/pr-instance.bicep | 3 ++- src/scripts/nodeSyncWorkflows.js | 19 ++++++++++++++++--- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/.bicep/pr-instance.bicep b/.bicep/pr-instance.bicep index 99837059..cd446b46 100644 --- a/.bicep/pr-instance.bicep +++ b/.bicep/pr-instance.bicep @@ -4,6 +4,7 @@ param appName string = resourceGroup().name param location string = 'canadaeast' param siteKind string = 'windows' param sku string = 'F1' +param nodeVersion string = '18.13.0' resource appServicePlan 'Microsoft.Web/serverfarms@2021-01-01' = { name: appName @@ -35,7 +36,7 @@ resource appService 'Microsoft.Web/sites@2022-03-01' = { } { name: 'WEBSITE_NODE_DEFAULT_VERSION' - value: '16.14.2' + value: nodeVersion } { name: 'WEBSITE_WEBDEPLOY_USE_SCM' diff --git a/src/scripts/nodeSyncWorkflows.js b/src/scripts/nodeSyncWorkflows.js index 8c31af4c..92caf44c 100644 --- a/src/scripts/nodeSyncWorkflows.js +++ b/src/scripts/nodeSyncWorkflows.js @@ -10,6 +10,11 @@ const workflowFilePaths = [ '.github/workflows/code-format.yml', ]; +// The node.js version for the azure web apps being deployed +const bicepFilePaths = [ + '.bicep/pr-instance.bicep' +]; + exec('npm run ng v', (error, stdout, stderr) => { if (error) { console.error(`Error: ${error.message}`); @@ -25,11 +30,19 @@ exec('npm run ng v', (error, stdout, stderr) => { if (nodeVersion) { for (let i = 0; i < workflowFilePaths.length; i++) { - let workflowFileContent = fs.readFileSync(workflowFilePaths[i], 'utf8'); - workflowFileContent = workflowFileContent.replace(/NODE_VERSION: ['"]\d+\.\d+\.\d+['"]/, `NODE_VERSION: '${nodeVersion}'`); - fs.writeFileSync(workflowFilePaths[i], workflowFileContent); + let fileContents = fs.readFileSync(workflowFilePaths[i], 'utf8'); + fileContents = fileContents.replace(/NODE_VERSION: ['"]\d+\.\d+\.\d+['"]/, `NODE_VERSION: '${nodeVersion}'`); + fs.writeFileSync(workflowFilePaths[i], fileContents); console.log(`${workflowFilePaths[i]} updated to use Node.js version ${nodeVersion}`); } + + for (let i = 0; i < bicepFilePaths.length; i++) { + let fileContents = fs.readFileSync(bicepFilePaths[i], 'utf8'); + fileContents = fileContents.replace(/param nodeVersion string = ['"]\d+\.\d+\.\d+['"]/, `param nodeVersion string = '${nodeVersion}'`); + fs.writeFileSync(bicepFilePaths[i], fileContents); + + console.log(`${bicepFilePaths[i]} updated to use Node.js version ${nodeVersion}`); + } } }); From a84c0722e618175b416132f31816407c88fe4fdd Mon Sep 17 00:00:00 2001 From: doug0102 Date: Wed, 31 Jan 2024 15:01:14 -0500 Subject: [PATCH 151/165] remove port numbers from URLs in the PR publishing profile --- .github/workflows/deploy-pr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-pr.yml b/.github/workflows/deploy-pr.yml index 79193805..6ecfccb4 100644 --- a/.github/workflows/deploy-pr.yml +++ b/.github/workflows/deploy-pr.yml @@ -53,7 +53,7 @@ jobs: id: get-publishing-profile run: | if [[ ${{ github.event.action }} != "synchronize" ]]; then - profile=$(az webapp deployment list-publishing-profiles --resource-group ${{ env.AZURE_WEBAPP_NAME }} --name ${{ env.AZURE_WEBAPP_NAME }} --xml | sed -e 's|\"<|<|g' | sed -e 's|>\"|>|g' | sed -e 's|\\"|"|g' | sed -e 's|\\\\|\\|g') + profile=$(az webapp deployment list-publishing-profiles --resource-group ${{ env.AZURE_WEBAPP_NAME }} --name ${{ env.AZURE_WEBAPP_NAME }} --xml | sed -e 's|\"<|<|g' | sed -e 's|>\"|>|g' | sed -e 's|\\"|"|g' | sed -e 's|\\\\|\\|g' | sed - e 's/:[0-9]+//g') echo "::set-output name=profile::$profile" else echo "The publishing profile has already been retrieved." From d94cadc08e16bd979bb8ca6d2899ee6526e5e4d3 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Wed, 31 Jan 2024 15:11:52 -0500 Subject: [PATCH 152/165] minor --- .github/workflows/deploy-pr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-pr.yml b/.github/workflows/deploy-pr.yml index 6ecfccb4..532e9d1c 100644 --- a/.github/workflows/deploy-pr.yml +++ b/.github/workflows/deploy-pr.yml @@ -53,7 +53,7 @@ jobs: id: get-publishing-profile run: | if [[ ${{ github.event.action }} != "synchronize" ]]; then - profile=$(az webapp deployment list-publishing-profiles --resource-group ${{ env.AZURE_WEBAPP_NAME }} --name ${{ env.AZURE_WEBAPP_NAME }} --xml | sed -e 's|\"<|<|g' | sed -e 's|>\"|>|g' | sed -e 's|\\"|"|g' | sed -e 's|\\\\|\\|g' | sed - e 's/:[0-9]+//g') + profile=$(az webapp deployment list-publishing-profiles --resource-group ${{ env.AZURE_WEBAPP_NAME }} --name ${{ env.AZURE_WEBAPP_NAME }} --xml | sed -e 's|\"<|<|g' | sed -e 's|>\"|>|g' | sed -e 's|\\"|"|g' | sed -e 's|\\\\|\\|g' | sed -e 's/:[0-9]+//g') echo "::set-output name=profile::$profile" else echo "The publishing profile has already been retrieved." From ff0bfe93b7a859eff7a8d48d89b90a78b8d2d290 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Wed, 31 Jan 2024 15:26:25 -0500 Subject: [PATCH 153/165] fix regex for port removal --- .github/workflows/deploy-pr.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy-pr.yml b/.github/workflows/deploy-pr.yml index 532e9d1c..8efcaa5e 100644 --- a/.github/workflows/deploy-pr.yml +++ b/.github/workflows/deploy-pr.yml @@ -1,4 +1,4 @@ -# This action will create the azure resources, github secret, github environment, and deploy the app when a PR once is opened. +# This action will create the azure resources, github secret, github environment, and deploy the app when a PR is opened, reopened, or synchronized. # https://github.com/Azure/webapps-deploy/issues/28 name: Deploy PR @@ -53,7 +53,7 @@ jobs: id: get-publishing-profile run: | if [[ ${{ github.event.action }} != "synchronize" ]]; then - profile=$(az webapp deployment list-publishing-profiles --resource-group ${{ env.AZURE_WEBAPP_NAME }} --name ${{ env.AZURE_WEBAPP_NAME }} --xml | sed -e 's|\"<|<|g' | sed -e 's|>\"|>|g' | sed -e 's|\\"|"|g' | sed -e 's|\\\\|\\|g' | sed -e 's/:[0-9]+//g') + profile=$(az webapp deployment list-publishing-profiles --resource-group ${{ env.AZURE_WEBAPP_NAME }} --name ${{ env.AZURE_WEBAPP_NAME }} --xml | sed -e 's|\"<|<|g' | sed -e 's|>\"|>|g' | sed -e 's|\\"|"|g' | sed -e 's|\\\\|\\|g' | sed -E 's/:[0-9]+//g') echo "::set-output name=profile::$profile" else echo "The publishing profile has already been retrieved." From 8b044f91703f85f78c76b990b08e8e069aa4fe01 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Wed, 31 Jan 2024 15:45:14 -0500 Subject: [PATCH 154/165] trigger synchronize redeploy --- .github/workflows/deploy-pr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-pr.yml b/.github/workflows/deploy-pr.yml index 8efcaa5e..5d718d65 100644 --- a/.github/workflows/deploy-pr.yml +++ b/.github/workflows/deploy-pr.yml @@ -1,5 +1,5 @@ # This action will create the azure resources, github secret, github environment, and deploy the app when a PR is opened, reopened, or synchronized. -# https://github.com/Azure/webapps-deploy/issues/28 +# https://github.com/Azure/webapps-deploy/issues/28 name: Deploy PR From 6b02fd5ddb71b3d8127529837854a5c9e8ec0fc4 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Wed, 31 Jan 2024 16:57:48 -0500 Subject: [PATCH 155/165] re-retrieve and re-save publishing profile on synch --- .github/workflows/deploy-pr.yml | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/.github/workflows/deploy-pr.yml b/.github/workflows/deploy-pr.yml index 5d718d65..a61fbfa7 100644 --- a/.github/workflows/deploy-pr.yml +++ b/.github/workflows/deploy-pr.yml @@ -52,12 +52,8 @@ jobs: - name: Get Publishing Profile id: get-publishing-profile run: | - if [[ ${{ github.event.action }} != "synchronize" ]]; then - profile=$(az webapp deployment list-publishing-profiles --resource-group ${{ env.AZURE_WEBAPP_NAME }} --name ${{ env.AZURE_WEBAPP_NAME }} --xml | sed -e 's|\"<|<|g' | sed -e 's|>\"|>|g' | sed -e 's|\\"|"|g' | sed -e 's|\\\\|\\|g' | sed -E 's/:[0-9]+//g') - echo "::set-output name=profile::$profile" - else - echo "The publishing profile has already been retrieved." - fi + profile=$(az webapp deployment list-publishing-profiles --resource-group ${{ env.AZURE_WEBAPP_NAME }} --name ${{ env.AZURE_WEBAPP_NAME }} --xml | sed -e 's|\"<|<|g' | sed -e 's|>\"|>|g' | sed -e 's|\\"|"|g' | sed -e 's|\\\\|\\|g' | sed -E 's/:[0-9]+//g') + echo "::set-output name=profile::$profile" - name: GitHub Auth Login shell: bash @@ -66,12 +62,8 @@ jobs: - uses: actions/checkout@v3 - name: Create Secret run: | - if [[ ${{ github.event.action }} != "synchronize" ]]; then - escaped_profile=$(printf "%q" "${{ env.PROFILE }}") - gh secret set "${{ env.SECRET_NAME }}" --body "$escaped_profile" - else - echo "The publishing profile secret has already been saved." - fi + escaped_profile=$(printf "%q" "${{ env.PROFILE }}") + gh secret set "${{ env.SECRET_NAME }}" --body "$escaped_profile" env: PROFILE: ${{ steps.get-publishing-profile.outputs.profile }} From dc4fbb7321697bbe004c6e9c91af1b2299d9d910 Mon Sep 17 00:00:00 2001 From: doug0102 Date: Thu, 1 Feb 2024 10:22:15 -0500 Subject: [PATCH 156/165] hide publishing profile output in console --- .github/workflows/deploy-pr.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy-pr.yml b/.github/workflows/deploy-pr.yml index a61fbfa7..d38ebc8c 100644 --- a/.github/workflows/deploy-pr.yml +++ b/.github/workflows/deploy-pr.yml @@ -52,8 +52,8 @@ jobs: - name: Get Publishing Profile id: get-publishing-profile run: | - profile=$(az webapp deployment list-publishing-profiles --resource-group ${{ env.AZURE_WEBAPP_NAME }} --name ${{ env.AZURE_WEBAPP_NAME }} --xml | sed -e 's|\"<|<|g' | sed -e 's|>\"|>|g' | sed -e 's|\\"|"|g' | sed -e 's|\\\\|\\|g' | sed -E 's/:[0-9]+//g') - echo "::set-output name=profile::$profile" + profile=$(az webapp deployment list-publishing-profiles --resource-group ${{ env.AZURE_WEBAPP_NAME }} --name ${{ env.AZURE_WEBAPP_NAME }} --xml | sed -e 's|\"<|<|g' | sed -e 's|>\"|>|g' | sed -e 's|\\"|"|g' | sed -e 's|\\\\|\\|g' | sed -E 's/:[0-9]+//g') > /dev/null + echo "::set-output name=profile::$profile" > /dev/null - name: GitHub Auth Login shell: bash From 7b6bcd3b26cf5c2e6d213262615d06f0890f753a Mon Sep 17 00:00:00 2001 From: doug0102 Date: Thu, 1 Feb 2024 11:08:07 -0500 Subject: [PATCH 157/165] don't escape profile --- .github/workflows/deploy-pr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-pr.yml b/.github/workflows/deploy-pr.yml index d38ebc8c..683897cc 100644 --- a/.github/workflows/deploy-pr.yml +++ b/.github/workflows/deploy-pr.yml @@ -63,7 +63,7 @@ jobs: - name: Create Secret run: | escaped_profile=$(printf "%q" "${{ env.PROFILE }}") - gh secret set "${{ env.SECRET_NAME }}" --body "$escaped_profile" + gh secret set "${{ env.SECRET_NAME }}" --body "${{ env.PROFILE }}" env: PROFILE: ${{ steps.get-publishing-profile.outputs.profile }} From cec122c50164200e60aa4a3ac4d2d5590346c3cb Mon Sep 17 00:00:00 2001 From: doug0102 Date: Thu, 1 Feb 2024 11:22:12 -0500 Subject: [PATCH 158/165] keep port numbers in publish url --- .github/workflows/deploy-pr.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/deploy-pr.yml b/.github/workflows/deploy-pr.yml index 683897cc..b060545b 100644 --- a/.github/workflows/deploy-pr.yml +++ b/.github/workflows/deploy-pr.yml @@ -52,7 +52,7 @@ jobs: - name: Get Publishing Profile id: get-publishing-profile run: | - profile=$(az webapp deployment list-publishing-profiles --resource-group ${{ env.AZURE_WEBAPP_NAME }} --name ${{ env.AZURE_WEBAPP_NAME }} --xml | sed -e 's|\"<|<|g' | sed -e 's|>\"|>|g' | sed -e 's|\\"|"|g' | sed -e 's|\\\\|\\|g' | sed -E 's/:[0-9]+//g') > /dev/null + profile=$(az webapp deployment list-publishing-profiles --resource-group ${{ env.AZURE_WEBAPP_NAME }} --name ${{ env.AZURE_WEBAPP_NAME }} --xml | sed -e 's|\"<|<|g' | sed -e 's|>\"|>|g' | sed -e 's|\\"|"|g' | sed -e 's|\\\\|\\|g') > /dev/null echo "::set-output name=profile::$profile" > /dev/null - name: GitHub Auth Login @@ -61,9 +61,7 @@ jobs: - uses: actions/checkout@v3 - name: Create Secret - run: | - escaped_profile=$(printf "%q" "${{ env.PROFILE }}") - gh secret set "${{ env.SECRET_NAME }}" --body "${{ env.PROFILE }}" + run: gh secret set "${{ env.SECRET_NAME }}" --body "${{ env.PROFILE }}" env: PROFILE: ${{ steps.get-publishing-profile.outputs.profile }} From c7c64e66ea9789efc8de41953718f58fcca596f8 Mon Sep 17 00:00:00 2001 From: GCCollab Date: Thu, 1 Feb 2024 18:08:36 +0000 Subject: [PATCH 159/165] Code formatting ignore-deploy --- src/scripts/nodeSyncWorkflows.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/scripts/nodeSyncWorkflows.js b/src/scripts/nodeSyncWorkflows.js index 92caf44c..39da9b31 100644 --- a/src/scripts/nodeSyncWorkflows.js +++ b/src/scripts/nodeSyncWorkflows.js @@ -11,9 +11,7 @@ const workflowFilePaths = [ ]; // The node.js version for the azure web apps being deployed -const bicepFilePaths = [ - '.bicep/pr-instance.bicep' -]; +const bicepFilePaths = ['.bicep/pr-instance.bicep']; exec('npm run ng v', (error, stdout, stderr) => { if (error) { From 54b2d2edc61900627737265f5bffb2cfc66cb7ba Mon Sep 17 00:00:00 2001 From: Adii <73539670+AdiMakkar@users.noreply.github.com> Date: Tue, 20 Feb 2024 14:16:20 -0500 Subject: [PATCH 160/165] Filter bug fix (#239) * wip - fitlering * wip - filtering applied for some chracteristics of events; base commit * filtering for upcoming and previous events completed based off seperate array inputs for events * event filtering updates * linter caught changes to loadNext; changes updated for count * list.component.ts updated for lint issues caught during PR updates --- src/app/core/services/event.service.ts | 2 +- src/app/features/events/events.component.html | 8 +++--- src/app/features/events/events.component.ts | 14 ++++++++++ src/app/features/events/models/event.ts | 9 ++++++ .../shared/components/list/list.component.ts | 28 +++++++++---------- 5 files changed, 42 insertions(+), 19 deletions(-) diff --git a/src/app/core/services/event.service.ts b/src/app/core/services/event.service.ts index 8ab9257b..445734e8 100644 --- a/src/app/core/services/event.service.ts +++ b/src/app/core/services/event.service.ts @@ -80,7 +80,7 @@ export class EventService implements IListService { } private generateRandomEventItem(): Event { - const event = new Event(); + const event = new Event('0', 'Event Title', 'Display Picture', new Date(), 'Organizer', new Location('Address', 'City', 'Province')); event.id = this.id.toString(); event.title = this.randomTitle(); diff --git a/src/app/features/events/events.component.html b/src/app/features/events/events.component.html index b098e41a..abf49776 100644 --- a/src/app/features/events/events.component.html +++ b/src/app/features/events/events.component.html @@ -25,10 +25,10 @@
    - +
    - +
    @@ -45,10 +45,10 @@
    - +
    - +
    diff --git a/src/app/features/events/events.component.ts b/src/app/features/events/events.component.ts index 6aab135d..d8346755 100644 --- a/src/app/features/events/events.component.ts +++ b/src/app/features/events/events.component.ts @@ -4,6 +4,8 @@ import { CoreRoutes } from 'src/app/core/constants/routes.constants'; import { Translations } from 'src/app/core/services/translations.service'; import { MaterialButtonType } from 'src/app/shared/models/material-button-type'; import { EventService } from 'src/app/core/services/event.service'; +import { Event } from './models/event'; +import { Location } from 'src/app/core/models/location.model'; @Component({ selector: 'app-events', @@ -18,6 +20,18 @@ export class EventsComponent implements OnInit { loadingEvents: boolean = true; materialButtonType = MaterialButtonType; + currentDate = new Date(); + + upcomingEvents: Event[] = [ + new Event('1', 'Drink Outside the Box', 'https://images.unsplash.com/photo-1540573133985-87b6da6d54a9?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1476&q=80', new Date(this.currentDate.getFullYear(), this.currentDate.getMonth(), this.currentDate.getDate() + 1), 'TBS', new Location('2910 Woodroffe Ave', 'Ottawa', 'Ontario')), // Tomorrow + new Event('2', 'Grillin n Chillin', 'https://images.unsplash.com/photo-1593871075120-982e042088d8?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1471&q=80', new Date(this.currentDate.getFullYear(), this.currentDate.getMonth(), this.currentDate.getDate() + 3), 'ESDC', new Location('4230 Innes Rd', 'Ottawa', 'Ontario')), // Three days from now + ]; + + previousEvents: Event[] = [ + new Event('1', 'Chili Cook Off', 'https://images.unsplash.com/photo-1551884831-bbf3cdc6469e?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1274&q=80', new Date(this.currentDate.getFullYear(), this.currentDate.getMonth(), this.currentDate.getDate() - 1), 'CRA', new Location('2440 Bank St', 'Ottawa', 'Ontario')), // Yesterday + new Event('2', 'Hot Dog Eating Competition', 'https://images.unsplash.com/photo-1556997685-309989c1aa82?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxzZWFyY2h8Nnx8ZnVubnklMjBhbmltYWxzfGVufDB8fDB8fHww&auto=format&fit=crop&w=900&q=60', new Date(this.currentDate.getFullYear(), this.currentDate.getMonth(), this.currentDate.getDate() - 3), 'SSC', new Location('464 Bank St', 'Ottawa', 'Ontario')), // Three days in the past + ]; + constructor( public translations: Translations, public eventService: EventService diff --git a/src/app/features/events/models/event.ts b/src/app/features/events/models/event.ts index 263483ab..71bcd3e1 100644 --- a/src/app/features/events/models/event.ts +++ b/src/app/features/events/models/event.ts @@ -21,4 +21,13 @@ export class Event { confirmed: boolean = false; declined: boolean = false; + + constructor(id: string, title: string, displayPicture: string, startDate: Date, organizer: string, location: Location) { + this.id = id; + this.title = title; + this.displayPicture = displayPicture; + this.startDate = startDate; + this.organizer = organizer; + this.location = location; + } } diff --git a/src/app/shared/components/list/list.component.ts b/src/app/shared/components/list/list.component.ts index 865866a2..b49e19d8 100644 --- a/src/app/shared/components/list/list.component.ts +++ b/src/app/shared/components/list/list.component.ts @@ -1,6 +1,6 @@ import { Component, Input, OnInit } from '@angular/core'; // eslint-disable-next-line @typescript-eslint/no-unused-vars -import { NgComponentOutlet } from '@angular/common'; +// import { NgComponentOutlet } from '@angular/common'; import { IListService } from 'src/app/core/interfaces/list-service.interface'; import { CardSize } from '../../models/card-size'; import { Orientation } from '../../models/orientation'; @@ -11,8 +11,8 @@ import { Orientation } from '../../models/orientation'; styleUrls: ['./list.component.scss'], }) export class ListComponent implements OnInit { - @Input({ required: true }) service!: IListService; - @Input() items: (typeof this.service.dataType)[] = []; + @Input() service!: IListService; + @Input() items: (typeof this['service']['dataType'])[] = []; @Input() cardSize: CardSize | string = CardSize.Small; // TODO: Card size on all card components. Make a base component or interface that gets implemented. @Input() orientation: Orientation | string = Orientation.Vertical; @Input() columnGap: number = 10; @@ -22,13 +22,13 @@ export class ListComponent implements OnInit { @Input() pagesToLoad: number = 3; @Input() loadTime: number = 5000; - currentPage: number = 1; - lastPage: number = this.currentPage; - loading: boolean = true; + currentPage = 1; + lastPage = this.currentPage; + loading = false; Orientations = Orientation; - nextPageCallback: () => unknown = this.nextPage.bind(this); - previousPageCallback: () => unknown = this.previousPage.bind(this); + nextPageCallback = this.nextPage.bind(this); + previousPageCallback = this.previousPage.bind(this); constructor() {} @@ -36,17 +36,17 @@ export class ListComponent implements OnInit { if (this.items.length === 0) { this.loadNext(this.pageSize * (this.paging ? this.pagesToLoad : 1)); } else { - this.lastPage = this.items.length / this.pageSize; + this.lastPage = Math.ceil(this.items.length / this.pageSize); } } - loadNext(count: number = this.pageSize): void { + loadNext(_count: number = this.pageSize): void { this.loading = true; - this.service?.getMany(count, this.loadTime).subscribe((items: (typeof this.service.dataType)[]) => { + this.service?.getMany(_count, this.loadTime).subscribe((items: (typeof this['service']['dataType'])[]) => { this.items.push(...items); - this.lastPage = this.items.length / this.pageSize; - this.loading = false; + this.lastPage = Math.ceil(this.items.length / this.pageSize); + this.loading = false; }); } @@ -68,7 +68,7 @@ export class ListComponent implements OnInit { return this.startIndex + this.pageSize; } - get paginatedItems(): (typeof this.service.dataType)[] { + get paginatedItems(): (typeof this['service']['dataType'])[] { return this.loading && this.currentPage === this.lastPage ? this.items.slice(0, this.pageSize) : this.items.slice(this.startIndex, this.endIndex); } } From 225398154db711816cb9b41a3ebbc59c160e6a61 Mon Sep 17 00:00:00 2001 From: GCCollab Date: Tue, 20 Feb 2024 19:16:58 +0000 Subject: [PATCH 161/165] Code formatting ignore-deploy --- src/app/features/events/events.component.ts | 38 ++++++++++++++++--- .../shared/components/list/list.component.ts | 8 ++-- 2 files changed, 37 insertions(+), 9 deletions(-) diff --git a/src/app/features/events/events.component.ts b/src/app/features/events/events.component.ts index d8346755..1d6b49f8 100644 --- a/src/app/features/events/events.component.ts +++ b/src/app/features/events/events.component.ts @@ -23,13 +23,41 @@ export class EventsComponent implements OnInit { currentDate = new Date(); upcomingEvents: Event[] = [ - new Event('1', 'Drink Outside the Box', 'https://images.unsplash.com/photo-1540573133985-87b6da6d54a9?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1476&q=80', new Date(this.currentDate.getFullYear(), this.currentDate.getMonth(), this.currentDate.getDate() + 1), 'TBS', new Location('2910 Woodroffe Ave', 'Ottawa', 'Ontario')), // Tomorrow - new Event('2', 'Grillin n Chillin', 'https://images.unsplash.com/photo-1593871075120-982e042088d8?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1471&q=80', new Date(this.currentDate.getFullYear(), this.currentDate.getMonth(), this.currentDate.getDate() + 3), 'ESDC', new Location('4230 Innes Rd', 'Ottawa', 'Ontario')), // Three days from now + new Event( + '1', + 'Drink Outside the Box', + 'https://images.unsplash.com/photo-1540573133985-87b6da6d54a9?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1476&q=80', + new Date(this.currentDate.getFullYear(), this.currentDate.getMonth(), this.currentDate.getDate() + 1), + 'TBS', + new Location('2910 Woodroffe Ave', 'Ottawa', 'Ontario') + ), // Tomorrow + new Event( + '2', + 'Grillin n Chillin', + 'https://images.unsplash.com/photo-1593871075120-982e042088d8?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1471&q=80', + new Date(this.currentDate.getFullYear(), this.currentDate.getMonth(), this.currentDate.getDate() + 3), + 'ESDC', + new Location('4230 Innes Rd', 'Ottawa', 'Ontario') + ), // Three days from now ]; - + previousEvents: Event[] = [ - new Event('1', 'Chili Cook Off', 'https://images.unsplash.com/photo-1551884831-bbf3cdc6469e?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1274&q=80', new Date(this.currentDate.getFullYear(), this.currentDate.getMonth(), this.currentDate.getDate() - 1), 'CRA', new Location('2440 Bank St', 'Ottawa', 'Ontario')), // Yesterday - new Event('2', 'Hot Dog Eating Competition', 'https://images.unsplash.com/photo-1556997685-309989c1aa82?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxzZWFyY2h8Nnx8ZnVubnklMjBhbmltYWxzfGVufDB8fDB8fHww&auto=format&fit=crop&w=900&q=60', new Date(this.currentDate.getFullYear(), this.currentDate.getMonth(), this.currentDate.getDate() - 3), 'SSC', new Location('464 Bank St', 'Ottawa', 'Ontario')), // Three days in the past + new Event( + '1', + 'Chili Cook Off', + 'https://images.unsplash.com/photo-1551884831-bbf3cdc6469e?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1274&q=80', + new Date(this.currentDate.getFullYear(), this.currentDate.getMonth(), this.currentDate.getDate() - 1), + 'CRA', + new Location('2440 Bank St', 'Ottawa', 'Ontario') + ), // Yesterday + new Event( + '2', + 'Hot Dog Eating Competition', + 'https://images.unsplash.com/photo-1556997685-309989c1aa82?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxzZWFyY2h8Nnx8ZnVubnklMjBhbmltYWxzfGVufDB8fDB8fHww&auto=format&fit=crop&w=900&q=60', + new Date(this.currentDate.getFullYear(), this.currentDate.getMonth(), this.currentDate.getDate() - 3), + 'SSC', + new Location('464 Bank St', 'Ottawa', 'Ontario') + ), // Three days in the past ]; constructor( diff --git a/src/app/shared/components/list/list.component.ts b/src/app/shared/components/list/list.component.ts index b49e19d8..4f278133 100644 --- a/src/app/shared/components/list/list.component.ts +++ b/src/app/shared/components/list/list.component.ts @@ -12,7 +12,7 @@ import { Orientation } from '../../models/orientation'; }) export class ListComponent implements OnInit { @Input() service!: IListService; - @Input() items: (typeof this['service']['dataType'])[] = []; + @Input() items: (typeof this)['service']['dataType'][] = []; @Input() cardSize: CardSize | string = CardSize.Small; // TODO: Card size on all card components. Make a base component or interface that gets implemented. @Input() orientation: Orientation | string = Orientation.Vertical; @Input() columnGap: number = 10; @@ -43,10 +43,10 @@ export class ListComponent implements OnInit { loadNext(_count: number = this.pageSize): void { this.loading = true; - this.service?.getMany(_count, this.loadTime).subscribe((items: (typeof this['service']['dataType'])[]) => { + this.service?.getMany(_count, this.loadTime).subscribe((items: (typeof this)['service']['dataType'][]) => { this.items.push(...items); this.lastPage = Math.ceil(this.items.length / this.pageSize); - this.loading = false; + this.loading = false; }); } @@ -68,7 +68,7 @@ export class ListComponent implements OnInit { return this.startIndex + this.pageSize; } - get paginatedItems(): (typeof this['service']['dataType'])[] { + get paginatedItems(): (typeof this)['service']['dataType'][] { return this.loading && this.currentPage === this.lastPage ? this.items.slice(0, this.pageSize) : this.items.slice(this.startIndex, this.endIndex); } } From c6e60604f59303e21aa839f4c74d24213f11bf29 Mon Sep 17 00:00:00 2001 From: Adii <73539670+AdiMakkar@users.noreply.github.com> Date: Thu, 22 Feb 2024 09:51:09 -0500 Subject: [PATCH 162/165] statistics test updated only for the functionality e2e test (#256) --- haibun-e2e-tests/local/features/footer/statistics.feature | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/haibun-e2e-tests/local/features/footer/statistics.feature b/haibun-e2e-tests/local/features/footer/statistics.feature index 70c04053..fffd4c49 100644 --- a/haibun-e2e-tests/local/features/footer/statistics.feature +++ b/haibun-e2e-tests/local/features/footer/statistics.feature @@ -5,8 +5,4 @@ Feature: Statistics button feature go to the home webpage click the button Statistics - be on the statistics webpage - - #checks for the accessibility of the page - based on haibun-web-accessibility-axe - #doesn't work - page is accessible accepting serious 0 and moderate 0 \ No newline at end of file + be on the statistics webpage \ No newline at end of file From e3040c58a944d6ceac69a6820fc017173c1c6239 Mon Sep 17 00:00:00 2001 From: Adii <73539670+AdiMakkar@users.noreply.github.com> Date: Thu, 22 Feb 2024 09:51:20 -0500 Subject: [PATCH 163/165] privacy test updated only for the functionality e2e test (#255) --- haibun-e2e-tests/local/features/footer/privacy.feature | 4 ---- 1 file changed, 4 deletions(-) diff --git a/haibun-e2e-tests/local/features/footer/privacy.feature b/haibun-e2e-tests/local/features/footer/privacy.feature index 3165ea08..511565c0 100644 --- a/haibun-e2e-tests/local/features/footer/privacy.feature +++ b/haibun-e2e-tests/local/features/footer/privacy.feature @@ -6,7 +6,3 @@ Feature: Privacy button feature go to the home webpage click the button Privacy be on the privacy webpage - - #checks for the accessibility of the page - based on haibun-web-accessibility-axe - #doesn't work - page is accessible accepting serious 0 and moderate 0 \ No newline at end of file From a14f2ab6c435998f7323ffc075e916274811c528 Mon Sep 17 00:00:00 2001 From: Adii <73539670+AdiMakkar@users.noreply.github.com> Date: Thu, 22 Feb 2024 09:51:31 -0500 Subject: [PATCH 164/165] terms test updated only for the functionality e2e test (#254) --- haibun-e2e-tests/local/features/footer/terms.feature | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/haibun-e2e-tests/local/features/footer/terms.feature b/haibun-e2e-tests/local/features/footer/terms.feature index fd0ea386..fbec8be0 100644 --- a/haibun-e2e-tests/local/features/footer/terms.feature +++ b/haibun-e2e-tests/local/features/footer/terms.feature @@ -5,8 +5,4 @@ Feature: Terms button feature go to the home webpage click the button Terms - be on the terms webpage - - #checks for the accessibility of the page - based on haibun-web-accessibility-axe - #doesn't work - page is accessible accepting serious 0 and moderate 0 \ No newline at end of file + be on the terms webpage \ No newline at end of file From 32c0b87c8edc3915b0185b3eabb871644aee88f6 Mon Sep 17 00:00:00 2001 From: Adii <73539670+AdiMakkar@users.noreply.github.com> Date: Thu, 22 Feb 2024 09:53:04 -0500 Subject: [PATCH 165/165] gctools and package updates for tech debt test revolving around github hosted pages (#248) --- .../local/features/footer/gctools.feature | 4 - haibun-e2e-tests/package-lock.json | 4685 +++++++++++++++-- 2 files changed, 4303 insertions(+), 386 deletions(-) diff --git a/haibun-e2e-tests/local/features/footer/gctools.feature b/haibun-e2e-tests/local/features/footer/gctools.feature index ec26a2c5..1183bd27 100644 --- a/haibun-e2e-tests/local/features/footer/gctools.feature +++ b/haibun-e2e-tests/local/features/footer/gctools.feature @@ -10,7 +10,3 @@ Feature: GCTools button feature on tab 2 be on the gctools webpage see "gctools-outilsgc" - - #checks for the accessibility of the page - based on haibun-web-accessibility-axe - #doesn't work - page is accessible accepting serious 0 and moderate 0 \ No newline at end of file diff --git a/haibun-e2e-tests/package-lock.json b/haibun-e2e-tests/package-lock.json index f7da8c82..9ac84261 100644 --- a/haibun-e2e-tests/package-lock.json +++ b/haibun-e2e-tests/package-lock.json @@ -22,389 +22,2210 @@ "node": ">=14" } }, - "node_modules/@haibun/cli": { - "version": "1.29.4", - "resolved": "https://registry.npmjs.org/@haibun/cli/-/cli-1.29.4.tgz", - "integrity": "sha512-uJQi3PDAUUyYjONPAPgsObdJUBgCP0Dmr2N/RnFen2UmAWUoPuVmJDrCoNOzJsA3xtPjqS2T6APYsDbhqk3sVA==", + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "peer": true, "dependencies": { - "@haibun/core": "1.29.4", - "@haibun/domain-storage": "1.29.4", - "source-map-support": "^0.5.21" + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" }, - "bin": { - "haibun-cli": "build/cli.js" + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@haibun/context": { - "version": "1.29.4", - "resolved": "https://registry.npmjs.org/@haibun/context/-/context-1.29.4.tgz", - "integrity": "sha512-LNdIkmX8WYaP6ai0+Q45Ejt7C9QTJmw4CU7W9r4hVM0o1ME5145b8Lkvcn3+xDINAyuvd+XWnR//pxFAapV+EA==", + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "peer": true, "dependencies": { - "@haibun/core": "1.29.4", - "@haibun/web-server-express": "1.29.4", - "ws": "^8.9.0" + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@haibun/core": { - "version": "1.29.4", - "resolved": "https://registry.npmjs.org/@haibun/core/-/core-1.29.4.tgz", - "integrity": "sha512-t5/jcKjWmCp3I/5ZVuLaovO2Mx/0J9Dl8Yci3ej/XxL4fl9foN+GyUZHI37edSjfCG3+Pc1LPmstL1rC0rWerQ==" - }, - "node_modules/@haibun/domain-storage": { - "version": "1.29.4", - "resolved": "https://registry.npmjs.org/@haibun/domain-storage/-/domain-storage-1.29.4.tgz", - "integrity": "sha512-y2i/QOvgcJJLz4L9elhWoeM+wOdzXZfInRde7iy38aW0Uw76rrJoo72p0JJtRasMnTBrWHCf/nA+I57SIE36Ww==", + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "peer": true, "dependencies": { - "@haibun/context": "1.29.4", - "@haibun/core": "1.29.4" + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/@haibun/domain-webpage": { - "version": "1.29.4", - "resolved": "https://registry.npmjs.org/@haibun/domain-webpage/-/domain-webpage-1.29.4.tgz", - "integrity": "sha512-zGcjAH4xfH6+WDPjEdUATdAaZZjurHw3vZi4nF14tEiio0phn/FXz3YZIvEGepsUaJPzhJ2Bb72HQZoFC+w9OA==", + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "peer": true, "dependencies": { - "@haibun/core": "1.29.4" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/@haibun/out-xunit": { - "version": "1.29.4", - "resolved": "https://registry.npmjs.org/@haibun/out-xunit/-/out-xunit-1.29.4.tgz", - "integrity": "sha512-58Z+ZZ3xCSboCjGXwSWVbXB+RYcbMBJFGxPBP4kT2LsX1hVuM/gzY6faPT0tyN8GRoKBrsBq2D6KA9PvXHMQrA==", + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "peer": true, "dependencies": { - "@haibun/core": "1.29.4", - "xmlbuilder2": "^3.0.2" + "color-name": "1.1.3" } }, - "node_modules/@haibun/storage-fs": { - "version": "1.29.4", - "resolved": "https://registry.npmjs.org/@haibun/storage-fs/-/storage-fs-1.29.4.tgz", - "integrity": "sha512-J+7pnQiU59gbPeK6sW/Lapw2BK96RPF7GiKz/MB2SR6vdyXXdkGR06iRnz7giZmjrCz135GiFCrROURQasOojg==", - "dependencies": { - "@haibun/core": "1.29.4", - "@haibun/domain-storage": "1.29.4" - } + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "peer": true }, - "node_modules/@haibun/web-accessibility-axe": { - "version": "1.29.4", - "resolved": "https://registry.npmjs.org/@haibun/web-accessibility-axe/-/web-accessibility-axe-1.29.4.tgz", - "integrity": "sha512-QURlo0+6FbvgNlvQIafLaoq0pnjxWHajkvJdok0yvD3i/t8GV4VEZ/S/XcBifCf7pKQz/jWF4y4IXgHlnhbThw==", - "dependencies": { - "@haibun/cli": "1.29.4", - "@haibun/core": "1.29.4", - "@haibun/domain-webpage": "1.29.4", - "@haibun/storage-fs": "1.29.4", - "@haibun/web-playwright": "1.29.4", - "@haibun/web-server-express": "1.29.4", - "axe-core": "^4.6.2", - "playwright": "1.30" + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "peer": true, + "engines": { + "node": ">=0.8.0" } }, - "node_modules/@haibun/web-accessibility-axe/node_modules/playwright": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.30.0.tgz", - "integrity": "sha512-ENbW5o75HYB3YhnMTKJLTErIBExrSlX2ZZ1C/FzmHjUYIfxj/UnI+DWpQr992m+OQVSg0rCExAOlRwB+x+yyIg==", - "hasInstallScript": true, - "dependencies": { - "playwright-core": "1.30.0" - }, - "bin": { - "playwright": "cli.js" - }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "peer": true, "engines": { - "node": ">=14" + "node": ">=4" } }, - "node_modules/@haibun/web-accessibility-axe/node_modules/playwright-core": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.30.0.tgz", - "integrity": "sha512-7AnRmTCf+GVYhHbLJsGUtskWTE33SwMZkybJ0v6rqR1boxq2x36U7p1vDRV7HO2IwTZgmycracLxPEJI49wu4g==", - "bin": { - "playwright": "cli.js" + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "peer": true, + "dependencies": { + "has-flag": "^3.0.0" }, "engines": { - "node": ">=14" + "node": ">=4" } }, - "node_modules/@haibun/web-playwright": { - "version": "1.29.4", - "resolved": "https://registry.npmjs.org/@haibun/web-playwright/-/web-playwright-1.29.4.tgz", - "integrity": "sha512-XqYb+e4XTPMx+oTki8qZAMEcnQsgNOu3AiTY69tz53q8YBDR+/InE8lRmA/z3FybYuQfElR1I1cYC0aNu9Pr8g==", - "dependencies": { - "@haibun/core": "1.29.4", - "@haibun/domain-storage": "1.29.4", - "@haibun/domain-webpage": "1.29.4", - "playwright": "^1.29.2" + "node_modules/@babel/compat-data": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "peer": true, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@haibun/web-server-express": { - "version": "1.29.4", - "resolved": "https://registry.npmjs.org/@haibun/web-server-express/-/web-server-express-1.29.4.tgz", - "integrity": "sha512-bviV93PY9+vYBBeB6liYO/Ahjcz3mQKzLVbTbsGUY7xcisQV559zEK7cg5b4qgegdwz/hzGlLcVSapeVr+Vb8A==", + "node_modules/@babel/core": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", + "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", + "peer": true, "dependencies": { - "@haibun/core": "1.29.4", - "@haibun/domain-webpage": "1.29.4", - "cookie-parser": "^1.4.5", - "express": "^4.17.1", - "serve-index": "^1.9.1" + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.9", + "@babel/parser": "^7.23.9", + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/@oozcitak/dom": { - "version": "1.15.10", - "resolved": "https://registry.npmjs.org/@oozcitak/dom/-/dom-1.15.10.tgz", - "integrity": "sha512-0JT29/LaxVgRcGKvHmSrUTEvZ8BXvZhGl2LASRUgHqDTC1M5g1pLmVv56IYNyt3bG2CUjDkc67wnyZC14pbQrQ==", + "node_modules/@babel/core/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "peer": true, "dependencies": { - "@oozcitak/infra": "1.0.8", - "@oozcitak/url": "1.0.4", - "@oozcitak/util": "8.3.8" + "ms": "2.1.2" }, "engines": { - "node": ">=8.0" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/@oozcitak/infra": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@oozcitak/infra/-/infra-1.0.8.tgz", - "integrity": "sha512-JRAUc9VR6IGHOL7OGF+yrvs0LO8SlqGnPAMqyzOuFZPSZSXI7Xf2O9+awQPSMXgIWGtgUf/dA6Hs6X6ySEaWTg==", + "node_modules/@babel/core/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "peer": true + }, + "node_modules/@babel/generator": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "peer": true, "dependencies": { - "@oozcitak/util": "8.3.8" + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" }, "engines": { - "node": ">=6.0" + "node": ">=6.9.0" } }, - "node_modules/@oozcitak/url": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@oozcitak/url/-/url-1.0.4.tgz", - "integrity": "sha512-kDcD8y+y3FCSOvnBI6HJgl00viO/nGbQoCINmQ0h98OhnGITrWR3bOGfwYCthgcrV8AnTJz8MzslTQbC3SOAmw==", + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "peer": true, "dependencies": { - "@oozcitak/infra": "1.0.8", - "@oozcitak/util": "8.3.8" + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { - "node": ">=8.0" + "node": ">=6.9.0" } }, - "node_modules/@oozcitak/util": { - "version": "8.3.8", - "resolved": "https://registry.npmjs.org/@oozcitak/util/-/util-8.3.8.tgz", - "integrity": "sha512-T8TbSnGsxo6TDBJx/Sgv/BlVJL3tshxZP7Aq5R1mSnM5OcHY2dQaxLMu2+E8u3gN0MLOzdjurqN4ZRVuzQycOQ==", + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "peer": true, "engines": { - "node": ">=8.0" + "node": ">=6.9.0" } }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "peer": true, "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { - "node": ">= 0.6" + "node": ">=6.9.0" } }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "peer": true, "dependencies": { - "sprintf-js": "~1.0.2" + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "node_modules/axe-core": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.2.tgz", - "integrity": "sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==", + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "peer": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, "engines": { - "node": ">=4" + "node": ">=6.9.0" } }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" - }, - "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "peer": true, "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "peer": true, "engines": { - "node": ">= 0.8" + "node": ">=6.9.0" } }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "peer": true, "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "@babel/types": "^7.22.5" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "peer": true, "dependencies": { - "safe-buffer": "5.2.1" + "@babel/types": "^7.22.5" }, "engines": { - "node": ">= 0.6" + "node": ">=6.9.0" } }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "peer": true, "engines": { - "node": ">= 0.6" + "node": ">=6.9.0" } }, - "node_modules/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "peer": true, "engines": { - "node": ">= 0.6" + "node": ">=6.9.0" } }, - "node_modules/cookie-parser": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", - "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", + "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", + "peer": true, "dependencies": { - "cookie": "0.4.1", - "cookie-signature": "1.0.6" + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9" }, "engines": { - "node": ">= 0.8.0" + "node": ">=6.9.0" } }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "peer": true, "dependencies": { - "ms": "2.0.0" + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "peer": true, + "dependencies": { + "color-convert": "^1.9.0" + }, "engines": { - "node": ">= 0.8" + "node": ">=4" } }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "peer": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">=4" } }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "peer": true, + "dependencies": { + "color-name": "1.1.3" + } }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "peer": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "peer": true, "engines": { - "node": ">= 0.8" + "node": ">=0.8.0" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "peer": true, + "engines": { + "node": ">=4" + } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "peer": true, + "dependencies": { + "has-flag": "^3.0.0" }, "engines": { "node": ">=4" } }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "node_modules/@babel/parser": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", + "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", + "peer": true, + "bin": { + "parser": "bin/babel-parser.js" + }, "engines": { - "node": ">= 0.6" + "node": ">=6.0.0" } }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "peer": true, "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", + "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", + "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", + "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", + "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "peer": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/traverse/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "peer": true + }, + "node_modules/@babel/types": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", + "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", + "peer": true, + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "peer": true + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@haibun/cli": { + "version": "1.36.0", + "resolved": "https://registry.npmjs.org/@haibun/cli/-/cli-1.36.0.tgz", + "integrity": "sha512-hfW4sLgQFG2TLQHonHsyeW3sU1g/xbo2LEvsbRMPKEU4885S8AXaKmJF6YiWTjJNKgx5IG74lv0sSUI4Jt4IZg==", + "dependencies": { + "@haibun/core": "1.36.0", + "@haibun/domain-storage": "1.36.0", + "source-map-support": "^0.5.21" + }, + "bin": { + "haibun-cli": "build/cli.js" + } + }, + "node_modules/@haibun/context": { + "version": "1.36.0", + "resolved": "https://registry.npmjs.org/@haibun/context/-/context-1.36.0.tgz", + "integrity": "sha512-4ulSS5cdluRvf43dZad55ZbpEjPNOHL+ESZcAQW/R9DuT6B1eaM4rQRGZ5gajnh7dbmPBvdp2UVSQ0cBourgVg==", + "dependencies": { + "@haibun/core": "1.36.0", + "@haibun/web-server-express": "1.36.0", + "ws": "^8.9.0" + } + }, + "node_modules/@haibun/core": { + "version": "1.36.0", + "resolved": "https://registry.npmjs.org/@haibun/core/-/core-1.36.0.tgz", + "integrity": "sha512-Op0yxDQBRRLkAuy5aSNdRZjnr0SBEe+T11xoBobyft6EIdwdC+J+UW4CWzYiwCONDoiHvqIrWuwzwyyqePJu1w==" + }, + "node_modules/@haibun/domain-storage": { + "version": "1.36.0", + "resolved": "https://registry.npmjs.org/@haibun/domain-storage/-/domain-storage-1.36.0.tgz", + "integrity": "sha512-dTJREoGrg4rAWV4AKflqRsNWOa+SWVCTHfjua6sTvWnuUFCJApetVjz3KDuTrXuUwH9qeaWzdMMf87E3x9+j2A==", + "dependencies": { + "@haibun/context": "1.36.0", + "@haibun/core": "1.36.0" + } + }, + "node_modules/@haibun/domain-webpage": { + "version": "1.36.0", + "resolved": "https://registry.npmjs.org/@haibun/domain-webpage/-/domain-webpage-1.36.0.tgz", + "integrity": "sha512-iBL4az1EU4gD1DgoVvbv57XAHRdIiiNuAUBOI6nqJQkWgiRj5npsSmjNUkj4JnGHQ4yQKgkMQaN2HnT5hFFodQ==", + "dependencies": { + "@haibun/core": "1.36.0" + } + }, + "node_modules/@haibun/out-xunit": { + "version": "1.36.0", + "resolved": "https://registry.npmjs.org/@haibun/out-xunit/-/out-xunit-1.36.0.tgz", + "integrity": "sha512-+IEysTNztRZAY8jtz/Fus+bLlwjwbHVw7Dv2H8nvyovI27wTGSBQxoK/pSlX3o0a+F13ZXbFZ6NW/fBE6V1w7A==", + "dependencies": { + "@haibun/core": "1.36.0", + "xmlbuilder2": "^3.0.2" + } + }, + "node_modules/@haibun/storage-fs": { + "version": "1.36.0", + "resolved": "https://registry.npmjs.org/@haibun/storage-fs/-/storage-fs-1.36.0.tgz", + "integrity": "sha512-AeCj5VHdG2xGF0eIemdZA6oWlQ6WfMqbxSe9jVvx8JNkvSnynipP0wuQVB2YE6ymdqM8IJPBTnzARFOWINV5cA==", + "dependencies": { + "@haibun/core": "1.36.0", + "@haibun/domain-storage": "1.36.0" + } + }, + "node_modules/@haibun/storage-mem": { + "version": "1.36.0", + "resolved": "https://registry.npmjs.org/@haibun/storage-mem/-/storage-mem-1.36.0.tgz", + "integrity": "sha512-9/L2Xnb/+zadGu2cw2tMQe35ljr5moZYxPOPOFPTHFDPOFlfAOB4HCuHK9AAgW+mXQSJIFAlxSeicxl4ExvL2A==", + "dependencies": { + "@haibun/core": "1.36.0", + "@haibun/domain-storage": "1.36.0", + "memfs": "^4.6.0" + } + }, + "node_modules/@haibun/web-accessibility-axe": { + "version": "1.36.0", + "resolved": "https://registry.npmjs.org/@haibun/web-accessibility-axe/-/web-accessibility-axe-1.36.0.tgz", + "integrity": "sha512-5ViQrIXBxSynH2tCe6YoLde0amMMzd0aIXfRPW51qDIDoackFR4vKMYKdBfGCHUgYuuFMrl9/Q9+sBTU+0PTkA==", + "dependencies": { + "@haibun/cli": "1.36.0", + "@haibun/core": "1.36.0", + "@haibun/domain-storage": "1.36.0", + "@haibun/domain-webpage": "1.36.0", + "@haibun/storage-mem": "1.36.0", + "@haibun/web-playwright": "1.36.0", + "@haibun/web-server-express": "1.36.0", + "@types/node": "^20.3.1", + "axe-core": "^4.6.2", + "axe-html-reporter": "^2.2.3", + "playwright": "^1.40.1", + "ts-jest": "^29.0.3", + "ts-node": "^10.9.1" + } + }, + "node_modules/@haibun/web-playwright": { + "version": "1.36.0", + "resolved": "https://registry.npmjs.org/@haibun/web-playwright/-/web-playwright-1.36.0.tgz", + "integrity": "sha512-QP5D748IGxyrQ57pTzGgMgCuJEg765rgMfmfbuPx7sRJWVzix9pk204nzz4XsVQ9BzkOHq0PuK0pdEx6QDX/WQ==", + "dependencies": { + "@haibun/core": "1.36.0", + "@haibun/domain-storage": "1.36.0", + "@haibun/domain-webpage": "1.36.0", + "playwright": "^1.40.1" + } + }, + "node_modules/@haibun/web-server-express": { + "version": "1.36.0", + "resolved": "https://registry.npmjs.org/@haibun/web-server-express/-/web-server-express-1.36.0.tgz", + "integrity": "sha512-CNQI+p2otePn0tFsT77tRVIrUNmZ2juDj2LN8HTQ4+1m3w16JSMoNnf1NEX+l5d/2UVmNME28Dlmf/QhisEBzQ==", + "dependencies": { + "@haibun/core": "1.36.0", + "@haibun/domain-webpage": "1.36.0", + "cookie-parser": "^1.4.5", + "express": "^4.17.1", + "serve-index": "^1.9.1" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "peer": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "peer": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "peer": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "peer": true, + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "peer": true, + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "peer": true, + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "peer": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "peer": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "peer": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "peer": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "peer": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "peer": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "peer": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", + "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", + "peer": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@oozcitak/dom": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@oozcitak/dom/-/dom-1.15.10.tgz", + "integrity": "sha512-0JT29/LaxVgRcGKvHmSrUTEvZ8BXvZhGl2LASRUgHqDTC1M5g1pLmVv56IYNyt3bG2CUjDkc67wnyZC14pbQrQ==", + "dependencies": { + "@oozcitak/infra": "1.0.8", + "@oozcitak/url": "1.0.4", + "@oozcitak/util": "8.3.8" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/@oozcitak/infra": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@oozcitak/infra/-/infra-1.0.8.tgz", + "integrity": "sha512-JRAUc9VR6IGHOL7OGF+yrvs0LO8SlqGnPAMqyzOuFZPSZSXI7Xf2O9+awQPSMXgIWGtgUf/dA6Hs6X6ySEaWTg==", + "dependencies": { + "@oozcitak/util": "8.3.8" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/@oozcitak/url": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@oozcitak/url/-/url-1.0.4.tgz", + "integrity": "sha512-kDcD8y+y3FCSOvnBI6HJgl00viO/nGbQoCINmQ0h98OhnGITrWR3bOGfwYCthgcrV8AnTJz8MzslTQbC3SOAmw==", + "dependencies": { + "@oozcitak/infra": "1.0.8", + "@oozcitak/util": "8.3.8" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/@oozcitak/util": { + "version": "8.3.8", + "resolved": "https://registry.npmjs.org/@oozcitak/util/-/util-8.3.8.tgz", + "integrity": "sha512-T8TbSnGsxo6TDBJx/Sgv/BlVJL3tshxZP7Aq5R1mSnM5OcHY2dQaxLMu2+E8u3gN0MLOzdjurqN4ZRVuzQycOQ==", + "engines": { + "node": ">=8.0" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "peer": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "peer": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "peer": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "peer": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "peer": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", + "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", + "peer": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "peer": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/node": { + "version": "20.11.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.19.tgz", + "integrity": "sha512-7xMnVEcZFu0DikYjWOlRq7NTPETrm7teqUT2WkQjrTIkEgUyyGdWsj/Zg8bEJt5TNklzbPD1X3fqfsHw3SpapQ==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "peer": true + }, + "node_modules/@types/yargs": { + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "peer": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "peer": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/axe-core": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.8.4.tgz", + "integrity": "sha512-CZLSKisu/bhJ2awW4kJndluz2HLZYIHh5Uy1+ZwDRkJi69811xgIXXfdU9HSLX0Th+ILrHj8qfL/5wzamsFtQg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/axe-html-reporter": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/axe-html-reporter/-/axe-html-reporter-2.2.3.tgz", + "integrity": "sha512-io8aCEt4fJvv43W+33n3zEa8rdplH5Ti2v5fOnth3GBKLhLHarNs7jj46xGfpnGnpaNrz23/tXPHC3HbwTzwwA==", + "dependencies": { + "mustache": "^4.0.1", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=8.9.0" + }, + "peerDependencies": { + "axe-core": ">=3" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "peer": true, + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "peer": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "peer": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "peer": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "peer": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "peer": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "peer": true, + "dependencies": { + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "peer": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001588", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001588.tgz", + "integrity": "sha512-+hVY9jE44uKLkH0SrUTqxjxqNTOWHsbnQDIKjwkZ3lNTzUUVdBLBGXtj/q5Mp5u98r3droaZAewQuEDzjQdZlQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "peer": true + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "peer": true + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "peer": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "peer": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "peer": true + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "peer": true + }, + "node_modules/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-parser": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", + "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", + "dependencies": { + "cookie": "0.4.1", + "cookie-signature": "1.0.6" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "peer": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "peer": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/dedent": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", + "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", + "peer": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "peer": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.679", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.679.tgz", + "integrity": "sha512-NhQMsz5k0d6m9z3qAxnsOR/ebal4NAGsrNVRwcDo4Kc/zQ7KdsTKZUxZoygHcVRb0QDW3waEDIcE3isZ79RP6g==", + "peer": true + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "peer": true + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "peer": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "peer": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "peer": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "peer": true, + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", "http-errors": "2.0.0", "merge-descriptors": "1.0.1", "methods": "~1.1.2", @@ -424,140 +2245,1147 @@ "vary": "~1.1.2" }, "engines": { - "node": ">= 0.10.0" + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "peer": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "peer": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "peer": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "peer": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "peer": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", + "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "peer": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "peer": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/express/node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "peer": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, "engines": { - "node": ">= 0.6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "peer": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "peer": true + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "peer": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "peer": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "peer": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "peer": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz", + "integrity": "sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==", + "peer": true, + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "peer": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "peer": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "peer": true + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "peer": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "peer": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "peer": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "peer": true + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "peer": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "peer": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "peer": true, + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "peer": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "peer": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "peer": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "peer": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "peer": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "peer": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "peer": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "peer": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "peer": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "peer": true, + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "peer": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "peer": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "peer": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "peer": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "peer": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "peer": true, + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "peer": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "peer": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "peer": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" }, "engines": { - "node": ">= 0.8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "node_modules/jest-snapshot/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "peer": true, + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { - "node": ">= 0.6" + "node": ">=10" } }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "peer": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, "engines": { - "node": ">= 0.6" + "node": ">=10" } }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "node_modules/jest-snapshot/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "peer": true }, - "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "peer": true, "dependencies": { - "function-bind": "^1.1.1" + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" }, "engines": { - "node": ">= 0.4.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "peer": true, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "peer": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "peer": true, "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" }, "engines": { - "node": ">= 0.8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "peer": true, "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "engines": { - "node": ">= 0.10" - } + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "peer": true }, "node_modules/js-yaml": { "version": "3.14.1", @@ -571,6 +3399,147 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "peer": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "peer": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "peer": true + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "peer": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "peer": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "peer": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "peer": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "peer": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "peer": true + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "peer": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -579,11 +3548,32 @@ "node": ">= 0.6" } }, + "node_modules/memfs": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.7.7.tgz", + "integrity": "sha512-x9qc6k88J/VVwnfTkJV8pRRswJ2156Rc4w5rciRqKceFDZ0y1MqsNL9pkg5sE0GOcDzZYbonreALhaHzg1siFw==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">= 4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + } + }, "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "peer": true + }, "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -592,6 +3582,19 @@ "node": ">= 0.6" } }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "peer": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -622,11 +3625,45 @@ "node": ">= 0.6" } }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "bin": { + "mustache": "bin/mustache" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "peer": true + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -635,10 +3672,43 @@ "node": ">= 0.6" } }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "peer": true + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "peer": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "peer": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -654,6 +3724,98 @@ "node": ">= 0.8" } }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "peer": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "peer": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "peer": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "peer": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -662,30 +3824,102 @@ "node": ">= 0.8" } }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "peer": true + }, "node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "peer": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "peer": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "peer": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/playwright": { - "version": "1.37.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.37.1.tgz", - "integrity": "sha512-bgUXRrQKhT48zHdxDYQTpf//0xDfDd5hLeEhjuSw8rXEGoT9YeElpfvs/izonTNY21IQZ7d3s22jLxYaAnubbQ==", - "hasInstallScript": true, + "version": "1.41.2", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.41.2.tgz", + "integrity": "sha512-v0bOa6H2GJChDL8pAeLa/LZC4feoAMbSQm1/jF/ySsWWoaNItvrMP7GEkvEEFyCTUYKMxjQKaTSg5up7nR6/8A==", "dependencies": { - "playwright-core": "1.37.1" + "playwright-core": "1.41.2" }, "bin": { "playwright": "cli.js" }, "engines": { "node": ">=16" + }, + "optionalDependencies": { + "fsevents": "2.3.2" } }, "node_modules/playwright-core": { - "version": "1.37.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.37.1.tgz", - "integrity": "sha512-17EuQxlSIYCmEMwzMqusJ2ztDgJePjrbttaefgdsiqeLWidjYz9BxXaTaZWxH1J95SHGk6tjE+dwgWILJoUZfA==", + "version": "1.41.2", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.41.2.tgz", + "integrity": "sha512-VaTvwCA4Y8kxEe+kfm2+uUUw5Lubf38RxF7FpBxLPmGe5sdNkSg5e3ChEigaGrX7qdqT3pt2m/98LiyvU2x6CA==", "bin": { "playwright-core": "cli.js" }, @@ -693,6 +3927,58 @@ "node": ">=16" } }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "peer": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "peer": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -705,6 +3991,22 @@ "node": ">= 0.10" } }, + "node_modules/pure-rand": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", + "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "peer": true + }, "node_modules/qs": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", @@ -741,6 +4043,82 @@ "node": ">= 0.8" } }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "peer": true + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "peer": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "peer": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -765,6 +4143,15 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -864,24 +4251,86 @@ "node": ">= 0.8.0" } }, + "node_modules/set-function-length": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", + "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", + "dependencies": { + "define-data-property": "^1.1.2", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "peer": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.5.tgz", + "integrity": "sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "peer": true + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "peer": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -904,6 +4353,18 @@ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "peer": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -912,6 +4373,139 @@ "node": ">= 0.8" } }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "peer": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "peer": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "peer": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "peer": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "peer": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "peer": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -920,6 +4514,146 @@ "node": ">=0.6" } }, + "node_modules/ts-jest": { + "version": "29.1.2", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.2.tgz", + "integrity": "sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==", + "dependencies": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "^7.5.3", + "yargs-parser": "^21.0.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -932,6 +4666,24 @@ "node": ">= 0.6" } }, + "node_modules/typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -940,6 +4692,36 @@ "node": ">= 0.8" } }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "peer": true, + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -948,6 +4730,25 @@ "node": ">= 0.4.0" } }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" + }, + "node_modules/v8-to-istanbul": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", + "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -956,10 +4757,69 @@ "node": ">= 0.8" } }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "peer": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "peer": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "peer": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "peer": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", "engines": { "node": ">=10.0.0" }, @@ -989,6 +4849,67 @@ "engines": { "node": ">=12.0" } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "peer": true + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "peer": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } }