From da13d62703113eb00897b12ef1fe54a8f8202e67 Mon Sep 17 00:00:00 2001
From: Erwin-N <111194281+Erwin-N@users.noreply.github.com>
Date: Sun, 1 Mar 2026 09:44:46 +0100
Subject: [PATCH 01/33] Task/improve language localization for NL (#6414)
* Improve language localization for NL
* Update changelog
---
CHANGELOG.md | 6 ++
apps/client/src/locales/messages.nl.xlf | 136 ++++++++++++------------
2 files changed, 74 insertions(+), 68 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 90026ee7d..ac47df943 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+## Unreleased
+
+### Changed
+
+- Improved the language localization for Dutch (`nl`)
+
## 2.244.0 - 2026-02-28
### Changed
diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf
index 58928387b..158ff4fb1 100644
--- a/apps/client/src/locales/messages.nl.xlf
+++ b/apps/client/src/locales/messages.nl.xlf
@@ -39,7 +39,7 @@
please
- please
+ alsjeblieft
apps/client/src/app/pages/pricing/pricing-page.html
333
@@ -83,7 +83,7 @@
with
- with
+ met
apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html
87
@@ -371,7 +371,7 @@
and is driven by the efforts of its contributors
- and is driven by the efforts of its contributors
+ en wordt gedreven door de inspanningen van zijn bijdragers
apps/client/src/app/pages/about/overview/about-overview-page.html
49
@@ -655,7 +655,7 @@
No auto-renewal on membership.
- No auto-renewal on membership.
+ Het lidmaatschap wordt niet automatisch verlengd.
apps/client/src/app/components/user-account-membership/user-account-membership.html
74
@@ -1099,7 +1099,7 @@
Performance with currency effect
- Performance with currency effect
+ Prestaties met valuta-effect
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
135
@@ -1915,7 +1915,7 @@
Current week
- Current week
+ Huidige week
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
191
@@ -2079,7 +2079,7 @@
or start a discussion at
- or start a discussion at
+ of start een discussie op
apps/client/src/app/pages/about/overview/about-overview-page.html
94
@@ -2151,7 +2151,7 @@
Sustainable retirement income
- Sustainable retirement income
+ Duurzaam pensioeninkomen
apps/client/src/app/pages/portfolio/fire/fire-page.html
41
@@ -2323,7 +2323,7 @@
contact us
- contact us
+ contacteer ons
apps/client/src/app/pages/pricing/pricing-page.html
336
@@ -2399,7 +2399,7 @@
Exclude from Analysis
- Exclude from Analysis
+ Uitsluiten van analyse
apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html
90
@@ -2423,7 +2423,7 @@
Latest activities
- Latest activities
+ Laatste activiteiten
apps/client/src/app/pages/public/public-page.html
210
@@ -2539,7 +2539,7 @@
annual interest rate
- annual interest rate
+ jaarlijkse rente
apps/client/src/app/pages/portfolio/fire/fire-page.html
185
@@ -2659,7 +2659,7 @@
Could not validate form
- Could not validate form
+ Het formulier kon niet worden gevalideerd.
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
554
@@ -2895,7 +2895,7 @@
Authentication
- Authentication
+ Authenticatie
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
54
@@ -3047,7 +3047,7 @@
If you retire today, you would be able to withdraw
- If you retire today, you would be able to withdraw
+ Als u vandaag met pensioen gaat, kunt u
apps/client/src/app/pages/portfolio/fire/fire-page.html
68
@@ -3115,7 +3115,7 @@
Looking for a student discount?
- Looking for a student discount?
+ Op zoek naar studentenkorting?
apps/client/src/app/pages/pricing/pricing-page.html
342
@@ -3343,7 +3343,7 @@
No Activities
- No Activities
+ Geen activiteiten
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
146
@@ -3359,7 +3359,7 @@
Everything in Basic, plus
- Everything in Basic, plus
+ Alles van Basic, plus
apps/client/src/app/pages/pricing/pricing-page.html
199
@@ -3619,7 +3619,7 @@
Could not save asset profile
- Could not save asset profile
+ Kon het assetprofiel niet opslaan
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
588
@@ -3823,7 +3823,7 @@
By
- By
+ Door
apps/client/src/app/pages/portfolio/fire/fire-page.html
139
@@ -3839,7 +3839,7 @@
Current year
- Current year
+ Huidig jaar
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
199
@@ -3875,7 +3875,7 @@
Asset profile has been saved
- Asset profile has been saved
+ Het activaprofiel is opgeslagen.
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
578
@@ -4067,7 +4067,7 @@
View Details
- View Details
+ Bekijk details
apps/client/src/app/components/admin-users/admin-users.html
225
@@ -4203,7 +4203,7 @@
per week
- per week
+ per week
apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html
130
@@ -4227,7 +4227,7 @@
and we share aggregated key metrics of the platform’s performance
- and we share aggregated key metrics of the platform’s performance
+ en we delen geaggregeerde belangrijke prestatiegegevens van het platform
apps/client/src/app/pages/about/overview/about-overview-page.html
32
@@ -4271,7 +4271,7 @@
Website of Thomas Kaul
- Website of Thomas Kaul
+ Website van Thomas Kaul
apps/client/src/app/pages/about/overview/about-overview-page.html
44
@@ -4451,7 +4451,7 @@
Sign in with OpenID Connect
- Sign in with OpenID Connect
+ Meld je aan met OpenID Connect
apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html
55
@@ -4543,7 +4543,7 @@
The source code is fully available as open source software (OSS) under the AGPL-3.0 license
- The source code is fully available as open source software (OSS) under the AGPL-3.0 license
+ De broncode is volledig beschikbaar als open source software (OSS) onder de AGPL-3.0-licentie
apps/client/src/app/pages/about/overview/about-overview-page.html
16
@@ -4615,7 +4615,7 @@
this is projected to increase to
- this is projected to increase to
+ zal dit naar verwachting stijgen tot
apps/client/src/app/pages/portfolio/fire/fire-page.html
147
@@ -4667,7 +4667,7 @@
Job ID
- Job ID
+ Opdracht ID
apps/client/src/app/components/admin-jobs/admin-jobs.html
34
@@ -4751,7 +4751,7 @@
for
- for
+ voor
apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html
128
@@ -4775,7 +4775,7 @@
Could not parse scraper configuration
- Could not parse scraper configuration
+ De scraperconfiguratie kon niet worden geparseerd
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
509
@@ -4819,7 +4819,7 @@
Edit access
- Edit access
+ Toegang bewerken
apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html
11
@@ -4891,7 +4891,7 @@
Get access to 80’000+ tickers from over 50 exchanges
- Get access to 80’000+ tickers from over 50 exchanges
+ Krijg toegang tot meer dan 80.000+ tickers van meer dan 50 beurzen
apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html
84
@@ -5075,7 +5075,7 @@
less than
- less than
+ minder dan
apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html
129
@@ -5365,7 +5365,7 @@
Ghostfolio Status
- Ghostfolio Status
+ Ghostfolio Status
apps/client/src/app/pages/about/overview/about-overview-page.html
62
@@ -5373,7 +5373,7 @@
with your university e-mail address
- with your university e-mail address
+ met uw universitaire e-mailadres
apps/client/src/app/pages/pricing/pricing-page.html
348
@@ -5393,7 +5393,7 @@
and a safe withdrawal rate (SWR) of
- and a safe withdrawal rate (SWR) of
+ en een veilige opnameratio (SWR) van
apps/client/src/app/pages/portfolio/fire/fire-page.html
108
@@ -5557,7 +5557,7 @@
Request it
- Request it
+ Aanvragen
apps/client/src/app/pages/pricing/pricing-page.html
344
@@ -5613,7 +5613,7 @@
,
- ,
+ ,
apps/client/src/app/pages/portfolio/fire/fire-page.html
145
@@ -5629,7 +5629,7 @@
per month
- per month
+ per maand
apps/client/src/app/pages/portfolio/fire/fire-page.html
94
@@ -5821,7 +5821,7 @@
Argentina
- Argentina
+ Argentinië
libs/ui/src/lib/i18n.ts
78
@@ -5877,7 +5877,7 @@
here
- here
+ hier
apps/client/src/app/pages/pricing/pricing-page.html
347
@@ -5885,7 +5885,7 @@
Close Holding
- Close Holding
+ Sluit Holding
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
441
@@ -6266,7 +6266,7 @@
Include in
- Include in
+ Opnemen in
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
374
@@ -6550,7 +6550,7 @@
View Holding
- View Holding
+ Bekijk Holding
libs/ui/src/lib/activities-table/activities-table.component.html
450
@@ -6694,7 +6694,7 @@
Oops! Could not update access.
- Oops! Could not update access.
+ Oops! Kan de toegang niet updaten.
apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts
178
@@ -6702,7 +6702,7 @@
, based on your total assets of
- , based on your total assets of
+ opnemen, dit is gebaseerd op uw totale vermogen van
apps/client/src/app/pages/portfolio/fire/fire-page.html
96
@@ -6822,7 +6822,7 @@
Role
- Role
+ Rol
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
33
@@ -6862,7 +6862,7 @@
If you plan to open an account at
- If you plan to open an account at
+ Als u van plan bent een rekening te openen bij
apps/client/src/app/pages/pricing/pricing-page.html
312
@@ -6894,7 +6894,7 @@
send an e-mail to
- send an e-mail to
+ stuur een e-mail naar
apps/client/src/app/pages/about/overview/about-overview-page.html
87
@@ -6966,7 +6966,7 @@
, assuming a
- , assuming a
+ , uitgaande van
apps/client/src/app/pages/portfolio/fire/fire-page.html
174
@@ -7054,7 +7054,7 @@
Ghostfolio is a lightweight wealth management application for individuals to keep track of stocks, ETFs or cryptocurrencies and make solid, data-driven investment decisions.
- Ghostfolio is a lightweight wealth management application for individuals to keep track of stocks, ETFs or cryptocurrencies and make solid, data-driven investment decisions.
+ Ghostfolio is een gebruiksvriendelijke applicatie voor vermogensbeheer waarmee particulieren hun aandelen, ETF's of cryptovaluta kunnen volgen en weloverwogen, datagestuurde beleggingsbeslissingen kunnen nemen.
apps/client/src/app/pages/about/overview/about-overview-page.html
10
@@ -7384,7 +7384,7 @@
Change with currency effect
- Change with currency effect
+ Verandering met valuta-effect
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
116
@@ -7524,7 +7524,7 @@
The project has been initiated by
- The project has been initiated by
+ Het project is geïnitieerd door
apps/client/src/app/pages/about/overview/about-overview-page.html
40
@@ -7548,7 +7548,7 @@
Total amount
- Total amount
+ Totaal bedrag
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
95
@@ -7640,7 +7640,7 @@
Find account, holding or page...
- Find account, holding or page...
+ Vindt een account, holding of pagina...
libs/ui/src/lib/assistant/assistant.component.ts
115
@@ -7890,7 +7890,7 @@
Fee Ratio
- Fee Ratio
+ Vergoedingsverhouding
apps/client/src/app/pages/i18n/i18n-page.html
152
@@ -7898,7 +7898,7 @@
The fees do exceed ${thresholdMax}% of your total investment volume (${feeRatio}%)
- The fees do exceed ${thresholdMax}% of your total investment volume (${feeRatio}%)
+ De kosten overschrijden ${thresholdMax}% van uw totale investeringsvolume (${feeRatio}%)
apps/client/src/app/pages/i18n/i18n-page.html
154
@@ -7906,7 +7906,7 @@
The fees do not exceed ${thresholdMax}% of your total investment volume (${feeRatio}%)
- The fees do not exceed ${thresholdMax}% of your total investment volume (${feeRatio}%)
+ De kosten bedragen maximaal ${thresholdMax}% van uw totale investeringsvolume (${feeRatio}%)
apps/client/src/app/pages/i18n/i18n-page.html
158
@@ -8064,7 +8064,7 @@
Current month
- Current month
+ Huidige maand
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
195
@@ -8249,7 +8249,7 @@
If you encounter a bug, would like to suggest an improvement or a new feature, please join the Ghostfolio Slack community, post to @ghostfolio_
- If you encounter a bug, would like to suggest an improvement or a new feature, please join the Ghostfolio Slack community, post to @ghostfolio_
+ Als je een bug tegenkomt, een verbetering wilt voorstellen of een nieuwe functie wilt toevoegen, word dan lid van de Ghostfolio Slack-community. Stuur een bericht naar @ghostfolio_
apps/client/src/app/pages/about/overview/about-overview-page.html
69
@@ -8373,7 +8373,7 @@
Liquidity
- Liquidity
+ Liquiditeit
apps/client/src/app/pages/i18n/i18n-page.html
70
@@ -8381,7 +8381,7 @@
Buying Power
- Buying Power
+ Koopkracht
apps/client/src/app/pages/i18n/i18n-page.html
71
@@ -8389,7 +8389,7 @@
Your buying power is below ${thresholdMin} ${baseCurrency}
- Your buying power is below ${thresholdMin} ${baseCurrency}
+ Uw koopkracht ligt onder ${thresholdMin} ${baseCurrency}
apps/client/src/app/pages/i18n/i18n-page.html
73
@@ -8397,7 +8397,7 @@
Your buying power is 0 ${baseCurrency}
- Your buying power is 0 ${baseCurrency}
+ Uw koopkracht is 0 ${baseCurrency}
apps/client/src/app/pages/i18n/i18n-page.html
77
@@ -8405,7 +8405,7 @@
Your buying power exceeds ${thresholdMin} ${baseCurrency}
- Your buying power exceeds ${thresholdMin} ${baseCurrency}
+ Uw koopkracht overschrijdt ${thresholdMin} ${baseCurrency}
apps/client/src/app/pages/i18n/i18n-page.html
80
@@ -8709,7 +8709,7 @@
Registration Date
- Registration Date
+ Registratiedatum
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
45
From 8b714d18ab37e340a454a3b5d1c648bd319dbf8b Mon Sep 17 00:00:00 2001
From: Davide Riccobelli <49486400+riccobelli@users.noreply.github.com>
Date: Sun, 1 Mar 2026 09:58:50 +0100
Subject: [PATCH 02/33] Task/improve language localization for IT (#6416)
* Improve language localization for IT
* Update changelog
---
CHANGELOG.md | 1 +
apps/client/src/locales/messages.it.xlf | 2 +-
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ac47df943..667b25e5d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed
- Improved the language localization for Dutch (`nl`)
+- Improved the language localization for Italian (`it`)
## 2.244.0 - 2026-02-28
diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf
index 05bb6afb2..20bfd1b33 100644
--- a/apps/client/src/locales/messages.it.xlf
+++ b/apps/client/src/locales/messages.it.xlf
@@ -3244,7 +3244,7 @@
Summary
- Summario
+ Riepilogo
apps/client/src/app/components/home-summary/home-summary.html
2
From 08c04e69cf74e499fd766c1356a6485a1d9b61d6 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Sun, 1 Mar 2026 10:01:59 +0100
Subject: [PATCH 03/33] Task/exclude scraper configuration and symbol mapping
from import and export functionality (#6415)
* Exclude scraper configuration and symbol mapping from import and export
* Update changelog
---
CHANGELOG.md | 2 ++
apps/api/src/app/export/export.service.ts | 5 -----
.../src/app/services/import-activities.service.ts | 2 --
libs/common/src/lib/dtos/create-asset-profile.dto.ts | 11 -----------
.../interfaces/responses/export-response.interface.ts | 7 ++++++-
test/import/ok/penthouse-apartment.json | 2 --
test/import/ok/sample.json | 4 ----
7 files changed, 8 insertions(+), 25 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 667b25e5d..65d27e77a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,6 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed
+- Excluded the scraper configuration from the import and export functionality
+- Excluded the symbol mapping from the import and export functionality
- Improved the language localization for Dutch (`nl`)
- Improved the language localization for Italian (`it`)
diff --git a/apps/api/src/app/export/export.service.ts b/apps/api/src/app/export/export.service.ts
index d07b199be..55f8d7dc9 100644
--- a/apps/api/src/app/export/export.service.ts
+++ b/apps/api/src/app/export/export.service.ts
@@ -182,10 +182,8 @@ export class ExportService {
isActive,
isin,
name,
- scraperConfiguration,
sectors,
symbol,
- symbolMapping,
url
}) => {
return {
@@ -204,11 +202,8 @@ export class ExportService {
isin,
marketData: marketDataByAssetProfile[id],
name,
- scraperConfiguration:
- scraperConfiguration as unknown as Prisma.JsonArray,
sectors: sectors as unknown as Prisma.JsonArray,
symbol,
- symbolMapping,
url
};
}
diff --git a/apps/client/src/app/services/import-activities.service.ts b/apps/client/src/app/services/import-activities.service.ts
index 94d8470f7..55b5c44d5 100644
--- a/apps/client/src/app/services/import-activities.service.ts
+++ b/apps/client/src/app/services/import-activities.service.ts
@@ -97,9 +97,7 @@ export class ImportActivitiesService {
isin: null,
marketData: [],
name: symbol,
- scraperConfiguration: null,
sectors: [],
- symbolMapping: {},
url: null
});
}
diff --git a/libs/common/src/lib/dtos/create-asset-profile.dto.ts b/libs/common/src/lib/dtos/create-asset-profile.dto.ts
index 80d45ba42..85ad73cc0 100644
--- a/libs/common/src/lib/dtos/create-asset-profile.dto.ts
+++ b/libs/common/src/lib/dtos/create-asset-profile.dto.ts
@@ -5,7 +5,6 @@ import {
IsArray,
IsBoolean,
IsEnum,
- IsObject,
IsOptional,
IsString,
IsUrl
@@ -66,10 +65,6 @@ export class CreateAssetProfileDto {
@IsString()
name?: string;
- @IsObject()
- @IsOptional()
- scraperConfiguration?: Prisma.InputJsonObject;
-
@IsArray()
@IsOptional()
sectors?: Prisma.InputJsonArray;
@@ -77,12 +72,6 @@ export class CreateAssetProfileDto {
@IsString()
symbol: string;
- @IsObject()
- @IsOptional()
- symbolMapping?: {
- [dataProvider: string]: string;
- };
-
@IsOptional()
@IsUrl({
protocols: ['https'],
diff --git a/libs/common/src/lib/interfaces/responses/export-response.interface.ts b/libs/common/src/lib/interfaces/responses/export-response.interface.ts
index 8b1697ca4..fa592faf2 100644
--- a/libs/common/src/lib/interfaces/responses/export-response.interface.ts
+++ b/libs/common/src/lib/interfaces/responses/export-response.interface.ts
@@ -27,7 +27,12 @@ export interface ExportResponse {
> & { dataSource: DataSource; date: string; symbol: string })[];
assetProfiles: (Omit<
SymbolProfile,
- 'createdAt' | 'id' | 'updatedAt' | 'userId'
+ | 'createdAt'
+ | 'id'
+ | 'scraperConfiguration'
+ | 'symbolMapping'
+ | 'updatedAt'
+ | 'userId'
> & {
marketData: MarketData[];
})[];
diff --git a/test/import/ok/penthouse-apartment.json b/test/import/ok/penthouse-apartment.json
index 0c35521e6..3b5e5420b 100644
--- a/test/import/ok/penthouse-apartment.json
+++ b/test/import/ok/penthouse-apartment.json
@@ -21,10 +21,8 @@
"isin": null,
"marketData": [],
"name": "Penthouse Apartment",
- "scraperConfiguration": null,
"sectors": [],
"symbol": "7e91b7d4-1430-4212-8380-289a06c9bbc1",
- "symbolMapping": {},
"url": null
}
],
diff --git a/test/import/ok/sample.json b/test/import/ok/sample.json
index bc2798718..be385812a 100644
--- a/test/import/ok/sample.json
+++ b/test/import/ok/sample.json
@@ -41,10 +41,8 @@
"isin": null,
"marketData": [],
"name": "Account Opening Fee",
- "scraperConfiguration": null,
"sectors": [],
"symbol": "14a69cb9-1e31-43fa-b320-83703d8ed74b",
- "symbolMapping": {},
"url": null
},
{
@@ -63,10 +61,8 @@
"isin": null,
"marketData": [],
"name": "Penthouse Apartment",
- "scraperConfiguration": null,
"sectors": [],
"symbol": "7e91b7d4-1430-4212-8380-289a06c9bbc1",
- "symbolMapping": {},
"url": null
}
],
From b5eb7d988462578426b0712b0e763f806b30d0f0 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Sun, 1 Mar 2026 10:02:36 +0100
Subject: [PATCH 04/33] Bugfix/resolve data source transformation in export and
performance endpoint (#6411)
* Resolve data source transformation in errors of performance endpoint and export functionality
* Update changelog
---
CHANGELOG.md | 5 +++++
.../transform-data-source-in-response.interceptor.ts | 2 ++
2 files changed, 7 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 65d27e77a..684d41096 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -14,6 +14,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Improved the language localization for Dutch (`nl`)
- Improved the language localization for Italian (`it`)
+### Fixed
+
+- Resolved the data source transformation in the errors of the performance endpoint
+- Resolved the data source transformation in the export functionality
+
## 2.244.0 - 2026-02-28
### Changed
diff --git a/apps/api/src/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor.ts b/apps/api/src/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor.ts
index eaa6dd08c..3cccd6efa 100644
--- a/apps/api/src/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor.ts
+++ b/apps/api/src/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor.ts
@@ -62,8 +62,10 @@ export class TransformDataSourceInResponseInterceptor<
valueMap,
object: data,
paths: [
+ 'activities[*].dataSource',
'activities[*].SymbolProfile.dataSource',
'benchmarks[*].dataSource',
+ 'errors[*].dataSource',
'fearAndGreedIndex.CRYPTOCURRENCIES.dataSource',
'fearAndGreedIndex.STOCKS.dataSource',
'holdings[*].dataSource',
From 5bcdaa396fd6964348c7f9992265ad1fd261de1e Mon Sep 17 00:00:00 2001
From: Ariel Pons <78991076+arielpons@users.noreply.github.com>
Date: Sun, 1 Mar 2026 06:05:45 -0300
Subject: [PATCH 05/33] Task/improve language localization for ES (#6417)
* Improve language localization for ES
* Update changelog
---
CHANGELOG.md | 1 +
apps/client/src/locales/messages.es.xlf | 2 +-
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 684d41096..5c1cbfa79 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Excluded the symbol mapping from the import and export functionality
- Improved the language localization for Dutch (`nl`)
- Improved the language localization for Italian (`it`)
+- Improved the language localization for Spanish (`es`)
### Fixed
diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf
index 74e0810c1..ba5a38d67 100644
--- a/apps/client/src/locales/messages.es.xlf
+++ b/apps/client/src/locales/messages.es.xlf
@@ -3344,7 +3344,7 @@
No Activities
- No Activities
+ Sin actividades
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
146
From 83347ba5dd307326e7664ed005751b95186c7370 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Sun, 1 Mar 2026 10:07:50 +0100
Subject: [PATCH 06/33] Release 2.245.0 (#6418)
---
CHANGELOG.md | 2 +-
package-lock.json | 4 ++--
package.json | 2 +-
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5c1cbfa79..e34823b31 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
-## Unreleased
+## 2.245.0 - 2026-03-01
### Changed
diff --git a/package-lock.json b/package-lock.json
index dbe97b386..f7371da13 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "ghostfolio",
- "version": "2.244.0",
+ "version": "2.245.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "ghostfolio",
- "version": "2.244.0",
+ "version": "2.245.0",
"hasInstallScript": true,
"license": "AGPL-3.0",
"dependencies": {
diff --git a/package.json b/package.json
index d1d0df2bb..794a09ea7 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "ghostfolio",
- "version": "2.244.0",
+ "version": "2.245.0",
"homepage": "https://ghostfol.io",
"license": "AGPL-3.0",
"repository": "https://github.com/ghostfolio/ghostfolio",
From ddd36a1c7d7af0aa1027f6dcc10f1c07eb327843 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Sun, 1 Mar 2026 12:35:29 +0100
Subject: [PATCH 07/33] Task/eliminate OnDestroy lifecycle hook from about
overview page (#6419)
* Eliminate OnDestroy lifecycle hook
---
.../overview/about-overview-page.component.ts | 17 +++++------------
1 file changed, 5 insertions(+), 12 deletions(-)
diff --git a/apps/client/src/app/pages/about/overview/about-overview-page.component.ts b/apps/client/src/app/pages/about/overview/about-overview-page.component.ts
index bea19a1b9..9c399762b 100644
--- a/apps/client/src/app/pages/about/overview/about-overview-page.component.ts
+++ b/apps/client/src/app/pages/about/overview/about-overview-page.component.ts
@@ -9,9 +9,10 @@ import {
ChangeDetectorRef,
Component,
CUSTOM_ELEMENTS_SCHEMA,
- OnDestroy,
+ DestroyRef,
OnInit
} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { MatButtonModule } from '@angular/material/button';
import { RouterModule } from '@angular/router';
import { IonIcon } from '@ionic/angular/standalone';
@@ -23,8 +24,6 @@ import {
logoX,
mail
} from 'ionicons/icons';
-import { Subject } from 'rxjs';
-import { takeUntil } from 'rxjs/operators';
@Component({
imports: [CommonModule, IonIcon, MatButtonModule, RouterModule],
@@ -33,7 +32,7 @@ import { takeUntil } from 'rxjs/operators';
styleUrls: ['./about-overview-page.scss'],
templateUrl: './about-overview-page.html'
})
-export class GfAboutOverviewPageComponent implements OnDestroy, OnInit {
+export class GfAboutOverviewPageComponent implements OnInit {
public hasPermissionForStatistics: boolean;
public hasPermissionForSubscription: boolean;
public isLoggedIn: boolean;
@@ -43,11 +42,10 @@ export class GfAboutOverviewPageComponent implements OnDestroy, OnInit {
public routerLinkOpenStartup = publicRoutes.openStartup.routerLink;
public user: User;
- private unsubscribeSubject = new Subject();
-
public constructor(
private changeDetectorRef: ChangeDetectorRef,
private dataService: DataService,
+ private destroyRef: DestroyRef,
private userService: UserService
) {
const { globalPermissions } = this.dataService.fetchInfo();
@@ -67,7 +65,7 @@ export class GfAboutOverviewPageComponent implements OnDestroy, OnInit {
public ngOnInit() {
this.userService.stateChanged
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((state) => {
if (state?.user) {
this.user = state.user;
@@ -76,9 +74,4 @@ export class GfAboutOverviewPageComponent implements OnDestroy, OnInit {
}
});
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
From 02a61b373ceebec54e7228e3e34f60a69f366083 Mon Sep 17 00:00:00 2001
From: slegarraga <64795732+slegarraga@users.noreply.github.com>
Date: Sun, 1 Mar 2026 11:37:33 -0300
Subject: [PATCH 08/33] Task/eliminate OnDestroy lifecycle hook from register
page (#6433)
* Eliminate OnDestroy lifecycle hook
---
.../pages/register/register-page.component.ts | 17 +++++------------
1 file changed, 5 insertions(+), 12 deletions(-)
diff --git a/apps/client/src/app/pages/register/register-page.component.ts b/apps/client/src/app/pages/register/register-page.component.ts
index 21b26944e..3678f0249 100644
--- a/apps/client/src/app/pages/register/register-page.component.ts
+++ b/apps/client/src/app/pages/register/register-page.component.ts
@@ -7,15 +7,14 @@ import { DataService } from '@ghostfolio/ui/services';
import {
Component,
CUSTOM_ELEMENTS_SCHEMA,
- OnDestroy,
+ DestroyRef,
OnInit
} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { MatButtonModule } from '@angular/material/button';
import { MatDialog } from '@angular/material/dialog';
import { Router, RouterModule } from '@angular/router';
import { DeviceDetectorService } from 'ngx-device-detector';
-import { Subject } from 'rxjs';
-import { takeUntil } from 'rxjs/operators';
import { UserAccountRegistrationDialogParams } from './user-account-registration-dialog/interfaces/interfaces';
import { GfUserAccountRegistrationDialogComponent } from './user-account-registration-dialog/user-account-registration-dialog.component';
@@ -28,7 +27,7 @@ import { GfUserAccountRegistrationDialogComponent } from './user-account-registr
styleUrls: ['./register-page.scss'],
templateUrl: './register-page.html'
})
-export class GfRegisterPageComponent implements OnDestroy, OnInit {
+export class GfRegisterPageComponent implements OnInit {
public deviceType: string;
public hasPermissionForAuthGoogle: boolean;
public hasPermissionForAuthToken: boolean;
@@ -37,10 +36,9 @@ export class GfRegisterPageComponent implements OnDestroy, OnInit {
public historicalDataItems: LineChartItem[];
public info: InfoItem;
- private unsubscribeSubject = new Subject();
-
public constructor(
private dataService: DataService,
+ private destroyRef: DestroyRef,
private deviceService: DeviceDetectorService,
private dialog: MatDialog,
private router: Router,
@@ -93,7 +91,7 @@ export class GfRegisterPageComponent implements OnDestroy, OnInit {
dialogRef
.afterClosed()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((authToken) => {
if (authToken) {
this.tokenStorageService.saveToken(authToken, true);
@@ -102,9 +100,4 @@ export class GfRegisterPageComponent implements OnDestroy, OnInit {
}
});
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
From 41de73fe41b6dfa835acbfff42ca992824be95b6 Mon Sep 17 00:00:00 2001
From: slegarraga <64795732+slegarraga@users.noreply.github.com>
Date: Sun, 1 Mar 2026 12:06:26 -0300
Subject: [PATCH 09/33] Task/eliminate OnDestroy lifecycle hook from features
page (#6431)
* Eliminate OnDestroy lifecycle hook
---
.../pages/features/features-page.component.ts | 16 +++++-----------
1 file changed, 5 insertions(+), 11 deletions(-)
diff --git a/apps/client/src/app/pages/features/features-page.component.ts b/apps/client/src/app/pages/features/features-page.component.ts
index b9eb91fe2..cef90f2e5 100644
--- a/apps/client/src/app/pages/features/features-page.component.ts
+++ b/apps/client/src/app/pages/features/features-page.component.ts
@@ -5,11 +5,11 @@ import { publicRoutes } from '@ghostfolio/common/routes/routes';
import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
import { DataService } from '@ghostfolio/ui/services';
-import { ChangeDetectorRef, Component, OnDestroy } from '@angular/core';
+import { ChangeDetectorRef, Component, DestroyRef } from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { MatButtonModule } from '@angular/material/button';
import { MatCardModule } from '@angular/material/card';
import { RouterModule } from '@angular/router';
-import { Subject, takeUntil } from 'rxjs';
@Component({
host: { class: 'page' },
@@ -23,7 +23,7 @@ import { Subject, takeUntil } from 'rxjs';
styleUrls: ['./features-page.scss'],
templateUrl: './features-page.html'
})
-export class GfFeaturesPageComponent implements OnDestroy {
+export class GfFeaturesPageComponent {
public hasPermissionForSubscription: boolean;
public hasPermissionToCreateUser: boolean;
public info: InfoItem;
@@ -31,11 +31,10 @@ export class GfFeaturesPageComponent implements OnDestroy {
public routerLinkResources = publicRoutes.resources.routerLink;
public user: User;
- private unsubscribeSubject = new Subject();
-
public constructor(
private changeDetectorRef: ChangeDetectorRef,
private dataService: DataService,
+ private destroyRef: DestroyRef,
private userService: UserService
) {
this.info = this.dataService.fetchInfo();
@@ -43,7 +42,7 @@ export class GfFeaturesPageComponent implements OnDestroy {
public ngOnInit() {
this.userService.stateChanged
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((state) => {
if (state?.user) {
this.user = state.user;
@@ -62,9 +61,4 @@ export class GfFeaturesPageComponent implements OnDestroy {
permissions.createUserAccount
);
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
From 8c83742d9c741db13e63fea943129eef43bb01a8 Mon Sep 17 00:00:00 2001
From: slegarraga <64795732+slegarraga@users.noreply.github.com>
Date: Sun, 1 Mar 2026 12:07:50 -0300
Subject: [PATCH 10/33] Task/eliminate OnDestroy lifecycle hook from webauthn
page (#6429)
* Eliminate OnDestroy lifecycle hook
---
.../pages/webauthn/webauthn-page.component.ts | 24 +++++++++----------
1 file changed, 11 insertions(+), 13 deletions(-)
diff --git a/apps/client/src/app/pages/webauthn/webauthn-page.component.ts b/apps/client/src/app/pages/webauthn/webauthn-page.component.ts
index 74631eeca..8e7e58fd1 100644
--- a/apps/client/src/app/pages/webauthn/webauthn-page.component.ts
+++ b/apps/client/src/app/pages/webauthn/webauthn-page.component.ts
@@ -2,12 +2,16 @@ import { TokenStorageService } from '@ghostfolio/client/services/token-storage.s
import { WebAuthnService } from '@ghostfolio/client/services/web-authn.service';
import { GfLogoComponent } from '@ghostfolio/ui/logo';
-import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';
+import {
+ ChangeDetectorRef,
+ Component,
+ DestroyRef,
+ OnInit
+} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { MatButtonModule } from '@angular/material/button';
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
import { Router } from '@angular/router';
-import { Subject } from 'rxjs';
-import { takeUntil } from 'rxjs/operators';
@Component({
host: { class: 'page' },
@@ -16,13 +20,12 @@ import { takeUntil } from 'rxjs/operators';
styleUrls: ['./webauthn-page.scss'],
templateUrl: './webauthn-page.html'
})
-export class GfWebauthnPageComponent implements OnDestroy, OnInit {
+export class GfWebauthnPageComponent implements OnInit {
public hasError = false;
- private unsubscribeSubject = new Subject();
-
public constructor(
private changeDetectorRef: ChangeDetectorRef,
+ private destroyRef: DestroyRef,
private router: Router,
private tokenStorageService: TokenStorageService,
private webAuthnService: WebAuthnService
@@ -35,7 +38,7 @@ export class GfWebauthnPageComponent implements OnDestroy, OnInit {
public deregisterDevice() {
this.webAuthnService
.deregister()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(() => {
this.router.navigate(['/']);
});
@@ -46,7 +49,7 @@ export class GfWebauthnPageComponent implements OnDestroy, OnInit {
this.webAuthnService
.login()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(
({ authToken }) => {
this.tokenStorageService.saveToken(authToken, false);
@@ -59,9 +62,4 @@ export class GfWebauthnPageComponent implements OnDestroy, OnInit {
}
);
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
From 412b37956ae26298556c1c0573d9da1033c82c34 Mon Sep 17 00:00:00 2001
From: slegarraga <64795732+slegarraga@users.noreply.github.com>
Date: Sun, 1 Mar 2026 12:09:23 -0300
Subject: [PATCH 11/33] Task/eliminate OnDestroy lifecycle hook from portfolio
page (#6430)
* Eliminate OnDestroy lifecycle hook
---
.../portfolio/portfolio-page.component.ts | 22 +++++++++----------
1 file changed, 10 insertions(+), 12 deletions(-)
diff --git a/apps/client/src/app/pages/portfolio/portfolio-page.component.ts b/apps/client/src/app/pages/portfolio/portfolio-page.component.ts
index 387e3fd0f..eb4935127 100644
--- a/apps/client/src/app/pages/portfolio/portfolio-page.component.ts
+++ b/apps/client/src/app/pages/portfolio/portfolio-page.component.ts
@@ -2,7 +2,13 @@ import { UserService } from '@ghostfolio/client/services/user/user.service';
import { TabConfiguration, User } from '@ghostfolio/common/interfaces';
import { internalRoutes } from '@ghostfolio/common/routes/routes';
-import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';
+import {
+ ChangeDetectorRef,
+ Component,
+ DestroyRef,
+ OnInit
+} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { MatTabsModule } from '@angular/material/tabs';
import { RouterModule } from '@angular/router';
import { addIcons } from 'ionicons';
@@ -14,8 +20,6 @@ import {
swapVerticalOutline
} from 'ionicons/icons';
import { DeviceDetectorService } from 'ngx-device-detector';
-import { Subject } from 'rxjs';
-import { takeUntil } from 'rxjs/operators';
@Component({
host: { class: 'page has-tabs' },
@@ -24,20 +28,19 @@ import { takeUntil } from 'rxjs/operators';
styleUrls: ['./portfolio-page.scss'],
templateUrl: './portfolio-page.html'
})
-export class PortfolioPageComponent implements OnDestroy, OnInit {
+export class PortfolioPageComponent implements OnInit {
public deviceType: string;
public tabs: TabConfiguration[] = [];
public user: User;
- private unsubscribeSubject = new Subject();
-
public constructor(
private changeDetectorRef: ChangeDetectorRef,
+ private destroyRef: DestroyRef,
private deviceService: DeviceDetectorService,
private userService: UserService
) {
this.userService.stateChanged
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((state) => {
if (state?.user) {
this.tabs = [
@@ -87,9 +90,4 @@ export class PortfolioPageComponent implements OnDestroy, OnInit {
public ngOnInit() {
this.deviceType = this.deviceService.getDeviceInfo().deviceType;
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
From 28bf3dff079326ad190f9ecccf3487c02584c512 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Sun, 1 Mar 2026 17:17:18 +0100
Subject: [PATCH 12/33] Task/remove unused OnDestroy hook in privacy policy
page component (#6381)
* Remove unused OnDestroy hook
---
.../privacy-policy/privacy-policy-page.component.ts | 12 ++----------
1 file changed, 2 insertions(+), 10 deletions(-)
diff --git a/apps/client/src/app/pages/about/privacy-policy/privacy-policy-page.component.ts b/apps/client/src/app/pages/about/privacy-policy/privacy-policy-page.component.ts
index 78881cd2c..50e4e3e2f 100644
--- a/apps/client/src/app/pages/about/privacy-policy/privacy-policy-page.component.ts
+++ b/apps/client/src/app/pages/about/privacy-policy/privacy-policy-page.component.ts
@@ -1,6 +1,5 @@
-import { Component, OnDestroy } from '@angular/core';
+import { Component } from '@angular/core';
import { MarkdownModule } from 'ngx-markdown';
-import { Subject } from 'rxjs';
@Component({
imports: [MarkdownModule],
@@ -8,11 +7,4 @@ import { Subject } from 'rxjs';
styleUrls: ['./privacy-policy-page.scss'],
templateUrl: './privacy-policy-page.html'
})
-export class GfPrivacyPolicyPageComponent implements OnDestroy {
- private unsubscribeSubject = new Subject();
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
-}
+export class GfPrivacyPolicyPageComponent {}
From f3f655591149286b9e724b95a76188fbba8ac6ff Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Sun, 1 Mar 2026 17:17:53 +0100
Subject: [PATCH 13/33] Task/remove unused OnDestroy hook in blog page
component (#6382)
* Remove unused OnDestroy hook
---
.../client/src/app/pages/blog/blog-page.component.ts | 12 ++----------
1 file changed, 2 insertions(+), 10 deletions(-)
diff --git a/apps/client/src/app/pages/blog/blog-page.component.ts b/apps/client/src/app/pages/blog/blog-page.component.ts
index 8a379a7e4..7f2c56d2d 100644
--- a/apps/client/src/app/pages/blog/blog-page.component.ts
+++ b/apps/client/src/app/pages/blog/blog-page.component.ts
@@ -1,13 +1,12 @@
import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { DataService } from '@ghostfolio/ui/services';
-import { Component, CUSTOM_ELEMENTS_SCHEMA, OnDestroy } from '@angular/core';
+import { Component, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { MatCardModule } from '@angular/material/card';
import { RouterModule } from '@angular/router';
import { IonIcon } from '@ionic/angular/standalone';
import { addIcons } from 'ionicons';
import { chevronForwardOutline } from 'ionicons/icons';
-import { Subject } from 'rxjs';
@Component({
host: { class: 'page' },
@@ -17,11 +16,9 @@ import { Subject } from 'rxjs';
styleUrls: ['./blog-page.scss'],
templateUrl: './blog-page.html'
})
-export class GfBlogPageComponent implements OnDestroy {
+export class GfBlogPageComponent {
public hasPermissionForSubscription: boolean;
- private unsubscribeSubject = new Subject();
-
public constructor(private dataService: DataService) {
const info = this.dataService.fetchInfo();
@@ -32,9 +29,4 @@ export class GfBlogPageComponent implements OnDestroy {
addIcons({ chevronForwardOutline });
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
From 1ffe64e8066067da6366cd896de69ba5535b80d1 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Sun, 1 Mar 2026 18:00:26 +0100
Subject: [PATCH 14/33] Task/upgrade Nx to version 22.5.3 (#6444)
* Upgrade Nx to version 22.5.3
* Update changelog
---
CHANGELOG.md | 6 +
package-lock.json | 665 ++++++++++++++++++++++++----------------------
package.json | 22 +-
3 files changed, 370 insertions(+), 323 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e34823b31..d7ebb665c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+## Unreleased
+
+### Changed
+
+- Upgraded `Nx` from version `22.4.5` to `22.5.3`
+
## 2.245.0 - 2026-03-01
### Changed
diff --git a/package-lock.json b/package-lock.json
index f7371da13..52b460666 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -108,16 +108,16 @@
"@eslint/js": "9.35.0",
"@nestjs/schematics": "11.0.9",
"@nestjs/testing": "11.1.14",
- "@nx/angular": "22.4.5",
- "@nx/eslint-plugin": "22.4.5",
- "@nx/jest": "22.4.5",
- "@nx/js": "22.4.5",
- "@nx/module-federation": "22.4.5",
- "@nx/nest": "22.4.5",
- "@nx/node": "22.4.5",
- "@nx/storybook": "22.4.5",
- "@nx/web": "22.4.5",
- "@nx/workspace": "22.4.5",
+ "@nx/angular": "22.5.3",
+ "@nx/eslint-plugin": "22.5.3",
+ "@nx/jest": "22.5.3",
+ "@nx/js": "22.5.3",
+ "@nx/module-federation": "22.5.3",
+ "@nx/nest": "22.5.3",
+ "@nx/node": "22.5.3",
+ "@nx/storybook": "22.5.3",
+ "@nx/web": "22.5.3",
+ "@nx/workspace": "22.5.3",
"@schematics/angular": "21.1.1",
"@storybook/addon-docs": "10.1.10",
"@storybook/angular": "10.1.10",
@@ -142,7 +142,7 @@
"jest": "30.2.0",
"jest-environment-jsdom": "30.2.0",
"jest-preset-angular": "16.0.0",
- "nx": "22.4.5",
+ "nx": "22.5.3",
"prettier": "3.8.1",
"prettier-plugin-organize-attributes": "1.0.0",
"prisma": "6.19.0",
@@ -6672,15 +6672,15 @@
}
},
"node_modules/@module-federation/node": {
- "version": "2.7.31",
- "resolved": "https://registry.npmjs.org/@module-federation/node/-/node-2.7.31.tgz",
- "integrity": "sha512-NSa0PFDKDLxmtfmCVHW9RhtfD9mcNOrp1d+cjVEoxb5x8dDI4jQTi1o3nsa9ettxs3bVtWhAUEQUNQBQ6ZA+Hw==",
+ "version": "2.7.32",
+ "resolved": "https://registry.npmjs.org/@module-federation/node/-/node-2.7.32.tgz",
+ "integrity": "sha512-hUj5v2GGwpNzl2gaJS4AyzCYRzJBhN8875A+ucKF9tq3jaQb5zpy3izYMISqqbN2q9a7jz3nEUgwAh3pjri+rQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@module-federation/enhanced": "2.0.0",
- "@module-federation/runtime": "2.0.0",
- "@module-federation/sdk": "2.0.0",
+ "@module-federation/enhanced": "2.0.1",
+ "@module-federation/runtime": "2.0.1",
+ "@module-federation/sdk": "2.0.1",
"btoa": "1.2.1",
"encoding": "^0.1.13",
"node-fetch": "2.7.0"
@@ -6695,26 +6695,26 @@
}
},
"node_modules/@module-federation/node/node_modules/@module-federation/bridge-react-webpack-plugin": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-2.0.0.tgz",
- "integrity": "sha512-AVT/rZK6RHva6ZTYfsyQ8oP4xYNTws3OzqKW/YxWaLXwQ3oG9ZbF7fKl4jIKoMKuuy2L9MGVXS4CYPZy0s8fXg==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-2.0.1.tgz",
+ "integrity": "sha512-D7LMW5EMAJShOMR1aZDAJ6s+MdsYDHaQyJADLQ3LaY0sne/BkVqkPikUwcO1IwOwKbXjYsDlQVOEvk9wZVRFhA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@module-federation/sdk": "2.0.0",
+ "@module-federation/sdk": "2.0.1",
"@types/semver": "7.5.8",
"semver": "7.6.3"
}
},
"node_modules/@module-federation/node/node_modules/@module-federation/cli": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@module-federation/cli/-/cli-2.0.0.tgz",
- "integrity": "sha512-IWGWbdgoeNcuA5jzqPr6pLTN1hovMQh9A1lgJp5fAvKfICfFXKq7K8nwMAQrWD6iEKApIenI0madk1Dg2PU3pw==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@module-federation/cli/-/cli-2.0.1.tgz",
+ "integrity": "sha512-2SL5Y8iODNX10y9T3CBLhHjSXo4afnA1BK82m4sNfZebuVO+o34bxewqwod9xfWq9xhTZmOSFZ+n+lgTKRv+CQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@module-federation/dts-plugin": "2.0.0",
- "@module-federation/sdk": "2.0.0",
+ "@module-federation/dts-plugin": "2.0.1",
+ "@module-federation/sdk": "2.0.1",
"chalk": "3.0.0",
"commander": "11.1.0",
"jiti": "2.4.2"
@@ -6727,14 +6727,14 @@
}
},
"node_modules/@module-federation/node/node_modules/@module-federation/data-prefetch": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@module-federation/data-prefetch/-/data-prefetch-2.0.0.tgz",
- "integrity": "sha512-KPyZoqNrb5WgFY2owYnMaO2Mg2DYD6KXLVI7GPguj7Z/4pPKEC+SUjWU2FuSfTeyE6ZIi0iFGdwerxzlQ6nfmw==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@module-federation/data-prefetch/-/data-prefetch-2.0.1.tgz",
+ "integrity": "sha512-Kq0P1OABGt6QAvs6TaE/zY9Ut9Y/oJFrzoSF3eWaCYbUAr2KD2SpTyMsPz4ssBzjeKXTgimugh6tHHd6mpCBIQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@module-federation/runtime": "2.0.0",
- "@module-federation/sdk": "2.0.0",
+ "@module-federation/runtime": "2.0.1",
+ "@module-federation/sdk": "2.0.1",
"fs-extra": "9.1.0"
},
"peerDependencies": {
@@ -6751,16 +6751,16 @@
}
},
"node_modules/@module-federation/node/node_modules/@module-federation/dts-plugin": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-2.0.0.tgz",
- "integrity": "sha512-YyYMgLNARKdf3FLihnIzzUTgafHrqzR9YnKPmrfuCm2Jit+USqFT4QO58hcb0F5KSEyjB2ARPz9RM4XAVZhzMg==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-2.0.1.tgz",
+ "integrity": "sha512-PLneTsf1fQS5/RTBedtLAAmCPRdMfIlhfJkOa8QH3WDJaQsqm8Wb3r2cTUBf2aNj/bP3aH/y6Hs9JFB/4x0l5g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@module-federation/error-codes": "2.0.0",
- "@module-federation/managers": "2.0.0",
- "@module-federation/sdk": "2.0.0",
- "@module-federation/third-party-dts-extractor": "2.0.0",
+ "@module-federation/error-codes": "2.0.1",
+ "@module-federation/managers": "2.0.1",
+ "@module-federation/sdk": "2.0.1",
+ "@module-federation/third-party-dts-extractor": "2.0.1",
"adm-zip": "^0.5.10",
"ansi-colors": "^4.1.3",
"axios": "^1.12.0",
@@ -6785,23 +6785,23 @@
}
},
"node_modules/@module-federation/node/node_modules/@module-federation/enhanced": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@module-federation/enhanced/-/enhanced-2.0.0.tgz",
- "integrity": "sha512-xeVrGvypYMvN8gJulbro3j1t8+aS1f9xjj4quwAAqgJF0Nz8bt7sXUYJyjUHPmC2UZsShZ0GnPHJNtI8/2GYjA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@module-federation/bridge-react-webpack-plugin": "2.0.0",
- "@module-federation/cli": "2.0.0",
- "@module-federation/data-prefetch": "2.0.0",
- "@module-federation/dts-plugin": "2.0.0",
- "@module-federation/error-codes": "2.0.0",
- "@module-federation/inject-external-runtime-core-plugin": "2.0.0",
- "@module-federation/managers": "2.0.0",
- "@module-federation/manifest": "2.0.0",
- "@module-federation/rspack": "2.0.0",
- "@module-federation/runtime-tools": "2.0.0",
- "@module-federation/sdk": "2.0.0",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@module-federation/enhanced/-/enhanced-2.0.1.tgz",
+ "integrity": "sha512-EZIARQ/8ScoTP6PV8+E4SsmMYWK4ErrikZJ0G/FX8wvK8mCtdoKatFtvDN9++P6Nl78kN9zHYgAV4AHKdBVjfQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@module-federation/bridge-react-webpack-plugin": "2.0.1",
+ "@module-federation/cli": "2.0.1",
+ "@module-federation/data-prefetch": "2.0.1",
+ "@module-federation/dts-plugin": "2.0.1",
+ "@module-federation/error-codes": "2.0.1",
+ "@module-federation/inject-external-runtime-core-plugin": "2.0.1",
+ "@module-federation/managers": "2.0.1",
+ "@module-federation/manifest": "2.0.1",
+ "@module-federation/rspack": "2.0.1",
+ "@module-federation/runtime-tools": "2.0.1",
+ "@module-federation/sdk": "2.0.1",
"btoa": "^1.2.1",
"schema-utils": "^4.3.0",
"upath": "2.0.1"
@@ -6827,62 +6827,62 @@
}
},
"node_modules/@module-federation/node/node_modules/@module-federation/error-codes": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-2.0.0.tgz",
- "integrity": "sha512-9oE+hXuPv2zej7AxJ5hOgeRqlPs98meooV2FiutTfftLAyy2N6+Kwmmz5NR9d9t91weJj8N0cSHFoyenNHKTVg==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-2.0.1.tgz",
+ "integrity": "sha512-2bJF/ft+qL9L6Zvq2t/G9/f/0wFL73cM8/NJ04uyYz9BjIgvx28K5qu8/6+IwgEEKATG7vOhBBVj6wH3S+5ASA==",
"dev": true,
"license": "MIT"
},
"node_modules/@module-federation/node/node_modules/@module-federation/inject-external-runtime-core-plugin": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@module-federation/inject-external-runtime-core-plugin/-/inject-external-runtime-core-plugin-2.0.0.tgz",
- "integrity": "sha512-aZ6f4UU7KM5zBnHf3xsb2guqsfaEd6IlmuldbpED3JPk4ITwZk0DbvxRMr4prde7cfj8RH0nKMz2kmMncp+lIQ==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@module-federation/inject-external-runtime-core-plugin/-/inject-external-runtime-core-plugin-2.0.1.tgz",
+ "integrity": "sha512-oAA7G+4GCHM+WRYfscR/x4GwCyM9CEqfdD9/x2L6y8mtLWK9anRLKTocsI759AvzXsbT1m3EQ5ki1O6wlwDu3g==",
"dev": true,
"license": "MIT",
"peerDependencies": {
- "@module-federation/runtime-tools": "2.0.0"
+ "@module-federation/runtime-tools": "2.0.1"
}
},
"node_modules/@module-federation/node/node_modules/@module-federation/managers": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-2.0.0.tgz",
- "integrity": "sha512-ZmkRIujH+T3xvkmy04TNvviFH8xFOrNeKCLb4tlH4ifU/kLfjTu+PYO/KAEIsgtmrDnd52zTf22dg3ok85OAHA==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-2.0.1.tgz",
+ "integrity": "sha512-KR01lSlcYRQ9C6hW2a8CQQtAE0LvfTLgtV/6ZNUTagw8sRfeDln+ggrZsYilKu9zl0i8RPDgpv/kS60o4lcxCQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@module-federation/sdk": "2.0.0",
+ "@module-federation/sdk": "2.0.1",
"find-pkg": "2.0.0",
"fs-extra": "9.1.0"
}
},
"node_modules/@module-federation/node/node_modules/@module-federation/manifest": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@module-federation/manifest/-/manifest-2.0.0.tgz",
- "integrity": "sha512-AXwYyGiDJdfP9MteKyIdJrLwG5tp4qKaq0uOPiWHilYN3/21G0DM7f30HgJqgx3WSTFSh7hcq0a3V3EZHH/9TA==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@module-federation/manifest/-/manifest-2.0.1.tgz",
+ "integrity": "sha512-p8nYGjHWp17MsYdW/Vv0ogBDiTTsI1PHWPQbvVIqLQXDqwiesaRSRR1zziECXQoEL8lV5Bs+uSkcaJGhea9P+A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@module-federation/dts-plugin": "2.0.0",
- "@module-federation/managers": "2.0.0",
- "@module-federation/sdk": "2.0.0",
+ "@module-federation/dts-plugin": "2.0.1",
+ "@module-federation/managers": "2.0.1",
+ "@module-federation/sdk": "2.0.1",
"chalk": "3.0.0",
"find-pkg": "2.0.0"
}
},
"node_modules/@module-federation/node/node_modules/@module-federation/rspack": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-2.0.0.tgz",
- "integrity": "sha512-1kziarKrPRM+rJax/AaMEZTwu7ORGed2xSxfdoP9GEbAFEGyNliadvw4kB6PqAfLad3PI4lQMX2vGMLI1KoyVQ==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-2.0.1.tgz",
+ "integrity": "sha512-SAlNE8iclFmzrKtx3/C2GivXYx6nPzx4MgQV01QG/a4LpnLbwlxzdZu3rqQ2swp4NNWT/t/GT7Y+7gfhyVa7mg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@module-federation/bridge-react-webpack-plugin": "2.0.0",
- "@module-federation/dts-plugin": "2.0.0",
- "@module-federation/inject-external-runtime-core-plugin": "2.0.0",
- "@module-federation/managers": "2.0.0",
- "@module-federation/manifest": "2.0.0",
- "@module-federation/runtime-tools": "2.0.0",
- "@module-federation/sdk": "2.0.0",
+ "@module-federation/bridge-react-webpack-plugin": "2.0.1",
+ "@module-federation/dts-plugin": "2.0.1",
+ "@module-federation/inject-external-runtime-core-plugin": "2.0.1",
+ "@module-federation/managers": "2.0.1",
+ "@module-federation/manifest": "2.0.1",
+ "@module-federation/runtime-tools": "2.0.1",
+ "@module-federation/sdk": "2.0.1",
"btoa": "1.2.1"
},
"peerDependencies": {
@@ -6900,50 +6900,50 @@
}
},
"node_modules/@module-federation/node/node_modules/@module-federation/runtime": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-2.0.0.tgz",
- "integrity": "sha512-vPxQrmQNq3Z1T+1fkHEvFwTdJq9wuCLvdp/lpu9k2Oy7QP/Pj6QoQ/S7J5MCIAoRwj8Wj3z3ma21/DyHwLGvzA==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-2.0.1.tgz",
+ "integrity": "sha512-UQ72P5Oo40dS6vdhHetwTtIsbGciEr+bjoYvDgh1WLPfFlTYd8zo9cLfqaf3juuPfV3cMVARAVPmh16lQYpUGA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@module-federation/error-codes": "2.0.0",
- "@module-federation/runtime-core": "2.0.0",
- "@module-federation/sdk": "2.0.0"
+ "@module-federation/error-codes": "2.0.1",
+ "@module-federation/runtime-core": "2.0.1",
+ "@module-federation/sdk": "2.0.1"
}
},
"node_modules/@module-federation/node/node_modules/@module-federation/runtime-core": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-2.0.0.tgz",
- "integrity": "sha512-UhIGUs7Mg+TwMI2lgaLnj4UehpoyXbR7HDb2+vLikgBulPmFtodeWfsxCgENEwKsIY1vS0lOun15lNOn1vo3Xg==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-2.0.1.tgz",
+ "integrity": "sha512-gOuCPSHoQGUGwlxfSTMInFX+QvLxdEWegGGMiLdU5vqbXuva4E9M+kXBBO7/0MkcBPMmVs0wOJGm0XOLeV2f1Q==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@module-federation/error-codes": "2.0.0",
- "@module-federation/sdk": "2.0.0"
+ "@module-federation/error-codes": "2.0.1",
+ "@module-federation/sdk": "2.0.1"
}
},
"node_modules/@module-federation/node/node_modules/@module-federation/runtime-tools": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-2.0.0.tgz",
- "integrity": "sha512-eMDQN4hYpwvUnCNMjfQdtPVzYaO2DdauemHVc4HnyibgqijRzBwJh9bI2ph4R1xfYEm18+QmTrfXrRlaK2Xizw==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-2.0.1.tgz",
+ "integrity": "sha512-AStdwBtsGB3jIfDg9oP+KyVPsimdaeHsP855gqCxDp1hi2+GKjlZWZx9ThkS8NytVSXSUysxqoUL1ivDoKgcCQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@module-federation/runtime": "2.0.0",
- "@module-federation/webpack-bundler-runtime": "2.0.0"
+ "@module-federation/runtime": "2.0.1",
+ "@module-federation/webpack-bundler-runtime": "2.0.1"
}
},
"node_modules/@module-federation/node/node_modules/@module-federation/sdk": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-2.0.0.tgz",
- "integrity": "sha512-JYd1wTulsaoLT7HTk2oXL5y5797Z+H4mzxuUEKnSJo7R34RZSqehsqPSND7n0HT/1nf7uyn0Rb4qBfR3BVvdHQ==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-2.0.1.tgz",
+ "integrity": "sha512-32PwudojGjog51cwpTali7D6ud82oVgsyvOx9JjAzhvXBX96YI4mRsursuWcthDxmigJP9ZvUTXDuRUEDh1OQA==",
"dev": true,
"license": "MIT"
},
"node_modules/@module-federation/node/node_modules/@module-federation/third-party-dts-extractor": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-2.0.0.tgz",
- "integrity": "sha512-B99+Wkbd2xIodVTjNCeFtFC89Uh2/AtYkSESlz4+6Cec42wyqrGxyfYm4qRY0LhJI+YmZXLk/RTm85m15eBKKg==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-2.0.1.tgz",
+ "integrity": "sha512-neKSr6FNUeGRh+YR57l/QZUzPytJXuJx+babF7j5iGJG3FP+kfizr6QD0hgVis5KEoXMVbQ8yyvG0slERizeyw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -6953,14 +6953,14 @@
}
},
"node_modules/@module-federation/node/node_modules/@module-federation/webpack-bundler-runtime": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-2.0.0.tgz",
- "integrity": "sha512-XxiFR/A1G1fa9hTyylWNbs6yEU2hC7FqHAArFptD4U9qp/xyoLgqbK4M8LwltOAyAM8hRofcMdSyiRKVlWqAfQ==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-2.0.1.tgz",
+ "integrity": "sha512-u1NId3SF4lHDTmD2CHFEszulmXmIq1TGw9JYvnLx5rKJL7xt3aNxcb1GvkaYbRNVBXhSMjJ75E5LsQlZzyBx9A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@module-federation/runtime": "2.0.0",
- "@module-federation/sdk": "2.0.0"
+ "@module-federation/runtime": "2.0.1",
+ "@module-federation/sdk": "2.0.1"
}
},
"node_modules/@module-federation/node/node_modules/jiti": {
@@ -8282,20 +8282,20 @@
}
},
"node_modules/@nx/angular": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/angular/-/angular-22.4.5.tgz",
- "integrity": "sha512-mwffAG7qhElwtWCEIaH7bTJuE3foaFBa3LWReqNc9HkIZmka0BDHRReg3wyhfSGq4ZQlYXK5sQS2uDJd+Qj97Q==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/angular/-/angular-22.5.3.tgz",
+ "integrity": "sha512-Z5vNcPl95CsTnRhDszWZ0ort22dEtMxdqJFkVzdNwolhfiLm1eKP2Rc8q9MnUdrZMeTqDKnCckG2qs12FZrIkw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@nx/devkit": "22.4.5",
- "@nx/eslint": "22.4.5",
- "@nx/js": "22.4.5",
- "@nx/module-federation": "22.4.5",
- "@nx/rspack": "22.4.5",
- "@nx/web": "22.4.5",
- "@nx/webpack": "22.4.5",
- "@nx/workspace": "22.4.5",
+ "@nx/devkit": "22.5.3",
+ "@nx/eslint": "22.5.3",
+ "@nx/js": "22.5.3",
+ "@nx/module-federation": "22.5.3",
+ "@nx/rspack": "22.5.3",
+ "@nx/web": "22.5.3",
+ "@nx/webpack": "22.5.3",
+ "@nx/workspace": "22.5.3",
"@phenomnomnominal/tsquery": "~6.1.4",
"@typescript-eslint/type-utils": "^8.0.0",
"enquirer": "~2.3.6",
@@ -8343,15 +8343,15 @@
}
},
"node_modules/@nx/cypress": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/cypress/-/cypress-22.4.5.tgz",
- "integrity": "sha512-FAGLQa7dnMW5Z93bS5isw9WgVNapCOgRFgxl9sA1ePstte3Vh0ajRpvVjVoeVHyA3qg6aQbE41ctErOdq/p5bg==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/cypress/-/cypress-22.5.3.tgz",
+ "integrity": "sha512-0jIYOhU1sFv5w2NYmyxIdpT4pC7QvUphrM4QLyUk8nEfO5gwfmON7JLNbtDveX+FeGpjy1zDjoBdd2OBzqUEcA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@nx/devkit": "22.4.5",
- "@nx/eslint": "22.4.5",
- "@nx/js": "22.4.5",
+ "@nx/devkit": "22.5.3",
+ "@nx/eslint": "22.5.3",
+ "@nx/js": "22.5.3",
"@phenomnomnominal/tsquery": "~6.1.4",
"detect-port": "^1.5.1",
"semver": "^7.6.3",
@@ -8368,16 +8368,16 @@
}
},
"node_modules/@nx/devkit": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-22.4.5.tgz",
- "integrity": "sha512-mw5G6k/XTkL675eVIcFpyZdfdIc3wQMSSGWzfA6tQGmANDYc/NFGeZR9wDqXDceHXnYKoRO6g6GhKTOHUCW23Q==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-22.5.3.tgz",
+ "integrity": "sha512-zhRNTFsi4pbwg7L/zhBHtTOSevlgwm1iKlhPlQWoOv2PR6b+3JvjL8o4P1MbkIkut3Lsn+oTuJJ1LUPlr5vprg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@zkochan/js-yaml": "0.0.7",
"ejs": "^3.1.7",
"enquirer": "~2.3.6",
- "minimatch": "10.1.1",
+ "minimatch": "10.2.1",
"semver": "^7.6.3",
"tslib": "^2.3.0",
"yargs-parser": "21.1.1"
@@ -8386,14 +8386,37 @@
"nx": ">= 21 <= 23 || ^22.0.0-0"
}
},
+ "node_modules/@nx/devkit/node_modules/balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
+ "node_modules/@nx/devkit/node_modules/brace-expansion": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz",
+ "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^4.0.2"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
"node_modules/@nx/devkit/node_modules/minimatch": {
- "version": "10.1.1",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz",
- "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==",
+ "version": "10.2.1",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.1.tgz",
+ "integrity": "sha512-MClCe8IL5nRRmawL6ib/eT4oLyeKMGCghibcDWK+J0hh0Q8kqSdia6BvbRMVk6mPa6WqUa5uR2oxt6C5jd533A==",
"dev": true,
"license": "BlueOak-1.0.0",
"dependencies": {
- "@isaacs/brace-expansion": "^5.0.0"
+ "brace-expansion": "^5.0.2"
},
"engines": {
"node": "20 || >=22"
@@ -8403,33 +8426,33 @@
}
},
"node_modules/@nx/docker": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/docker/-/docker-22.4.5.tgz",
- "integrity": "sha512-ZgBjd/HCgqkulYJwUH+xQvgsoupVD+2leiFmK5lFjb6IDny/W1uB3EVL5BZxrz8ftMoqiq+AP6Ubiaj99V4hzQ==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/docker/-/docker-22.5.3.tgz",
+ "integrity": "sha512-4BO1hAyun2MM15w1oldUZtCvZEZlDXOCeEkimVij9znk6t4FUBnH7v87Uj4w5dhJAWB7yJFgQbF5w1fZbhRXfw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@nx/devkit": "22.4.5",
+ "@nx/devkit": "22.5.3",
"enquirer": "~2.3.6",
"tslib": "^2.3.0"
}
},
"node_modules/@nx/eslint": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/eslint/-/eslint-22.4.5.tgz",
- "integrity": "sha512-/N/kG86gqagDziC7Ij/WwAnjjXx55E1Jbpp3kkau3Ncj+wjPoLqCebpg6aW83VJQ7a4SUU0BO3U5bkqQZPGBXQ==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/eslint/-/eslint-22.5.3.tgz",
+ "integrity": "sha512-XJKpwnSJRCat+81sUDdJWWvKz3vKo/3X9oHMGDzTYx3mexCgKgpmHBuRVgnZ9n2IVDx8S5ye4ICc9qiY6oHWIA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@nx/devkit": "22.4.5",
- "@nx/js": "22.4.5",
+ "@nx/devkit": "22.5.3",
+ "@nx/js": "22.5.3",
"semver": "^7.6.3",
"tslib": "^2.3.0",
"typescript": "~5.9.2"
},
"peerDependencies": {
"@zkochan/js-yaml": "0.0.7",
- "eslint": "^8.0.0 || ^9.0.0"
+ "eslint": "^8.0.0 || ^9.0.0 || ^10.0.0"
},
"peerDependenciesMeta": {
"@zkochan/js-yaml": {
@@ -8438,14 +8461,14 @@
}
},
"node_modules/@nx/eslint-plugin": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/eslint-plugin/-/eslint-plugin-22.4.5.tgz",
- "integrity": "sha512-Kb3owVrbhRkJAjqEDsgDs8eSlI2/uEFOS35a8Z1drHIpMF6Zt9OHQf6bKELeXzG3fC2AGM3pyunauhbJ/ZmqMw==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/eslint-plugin/-/eslint-plugin-22.5.3.tgz",
+ "integrity": "sha512-dFz3nSUOV+VLc+ZQxWncKINhych6h5oEfInWp1+5WkeUBW5/x77IsM3Hpq1JrjAK6dqXjmzTsFnoU8c5Cf1Q4w==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@nx/devkit": "22.4.5",
- "@nx/js": "22.4.5",
+ "@nx/devkit": "22.5.3",
+ "@nx/js": "22.5.3",
"@phenomnomnominal/tsquery": "~6.1.4",
"@typescript-eslint/type-utils": "^8.0.0",
"@typescript-eslint/utils": "^8.0.0",
@@ -8497,22 +8520,22 @@
}
},
"node_modules/@nx/jest": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/jest/-/jest-22.4.5.tgz",
- "integrity": "sha512-qlEJc0Jbp8E14g7+piHH8DXsAm6C3w1CLuvtE57+LFMhM2zbBDiQ8oeXBdFPEHLCfpbSK/4yCSEmkUj1Yyrs2A==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/jest/-/jest-22.5.3.tgz",
+ "integrity": "sha512-4yaGlApTR09zdz4fC4Ep0aENcaon5rDRDOUnEJblU67ik35jds9mczHq2rBMJO4Cnjj1pM9acm08Vb0Wg+9cuQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/reporters": "^30.0.2",
"@jest/test-result": "^30.0.2",
- "@nx/devkit": "22.4.5",
- "@nx/js": "22.4.5",
+ "@nx/devkit": "22.5.3",
+ "@nx/js": "22.5.3",
"@phenomnomnominal/tsquery": "~6.1.4",
"identity-obj-proxy": "3.0.0",
"jest-config": "^30.0.2",
"jest-resolve": "^30.0.2",
"jest-util": "^30.0.2",
- "minimatch": "10.1.1",
+ "minimatch": "10.2.1",
"picocolors": "^1.1.0",
"resolve.exports": "2.0.3",
"semver": "^7.6.3",
@@ -8520,14 +8543,37 @@
"yargs-parser": "21.1.1"
}
},
+ "node_modules/@nx/jest/node_modules/balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
+ "node_modules/@nx/jest/node_modules/brace-expansion": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz",
+ "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^4.0.2"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
"node_modules/@nx/jest/node_modules/minimatch": {
- "version": "10.1.1",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz",
- "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==",
+ "version": "10.2.1",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.1.tgz",
+ "integrity": "sha512-MClCe8IL5nRRmawL6ib/eT4oLyeKMGCghibcDWK+J0hh0Q8kqSdia6BvbRMVk6mPa6WqUa5uR2oxt6C5jd533A==",
"dev": true,
"license": "BlueOak-1.0.0",
"dependencies": {
- "@isaacs/brace-expansion": "^5.0.0"
+ "brace-expansion": "^5.0.2"
},
"engines": {
"node": "20 || >=22"
@@ -8537,9 +8583,9 @@
}
},
"node_modules/@nx/js": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/js/-/js-22.4.5.tgz",
- "integrity": "sha512-t8972z2uF6X5i4FFmTlnvSwwxfHkk87zBpKQK0yMH5CzOENViVFNbiPnbvCIJcGNrgVUSALL3f2ngwKcTZObmA==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/js/-/js-22.5.3.tgz",
+ "integrity": "sha512-gglQYL6GeSH0mt6NpEFTXMFFFePU3B7TEyZq7LLUYZDH5y65izgNpdSAuEqYR7xHLtahVnesDlhPw3rtRiwMwA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -8550,8 +8596,8 @@
"@babel/preset-env": "^7.23.2",
"@babel/preset-typescript": "^7.22.5",
"@babel/runtime": "^7.22.6",
- "@nx/devkit": "22.4.5",
- "@nx/workspace": "22.4.5",
+ "@nx/devkit": "22.5.3",
+ "@nx/workspace": "22.5.3",
"@zkochan/js-yaml": "0.0.7",
"babel-plugin-const-enum": "^1.0.1",
"babel-plugin-macros": "^3.1.0",
@@ -8625,18 +8671,18 @@
}
},
"node_modules/@nx/module-federation": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/module-federation/-/module-federation-22.4.5.tgz",
- "integrity": "sha512-aNO595Xk0B4av9tpAaePF0jjDooAiXN34xEpFleSCmf8y31371JfkI8WMSnIZLa5ehyk1U+oMxHyYtt7v0RFWw==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/module-federation/-/module-federation-22.5.3.tgz",
+ "integrity": "sha512-dKRkT/ULV+nXr7O25YMDwQu/4nxl27AcHJfOmVBVKquXrtrBu/d6dbypfFDMyr5pXqR5gb2euEw0mGVMyHLTiA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@module-federation/enhanced": "^0.21.2",
"@module-federation/node": "^2.7.21",
"@module-federation/sdk": "^0.21.2",
- "@nx/devkit": "22.4.5",
- "@nx/js": "22.4.5",
- "@nx/web": "22.4.5",
+ "@nx/devkit": "22.5.3",
+ "@nx/js": "22.5.3",
+ "@nx/web": "22.5.3",
"@rspack/core": "1.6.8",
"express": "^4.21.2",
"http-proxy-middleware": "^3.0.5",
@@ -8947,41 +8993,41 @@
}
},
"node_modules/@nx/nest": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/nest/-/nest-22.4.5.tgz",
- "integrity": "sha512-cFufm3cPuy7Cj10D8BB2Y+Vo1w/1ihQGeduXprC0gs719dI5zvyG8bVOYJ+m87HHdFVQ8ckIVVifO6T7ujWgFw==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/nest/-/nest-22.5.3.tgz",
+ "integrity": "sha512-DShcD4HdaABg9L7/qgLVgZj0LLSaaYa7Rrj8zquMGGZXrxozCTKzn/7vWrN7Am9hY4wEwaXTXwauHAFoIj9C9A==",
"dev": true,
"license": "MIT",
"dependencies": {
"@nestjs/schematics": "^11.0.0",
- "@nx/devkit": "22.4.5",
- "@nx/eslint": "22.4.5",
- "@nx/js": "22.4.5",
- "@nx/node": "22.4.5",
+ "@nx/devkit": "22.5.3",
+ "@nx/eslint": "22.5.3",
+ "@nx/js": "22.5.3",
+ "@nx/node": "22.5.3",
"tslib": "^2.3.0"
}
},
"node_modules/@nx/node": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/node/-/node-22.4.5.tgz",
- "integrity": "sha512-ZYN3uIeUs0jKPX9Io75DkISMo5ha15djVLPNFhsh6qgQkL7+mqXGeW3QiEso16XZqbl0Iw2Ye5msrBO6UShFkQ==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/node/-/node-22.5.3.tgz",
+ "integrity": "sha512-szdpsyRUzXBhMIiEk+zI3XPP/e0U1wNmIzkvgCS1e+ejsA1jq0EF5sppkdwJEQVAb6O5hiCPKED+1sSo4TR4/A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@nx/devkit": "22.4.5",
- "@nx/docker": "22.4.5",
- "@nx/eslint": "22.4.5",
- "@nx/jest": "22.4.5",
- "@nx/js": "22.4.5",
+ "@nx/devkit": "22.5.3",
+ "@nx/docker": "22.5.3",
+ "@nx/eslint": "22.5.3",
+ "@nx/jest": "22.5.3",
+ "@nx/js": "22.5.3",
"kill-port": "^1.6.1",
"tcp-port-used": "^1.0.2",
"tslib": "^2.3.0"
}
},
"node_modules/@nx/nx-darwin-arm64": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-22.4.5.tgz",
- "integrity": "sha512-zdRHZv1AMvzgp+5g2VZNXXuqk0/n1wOFksOeZ6BRyKg6hC2YkjGyn5xle/UK668MDAwe9KKm4jizvztK/LlPuA==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-22.5.3.tgz",
+ "integrity": "sha512-cKXBq5bJanXp8uv6+wPvx/G4q4oFpOxMSPGaeFOVhbul2QHGGq+XMcSo+D8aYJCsk1YnbyAnnQ8r8RH/kTK5Mw==",
"cpu": [
"arm64"
],
@@ -8993,9 +9039,9 @@
]
},
"node_modules/@nx/nx-darwin-x64": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-22.4.5.tgz",
- "integrity": "sha512-1NVWaSgpa8yawi2UILX4NE9UcMuNzAAGh95JSV2yJovRfKxFQgQSB6hj0gpJu+TLLVCroTqy4woSQ2a0SPodeQ==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-22.5.3.tgz",
+ "integrity": "sha512-mToS41o8I+8CfxYVRMTISkgT7I1cnazgwMf7U9DoLqKOwOZzj9WD3NmsWc1h69QNJPltbeRPS8y/wnhu7RHzRA==",
"cpu": [
"x64"
],
@@ -9007,9 +9053,9 @@
]
},
"node_modules/@nx/nx-freebsd-x64": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-22.4.5.tgz",
- "integrity": "sha512-baaLz53wr/HsVfSJ7ZgIFCPAb/OtP7yPPasb3eIu65oVhSswGfgvz9+YINhuInUgW7x7STmRnhGeR8pj6iqFqw==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-22.5.3.tgz",
+ "integrity": "sha512-CAWysdFSZVbTfdjNXojd9TgXbZiK9i0k3njROeV+jORsDWw4Eth3PDmK94Wk916b3n2hS0UjyI6RZaMy2GEqzA==",
"cpu": [
"x64"
],
@@ -9021,9 +9067,9 @@
]
},
"node_modules/@nx/nx-linux-arm-gnueabihf": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-22.4.5.tgz",
- "integrity": "sha512-wRBPv/l39tz+sQjZUH4hygCsd/DoUXUbDYkR6lnNXWHAVyPUh48/27JozM8hD3o/G3O2Vd8PFQasIXtvy2GS0Q==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-22.5.3.tgz",
+ "integrity": "sha512-PRjPrijQQbdrvYwNuA3xQ3VXEQ4zfhnPjy+S2ZlQZqhFI4mlP22xfhOH1bQ7pIfzCNC2f/J9UMNYOrq/bEFjBg==",
"cpu": [
"arm"
],
@@ -9035,9 +9081,9 @@
]
},
"node_modules/@nx/nx-linux-arm64-gnu": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-22.4.5.tgz",
- "integrity": "sha512-6B/yCFiqjvV2Bkz6MKUtfFWjwtiF53DN07K1BFksMpQef+h2yE1IrGaG/OCl6VaVl4VRzQgLOluqP96M1yhDgg==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-22.5.3.tgz",
+ "integrity": "sha512-dmDBio/5z4Zch2VlRMdgBPm53d8xwq1l7xLj1dFMKjfE7ByfPukjPM7ZEYBiPckfiQfJBRh6HKDN7uEkA/y8CQ==",
"cpu": [
"arm64"
],
@@ -9049,9 +9095,9 @@
]
},
"node_modules/@nx/nx-linux-arm64-musl": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-22.4.5.tgz",
- "integrity": "sha512-n0v60vRYn7BDHWB588snPZntLO2XC8/pvLd+QunneM2VGEPf51n5llX5U3AwTt/ybaZHWhbuHv0sJBIbT4I0GA==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-22.5.3.tgz",
+ "integrity": "sha512-E81ET/MnnKfuLhKiovF5ueJirHOMjhC1eK0MDM2Do9wdPyusZzfGSVFQ9DOHtg7L37dAE95NNd1lCVO8gJ96vg==",
"cpu": [
"arm64"
],
@@ -9063,9 +9109,9 @@
]
},
"node_modules/@nx/nx-linux-x64-gnu": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-22.4.5.tgz",
- "integrity": "sha512-zT7nb1PRE3NcW/HFnbgKJ9ZPtCOeVDpbJ5J4ZhHj36ZAUWZVXFEIPq9VTIZFy5+0pioLUIClQQY7OUfwnV/Zig==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-22.5.3.tgz",
+ "integrity": "sha512-AgXCsPCzC0sAu2VRclMjs7LrvPQfqS3sFiehlXWTbNHQitPZLuAmQGb2l4T8lbMOs0Xn3EIrg6BF6/ntTTp6Xg==",
"cpu": [
"x64"
],
@@ -9077,9 +9123,9 @@
]
},
"node_modules/@nx/nx-linux-x64-musl": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-22.4.5.tgz",
- "integrity": "sha512-r8Rls5BS7lGQbUNX1Z1S370XrOacOU1bQ/dxY8i7qahFQKnMwpFo0W8odhgzjk+vrC/WLf9jOgz5/JPzehQBIw==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-22.5.3.tgz",
+ "integrity": "sha512-sKs4bFQRu8Btxf5rMYKPsRVNxkQ2ey8sqoCyhJj8fwJF05DayK2ErJAR/rhtBK0c1NV7kQiKJA8nWBV3jnCdsg==",
"cpu": [
"x64"
],
@@ -9091,9 +9137,9 @@
]
},
"node_modules/@nx/nx-win32-arm64-msvc": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-22.4.5.tgz",
- "integrity": "sha512-Lv81LTnG6sSvBOq2vDSeyfzpF9X0cTGlJdzJOJzPZXCZGFhTV1ig9TdLiij/GM2JwV4Kvq5Co6YzA5dxtGUphQ==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-22.5.3.tgz",
+ "integrity": "sha512-KOCQLakSO5vl4D6et9qPytOAmkgq2IIuhI8A/g0xbD1LqrIlRPa+bdkZqOGpODYAk3NyKAk7hWHsqfXKHwwX6w==",
"cpu": [
"arm64"
],
@@ -9105,9 +9151,9 @@
]
},
"node_modules/@nx/nx-win32-x64-msvc": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-22.4.5.tgz",
- "integrity": "sha512-52RfBcq9PXt76soCAZAJcNmCYrdsg6BvhBmjf0IFTMZ8IaeqZ9ktxAy1TZf/gCkOaM3ly4htbYMStiZ4MHX7Eg==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-22.5.3.tgz",
+ "integrity": "sha512-a6ZB2La82RIHcz4nrt3H6RZaOa+xkC2IPzhU9hMo2gbkLdIxn8wyof8uGA0frncmIVHuLc3nFAhpBOgf4j6tMA==",
"cpu": [
"x64"
],
@@ -9119,16 +9165,16 @@
]
},
"node_modules/@nx/rspack": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/rspack/-/rspack-22.4.5.tgz",
- "integrity": "sha512-pqaJ713Jv82abDGisArEtKprAO0DuGxp7zddwpYW04J4Y8YmRAQFA3KriMPqjWTXuV3l4kpaqU7FtZ/3Xn1ShA==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/rspack/-/rspack-22.5.3.tgz",
+ "integrity": "sha512-2T5dkoC08FJGF8ZMiJDaKN6giXAljV0+LK7q5GJpSEUm+wtjZ/DRVoWSnlf8Dj/e0/cLb2GMElVcfjyDDDeV9w==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@nx/devkit": "22.4.5",
- "@nx/js": "22.4.5",
- "@nx/module-federation": "22.4.5",
- "@nx/web": "22.4.5",
+ "@nx/devkit": "22.5.3",
+ "@nx/js": "22.5.3",
+ "@nx/module-federation": "22.5.3",
+ "@nx/web": "22.5.3",
"@phenomnomnominal/tsquery": "~6.1.4",
"@rspack/core": "1.6.8",
"@rspack/dev-server": "^1.1.4",
@@ -9550,16 +9596,16 @@
}
},
"node_modules/@nx/storybook": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/storybook/-/storybook-22.4.5.tgz",
- "integrity": "sha512-cxJDYpfpYcK0iuiJMHk6InLXXNLedj8VlOkRtcnZKuwDlC8quMSOuHKrdvBOjeOLV4C390/94BlzkToUZSey6g==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/storybook/-/storybook-22.5.3.tgz",
+ "integrity": "sha512-eP7cpRKnC1oYlOjSZU07Kf8BV8hNRPPXRib7BVdwwIUZ2v4K/b/cje2WCG729q4gk8fyoV8o7JNVgM+QGT8kBQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@nx/cypress": "22.4.5",
- "@nx/devkit": "22.4.5",
- "@nx/eslint": "22.4.5",
- "@nx/js": "22.4.5",
+ "@nx/cypress": "22.5.3",
+ "@nx/devkit": "22.5.3",
+ "@nx/eslint": "22.5.3",
+ "@nx/js": "22.5.3",
"@phenomnomnominal/tsquery": "~6.1.4",
"semver": "^7.6.3",
"tslib": "^2.3.0"
@@ -9569,14 +9615,14 @@
}
},
"node_modules/@nx/web": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/web/-/web-22.4.5.tgz",
- "integrity": "sha512-VXXkONZS7DEDDKUE8EUCiV7XhC+HmotExPKznU6NquoFpBZqvWCfC0rt/gKk2uIxJGu8qoISqtIIHFc6iO65RA==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/web/-/web-22.5.3.tgz",
+ "integrity": "sha512-Z7FYN5e9HIJAuJV0MU8jHaoEv9vgiLbpe1bbWPItfzIy02kWtSiS/aGZcLa34LDuWBfBaJVHZqFVp7OOPU26ew==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@nx/devkit": "22.4.5",
- "@nx/js": "22.4.5",
+ "@nx/devkit": "22.5.3",
+ "@nx/js": "22.5.3",
"detect-port": "^1.5.1",
"http-server": "^14.1.0",
"picocolors": "^1.1.0",
@@ -9584,15 +9630,15 @@
}
},
"node_modules/@nx/webpack": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/webpack/-/webpack-22.4.5.tgz",
- "integrity": "sha512-3NZnJwkP1ztPc4Inz0g04rWf78P3U2np/kg3nKNf2I6kowWpcJakQCsWLufBzP48ooUtE3iPDVQoFIo3SgWqDg==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/webpack/-/webpack-22.5.3.tgz",
+ "integrity": "sha512-fEWvmynjxAfdyCH00Z3oaEedv/wKZAdHl8kz7UEiOJ7eKdGbbJIK0RuobXC1r2e2ERZ35vDrOiPYdruyfi35Jg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/core": "^7.23.2",
- "@nx/devkit": "22.4.5",
- "@nx/js": "22.4.5",
+ "@nx/devkit": "22.5.3",
+ "@nx/js": "22.5.3",
"@phenomnomnominal/tsquery": "~6.1.4",
"ajv": "^8.12.0",
"autoprefixer": "^10.4.9",
@@ -9801,17 +9847,17 @@
}
},
"node_modules/@nx/workspace": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-22.4.5.tgz",
- "integrity": "sha512-QGapABrqBnRpEWbnd5UpbVCBzsYD+RlC1lWShXPpCM+dosR3qkGb+pSmxeSCsKbNVtCwYyyuRW+PvlF5Q5sU9A==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-22.5.3.tgz",
+ "integrity": "sha512-pioGwlt5zKB9PhX36I5KAeSml19Mq+g2KyQ9mh3F+3Lvft2JM4nIMELBaUfwPicPAOwNmrsx806IXO67Q4UHxQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@nx/devkit": "22.4.5",
+ "@nx/devkit": "22.5.3",
"@zkochan/js-yaml": "0.0.7",
"chalk": "^4.1.0",
"enquirer": "~2.3.6",
- "nx": "22.4.5",
+ "nx": "22.5.3",
"picomatch": "4.0.2",
"semver": "^7.6.3",
"tslib": "^2.3.0",
@@ -11651,9 +11697,9 @@
"license": "MIT"
},
"node_modules/@rspack/plugin-react-refresh": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/@rspack/plugin-react-refresh/-/plugin-react-refresh-1.6.0.tgz",
- "integrity": "sha512-OO53gkrte/Ty4iRXxxM6lkwPGxsSsupFKdrPFnjwFIYrPvFLjeolAl5cTx+FzO5hYygJiGnw7iEKTmD+ptxqDA==",
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/@rspack/plugin-react-refresh/-/plugin-react-refresh-1.6.1.tgz",
+ "integrity": "sha512-eqqW5645VG3CzGzFgNg5HqNdHVXY+567PGjtDhhrM8t67caxmsSzRmT5qfoEIfBcGgFkH9vEg7kzXwmCYQdQDw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -15017,14 +15063,14 @@
}
},
"node_modules/axios": {
- "version": "1.13.4",
- "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.4.tgz",
- "integrity": "sha512-1wVkUaAO6WyaYtCkcYCOx12ZgpGf9Zif+qXa4n+oYzK558YryKqiL6UWwd5DqiH3VRW0GYhTZQ/vlgJrCoNQlg==",
+ "version": "1.13.6",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.6.tgz",
+ "integrity": "sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "follow-redirects": "^1.15.6",
- "form-data": "^4.0.4",
+ "follow-redirects": "^1.15.11",
+ "form-data": "^4.0.5",
"proxy-from-env": "^1.1.0"
}
},
@@ -20394,9 +20440,9 @@
"license": "ISC"
},
"node_modules/follow-redirects": {
- "version": "1.15.9",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
- "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
+ "version": "1.15.11",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz",
+ "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
"funding": [
{
"type": "individual",
@@ -20482,9 +20528,9 @@
}
},
"node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "version": "6.14.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz",
+ "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -26663,9 +26709,9 @@
"license": "MIT"
},
"node_modules/nx": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/nx/-/nx-22.4.5.tgz",
- "integrity": "sha512-l68kzhnemXXGCDS9/W8eccZ7Bzse9pw1oJ466pzDM89MbA6hEaOQ0p+eDXZI++iWl0T+lYJ56EDhO23syKzt9g==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/nx/-/nx-22.5.3.tgz",
+ "integrity": "sha512-IaEPqdgaFBIr0Bfmnt6WAcX3t660sOuDXQ71lpoS8GgpD8cqX1LIW2ZyzEAdOvCP1iD6HCZehpofcVvaaL1GNQ==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
@@ -26675,12 +26721,12 @@
"@yarnpkg/parsers": "3.0.2",
"@zkochan/js-yaml": "0.0.7",
"axios": "^1.12.0",
- "chalk": "^4.1.0",
"cli-cursor": "3.1.0",
"cli-spinners": "2.6.1",
"cliui": "^8.0.1",
"dotenv": "~16.4.5",
"dotenv-expand": "~11.0.6",
+ "ejs": "^3.1.7",
"enquirer": "~2.3.6",
"figures": "3.2.0",
"flat": "^5.0.2",
@@ -26689,11 +26735,12 @@
"jest-diff": "^30.0.2",
"jsonc-parser": "3.2.0",
"lines-and-columns": "2.0.3",
- "minimatch": "10.1.1",
+ "minimatch": "10.2.1",
"node-machine-id": "1.1.12",
"npm-run-path": "^4.0.1",
"open": "^8.4.0",
"ora": "5.3.0",
+ "picocolors": "^1.1.0",
"resolve.exports": "2.0.3",
"semver": "^7.6.3",
"string-width": "^4.2.3",
@@ -26711,20 +26758,20 @@
"nx-cloud": "bin/nx-cloud.js"
},
"optionalDependencies": {
- "@nx/nx-darwin-arm64": "22.4.5",
- "@nx/nx-darwin-x64": "22.4.5",
- "@nx/nx-freebsd-x64": "22.4.5",
- "@nx/nx-linux-arm-gnueabihf": "22.4.5",
- "@nx/nx-linux-arm64-gnu": "22.4.5",
- "@nx/nx-linux-arm64-musl": "22.4.5",
- "@nx/nx-linux-x64-gnu": "22.4.5",
- "@nx/nx-linux-x64-musl": "22.4.5",
- "@nx/nx-win32-arm64-msvc": "22.4.5",
- "@nx/nx-win32-x64-msvc": "22.4.5"
+ "@nx/nx-darwin-arm64": "22.5.3",
+ "@nx/nx-darwin-x64": "22.5.3",
+ "@nx/nx-freebsd-x64": "22.5.3",
+ "@nx/nx-linux-arm-gnueabihf": "22.5.3",
+ "@nx/nx-linux-arm64-gnu": "22.5.3",
+ "@nx/nx-linux-arm64-musl": "22.5.3",
+ "@nx/nx-linux-x64-gnu": "22.5.3",
+ "@nx/nx-linux-x64-musl": "22.5.3",
+ "@nx/nx-win32-arm64-msvc": "22.5.3",
+ "@nx/nx-win32-x64-msvc": "22.5.3"
},
"peerDependencies": {
- "@swc-node/register": "^1.8.0",
- "@swc/core": "^1.3.85"
+ "@swc-node/register": "^1.11.1",
+ "@swc/core": "^1.15.8"
},
"peerDependenciesMeta": {
"@swc-node/register": {
@@ -26757,6 +26804,29 @@
"tslib": "^2.4.0"
}
},
+ "node_modules/nx/node_modules/balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
+ "node_modules/nx/node_modules/brace-expansion": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz",
+ "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^4.0.2"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
"node_modules/nx/node_modules/chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
@@ -26870,13 +26940,13 @@
"license": "MIT"
},
"node_modules/nx/node_modules/minimatch": {
- "version": "10.1.1",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz",
- "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==",
+ "version": "10.2.1",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.1.tgz",
+ "integrity": "sha512-MClCe8IL5nRRmawL6ib/eT4oLyeKMGCghibcDWK+J0hh0Q8kqSdia6BvbRMVk6mPa6WqUa5uR2oxt6C5jd533A==",
"dev": true,
"license": "BlueOak-1.0.0",
"dependencies": {
- "@isaacs/brace-expansion": "^5.0.0"
+ "brace-expansion": "^5.0.2"
},
"engines": {
"node": "20 || >=22"
@@ -32997,18 +33067,15 @@
}
},
"node_modules/ts-checker-rspack-plugin": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/ts-checker-rspack-plugin/-/ts-checker-rspack-plugin-1.2.6.tgz",
- "integrity": "sha512-aAJIfoNr2cPu8G6mqp/oPoNlUT/LgNoqt2n3SsbxWG0TwQogbjsYsr2f/fdsufUDoGDu8Jolmpf3L4PmIH/cEg==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/ts-checker-rspack-plugin/-/ts-checker-rspack-plugin-1.3.0.tgz",
+ "integrity": "sha512-89oK/BtApjdid1j9CGjPGiYry+EZBhsnTAM481/8ipgr/y2IOgCbW1HPnan+fs5FnzlpUgf9dWGNZ4Ayw3Bd8A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/code-frame": "^7.27.1",
"@rspack/lite-tapable": "^1.1.0",
"chokidar": "^3.6.0",
- "is-glob": "^4.0.3",
- "memfs": "^4.51.1",
- "minimatch": "^9.0.5",
+ "memfs": "^4.56.10",
"picocolors": "^1.1.1"
},
"peerDependencies": {
@@ -33021,16 +33088,6 @@
}
}
},
- "node_modules/ts-checker-rspack-plugin/node_modules/brace-expansion": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
- "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
"node_modules/ts-checker-rspack-plugin/node_modules/chokidar": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
@@ -33099,22 +33156,6 @@
"tslib": "2"
}
},
- "node_modules/ts-checker-rspack-plugin/node_modules/minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
"node_modules/ts-checker-rspack-plugin/node_modules/picomatch": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
diff --git a/package.json b/package.json
index 794a09ea7..8871e8acc 100644
--- a/package.json
+++ b/package.json
@@ -153,16 +153,16 @@
"@eslint/js": "9.35.0",
"@nestjs/schematics": "11.0.9",
"@nestjs/testing": "11.1.14",
- "@nx/angular": "22.4.5",
- "@nx/eslint-plugin": "22.4.5",
- "@nx/jest": "22.4.5",
- "@nx/js": "22.4.5",
- "@nx/module-federation": "22.4.5",
- "@nx/nest": "22.4.5",
- "@nx/node": "22.4.5",
- "@nx/storybook": "22.4.5",
- "@nx/web": "22.4.5",
- "@nx/workspace": "22.4.5",
+ "@nx/angular": "22.5.3",
+ "@nx/eslint-plugin": "22.5.3",
+ "@nx/jest": "22.5.3",
+ "@nx/js": "22.5.3",
+ "@nx/module-federation": "22.5.3",
+ "@nx/nest": "22.5.3",
+ "@nx/node": "22.5.3",
+ "@nx/storybook": "22.5.3",
+ "@nx/web": "22.5.3",
+ "@nx/workspace": "22.5.3",
"@schematics/angular": "21.1.1",
"@storybook/addon-docs": "10.1.10",
"@storybook/angular": "10.1.10",
@@ -187,7 +187,7 @@
"jest": "30.2.0",
"jest-environment-jsdom": "30.2.0",
"jest-preset-angular": "16.0.0",
- "nx": "22.4.5",
+ "nx": "22.5.3",
"prettier": "3.8.1",
"prettier-plugin-organize-attributes": "1.0.0",
"prisma": "6.19.0",
From 2cc36d002f87c19051f4dfed925bc4785eb3740d Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Sun, 1 Mar 2026 20:27:13 +0100
Subject: [PATCH 15/33] Task/restructure sponsors section in README.md (#6412)
* Restructure sponsors section
---
README.md | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index 3be15e49f..44212b607 100644
--- a/README.md
+++ b/README.md
@@ -313,10 +313,12 @@ Ghostfolio is **100% free** and **open source**. We encourage and support an act
Not sure what to work on? We have [some ideas](https://github.com/ghostfolio/ghostfolio/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22%20no%3Aassignee), even for [newcomers](https://github.com/ghostfolio/ghostfolio/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22%20no%3Aassignee). Please join the Ghostfolio [Slack](https://join.slack.com/t/ghostfolio/shared_invite/zt-vsaan64h-F_I0fEo5M0P88lP9ibCxFg) channel or post to [@ghostfolio\_](https://x.com/ghostfolio_) on _X_. We would love to hear from you.
-If you like to support this project, become a [**Sponsor**](https://github.com/sponsors/ghostfolio), get [**Ghostfolio Premium**](https://ghostfol.io/en/pricing) or [**Buy me a coffee**](https://www.buymeacoffee.com/ghostfolio).
-
## Sponsors
+If you like to support this project, get [**Ghostfolio Premium**](https://ghostfol.io/en/pricing), become a [**Sponsor**](https://github.com/sponsors/ghostfolio) or [**Buy me a coffee**](https://www.buymeacoffee.com/ghostfolio).
+
+
+
From 8b187c96b567edce6b0fa1763cca032206bc7686 Mon Sep 17 00:00:00 2001
From: DmytroSkachko
Date: Mon, 2 Mar 2026 12:13:24 +0100
Subject: [PATCH 16/33] Task/eliminate OnDestroy hook from ZEN page (#6452)
* Eliminate OnDestroy hook
---
.../src/app/pages/zen/zen-page.component.ts | 22 +++++++++----------
1 file changed, 10 insertions(+), 12 deletions(-)
diff --git a/apps/client/src/app/pages/zen/zen-page.component.ts b/apps/client/src/app/pages/zen/zen-page.component.ts
index 280f33c25..633f15885 100644
--- a/apps/client/src/app/pages/zen/zen-page.component.ts
+++ b/apps/client/src/app/pages/zen/zen-page.component.ts
@@ -2,15 +2,19 @@ import { UserService } from '@ghostfolio/client/services/user/user.service';
import { TabConfiguration, User } from '@ghostfolio/common/interfaces';
import { internalRoutes } from '@ghostfolio/common/routes/routes';
-import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';
+import {
+ ChangeDetectorRef,
+ Component,
+ DestroyRef,
+ OnInit
+} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { MatTabsModule } from '@angular/material/tabs';
import { RouterModule } from '@angular/router';
import { IonIcon } from '@ionic/angular/standalone';
import { addIcons } from 'ionicons';
import { albumsOutline, analyticsOutline } from 'ionicons/icons';
import { DeviceDetectorService } from 'ngx-device-detector';
-import { Subject } from 'rxjs';
-import { takeUntil } from 'rxjs/operators';
@Component({
host: { class: 'page has-tabs' },
@@ -19,20 +23,19 @@ import { takeUntil } from 'rxjs/operators';
styleUrls: ['./zen-page.scss'],
templateUrl: './zen-page.html'
})
-export class GfZenPageComponent implements OnDestroy, OnInit {
+export class GfZenPageComponent implements OnInit {
public deviceType: string;
public tabs: TabConfiguration[] = [];
public user: User;
- private unsubscribeSubject = new Subject();
-
public constructor(
private changeDetectorRef: ChangeDetectorRef,
+ private destroyRef: DestroyRef,
private deviceService: DeviceDetectorService,
private userService: UserService
) {
this.userService.stateChanged
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((state) => {
if (state?.user) {
this.tabs = [
@@ -59,9 +62,4 @@ export class GfZenPageComponent implements OnDestroy, OnInit {
public ngOnInit() {
this.deviceType = this.deviceService.getDeviceInfo().deviceType;
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
From cbf43340af06b1288ab2f36ab73800a7237678a9 Mon Sep 17 00:00:00 2001
From: Parth Sharma <99757071+pswitchy@users.noreply.github.com>
Date: Mon, 2 Mar 2026 19:01:44 +0530
Subject: [PATCH 17/33] Task/eliminate OnDestroy lifecycle hook from user
account page (#6461)
* Eliminate OnDestroy lifecycle hook
---
.../user-account/user-account-page.component.ts | 16 +++++-----------
1 file changed, 5 insertions(+), 11 deletions(-)
diff --git a/apps/client/src/app/pages/user-account/user-account-page.component.ts b/apps/client/src/app/pages/user-account/user-account-page.component.ts
index 7341660f2..24c150408 100644
--- a/apps/client/src/app/pages/user-account/user-account-page.component.ts
+++ b/apps/client/src/app/pages/user-account/user-account-page.component.ts
@@ -6,16 +6,16 @@ import {
ChangeDetectorRef,
Component,
CUSTOM_ELEMENTS_SCHEMA,
- OnDestroy,
+ DestroyRef,
OnInit
} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { MatTabsModule } from '@angular/material/tabs';
import { RouterModule } from '@angular/router';
import { IonIcon } from '@ionic/angular/standalone';
import { addIcons } from 'ionicons';
import { diamondOutline, keyOutline, settingsOutline } from 'ionicons/icons';
import { DeviceDetectorService } from 'ngx-device-detector';
-import { Subject, takeUntil } from 'rxjs';
@Component({
host: { class: 'page has-tabs' },
@@ -25,20 +25,19 @@ import { Subject, takeUntil } from 'rxjs';
styleUrls: ['./user-account-page.scss'],
templateUrl: './user-account-page.html'
})
-export class GfUserAccountPageComponent implements OnDestroy, OnInit {
+export class GfUserAccountPageComponent implements OnInit {
public deviceType: string;
public tabs: TabConfiguration[] = [];
public user: User;
- private unsubscribeSubject = new Subject();
-
public constructor(
private changeDetectorRef: ChangeDetectorRef,
+ private destroyRef: DestroyRef,
private deviceService: DeviceDetectorService,
private userService: UserService
) {
this.userService.stateChanged
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((state) => {
if (state?.user) {
this.user = state.user;
@@ -73,9 +72,4 @@ export class GfUserAccountPageComponent implements OnDestroy, OnInit {
public ngOnInit() {
this.deviceType = this.deviceService.getDeviceInfo().deviceType;
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
From c9924e030aa9df55ca9920d4f202c02059733e09 Mon Sep 17 00:00:00 2001
From: Parth Sharma <99757071+pswitchy@users.noreply.github.com>
Date: Mon, 2 Mar 2026 19:28:03 +0530
Subject: [PATCH 18/33] Task/eliminate OnDestroy lifecycle hook from home page
(#6462)
* Eliminate OnDestroy lifecycle hook
---
.../src/app/pages/home/home-page.component.ts | 19 ++++++-------------
1 file changed, 6 insertions(+), 13 deletions(-)
diff --git a/apps/client/src/app/pages/home/home-page.component.ts b/apps/client/src/app/pages/home/home-page.component.ts
index fd860ced5..5130c8166 100644
--- a/apps/client/src/app/pages/home/home-page.component.ts
+++ b/apps/client/src/app/pages/home/home-page.component.ts
@@ -8,9 +8,10 @@ import {
ChangeDetectorRef,
Component,
CUSTOM_ELEMENTS_SCHEMA,
- OnDestroy,
+ DestroyRef,
OnInit
} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { MatTabsModule } from '@angular/material/tabs';
import { RouterModule } from '@angular/router';
import { IonIcon } from '@ionic/angular/standalone';
@@ -23,8 +24,6 @@ import {
readerOutline
} from 'ionicons/icons';
import { DeviceDetectorService } from 'ngx-device-detector';
-import { Subject } from 'rxjs';
-import { takeUntil } from 'rxjs/operators';
@Component({
host: { class: 'page has-tabs' },
@@ -34,22 +33,21 @@ import { takeUntil } from 'rxjs/operators';
styleUrls: ['./home-page.scss'],
templateUrl: './home-page.html'
})
-export class GfHomePageComponent implements OnDestroy, OnInit {
+export class GfHomePageComponent implements OnInit {
public deviceType: string;
public hasImpersonationId: boolean;
public tabs: TabConfiguration[] = [];
public user: User;
- private unsubscribeSubject = new Subject();
-
public constructor(
private changeDetectorRef: ChangeDetectorRef,
+ private destroyRef: DestroyRef,
private deviceService: DeviceDetectorService,
private impersonationStorageService: ImpersonationStorageService,
private userService: UserService
) {
this.userService.stateChanged
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((state) => {
if (state?.user) {
this.user = state.user;
@@ -110,14 +108,9 @@ export class GfHomePageComponent implements OnDestroy, OnInit {
this.impersonationStorageService
.onChangeHasImpersonation()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((impersonationId) => {
this.hasImpersonationId = !!impersonationId;
});
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
From e273bfcbea492901b330e8a18d3ddeab9d4359c6 Mon Sep 17 00:00:00 2001
From: Parth Sharma <99757071+pswitchy@users.noreply.github.com>
Date: Mon, 2 Mar 2026 23:48:41 +0530
Subject: [PATCH 19/33] Task/eliminate OnDestroy lifecycle hook from
allocations page (#6463)
* Eliminate OnDestroy lifecycle hook
---
.../allocations/allocations-page.component.ts | 30 +++++++++----------
1 file changed, 14 insertions(+), 16 deletions(-)
diff --git a/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts b/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts
index 70fa09eb1..a98adc438 100644
--- a/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts
+++ b/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts
@@ -22,7 +22,13 @@ import { GfValueComponent } from '@ghostfolio/ui/value';
import { GfWorldMapChartComponent } from '@ghostfolio/ui/world-map-chart';
import { NgClass } from '@angular/common';
-import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';
+import {
+ ChangeDetectorRef,
+ Component,
+ DestroyRef,
+ OnInit
+} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { MatCardModule } from '@angular/material/card';
import { MatDialog } from '@angular/material/dialog';
import { MatProgressBarModule } from '@angular/material/progress-bar';
@@ -36,8 +42,6 @@ import {
} from '@prisma/client';
import { isNumber } from 'lodash';
import { DeviceDetectorService } from 'ngx-device-detector';
-import { Subject } from 'rxjs';
-import { takeUntil } from 'rxjs/operators';
@Component({
imports: [
@@ -54,7 +58,7 @@ import { takeUntil } from 'rxjs/operators';
styleUrls: ['./allocations-page.scss'],
templateUrl: './allocations-page.html'
})
-export class GfAllocationsPageComponent implements OnDestroy, OnInit {
+export class GfAllocationsPageComponent implements OnInit {
public accounts: {
[id: string]: Pick & {
id: string;
@@ -119,11 +123,10 @@ export class GfAllocationsPageComponent implements OnDestroy, OnInit {
public user: User;
public worldMapChartFormat: string;
- private unsubscribeSubject = new Subject();
-
public constructor(
private changeDetectorRef: ChangeDetectorRef,
private dataService: DataService,
+ private destroyRef: DestroyRef,
private deviceService: DeviceDetectorService,
private dialog: MatDialog,
private impersonationStorageService: ImpersonationStorageService,
@@ -132,7 +135,7 @@ export class GfAllocationsPageComponent implements OnDestroy, OnInit {
private userService: UserService
) {
this.route.queryParams
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((params) => {
if (params['accountId'] && params['accountDetailDialog']) {
this.openAccountDetailDialog(params['accountId']);
@@ -145,13 +148,13 @@ export class GfAllocationsPageComponent implements OnDestroy, OnInit {
this.impersonationStorageService
.onChangeHasImpersonation()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((impersonationId) => {
this.hasImpersonationId = !!impersonationId;
});
this.userService.stateChanged
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((state) => {
if (state?.user) {
this.user = state.user;
@@ -166,7 +169,7 @@ export class GfAllocationsPageComponent implements OnDestroy, OnInit {
this.initialize();
this.fetchPortfolioDetails()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((portfolioDetails) => {
this.initialize();
@@ -202,11 +205,6 @@ export class GfAllocationsPageComponent implements OnDestroy, OnInit {
}
}
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
-
private extractEtfProvider({
assetSubClass,
name
@@ -578,7 +576,7 @@ export class GfAllocationsPageComponent implements OnDestroy, OnInit {
dialogRef
.afterClosed()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(() => {
this.router.navigate(['.'], { relativeTo: this.route });
});
From 9fb02dac0ebe8093dbe5dbd8cedf48c11535148b Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Mon, 2 Mar 2026 19:29:12 +0100
Subject: [PATCH 20/33] Task/remove unused OnDestroy hook in personal finance
tools page (#6443)
* Remove unused OnDestroy hook
---
.../personal-finance-tools-page.component.ts | 12 ++----------
1 file changed, 2 insertions(+), 10 deletions(-)
diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.component.ts b/apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.component.ts
index c4cfd184e..bb4ae3889 100644
--- a/apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.component.ts
+++ b/apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.component.ts
@@ -1,13 +1,12 @@
import { personalFinanceTools } from '@ghostfolio/common/personal-finance-tools';
import { publicRoutes } from '@ghostfolio/common/routes/routes';
-import { Component, OnDestroy } from '@angular/core';
+import { Component } from '@angular/core';
import { MatCardModule } from '@angular/material/card';
import { RouterModule } from '@angular/router';
import { IonIcon } from '@ionic/angular/standalone';
import { addIcons } from 'ionicons';
import { chevronForwardOutline } from 'ionicons/icons';
-import { Subject } from 'rxjs';
@Component({
host: { class: 'page' },
@@ -16,7 +15,7 @@ import { Subject } from 'rxjs';
styleUrls: ['./personal-finance-tools-page.scss'],
templateUrl: './personal-finance-tools-page.html'
})
-export class PersonalFinanceToolsPageComponent implements OnDestroy {
+export class PersonalFinanceToolsPageComponent {
public pathAlternativeTo =
publicRoutes.resources.subRoutes.personalFinanceTools.subRoutes.product
.path + '-';
@@ -28,14 +27,7 @@ export class PersonalFinanceToolsPageComponent implements OnDestroy {
});
public routerLinkAbout = publicRoutes.about.routerLink;
- private unsubscribeSubject = new Subject();
-
public constructor() {
addIcons({ chevronForwardOutline });
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
From 55952d3cc81eea937265b492c120515320b50096 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Mon, 2 Mar 2026 19:30:50 +0100
Subject: [PATCH 21/33] Task/remove unused OnDestroy hook in i18n page
component (#6441)
* Remove unused OnDestroy hook
---
apps/client/src/app/pages/i18n/i18n-page.component.ts | 10 +---------
1 file changed, 1 insertion(+), 9 deletions(-)
diff --git a/apps/client/src/app/pages/i18n/i18n-page.component.ts b/apps/client/src/app/pages/i18n/i18n-page.component.ts
index 19ecd222e..76d123914 100644
--- a/apps/client/src/app/pages/i18n/i18n-page.component.ts
+++ b/apps/client/src/app/pages/i18n/i18n-page.component.ts
@@ -1,5 +1,4 @@
import { Component } from '@angular/core';
-import { Subject } from 'rxjs';
@Component({
host: { class: 'page' },
@@ -8,11 +7,4 @@ import { Subject } from 'rxjs';
styleUrls: ['./i18n-page.scss'],
templateUrl: './i18n-page.html'
})
-export class GfI18nPageComponent {
- private unsubscribeSubject = new Subject();
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
-}
+export class GfI18nPageComponent {}
From f8ca87fadb8260aaff55d650feffde6451f6a393 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Mon, 2 Mar 2026 19:31:33 +0100
Subject: [PATCH 22/33] Task/remove unused OnDestroy hook in self-hosting FAQ
page component (#6436)
* Remove unused OnDestroy hook
---
.../faq/self-hosting/self-hosting-page.component.ts | 12 ++----------
1 file changed, 2 insertions(+), 10 deletions(-)
diff --git a/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts b/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts
index ed1d74395..f2468c7d4 100644
--- a/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts
+++ b/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts
@@ -1,10 +1,9 @@
import { publicRoutes } from '@ghostfolio/common/routes/routes';
import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
-import { CUSTOM_ELEMENTS_SCHEMA, Component, OnDestroy } from '@angular/core';
+import { CUSTOM_ELEMENTS_SCHEMA, Component } from '@angular/core';
import { MatCardModule } from '@angular/material/card';
import { RouterModule } from '@angular/router';
-import { Subject } from 'rxjs';
@Component({
host: { class: 'page' },
@@ -14,13 +13,6 @@ import { Subject } from 'rxjs';
styleUrls: ['./self-hosting-page.scss'],
templateUrl: './self-hosting-page.html'
})
-export class GfSelfHostingPageComponent implements OnDestroy {
+export class GfSelfHostingPageComponent {
public pricingUrl = `https://ghostfol.io/${document.documentElement.lang}/${publicRoutes.pricing.path}`;
-
- private unsubscribeSubject = new Subject();
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
From 794c8f8016f20e0e71518437aa527e8a12f2f058 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Mon, 2 Mar 2026 19:32:12 +0100
Subject: [PATCH 23/33] Task/remove unused OnDestroy hook in FAQ page component
(#6437)
* Remove unused OnDestroy hook
---
.../src/app/pages/faq/faq-page.component.ts | 17 ++---------------
1 file changed, 2 insertions(+), 15 deletions(-)
diff --git a/apps/client/src/app/pages/faq/faq-page.component.ts b/apps/client/src/app/pages/faq/faq-page.component.ts
index caf4217ca..83171254a 100644
--- a/apps/client/src/app/pages/faq/faq-page.component.ts
+++ b/apps/client/src/app/pages/faq/faq-page.component.ts
@@ -3,19 +3,13 @@ import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { publicRoutes } from '@ghostfolio/common/routes/routes';
import { DataService } from '@ghostfolio/ui/services';
-import {
- CUSTOM_ELEMENTS_SCHEMA,
- Component,
- OnDestroy,
- OnInit
-} from '@angular/core';
+import { CUSTOM_ELEMENTS_SCHEMA, Component, OnInit } from '@angular/core';
import { MatTabsModule } from '@angular/material/tabs';
import { RouterModule } from '@angular/router';
import { IonIcon } from '@ionic/angular/standalone';
import { addIcons } from 'ionicons';
import { cloudyOutline, readerOutline, serverOutline } from 'ionicons/icons';
import { DeviceDetectorService } from 'ngx-device-detector';
-import { Subject } from 'rxjs';
@Component({
host: { class: 'page has-tabs' },
@@ -25,13 +19,11 @@ import { Subject } from 'rxjs';
styleUrls: ['./faq-page.scss'],
templateUrl: './faq-page.html'
})
-export class GfFaqPageComponent implements OnDestroy, OnInit {
+export class GfFaqPageComponent implements OnInit {
public deviceType: string;
public hasPermissionForSubscription: boolean;
public tabs: TabConfiguration[] = [];
- private unsubscribeSubject = new Subject();
-
public constructor(
private dataService: DataService,
private deviceService: DeviceDetectorService
@@ -68,9 +60,4 @@ export class GfFaqPageComponent implements OnDestroy, OnInit {
public ngOnInit() {
this.deviceType = this.deviceService.getDeviceInfo().deviceType;
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
From a5d1f5988cd2f3c535244d6d4a28691a5267cb6e Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Mon, 2 Mar 2026 19:32:39 +0100
Subject: [PATCH 24/33] Task/remove unused OnDestroy hook in terms of service
page component (#6440)
* Remove unused OnDestroy hook
---
.../terms-of-service-page.component.ts | 12 ++----------
1 file changed, 2 insertions(+), 10 deletions(-)
diff --git a/apps/client/src/app/pages/about/terms-of-service/terms-of-service-page.component.ts b/apps/client/src/app/pages/about/terms-of-service/terms-of-service-page.component.ts
index dbf07ef19..7899f0187 100644
--- a/apps/client/src/app/pages/about/terms-of-service/terms-of-service-page.component.ts
+++ b/apps/client/src/app/pages/about/terms-of-service/terms-of-service-page.component.ts
@@ -1,6 +1,5 @@
-import { Component, OnDestroy } from '@angular/core';
+import { Component } from '@angular/core';
import { MarkdownModule } from 'ngx-markdown';
-import { Subject } from 'rxjs';
@Component({
imports: [MarkdownModule],
@@ -8,11 +7,4 @@ import { Subject } from 'rxjs';
styleUrls: ['./terms-of-service-page.scss'],
templateUrl: './terms-of-service-page.html'
})
-export class GfTermsOfServicePageComponent implements OnDestroy {
- private unsubscribeSubject = new Subject();
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
-}
+export class GfTermsOfServicePageComponent {}
From 1de4d053e5782b2af37763d5babc5ac535d7b4bf Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Mon, 2 Mar 2026 19:33:06 +0100
Subject: [PATCH 25/33] Task/remove unused OnDestroy hook in transfer balance
dialog component (#6438)
* Remove unused OnDestroy hook
---
.../transfer-balance-dialog.component.ts | 17 ++---------------
1 file changed, 2 insertions(+), 15 deletions(-)
diff --git a/apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.component.ts b/apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.component.ts
index 85d2e60bf..34a66b156 100644
--- a/apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.component.ts
+++ b/apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.component.ts
@@ -1,12 +1,7 @@
import { TransferBalanceDto } from '@ghostfolio/common/dtos';
import { GfEntityLogoComponent } from '@ghostfolio/ui/entity-logo';
-import {
- ChangeDetectionStrategy,
- Component,
- Inject,
- OnDestroy
-} from '@angular/core';
+import { ChangeDetectionStrategy, Component, Inject } from '@angular/core';
import {
AbstractControl,
FormBuilder,
@@ -25,7 +20,6 @@ import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInputModule } from '@angular/material/input';
import { MatSelectModule } from '@angular/material/select';
import { Account } from '@prisma/client';
-import { Subject } from 'rxjs';
import { TransferBalanceDialogParams } from './interfaces/interfaces';
@@ -45,13 +39,11 @@ import { TransferBalanceDialogParams } from './interfaces/interfaces';
styleUrls: ['./transfer-balance-dialog.scss'],
templateUrl: 'transfer-balance-dialog.html'
})
-export class GfTransferBalanceDialogComponent implements OnDestroy {
+export class GfTransferBalanceDialogComponent {
public accounts: Account[] = [];
public currency: string;
public transferBalanceForm: FormGroup;
- private unsubscribeSubject = new Subject();
-
public constructor(
@Inject(MAT_DIALOG_DATA) public data: TransferBalanceDialogParams,
public dialogRef: MatDialogRef,
@@ -93,11 +85,6 @@ export class GfTransferBalanceDialogComponent implements OnDestroy {
this.dialogRef.close({ account });
}
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
-
private compareAccounts(control: AbstractControl): ValidationErrors {
const accountFrom = control.get('fromAccount');
const accountTo = control.get('toAccount');
From ab07fba16b28b46848aae821482b1780cdf91a51 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Mon, 2 Mar 2026 19:33:43 +0100
Subject: [PATCH 26/33] Task/remove unused OnDestroy hook in create or update
account dialog component (#6439)
* Remove unused OnDestroy hook
---
...reate-or-update-account-dialog.component.ts | 18 +++---------------
1 file changed, 3 insertions(+), 15 deletions(-)
diff --git a/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.component.ts b/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.component.ts
index f4c68e70f..6cdd18251 100644
--- a/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.component.ts
+++ b/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.component.ts
@@ -5,12 +5,7 @@ import { GfEntityLogoComponent } from '@ghostfolio/ui/entity-logo';
import { DataService } from '@ghostfolio/ui/services';
import { CommonModule, NgClass } from '@angular/common';
-import {
- ChangeDetectionStrategy,
- Component,
- Inject,
- OnDestroy
-} from '@angular/core';
+import { ChangeDetectionStrategy, Component, Inject } from '@angular/core';
import {
AbstractControl,
FormBuilder,
@@ -30,7 +25,7 @@ import {
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInputModule } from '@angular/material/input';
import { Platform } from '@prisma/client';
-import { Observable, Subject } from 'rxjs';
+import { Observable } from 'rxjs';
import { map, startWith } from 'rxjs/operators';
import { CreateOrUpdateAccountDialogParams } from './interfaces/interfaces';
@@ -55,14 +50,12 @@ import { CreateOrUpdateAccountDialogParams } from './interfaces/interfaces';
styleUrls: ['./create-or-update-account-dialog.scss'],
templateUrl: 'create-or-update-account-dialog.html'
})
-export class GfCreateOrUpdateAccountDialogComponent implements OnDestroy {
+export class GfCreateOrUpdateAccountDialogComponent {
public accountForm: FormGroup;
public currencies: string[] = [];
public filteredPlatforms: Observable;
public platforms: Platform[] = [];
- private unsubscribeSubject = new Subject();
-
public constructor(
@Inject(MAT_DIALOG_DATA) public data: CreateOrUpdateAccountDialogParams,
private dataService: DataService,
@@ -170,11 +163,6 @@ export class GfCreateOrUpdateAccountDialogComponent implements OnDestroy {
}
}
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
-
private autocompleteObjectValidator(): ValidatorFn {
return (control: AbstractControl) => {
if (control.value && typeof control.value === 'string') {
From 9bd4fe53cec45b4599dde796ecee1403a99c16a5 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Mon, 2 Mar 2026 20:06:26 +0100
Subject: [PATCH 27/33] Task/extend personal finance tools 20260302 (#6464)
* Extend personal finance tools
---
libs/common/src/lib/personal-finance-tools.ts | 40 +++++++++++++++++++
1 file changed, 40 insertions(+)
diff --git a/libs/common/src/lib/personal-finance-tools.ts b/libs/common/src/lib/personal-finance-tools.ts
index 6d0a85fb2..063b4254c 100644
--- a/libs/common/src/lib/personal-finance-tools.ts
+++ b/libs/common/src/lib/personal-finance-tools.ts
@@ -33,6 +33,15 @@ export const personalFinanceTools: Product[] = [
origin: 'Switzerland',
slogan: 'Simplicity for Complex Wealth'
},
+ {
+ founded: 2018,
+ hasFreePlan: false,
+ hasSelfHostingAbility: false,
+ key: 'altruist',
+ name: 'Altruist',
+ origin: 'United States',
+ slogan: 'The wealth platform built for independent advisors'
+ },
{
founded: 2023,
hasFreePlan: false,
@@ -116,6 +125,17 @@ export const personalFinanceTools: Product[] = [
origin: 'Switzerland',
slogan: 'Schweizer Budget App für einfache & smarte Budgetplanung'
},
+ {
+ founded: 2015,
+ hasFreePlan: true,
+ hasSelfHostingAbility: false,
+ key: 'boldin',
+ name: 'Boldin',
+ note: 'Originally named as NewRetirement',
+ origin: 'United States',
+ pricingPerYear: '$144',
+ slogan: 'Take control with retirement planning tools that begin with you'
+ },
{
key: 'budgetpulse',
name: 'BudgetPulse',
@@ -841,6 +861,16 @@ export const personalFinanceTools: Product[] = [
pricingPerYear: '$108',
slogan: 'Build Financial Plans You Love.'
},
+ {
+ founded: 2022,
+ hasFreePlan: false,
+ hasSelfHostingAbility: false,
+ key: 'prostocktracker',
+ name: 'Pro Stock Tracker',
+ origin: 'United Kingdom',
+ pricingPerYear: '$60',
+ slogan: 'The stock portfolio tracker built for long-term investors'
+ },
{
founded: 2015,
hasSelfHostingAbility: false,
@@ -1014,6 +1044,16 @@ export const personalFinanceTools: Product[] = [
regions: ['Austria', 'Germany', 'Switzerland'],
slogan: 'Dein Vermögen immer im Blick'
},
+ {
+ founded: 2025,
+ hasFreePlan: false,
+ hasSelfHostingAbility: false,
+ key: 'turbobulls',
+ name: 'Turbobulls',
+ origin: 'Romania',
+ pricingPerYear: '€39.99',
+ slogan: 'Your complete financial dashboard. Actually private.'
+ },
{
hasFreePlan: true,
hasSelfHostingAbility: false,
From 8e47e198fa9218c123fc37cfb7a60f466affe93a Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Mon, 2 Mar 2026 20:06:53 +0100
Subject: [PATCH 28/33] Task/remove deprecated committed funds from summary of
portfolio details (#6442)
* Remove deprecated committedFunds
* Update changelog
---
CHANGELOG.md | 1 +
apps/api/src/app/portfolio/portfolio.controller.ts | 1 -
apps/api/src/app/portfolio/portfolio.service.ts | 3 ---
apps/api/src/helper/object.helper.spec.ts | 2 --
libs/common/src/lib/interfaces/portfolio-summary.interface.ts | 4 ----
5 files changed, 1 insertion(+), 10 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index d7ebb665c..ddcb68ad8 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed
+- Removed the deprecated `committedFunds` from the summary of the portfolio details endpoint
- Upgraded `Nx` from version `22.4.5` to `22.5.3`
## 2.245.0 - 2026-03-01
diff --git a/apps/api/src/app/portfolio/portfolio.controller.ts b/apps/api/src/app/portfolio/portfolio.controller.ts
index 5ed3c0009..67b5229c1 100644
--- a/apps/api/src/app/portfolio/portfolio.controller.ts
+++ b/apps/api/src/app/portfolio/portfolio.controller.ts
@@ -187,7 +187,6 @@ export class PortfolioController {
portfolioSummary = nullifyValuesInObject(summary, [
'cash',
- 'committedFunds',
'currentNetWorth',
'currentValueInBaseCurrency',
'dividendInBaseCurrency',
diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts
index 17bd01ce4..26d16bf75 100644
--- a/apps/api/src/app/portfolio/portfolio.service.ts
+++ b/apps/api/src/app/portfolio/portfolio.service.ts
@@ -1914,8 +1914,6 @@ export class PortfolioService {
.plus(emergencyFundHoldingsValueInBaseCurrency)
.toNumber();
- const committedFunds = new Big(totalBuy).minus(totalSell);
-
const totalOfExcludedActivities = this.getSumOfActivityType({
userCurrency,
activities: excludedActivities,
@@ -1979,7 +1977,6 @@ export class PortfolioService {
activityCount: activities.filter(({ type }) => {
return ['BUY', 'SELL'].includes(type);
}).length,
- committedFunds: committedFunds.toNumber(),
currentValueInBaseCurrency: currentValueInBaseCurrency.toNumber(),
dividendInBaseCurrency: dividendInBaseCurrency.toNumber(),
emergencyFund: {
diff --git a/apps/api/src/helper/object.helper.spec.ts b/apps/api/src/helper/object.helper.spec.ts
index eed261f3e..ba8760c70 100644
--- a/apps/api/src/helper/object.helper.spec.ts
+++ b/apps/api/src/helper/object.helper.spec.ts
@@ -1540,7 +1540,6 @@ describe('redactAttributes', () => {
netPerformanceWithCurrencyEffect: null,
totalBuy: null,
totalSell: null,
- committedFunds: null,
currentValueInBaseCurrency: null,
dividendInBaseCurrency: null,
emergencyFund: null,
@@ -3017,7 +3016,6 @@ describe('redactAttributes', () => {
netPerformanceWithCurrencyEffect: null,
totalBuy: null,
totalSell: null,
- committedFunds: null,
currentValueInBaseCurrency: null,
dividendInBaseCurrency: null,
emergencyFund: null,
diff --git a/libs/common/src/lib/interfaces/portfolio-summary.interface.ts b/libs/common/src/lib/interfaces/portfolio-summary.interface.ts
index 79fbf8707..8db6b39bb 100644
--- a/libs/common/src/lib/interfaces/portfolio-summary.interface.ts
+++ b/libs/common/src/lib/interfaces/portfolio-summary.interface.ts
@@ -6,10 +6,6 @@ export interface PortfolioSummary extends PortfolioPerformance {
annualizedPerformancePercent: number;
annualizedPerformancePercentWithCurrencyEffect: number;
cash: number;
-
- /** @deprecated use totalInvestmentValueWithCurrencyEffect instead */
- committedFunds: number;
-
dateOfFirstActivity: Date;
dividendInBaseCurrency: number;
emergencyFund: {
From 27b1e74d2350a0227b93ed639ee625b559fe735c Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Tue, 3 Mar 2026 20:33:19 +0100
Subject: [PATCH 29/33] Bugfix/disabled buttons in assistant component (#6471)
* Fix signal accessors
* Update changelog
---
CHANGELOG.md | 4 ++++
libs/ui/src/lib/assistant/assistant.html | 4 ++--
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ddcb68ad8..18055ec4b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -12,6 +12,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Removed the deprecated `committedFunds` from the summary of the portfolio details endpoint
- Upgraded `Nx` from version `22.4.5` to `22.5.3`
+### Fixed
+
+- Fixed an issue where the apply and reset filter buttons remained disabled in the assistant
+
## 2.245.0 - 2026-03-01
### Changed
diff --git a/libs/ui/src/lib/assistant/assistant.html b/libs/ui/src/lib/assistant/assistant.html
index 7e19833a9..79e2f31a1 100644
--- a/libs/ui/src/lib/assistant/assistant.html
+++ b/libs/ui/src/lib/assistant/assistant.html
@@ -197,7 +197,7 @@
mat-button
type="button"
[disabled]="
- !portfolioFilterForm.hasFilters() || portfolioFilterForm.disabled
+ !portfolioFilterForm.hasFilters() || portfolioFilterForm.disabled()
"
(click)="onResetFilters()"
>
@@ -210,7 +210,7 @@
type="button"
[disabled]="
!portfolioFilterForm.filterForm.dirty ||
- portfolioFilterForm.disabled
+ portfolioFilterForm.disabled()
"
(click)="onApplyFilters()"
>
From 0883c7c5bf74282cad926c99d011c75b6894550d Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Tue, 3 Mar 2026 20:35:26 +0100
Subject: [PATCH 30/33] Release 2.246.0 (#6472)
---
CHANGELOG.md | 2 +-
package-lock.json | 4 ++--
package.json | 2 +-
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 18055ec4b..b5575e543 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
-## Unreleased
+## 2.246.0 - 2026-03-03
### Changed
diff --git a/package-lock.json b/package-lock.json
index 52b460666..87e61400d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "ghostfolio",
- "version": "2.245.0",
+ "version": "2.246.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "ghostfolio",
- "version": "2.245.0",
+ "version": "2.246.0",
"hasInstallScript": true,
"license": "AGPL-3.0",
"dependencies": {
diff --git a/package.json b/package.json
index 8871e8acc..f3e74f28e 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "ghostfolio",
- "version": "2.245.0",
+ "version": "2.246.0",
"homepage": "https://ghostfol.io",
"license": "AGPL-3.0",
"repository": "https://github.com/ghostfolio/ghostfolio",
From f92bb665e413729ffe83a3ccc068ef5061be45cc Mon Sep 17 00:00:00 2001
From: Lucas Macedo <83371481+lmaced0@users.noreply.github.com>
Date: Wed, 4 Mar 2026 00:27:45 -0700
Subject: [PATCH 31/33] Task/upgrade yahoo-finance2 to version 3.13.1 (#6475)
* Upgrade yahoo-finance2 to version 3.13.1
* Update changelog
---
CHANGELOG.md | 6 ++++++
package-lock.json | 8 ++++----
package.json | 2 +-
3 files changed, 11 insertions(+), 5 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b5575e543..25f00db9d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+## Unreleased
+
+### Changed
+
+- Upgraded `yahoo-finance2` from version `3.13.0` to `3.13.1`
+
## 2.246.0 - 2026-03-03
### Changed
diff --git a/package-lock.json b/package-lock.json
index 87e61400d..370325602 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -89,7 +89,7 @@
"svgmap": "2.14.0",
"tablemark": "4.1.0",
"twitter-api-v2": "1.29.0",
- "yahoo-finance2": "3.13.0",
+ "yahoo-finance2": "3.13.1",
"zone.js": "0.16.0"
},
"devDependencies": {
@@ -35476,9 +35476,9 @@
}
},
"node_modules/yahoo-finance2": {
- "version": "3.13.0",
- "resolved": "https://registry.npmjs.org/yahoo-finance2/-/yahoo-finance2-3.13.0.tgz",
- "integrity": "sha512-czBj2q/MD68YEsB7aXNnGhJvWxYZn01O5r/i7VYiQV2m2sWwhca6tKgjwf/LT7zHHEVxhKNiGLB46glLnmq9Ag==",
+ "version": "3.13.1",
+ "resolved": "https://registry.npmjs.org/yahoo-finance2/-/yahoo-finance2-3.13.1.tgz",
+ "integrity": "sha512-kn3unY2OflG1NbeONedWxFDzq5QDyMYYAnr6VjRIOsMv5Q7ZXZZYFM8OadNZrOev4ikQjbYcMLLjogpVaez/vQ==",
"license": "MIT",
"dependencies": {
"@deno/shim-deno": "~0.18.0",
diff --git a/package.json b/package.json
index f3e74f28e..f3397832e 100644
--- a/package.json
+++ b/package.json
@@ -134,7 +134,7 @@
"svgmap": "2.14.0",
"tablemark": "4.1.0",
"twitter-api-v2": "1.29.0",
- "yahoo-finance2": "3.13.0",
+ "yahoo-finance2": "3.13.1",
"zone.js": "0.16.0"
},
"devDependencies": {
From 2bd8463cafff181b3d82bc4c82fe714028d34c91 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Wed, 4 Mar 2026 08:43:43 +0100
Subject: [PATCH 32/33] Task/upgrade yahoo-finance2 to version 3.13.2 (#6477)
* Upgrade yahoo-finance2 to version 3.13.2
* Update changelog
---
CHANGELOG.md | 2 +-
package-lock.json | 8 ++++----
package.json | 2 +-
3 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 25f00db9d..6d5fa1836 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,7 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed
-- Upgraded `yahoo-finance2` from version `3.13.0` to `3.13.1`
+- Upgraded `yahoo-finance2` from version `3.13.0` to `3.13.2`
## 2.246.0 - 2026-03-03
diff --git a/package-lock.json b/package-lock.json
index 370325602..2744da2c3 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -89,7 +89,7 @@
"svgmap": "2.14.0",
"tablemark": "4.1.0",
"twitter-api-v2": "1.29.0",
- "yahoo-finance2": "3.13.1",
+ "yahoo-finance2": "3.13.2",
"zone.js": "0.16.0"
},
"devDependencies": {
@@ -35476,9 +35476,9 @@
}
},
"node_modules/yahoo-finance2": {
- "version": "3.13.1",
- "resolved": "https://registry.npmjs.org/yahoo-finance2/-/yahoo-finance2-3.13.1.tgz",
- "integrity": "sha512-kn3unY2OflG1NbeONedWxFDzq5QDyMYYAnr6VjRIOsMv5Q7ZXZZYFM8OadNZrOev4ikQjbYcMLLjogpVaez/vQ==",
+ "version": "3.13.2",
+ "resolved": "https://registry.npmjs.org/yahoo-finance2/-/yahoo-finance2-3.13.2.tgz",
+ "integrity": "sha512-aAOJEjuLClfDxVPRKxjcwFoyzMr8BE/svgUqr5IjnQR+kppYbKO92Wl3SbAGz5DRghy6FiUfqi5FBDSBA/e2jg==",
"license": "MIT",
"dependencies": {
"@deno/shim-deno": "~0.18.0",
diff --git a/package.json b/package.json
index f3397832e..536f7fe80 100644
--- a/package.json
+++ b/package.json
@@ -134,7 +134,7 @@
"svgmap": "2.14.0",
"tablemark": "4.1.0",
"twitter-api-v2": "1.29.0",
- "yahoo-finance2": "3.13.1",
+ "yahoo-finance2": "3.13.2",
"zone.js": "0.16.0"
},
"devDependencies": {
From 53d9fd42d8d34bd5b5c00a0a3665ea2de8cd6366 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Wed, 4 Mar 2026 08:46:04 +0100
Subject: [PATCH 33/33] Release 2.247.0 (#6478)
---
CHANGELOG.md | 2 +-
package-lock.json | 4 ++--
package.json | 2 +-
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6d5fa1836..37ff3cf87 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
-## Unreleased
+## 2.247.0 - 2026-03-04
### Changed
diff --git a/package-lock.json b/package-lock.json
index 2744da2c3..8dbc7866a 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "ghostfolio",
- "version": "2.246.0",
+ "version": "2.247.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "ghostfolio",
- "version": "2.246.0",
+ "version": "2.247.0",
"hasInstallScript": true,
"license": "AGPL-3.0",
"dependencies": {
diff --git a/package.json b/package.json
index 536f7fe80..628de4a9d 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "ghostfolio",
- "version": "2.246.0",
+ "version": "2.247.0",
"homepage": "https://ghostfol.io",
"license": "AGPL-3.0",
"repository": "https://github.com/ghostfolio/ghostfolio",