diff --git a/.env.dev b/.env.dev index c4c8a0d35..d0c9a1576 100644 --- a/.env.dev +++ b/.env.dev @@ -22,4 +22,3 @@ JWT_SECRET_KEY= # For more info, see: https://nx.dev/concepts/inferred-tasks NX_ADD_PLUGINS=false -NX_NATIVE_COMMAND_RUNNER=false diff --git a/.github/workflows/build-code.yml b/.github/workflows/build-code.yml index 18240ebc4..7a8f72ac4 100644 --- a/.github/workflows/build-code.yml +++ b/.github/workflows/build-code.yml @@ -13,7 +13,7 @@ jobs: strategy: matrix: node_version: - - 20 + - 22 steps: - name: Checkout code uses: actions/checkout@v4 diff --git a/.gitignore b/.gitignore index d7e5e5eb1..e753d3bf7 100644 --- a/.gitignore +++ b/.gitignore @@ -25,8 +25,10 @@ npm-debug.log # misc /.angular/cache +.cursor/rules/nx-rules.mdc .env .env.prod +.github/instructions/nx.instructions.md .nx/cache .nx/workspace-data /.sass-cache diff --git a/.nvmrc b/.nvmrc index 9a2a0e219..53d1c14db 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -v20 +v22 diff --git a/CHANGELOG.md b/CHANGELOG.md index 4ebd488dc..89f7fa606 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,127 @@ 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 `@keyv/redis` from version `4.3.4` to `4.4.0` +- Upgraded `zone.js` from version `0.15.0` to `0.15.1` + +### Fixed + +- Restricted the date range change permission in the _Zen Mode_ + +## 2.169.0 - 2025-06-08 + +### Changed + +- Renamed the asset profile icon component to entity logo component and moved to `@ghostfolio/ui` +- Renamed `Account` to `accounts` in the `User` database schema +- Improved the cache verification in the health check endpoint (experimental) +- Improved the language localization for Catalan (`ca`) +- Improved the language localization for French (`fr`) +- Improved the language localization for Polish (`pl`) + +### Fixed + +- Handled an exception in the get keys function of the _Redis_ cache service +- Fixed missing `/.well-known/assetlinks.json` for TWA + +## 2.168.0 - 2025-06-07 + +### Added + +- Added a background gradient to the sidebar navigation + +### Changed + +- Migrated the `i18n` service to use `@Injectable()` +- Improved the language localization for German (`de`) +- Upgraded `nestjs` from version `11.1.0` to `11.1.3` + +## 2.167.0 - 2025-06-07 + +### Added + +- Added support for column sorting to the markets overview +- Added support for column sorting to the watchlist +- Set up the language localization for the static portfolio analysis rule: _Emergency Fund_ (Setup) +- Set up the language localization for the static portfolio analysis rule: _Fees_ (Fee Ratio) + +### Changed + +- Extended the symbol search component by default options +- Renamed `Tag` to `tags` in the `User` database schema +- Improved the language localization for German (`de`) +- Improved the language localization for Spanish (`es`) +- Improved the language localization for Turkish (`tr`) +- Upgraded `ng-extract-i18n-merge` from version `2.15.0` to `2.15.1` +- Upgraded `Nx` from version `20.8.1` to `21.1.2` + +### Fixed + +- Fixed an issue where the import button was not correctly enabled in the import activities dialog +- Fixed an issue with empty account balances in the import activities dialog +- Fixed an issue in the annualized performance calculation + +## 2.166.0 - 2025-06-05 + +### Added + +- Added support to create custom tags in the create or update activity dialog (experimental) + +### Changed + +- Improved the style of the card components +- Improved the style of the system message +- Improved the language localization for German (`de`) +- Improved the language localization for Spanish (`es`) +- Improved the language localization for Turkish (`tr`) +- Improved the language localization for Ukrainian (`uk`) +- Upgraded the _Stripe_ dependencies +- Upgraded `ngx-stripe` from version `19.0.0` to `19.7.0` + +### Fixed + +- Respected the filter by holding when deleting activities on the portfolio activities page +- Respected the filter by holding when exporting activities on the portfolio activities page +- Fixed an exception with currencies in the historical market data editor of the admin control panel + +## 2.165.0 - 2025-05-31 + +### Added + +- Extended the content of the _General_ section by the performance calculation method on the Frequently Asked Questions (FAQ) page + +### Changed + +- Improved the _Live Demo_ setup by syncing activities based on tags +- Renamed `orders` to `activities` in the `Tag` database schema +- Modularized the cron service +- Refreshed the cryptocurrencies list +- Improved the language localization for Catalan (`ca`) +- Improved the language localization for Dutch (`nl`) +- Improved the language localization for Polish (`pl`) +- Improved the language localization for Spanish (`es`) +- Upgraded `big.js` from version `6.2.2` to `7.0.1` +- Upgraded `ng-extract-i18n-merge` from version `2.14.3` to `2.15.0` + +### Fixed + +- Changed the investment value to take the currency effects into account in the holding detail dialog + +## 2.164.0 - 2025-05-28 + +### Changed + +- Improved the language localization for Dutch (`nl`) +- Improved the language localization for French (`fr`) +- Improved the language localization for Polish (`pl`) +- Improved the language localization for Spanish (`es`) +- Upgraded `Node.js` from version `20` to `22` (`Dockerfile`) +- Upgraded `yahoo-finance2` from version `3.3.4` to `3.3.5` + ## 2.163.0 - 2025-05-26 ### Changed @@ -34,12 +155,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Improved the language localization for Catalan (`ca`) - Improved the language localization for Chinese (`zh`) - Improved the language localization for Dutch (`nl`) -- Improved the language localization for Español (`es`) - Improved the language localization for French (`fr`) - Improved the language localization for German (`de`) - Improved the language localization for Italian (`it`) - Improved the language localization for Polish (`pl`) - Improved the language localization for Portuguese (`pt`) +- Improved the language localization for Spanish (`es`) - Upgraded `countup.js` from version `2.8.0` to `2.8.2` - Upgraded `nestjs` from version `10.4.15` to `11.0.12` - Upgraded `prisma` from version `6.7.0` to `6.8.2` @@ -96,7 +217,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed -- Improved the language localization for Français (`fr`) +- Improved the language localization for French (`fr`) - Upgraded `bootstrap` from version `4.6.0` to `4.6.2` ### Fixed @@ -137,7 +258,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Improved the error message of the currency code validation - Tightened the currency code validation by requiring uppercase letters - Respected the watcher count for the delete asset profiles checkbox in the historical market data table of the admin control panel -- Improved the language localization for Français (`fr`) +- Improved the language localization for French (`fr`) - Upgraded `ngx-skeleton-loader` from version `10.0.0` to `11.0.0` - Upgraded `Nx` from version `20.8.0` to `20.8.1` @@ -237,7 +358,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Improved the check for duplicates in the preview step of the activities import (allow different comments) -- Improved the language localization for Français (`fr`) +- Improved the language localization for French (`fr`) - Improved the language localization for German (`de`) - Improved the language localization for Polish (`pl`) - Upgraded `ng-extract-i18n-merge` from version `2.14.1` to `2.14.3` @@ -3692,7 +3813,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added -- Added the language localization for Français (`fr`) +- Added the language localization for French (`fr`) - Extended the landing page by a global heat map of subscribers - Added support for the thousand separator in the global heat map component @@ -3721,7 +3842,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added support for the dividend timeline grouped by year - Added support for the investment timeline grouped by year -- Set up the language localization for Français (`fr`) +- Set up the language localization for French (`fr`) ### Changed @@ -3830,7 +3951,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Improved the value redaction interceptor (including `comment`) -- Improved the language localization for Español (`es`) +- Improved the language localization for Spanish (`es`) - Upgraded `cheerio` from version `1.0.0-rc.6` to `1.0.0-rc.12` - Upgraded `prisma` from version `4.6.1` to `4.7.1` @@ -4059,7 +4180,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Improved the usage of the value component in the admin control panel -- Improved the language localization for Español (`es`) +- Improved the language localization for Spanish (`es`) ### Fixed @@ -4081,7 +4202,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added -- Set up the language localization for Español (`es`) +- Set up the language localization for Spanish (`es`) - Added support for sectors in mutual funds ## 1.198.0 - 25.09.2022 diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index 1c45aeca1..51de2ad25 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -5,7 +5,7 @@ ### Prerequisites - [Docker](https://www.docker.com/products/docker-desktop) -- [Node.js](https://nodejs.org/en/download) (version 20+) +- [Node.js](https://nodejs.org/en/download) (version 22+) - Create a local copy of this Git repository (clone) - Copy the file `.env.dev` to `.env` and populate it with your data (`cp .env.dev .env`) diff --git a/Dockerfile b/Dockerfile index 103dc3b9e..c740413ea 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=$BUILDPLATFORM node:20-slim AS builder +FROM --platform=$BUILDPLATFORM node:22-slim AS builder # Build application and add additional files WORKDIR /ghostfolio @@ -33,24 +33,25 @@ COPY ./nx.json nx.json COPY ./replace.build.mjs replace.build.mjs COPY ./tsconfig.base.json tsconfig.base.json +ENV NX_DAEMON=false RUN npm run build:production # Prepare the dist image with additional node_modules WORKDIR /ghostfolio/dist/apps/api # package.json was generated by the build process, however the original -# package-lock.json needs to be used to ensure the same versions +# package-lock.json needs to be used to ensure the same versions COPY ./package-lock.json /ghostfolio/dist/apps/api/package-lock.json RUN npm install COPY prisma /ghostfolio/dist/apps/api/prisma # Overwrite the generated package.json with the original one to ensure having -# all the scripts +# all the scripts COPY package.json /ghostfolio/dist/apps/api RUN npm run database:generate-typings # Image to run, copy everything needed from builder -FROM node:20-slim +FROM node:22-slim LABEL org.opencontainers.image.source="https://github.com/ghostfolio/ghostfolio" ENV NODE_ENV=production diff --git a/apps/api/src/app/admin/admin.controller.ts b/apps/api/src/app/admin/admin.controller.ts index 736f6da33..82524ef9b 100644 --- a/apps/api/src/app/admin/admin.controller.ts +++ b/apps/api/src/app/admin/admin.controller.ts @@ -3,6 +3,7 @@ import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard' import { TransformDataSourceInRequestInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-request/transform-data-source-in-request.interceptor'; import { ApiService } from '@ghostfolio/api/services/api/api.service'; import { ManualService } from '@ghostfolio/api/services/data-provider/manual/manual.service'; +import { DemoService } from '@ghostfolio/api/services/demo/demo.service'; import { PropertyDto } from '@ghostfolio/api/services/property/property.dto'; import { DataGatheringService } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.service'; import { @@ -55,6 +56,7 @@ export class AdminController { private readonly adminService: AdminService, private readonly apiService: ApiService, private readonly dataGatheringService: DataGatheringService, + private readonly demoService: DemoService, private readonly manualService: ManualService, @Inject(REQUEST) private readonly request: RequestWithUser ) {} @@ -66,6 +68,13 @@ export class AdminController { return this.adminService.get({ user: this.request.user }); } + @Get('demo-user/sync') + @HasPermission(permissions.syncDemoUserAccount) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) + public async syncDemoUserAccount(): Promise { + return this.demoService.syncDemoUserAccount(); + } + @HasPermission(permissions.accessAdminControl) @Post('gather') @UseGuards(AuthGuard('jwt'), HasPermissionGuard) diff --git a/apps/api/src/app/admin/admin.module.ts b/apps/api/src/app/admin/admin.module.ts index 54145fa27..598b68f17 100644 --- a/apps/api/src/app/admin/admin.module.ts +++ b/apps/api/src/app/admin/admin.module.ts @@ -4,6 +4,7 @@ import { ApiModule } from '@ghostfolio/api/services/api/api.module'; import { BenchmarkModule } from '@ghostfolio/api/services/benchmark/benchmark.module'; import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module'; +import { DemoModule } from '@ghostfolio/api/services/demo/demo.module'; import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module'; import { MarketDataModule } from '@ghostfolio/api/services/market-data/market-data.module'; import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; @@ -24,6 +25,7 @@ import { QueueModule } from './queue/queue.module'; ConfigurationModule, DataGatheringModule, DataProviderModule, + DemoModule, ExchangeRateDataModule, MarketDataModule, OrderModule, diff --git a/apps/api/src/app/admin/admin.service.ts b/apps/api/src/app/admin/admin.service.ts index 258d8556f..9a5b8a849 100644 --- a/apps/api/src/app/admin/admin.service.ts +++ b/apps/api/src/app/admin/admin.service.ts @@ -824,7 +824,7 @@ export class AdminService { where, select: { _count: { - select: { Account: true, activities: true } + select: { accounts: true, activities: true } }, Analytics: { select: { @@ -871,7 +871,7 @@ export class AdminService { id, role, subscription, - accountCount: _count.Account || 0, + accountCount: _count.accounts || 0, activityCount: _count.activities || 0, country: Analytics?.country, dailyApiRequests: Analytics?.dataProviderGhostfolioDailyRequests || 0, diff --git a/apps/api/src/app/app.module.ts b/apps/api/src/app/app.module.ts index 87a4db5fc..6f512e89b 100644 --- a/apps/api/src/app/app.module.ts +++ b/apps/api/src/app/app.module.ts @@ -1,13 +1,12 @@ import { EventsModule } from '@ghostfolio/api/events/events.module'; import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; -import { CronService } from '@ghostfolio/api/services/cron.service'; +import { CronModule } from '@ghostfolio/api/services/cron/cron.module'; import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module'; import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module'; import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; import { PropertyModule } from '@ghostfolio/api/services/property/property.module'; import { DataGatheringModule } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.module'; import { PortfolioSnapshotQueueModule } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.module'; -import { TwitterBotModule } from '@ghostfolio/api/services/twitter-bot/twitter-bot.module'; import { DEFAULT_LANGUAGE_CODE, SUPPORTED_LANGUAGE_CODES @@ -78,6 +77,7 @@ import { UserModule } from './user/user.module'; CacheModule, ConfigModule.forRoot(), ConfigurationModule, + CronModule, DataGatheringModule, DataProviderModule, EventEmitterModule.forRoot(), @@ -128,10 +128,8 @@ import { UserModule } from './user/user.module'; SubscriptionModule, SymbolModule, TagsModule, - TwitterBotModule, UserModule, WatchlistModule - ], - providers: [CronService] + ] }) export class AppModule {} diff --git a/apps/api/src/app/auth/jwt.strategy.ts b/apps/api/src/app/auth/jwt.strategy.ts index 7a3fb224b..3d466082a 100644 --- a/apps/api/src/app/auth/jwt.strategy.ts +++ b/apps/api/src/app/auth/jwt.strategy.ts @@ -1,7 +1,11 @@ import { UserService } from '@ghostfolio/api/app/user/user.service'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; -import { HEADER_KEY_TIMEZONE } from '@ghostfolio/common/config'; +import { + DEFAULT_CURRENCY, + DEFAULT_LANGUAGE_CODE, + HEADER_KEY_TIMEZONE +} from '@ghostfolio/common/config'; import { hasRole } from '@ghostfolio/common/permissions'; import { HttpException, Injectable } from '@nestjs/common'; @@ -52,6 +56,14 @@ export class JwtStrategy extends PassportStrategy(Strategy, 'jwt') { }); } + if (!user.Settings.settings.baseCurrency) { + user.Settings.settings.baseCurrency = DEFAULT_CURRENCY; + } + + if (!user.Settings.settings.language) { + user.Settings.settings.language = DEFAULT_LANGUAGE_CODE; + } + return user; } else { throw new HttpException( diff --git a/apps/api/src/app/endpoints/ai/ai.controller.ts b/apps/api/src/app/endpoints/ai/ai.controller.ts index 980d5607c..8050c675b 100644 --- a/apps/api/src/app/endpoints/ai/ai.controller.ts +++ b/apps/api/src/app/endpoints/ai/ai.controller.ts @@ -1,10 +1,6 @@ import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator'; import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; import { ApiService } from '@ghostfolio/api/services/api/api.service'; -import { - DEFAULT_CURRENCY, - DEFAULT_LANGUAGE_CODE -} from '@ghostfolio/common/config'; import { AiPromptResponse } from '@ghostfolio/common/interfaces'; import { permissions } from '@ghostfolio/common/permissions'; import type { AiPromptMode, RequestWithUser } from '@ghostfolio/common/types'; @@ -53,10 +49,8 @@ export class AiController { filters, mode, impersonationId: undefined, - languageCode: - this.request.user.Settings.settings.language ?? DEFAULT_LANGUAGE_CODE, - userCurrency: - this.request.user.Settings.settings.baseCurrency ?? DEFAULT_CURRENCY, + languageCode: this.request.user.Settings.settings.language, + userCurrency: this.request.user.Settings.settings.baseCurrency, userId: this.request.user.id }); diff --git a/apps/api/src/app/endpoints/ai/ai.module.ts b/apps/api/src/app/endpoints/ai/ai.module.ts index b6f9941ad..42480efd7 100644 --- a/apps/api/src/app/endpoints/ai/ai.module.ts +++ b/apps/api/src/app/endpoints/ai/ai.module.ts @@ -12,6 +12,7 @@ import { BenchmarkModule } from '@ghostfolio/api/services/benchmark/benchmark.mo import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module'; import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module'; +import { I18nModule } from '@ghostfolio/api/services/i18n/i18n.module'; import { ImpersonationModule } from '@ghostfolio/api/services/impersonation/impersonation.module'; import { MarketDataModule } from '@ghostfolio/api/services/market-data/market-data.module'; import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; @@ -32,6 +33,7 @@ import { AiService } from './ai.service'; ConfigurationModule, DataProviderModule, ExchangeRateDataModule, + I18nModule, ImpersonationModule, MarketDataModule, OrderModule, diff --git a/apps/api/src/app/endpoints/benchmarks/benchmarks.module.ts b/apps/api/src/app/endpoints/benchmarks/benchmarks.module.ts index a0f443621..8bdf79035 100644 --- a/apps/api/src/app/endpoints/benchmarks/benchmarks.module.ts +++ b/apps/api/src/app/endpoints/benchmarks/benchmarks.module.ts @@ -15,6 +15,7 @@ import { BenchmarkService } from '@ghostfolio/api/services/benchmark/benchmark.s import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module'; import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module'; +import { I18nModule } from '@ghostfolio/api/services/i18n/i18n.module'; import { ImpersonationModule } from '@ghostfolio/api/services/impersonation/impersonation.module'; import { MarketDataModule } from '@ghostfolio/api/services/market-data/market-data.module'; import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; @@ -35,6 +36,7 @@ import { BenchmarksService } from './benchmarks.service'; ConfigurationModule, DataProviderModule, ExchangeRateDataModule, + I18nModule, ImpersonationModule, MarketDataModule, OrderModule, diff --git a/apps/api/src/app/endpoints/market-data/market-data.controller.ts b/apps/api/src/app/endpoints/market-data/market-data.controller.ts index 933e70e9d..96fca1b3c 100644 --- a/apps/api/src/app/endpoints/market-data/market-data.controller.ts +++ b/apps/api/src/app/endpoints/market-data/market-data.controller.ts @@ -85,7 +85,7 @@ export class MarketDataController { { dataSource, symbol } ]); - if (!assetProfile) { + if (!assetProfile && !isCurrency(getCurrencyFromSymbol(symbol))) { throw new HttpException( getReasonPhrase(StatusCodes.NOT_FOUND), StatusCodes.NOT_FOUND @@ -103,7 +103,7 @@ export class MarketDataController { ); const canUpsertOwnAssetProfile = - assetProfile.userId === this.request.user.id && + assetProfile?.userId === this.request.user.id && hasPermission( this.request.user.permissions, permissions.createMarketDataOfOwnAssetProfile diff --git a/apps/api/src/app/endpoints/public/public.module.ts b/apps/api/src/app/endpoints/public/public.module.ts index cf4fd3d18..19e281dde 100644 --- a/apps/api/src/app/endpoints/public/public.module.ts +++ b/apps/api/src/app/endpoints/public/public.module.ts @@ -12,6 +12,7 @@ import { TransformDataSourceInRequestModule } from '@ghostfolio/api/interceptors import { BenchmarkModule } from '@ghostfolio/api/services/benchmark/benchmark.module'; import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module'; import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module'; +import { I18nModule } from '@ghostfolio/api/services/i18n/i18n.module'; import { ImpersonationModule } from '@ghostfolio/api/services/impersonation/impersonation.module'; import { MarketDataModule } from '@ghostfolio/api/services/market-data/market-data.module'; import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; @@ -29,6 +30,7 @@ import { PublicController } from './public.controller'; BenchmarkModule, DataProviderModule, ExchangeRateDataModule, + I18nModule, ImpersonationModule, MarketDataModule, OrderModule, diff --git a/apps/api/src/app/export/export.controller.ts b/apps/api/src/app/export/export.controller.ts index d807132c9..db2c7e3d9 100644 --- a/apps/api/src/app/export/export.controller.ts +++ b/apps/api/src/app/export/export.controller.ts @@ -1,9 +1,17 @@ import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; +import { TransformDataSourceInRequestInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-request/transform-data-source-in-request.interceptor'; import { ApiService } from '@ghostfolio/api/services/api/api.service'; import { Export } from '@ghostfolio/common/interfaces'; import type { RequestWithUser } from '@ghostfolio/common/types'; -import { Controller, Get, Inject, Query, UseGuards } from '@nestjs/common'; +import { + Controller, + Get, + Inject, + Query, + UseGuards, + UseInterceptors +} from '@nestjs/common'; import { REQUEST } from '@nestjs/core'; import { AuthGuard } from '@nestjs/passport'; @@ -19,16 +27,21 @@ export class ExportController { @Get() @UseGuards(AuthGuard('jwt'), HasPermissionGuard) + @UseInterceptors(TransformDataSourceInRequestInterceptor) public async export( @Query('accounts') filterByAccounts?: string, @Query('activityIds') filterByActivityIds?: string, @Query('assetClasses') filterByAssetClasses?: string, + @Query('dataSource') filterByDataSource?: string, + @Query('symbol') filterBySymbol?: string, @Query('tags') filterByTags?: string ): Promise { const activityIds = filterByActivityIds?.split(',') ?? []; const filters = this.apiService.buildFiltersFromQueryParams({ filterByAccounts, filterByAssetClasses, + filterByDataSource, + filterBySymbol, filterByTags }); diff --git a/apps/api/src/app/export/export.module.ts b/apps/api/src/app/export/export.module.ts index 892a761cc..424e83617 100644 --- a/apps/api/src/app/export/export.module.ts +++ b/apps/api/src/app/export/export.module.ts @@ -1,5 +1,6 @@ import { AccountModule } from '@ghostfolio/api/app/account/account.module'; import { OrderModule } from '@ghostfolio/api/app/order/order.module'; +import { TransformDataSourceInRequestModule } from '@ghostfolio/api/interceptors/transform-data-source-in-request/transform-data-source-in-request.module'; import { ApiModule } from '@ghostfolio/api/services/api/api.module'; import { TagModule } from '@ghostfolio/api/services/tag/tag.module'; @@ -9,8 +10,14 @@ import { ExportController } from './export.controller'; import { ExportService } from './export.service'; @Module({ - imports: [AccountModule, ApiModule, OrderModule, TagModule], controllers: [ExportController], + imports: [ + AccountModule, + ApiModule, + OrderModule, + TagModule, + TransformDataSourceInRequestModule + ], providers: [ExportService] }) export class ExportModule {} diff --git a/apps/api/src/app/import/create-account-with-balances.dto.ts b/apps/api/src/app/import/create-account-with-balances.dto.ts index fd4b8df48..6cf4057f8 100644 --- a/apps/api/src/app/import/create-account-with-balances.dto.ts +++ b/apps/api/src/app/import/create-account-with-balances.dto.ts @@ -6,5 +6,5 @@ import { IsArray, IsOptional } from 'class-validator'; export class CreateAccountWithBalancesDto extends CreateAccountDto { @IsArray() @IsOptional() - balances?: AccountBalance; + balances?: AccountBalance[]; } diff --git a/apps/api/src/app/import/import.controller.ts b/apps/api/src/app/import/import.controller.ts index 15631a3e8..07e017bce 100644 --- a/apps/api/src/app/import/import.controller.ts +++ b/apps/api/src/app/import/import.controller.ts @@ -71,7 +71,7 @@ export class ImportController { const activities = await this.importService.import({ isDryRun, maxActivitiesToImport, - accountsDto: importData.accounts ?? [], + accountsWithBalancesDto: importData.accounts ?? [], activitiesDto: importData.activities, user: this.request.user }); diff --git a/apps/api/src/app/import/import.service.ts b/apps/api/src/app/import/import.service.ts index 28c49ca70..6fd48e3ee 100644 --- a/apps/api/src/app/import/import.service.ts +++ b/apps/api/src/app/import/import.service.ts @@ -28,9 +28,11 @@ import { Injectable } from '@nestjs/common'; import { DataSource, Prisma, SymbolProfile } from '@prisma/client'; import { Big } from 'big.js'; import { endOfToday, isAfter, isSameSecond, parseISO } from 'date-fns'; -import { uniqBy } from 'lodash'; +import { omit, uniqBy } from 'lodash'; import { v4 as uuidv4 } from 'uuid'; +import { ImportDataDto } from './import-data.dto'; + @Injectable() export class ImportService { public constructor( @@ -138,14 +140,14 @@ export class ImportService { } public async import({ - accountsDto, + accountsWithBalancesDto, activitiesDto, isDryRun = false, maxActivitiesToImport, user }: { - accountsDto: Partial[]; - activitiesDto: Partial[]; + accountsWithBalancesDto: ImportDataDto['accounts']; + activitiesDto: ImportDataDto['activities']; isDryRun?: boolean; maxActivitiesToImport: number; user: UserWithSettings; @@ -153,12 +155,12 @@ export class ImportService { const accountIdMapping: { [oldAccountId: string]: string } = {}; const userCurrency = user.Settings.settings.baseCurrency; - if (!isDryRun && accountsDto?.length) { + if (!isDryRun && accountsWithBalancesDto?.length) { const [existingAccounts, existingPlatforms] = await Promise.all([ this.accountService.accounts({ where: { id: { - in: accountsDto.map(({ id }) => { + in: accountsWithBalancesDto.map(({ id }) => { return id; }) } @@ -167,14 +169,19 @@ export class ImportService { this.platformService.getPlatforms() ]); - for (const account of accountsDto) { + for (const accountWithBalances of accountsWithBalancesDto) { // Check if there is any existing account with the same ID const accountWithSameId = existingAccounts.find((existingAccount) => { - return existingAccount.id === account.id; + return existingAccount.id === accountWithBalances.id; }); // If there is no account or if the account belongs to a different user then create a new account if (!accountWithSameId || accountWithSameId.userId !== user.id) { + const account: CreateAccountDto = omit( + accountWithBalances, + 'balances' + ); + let oldAccountId: string; const platformId = account.platformId; @@ -187,6 +194,9 @@ export class ImportService { let accountObject: Prisma.AccountCreateInput = { ...account, + balances: { + create: accountWithBalances.balances ?? [] + }, User: { connect: { id: user.id } } }; @@ -251,7 +261,7 @@ export class ImportService { ); if (isDryRun) { - accountsDto.forEach(({ id, name }) => { + accountsWithBalancesDto.forEach(({ id, name }) => { accounts.push({ id, name }); }); } diff --git a/apps/api/src/app/order/order.controller.ts b/apps/api/src/app/order/order.controller.ts index 2c4a58596..198850b6b 100644 --- a/apps/api/src/app/order/order.controller.ts +++ b/apps/api/src/app/order/order.controller.ts @@ -53,14 +53,19 @@ export class OrderController { @Delete() @HasPermission(permissions.deleteOrder) @UseGuards(AuthGuard('jwt'), HasPermissionGuard) + @UseInterceptors(TransformDataSourceInRequestInterceptor) public async deleteOrders( @Query('accounts') filterByAccounts?: string, @Query('assetClasses') filterByAssetClasses?: string, + @Query('dataSource') filterByDataSource?: string, + @Query('symbol') filterBySymbol?: string, @Query('tags') filterByTags?: string ): Promise { const filters = this.apiService.buildFiltersFromQueryParams({ filterByAccounts, filterByAssetClasses, + filterByDataSource, + filterBySymbol, filterByTags }); diff --git a/apps/api/src/app/portfolio/portfolio.module.ts b/apps/api/src/app/portfolio/portfolio.module.ts index 0f64b2f6a..6dd5811a3 100644 --- a/apps/api/src/app/portfolio/portfolio.module.ts +++ b/apps/api/src/app/portfolio/portfolio.module.ts @@ -13,6 +13,7 @@ import { BenchmarkModule } from '@ghostfolio/api/services/benchmark/benchmark.mo import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module'; import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module'; +import { I18nModule } from '@ghostfolio/api/services/i18n/i18n.module'; import { ImpersonationModule } from '@ghostfolio/api/services/impersonation/impersonation.module'; import { MarketDataModule } from '@ghostfolio/api/services/market-data/market-data.module'; import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; @@ -39,6 +40,7 @@ import { RulesService } from './rules.service'; DataGatheringModule, DataProviderModule, ExchangeRateDataModule, + I18nModule, ImpersonationModule, MarketDataModule, OrderModule, diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index 7e373c4cc..a43499e5b 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -23,6 +23,7 @@ import { RegionalMarketClusterRiskNorthAmerica } from '@ghostfolio/api/models/ru import { BenchmarkService } from '@ghostfolio/api/services/benchmark/benchmark.service'; import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; +import { I18nService } from '@ghostfolio/api/services/i18n/i18n.service'; import { ImpersonationService } from '@ghostfolio/api/services/impersonation/impersonation.service'; import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; import { @@ -31,7 +32,7 @@ import { } from '@ghostfolio/common/calculation-helper'; import { DEFAULT_CURRENCY, - EMERGENCY_FUND_TAG_ID, + TAG_ID_EMERGENCY_FUND, UNKNOWN_KEY } from '@ghostfolio/common/config'; import { DATE_FORMAT, getSum, parseDate } from '@ghostfolio/common/helper'; @@ -105,6 +106,7 @@ export class PortfolioService { private readonly calculatorFactory: PortfolioCalculatorFactory, private readonly dataProviderService: DataProviderService, private readonly exchangeRateDataService: ExchangeRateDataService, + private readonly i18nService: I18nService, private readonly impersonationService: ImpersonationService, private readonly orderService: OrderService, @Inject(REQUEST) private readonly request: RequestWithUser, @@ -542,7 +544,7 @@ export class PortfolioService { } if (filters?.length === 0 || isFilteredByAccount || isFilteredByCash) { - const cashPositions = await this.getCashPositions({ + const cashPositions = this.getCashPositions({ cashDetails, userCurrency, value: filteredValueInBaseCurrency @@ -564,10 +566,10 @@ export class PortfolioService { if ( filters?.length === 1 && - filters[0].id === EMERGENCY_FUND_TAG_ID && + filters[0].id === TAG_ID_EMERGENCY_FUND && filters[0].type === 'TAG' ) { - const emergencyFundCashPositions = await this.getCashPositions({ + const emergencyFundCashPositions = this.getCashPositions({ cashDetails, userCurrency, value: filteredValueInBaseCurrency @@ -663,7 +665,7 @@ export class PortfolioService { grossPerformancePercentWithCurrencyEffect: undefined, grossPerformanceWithCurrencyEffect: undefined, historicalData: [], - investment: undefined, + investmentInBaseCurrencyWithCurrencyEffect: undefined, marketPrice: undefined, marketPriceMax: undefined, marketPriceMin: undefined, @@ -853,7 +855,8 @@ export class PortfolioService { grossPerformanceWithCurrencyEffect: position.grossPerformanceWithCurrencyEffect?.toNumber(), historicalData: historicalDataArray, - investment: position.investment?.toNumber(), + investmentInBaseCurrencyWithCurrencyEffect: + position.investmentWithCurrencyEffect?.toNumber(), netPerformance: position.netPerformance?.toNumber(), netPerformancePercent: position.netPerformancePercentage?.toNumber(), netPerformancePercentWithCurrencyEffect: @@ -952,7 +955,7 @@ export class PortfolioService { grossPerformancePercentWithCurrencyEffect: undefined, grossPerformanceWithCurrencyEffect: undefined, historicalData: historicalDataArray, - investment: 0, + investmentInBaseCurrencyWithCurrencyEffect: 0, netPerformance: undefined, netPerformancePercent: undefined, netPerformancePercentWithCurrencyEffect: undefined, @@ -1318,6 +1321,8 @@ export class PortfolioService { [ new EmergencyFundSetup( this.exchangeRateDataService, + this.i18nService, + userSettings.language, this.getTotalEmergencyFund({ userSettings, emergencyFundHoldingsValueInBaseCurrency: @@ -1331,6 +1336,8 @@ export class PortfolioService { [ new FeeRatioInitialInvestment( this.exchangeRateDataService, + this.i18nService, + userSettings.language, summary.committedFunds, summary.fees ) @@ -1532,7 +1539,7 @@ export class PortfolioService { return { markets, marketsAdvanced }; } - private async getCashPositions({ + private getCashPositions({ cashDetails, userCurrency, value @@ -1654,7 +1661,7 @@ export class PortfolioService { const emergencyFundHoldings = Object.values(holdings).filter(({ tags }) => { return ( tags?.some(({ id }) => { - return id === EMERGENCY_FUND_TAG_ID; + return id === TAG_ID_EMERGENCY_FUND; }) ?? false ); }); diff --git a/apps/api/src/app/redis-cache/redis-cache.service.ts b/apps/api/src/app/redis-cache/redis-cache.service.ts index e6e98d622..621199cc9 100644 --- a/apps/api/src/app/redis-cache/redis-cache.service.ts +++ b/apps/api/src/app/redis-cache/redis-cache.service.ts @@ -5,17 +5,28 @@ import { AssetProfileIdentifier, Filter } from '@ghostfolio/common/interfaces'; import { CACHE_MANAGER, Cache } from '@nestjs/cache-manager'; import { Inject, Injectable, Logger } from '@nestjs/common'; import { createHash } from 'crypto'; +import Keyv from 'keyv'; import ms from 'ms'; @Injectable() export class RedisCacheService { + private client: Keyv; + public constructor( @Inject(CACHE_MANAGER) private readonly cache: Cache, private readonly configurationService: ConfigurationService ) { - const client = cache.stores[0]; + this.client = cache.stores[0]; + + this.client.deserialize = (value) => { + try { + return JSON.parse(value); + } catch {} - client.on('error', (error) => { + return value; + }; + + this.client.on('error', (error) => { Logger.error(error, 'RedisCacheService'); }); } @@ -28,28 +39,13 @@ export class RedisCacheService { const keys: string[] = []; const prefix = aPrefix; - this.cache.stores[0].deserialize = (value) => { - try { - return JSON.parse(value); - } catch (error: any) { - if (error instanceof SyntaxError) { - Logger.debug( - `Failed to parse json, returning the value as String: ${value}`, - 'RedisCacheService' - ); - - return value; - } else { - throw error; + try { + for await (const [key] of this.client.iterator({})) { + if ((prefix && key.startsWith(prefix)) || !prefix) { + keys.push(key); } } - }; - - for await (const [key] of this.cache.stores[0].iterator({})) { - if ((prefix && key.startsWith(prefix)) || !prefix) { - keys.push(key); - } - } + } catch {} return keys; } @@ -79,12 +75,22 @@ export class RedisCacheService { } public async isHealthy() { + const testKey = '__health_check__'; + const testValue = Date.now().toString(); + try { await Promise.race([ - this.getKeys(), + (async () => { + await this.set(testKey, testValue, ms('1 second')); + const result = await this.get(testKey); + + if (result !== testValue) { + throw new Error('Redis health check failed: value mismatch'); + } + })(), new Promise((_, reject) => setTimeout( - () => reject(new Error('Redis health check timeout')), + () => reject(new Error('Redis health check failed: timeout')), ms('2 seconds') ) ) @@ -92,7 +98,13 @@ export class RedisCacheService { return true; } catch (error) { + Logger.error(error?.message, 'RedisCacheService'); + return false; + } finally { + try { + await this.remove(testKey); + } catch {} } } diff --git a/apps/api/src/app/subscription/subscription.service.ts b/apps/api/src/app/subscription/subscription.service.ts index 063c40608..d233e475c 100644 --- a/apps/api/src/app/subscription/subscription.service.ts +++ b/apps/api/src/app/subscription/subscription.service.ts @@ -32,7 +32,7 @@ export class SubscriptionService { this.stripe = new Stripe( this.configurationService.get('STRIPE_SECRET_KEY'), { - apiVersion: '2024-09-30.acacia' + apiVersion: '2025-04-30.basil' } ); } @@ -61,7 +61,7 @@ export class SubscriptionService { const checkoutSessionCreateParams: Stripe.Checkout.SessionCreateParams = { cancel_url: `${this.configurationService.get('ROOT_URL')}/${ - user.Settings?.settings?.language ?? DEFAULT_LANGUAGE_CODE + user.Settings.settings.language }/account`, client_reference_id: user.id, line_items: [ diff --git a/apps/api/src/app/user/user.module.ts b/apps/api/src/app/user/user.module.ts index 063cfef82..8a21b0a55 100644 --- a/apps/api/src/app/user/user.module.ts +++ b/apps/api/src/app/user/user.module.ts @@ -1,6 +1,7 @@ import { OrderModule } from '@ghostfolio/api/app/order/order.module'; import { SubscriptionModule } from '@ghostfolio/api/app/subscription/subscription.module'; import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; +import { I18nModule } from '@ghostfolio/api/services/i18n/i18n.module'; import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; import { PropertyModule } from '@ghostfolio/api/services/property/property.module'; import { TagModule } from '@ghostfolio/api/services/tag/tag.module'; @@ -16,6 +17,7 @@ import { UserService } from './user.service'; exports: [UserService], imports: [ ConfigurationModule, + I18nModule, JwtModule.register({ secret: process.env.JWT_SECRET_KEY, signOptions: { expiresIn: '30 days' } diff --git a/apps/api/src/app/user/user.service.ts b/apps/api/src/app/user/user.service.ts index 87c82fa0b..b9a0e3d20 100644 --- a/apps/api/src/app/user/user.service.ts +++ b/apps/api/src/app/user/user.service.ts @@ -52,11 +52,10 @@ import { sortBy, without } from 'lodash'; @Injectable() export class UserService { - private i18nService = new I18nService(); - public constructor( private readonly configurationService: ConfigurationService, private readonly eventEmitter: EventEmitter2, + private readonly i18nService: I18nService, private readonly orderService: OrderService, private readonly prismaService: PrismaService, private readonly propertyService: PropertyService, @@ -96,7 +95,7 @@ export class UserService { } public async getUser( - { Account, id, permissions, Settings, subscription }: UserWithSettings, + { accounts, id, permissions, Settings, subscription }: UserWithSettings, aLocale = locale ): Promise { const userData = await Promise.all([ @@ -142,6 +141,7 @@ export class UserService { } return { + accounts, activitiesCount, id, permissions, @@ -155,7 +155,6 @@ export class UserService { permissions: accessItem.permissions }; }), - accounts: Account, dateOfFirstActivity: firstActivity?.date ?? new Date(), settings: { ...(Settings.settings as UserSettings), @@ -182,7 +181,7 @@ export class UserService { const { Access, accessToken, - Account, + accounts, Analytics, authChallenge, createdAt, @@ -196,7 +195,7 @@ export class UserService { } = await this.prismaService.user.findUnique({ include: { Access: true, - Account: { + accounts: { include: { Platform: true } }, Analytics: true, @@ -209,7 +208,7 @@ export class UserService { const user: UserWithSettings = { Access, accessToken, - Account, + accounts, authChallenge, createdAt, id, @@ -298,10 +297,14 @@ export class UserService { undefined ).getSettings(user.Settings.settings), EmergencyFundSetup: new EmergencyFundSetup( + undefined, + undefined, undefined, undefined ).getSettings(user.Settings.settings), FeeRatioInitialInvestment: new FeeRatioInitialInvestment( + undefined, + undefined, undefined, undefined, undefined @@ -411,6 +414,10 @@ export class UserService { user.subscription.offer.durationExtension = undefined; user.subscription.offer.label = undefined; } + + if (hasRole(user, Role.ADMIN)) { + currentPermissions.push(permissions.syncDemoUserAccount); + } } if (this.configurationService.get('ENABLE_FEATURE_READ_ONLY_MODE')) { @@ -433,11 +440,11 @@ export class UserService { } } - if (!environment.production && role === 'ADMIN') { + if (!environment.production && hasRole(user, Role.ADMIN)) { currentPermissions.push(permissions.impersonateAllUsers); } - user.Account = sortBy(user.Account, ({ name }) => { + user.accounts = sortBy(user.accounts, ({ name }) => { return name.toLowerCase(); }); user.permissions = currentPermissions.sort(); @@ -474,7 +481,7 @@ export class UserService { const user = await this.prismaService.user.create({ data: { ...data, - Account: { + accounts: { create: { currency: DEFAULT_CURRENCY, name: this.i18nService.getTranslation({ diff --git a/apps/api/src/assets/cryptocurrencies/cryptocurrencies.json b/apps/api/src/assets/cryptocurrencies/cryptocurrencies.json index 475cc6217..d7dce485a 100644 --- a/apps/api/src/assets/cryptocurrencies/cryptocurrencies.json +++ b/apps/api/src/assets/cryptocurrencies/cryptocurrencies.json @@ -1,4 +1,5 @@ { + "1": "just buy $1 worth of this coin", "3": "The Three Musketeers", "7": "Lucky7", "32": "Project 32", @@ -64,6 +65,7 @@ "1MIL": "1MillionNFTs", "1MT": "1Move", "1NFT": "1NFT", + "1ON8": "Little Dragon", "1OZT": "Tala", "1PECO": "1peco", "1SG": "1SG", @@ -73,6 +75,7 @@ "1UP": "Uptrennd", "1WO": "1World", "2022M": "2022MOON", + "20EX": "20ex", "21BTC": "21.co Wrapped BTC", "21X": "21X", "2BACCO": "2BACCO Coin", @@ -114,6 +117,7 @@ "4CHAN": "4Chan", "4CZ": "FourCZ", "4DOGE": "4DOGE", + "4EVER": "4EVERLAND", "4JNET": "4JNET", "4MW": "For Meta World", "4P": "4P FOUR", @@ -138,7 +142,7 @@ "9DOGS": "NINE DOGS", "9GAG": "9GAG", "9MM": "Shigure UI", - "A": "Alpha Token", + "A": "Vaulta", "A1INCH": "1inch (Arbitrum Bridge)", "A2A": "A2A", "A2I": "Arcana AI", @@ -168,6 +172,7 @@ "AAVEGOTCHIFOMO": "Aavegotchi FOMO", "AAX": "Academic Labs", "AAZ": "ATLAZ", + "AB": "Newton", "AB1INCH": "1inch (Avalanche Bride)", "ABA": "EcoBall", "ABBC": "ABBC Coin", @@ -200,6 +205,7 @@ "ABUSDC": "USD Coin (Arbitrum Bridge)", "ABX": "Arbidex", "ABY": "ArtByte", + "ABYS": "Trinity Of The Fabled", "ABYSS": "Abyss Finance", "AC": "Asia Coin", "AC3": "AC3", @@ -228,7 +234,7 @@ "ACN": "AvonCoin", "ACOIN": "ACoin", "ACOLYT": "Acolyte by Virtuals", - "ACP": "Anarchists Prime", + "ACP": "Arena Of Faith", "ACPT": "Crypto Accept", "ACQ": "Acquire.Fi", "ACRE": "Arable Protocol", @@ -306,6 +312,7 @@ "AERO": "Aerodrome Finance", "AEROBUD": "Aerobud", "AEROCOIN": "Aero Coin", + "AEROME": "AeroMe", "AEROT": "AEROTYME", "AES": "Artis Aes Evolution", "AET": "AfterEther", @@ -338,8 +345,9 @@ "AFYON": "Afyonspor Fan Token", "AG": "AGAME", "AG8": "ATROMG8", - "AGA": "AGA Token", + "AGA": "Agora DEX Token", "AGATA": "Agatech", + "AGATOKEN": "AGA Token", "AGB": "Apes Go Bananas", "AGC": "Argocoin", "AGEN": "Agent Krasnov", @@ -357,6 +365,7 @@ "AGIV1": "SingularityNET v1", "AGIX": "SingularityNET", "AGIXBT": "AGIXBT by Virtuals", + "AGIXT": "AGiXT", "AGLA": "Angola", "AGLD": "Adventure Gold", "AGM": "Argoneum", @@ -366,6 +375,7 @@ "AGON": "Arabian Dragon", "AGOV": "Answer Governance", "AGPC": "AGPC", + "AGRI": "AgriDex Token", "AGRO": "Bit Agro", "AGRS": "Agoras Token", "AGS": "Aegis", @@ -383,7 +393,8 @@ "AI23T": "23 Turtles", "AI69SAKURA": "Sakura", "AIA": "AIA Chain", - "AIAGENT": "Aiagent.app", + "AIAGENT": "AI Agents", + "AIAGENTAPP": "Aiagent.app", "AIAI": "All In AI", "AIAKITA": "AiAkita", "AIAT": "AI Analysis Token", @@ -433,8 +444,9 @@ "AIMONICA": "Aimonica Brands", "AIMR": "MeromAI", "AIMS": "HighCastle Token", - "AIMX": "Aimedis", + "AIMX": "MindMatrix", "AIMXV1": "Aimedis v1", + "AIMXV2": "Aimedis", "AIN": "AI Network", "AINA": "Ainastasia", "AINN": "AINN", @@ -452,6 +464,7 @@ "AIPG": "AI Power Grid", "AIPIN": "AI PIN", "AIPO": "Aipocalypto", + "AIPUMP": "aiPump", "AIR": "Altair", "AIRB": "BillionAir", "AIRBTC": "AIRBTC", @@ -465,10 +478,11 @@ "AIRTNT": "Tenti", "AIRTOKEN": "AirToken", "AIRX": "Aircoins", - "AIS": "AISwap", + "AIS": "AISociety", "AISCII": "AISCII", "AISHIB": "ARBSHIB", "AIST": "Artificial intelligence staking token", + "AISW": "AISwap", "AIT": "AIT Protocol", "AITECH": "Artificial Intelligence Utility Token", "AITEK": "AI Technology", @@ -487,6 +501,7 @@ "AIWALLET": "AiWallet Token", "AIWS": "AIWS", "AIX": "Aigang", + "AIX9": "AthenaX9", "AIXBT": "aixbt by Virtuals", "AIXERC": "AI-X", "AIXT": "AIXTerminal", @@ -497,6 +512,7 @@ "AKAL": "AKA Liberty", "AKASHA": "Akasha by Bloomverse", "AKI": "Aki Network", + "AKIO": "Akio", "AKIT": "Akita Inu", "AKITA": "Akita Inu", "AKITAI": "AKITA INU", @@ -509,6 +525,7 @@ "AKT": "Akash Network", "AKTIO": "AKTIO Coin", "AKUMA": "Akuma Inu", + "AKV": "Akiverse Governance", "AL": "ArchLoot", "ALA": "Alanyaspor Fan Token", "ALAN": "Alan the Alien", @@ -558,6 +575,7 @@ "ALIS": "ALISmedia", "ALIT": "Alitas", "ALITA": "Alita Network", + "ALITATOKEN": "Alita Token", "ALIX": "AlinX", "ALKI": "Alkimi", "ALLBI": "ALL BEST ICO", @@ -586,6 +604,7 @@ "ALPHAF": "Alpha Fi", "ALPHAG": "Alpha Gardeners", "ALPHAPETTO": "Alpha Petto Shells", + "ALPHAPLATFORM": "Alpha Token", "ALPHAS": "Alpha Shards", "ALPHR": "Alphr", "ALPINE": "Alpine F1 Team Fan Token", @@ -608,7 +627,7 @@ "ALWAYS": "Always Evolving", "ALX": "ALAX", "ALY": "Ally", - "AM": "AeroMe", + "AM": "Aston Martin Cognizant", "AMA": "MrWeb", "AMADEUS": "AMADEUS", "AMAL": "AMAL", @@ -620,6 +639,7 @@ "AMBO": "Sheertopia", "AMBR": "Ambra", "AMBT": "AMBT Token", + "AMC": "AI Meta Coin", "AMDC": "Allmedi Coin", "AMDG": "AMDG", "AME": "Amepay", @@ -659,10 +679,12 @@ "ANAL": "AnalCoin", "ANALOS": "analoS", "ANALY": "Analysoor", + "ANARCHISTS": "Anarchists Prime", "ANAT": "Anatolia Token", "ANB": "Angryb", "ANC": "Anchor Protocol", "ANCHOR": "AnchorSwap", + "ANCIENTKING": "Ancient Kingdom", "ANCP": "Anacrypt", "ANCT": "Anchor", "AND": "AndromedaCoin", @@ -717,6 +739,7 @@ "ANTEX": "Antex", "ANTI": "Anti Bitcoin", "ANTIS": "Antis Inu", + "ANTMONS": "Antmons", "ANTS": "ANTS Reloaded", "ANTT": "Antara Token", "ANUS": "URANUS", @@ -740,7 +763,7 @@ "APCG": "ALLPAYCOIN", "APD": "Aptopad", "APE": "ApeCoin", - "APED": "Baddest Alpha Ape Bundle", + "APED": "Aped", "APEDEV": "The dev is an Ape", "APEFUN": "Ape", "APEMAN": "APEMAN", @@ -793,6 +816,7 @@ "APYS": "APYSwap", "APZ": "Alprockz", "AQA": " AQA Token", + "AQDC": "AQDC", "AQT": "Alpha Quark Token", "AQTIS": "AQTIS", "AQU": "aQuest", @@ -809,7 +833,7 @@ "ARATA": "Arata", "ARAW": "Araw", "ARB": "Arbitrum", - "ARBI": "Arbi", + "ARBI": "Arbipad", "ARBIT": "Arbit Coin", "ARBP": "ARB Protocol", "ARBS": "Arbswap", @@ -827,6 +851,7 @@ "ARCAS": "Arcas", "ARCH": "Archway", "ARCHA": "ArchAngel Token", + "ARCHAI": "ArchAI", "ARCHCOIN": "ArchCoin", "ARCHE": "Archean", "ARCHIVE": "Chainback", @@ -883,11 +908,13 @@ "ARQ": "ArQmA", "ARQX": "ARQx AI", "ARR": "ARROUND", + "ARRI": "Arris", "ARRO": "Arro Social", + "ARROW": "Arrow Token", "ARRR": "Pirate Chain", "ARSL": "Aquarius Loan", "ARSW": "ArthSwap", - "ART": "Maecenas", + "ART": "Genify ART", "ARTC": "Artcoin", "ARTDECO": "ARTDECO", "ARTDRAW": "ArtDraw", @@ -939,6 +966,7 @@ "ASKAI": "ASKAI", "ASKO": "Asko", "ASM": "Assemble Protocol", + "ASMAT": "AsMatch", "ASMO": "AS Monaco Fan Token", "ASN": "Ascension Coin", "ASNT": "Assent Protocol", @@ -957,6 +985,7 @@ "ASTA": "ASTA", "ASTO": "Altered State Token", "ASTON": "Aston", + "ASTONV": "Aston Villa Fan Token", "ASTR": "Astar", "ASTRA": "Astra Protocol", "ASTRADAO": "Astra DAO", @@ -1003,6 +1032,7 @@ "ATL": "ATLANT", "ATLA": "Atleta Network", "ATLAS": "Star Atlas", + "ATLASD": "Atlas DEX", "ATLX": "Atlantis Loans Polygon", "ATM": "Atletico de Madrid Fan Token", "ATMA": "ATMA", @@ -1030,7 +1060,7 @@ "ATROFA": "Atrofarm", "ATRS": "Attarius Network", "ATRV1": "Artrade v1", - "ATS": "Atlas DEX", + "ATS": "Alltoscan", "ATT": "Attila", "ATTR": "Attrace", "ATX": "ArtexCoin", @@ -1066,10 +1096,12 @@ "AUSDT": "aUSDT", "AUT": "Autoria", "AUTHORSHIP": "Authorship", - "AUTISM": "AUTISM", + "AUTISM": "autism", + "AUTISMTOKEN": "AUTISM", "AUTO": "Auto", "AUTOMATIC": "Automatic Treasury Machine", "AUTONO": "Autonomi", + "AUTOS": "CryptoAutos", "AUTUMN": "Autumn", "AUVERSE": "AuroraVerse", "AUX": "Auxilium", @@ -1092,6 +1124,7 @@ "AVAXAI": "AIvalanche DeFAI Agents", "AVAXIOU": "Avalanche IOU", "AVB": "Autonomous Virtual Beings", + "AVC": "AVC", "AVDO": "AvocadoCoin", "AVE": "Avesta", "AVEN": "Aventis AI", @@ -1102,7 +1135,7 @@ "AVI": "Aviator", "AVINOC": "AVINOC", "AVIVE": "Avive World", - "AVL": "Aston Villa Fan Token", + "AVL": "AVL", "AVM": "AVM (Atomicals)", "AVME": "AVME", "AVN": "AVNRich", @@ -1114,6 +1147,7 @@ "AVTM": "Aventis Metaverse", "AVXL": "Avaxlauncher", "AVXT": "Avaxtars Token", + "AWARDCOIN": "Award", "AWARE": "ChainAware.ai", "AWAX": "AWAX", "AWC": "Atomic Wallet Coin", @@ -1123,9 +1157,9 @@ "AWO": "AiWork", "AWORK": "Aworker", "AWP": "Ansem Wif Photographer", - "AWR": "Award", + "AWR": "All Will Retire", "AWS": "AurusSILVER", - "AWT": "Airdrop World", + "AWT": "Abyss World", "AWX": "AurusX", "AX": "AlphaX", "AXC": "AXIA Coin", @@ -1189,13 +1223,14 @@ "BAB": "Babacoin", "BABI": "Babylons", "BABL": "Babylon Finance", - "BABY": "BabySwap", + "BABY": "Babylon", "BABYANDY": "Baby Andy", "BABYB": "Baby Bali", "BABYBI": "Baby Bitcoin", "BABYBINANCE": "BABYBINANCE", "BABYBITC": "BabyBitcoin", "BABYBNB": "BabyBNB", + "BABYBNBBABY": "BabyBNB", "BABYBNBTIGER": "BabyBNBTiger", "BABYBO": "BabyBonk", "BABYBOB": "Baby Bob", @@ -1242,7 +1277,6 @@ "BABYKEKIUS": "Baby Kekius Maximus", "BABYKITTY": "BabyKitty", "BABYKOMA": "Baby Koma", - "BABYLON": "Babylon", "BABYLONG": "Baby Long", "BABYM": "BabyMAGA", "BABYMAGA": "Baby Maga", @@ -1268,7 +1302,8 @@ "BABYRWA": "BabyRWA", "BABYS": "Baby Slerf", "BABYSAITAMA": "Baby Saitama", - "BABYSHARK": "Baby Shark", + "BABYSHARK": "Baby Shark Meme", + "BABYSHARKBSC": "Baby Shark", "BABYSHIB": "Baby Shiba Inu", "BABYSHIBAINU": "Baby Shiba Inu", "BABYSHIRO": "Baby Shiro Neko", @@ -1277,6 +1312,7 @@ "BABYSNAKE": "Baby Snake BSC", "BABYSOL": "Baby Solana", "BABYSORA": "Baby Sora", + "BABYSWAP": "BabySwap", "BABYSWEEP": "BabySweep", "BABYT": "BABYTRUMP", "BABYTK": "Baby Tiger King", @@ -1297,7 +1333,9 @@ "BADAI": "BAD Coin", "BADC": "BADCAT", "BADCAT": "Andy’s Alter Ego", + "BADDEST": "Baddest Alpha Ape Bundle", "BADGER": "Badger DAO", + "BADM": "Badmad Robots", "BAFC": "BabyApeFunClub", "BAG": "Bag", "BAGS": "Basis Gold Share", @@ -1320,7 +1358,8 @@ "BALANCE": "Balance AI", "BALD": "Bald", "BALIN": "Balin Bank", - "BALL": "Game 5 BALL", + "BALKANCOIN": "Balkancoin", + "BALL": "BitBall", "BALLZ": "Wolf Wif", "BALN": "Balanced", "BALPHA": "bAlpha", @@ -1343,10 +1382,12 @@ "BAND": "Band Protocol", "BANDEX": "Banana Index", "BANDIT": "Bandit on Base", + "BANDO": "Bandot", "BANG": "BANG", "BANGY": "BANGY", "BANK": "Float Protocol", "BANKA": "Bank AI", + "BANKBRC": "BANK Ordinals", "BANKC": "Bankcoin", "BANKER": "BankerCoinAda", "BANKETH": "BankEth", @@ -1374,6 +1415,7 @@ "BARY": "Bary", "BAS": "Basis Share", "BASEAI": "BaseAI", + "BASEBEAR": "BBQ", "BASECAT": "BASE CAT", "BASECOIN": "BASECOIN", "BASED": "Based Money", @@ -1398,11 +1440,13 @@ "BASHOS": "Bashoswap", "BASIC": "BASIC", "BASID": "Basid Coin", + "BASIL": "Basilisk", "BASIS": "Basis", "BASK": "BasketDAO", "BAST": "Bast", "BASTET": "Bastet Goddess", "BAT": "Basic Attention Token", + "BATCH": "BATCH Token", "BATH": "Battle Hero", "BATMAN": "BATMAN", "BATO": "Batonex Token", @@ -1445,7 +1489,7 @@ "BBROCCOLI": "Baby Broccoli", "BBS": "BBSCoin", "BBSOL": "Bybit Staked SOL", - "BBT": "BitBook", + "BBT": "BabyBoomToken", "BBTC": "Binance Wrapped BTC", "BBTF": "Block Buster Tech Inc", "BBUSD": "BounceBit USD", @@ -1487,6 +1531,7 @@ "BCOINM": "Bomb Crypto (MATIC)", "BCOQ": "BLACK COQINU", "BCP": "BitcashPay", + "BCPAY": "Bitcashpay", "BCPT": "BlockMason Credit Protocol", "BCR": "BitCredit", "BCRO": "Bonded Cronos", @@ -1508,8 +1553,9 @@ "BDCA": "BitDCA", "BDCC": "BDCC COIN", "BDCLBSC": "BorderCollieBSC", - "BDG": "BitDegree", + "BDG": "Beyond Gaming", "BDID": "BDID", + "BDIN": "BendDAO BDIN", "BDL": "Bitdeal", "BDOG": "Bulldog Token", "BDOGITO": "BullDogito", @@ -1529,7 +1575,8 @@ "BEAM": "Beam", "BEAMMW": "Beam", "BEAN": "Bean", - "BEANS": "Moonbeans", + "BEANS": "SUNBEANS (BEANS)", + "BEAR": "Bear Inu", "BEARIN": "Bear in Bathrobe", "BEAST": "MrBeast", "BEAT": "BEAT Token", @@ -1537,19 +1584,24 @@ "BEATLES": "JohnLennonC0IN", "BEATS": "Sol Beats", "BEBE": "BEBE", + "BEBEETH": "BEBE", + "BEBEV1": "BEBE v1", "BEC": "Betherchip", "BECH": "Beauty Chain", "BECN": "Beacon", "BECO": "BecoSwap Token", "BECX": "BETHEL", "BED": "Bankless BED Index", + "BEDROCK": "Bedrock", "BEE": "Herbee", "BEEF": "PepeBull", "BEEG": "Beeg Blue Whale", "BEENZ": "BEENZ", "BEEP": "BEEP", + "BEEPBOOP": "Boop", "BEER": "BEERCOIN", "BEERUSCAT": "BeerusCat", + "BEES": "BEEs", "BEET": "BEETroot", "BEETLE": "Beetle Coin", "BEETOKEN": "Bee Token", @@ -1673,7 +1725,8 @@ "BHO": "Bholdus Token", "BHP": "Blockchain of Hash Power", "BHPC": "BHPCash", - "BIAO": "Biaocoin", + "BIAO": "BIAO", + "BIAOCOIN": "Biaocoin", "BIB": "BIB Token", "BIBI": "BIBI", "BIBI2025": "Bibi", @@ -1746,10 +1799,11 @@ "BIPX": "Bispex", "BIR": "Birake", "BIRB": "Birb", - "BIRD": "Bird.Money", + "BIRD": "BIRD", "BIRDCHAIN": "Birdchain", "BIRDD": "BIRD DOG", "BIRDDOG": "Bird Dog", + "BIRDMONEY": "Bird.Money", "BIRDO": "Bird Dog", "BIS": "Bismuth", "BISKIT": "Biskit Protocol", @@ -1761,12 +1815,15 @@ "BITASEAN": "BitAsean", "BITB": "BeanCash", "BITBEDR": "Bitcoin EDenRich", + "BITBO": "BitBook", + "BITBOARD": "Bitboard", "BITBOOST": "BitBoost", "BITBULL": "Bitbull", "BITBURN": "Bitburn", "BITC": "BitCash", "BITCAR": "BitCar", "BITCAT": "Bitcat", + "BITCATONSOL": "Bitcat", "BITCCA": "Bitcci Cash", "BITCI": "Bitcicoin", "BITCM": "Bitcomo", @@ -1778,6 +1835,7 @@ "BITCOINV": "BitcoinV", "BITCONNECT": "BitConnect Coin", "BITCRATIC": "Bitcratic Token", + "BITDEGREE": "BitDegree", "BITE": "Bitether", "BITF": "Bit Financial", "BITFLIP": "BitFlip", @@ -1799,6 +1857,7 @@ "BITRUE": "Bitrue Coin", "BITS": "BitstarCoin", "BITSD": "Bits Digit", + "BITSEEDS": "BitSeeds", "BITSERIAL": "BitSerial", "BITSILVER": "bitSilver", "BITSPACE": "Bitspace", @@ -1826,7 +1885,7 @@ "BJ": "Blocjerk", "BJK": "Beşiktaş", "BKBT": "BeeKan", - "BKC": "Balkancoin", + "BKC": "BKC Token", "BKING": "King Arthur", "BKK": "BKEX Token", "BKN": "Brickken", @@ -1843,12 +1902,14 @@ "BLACK": "BLACKHOLE PROTOCOL", "BLACKD": "Blackder AI", "BLACKDRAGON": "Black Dragon", + "BLACKP": "BlackPool Token", "BLACKR": "BLACK ROCK", "BLACKROCK": "BlackRock", "BLACKSALE": "Black Sale", "BLACKST": "Black Stallion", "BLACKSWAN": "BlackSwan AI", - "BLADE": "BladeWarrior", + "BLADE": "BladeGames", + "BLADEW": "BladeWarrior", "BLAKEBTC": "BlakeBitcoin", "BLANK": "Blank Token", "BLAS": "BlakeStar", @@ -1856,7 +1917,8 @@ "BLASTA": "BlastAI", "BLASTUP": "BlastUP", "BLAUNCH": "B-LAUNCH", - "BLAZE": "Blaze", + "BLAZE": "StoryFire", + "BLAZECOIN": "Blaze", "BLAZEX": "BlazeX", "BLAZR": "BlazerCoin", "BLBY": "Badluckbaby", @@ -1892,10 +1954,13 @@ "BLOCK": "Blockasset", "BLOCKB": "Block Browser", "BLOCKF": "Block Farm Club", + "BLOCKG": "BlockGames", "BLOCKIFY": "Blockify.Games", + "BLOCKMAX": "BLOCKMAX", "BLOCKN": "BlockNet", "BLOCKPAY": "BlockPay", "BLOCKS": "BLOCKS", + "BLOCKSSPACE": "Blocks Space", "BLOCKSTAMP": "BlockStamp", "BLOCKT": "Blocktools", "BLOCKW": "Blockwise", @@ -1912,7 +1977,7 @@ "BLOXT": "Blox Token", "BLP": "BullPerks", "BLRY": "BillaryCoin", - "BLS": "Blocks Space", + "BLS": "BloodLoop", "BLST": "Crypto Legions Bloodstone", "BLT": "Blocto Token", "BLTC": "BABYLTC", @@ -2092,12 +2157,13 @@ "BOLTT": "BolttCoin", "BOM": "Book Of Matt Furie", "BOMA": "Book of Maga", - "BOMB": "BOMB", + "BOMB": "LollyBomb", "BOMBC": "BombCoin", "BOMBLOONG": "Bombloong", "BOMBM": "Bomb Money", "BOMBO": "BOMBO", "BOMBS": "Bomb Shelter Inu", + "BOMBTOKEN": "BOMB", "BOME": "BOOK OF MEME", "BOME2": "Book of Meme 2.0", "BOMEDOGE": "BOOK OF DOGE MEMES", @@ -2114,6 +2180,7 @@ "BONDLYV1": "Bondly Finance", "BONDX": "BondX", "BONE": "Bone ShibaSwap", + "BONEBONE": "Bone", "BONES": "Moonshots Farm", "BONESCOIN": "BonesCoin", "BONESV1": "Squirrel Finance", @@ -2155,7 +2222,7 @@ "BOOMDAO": "BOOM DAO", "BOOMER": "Boomer", "BOONS": "BOONSCoin", - "BOOP": "Boop", + "BOOP": "BOOP", "BOOS": "Boost Trump Campaign", "BOOST": "PodFast", "BOOSTCO": "Boost", @@ -2236,7 +2303,7 @@ "BPRO": "BitCloud Pro", "BPS": "BitcoinPoS", "BPSHIB": "Binance-Peg Shiba Inu (Binance Bridge)", - "BPT": "BlackPool Token", + "BPT": "Best Patent Token", "BPTC": "Business Platform Tomato Coin", "BPUNI": "Binance-Peg Uniswap Protocol Token (Binance Bridge)", "BPUSDC": "Binance-Peg USD Coin (Binance Bridge)", @@ -2397,7 +2464,7 @@ "BSW": "Biswap", "BSWAP": "BaseSwap", "BSWT": "BaySwap", - "BSX": "Basilisk", + "BSX": "BSX", "BSY": "Bestay", "BSYS": "BSYS", "BT": "BT.Finance", @@ -2524,6 +2591,7 @@ "BUBV1": "BUBCAT v1", "BUC": "Beau Cat", "BUCK": "Coinbuck", + "BUCKAZOIDS": "Buckazoids", "BUCKS": "SwagBucks", "BUCKY": "Bucky", "BUD": "Buddy", @@ -2606,7 +2674,8 @@ "BUY": "Burency", "BUYI": "Buying.com", "BUYT": "Buy the DIP", - "BUZZ": "BuzzCoin", + "BUZZ": "Hive AI", + "BUZZCOIN": "BuzzCoin", "BV3A": "Buccaneer V3 Arbitrum", "BVC": "BeaverCoin", "BVM": "BVM", @@ -2644,6 +2713,7 @@ "BYB": "BiorBank", "BYC": "ByteCent", "BYG": "Black Eye Galaxy", + "BYIN": "BYIN", "BYT": "ByteAI", "BYTE": "Byte", "BYTES": "Neo Tokyo", @@ -2701,8 +2771,9 @@ "CAKEMOON": "CakeMoon", "CAKESWAP": "CakeSwap", "CAKEW": "CakeWSwap", - "CAL": "Calcium", + "CAL": "FitBurn", "CALC": "CaliphCoin", + "CALCI": "Calcium", "CALI": "CaliCoin", "CALL": "Global Crypto Alliance", "CALLS": "OnlyCalls by Virtuals", @@ -2717,7 +2788,8 @@ "CAN": "Channels", "CANCER": "Cancer", "CAND": "Canary Dollar", - "CANDLE": "Candle Cat", + "CANDLE": "Candle TV", + "CANDLECAT": "Candle Cat", "CANDY": "UnicornGo Candy", "CANDYLAD": "Candylad", "CANN": "CannabisCoin", @@ -2738,15 +2810,17 @@ "CAPTAINPLANET": "Captain Planet", "CAPY": "Capybara", "CAPYBARA": "Capybara", - "CAR": "CarBlock", + "CAR": "Central African Republic Meme", "CARAT": "Carats Token", + "CARBLOCK": "CarBlock", "CARBO": "CleanCarbon", "CARBON": "Carboncoin", "CARBONGEMS": "Carbon GEMS", "CARD": "Cardstack", "CARDS": "Cardstarter", "CARDSWAP": "CardSwap", - "CARE": "Carebit", + "CARE": "CareCoin", + "CAREBIT": "Carebit", "CARES": "CareCoin", "CARL": "Carl", "CARLO": "Carlo", @@ -2767,6 +2841,7 @@ "CASINU": "Casinu Inu", "CASIO": "CasinoXMetaverse", "CASPER": "Casper DeFi", + "CASPERTOKEN": "Casper Token", "CAST": "Castello Coin", "CASTLE": "bitCastle", "CAT": "Simon's Cat", @@ -2787,6 +2862,7 @@ "CATCOINV2": "CatCoin Cash", "CATDOG": "Cat-Dog", "CATDOGE": "CAT DOGE", + "CATE": "Cate on ETH", "CATEC": "Cate Coin", "CATECOIN": "CateCoin", "CATELON": "CatElonMars", @@ -2796,6 +2872,7 @@ "CATGAME": "Cookie Cat Game", "CATGIRL": "Catgirl", "CATGOKU": "Catgoku", + "CATGOLD": "Cat Gold Miner", "CATGPT": "CatGPT", "CATHAT": "catwifhat", "CATHEON": "Catheon Gaming", @@ -2809,12 +2886,13 @@ "CATO": "CATO", "CATPAY": "CATpay", "CATPEPE": "CAT PEPE", - "CATS": "CatCoin Token", + "CATS": "Cats", "CATSC": "Catscoin", "CATSHIRA": "Shira Cat", "CATSO": "Cats Of Sol", "CATSON": "Catson", "CATSV1": "CatCoin Token v1", + "CATSV2": "CatCoin Token", "CATSY": "CAT SYLVESTER", "CATT": "Catex", "CATTO": "Cat Token", @@ -2904,6 +2982,7 @@ "CDAI": "Compound Dai", "CDBIO": "CDbio", "CDCETH": "Crypto.com Staked ETH", + "CDCSOL": "Crypto.com Staked SOL", "CDEX": "Cryptodex", "CDL": "CoinDeal Token", "CDN": "Canada eCoin", @@ -2922,6 +3001,7 @@ "CEICAT": "CEILING CAT", "CEJI": "Ceji", "CEL": "Celsius Network", + "CELA": "Cellula Token", "CELEB": "CELEBPLUS", "CELL": "Cellframe", "CELO": "Celo", @@ -3151,6 +3231,7 @@ "CIRRUS": "Cirrus", "CIRUS": "Cirus", "CIRX": "Circular Protocol", + "CITADAIL": "Griffain New Hedge Fund", "CITI": "CITI Fediverse", "CITY": "Manchester City Fan Token", "CIV": "Civilization", @@ -3206,6 +3287,7 @@ "CLM": "CoinClaim", "CLMRS": "Crolon Mars", "CLN": "Colu Local Network", + "CLND": "COLEND", "CLNX": "Coloniume Network", "CLNY": "Colony", "CLO": "Callisto Network", @@ -3303,6 +3385,7 @@ "COCONUT": "Coconut", "COCOR": "Cocoro", "COCORO": "Cocoro", + "COCOROBNB": "Cocoro", "COCOROERC": "COCORO", "COD": "Chief of Deswamp", "CODA": "CODA", @@ -3406,7 +3489,8 @@ "COQ": "Coq Inu", "COR": "Coreto", "CORA": "Cora by Virtuals", - "CORAL": "CoralPay", + "CORAL": "Coral Protocol", + "CORALPAY": "CoralPay", "CORE": "Core", "COREC": "CoreConnect", "COREDAO": "coreDAO", @@ -3583,6 +3667,7 @@ "CRONA": "CronaSwap", "CRONK": "CRONK", "CROPPER": "CropperFinance", + "CROS": "Cros Token", "CROW": "cr0w by Virtuals", "CROWD": "CrowdCoin", "CROWDWIZ": "Crowdwiz", @@ -3631,6 +3716,7 @@ "CRYPTOE": "Cryptoenter", "CRYPTOEM": "Crypto Emperor Trump", "CRYPTOF": "CryptoFarmers", + "CRYPTOFIGHT": "Crypto Fight Club", "CRYPTOH": "CryptoHunterTrading", "CRYPTOJ": "Crypto Journey", "CRYPTOJESUS": "Crypto Jesus Trump", @@ -3643,6 +3729,7 @@ "CRYPTOS": "CryptoSoul", "CRYPTOSDG": "Crypto SDG", "CRYPTOT": "Crypto Trump", + "CRYPTOTANKS": "CryptoTanks", "CRYPTOU": "CryptoUnity", "CRYSTAL": "Crystal", "CRYSTALCLEAR": "Crystal Clear Token", @@ -3667,6 +3754,7 @@ "CSQ": "cosquare", "CSR": "Cashera", "CSS": "CoinSwap Token", + "CST": "Crypto Samurai", "CSTC": "CryptosTribe", "CSTL": "Castle", "CSTR": "CoreStarter", @@ -3727,7 +3815,8 @@ "CUFF": "Jail Cat", "CULO": "CULO", "CULOETH": "CULO", - "CULT": "Cult DAO", + "CULT": "Milady Cult Coin", + "CULTDAO": "Cult DAO", "CULTUR": "Cultur", "CUM": "Cumbackbears", "CUMINU": "CumInu", @@ -3812,6 +3901,7 @@ "CYBERWAY": "CyberWay", "CYBONK": "CYBONK", "CYBR": "CYBR", + "CYBRO": "Cybro Token", "CYC": "Cyclone Protocol", "CYCAT": "Chi Yamada Cat", "CYCE": "Crypto Carbon Energy", @@ -3910,6 +4000,7 @@ "DAO1": "DAO1", "DAOACT": "ACT", "DAOB": "DAOBet", + "DAOLITY": "Daolity", "DAOP": "Dao Space", "DAOSOL": "MonkeDAO", "DAOVC": "DAO.VC", @@ -4050,6 +4141,7 @@ "DEBT": "The Debt Box", "DEC": "Decentr", "DECENTRALG": "Decentral Games ICE", + "DECENTRALIZED": "DECENTRALIZED", "DECHAT": "Dechat", "DECI": "Maximus DECI", "DECL": "Decimal token", @@ -4074,9 +4166,11 @@ "DEEPSEEKR1": "DeepSeek R1", "DEER": "ToxicDeer Finance", "DEERSEIZED": "Deer Seized by US Government", + "DEESSE": "Deesse", "DEEX": "DEEX", "DEEZ": "DEEZ NUTS", - "DEFAI": "DeFAI", + "DEFAI": "DEFAI", + "DEFAIDAO": "DeFAI", "DEFC": "Defi Coin", "DEFEND": "Blockdefend AI", "DEFI": "DeFi", @@ -4140,7 +4234,8 @@ "DERO": "Dero", "DERP": "Derp", "DES": "DeSpace Protocol", - "DESCI": "DeSci Meme", + "DESCI": "SUI Desci Agents", + "DESCIMEME": "DeSci Meme", "DESI": "Desico", "DESO": "Decentralized Social", "DESTINY": "Destiny", @@ -4241,9 +4336,10 @@ "DIA": "DIA", "DIAB": "Diablo IV Solana", "DIABLO": "Diablo IV", - "DIAM": "Diamond", + "DIAM": "DIAM", "DIAMND": "Projekt Diamond", "DIAMO": "Diamond Launch", + "DIAMON": "Diamond", "DIAMOND": "Diamond Coin", "DIAMONDINU": "Diamond", "DIBBLE": "Dibbles", @@ -4287,13 +4383,15 @@ "DIM": "DIMCOIN", "DIME": "DimeCoin", "DIMO": "DIMO", - "DIN": "Dinero", + "DIN": "DIN", + "DINE": "Dinero", "DINERO": "Dinero", "DINEROBET": "Dinerobet", "DINGER": "Dinger Token", "DINGO": "Dingocoin", - "DINO": "DinoSwap", + "DINO": "DinoLFG", "DINOS": "Dinosaur Inu", + "DINOSWAP": "DinoSwap", "DINT": "DinarTether", "DINU": "Dogey-Inu", "DINW": "Dinowars", @@ -4354,7 +4452,7 @@ "DMAGA": "Dark MAGA", "DMAIL": "DMAIL Network", "DMAR": "DMarket", - "DMC": "Dream21", + "DMC": "Datamall Coin", "DMCC": "DiscoverFeed", "DMCH": "DARMA Cash", "DMCK": "Diamond Castle", @@ -4366,6 +4464,7 @@ "DMLG": "Demole", "DMOD": "Demodyfi Token", "DMOON": "Dollarmoon", + "DMR": "dmr", "DMS": "Documentchain", "DMT": "Dream Machine Token", "DMTC": "Demeter Chain", @@ -4405,6 +4504,7 @@ "DOCK": "Dock.io", "DOCSWAP": "Dex on Crypto", "DOCT": "DocTailor", + "DOCTO": "DoctorX", "DOD": "Day Of Defeat 2.0", "DOD100": "Day of Defeat Mini 100x", "DODI": "DoubleDice", @@ -4446,6 +4546,7 @@ "DOGEFATHER": "Dogefather", "DOGEFORK": "DogeFork", "DOGEGF": "DogeGF", + "DOGEGOV": "Department Of Government Efficiency (dogegov.com)", "DOGEGROK": "Doge Grok", "DOGEGROKAI": "Doge Of Grok AI", "DOGEI": "Dogei", @@ -4485,6 +4586,7 @@ "DOGIN": "Doginhood", "DOGINC": "dog in cats world", "DOGINME": "doginme", + "DOGINWOTAH": "doginwotah", "DOGIRA": "Dogira", "DOGK": "Dagknight Dog", "DOGLAI": "Doglaikacoin", @@ -4514,13 +4616,14 @@ "DOLLARCOIN": "DollarCoin", "DOLLUR": "Dollur Go Brrr", "DOLLY": "DOLLY", + "DOLO": "Dolomite", "DOLPHY": "Dolphy", "DOLZ": "DOLZ", - "DOM": "Ancient Kingdom", + "DOM": "DomusAI", "DOME": "Everdome", "DOMI": "Domi", "DOMO": "Dony Montana", - "DON": "Donnie Finance", + "DON": "TheDonato Token", "DONA": "DONASWAP", "DONAL": "Donald Pump", "DONALD": "DONALD TRUMP", @@ -4532,11 +4635,13 @@ "DONJR": "Don Jr.", "DONK": "Don-key", "DONKE": "DONKE", + "DONNIEFIN": "Donnie Finance", "DONS": "The Dons", "DONT": "Donald Trump (dont.cash)", "DONU": "Donu", "DONUT": "Donut", "DONUTS": "The Simpsons", + "DOOD": "Doodles", "DOODI": "Doodipals", "DOODOO": "Doodoo", "DOOGLE": "Doogle", @@ -4617,6 +4722,7 @@ "DRCT": "Ally Direct", "DRE": "DoRen", "DREAM": "DREAM", + "DREAM21": "Dream21", "DREAMS": "Dreams Quest", "DREP": "DREP", "DRF": "Drife", @@ -4761,6 +4867,7 @@ "DVT": "DeVault", "DVTC": "DivotyCoin", "DVX": "Derivex", + "DWAIN": "DWAIN", "DWARFY": "Dwarfy", "DWARS": "Dynasty Wars", "DWC": "Digital Wallet", @@ -4817,6 +4924,7 @@ "E1INCH": "1inch (Energi Bridge)", "E21": "E21 Coin", "E2C": "Electronic Energy Coin", + "E4C": "E4C", "E8": "Energy8", "EA": "EagleCoin", "EAC": "Education Assessment Cult", @@ -4828,11 +4936,14 @@ "EAI": "Eagle AI", "EARLY": "Early Risers", "EARLYF": "EarlyFans", - "EARN": "EarnGuild", + "EARN": "Earn Network", "EARNB": "Earn BTC", + "EARNGUILD": "EarnGuild", + "EARNM": "EARNM", "EARTH": "Earth Token", "EARTHCOIN": "EarthCoin", "EASYF": "EasyFeedback", + "EASYMINE": "EasyMine", "EAT": "EDGE Activity Token", "EATH": "Eartherium", "EAURIC": "Eauric", @@ -4873,7 +4984,8 @@ "ECI": "Euro Cup Inu", "ECL": "ECLAT", "ECLD": "Ethernity Cloud", - "ECLIP": "Eclipse", + "ECLIP": "Eclipse Fi", + "ECLIPSE": "Eclipse", "ECO": "Ormeus Ecosystem", "ECOB": "EcoBit", "ECOC": "ECOcoin", @@ -4902,7 +5014,8 @@ "EDEXA": "edeXa Security Token", "EDFI": "EdFi", "EDG": "Edgeless", - "EDGE": "EDGE", + "EDGE": "Definitive", + "EDGENET": "EDGE", "EDGESOL": "Edgevana Staked SOL", "EDGEW": "Edgeware", "EDGT": "Edgecoin", @@ -4924,6 +5037,7 @@ "EDWIN": "Edwin", "EDX": "Equilibrium", "EEFS": "Eefs", + "EEG": "EEG Token", "EER": "Ethereum eRush", "EETH": "ether fi", "EFBAI": "EuroFootball AI", @@ -4971,6 +5085,7 @@ "EHRT": "Eight Hours Token", "EIFI": "EIFI FINANCE", "EIGEN": "EigenLayer", + "EIGENP": "Eigenpie", "EIM": "Expert Infra", "EIQT": "IQ Prediction", "EJAC": "EJA Coin", @@ -5013,7 +5128,8 @@ "ELI": "GoCrypto", "ELIC": "Elicoin", "ELITE": "EthereumLite", - "ELIX": "Elixir", + "ELIX": "Elixir Games", + "ELIXI": "Elixir", "ELIXIR": "Starchi", "ELIZ": "Eliza (ai16zeliza)", "ELIZA": "Eliza (elizawakesup.ai)", @@ -5069,7 +5185,8 @@ "EMATIC": "Wrapped Polygon (Energi Bridge)", "EMAX": "EthereumMax", "EMB": "Overline Emblem", - "EMBER": "EmberCoin", + "EMBER": "Ember", + "EMBERCOIN": "EmberCoin", "EMBR": "Embr", "EMC": "Edge Matrix Computing", "EMC2": "Einsteinium", @@ -5092,7 +5209,7 @@ "EMR": "Emorya Finance", "EMRLD": "The Emerald Company", "EMRX": "Emirex Token", - "EMT": "EasyMine", + "EMT": "EMAIL Token", "EMU": "eMusic", "EMV": "Ethereum Movie Venture", "EMX": "EMX", @@ -5165,6 +5282,7 @@ "EPIX": "Byepix", "EPK": "EpiK Protocol", "EPS": "Ellipsis (OLD)", + "EPT": "Balance", "EPTT": "Evident Proof Transaction Token", "EPX": "Ellipsis X", "EPY": "Empyrean", @@ -5214,6 +5332,7 @@ "ES": "Era Swap Token", "ESAI": "Ethscan AI", "ESBC": "ESBC", + "ESCC": "Eos Stable Coin Chain", "ESCE": "Escroco Emerald", "ESCROW": "Cryptegrity DAO", "ESCU": "EYESECU AI", @@ -5373,11 +5492,12 @@ "EVIN": "Evin Token", "EVMOS": "Evmos", "EVN": "Evn Token", - "EVO": "EvoVerses", + "EVO": "Devomon", "EVOAI": "EvolveAI", "EVOC": "EVOCPLUS", "EVOL": "EVOL NETWORK", "EVOS": "EVOS", + "EVOVERSES": "EvoVerses", "EVR": "Everus", "EVRICE": "Evrice", "EVRM": "Evrmore", @@ -5429,6 +5549,7 @@ "EYE": "MEDIA EYE", "EYES": "Eyes Protocol", "EYETOKEN": "EYE Token", + "EYWA": "EYWA", "EZ": "EasyFi V2", "EZC": "EZCoin", "EZEIGEN": "Restaked EIGEN", @@ -5437,6 +5558,8 @@ "EZM": "EZMarket", "EZPZ": "Eazy Peazy", "EZSOL": "Renzo Restaked SOL", + "EZSWAP": "EZswap Protocol", + "EZSWAPV1": "EZswap Protocol v1", "EZT": "EZToken", "EZY": "EzyStayz", "ElvishMagic": "EMAGIC", @@ -5459,6 +5582,7 @@ "FACTOM": "Factom", "FACTORY": "ChainFactory", "FACTR": "Defactor", + "FACTRPAY": "FactR", "FADO": "FADO Go", "FAFO": "FAFO", "FAFOSOL": "Fafo", @@ -5522,7 +5646,7 @@ "FAYD": "Fayda", "FAYRE": "Fayre", "FAZZ": "FazzCoin", - "FB": "Fenerbahçe Token", + "FB": "Fractal Bitcoin", "FBA": "Firebird Aggregator", "FBB": "FilmBusinessBuster", "FBG": "Fort Block Games", @@ -5573,6 +5697,7 @@ "FELIX": "FelixCoin", "FELIX2": "Felix 2.0 ETH", "FEN": "First Ever NFT", + "FENE": "Fenerbahçe Token", "FENOMY": "Fenomy", "FENTANYL": "Chinese Communist Dragon", "FER": "Ferro", @@ -5608,6 +5733,7 @@ "FI": "Fideum", "FIA": "FIA Protocol", "FIBO": "FibSWAP DEx", + "FIBOS": "FIBOS", "FIBRE": "FIBRE", "FIC": "Filecash", "FID": "Fidira", @@ -5621,7 +5747,7 @@ "FIFTY": "FIFTYONEFIFTY", "FIG": "FlowCom", "FIGH": "FIGHT FIGHT FIGHT", - "FIGHT": "Crypto Fight Club", + "FIGHT": "Fight to MAGA", "FIGHTMAGA": "FIGHT MAGA", "FIGHTPEPE": "FIGHT PEPE", "FIGHTRUMP": "FIGHT TRUMP", @@ -5630,6 +5756,7 @@ "FIL": "FileCoin", "FILDA": "Filda", "FILES": "Solfiles", + "FILEST": "FileStar", "FILL": "Fillit", "FILM": "Filmpass", "FILST": "Filecoin Standard Hashrate Token", @@ -5646,6 +5773,7 @@ "FINK": "FINK", "FINN": "Huckleberry", "FINOM": "Finom FIN Token", + "FINOMNOM": "Finom NOM Token", "FINS": "AutoShark DEX", "FINT": "FintraDao", "FINU": "Formula Inu", @@ -5656,6 +5784,7 @@ "FIRA": "Defira", "FIRE": "Matr1x Fire", "FIRECOIN": "FireCoin", + "FIREP": "Fire Protocol", "FIREW": "Fire Wolf", "FIRO": "Firo", "FIRSTHARE": "FirstHare", @@ -5697,6 +5826,7 @@ "FLAS": "Flas Exchange Token", "FLASH": "Flashstake", "FLASHC": "FLASH coin", + "FLASHT": "FlashToken", "FLAVIA": "Flavia Is Online", "FLAY": "Flayer", "FLC": "FlowChainCoin", @@ -5813,10 +5943,11 @@ "FNX": "FinNexus", "FNXAI": "Finanx AI", "FNZ": "Fanzee", - "FO": "FIBOS", + "FO": "Official FO", "FOA": "Fragments of arker", "FOAM": "Foam", "FOC": "TheForce Trade", + "FOCAI": "focai.fun", "FOCV": "FOCV", "FODL": "Fodl Finance", "FOF": "Future Of Fintech", @@ -5829,7 +5960,8 @@ "FOL": "Folder Protocol", "FOLD": "Manifold Finance", "FOLO": "Alpha Impact", - "FOMO": "FOMO BULL CLUB", + "FOM": "FOMO BULL CLUB", + "FOMO": "Fomo", "FOMON": "FOMO Network", "FOMOSOL": "FOMOSolana", "FON": "INOFI", @@ -5870,6 +6002,7 @@ "FOTA": "Fight Of The Ages", "FOTO": "Unique Photo", "FOTTIE": "Fottie", + "FOU": "Four", "FOUND": "ccFound", "FOUNTAIN": "Fountain", "FOUR": "4", @@ -5893,6 +6026,7 @@ "FPI": "Frax Price Index", "FPIBANK": "FPIBANK", "FPIS": "Frax Price Index Share", + "FPS": "WEB3WAR Token", "FQS": "FQSwap V2", "FR": "Freedom Reserve", "FRA": "Findora", @@ -5914,6 +6048,7 @@ "FREE": "FREE coin", "FREED": "FreedomCoin", "FREEDO": "Freedom", + "FREEDOG": "Freedogs", "FREEDOM": "Freedom Protocol Token", "FREELA": "DecentralFree", "FREEPAVEL": "Free Pavel", @@ -5950,6 +6085,7 @@ "FROGLIC": "Pink Hood Froglicker", "FROGO": "Frogo", "FROK": "Frok.ai", + "FROKAI": "FrokAI", "FRONK": "Fronk", "FRONT": "Frontier", "FROP": "Popo The Frog", @@ -5999,7 +6135,7 @@ "FTO": "FuturoCoin", "FTON": "Fanton", "FTP": "FuturePoints", - "FTR": "FactR", + "FTR": "Fautor", "FTRB": "Faith Tribe", "FTRC": "FutureCoin", "FTS": "Fortress Lending", @@ -6016,7 +6152,8 @@ "FUBAO": "FUBAO", "FUCK": "Fuck Token", "FUCKTRUMP": "FUCK TRUMP", - "FUD": "FUD.finance", + "FUD": "Fud the Pug", + "FUDFINANCE": "FUD.finance", "FUEGO": "FUEGO", "FUEL": "Fuel Network", "FUELX": "Fuel", @@ -6070,6 +6207,7 @@ "FWT": "Freeway Token", "FWW": "Farmers World Wood", "FX": "Function X", + "FXAKV": "Akiverse Governance", "FXB": "FxBox", "FXC": "Flexacoin", "FXD": "Fathom Dollar", @@ -6084,6 +6222,7 @@ "FXUSD": "f(x) Protocol fxUSD", "FXY": "Floxypay", "FYD": "FYDcoin", + "FYDE": "Fyde", "FYDO": "Fly Doge", "FYN": "Affyn", "FYP": "FlypMe", @@ -6127,6 +6266,7 @@ "GAMBIT": "Gambit", "GAMBL": "Metagamble", "GAME": "GameBuild", + "GAME5BALL": "Game 5 BALL", "GAMEBUD": "GAMEBUD", "GAMEBYV": "GAME by Virtuals", "GAMEC": "Game", @@ -6145,6 +6285,7 @@ "GAMESTOP": "GameStop", "GAMESTUMP": "GAMESTUMP", "GAMET": "GAME Token", + "GAMETA": "Gameta", "GAMEX": "GameX", "GAMI": "GAMI World", "GAMIN": "Gaming Stars", @@ -6238,9 +6379,10 @@ "GE": "GEchain", "GEA": "Goldea", "GEAR": "Gearbox Protocol", - "GEC": "Geco.one", + "GEC": "Gecko Inu", "GECKO": "Gecko Coin", "GECKY": "Gecky", + "GECO": "GECOIN", "GEEK": "De:Lithe Last Memories", "GEEQ": "Geeq", "GEF": "GemFlow", @@ -6423,6 +6565,7 @@ "GLIESE": "GlieseCoin", "GLINK": "Gemlink", "GLINT": "BeamSwap", + "GLIZZY": "GLIZZY", "GLM": "Golem Network Token", "GLMR": "Moonbeam", "GLMV1": "Golem Network Token v1", @@ -6480,7 +6623,7 @@ "GMX": "GMX", "GN": "GN", "GNBT": "Genebank Token", - "GNC": "Greencoin", + "GNC": "Greenchie", "GND": "GND Protoco", "GNFT": "GNFT", "GNG": "GreenGold", @@ -6499,12 +6642,14 @@ "GNY": "GNY", "GO": "GoChain", "GOA": "GoaCoin", - "GOAL": "GOAL token", + "GOAL": "TopGoal Token", "GOALBON": "Goal Bonanza", "GOALS": "UnitedFans", + "GOALTOKEN": "GOAL token", "GOAT": "Goatseus Maximus", "GOATAI": "GOAT AI", "GOATCOIN": "Goat", + "GOATS": "GOATS", "GOATSE": "GOATSE", "GOB": "Goons of Balatroon", "GOC": "GoCrypto", @@ -6520,6 +6665,7 @@ "GOETH": "Algomint", "GOF": "Golff", "GOFF": "Gift Off Token", + "GOFINDXR": "Gofind XR", "GOFX": "GooseFX", "GOG": "Guild of Guardians", "GOGLZ": "GOGGLES", @@ -6537,6 +6683,7 @@ "GOLDCOINETH": "Gold", "GOLDE": "GOLDEN AGE", "GOLDEN": "Golden Inu", + "GOLDENC": "GoldenCat", "GOLDENG": "Golden Goose", "GOLDF": "Gold Fever", "GOLDMIN": "GoldMiner", @@ -6573,6 +6720,7 @@ "GOON": "Goonies", "GOP": "The Republican Party", "GOPX": "GOPX Token", + "GOR": "@gork", "GORA": "Gora", "GOREC": "GoRecruit", "GORGONZOLA": "Heroes 3 Foundation", @@ -6580,6 +6728,7 @@ "GORILLA": "Gorilla", "GORILLAD": "Gorilla Diamond", "GORILLAINU": "Gorilla Inu", + "GORK": "New XAI gork", "GORPLE": "GorplesCoin", "GOS": "Gosama", "GOSS": "GOSSIP-Coin", @@ -6643,6 +6792,7 @@ "GREARN": "GrEarn", "GREE": "Green God Candle", "GREEN": "GreenX", + "GREENCOIN": "Greencoin", "GREENH": "Greenheart CBD", "GREENMMT": "Green Mining Movement Token", "GREENPOWER": "GreenPower", @@ -6701,10 +6851,12 @@ "GROOOOOK": "Groooook", "GROOVE": "GROOVE", "GROW": "Grow Token", + "GROWAI": "SocialGrowAI", "GROWNCOIN": "GrownCoin", "GROWTH": "GROWTH DeFi", "GROYPER": "Groyper", "GRP": "Grape", + "GRPH": "Soul Graph", "GRPL": "Golden Ratio Per Liquidity", "GRS": "Groestlcoin", "GRT": "The Graph", @@ -6778,6 +6930,7 @@ "GUILD": "BlockchainSpace", "GUISE": "GUISE", "GULF": "GulfCoin", + "GULL": "GULL", "GUM": "Gourmet Galaxy", "GUMMIES": "GUMMIES", "GUMMY": "GUMMY", @@ -6809,6 +6962,7 @@ "GXC": "GXChain", "GXE": "XENO Governance", "GXT": "Gem Exchange And Trading", + "GYAT": "Gyat Coin", "GYEN": "GYEN", "GYM": "GYM Token", "GYMNET": "Gym Network", @@ -6839,6 +6993,7 @@ "HACHIKO": "Hachiko Inu Token", "HACHIONB": "Hachi On Base", "HACK": "HACK", + "HAEDAL": "Haedal Protocol", "HAGGIS": "New Born Haggis Pygmy Hippo", "HAHA": "Hasaki", "HAI": "Hacken Token", @@ -6848,6 +7003,7 @@ "HAKU": "HakuSwap", "HAL": "Halcyon", "HALF": "0.5X Long Bitcoin Token", + "HALFP": "Half Pizza", "HALFSHIT": "0.5X Long Shitcoin Index Token", "HALLO": "Halloween Coin", "HALLOWEEN": "HALLOWEEN", @@ -6857,7 +7013,7 @@ "HAMI": "Hamachi Finance", "HAMMY": "SAD HAMSTER", "HAMS": "HamsterCoin", - "HAMSTER": "Space Hamster", + "HAMSTER": "Hamster", "HAMSTERB": "HamsterBase", "HAMSTR": "Hamster Coin", "HAN": "HanChain", @@ -6878,6 +7034,7 @@ "HARE": "Hare Token", "HAREPLUS": "Hare Plus", "HAROLD": "Harold", + "HAROLDDUCK": "Harold", "HARPER": "Harper", "HARR": "HARRIS DOGS", "HARRIS": "KAMALA HARRIS", @@ -6889,9 +7046,10 @@ "HASBIK": "Hasbulla", "HASH": "Provenance Blockchain", "HASHAI": "HashAI", + "HASHNET": "HashNet BitEco", "HASHT": "HASH Token", "HASUI": "Haedal", - "HAT": "Hawala.Exchange", + "HAT": "TOP HAT", "HATAY": "Hatayspor Token", "HATCHY": "Hatchyverse", "HATI": "Hati", @@ -6899,6 +7057,7 @@ "HAVOC": "Havoc", "HAVY": "Havy", "HAW": "Hawk Tuah", + "HAWALA": "HAWALA", "HAWK": "Hawksight", "HAWKCITY": "Hawk", "HAWKPTAH": "Hawk Ptah", @@ -6975,12 +7134,13 @@ "HEM": "Hemera", "HEMAN": "HE-MAN", "HEMULE": "Hemule", + "HENAI": "HenjinAI Token", "HENG": "HengCoin", "HENL": "henlo", "HENLO": "Henlo", "HENLOV1": "Henlo v1", "HEP": "Health Potion", - "HER": "Hero Node", + "HER": "Her.AI", "HERA": "Hero Arena", "HERAF": "Hera Finance", "HERB": "HerbCoin", @@ -6995,6 +7155,7 @@ "HEROESAI": "HEROES AI", "HEROESC": "HeroesChained", "HEROI": "Heroic Saga Shiba", + "HERONODE": "Hero Node", "HET": "HavEther", "HETA": "HetaChain", "HETH": "Huobi Ethereum", @@ -7117,7 +7278,7 @@ "HMTT": "Hype Meme Token", "HMU": "hit meeee upp", "HMX": "HMX", - "HNB": "HashNet BitEco", + "HNB": "HNB Protocol", "HNC": "Hellenic Coin", "HNCN": "Huncoin", "HND": "Hundred Finance", @@ -7148,9 +7309,11 @@ "HOKK": "Hokkaidu Inu", "HOL": "Hololoot", "HOLA": "Hola Token", - "HOLD": "HOLD", + "HOLD": "Holdcoin", + "HOLDCO": "HOLD", "HOLDEX": "Holdex Finance", "HOLDON4": "HoldOn4DearLife", + "HOLDS": "Holdstation", "HOLY": "Holy Trinity", "HOM": "Homeety", "HOME": "OtterHome", @@ -7187,6 +7350,7 @@ "HORUS": "HorusPay", "HOS": "Hotel of Secrets", "HOSHI": "Dejitaru Hoshi", + "HOSICO": "Hosico Cat", "HOSKY": "Hosky", "HOSTAI": "Host AI", "HOT": "Holo", @@ -7196,7 +7360,7 @@ "HOTN": "HotNow", "HOTT": "HOT Token", "HOUND": "BaseHoundBot by Virtuals", - "HOUSE": "Klaymore Stakehouse", + "HOUSE": "Housecoin", "HOW": "HowInu", "HOWL": "Coyote", "HP": "HeroPark", @@ -7211,6 +7375,7 @@ "HPX": "HUPAYX", "HPY": "Hyper Pay", "HPYPEPE": "Happy Pepe Token", + "HQ": "Metaverse HQ", "HQR": "Hayya Qatar", "HQT": "HyperQuant", "HQX": "HOQU", @@ -7314,16 +7479,18 @@ "HYDROP": "Hydro Protocol", "HYGH": "HYGH", "HYN": "Hyperion", - "HYP": "HyperStake", + "HYP": "HyperX", "HYPC": "HyperCycle", "HYPE": "Hyperliquid", - "HYPER": "HyperChainX", + "HYPER": "Hyperlane", "HYPERAI": "HyperHash AI", + "HYPERC": "HyperChainX", "HYPERCOIN": "HyperCoin", "HYPERD": "HyperDAO", "HYPERIONX": "HyperionX", "HYPERS": "HyperSpace", "HYPERSKIDS": "HYPERSKIDS", + "HYPERSTAKE": "HyperStake", "HYPES": "Supreme Finance", "HYPEV1": "Hype v1", "HYPR": "Hypr Network", @@ -7340,6 +7507,7 @@ "I7": "ImpulseVen", "I9C": "i9 Coin", "IAG": "IAGON", + "IAGV1": "IAGON v1", "IAI": "inheritance Art", "IAM": "IAME Identity", "IAOMIN": "Yao Ming", @@ -7463,6 +7631,7 @@ "ILV": "Illuvium", "IMARO": "IMARO", "IMAYC": "IMAYC", + "IMBREX": "Imbrex", "IMBTC": "The Tokenized Bitcoin", "IMC": "i Money Crypto", "IME": "Imperium Empires", @@ -7535,6 +7704,7 @@ "INFTT": "iNFT Token", "INFX": "Influxcoin", "ING": "Infinity Games", + "INIT": "Initia", "INJ": "Injective", "INK": "Ink", "INN": "Innova", @@ -7548,10 +7718,11 @@ "INRXV1": "INRx v1", "INS": "Insolar (Old Chain)", "INSANE": "InsaneCoin", + "INSANECOIN": "InsaneCoin", "INSANITY": "Insanity Coin", "INSC": "INSC (Ordinals)", "INSE": "INSECT", - "INSN": "Insane Coin", + "INSN": "Industry Sonic", "INSP": "Inspect", "INSPI": "InspireAI", "INSR": "Insurabler", @@ -7596,8 +7767,9 @@ "IOETH": "ioETH", "IOEX": "ioeX", "IOI": "IOI Token", - "ION": "Ionomy", + "ION": "Ionic", "IONC": "IONChain", + "IONOMY": "Ionomy", "IONP": "Ion Power Token", "IONX": "Charged Particles", "IONZ": "IONZ", @@ -7629,6 +7801,7 @@ "IPX": "InpulseX", "IQ": "IQ", "IQ50": "IQ50", + "IQ6900": "IQ6900", "IQC": "IQ.cash", "IQG": "IQ Global", "IQN": "IQeon", @@ -7668,6 +7841,7 @@ "IST": "Inter Stable Token", "ISTEP": "iSTEP", "ITA": "Italian National Football Team Fan Token", + "ITALIANROT": "Italian Brainrot", "ITALOCOIN": "Italocoin", "ITAM": "ITAM Games", "ITAMCUBE": "CUBE", @@ -7676,6 +7850,7 @@ "ITF": "Intelligent Trading", "ITG": "iTrust Governance", "ITGR": "Integral", + "ITHACA": "Ithaca Protocol", "ITHEUM": "Itheum", "ITL": "Italian Lira", "ITLR": "MiTellor", @@ -7782,8 +7957,9 @@ "JEN": "JEN COIN", "JENNER": "Caitlyn Jenner", "JENSEN": "Jensen Huang", - "JERRY": "Jerry Inu", + "JERRY": "jerry", "JERRYINU": "JERRYINU", + "JERRYINUCOM": "Jerry Inu", "JES": "Jesus", "JEST": "Jester", "JESUS": "Jesus Coin", @@ -7863,6 +8039,7 @@ "JONESUSDC": "Jones USDC", "JOOPS": "JOOPS", "JOPER": "Joker Pepe", + "JOS": "JuliaOS", "JOSE": "Jose", "JOTCHUA": "Perro Dinero", "JOULE": "Joule", @@ -7898,6 +8075,7 @@ "JUIC": "Juice", "JUICE": "Juice Finance", "JUICEB": "Juice", + "JUICET": "Juice Town", "JUL": "Joule", "JULB": "JustLiquidity Binance", "JULD": "JulSwap", @@ -7954,6 +8132,7 @@ "KAILY": "Kailith", "KAIM": "Kai Meme", "KAINET": "KAINET", + "KAIRO": "Kairo", "KAITO": "KAITO", "KAKA": "KAKA NFT World", "KAKAXA": "KAKAXA", @@ -7972,6 +8151,7 @@ "KAMAL": "Kamala Harris", "KAMALA": "Kamala Harris", "KAMALAHARRIS": "KAMALA HARRIS", + "KAMB": "Kambria", "KAMLA": "KAMALAMA (kamalama.org)", "KAMPAY": "KamPay", "KAN": "Bitkan", @@ -8000,7 +8180,7 @@ "KASPY": "KASPY", "KASSIAHOME": "Kassia Home", "KASTA": "Kasta", - "KAT": "Kambria", + "KAT": "Karat", "KATA": "Katana Inu", "KATANA": "Katana Finance", "KATCHU": "Katchu Coin", @@ -8114,7 +8294,8 @@ "KILLSOLANA": "KillSolana", "KILO": "KiloEx", "KILT": "KILT Protocol", - "KIM": "King Money", + "KIM": "KIM Token", + "KIMA": "Kima", "KIMBO": "Kimbo", "KIMCHI": "KIMCHI.finance", "KIMIAI": "Kimi AI Agent", @@ -8127,11 +8308,13 @@ "KINGB": "King Bean", "KINGBONK": "King Bonk", "KINGCAT": "King Cat", + "KINGCOIN": "KING", "KINGD": "Kingdom of Ants", "KINGDOG": "King Dog Inu", "KINGDOMQUEST": "Kingdom Quest", "KINGF": "King Finance", "KINGGROK": "King Grok", + "KINGMONEY": "King Money", "KINGNEIRO": "King Neiro", "KINGO": "King of memes", "KINGOF": "King Of Memes", @@ -8178,6 +8361,7 @@ "KKT": "Kingdom Karnage", "KLAP": "Klap Finance", "KLAUS": "Klaus", + "KLAYMORE": "Klaymore Stakehouse", "KLC": "KiloCoin", "KLD": "Koduck", "KLEE": "KleeKai", @@ -8240,7 +8424,8 @@ "KOIP": "KoiPond", "KOJI": "Koji", "KOK": "KOK Coin", - "KOKO": "KokoSwap", + "KOKO": "KOALA AI", + "KOKOSWAP": "KokoSwap", "KOL": "Kollect", "KOLANA": "KOLANA", "KOLION": "Kolion", @@ -8260,6 +8445,7 @@ "KORE": "KORE Vault", "KOREC": "Kore", "KORRA": "KORRA", + "KOS": "KONTOS", "KOSS": "Koss", "KOTARO": "KOTARO", "KOTO": "Koto", @@ -8292,7 +8478,7 @@ "KRL": "Kryll", "KRM": "Karma", "KRN": "KRYZA Network", - "KRO": "Betoken", + "KRO": "Kroma", "KROM": "Kromatika", "KROME": "KROME Shares", "KRONE": "Kronecoin", @@ -8407,12 +8593,15 @@ "LAELAPS": "Laelaps", "LAFFIN": "Laffin Kamala", "LAI": "LayerAI", - "LAIKA": "Laika Protocol", + "LAIKA": "LAIKA", + "LAIKAPROTOCOL": "Laika Protocol", "LAINESOL": "Laine Staked SOL", + "LAIR": "Lair", "LAKE": "Data Lake", "LALA": "LaLa World", "LAMB": "Lambda", "LAMBO": "LAMBO", + "LAMPIX": "Lampix", "LAN": "Lanify", "LANA": "LanaCoin", "LANC": "Lanceria", @@ -8445,6 +8634,7 @@ "LATX": "Latium", "LAUGHCOIN": "Laughcoin", "LAUNCH": "Launchblock.com", + "LAUNCHCOIN": "Launch Coin on Believe", "LAVA": "Lava Network", "LAVASWAP": "Lavaswap", "LAVAX": "LavaX Labs", @@ -8576,6 +8766,7 @@ "LGBT": "Let's Go Brandon Token", "LGBTQ": "LGBTQoin", "LGC": "LiveGreen Coin", + "LGCT": "Legacy Token", "LGCY": "LGCY Network", "LGD": "Legends Cryptocurrency", "LGG": "Let's Go Gambling", @@ -8665,6 +8856,7 @@ "LISAS": "Lisa Simpson", "LIST": "KList Protocol", "LISTA": "Lista DAO", + "LISTEN": "Listen", "LISUSD": "lisUSD", "LIT": "Litentry", "LITE": "Lite USD", @@ -8680,6 +8872,7 @@ "LIVESEY": "Dr. Livesey", "LIVESTARS": "Live Stars", "LIXX": "Libra Incentix", + "LIY": "Lily", "LIZ": "Lizus Payment", "LIZA": "Liza", "LIZARD": "LIZARD", @@ -8752,6 +8945,7 @@ "LOG": "Wood Coin", "LOGO": "LOGOS", "LOGOS": "LOGOSAI", + "LOGT": "Lord of Dragons Governance Token", "LOGX": "LogX Network", "LOIS": "Lois Token", "LOKA": "League of Kingdoms", @@ -8798,7 +8992,7 @@ "LOUD": "Loud Market", "LOULOU": "LOULOU", "LOV": "LoveChain", - "LOVE": "Deesse", + "LOVE": "Love Monster", "LOVELY": "Lovely finance", "LOVELYV1": "Lovely Inu Finance", "LOVESNOOPY": "I LOVE SNOOPY", @@ -8915,6 +9109,7 @@ "LUMI": "LUMI Credits", "LUMIA": "Lumia", "LUMIO": "Solana Mascot", + "LUMO": "Lumo-8B-Instruct", "LUMOS": "Lumos", "LUN": "Lunyr", "LUNA": "Terra", @@ -8944,10 +9139,12 @@ "LVIP": "Limitless VIP", "LVL": "Level", "LVLUSD": "Level USD", + "LVLY": "LyvelyToken", "LVM": "LakeViewMeta", "LVN": "LivenPay", "LVVA": "Levva Protocol Token", "LVX": "Level01", + "LWA": "LUMIWAVE", "LWC": "Linework Coin", "LWF": "Local World Forwarders", "LX": "Moonlight", @@ -8968,6 +9165,7 @@ "LYNK": "Lynked.World", "LYNX": "Lynx", "LYO": "LYO Credit", + "LYP": "Lympid Token", "LYQD": "eLYQD", "LYR": "Lyra", "LYRA": "Lyra", @@ -8985,6 +9183,7 @@ "M2O": "M2O Token", "M3M3": "M3M3", "M87": "MESSIER", + "MA": "Mind-AI", "MAAL": "Maal Chain", "MABA": "Make America Based Again", "MAC": "MachineCoin", @@ -8998,9 +9197,11 @@ "MADOG": "MarvelDoge", "MADP": "Mad Penguin", "MADPEPE": "Mad Pepe", + "MAECENAS": "Maecenas", "MAEP": "Maester Protocol", "MAF": "MetaMAFIA", "MAG": "Magnify Cash", + "MAG7SSI": "MAG7.ssi", "MAGA": "MAGA", "MAGA2024": "MAGA2024", "MAGA47": "MAGA 47", @@ -9035,13 +9236,14 @@ "MAGPAC": "MAGA Meme PAC", "MAH": "Mahabibi Bin Solman", "MAHA": "MahaDAO", - "MAI": "Mindsync", + "MAI": "MAI", "MAIA": "Maia", "MAID": "MaidSafe Coin", "MAIL": "CHAINMAIL", "MAINSTON": "Ston", + "MAJ": "Major Frog", "MAJO": "Majo", - "MAJOR": "Major Frog", + "MAJOR": "Major", "MAK": "MetaCene", "MAKE": "MAKE", "MAKEA": "Make America Healthy Again", @@ -9055,6 +9257,7 @@ "MAMBA": "Mamba", "MAN": "Matrix AI Network", "MANA": "Decentraland", + "MANA3": "MANA3", "MANC": "Mancium", "MAND": "Mandala Exchange Token", "MANDALA": "Mandala Exchange Token", @@ -9067,6 +9270,7 @@ "MANIFEST": "Manifest", "MANNA": "Manna", "MANORUKA": "ManoRuka", + "MANSONCOIN": "Manson Coin", "MANT": "Mantle USD", "MANTA": "Manta Network", "MANTI": "Mantis", @@ -9079,6 +9283,7 @@ "MAP": "MAP Protocol", "MAPC": "MapCoin", "MAPE": "Mecha Morphing", + "MAPO": "MAP Protocol", "MAPR": "Maya Preferred 223", "MAPS": "MAPS", "MAR3": "Mar3 AI", @@ -9096,6 +9301,7 @@ "MARLEY": "Marley Token", "MARMAJ": "marmaj", "MARO": "Maro", + "MAROV1": "TTC PROTOCOL", "MARS": "MarsCoin", "MARS4": "MARS4", "MARSC": "MarsCoin", @@ -9104,7 +9310,7 @@ "MARSRISE": "MarsRise", "MARSUPILAMI": "MARSUPILAMI INU", "MARSW": "Marswap", - "MART": "Monart", + "MART": "ArtMeta", "MARTIA": "Colonize Mars", "MARTK": "Martkist", "MARTY": "Marty Inu", @@ -9125,9 +9331,10 @@ "MASTER": "Mastercoin", "MASTERCOIN": "MasterCoin", "MASTERMINT": "MasterMint", + "MASTERMIX": "Master MIX Token", "MASTERTRADER": "MasterTraderCoin", "MASYA": "MASYA", - "MAT": "MiniApps", + "MAT": "My Master Wa", "MATA": "Ninneko", "MATAR": "MATAR AI", "MATCH": "Matching Game", @@ -9137,7 +9344,8 @@ "MATIC": "Polygon", "MATICX": "Stader MaticX", "MATPAD": "MaticPad", - "MATRIX": "Matrix Labs", + "MATRIX": "Matrix One", + "MATRIXLABS": "Matrix Labs", "MATT": "Matt Furie", "MATTER": "AntiMatter", "MAU": "MAU", @@ -9288,6 +9496,7 @@ "MEER": "Qitmeer Network", "MEET": "CoinMeet", "MEETONE": "MEET.ONE", + "MEETPLE": "Meetple", "MEF": "MEFLEX", "MEFA": "Metaverse Face", "MEGA": "MegaFlash", @@ -9296,6 +9505,7 @@ "MEGAHERO": "MEGAHERO", "MEGALAND": "Metagalaxy Land", "MEGALANDV1": "Metagalaxy Land v1", + "MEGATECH": "Megatech", "MEGAX": "Megahex", "MEGE": "MEGE", "MEH": "meh", @@ -9305,7 +9515,9 @@ "MELANIA": "Melania Meme", "MELANIATRUMP": "Melania Trump", "MELB": "Minelab", - "MELD": "MELD", + "MELD": "MetaElfLand Token", + "MELDV1": "MELD v1", + "MELDV2": "MELD", "MELI": "Meli Games", "MELLO": "Mello Token", "MELLOW": "Mellow Man", @@ -9317,6 +9529,7 @@ "MELT": "Defrost Finance", "MEM": "Memecoin", "MEMAGX": "Meta Masters Guild Games", + "MEMBERSHIP": "Membership Placeholders", "MEMD": "MemeDAO", "MEMDEX": "Memdex100", "MEME": "Memecoin", @@ -9325,6 +9538,7 @@ "MEMECUP": "Meme Cup", "MEMEETF": "Meme ETF", "MEMEFI": "MemeFi", + "MEMEFICASH": "MemeFi", "MEMEINU": "Meme Inu", "MEMEM": "Meme Man", "MEMEME": "MEMEME", @@ -9345,6 +9559,7 @@ "MENLO": "Menlo One", "MEO": "Meow Of Meme", "MEOW": "Zero Tech", + "MEOWCAT": "MeowCat", "MEOWETH": "Meow", "MEOWG": "MeowGangs", "MEOWIF": "Meowifhat", @@ -9461,7 +9676,7 @@ "MGOD": "MetaGods", "MGP": "MangoChain", "MGPT": "MotoGP Fan Token", - "MGT": "Megatech", + "MGT": "Moongate", "MGUL": "Mogul Coin", "MGX": "MargiX", "MHAM": "Metahamster", @@ -9481,8 +9696,9 @@ "MICHI": "michi", "MICK": "Mickey Meme", "MICKEY": "Steamboat Willie", - "MICRO": "Micromines", + "MICRO": "Micro GPT", "MICRODOGE": "MicroDoge", + "MICROMINES": "Micromines", "MIDAI": "Midway AI", "MIDAS": "Midas", "MIDASDOLLAR": "Midas Dollar Share", @@ -9504,9 +9720,10 @@ "MILA": "MILADY MEME TOKEN", "MILE": "milestoneBased", "MILEI": "MILEI", - "MILK": "Milkshake Swap", + "MILK": "MilkyWay", "MILK2": "Spaceswap MILK2", "MILKBAG": "MILKBAG", + "MILKSHAKE": "Milkshake Swap", "MILKYWAY": "MilkyWayZone", "MILLI": "Million", "MILLY": "milly", @@ -9529,6 +9746,7 @@ "MINDEX": "Mindexcoin", "MINDGENE": "Mind Gene", "MINDS": "Minds", + "MINDSYNC": "Mindsync", "MINE": "SpaceMine", "MINEA": "Mine AI", "MINER": "MINER", @@ -9538,6 +9756,7 @@ "MINEX": "Minex", "MINGO": "Mingo", "MINI": "mini", + "MINIAPPS": "MiniApps", "MINIBNBTIGER": "MiniBNBTiger", "MINID": "Mini Donald", "MINIDO": "MiniDoge", @@ -9555,6 +9774,7 @@ "MINOCOINCTO": "MINO", "MINS": "Minswap", "MINT": "Mint Club", + "MINTCHAIN": "Mint", "MINTCOIN": "MintCoin", "MINTE": "Minter HUB", "MINTME": "MintMe.com Coin", @@ -9569,9 +9789,11 @@ "MIR": "Mirror Protocol", "MIRA": "Chains of War", "MIRACLE": "MIRACLE", - "MIRAI": "MIRAI", + "MIRAI": "Project MIRAI", + "MIRAIBUILD": "MIRAI", "MIRC": "MIR COIN", "MIRT": "MIR Token", + "MIRX": "Mirada AI", "MIS": "Mithril Share", "MISA": "Sangkara", "MISCOIN": "MIScoin", @@ -9644,7 +9866,7 @@ "MMS": "Marsverse", "MMSC": "MMSC PLATFORM", "MMSS": "MMSS (Ordinals)", - "MMT": "Master MIX Token", + "MMT": "MeMusic", "MMTM": "Momentum", "MMUI": "MetaMUI", "MMULTI": "Multichain (via Multichain Cross-Chain Router)", @@ -9673,6 +9895,7 @@ "MNR": "Mineral", "MNRB": "MoneyRebel", "MNRCH": "Monarch", + "MNRY": "Moonray", "MNS": "Monnos", "MNSRY": "MANSORY", "MNST": "MoonStarter", @@ -9744,8 +9967,9 @@ "MOI": "MyOwnItem", "MOIN": "MoinCoin", "MOJI": "Moji", - "MOJO": "Mojocoin", + "MOJO": "Planet Mojo", "MOJOB": "Mojo on Base", + "MOJOCOIN": "Mojocoin", "MOK": "MocktailSwap", "MOL": "Molecule", "MOLA": "MoonLana", @@ -9762,6 +9986,7 @@ "MONA": "MonaCoin", "MONAIZE": "Monaize", "MONARCH": "TRUEMONARCH", + "MONART": "Monart", "MONAV": "Monavale", "MONB": "MonbaseCoin", "MONDO": "mondo", @@ -9811,6 +10036,7 @@ "MOON": "r/CryptoCurrency Moons", "MOONARCH": "Moonarch", "MOONB": "Moon Base", + "MOONBEANS": "Moonbeans", "MOONBI": "Moonbix", "MOONBIX": "MOONBIX MEME", "MOONC": "MoonCoin", @@ -9824,6 +10050,7 @@ "MOONION": "Moonions", "MOONKIZE": "MoonKize", "MOONLIGHT": "Moonlight Token", + "MOONPIG": "Moonpig", "MOONR": "PulseMoonR", "MOONS": "Sailor Moons", "MOONSHOT": "Moonshot", @@ -9848,7 +10075,7 @@ "MOS": "MOS Coin", "MOSS": "MOSS AI", "MOST": "MOST Global", - "MOT": "Olympus Labs", + "MOT": "Mobius Token", "MOTA": "MotaCoin", "MOTG": "MetaOctagon", "MOTH": "MOTH", @@ -9870,9 +10097,10 @@ "MOWA": "Moniwar", "MOXIE": "Moxie", "MOYA": "MOYA", - "MOZ": "Mozik", + "MOZ": "Lumoz token", "MOZA": "Mozaic", - "MP": "Membership Placeholders", + "MOZIK": "Mozik", + "MP": "MerlinSwap Token", "MP3": "MP3", "MPAA": "MPAA", "MPAD": "MultiPad", @@ -9889,7 +10117,8 @@ "MPM": "Monopoly Meta", "MPRO": "MediumProject", "MPS": "Mt Pelerin Shares", - "MPT": "Meetple", + "MPT": "Miracleplay Token", + "MPTV1": "Miracleplay Token v1", "MPWR": "Empower", "MPX": "Morphex", "MPXT": "Myplacex", @@ -9935,7 +10164,7 @@ "MSHEESHA": "Sheesha Finance Polygon", "MSHIB": "Magic Shiba Starter", "MSHIP": "MetaShipping", - "MSN": "Manson Coin", + "MSN": "Meson.Network", "MSOL": "Marinade Staked SOL", "MSOT": "BTour Chain", "MSP": "Mothership", @@ -9975,6 +10204,7 @@ "MTMS": "MTMS Network", "MTN": "TrackNetToken", "MTO": "Merchant Token", + "MTOS": "MomoAI", "MTP": "Macro Protocol", "MTR": "Meter Stable", "MTRA": "MetaRare", @@ -10233,8 +10463,9 @@ "NEBU": "Nebuchadnezzar", "NEC": "Nectar", "NEER": "Metaverse.Network Pioneer", - "NEET": "NEET Finance", + "NEET": "Not in Employment, Education, or Training", "NEETCOIN": "Neetcoin", + "NEETFINANCE": "NEET Finance", "NEF": "NefariousCoin", "NEFTIPEDIA": "NEFTiPEDiA", "NEFTY": "NeftyBlocks", @@ -10256,6 +10487,7 @@ "NEKOARC": "Neko Arc", "NEKOIN": "Nekoin", "NEKOS": "Nekocoin", + "NEKTAR": "Nektar Token", "NEMO": "NEMO", "NEMS": "The Nemesis", "NEO": "NEO", @@ -10277,9 +10509,10 @@ "NEST": "Nest Protocol", "NESTREE": "Nestree", "NESTV1": "Nest Protocol v1", - "NET": "NetCoin", + "NET": "NET", "NETA": "Negative Tax", "NETC": "NetworkCoin", + "NETCOI": "NetCoin", "NETCOIN": "Netcoincapital", "NETCOINV1": "Netcoincapital v1", "NETK": "Netkoin", @@ -10294,6 +10527,7 @@ "NEURA": "Neurahub", "NEURAL": "NeuralAI", "NEURALINK": "Neuralink", + "NEURO": "NeuroWeb", "NEURON": "Cerebrum DAO", "NEURONI": "Neuroni AI", "NEUROS": "Shockwaves", @@ -10305,7 +10539,6 @@ "NEVANETWORK": "Neva", "NEVE": "NEVER SURRENDER", "NEVER": "neversol", - "NEW": "Newton", "NEWB": "Newbium", "NEWBV1": "Newbium v1", "NEWC": "New Cat", @@ -10324,6 +10557,7 @@ "NEXAI": "NexAI", "NEXBOX": "NexBox", "NEXBT": "Native XBTPro Exchange Token", + "NEXD": "Nexade", "NEXEA": "NEXEA", "NEXG": "NexGami", "NEXM": "Nexum", @@ -10485,7 +10719,7 @@ "NOKU": "NOKU Master token", "NOKUV1": "NOKU Master token v1", "NOLA": "Nola", - "NOM": "Finom NOM Token", + "NOM": "Onomy Protocol", "NOMAI": "nomAI by Virtuals", "NOMNOM": "nomnom", "NOMOX": "NOMOEX Token", @@ -10597,7 +10831,8 @@ "NULS": "Nuls", "NUM": "Numbers Protocol", "NUMBERS": "NumbersCoin", - "NUMI": "Numitor", + "NUMI": "NUMINE Token", + "NUMITOR": "Numitor", "NUR": "Nurcoin", "NUSA": "Nusa", "NUSD": "Nomin USD", @@ -10635,6 +10870,7 @@ "NXM": "Nexus Mutual", "NXMC": "NextMindCoin", "NXN": "Naxion", + "NXPC": "NXPC", "NXQ": "NexQloud", "NXRA": "AllianceBlock Nexera", "NXS": "Nexus", @@ -10680,6 +10916,7 @@ "OBI": "Orbofi AI", "OBICOIN": "OBI Real Estate", "OBITS": "Obits Coin", + "OBOL": "Obol Network", "OBOT": "Obortech", "OBROK": "OBRok", "OBS": "One Basis Cash", @@ -10694,7 +10931,7 @@ "OCADA": "OCADA.AI", "OCAI": "Onchain AI", "OCAVU": "Ocavu Network Token", - "OCB": "BLOCKMAX", + "OCB": "OneCoinBuy", "OCC": "OccamFi", "OCD": "On-Chain Dynamics", "OCE": "OceanEX Token", @@ -10794,6 +11031,7 @@ "OKSE": "Okse", "OKT": "OKT Chain", "OL": "Open Loot", + "OLA": "Ola", "OLAF": "Olaf Token", "OLAND": "Oceanland", "OLAS": "Autonolas", @@ -10810,6 +11048,7 @@ "OLY": "Olyseum", "OLYMP": "OlympCoin", "OLYMPE": "OLYMPÉ", + "OLYMPUSLABS": "Olympus Labs", "OLYN": "Olyn by Virtuals", "OM": "MANTRA", "OMA": "OmegaCoin", @@ -10859,6 +11098,7 @@ "ONIGIRI": "Onigiri The Cat", "ONION": "DeepOnion", "ONIT": "ONBUFF", + "ONIX": "Onix", "ONL": "On.Live", "ONLINE": "Onlinebase", "ONLY": "OnlyCam", @@ -10870,7 +11110,7 @@ "ONT": "Ontology", "ONTACT": "OnTact", "ONUS": "ONUS", - "ONX": "Onix", + "ONX": "OnX.finance", "OOE": "OpenOcean", "OOFP": "OOFP", "OOGI": "OOGI", @@ -10883,6 +11123,7 @@ "OOW": "OPP Open WiFi", "OP": "Optimism", "OPA": "Option Panda Platform", + "OPAI": "Optopia AI", "OPAIG": "OvalPixel", "OPC": "OP Coin", "OPCA": "OP_CAT(BIP-420)", @@ -10943,6 +11184,7 @@ "ORAO": "ORAO Network", "ORARE": "OneRare", "ORB": "KlayCity ORB", + "ORBI": "Orbs", "ORBIS": "Orbis", "ORBIT": "Orbit Protocol", "ORBITCOIN": "Orbitcoin", @@ -10975,6 +11217,7 @@ "ORME": "Ormeus Coin", "ORMO": "Ormolus", "ORN": "Orion Protocol", + "ORNG": "Juice Town", "ORNJ": "Orange", "ORO": "Operon Origins", "OROC": "Orocrypt", @@ -11000,6 +11243,7 @@ "OSIS": "OSIS", "OSK": "OSK", "OSKDAO": "OSK DAO", + "OSKY": "OpenSky Token", "OSL": "OSL AI", "OSMI": "OSMI", "OSMO": "Osmosis", @@ -11027,16 +11271,20 @@ "OUSE": "OUSE Token", "OUSG": "OUSG", "OUT": "Netscouters", + "OUTL": "Outlanders Token", + "OVATO": "Ovato", "OVC": "OVCODE", + "OVER": "OverProtocol", "OVERLORD": "Overlord", "OVN": "Overnight", - "OVO": "Ovato", + "OVO": "OVO", "OVR": "Ovr", "OWC": "Oduwa", "OWD": "Owlstand", "OWL": "OWL Token", - "OWN": "Ownly", + "OWN": "OTHERWORLD", "OWNDATA": "OWNDATA", + "OWNLY": "Ownly", "OWO": "SoMon", "OX": "Open Exchange Token", "OXAI": "OxAI.com", @@ -11077,12 +11325,14 @@ "PACOCA": "Pacoca", "PACP": "PAC Protocol", "PACT": "impactMarket", + "PACTV1": "impactMarket v1", "PAD": "NearPad", "PAF": "Pacific", "PAGE": "Page", - "PAI": "Project Pai", + "PAI": "ParallelAI", "PAID": "PAID Network", "PAIDV1": "PAID Network v1", + "PAIN": "PAIN", "PAINT": "MurAll", "PAIRED": "PairedWorld", "PAJAMAS": "The First Youtube Cat", @@ -11167,8 +11417,9 @@ "PAVO": "Pavocoin", "PAW": "PAWSWAP", "PAWPAW": "PawPaw", - "PAWS": "PawStars", + "PAWS": "PAWS", "PAWSTA": "dogeatingpasta", + "PAWSTARS": "PawStars", "PAWTH": "Pawthereum", "PAXE": "Paxe", "PAXEX": "PAXEX", @@ -11209,7 +11460,7 @@ "PCCM": "Poseidon Chain", "PCD": " Phecda", "PCE": "PEACE COIN", - "PCH": "POPCHAIN", + "PCH": "Pichi", "PCHS": "Peaches.Finance", "PCI": "PayProtocol Paycoin", "PCKB": "pCKB (via Godwoken Bridge from CKB)", @@ -11272,6 +11523,7 @@ "PEG": "PegNet", "PEGA": "PEGA", "PEGAMAGA": "Pepe Maga", + "PEGASCOIN": "Pegascoin", "PEGG": "PokPok Golden Egg", "PEGS": "PegShares", "PEIPEI": "PeiPei", @@ -11301,6 +11553,7 @@ "PENTA": "Penta", "PEON": "Peon", "PEOPLE": "ConstitutionDAO", + "PEOPLEFB": "PEOPLE", "PEOSONE": "pEOS", "PEP": "Pepechain", "PEPA": "Pepa Inu", @@ -11320,7 +11573,8 @@ "PEPEBURN": "Pepeburn", "PEPEC": "Pepe Chain", "PEPECASH": "Pepe Cash", - "PEPECAT": "PEPE CAT", + "PEPECAT": "PEPECAT", + "PEPECATCLUB": "PEPE CAT", "PEPECEO": "REAL PEPE CEO", "PEPECHAIN": "PEPE Chain", "PEPECO": "PEPE COIN BSC", @@ -11386,6 +11640,7 @@ "PERU": "PeruCoin", "PERX": "PeerEx Network", "PESA": "Credible", + "PESETACOIN": "PesetaCoin", "PESHI": "PESHI", "PESOBIT": "PesoBit", "PESTO": "Pesto the Baby King Penguin", @@ -11408,11 +11663,11 @@ "PFID": "Pofid Dao", "PFL": "Professional Fighters League Fan Token", "PFR": "PayFair", - "PFT": "Pitch Finance Token", + "PFT": "PolarFighters", "PFY": "Portify", "PG": "Pepe Grow", "PGALA": "pGALA", - "PGC": "Pegascoin", + "PGC": "PiggyPiggyCoin", "PGEN": "Polygen", "PGF7T": "PGF500", "PGL": "Prospectors", @@ -11471,11 +11726,13 @@ "PICKLE": "Pickle Finance", "PICO": "PicoGo", "PICOLO": "PICOLO", + "PIDOG": "Pi Network Dog", "PIDOGE": "Pi Network Doge", "PIE": "Persistent Information Exchange", "PIERRE": "sacré bleu", "PIF": "Pepe Wif Hat", "PIG": "Pig Finance", + "PIGC": "Pigcoin", "PIGE": "Pige", "PIGEON": "Pigeon In Yellow Boots", "PIGEONC": "Pigeoncoin", @@ -11485,6 +11742,7 @@ "PIGONK": "PIGONK", "PIGS": "Elon Vitalik Pigs", "PIIN": "piin (Ordinals)", + "PIK": "Pika Protocol", "PIKA": "Pikaboss", "PIKACHU": "Pikachu Inu", "PIKACRYPTO": "Pika", @@ -11501,6 +11759,7 @@ "PINETWORKDEFI": "Pi Network DeFi", "PINEYE": "PinEye", "PING": "CryptoPing", + "PINGO": "PinGo", "PINK": "PINK - The Panther", "PINKCOIN": "PinkCoin", "PINKSALE": "PinkSale", @@ -11530,24 +11789,28 @@ "PIST": "Pist Trust", "PIT": "Pitbull", "PITCH": "PITCH", + "PITCHFINANCE": "Pitch Finance Token", + "PITISCOIN": "Pitis Coin", "PIUU": "PIXIU", "PIVN": "PIVN", "PIVX": "Private Instant Verified Transaction", - "PIX": "Lampix", + "PIX": "PixelSwap", "PIXEL": "Pixels", "PIXELV": "PixelVerse", "PIXFI": "Pixelverse", "PIXL": "PIXL", - "PIZA": "Half Pizza", + "PIZA": "PIZA", "PIZPEPE": "Pepe Pizzeria", - "PIZZA": "PizzaSwap", + "PIZZA": "Pizza", "PIZZACOIN": "PizzaCoin", + "PIZZASWAP": "PizzaSwap", "PJM": "Pajama.Finance", "PKB": "ParkByte", "PKC": "Pikciochain", "PKD": "PetKingdom", "PKF": "PolkaFoundry", "PKG": "PKG Token", + "PKIN": "PUMPKIN", "PKN": "Poken", "PKOIN": "Pocketcoin", "PKT": "PKT", @@ -11581,6 +11844,7 @@ "PLEA": "Plearn", "PLEB": "PLEBToken", "PLEBONBASE": "PLEB", + "PLENA": "PLENA", "PLENTY": "Plenty DeFi", "PLEO": "Empleos", "PLERF": "Plerf", @@ -11638,11 +11902,13 @@ "PMR": "Pomerium Utility Token", "PMT": "POWER MARKET", "PMTN": "Peer Mountain", + "PMX": "Primex Finance", "PNB": "Pink BNB", "PNC": "PlatiniumCoin", "PND": "PandaCoin", "PNDC": "Pond Coin", "PNDN": "Pandana", + "PNDO": "Pondo", "PNDR": "Pandora Finance", "PNFT": "Pawn My NFT", "PNG": "Pangolin", @@ -11743,6 +12009,7 @@ "POP": "Popcoin", "POPC": "PopChest", "POPCAT": "Popcat", + "POPCHAIN": "POPCHAIN", "POPCO": "Popcorn", "POPDOG": "PopDog", "POPE": "PopPepe", @@ -11754,6 +12021,7 @@ "POPO": "popo", "POPOETH": "POPO", "POPSICLE": "Popsicle Finance", + "POPU": "Populous", "POPULARCOIN": "PopularCoin", "POR": "Portugal National Team Fan Token", "PORA": "PORA AI", @@ -11787,7 +12055,7 @@ "POUW": "Pouwifhat", "POW": "PowBlocks", "POWELL": "Jerome Powell", - "POWER": "UniPower", + "POWER": "Powerloom Token", "POWR": "Power Ledger", "POWSCHE": "Powsche", "POX": "Monkey Pox", @@ -11809,10 +12077,11 @@ "PPP": "PayPie", "PPR": "Papyrus", "PPS": "PopulStay", - "PPT": "Populous", + "PPT": "Pop Token", "PPY": "Peerplays", "PQT": "Prediqt", "PRA": "ProChain", + "PRAI": "Privasea AI", "PRARE": "Polkarare", "PRB": "Paribu Net", "PRC": "ProsperCoin", @@ -11862,6 +12131,7 @@ "PROFITHUNTERS": "Profit Hunters Coin", "PROGE": "Protector Roge", "PROJECT89": "Project89", + "PROJECTPAI": "Project Pai", "PROLIFIC": "Prolific Game Studio", "PROM": "Prometeus", "PROMPT": "Wayfinder", @@ -11906,7 +12176,8 @@ "PSEUD": "PseudoCash", "PSF": "Prime Shipping Foundation", "PSG": "Paris Saint-Germain Fan Token", - "PSI": "PSIcoin", + "PSI": "Trident", + "PSICOIN": "PSIcoin", "PSILOC": "Psilocybin", "PSK": "Pool of Stake", "PSL": "Pastel", @@ -11927,7 +12198,7 @@ "PT": "Phemex", "PTA": "PentaCoin", "PTAS": "La Peseta", - "PTC": "PesetaCoin", + "PTC": "Particle Trade", "PTD": "Pilot", "PTERIA": "Pteria", "PTF": "PowerTrade Fuel", @@ -11942,6 +12213,7 @@ "PTP": "Platypus Finance", "PTR": "Petro", "PTRUMP": "Pepe Trump", + "PTS": "Petals", "PTT": "Pink Taxi Token", "PTU": "Pintu Token", "PTX": "PlatinX", @@ -11965,7 +12237,8 @@ "PUMA": "Puma", "PUMBAA": "Pumbaa", "PUMLX": "PUMLx", - "PUMP": "PUMP", + "PUMP": "Big Pump", + "PUMPAI": "PumpAI", "PUMPB": "Pump", "PUMPBTC": "pumpBTC", "PUMPFUNBAN": "Pump Fun Ban", @@ -11994,6 +12267,7 @@ "PURA": "Pura", "PURE": "Puriever", "PUREALT": "Pure", + "PURGE": "Forgive Me Father", "PURP": "Purple Platform io", "PURPE": "Purple Pepe", "PURPLEBTC": "Purple Bitcoin", @@ -12093,6 +12367,7 @@ "QIE": "QI Blockchain", "QINGWA": "ShangXin QingWa", "QISWAP": "QiSwap", + "QKA": "Qkacoin", "QKC": "QuarkChain", "QKNTL": "Quick Intel", "QLC": "Kepple [OLD]", @@ -12186,6 +12461,7 @@ "RABB": "Rabbit INU", "RABBI": "Len \"rabbi\" Sassaman", "RABBIT": "Rabbit Finance", + "RABBITC": "RabBitcoin", "RABI": "Rabi", "RAC": "RAcoin", "RACA": "Radio Caca", @@ -12238,7 +12514,7 @@ "RAT": "RatCoin", "RATECOIN": "Ratecoin", "RATING": "DPRating", - "RATIO": "Ratio", + "RATIO": "Ratio Governance Token", "RATS": "Rats", "RATWIF": "RatWifHat", "RAVE": "Ravendex", @@ -12310,12 +12586,16 @@ "REA": "Realisto", "REACH": "/Reach", "REACT": "Reactive Network", + "READY": "READY!", "REAL": "RealLink", "REALESTATE": "RealEstate", + "REALIS": "Realis Worlds", "REALM": "Realm", "REALMS": "Realms of Ethernity", "REALP": "Real Pepe", "REALPLATFORM": "REAL", + "REALPUMPITCOIN": "PUMP", + "REALR": "Real Realm", "REALTRACT": "RealTract", "REALUSD": "Real USD", "REALUSDV1": "Real USD v1", @@ -12373,7 +12653,9 @@ "REI": "REI Network", "REIGN": "Reign of Terror", "REINDEER": "Reindeer", - "REKT": "REKT", + "REK": "Rekt", + "REKT": "Rekt", + "REKTV1": "REKT", "REKTV2": "REKT 2.0", "REKTV3": "REKT v3 (rekt.game)", "REL": "Reliance", @@ -12440,7 +12722,7 @@ "REW": "Review.Network", "REWARD": "Rewardable", "REWARDS": "Solana Rewards", - "REX": "Imbrex", + "REX": "REVOX", "REXBT": "rexbt by VIRTUALS", "REXHAT": "rexwifhat", "REZ": "Renzo", @@ -12476,8 +12758,9 @@ "RIBB": "Ribbit", "RIBBIT": "Ribbit", "RIC": "Riecoin", - "RICE": "RiceFarm", + "RICE": "DAOSquare Governance Token", "RICECOIN": "RiceCoin", + "RICEFARM": "RiceFarm", "RICHIE": "Richie2.0", "RICHIEV1": "Richie", "RICHOFME": "Rich Of Memes", @@ -12533,6 +12816,7 @@ "RIZZMAS": "Rizzmas", "RJV": "Rejuve.AI", "RKC": "Royal Kingdom Coin", + "RKEY": "RKEY", "RKI": "RAKHI", "RKN": "RAKON", "RKR": "REAKTOR", @@ -12584,7 +12868,7 @@ "ROBOTAXI": "ROBOTAXI", "ROC": "Rasputin Online Coin", "ROCCO": "Just A Rock", - "ROCK": "Bedrock", + "ROCK": "Zenrock", "ROCK2": "Ice Rock Mining", "ROCKET": "Team Rocket", "ROCKETCOIN": "RocketCoin", @@ -12705,8 +12989,9 @@ "RUBB": "Rubber Ducky Cult", "RUBCASH": "RUBCASH", "RUBIT": "Rublebit", + "RUBIUS": "Rubius", "RUBX": "eToro Russian Ruble", - "RUBY": "Rubius", + "RUBY": "RubyToken", "RUBYEX": "Ruby.Exchange", "RUC": "Rush", "RUFF": "Ruff", @@ -12718,7 +13003,9 @@ "RUM": "RUM Pirates of The Arrland Token", "RUN": "Run", "RUNE": "Thorchain", + "RUNESX": "RUNES·X·BITCOIN", "RUNEVM": "RUNEVM", + "RUNI": "Runesterminal", "RUNNER": "Runner", "RUNY": "Runy", "RUP": "Rupee", @@ -12749,7 +13036,7 @@ "RVST": "Revest Finance", "RVT": "Rivetz", "RVX": "Rivex", - "RWA": "Xend Finance", + "RWA": "RWA Inc.", "RWAECO": "RWA Ecosystem", "RWAS": "RWA Finance", "RWB": "RawBlock", @@ -12786,6 +13073,7 @@ "SAAD": "Saad Boi", "SAAS": "SaaSGo", "SABAI": "Sabai Protocol", + "SABER": "Saber", "SABLE": "Sable Finance", "SABR": "SABR Coin", "SAC1": "Sable Coin", @@ -12873,6 +13161,7 @@ "SATA": "Signata", "SATAN": "MrBeast's Cat", "SATO": "Atsuko Sato", + "SATOPAY": "SatoPay", "SATORI": "Satori Network", "SATOSHINAKAMOTO": "Satoshi Nakamoto", "SATOX": "Satoxcoin", @@ -12890,6 +13179,7 @@ "SAUNA": "SaunaFinance Token", "SAV": "Save America", "SAV3": "SAV3", + "SAVEOCEAN": "Save The Ocean", "SAVG": "SAVAGE", "SAVM": "SatoshiVM", "SAY": "SAY Coin", @@ -12908,7 +13198,7 @@ "SBIO": "Vector Space Biosciences, Inc.", "SBNB": "Binance Coin (SpookySwap)", "SBOX": "SUIBOXER", - "SBR": "Saber", + "SBR": "STRATEGIC BITCOIN RESERVE", "SBRT": "SaveBritney", "SBSC": "Subscriptio", "SBT": "SOLBIT", @@ -13048,6 +13338,7 @@ "SENATE": "SENATE", "SENC": "Sentinel Chain", "SEND": "Suilend", + "SENDCOIN": "Sendcoin", "SENDOR": "Sendor", "SENK": "Senk", "SENNO": "SENNO", @@ -13107,7 +13398,7 @@ "SFRC": "Safari Crush", "SFRXETH": "Frax Staked Ether", "SFRXUSD": "Staked Frax USD", - "SFT": "SportsFix", + "SFT": "Fightly", "SFTMX": "Stader sFTMX", "SFTY": "Stella Fantasy", "SFU": "Saifu", @@ -13180,6 +13471,7 @@ "SHIB05": "Half Shiba Inu", "SHIB1": "Shib1", "SHIB2": "SHIB2", + "SHIB20": "Shib2.0", "SHIBA": "Shibaqua", "SHIBAAI": "SHIBAAI", "SHIBAC": "SHIBA CLASSIC", @@ -13188,6 +13480,7 @@ "SHIBAI": "AiShiba", "SHIBAKEN": "Shibaken Finance", "SHIBAMOM": "Shiba Mom", + "SHIBANCE": "Shibance Token", "SHIBAR": "Shibarium Name Service", "SHIBARMY": "Shib Army", "SHIBAW": "Shiba $Wing", @@ -13242,6 +13535,7 @@ "SHK": "Shrike", "SHL": "Oyster Shell", "SHLD": "ShieldCoin", + "SHM": "Shardeum", "SHND": "StrongHands", "SHNT": "Sats Hunters", "SHO": "Showcase Token", @@ -13298,9 +13592,10 @@ "SIFU": "SIFU", "SIG": "Signal", "SIGMA": "SIGMA", - "SIGN": "Sign Token", + "SIGN": "Sign", "SIGNA": "Signa", "SIGNAT": "SignatureChain", + "SIGNMETA": "Sign Token", "SIGT": "Signatum", "SIGU": "Singular", "SIKA": "SikaSwap", @@ -13403,6 +13698,7 @@ "SKX": "SKPANAX", "SKY": "Sky", "SKYA": "Sekuya Multiverse", + "SKYAI": "SKYAI", "SKYCOIN": "Skycoin", "SKYFT": "SKYFchain", "SKYM": "SkyMap", @@ -13432,6 +13728,7 @@ "SLING": "Sling Coin", "SLINK": "Soft Link", "SLISBNB": "Lista Staked BNB", + "SLK": "SLK", "SLM": "SlimCoin", "SLN": "Smart Layer Network", "SLND": "Solend", @@ -13458,8 +13755,9 @@ "SMAC": "Social Media Coin", "SMAK": "Smartlink", "SMARS": "SafeMars", - "SMART": "SmartCash", + "SMART": "Smart game", "SMARTB": "Smart Coin", + "SMARTCASH": "SmartCash", "SMARTCREDIT": "SmartCredit Token", "SMARTH": "SmartHub", "SMARTLOX": "SmartLOX", @@ -13470,6 +13768,7 @@ "SMARTSHARE": "Smartshare", "SMARTUP": "Smartup", "SMAT": "Smathium", + "SMB": "SMB Token", "SMBR": "Sombra", "SMBSWAP": "SimbCoin Swap", "SMC": "SmartCoin", @@ -13483,7 +13782,9 @@ "SMI": "SafeMoon Inu", "SMIDGE": "Smidge", "SMIDGEETH": "Smidge", - "SMILE": "Smile Token", + "SMIL": "Smile Token", + "SMILE": "bitSmiley", + "SMILEAI": "Smile AI", "SMILEK": "Smilek to the Bank", "SMILEY": "SMILEY", "SMILY": "Smily Trump", @@ -13522,11 +13823,14 @@ "SNAI": "SwarmNode.ai", "SNAIL": "SnailBrook", "SNAKE": "snake", + "SNAKEAI": "Snake-ai", "SNAKEMOON": "Snakemoon", "SNAKES": "Snakes Game", + "SNAKETOKEN": "Snake Token", "SNAKT": "Sna-King Trump", "SNAP": "SnapEx", "SNAPCAT": "Snapcat", + "SNAPKERO": "SNAP", "SNB": "SynchroBitcoin", "SNC": "SunContract", "SNCT": "SnakeCity", @@ -13546,7 +13850,7 @@ "SNIP": "LyrnAI", "SNIPPEPE": "SNIPING PEPE", "SNITCH": "Randall", - "SNK": "Snake Token", + "SNK": "Snook", "SNL": "Sport and Leisure", "SNM": "SONM", "SNMT": "Satoshi Nakamoto Token", @@ -13566,6 +13870,7 @@ "SNPAD": "SNP adverse", "SNPC": "SnapCoin", "SNPS": "Snaps", + "SNPT": "SNPIT TOKEN", "SNRG": "Synergy", "SNRK": "Snark Launch", "SNS": "Synesis One", @@ -13694,7 +13999,9 @@ "SONICWIF": "SonicWifHat", "SONNE": "Sonne Finance", "SONOF": "Son of Solana", - "SOON": "Soonaverse", + "SONOR": "SonorusToken", + "SOON": "SOON", + "SOONAVERSE": "Soonaverse", "SOONCOIN": "SoonCoin", "SOOTCASE": "I like my sootcase", "SOP": "SoPay", @@ -13707,14 +14014,13 @@ "SORAETH": "SORA", "SORAI": "Sora AI", "SORAPORN": "Sora Porn", - "SOSNOVKINO": "Sosnovkino", "SOSO": "SoSoValue", - "SOSWAP": "Solana Swap", "SOT": "Soccer Crypto", "SOTA": "SOTA Finance", "SOUL": "Phantasma", "SOULO": "SouloCoin", - "SOULS": "Soulsaver", + "SOULS": "Unfettered Ecosystem", + "SOULSA": "Soulsaver", "SOUND": "Sound Coin", "SOURCE": "ReSource Protocol", "SOUTH": "DeepSouth AI", @@ -13729,9 +14035,11 @@ "SP8DE": "Sp8de", "SPA": "Sperax", "SPAC": "SPACE DOGE", - "SPACE": "Spacelens", + "SPACE": "MicroVisionChain", "SPACECOIN": "SpaceCoin", "SPACED": "SPACE DRAGON", + "SPACEHAMSTER": "Space Hamster", + "SPACELENS": "Spacelens", "SPACEM": "Spacem Token", "SPACEPI": "SpacePi", "SPAD": "SolPad", @@ -13785,7 +14093,8 @@ "SPHYNXV3": "Sphynx Token v3", "SPHYNXV4": "Sphynx Token v4", "SPI": "Shopping.io", - "SPICE": "Spice", + "SPICE": "SPICE", + "SPICETOKEN": "Spice", "SPIDER": "Spider Man", "SPIDERMAN": "SPIDERMAN BITCOIN", "SPIDEY": "Spidey", @@ -13816,7 +14125,10 @@ "SPORE": "Spore", "SPORT": "SportsCoin", "SPORTS": "ZenSports", + "SPORTSFIX": "SportsFix", "SPORTSP": "SportsPie", + "SPOT": "Defispot", + "SPOTCOIN": "Spotcoin", "SPOTS": "Spots", "SPOX": "Sports Future Exchange Token", "SPRING": "Spring", @@ -13839,6 +14151,7 @@ "SPXC": "SpaceXCoin", "SPY": "Smarty Pay", "SPYRO": "SPYRO", + "SQ3": "Squad3", "SQAT": "Syndiqate", "SQD": "SQD", "SQG": "Squid Token", @@ -13869,6 +14182,7 @@ "SRCX": "Source Token", "SREUR": "SocialRemit", "SRG": "Street Runner NFT", + "SRGD": "Studio Releasing Gold", "SRK": "SparkPoint", "SRLTY": "SaitaRealty", "SRLY": "Rally (Solana)", @@ -13880,6 +14194,7 @@ "SRWD": "ShibRWD", "SRX": "StorX", "SS": "Sharder", + "SS20": "Shell Trade", "SSB": "SatoshiStreetBets", "SSC": "SelfSell", "SSD": "Sonic Screw Driver Coin", @@ -13915,6 +14230,7 @@ "STACK": "StackOS", "STACKS": " STACKS PAY", "STACS": "STACS Token", + "STAGE": "Stage", "STAK": "Jigstack", "STAKE": "xDai Chain", "STAKEDETH": "StakeHound Staked Ether", @@ -13923,7 +14239,7 @@ "STAN": "Stank Memes", "STANDARD": "Stakeborg DAO", "STAPT": "Ditto Staked Aptos", - "STAR": "FileStar", + "STAR": "StarHeroes", "STAR10": "Ronaldinho Coin", "STARAMBA": "Staramba", "STARBASE": "Starbase", @@ -13946,7 +14262,8 @@ "STARTER": "Starter.xyz", "STARWARS": "Star Wars", "STARX": "STARX TOKEN", - "STASH": "BitStash", + "STASH": "STASH INU", + "STASHV1": "BitStash", "STAT": "STAT", "STATE": "New World Order", "STATER": "Stater", @@ -13995,6 +14312,7 @@ "STHYPE": "Staked HYPE", "STI": "Seek Tiger", "STIC": "StickMan", + "STICKMAN": "stickman", "STIK": "Staika", "STIMA": "STIMA", "STING": "Sting", @@ -14016,10 +14334,11 @@ "STMAN": "Stickman Battleground", "STMATIC": "Lido Staked Matic", "STMX": "StormX", + "STMXV1": "StormX v1", "STND": "Standard Protocol", "STNEAR": "Staked NEAR", "STNK": "Stonks", - "STO": "Save The Ocean", + "STO": "StakeStone", "STOC": "STO Cash", "STOCK": "Digital Asset Stockpile", "STOG": "Stooges", @@ -14030,7 +14349,7 @@ "STONEDE": "Stone DeFi", "STONK": "STONK", "STONKS": "HarryPotterObamaWallStreetBets10Inu", - "STOP": "SatoPay", + "STOP": "LETSTOP", "STOR": "Self Storage Coin", "STORE": "Bit Store", "STOREP": "Storepay", @@ -14052,7 +14371,8 @@ "STRAY": "Stray Dog", "STRD": "Stride", "STRDY": "Sturdy", - "STREAM": "STREAMIT COIN", + "STREAM": "Streamflow", + "STREAMIT": "STREAMIT COIN", "STREETH": "STREETH", "STRI": "Strite", "STRIKE": "Strike", @@ -14105,9 +14425,11 @@ "SUCR": "Sucre", "SUD": "Sudo Labs", "SUDO": "sudoswap", + "SUEDE": "Johnny Suede", "SUGAR": "Sugar Exchange", "SUI": "Sui", "SUIA": "SUIA", + "SUIAGENT": "aiSUI", "SUIAI": "SUI Agents", "SUIB": "Suiba Inu", "SUIDEPIN": "Sui DePIN", @@ -14117,6 +14439,7 @@ "SUIMON": "Sui Monster", "SUIP": "SuiPad", "SUIRWA": "Sui RWA", + "SUIRWAPIN": "SUIRWAPIN", "SUISHIB": "SuiShiba", "SUITE": "Suite", "SUKI": "SUKI", @@ -14234,6 +14557,7 @@ "SWISE": "StakeWise", "SWITCH": "Switch", "SWM": "Swarm Fund", + "SWO": "SwordMagicToken", "SWOLE": "Swole Doge", "SWOP": "Swop", "SWORD": "eZKalibur", @@ -14257,6 +14581,7 @@ "SXM": "saxumdao", "SXP": "SXP", "SXS": "Sphere", + "SXT": "Space and Time", "SXUT": "SPECTRE Utility Token", "SYA": "SaveYourAssets", "SYBC": "SYB Coin", @@ -14327,12 +14652,13 @@ "TANG": "Tangent", "TANGO": "keyTango", "TANGYUAN": "TangYuan", - "TANK": "CryptoTanks", + "TANK": "AgentTank", "TANPIN": "Tanpin", "TANUKI": "Tanuki", "TANUPAD": "Tanuki Launchpad", "TAO": "Bittensor", "TAOBOT": "tao.bot", + "TAOCAT": "TAOCat by Virtuals", "TAONU": "TAO INU", "TAOP": "TaoPad", "TAOTOOLS": "TAOTools", @@ -14445,6 +14771,7 @@ "TELO": "Telo Meme Coin", "TELOS": "Teloscoin", "TEM": "Temtum", + "TEMA": "Tema", "TEMCO": "TEMCO", "TEMM": "TEM MARKET", "TEMP": "Tempus", @@ -14474,6 +14801,7 @@ "TERR": "Terrier", "TERRA": "Terraport", "TERRAB": "TERRABYTE AI", + "TERRACOIN": "TerraCoin", "TERRY": "Terry The Disgruntled Turtle", "TERZ": "SHELTERZ", "TES": "TeslaCoin", @@ -14485,6 +14813,7 @@ "TETH": "Treehouse ETH", "TETHYS": "Tethys", "TETRA": "Tetra", + "TETSUO": "Tetsuo Coin", "TETU": "TETU", "TEVA": "Tevaera", "TEW": "Trump in a memes world", @@ -14543,6 +14872,7 @@ "THG": "Thetan Arena", "THIK": "ThikDik", "THING": "Nothing", + "THINGSOP": "ThingsOperatingSystem", "THINKWAREAI": "ThinkwareAI", "THISISF": "This is Fine", "THL": "Thala", @@ -14601,7 +14931,7 @@ "TINU": "Telegram Inu", "TINY": "TinyBits", "TIOX": "TIOx", - "TIP": "Tip Blockchain", + "TIP": "Tip", "TIPC": "Tipcoin", "TIPINU": "Tip Inu", "TIPS": "FedoraCoin", @@ -14674,13 +15004,14 @@ "TOC": "TouchCon", "TODAY": "TodayCoin", "TODD": "TURBO TODD", - "TOK": "Tokenplace", + "TOK": "Tokai", "TOKA": "Tonka Finance", "TOKAMAK": "Tokamak Network", "TOKAU": "Tokyo AU", "TOKC": "Tokyo Coin", "TOKE": "Tokemak", "TOKEN": "TokenFi", + "TOKENPLACE": "Tokenplace", "TOKENSTARS": "TokenStars", "TOKERO": "TOKERO LevelUP Token", "TOKKI": "CRYPTOKKI", @@ -14691,6 +15022,7 @@ "TOLO": "Tolo Yacoloco", "TOLYCAT": "Toly's Cat", "TOM": "TOM Finance", + "TOMA": "TomaInfo", "TOMAHAWKCOIN": "Tomahawkcoin", "TOMAN": "IRR", "TOMB": "Tomb", @@ -14738,7 +15070,7 @@ "TORO": "Toro Inoue", "TOROSOL": "Toro", "TORSY": "TORSY", - "TOS": "ThingsOperatingSystem", + "TOS": "Cryptos", "TOSA": "TosaInu BSC", "TOSC": "T.OS", "TOSDIS": "TosDis", @@ -14801,7 +15133,7 @@ "TRB": "Tellor", "TRBT": "Tribute", "TRBV1": "Tellor Tributes v1", - "TRC": "TerraCoin", + "TRC": "Terrace", "TRCB": "TRCB Chain", "TRCL": "Treecle", "TRCT": "Tracto", @@ -14810,7 +15142,8 @@ "TRDS": "Traders Token", "TRDT": "Trident", "TRDX": "Trendix", - "TREAT": "Treat", + "TREA": "Treat", + "TREAT": "Shiba Inu Treat", "TREB": "Treble", "TRECENTO": "Trecento Blockchain Capital", "TREE": "Tree", @@ -14845,7 +15178,8 @@ "TRNGUY": "Tron Guy Project", "TROG": "Trog", "TROGE": "Troge", - "TROLL": "Trollcoin", + "TROLL": "TROLL", + "TROLLC": "Trollcoin", "TROLLHEIM": "Trollheim", "TROLLICTO": "TROLLI CTO", "TROLLMODE": "TROLL MODE", @@ -14891,7 +15225,8 @@ "TRUMPCAT": "TRUMPCAT", "TRUMPCATF": "Trump Cat Family", "TRUMPCATS": "Trump Golden Cat", - "TRUMPCOIN": "TrumpCoin", + "TRUMPCOIN": "MAGA: Fight for Trump", + "TRUMPCOINROCKS": "TrumpCoin", "TRUMPDAO": "TRUMP DAO", "TRUMPDO": "TRUMP", "TRUMPDOGE": "Trump Doge", @@ -14955,6 +15290,7 @@ "TSLT": "Tamkin", "TSN": "Tsunami Exchange Token", "TSO": "Thesirion", + "TSOTCHKE": "tsotchke", "TSR": "Tesra", "TST": "Test", "TSTAI": "Test AI", @@ -14965,7 +15301,7 @@ "TSUKA": "Dejitaru Tsuka", "TSX": "TradeStars", "TT": "ThunderCore", - "TTC": "TTC PROTOCOL", + "TTC": "TonTycoon", "TTF": "TurboTrix Finance", "TTK": "The Three Kingdoms", "TTM": "Tradetomato", @@ -14984,6 +15320,7 @@ "TULIP": "Tulip Protocol", "TUNA": "TUNACOIN", "TUNE": "Bitune", + "TUNETRADEX": "TuneTrade", "TUP": "Tenup", "TUPE": "Turtle Pepe", "TUR": "Turron", @@ -15034,7 +15371,7 @@ "TXC": "TEXITcoin", "TXG": "TRUSTxGAMING", "TXL": "Autobahn Network", - "TXT": "TuneTrade", + "TXT": "Taxa Token", "TYBENG": "TYBENG", "TYBG": "Base God", "TYBGSc": "Base Goddess", @@ -15044,6 +15381,7 @@ "TYLER": "Tyler", "TYOGHOUL": "TYO GHOUL", "TYPE": "TypeAI", + "TYPEL": "TypeIt", "TYPERIUM": "Typerium", "TYPUS": "Typus", "TYRANT": "Fable Of The Dragon", @@ -15054,6 +15392,7 @@ "TZKI": "Tsuzuki Inu", "TZU": "Sun Tzu", "U": "Unidef", + "U2U": "U2U Network", "U8D": "Universal Dollar", "UAEC": "United Arab Emirates Coin", "UAHG": "UAHg", @@ -15152,6 +15491,7 @@ "UMT": "UnityMeta", "UMX": "UniMex Network", "UMY": "KaraStar UMY", + "UNA": "Unagi Token", "UNAT": "Unattanium", "UNB": "Unbound Finance", "UNBNK": "Unbanked", @@ -15159,6 +15499,7 @@ "UNC": "UnCoin", "UNCL": "UNCL", "UNCN": "Unseen", + "UNCOMMONGOODS": "UNCOMMON•GOODS", "UNCX": "UniCrypt", "UND": "United Network Distribution", "UNDB": "unibot.cash", @@ -15185,8 +15526,11 @@ "UNIL": "UniLayer", "UNIM": "Unicorn Milk", "UNIO": "Unio Coin", + "UNIPOWER": "UniPower", + "UNIPT": "Universal Protocol Token", "UNIQ": "Uniqredit", "UNIQUE": "Unique One", + "UNIR": "UniRouter", "UNISD": "unified Stable Dollar", "UNISDV1": "uniswap State Dollar", "UNISTAKE": "Unistake", @@ -15232,7 +15576,7 @@ "UPR": "Upfire", "UPRO": "ULTRAPRO", "UPS": "UPFI Network", - "UPT": "Universal Protocol Token", + "UPT": "UPROCK", "UPTOS": "UPTOS", "UPUNK": "Unicly CryptoPunks Collection", "UPUSD": "Universal US Dollar", @@ -15242,7 +15586,9 @@ "URAC": "Uranus", "URALS": "Urals Coin", "URFA": "Urfaspor Token", - "URO": "UroCoin", + "URMOM": "urmom", + "URO": "Urolithin A", + "UROCOIN": "UroCoin", "URQA": "UREEQA", "URS": "URUS", "URUS": "Urus Token", @@ -15255,7 +15601,7 @@ "USCC": "USC", "USCOIN": "USCoin", "USD0": "Usual", - "USD1": "USD1", + "USD1": "World Liberty Financial USD", "USD3": "Web 3 Dollar", "USDA": "USDa", "USDACC": "USDA", @@ -15292,6 +15638,7 @@ "USDMA": "USD mars", "USDN": "Neutral AI", "USDO": "USD Open Dollar", + "USDONE": "Currency One USD", "USDP": "Pax Dollar", "USDPLUS": "Overnight.fi USD+", "USDQ": "Quantoz USDQ", @@ -15396,6 +15743,7 @@ "VANCE": "JD Vance", "VANCEMEME": "Vance Meme", "VANF": "Van Fwogh", + "VANKEDISI": "vankedisi", "VANRY": "Vanar Chain", "VANT": "Vanta Network", "VANY": "Vanywhere", @@ -15427,6 +15775,7 @@ "VCF": "Valencia CF Fan Token", "VCG": "VCGamers", "VCHF": "VNX Swiss Franc", + "VCI": "VinciToken", "VCK": "28VCK", "VCNT": "ViciCoin", "VCORE": "VCORE", @@ -15457,6 +15806,7 @@ "VEIL": "VEIL", "VEKTOR": "VEKTOR", "VELA": "Vela Token", + "VELAAI": "velaai", "VELAR": "Velar", "VELO": "Velo", "VELOD": "Velodrome Finance", @@ -15482,6 +15832,7 @@ "VERSA": "Versa Token", "VERSACE": "VERSACE", "VERSE": "Verse", + "VERT": "VERT", "VERTAI": "Vertical AI", "VERTEX": "Vertex", "VERUM": "Verum Coin", @@ -15549,6 +15900,7 @@ "VIS": "Vigorus", "VISIO": "Visio", "VISION": "VisionGame", + "VISIONCITY": "Vision City", "VISR": "Visor", "VIST": "VISTA", "VISTA": "Ethervista", @@ -15567,12 +15919,13 @@ "VITY": "Vitteey", "VIU": "Viuly", "VIVEK": "Head of D.O.G.E", + "VIVI": "LH VIVI", "VIVID": "Vivid Coin", "VIVO": "VIVO Coin", "VIX": "VIXCO", "VIX7": "VIX777", "VIXV1": "VIXCO v1", - "VIZ": "Vision City", + "VIZ": "VIZ Token", "VIZION": "ViZion Protocol", "VIZSLASWAP": "VizslaSwap", "VKNF": "VKENAF", @@ -15627,6 +15980,7 @@ "VOLTX": "VolatilityX", "VOLTZ": "Voltz", "VOLX": "VolumeX", + "VON": "Vameon", "VONE": "Vone", "VONSPEED": "Andrea Von Speed", "VOOT": "VootCoin", @@ -15647,6 +16001,7 @@ "VPS": "VPS AI", "VPT": "Veritas Protocol", "VR": "Victoria", + "VR1": "VR1", "VRA": "Verasity", "VRC": "Virtual Coin", "VRGW": "Virtual Reality Game World", @@ -15727,6 +16082,7 @@ "W12": "W12 Protocol", "W2E": "Walk To Earn", "W3C": "W3Coin", + "W3GG": "W3GG Token", "W3M": "Web3Met", "W3S": "Web3Shot", "W3W": "Web3 Whales", @@ -15788,10 +16144,12 @@ "WASSIE": "WASSIE", "WASTED": "WastedLands", "WASTR": "Wrapped Astar", - "WAT": "Wat", + "WAT": "WATCoin", + "WAT0X63": "Wat", "WATC": "WATCoin", "WATCH": "Yieldwatch", - "WATER": "doginwotah", + "WATER": "WATER", + "WATT": "WATTTON", "WAVAX": "Wrapped AVAX", "WAVES": "Waves", "WAVESCOMM": "Waves Community Token", @@ -15858,6 +16216,7 @@ "WEALTH": "WealthCoin", "WEAPON": "MEGAWEAPON", "WEAR": "MetaWear", + "WEAVE6": "Weave6", "WEB": "Webcoin", "WEB3": "WEB3 Inu", "WEB4": "WEB4 AI", @@ -15885,6 +16244,7 @@ "WELA": "Wrapped Elastos", "WELD": "Weld", "WELL": "Moonwell", + "WELL3": "WELL3", "WELLTOKEN": "Well", "WELLV1": "Moonwell v1", "WELON": "WrappedElon", @@ -15941,6 +16301,7 @@ "WHALE": "WHALE", "WHALES": "Whales Market", "WHAT": "What the Duck", + "WHATSONPIC": "WhatsOnPic", "WHBAR": "Wrapped HBAR", "WHC": "Whales Club", "WHEAT": "Wheat Token", @@ -15964,6 +16325,8 @@ "WHX": "WHITEX", "WHY": "WHY", "WHYCAT": "WhyCat", + "WHYPAD": "Unamano", + "WHYPADV1": "Unamano v1", "WIB": "Wibson", "WIBE": "Wibegram", "WIC": "Wi Coin", @@ -16005,6 +16368,7 @@ "WINTER": "Winter", "WINU": "Walter Inu", "WINX": "WinX.io", + "WIOTA": "wIOTA", "WIOTX": "Wrapped IoTeX", "WIRE": "717ai by Virtuals", "WIRTUAL": "Wirtual", @@ -16020,6 +16384,7 @@ "WIWI": "Wiggly Willy", "WIX": "Wixlar", "WIZA": "Wizardia", + "WIZZ": "Wizzwoods Token", "WJD": "WJD", "WJEWEL": "WJEWEL", "WJXN": "Jax.Network", @@ -16062,6 +16427,7 @@ "WNCG": "Wrapped NCG", "WND": "WonderHero", "WNDR": "Wonderman Nation", + "WNE": "Winee3", "WNEAR": "Wrapped Near", "WNEON": "Wrapped Neon EVM", "WNET": "Wavesnode.net", @@ -16075,7 +16441,7 @@ "WNYC": "Wrapped NewYorkCoin", "WNZ": "Winerz", "WOA": "Wrapped Origin Axie", - "WOD": "World of Defish", + "WOD": "World of Dypians", "WOETH": "Wrapped Origin Ether", "WOFM": "World of Masters", "WOID": "WORLD ID", @@ -16105,7 +16471,7 @@ "WONE": "Wrapped Harmony", "WOO": "WOO Network", "WOOD": "Mindfolk Wood", - "WOOF": "Shibance Token", + "WOOF": "WoofWork.io", "WOOFY": "Woofy", "WOOL": "Wolf Game Wool", "WOONK": "Woonkly", @@ -16116,10 +16482,12 @@ "WOP": "WorldPay", "WOR": "Hollywood Capital Group WARRIOR", "WORK": "Work X", + "WORKCHAIN": "WorkChain.io", "WORKE": "Worken", "WORKIE": "Workie", "WORL": "World Record Banana", "WORLD": "World Token", + "WORLDOFD": "World of Defish", "WORM": "HealthyWorm", "WORX": "Worx", "WOS": "Wolf Of Solana", @@ -16339,7 +16707,8 @@ "XELS": "XELS Coin", "XEM": "NEM", "XEN": "XEN Crypto", - "XEND": "Xend Finance", + "XENDV1": "Xend Finance", + "XENDV2": "Xend Finance", "XENIX": "XenixCoin", "XENO": "Xeno", "XENOVERSE": "Xenoverse", @@ -16365,6 +16734,7 @@ "XGD": "X Gold", "XGEM": "Exchange Genesis Ethlas Medium", "XGLI": "Glitter Finance", + "XGN": "0xGen", "XGOLD": "XGOLD COIN", "XGOX": "Go!", "XGP": "XGP", @@ -16489,6 +16859,7 @@ "XQN": "Quotient", "XQR": "Qredit", "XQUOK": "XQUOK", + "XR": "Xraders", "XRA": "Xriba", "XRAI": "X-Ratio A", "XRAY": "Ray Network", @@ -16496,6 +16867,7 @@ "XRD": "Radix", "XRDOGE": "XRdoge", "XRE": "RevolverCoin", + "XREA": "XREATORS", "XRGB": "XRGB", "XRISE": "Xrise", "XRL": "Rialto.AI", @@ -16517,7 +16889,7 @@ "XSAUCE": "xSAUCE", "XSC": "Hyperspace", "XSD": "SounDAC", - "XSEED": "BitSeeds", + "XSEED": "XSEED", "XSGD": "XSGD", "XSH": "SHIELD", "XSHIB": "XSHIB", @@ -16556,6 +16928,7 @@ "XTRM": "XTRM COIN", "XTRUMP": "X TRUMP", "XTT": "XSwap Treasure", + "XTTA": "XTTA", "XTTB20": "XTblock", "XTUSD": "XT Stablecoin XTUSD", "XTV": "XTV", @@ -16585,6 +16958,7 @@ "XY": "XY Finance", "XYM": "Symbol", "XYO": "XY Oracle", + "XYRO": "XYRO", "XYZ": "Universe.XYZ", "XZK": "Mystiko Network", "Y24": "Yield 24", @@ -16605,6 +16979,7 @@ "YAMV2": "YAM v2", "YAOYAO": "Yaoyao's Cat", "YAP": "Yap Stone", + "YAPSTER": "YAPSTER", "YARL": "Yarloo", "YAW": "Yawww", "YAWN": "YAWN", @@ -16705,6 +17080,7 @@ "YOUSIM": "YouSim", "YOVI": "YobitVirtualCoin", "YOYOW": "Yoyow", + "YOZI": "YoZi Protocol", "YPC": "YoungParrot", "YPIE": "PieDAO Yearn Ecosystem Pie", "YPRISMA": "Yearn yPRISMA", @@ -16745,13 +17121,15 @@ "YYE": "YYE Energy", "YYFI": "YYFI.Protocol", "YYOLO": "yYOLO", - "YZY": "Yeezy", + "YZY": "Swasticoin", "Z3": "Z-Cubed", + "ZAAR": "THE•ORDZAAR•RUNES", "ZABAKU": "Zabaku Inu", "ZACK": "Zack Morris", "ZAFI": "ZakumiFi", - "ZAI": "Zero Collateral Dai", + "ZAI": "Zen AI", "ZAIF": "Zaif Token", + "ZAIFIN": "Zero Collateral Dai", "ZAM": "Zamio", "ZAMZAM": "ZAMZAM", "ZANO": "Zano", @@ -16794,26 +17172,28 @@ "ZEBU": "ZEBU", "ZEC": "ZCash", "ZECD": "ZCashDarkCoin", - "ZED": "ZED Token", - "ZEDCOIN": "ZedCoin", + "ZED": "ZedCoins", "ZEDD": "ZedDex", "ZEDTOKEN": "Zed Token", "ZEDX": "ZEDX Сoin", "ZEDXION": "Zedxion", "ZEDXIONV1": "Zedxion v1", "ZEE": "ZeroSwap", + "ZEEP": "ZEEPR", "ZEFI": "ZCore Finance", "ZEFU": "Zenfuse", "ZEIT": "ZeitCoin", "ZEL": "Zelcash", "ZELIX": "ZELIX", "ZEN": "Horizen", + "ZENAD": "Zenad", "ZENC": "Zenc Coin", "ZEND": "zkLend", "ZENF": "Zenland", "ZENI": "Zennies", "ZENIQ": "Zeniq Coin", "ZENITH": "Zenith Chain", + "ZENPROTOCOL": "Zen Protocol", "ZENQ": "Zenqira", "ZENT": "Zentry", "ZEON": "Zeon Network", @@ -16864,7 +17244,8 @@ "ZIPT": "Zippie", "ZIRVE": "Zirve Coin", "ZIV4": "Ziv4 Labs", - "ZIX": "ZIX Token", + "ZIX": "Coinzix Token", + "ZIXTOKEN": "ZIX Token", "ZIZLE": "Zizle", "ZIZY": "ZIZY", "ZJLT": "ZJLT Distributed Factoring Network", @@ -16912,7 +17293,7 @@ "ZMBE": "RugZombie", "ZMN": "ZMINE", "ZMT": "Zipmex Token", - "ZND": "Zenad", + "ZND": "ZND Token", "ZNE": "ZoneCoin", "ZNN": "Zenon", "ZNT": "Zenith Finance", @@ -16935,12 +17316,13 @@ "ZOOMER": "Zoomer Coin", "ZOON": "CryptoZoon", "ZOOT": "Zoo Token", - "ZORA": "Zoracles", + "ZORA": "Zora", + "ZORACLES": "Zoracles", "ZORKSEES": "Zorksees", "ZORO": "Zoro Inu", "ZORRO": "Zorro", "ZORT": "Zort", - "ZP": "Zen Protocol", + "ZP": "Zombie Power", "ZPAE": "ZelaaPayAE", "ZPAY": "ZoidPay", "ZPC": "Zen Panda Coin", @@ -16949,7 +17331,8 @@ "ZPRO": "ZAT Project", "ZPT": "Zeepin", "ZPTC": "Zeptacoin", - "ZRC": "ZrCoin", + "ZRC": "Zircuit", + "ZRCOIN": "ZrCoin", "ZRO": "LayerZero", "ZRPY": "Zerpaay", "ZRS": "Zaros", @@ -16966,6 +17349,7 @@ "ZUC": "Zeux", "ZUCKPEPE": "ZuckPepe", "ZUKI": "Zuki Moba", + "ZULU": "Zulu Network", "ZUM": "ZumCoin", "ZUN": "Zunami Governance Token", "ZUNA": "ZUNA", @@ -16994,7 +17378,9 @@ "ZYTARA": "Zytara dollar", "ZZ": "ZigZag", "ZZC": "ZudgeZury", - "ZZZ": "zzz.finance", + "ZZZ": "ZZZ", + "ZZZV1": "zzz.finance", + "anyeth1": "anyeth1", "eFIC": "FIC Network", "ePRX": "eProxy", "gOHM": "Governance OHM", diff --git a/apps/api/src/assets/sitemap.xml b/apps/api/src/assets/sitemap.xml index 73dc8a7fc..776ee3c6b 100644 --- a/apps/api/src/assets/sitemap.xml +++ b/apps/api/src/assets/sitemap.xml @@ -89,7 +89,7 @@ ${currentDate}T00:00:00+00:00 - https://ghostfol.io/de/ueber-uns/oss-freunde + https://ghostfol.io/de/ueber-uns/oss-friends ${currentDate}T00:00:00+00:00 @@ -317,7 +317,7 @@ ${currentDate}T00:00:00+00:00 - https://ghostfol.io/fr/a-propos/changelog + https://ghostfol.io/fr/a-propos/journal-des-modifications ${currentDate}T00:00:00+00:00 @@ -395,7 +395,7 @@ ${currentDate}T00:00:00+00:00 - https://ghostfol.io/it/informazioni-su/oss-amici + https://ghostfol.io/it/informazioni-su/oss-friends ${currentDate}T00:00:00+00:00 @@ -454,10 +454,6 @@ https://ghostfol.io/nl/over ${currentDate}T00:00:00+00:00 - - https://ghostfol.io/nl/over/changelog - ${currentDate}T00:00:00+00:00 - https://ghostfol.io/nl/over/licentie ${currentDate}T00:00:00+00:00 @@ -470,6 +466,10 @@ https://ghostfol.io/nl/over/privacybeleid ${currentDate}T00:00:00+00:00 + + https://ghostfol.io/nl/over/wijzigingslogboek + ${currentDate}T00:00:00+00:00 + https://ghostfol.io/nl/prijzen ${currentDate}T00:00:00+00:00 diff --git a/apps/api/src/models/rule.ts b/apps/api/src/models/rule.ts index 187527fbb..0870be03e 100644 --- a/apps/api/src/models/rule.ts +++ b/apps/api/src/models/rule.ts @@ -1,5 +1,6 @@ import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; +import { DEFAULT_LANGUAGE_CODE } from '@ghostfolio/common/config'; import { groupBy } from '@ghostfolio/common/helper'; import { PortfolioPosition, @@ -14,28 +15,28 @@ import { RuleInterface } from './interfaces/rule.interface'; export abstract class Rule implements RuleInterface { private key: string; - private name: string; + private languageCode: string; public constructor( protected exchangeRateDataService: ExchangeRateDataService, { key, - name + languageCode = DEFAULT_LANGUAGE_CODE }: { key: string; - name: string; + languageCode?: string; // TODO: Make mandatory } ) { this.key = key; - this.name = name; + this.languageCode = languageCode; } public getKey() { return this.key; } - public getName() { - return this.name; + public getLanguageCode() { + return this.languageCode; } public groupCurrentHoldingsByAttribute( @@ -73,5 +74,7 @@ export abstract class Rule implements RuleInterface { PortfolioReportRule['configuration'] >; + public abstract getName(): string; + public abstract getSettings(aUserSettings: UserSettings): T; } diff --git a/apps/api/src/models/rules/account-cluster-risk/current-investment.ts b/apps/api/src/models/rules/account-cluster-risk/current-investment.ts index 564af935d..76b7e2f94 100644 --- a/apps/api/src/models/rules/account-cluster-risk/current-investment.ts +++ b/apps/api/src/models/rules/account-cluster-risk/current-investment.ts @@ -15,8 +15,7 @@ export class AccountClusterRiskCurrentInvestment extends Rule { accounts: PortfolioDetails['accounts'] ) { super(exchangeRateDataService, { - key: AccountClusterRiskCurrentInvestment.name, - name: 'Investment' + key: AccountClusterRiskCurrentInvestment.name }); this.accounts = accounts; @@ -88,6 +87,10 @@ export class AccountClusterRiskCurrentInvestment extends Rule { }; } + public getName() { + return 'Investment'; + } + public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings { return { baseCurrency, diff --git a/apps/api/src/models/rules/account-cluster-risk/single-account.ts b/apps/api/src/models/rules/account-cluster-risk/single-account.ts index ef549e579..50f49efab 100644 --- a/apps/api/src/models/rules/account-cluster-risk/single-account.ts +++ b/apps/api/src/models/rules/account-cluster-risk/single-account.ts @@ -11,8 +11,7 @@ export class AccountClusterRiskSingleAccount extends Rule { accounts: PortfolioDetails['accounts'] ) { super(exchangeRateDataService, { - key: AccountClusterRiskSingleAccount.name, - name: 'Single Account' + key: AccountClusterRiskSingleAccount.name }); this.accounts = accounts; @@ -38,6 +37,10 @@ export class AccountClusterRiskSingleAccount extends Rule { return undefined; } + public getName() { + return 'Single Account'; + } + public getSettings({ xRayRules }: UserSettings): RuleSettings { return { isActive: xRayRules?.[this.getKey()].isActive ?? true diff --git a/apps/api/src/models/rules/asset-class-cluster-risk/equity.ts b/apps/api/src/models/rules/asset-class-cluster-risk/equity.ts index b67e01e61..b386f3e18 100644 --- a/apps/api/src/models/rules/asset-class-cluster-risk/equity.ts +++ b/apps/api/src/models/rules/asset-class-cluster-risk/equity.ts @@ -11,8 +11,7 @@ export class AssetClassClusterRiskEquity extends Rule { holdings: PortfolioPosition[] ) { super(exchangeRateDataService, { - key: AssetClassClusterRiskEquity.name, - name: 'Equity' + key: AssetClassClusterRiskEquity.name }); this.holdings = holdings; @@ -78,6 +77,10 @@ export class AssetClassClusterRiskEquity extends Rule { }; } + public getName() { + return 'Equity'; + } + public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings { return { baseCurrency, diff --git a/apps/api/src/models/rules/asset-class-cluster-risk/fixed-income.ts b/apps/api/src/models/rules/asset-class-cluster-risk/fixed-income.ts index eb744a143..918856c45 100644 --- a/apps/api/src/models/rules/asset-class-cluster-risk/fixed-income.ts +++ b/apps/api/src/models/rules/asset-class-cluster-risk/fixed-income.ts @@ -11,8 +11,7 @@ export class AssetClassClusterRiskFixedIncome extends Rule { holdings: PortfolioPosition[] ) { super(exchangeRateDataService, { - key: AssetClassClusterRiskFixedIncome.name, - name: 'Fixed Income' + key: AssetClassClusterRiskFixedIncome.name }); this.holdings = holdings; @@ -78,6 +77,10 @@ export class AssetClassClusterRiskFixedIncome extends Rule { }; } + public getName() { + return 'Fixed Income'; + } + public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings { return { baseCurrency, diff --git a/apps/api/src/models/rules/currency-cluster-risk/base-currency-current-investment.ts b/apps/api/src/models/rules/currency-cluster-risk/base-currency-current-investment.ts index 90ee29c54..6de686a9e 100644 --- a/apps/api/src/models/rules/currency-cluster-risk/base-currency-current-investment.ts +++ b/apps/api/src/models/rules/currency-cluster-risk/base-currency-current-investment.ts @@ -11,8 +11,7 @@ export class CurrencyClusterRiskBaseCurrencyCurrentInvestment extends Rule { holdings: PortfolioPosition[] ) { super(exchangeRateDataService, { - key: CurrencyClusterRiskCurrentInvestment.name, - name: 'Investment' + key: CurrencyClusterRiskCurrentInvestment.name }); this.holdings = holdings; @@ -73,6 +72,10 @@ export class CurrencyClusterRiskCurrentInvestment extends Rule { }; } + public getName() { + return 'Investment'; + } + public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings { return { baseCurrency, diff --git a/apps/api/src/models/rules/economic-market-cluster-risk/developed-markets.ts b/apps/api/src/models/rules/economic-market-cluster-risk/developed-markets.ts index 15e113927..8f3ef0d65 100644 --- a/apps/api/src/models/rules/economic-market-cluster-risk/developed-markets.ts +++ b/apps/api/src/models/rules/economic-market-cluster-risk/developed-markets.ts @@ -13,8 +13,7 @@ export class EconomicMarketClusterRiskDevelopedMarkets extends Rule { developedMarketsValueInBaseCurrency: number ) { super(exchangeRateDataService, { - key: EconomicMarketClusterRiskDevelopedMarkets.name, - name: 'Developed Markets' + key: EconomicMarketClusterRiskDevelopedMarkets.name }); this.currentValueInBaseCurrency = currentValueInBaseCurrency; @@ -67,6 +66,10 @@ export class EconomicMarketClusterRiskDevelopedMarkets extends Rule { }; } + public getName() { + return 'Developed Markets'; + } + public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings { return { baseCurrency, diff --git a/apps/api/src/models/rules/economic-market-cluster-risk/emerging-markets.ts b/apps/api/src/models/rules/economic-market-cluster-risk/emerging-markets.ts index 8fccdf1d8..48eff22cf 100644 --- a/apps/api/src/models/rules/economic-market-cluster-risk/emerging-markets.ts +++ b/apps/api/src/models/rules/economic-market-cluster-risk/emerging-markets.ts @@ -13,8 +13,7 @@ export class EconomicMarketClusterRiskEmergingMarkets extends Rule { emergingMarketsValueInBaseCurrency: number ) { super(exchangeRateDataService, { - key: EconomicMarketClusterRiskEmergingMarkets.name, - name: 'Emerging Markets' + key: EconomicMarketClusterRiskEmergingMarkets.name }); this.currentValueInBaseCurrency = currentValueInBaseCurrency; @@ -67,6 +66,10 @@ export class EconomicMarketClusterRiskEmergingMarkets extends Rule { }; } + public getName() { + return 'Emerging Markets'; + } + public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings { return { baseCurrency, diff --git a/apps/api/src/models/rules/emergency-fund/emergency-fund-setup.ts b/apps/api/src/models/rules/emergency-fund/emergency-fund-setup.ts index d13f2ffc5..67c0f297e 100644 --- a/apps/api/src/models/rules/emergency-fund/emergency-fund-setup.ts +++ b/apps/api/src/models/rules/emergency-fund/emergency-fund-setup.ts @@ -1,6 +1,7 @@ import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface'; import { Rule } from '@ghostfolio/api/models/rule'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; +import { I18nService } from '@ghostfolio/api/services/i18n/i18n.service'; import { UserSettings } from '@ghostfolio/common/interfaces'; export class EmergencyFundSetup extends Rule { @@ -8,11 +9,13 @@ export class EmergencyFundSetup extends Rule { public constructor( protected exchangeRateDataService: ExchangeRateDataService, + private i18nService: I18nService, + languageCode: string, emergencyFund: number ) { super(exchangeRateDataService, { - key: EmergencyFundSetup.name, - name: 'Emergency Fund: Set up' + languageCode, + key: EmergencyFundSetup.name }); this.emergencyFund = emergencyFund; @@ -21,13 +24,19 @@ export class EmergencyFundSetup extends Rule { public evaluate() { if (!this.emergencyFund) { return { - evaluation: 'No emergency fund has been set up', + evaluation: this.i18nService.getTranslation({ + id: 'rule.emergencyFundSetup.false', + languageCode: this.getLanguageCode() + }), value: false }; } return { - evaluation: 'An emergency fund has been set up', + evaluation: this.i18nService.getTranslation({ + id: 'rule.emergencyFundSetup.true', + languageCode: this.getLanguageCode() + }), value: true }; } @@ -36,6 +45,13 @@ export class EmergencyFundSetup extends Rule { return undefined; } + public getName() { + return this.i18nService.getTranslation({ + id: 'rule.emergencyFundSetup', + languageCode: this.getLanguageCode() + }); + } + public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings { return { baseCurrency, diff --git a/apps/api/src/models/rules/fees/fee-ratio-initial-investment.ts b/apps/api/src/models/rules/fees/fee-ratio-initial-investment.ts index fa9d7e7bc..89fe32dbf 100644 --- a/apps/api/src/models/rules/fees/fee-ratio-initial-investment.ts +++ b/apps/api/src/models/rules/fees/fee-ratio-initial-investment.ts @@ -1,6 +1,7 @@ import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface'; import { Rule } from '@ghostfolio/api/models/rule'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; +import { I18nService } from '@ghostfolio/api/services/i18n/i18n.service'; import { UserSettings } from '@ghostfolio/common/interfaces'; export class FeeRatioInitialInvestment extends Rule { @@ -9,12 +10,14 @@ export class FeeRatioInitialInvestment extends Rule { public constructor( protected exchangeRateDataService: ExchangeRateDataService, + private i18nService: I18nService, + languageCode: string, totalInvestment: number, fees: number ) { super(exchangeRateDataService, { - key: FeeRatioInitialInvestment.name, - name: 'Fee Ratio' + languageCode, + key: FeeRatioInitialInvestment.name }); this.fees = fees; @@ -28,17 +31,27 @@ export class FeeRatioInitialInvestment extends Rule { if (feeRatio > ruleSettings.thresholdMax) { return { - evaluation: `The fees do exceed ${ - ruleSettings.thresholdMax * 100 - }% of your initial investment (${(feeRatio * 100).toPrecision(3)}%)`, + evaluation: this.i18nService.getTranslation({ + id: 'rule.feeRatioInitialInvestment.false', + languageCode: this.getLanguageCode(), + placeholders: { + feeRatio: (ruleSettings.thresholdMax * 100).toFixed(2), + thresholdMax: (feeRatio * 100).toPrecision(3) + } + }), value: false }; } return { - evaluation: `The fees do not exceed ${ - ruleSettings.thresholdMax * 100 - }% of your initial investment (${(feeRatio * 100).toPrecision(3)}%)`, + evaluation: this.i18nService.getTranslation({ + id: 'rule.feeRatioInitialInvestment.true', + languageCode: this.getLanguageCode(), + placeholders: { + feeRatio: (feeRatio * 100).toPrecision(3), + thresholdMax: (ruleSettings.thresholdMax * 100).toFixed(2) + } + }), value: true }; } @@ -55,6 +68,13 @@ export class FeeRatioInitialInvestment extends Rule { }; } + public getName() { + return this.i18nService.getTranslation({ + id: 'rule.feeRatioInitialInvestment', + languageCode: this.getLanguageCode() + }); + } + public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings { return { baseCurrency, diff --git a/apps/api/src/models/rules/regional-market-cluster-risk/asia-pacific.ts b/apps/api/src/models/rules/regional-market-cluster-risk/asia-pacific.ts index d49849d54..823da9e27 100644 --- a/apps/api/src/models/rules/regional-market-cluster-risk/asia-pacific.ts +++ b/apps/api/src/models/rules/regional-market-cluster-risk/asia-pacific.ts @@ -14,8 +14,7 @@ export class RegionalMarketClusterRiskAsiaPacific extends Rule { asiaPacificValueInBaseCurrency: number ) { super(exchangeRateDataService, { - key: RegionalMarketClusterRiskAsiaPacific.name, - name: 'Asia-Pacific' + key: RegionalMarketClusterRiskAsiaPacific.name }); this.asiaPacificValueInBaseCurrency = asiaPacificValueInBaseCurrency; @@ -66,6 +65,10 @@ export class RegionalMarketClusterRiskAsiaPacific extends Rule { }; } + public getName() { + return 'Asia-Pacific'; + } + public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings { return { baseCurrency, diff --git a/apps/api/src/models/rules/regional-market-cluster-risk/emerging-markets.ts b/apps/api/src/models/rules/regional-market-cluster-risk/emerging-markets.ts index 2d9a3b394..b1ab74e1f 100644 --- a/apps/api/src/models/rules/regional-market-cluster-risk/emerging-markets.ts +++ b/apps/api/src/models/rules/regional-market-cluster-risk/emerging-markets.ts @@ -14,8 +14,7 @@ export class RegionalMarketClusterRiskEmergingMarkets extends Rule { emergingMarketsValueInBaseCurrency: number ) { super(exchangeRateDataService, { - key: RegionalMarketClusterRiskEmergingMarkets.name, - name: 'Emerging Markets' + key: RegionalMarketClusterRiskEmergingMarkets.name }); this.currentValueInBaseCurrency = currentValueInBaseCurrency; @@ -68,6 +67,10 @@ export class RegionalMarketClusterRiskEmergingMarkets extends Rule { }; } + public getName() { + return 'Emerging Markets'; + } + public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings { return { baseCurrency, diff --git a/apps/api/src/models/rules/regional-market-cluster-risk/europe.ts b/apps/api/src/models/rules/regional-market-cluster-risk/europe.ts index d33190ceb..3b069cf57 100644 --- a/apps/api/src/models/rules/regional-market-cluster-risk/europe.ts +++ b/apps/api/src/models/rules/regional-market-cluster-risk/europe.ts @@ -14,8 +14,7 @@ export class RegionalMarketClusterRiskEurope extends Rule { europeValueInBaseCurrency: number ) { super(exchangeRateDataService, { - key: RegionalMarketClusterRiskEurope.name, - name: 'Europe' + key: RegionalMarketClusterRiskEurope.name }); this.currentValueInBaseCurrency = currentValueInBaseCurrency; @@ -66,6 +65,10 @@ export class RegionalMarketClusterRiskEurope extends Rule { }; } + public getName() { + return 'Europe'; + } + public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings { return { baseCurrency, diff --git a/apps/api/src/models/rules/regional-market-cluster-risk/japan.ts b/apps/api/src/models/rules/regional-market-cluster-risk/japan.ts index 4694b0006..511393cfb 100644 --- a/apps/api/src/models/rules/regional-market-cluster-risk/japan.ts +++ b/apps/api/src/models/rules/regional-market-cluster-risk/japan.ts @@ -14,8 +14,7 @@ export class RegionalMarketClusterRiskJapan extends Rule { japanValueInBaseCurrency: number ) { super(exchangeRateDataService, { - key: RegionalMarketClusterRiskJapan.name, - name: 'Japan' + key: RegionalMarketClusterRiskJapan.name }); this.currentValueInBaseCurrency = currentValueInBaseCurrency; @@ -66,6 +65,10 @@ export class RegionalMarketClusterRiskJapan extends Rule { }; } + public getName() { + return 'Japan'; + } + public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings { return { baseCurrency, diff --git a/apps/api/src/models/rules/regional-market-cluster-risk/north-america.ts b/apps/api/src/models/rules/regional-market-cluster-risk/north-america.ts index 4563b7c54..5bea57db1 100644 --- a/apps/api/src/models/rules/regional-market-cluster-risk/north-america.ts +++ b/apps/api/src/models/rules/regional-market-cluster-risk/north-america.ts @@ -14,8 +14,7 @@ export class RegionalMarketClusterRiskNorthAmerica extends Rule { northAmericaValueInBaseCurrency: number ) { super(exchangeRateDataService, { - key: RegionalMarketClusterRiskNorthAmerica.name, - name: 'North America' + key: RegionalMarketClusterRiskNorthAmerica.name }); this.currentValueInBaseCurrency = currentValueInBaseCurrency; @@ -66,6 +65,10 @@ export class RegionalMarketClusterRiskNorthAmerica extends Rule { }; } + public getName() { + return 'North America'; + } + public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings { return { baseCurrency, diff --git a/apps/api/src/services/cron/cron.module.ts b/apps/api/src/services/cron/cron.module.ts new file mode 100644 index 000000000..06f9d2caa --- /dev/null +++ b/apps/api/src/services/cron/cron.module.ts @@ -0,0 +1,23 @@ +import { UserModule } from '@ghostfolio/api/app/user/user.module'; +import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; +import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module'; +import { PropertyModule } from '@ghostfolio/api/services/property/property.module'; +import { DataGatheringModule } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.module'; +import { TwitterBotModule } from '@ghostfolio/api/services/twitter-bot/twitter-bot.module'; + +import { Module } from '@nestjs/common'; + +import { CronService } from './cron.service'; + +@Module({ + imports: [ + ConfigurationModule, + DataGatheringModule, + ExchangeRateDataModule, + PropertyModule, + TwitterBotModule, + UserModule + ], + providers: [CronService] +}) +export class CronModule {} diff --git a/apps/api/src/services/cron.service.ts b/apps/api/src/services/cron/cron.service.ts similarity index 79% rename from apps/api/src/services/cron.service.ts rename to apps/api/src/services/cron/cron.service.ts index 3d4aff08b..b770aa2d7 100644 --- a/apps/api/src/services/cron.service.ts +++ b/apps/api/src/services/cron/cron.service.ts @@ -1,4 +1,9 @@ import { UserService } from '@ghostfolio/api/app/user/user.service'; +import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; +import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; +import { PropertyService } from '@ghostfolio/api/services/property/property.service'; +import { DataGatheringService } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.service'; +import { TwitterBotService } from '@ghostfolio/api/services/twitter-bot/twitter-bot.service'; import { DATA_GATHERING_QUEUE_PRIORITY_LOW, GATHER_ASSET_PROFILE_PROCESS_JOB_NAME, @@ -10,12 +15,6 @@ import { getAssetProfileIdentifier } from '@ghostfolio/common/helper'; import { Injectable } from '@nestjs/common'; import { Cron, CronExpression } from '@nestjs/schedule'; -import { ConfigurationService } from './configuration/configuration.service'; -import { ExchangeRateDataService } from './exchange-rate-data/exchange-rate-data.service'; -import { PropertyService } from './property/property.service'; -import { DataGatheringService } from './queues/data-gathering/data-gathering.service'; -import { TwitterBotService } from './twitter-bot/twitter-bot.service'; - @Injectable() export class CronService { private static readonly EVERY_SUNDAY_AT_LUNCH_TIME = '0 12 * * 0'; @@ -43,7 +42,9 @@ export class CronService { @Cron(CronExpression.EVERY_DAY_AT_5PM) public async runEveryDayAtFivePm() { - this.twitterBotService.tweetFearAndGreedIndex(); + if (this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) { + this.twitterBotService.tweetFearAndGreedIndex(); + } } @Cron(CronExpression.EVERY_DAY_AT_MIDNIGHT) diff --git a/apps/api/src/services/demo/demo.module.ts b/apps/api/src/services/demo/demo.module.ts new file mode 100644 index 000000000..8f86de058 --- /dev/null +++ b/apps/api/src/services/demo/demo.module.ts @@ -0,0 +1,13 @@ +import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; +import { PropertyModule } from '@ghostfolio/api/services/property/property.module'; + +import { Module } from '@nestjs/common'; + +import { DemoService } from './demo.service'; + +@Module({ + exports: [DemoService], + imports: [PrismaModule, PropertyModule], + providers: [DemoService] +}) +export class DemoModule {} diff --git a/apps/api/src/services/demo/demo.service.ts b/apps/api/src/services/demo/demo.service.ts new file mode 100644 index 000000000..477b43e3b --- /dev/null +++ b/apps/api/src/services/demo/demo.service.ts @@ -0,0 +1,59 @@ +import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; +import { PropertyService } from '@ghostfolio/api/services/property/property.service'; +import { + PROPERTY_DEMO_ACCOUNT_ID, + PROPERTY_DEMO_USER_ID, + TAG_ID_DEMO +} from '@ghostfolio/common/config'; + +import { Injectable } from '@nestjs/common'; +import { v4 as uuidv4 } from 'uuid'; + +@Injectable() +export class DemoService { + public constructor( + private readonly prismaService: PrismaService, + private readonly propertyService: PropertyService + ) {} + + public async syncDemoUserAccount() { + const [demoAccountId, demoUserId] = (await Promise.all([ + this.propertyService.getByKey(PROPERTY_DEMO_ACCOUNT_ID), + this.propertyService.getByKey(PROPERTY_DEMO_USER_ID) + ])) as [string, string]; + + let activities = await this.prismaService.order.findMany({ + orderBy: { + date: 'asc' + }, + where: { + tags: { + some: { + id: TAG_ID_DEMO + } + } + } + }); + + activities = activities.map((activity) => { + return { + ...activity, + accountId: demoAccountId, + accountUserId: demoUserId, + comment: null, + id: uuidv4(), + userId: demoUserId + }; + }); + + await this.prismaService.order.deleteMany({ + where: { + userId: demoUserId + } + }); + + return this.prismaService.order.createMany({ + data: activities + }); + } +} diff --git a/apps/api/src/services/i18n/i18n.module.ts b/apps/api/src/services/i18n/i18n.module.ts new file mode 100644 index 000000000..68211de40 --- /dev/null +++ b/apps/api/src/services/i18n/i18n.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; + +import { I18nService } from './i18n.service'; + +@Module({ + exports: [I18nService], + providers: [I18nService] +}) +export class I18nModule {} diff --git a/apps/api/src/services/i18n/i18n.service.ts b/apps/api/src/services/i18n/i18n.service.ts index 13193fc6a..a0389ab36 100644 --- a/apps/api/src/services/i18n/i18n.service.ts +++ b/apps/api/src/services/i18n/i18n.service.ts @@ -1,10 +1,11 @@ import { DEFAULT_LANGUAGE_CODE } from '@ghostfolio/common/config'; -import { Logger } from '@nestjs/common'; +import { Injectable, Logger } from '@nestjs/common'; import * as cheerio from 'cheerio'; import { readFileSync, readdirSync } from 'fs'; import { join } from 'path'; +@Injectable() export class I18nService { private localesPath = join(__dirname, 'assets', 'locales'); private translations: { [locale: string]: cheerio.CheerioAPI } = {}; @@ -15,10 +16,12 @@ export class I18nService { public getTranslation({ id, - languageCode + languageCode, + placeholders }: { id: string; languageCode: string; + placeholders?: Record; }): string { const $ = this.translations[languageCode]; @@ -26,7 +29,7 @@ export class I18nService { Logger.warn(`Translation not found for locale '${languageCode}'`); } - const translatedText = $( + let translatedText = $( `trans-unit[id="${id}"] > ${ languageCode === DEFAULT_LANGUAGE_CODE ? 'source' : 'target' }` @@ -38,6 +41,12 @@ export class I18nService { ); } + if (placeholders) { + for (const [key, value] of Object.entries(placeholders)) { + translatedText = translatedText.replace(`\${${key}}`, String(value)); + } + } + return translatedText.trim(); } diff --git a/apps/api/src/services/tag/tag.service.ts b/apps/api/src/services/tag/tag.service.ts index 3d6bd3907..eb2d7bfef 100644 --- a/apps/api/src/services/tag/tag.service.ts +++ b/apps/api/src/services/tag/tag.service.ts @@ -52,7 +52,7 @@ export class TagService { include: { _count: { select: { - orders: { + activities: { where: { userId } @@ -79,7 +79,7 @@ export class TagService { id, name, userId, - isUsed: _count.orders > 0 + isUsed: _count.activities > 0 })); } @@ -87,7 +87,7 @@ export class TagService { const tagsWithOrderCount = await this.prismaService.tag.findMany({ include: { _count: { - select: { orders: true } + select: { activities: true } } } }); @@ -97,7 +97,7 @@ export class TagService { id, name, userId, - activityCount: _count.orders + activityCount: _count.activities }; }); } diff --git a/apps/client-e2e/project.json b/apps/client-e2e/project.json index 16d13e012..92e2f09ef 100644 --- a/apps/client-e2e/project.json +++ b/apps/client-e2e/project.json @@ -3,12 +3,13 @@ "$schema": "../../node_modules/nx/schemas/project-schema.json", "sourceRoot": "apps/client-e2e/src", "projectType": "application", + "tags": [], + "implicitDependencies": ["client"], "targets": { "e2e": { "executor": "@nx/cypress:cypress", "options": { "cypressConfig": "apps/client-e2e/cypress.json", - "tsConfig": "apps/client-e2e/tsconfig.e2e.json", "devServerTarget": "client:serve" }, "configurations": { @@ -17,7 +18,5 @@ } } } - }, - "tags": [], - "implicitDependencies": ["client"] + } } diff --git a/apps/client/project.json b/apps/client/project.json index b2144d7b3..4bb7fe296 100644 --- a/apps/client/project.json +++ b/apps/client/project.json @@ -2,13 +2,63 @@ "name": "client", "$schema": "../../node_modules/nx/schemas/project-schema.json", "projectType": "application", + "sourceRoot": "apps/client/src", + "prefix": "gf", + "i18n": { + "locales": { + "ca": { + "baseHref": "/ca/", + "translation": "apps/client/src/locales/messages.ca.xlf" + }, + "de": { + "baseHref": "/de/", + "translation": "apps/client/src/locales/messages.de.xlf" + }, + "es": { + "baseHref": "/es/", + "translation": "apps/client/src/locales/messages.es.xlf" + }, + "fr": { + "baseHref": "/fr/", + "translation": "apps/client/src/locales/messages.fr.xlf" + }, + "it": { + "baseHref": "/it/", + "translation": "apps/client/src/locales/messages.it.xlf" + }, + "nl": { + "baseHref": "/nl/", + "translation": "apps/client/src/locales/messages.nl.xlf" + }, + "pl": { + "baseHref": "/pl/", + "translation": "apps/client/src/locales/messages.pl.xlf" + }, + "pt": { + "baseHref": "/pt/", + "translation": "apps/client/src/locales/messages.pt.xlf" + }, + "tr": { + "baseHref": "/tr/", + "translation": "apps/client/src/locales/messages.tr.xlf" + }, + "uk": { + "baseHref": "/uk/", + "translation": "apps/client/src/locales/messages.uk.xlf" + }, + "zh": { + "baseHref": "/zh/", + "translation": "apps/client/src/locales/messages.zh.xlf" + } + }, + "sourceLocale": "en" + }, + "tags": [], "generators": { "@schematics/angular:component": { "style": "scss" } }, - "sourceRoot": "apps/client/src", - "prefix": "gf", "targets": { "build": { "executor": "@nx/angular:webpack-browser", @@ -135,7 +185,7 @@ "command": "shx cp -r apps/client/src/assets/* dist/apps/client/assets" }, { - "command": "shx cp -r apps/client/src/assets/.well-known/* dist/apps/client/.well-known" + "command": "shx cp -r apps/client/src/assets/.well-known/assetlinks.json dist/apps/client/.well-known" }, { "command": "shx cp apps/client/src/assets/favicon.ico dist/apps/client" @@ -211,7 +261,8 @@ "production": { "buildTarget": "client:build:production" } - } + }, + "continuous": true }, "extract-i18n": { "executor": "ng-extract-i18n-merge:ng-extract-i18n-merge", @@ -247,55 +298,5 @@ }, "outputs": ["{workspaceRoot}/coverage/apps/client"] } - }, - "i18n": { - "locales": { - "ca": { - "baseHref": "/ca/", - "translation": "apps/client/src/locales/messages.ca.xlf" - }, - "de": { - "baseHref": "/de/", - "translation": "apps/client/src/locales/messages.de.xlf" - }, - "es": { - "baseHref": "/es/", - "translation": "apps/client/src/locales/messages.es.xlf" - }, - "fr": { - "baseHref": "/fr/", - "translation": "apps/client/src/locales/messages.fr.xlf" - }, - "it": { - "baseHref": "/it/", - "translation": "apps/client/src/locales/messages.it.xlf" - }, - "nl": { - "baseHref": "/nl/", - "translation": "apps/client/src/locales/messages.nl.xlf" - }, - "pl": { - "baseHref": "/pl/", - "translation": "apps/client/src/locales/messages.pl.xlf" - }, - "pt": { - "baseHref": "/pt/", - "translation": "apps/client/src/locales/messages.pt.xlf" - }, - "tr": { - "baseHref": "/tr/", - "translation": "apps/client/src/locales/messages.tr.xlf" - }, - "uk": { - "baseHref": "/uk/", - "translation": "apps/client/src/locales/messages.uk.xlf" - }, - "zh": { - "baseHref": "/zh/", - "translation": "apps/client/src/locales/messages.zh.xlf" - } - }, - "sourceLocale": "en" - }, - "tags": [] + } } diff --git a/apps/client/src/app/app-routing.module.ts b/apps/client/src/app/app-routing.module.ts index b3be70bb2..46473d35d 100644 --- a/apps/client/src/app/app-routing.module.ts +++ b/apps/client/src/app/app-routing.module.ts @@ -1,6 +1,10 @@ import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; import { PageTitleStrategy } from '@ghostfolio/client/services/page-title.strategy'; -import { paths } from '@ghostfolio/common/paths'; +import { + publicRoutes, + routes as ghostfolioRoutes, + internalRoutes +} from '@ghostfolio/common/routes'; import { NgModule } from '@angular/core'; import { RouterModule, Routes, TitleStrategy } from '@angular/router'; @@ -9,26 +13,26 @@ import { ModulePreloadService } from './core/module-preload.service'; const routes: Routes = [ { - path: paths.about, + path: ghostfolioRoutes.about, loadChildren: () => import('./pages/about/about-page.module').then((m) => m.AboutPageModule) }, { - path: paths.account, + path: ghostfolioRoutes.account, loadChildren: () => import('./pages/user-account/user-account-page.module').then( (m) => m.UserAccountPageModule ) }, { - path: paths.accounts, + path: internalRoutes.accounts.path, loadChildren: () => import('./pages/accounts/accounts-page.module').then( (m) => m.AccountsPageModule ) }, { - path: paths.adminControl, + path: ghostfolioRoutes.adminControl, loadChildren: () => import('./pages/admin/admin-page.module').then((m) => m.AdminPageModule) }, @@ -38,16 +42,16 @@ const routes: Routes = [ import('./pages/api/api-page.component').then( (c) => c.GfApiPageComponent ), - path: paths.api, + path: ghostfolioRoutes.api, title: 'Ghostfolio API' }, { - path: paths.auth, + path: ghostfolioRoutes.auth, loadChildren: () => import('./pages/auth/auth-page.module').then((m) => m.AuthPageModule) }, { - path: paths.blog, + path: ghostfolioRoutes.blog, loadChildren: () => import('./pages/blog/blog-page.module').then((m) => m.BlogPageModule) }, @@ -57,10 +61,10 @@ const routes: Routes = [ import('./pages/demo/demo-page.component').then( (c) => c.GfDemoPageComponent ), - path: paths.demo + path: ghostfolioRoutes.demo }, { - path: paths.faq, + path: ghostfolioRoutes.faq, loadChildren: () => import('./pages/faq/faq-page.module').then((m) => m.FaqPageModule) }, @@ -70,11 +74,11 @@ const routes: Routes = [ import('./pages/features/features-page.component').then( (c) => c.GfFeaturesPageComponent ), - path: paths.features, + path: ghostfolioRoutes.features, title: $localize`Features` }, { - path: paths.home, + path: internalRoutes.home.path, loadChildren: () => import('./pages/home/home-page.module').then((m) => m.HomePageModule) }, @@ -84,58 +88,58 @@ const routes: Routes = [ import('./pages/i18n/i18n-page.component').then( (c) => c.GfI18nPageComponent ), - path: paths.i18n, + path: ghostfolioRoutes.i18n, title: $localize`Internationalization` }, { - path: paths.markets, + path: ghostfolioRoutes.markets, loadChildren: () => import('./pages/markets/markets-page.module').then( (m) => m.MarketsPageModule ) }, { - path: paths.openStartup, + path: publicRoutes.openStartup.path, loadChildren: () => import('./pages/open/open-page.module').then((m) => m.OpenPageModule) }, { - path: paths.portfolio, + path: internalRoutes.portfolio.path, loadChildren: () => import('./pages/portfolio/portfolio-page.module').then( (m) => m.PortfolioPageModule ) }, { - path: paths.pricing, + path: ghostfolioRoutes.pricing, loadChildren: () => import('./pages/pricing/pricing-page.module').then( (m) => m.PricingPageModule ) }, { - path: paths.public, + path: ghostfolioRoutes.public, loadChildren: () => import('./pages/public/public-page.module').then( (m) => m.PublicPageModule ) }, { - path: paths.register, + path: publicRoutes.register.path, loadChildren: () => import('./pages/register/register-page.module').then( (m) => m.RegisterPageModule ) }, { - path: paths.resources, + path: ghostfolioRoutes.resources, loadChildren: () => import('./pages/resources/resources-page.module').then( (m) => m.ResourcesPageModule ) }, { - path: paths.start, + path: ghostfolioRoutes.start, loadChildren: () => import('./pages/landing/landing-page.module').then( (m) => m.LandingPageModule @@ -146,11 +150,11 @@ const routes: Routes = [ import('./pages/webauthn/webauthn-page.component').then( (c) => c.GfWebauthnPageComponent ), - path: paths.webauthn, + path: ghostfolioRoutes.webauthn, title: $localize`Sign in` }, { - path: paths.zen, + path: internalRoutes.zen.path, loadChildren: () => import('./pages/zen/zen-page.module').then((m) => m.ZenPageModule) }, diff --git a/apps/client/src/app/app.component.html b/apps/client/src/app/app.component.html index a04e457ba..9680d0830 100644 --- a/apps/client/src/app/app.component.html +++ b/apps/client/src/app/app.component.html @@ -10,7 +10,7 @@ (click)="onCreateAccount()" > You are using the Live Demo. - Create Account + Create Account } diff --git a/apps/client/src/app/app.component.scss b/apps/client/src/app/app.component.scss index 241d3331e..f848fe6ff 100644 --- a/apps/client/src/app/app.component.scss +++ b/apps/client/src/app/app.component.scss @@ -15,12 +15,14 @@ z-index: 999; .info-message { - color: rgba(var(--palette-foreground-text), 1); + color: rgba(var(--light-primary-text)); font-size: 80%; + font-weight: 500; max-width: 100%; .a { - font-weight: 500; + border: 1px solid rgba(var(--light-primary-text)); + border-radius: 0.25rem; } } } diff --git a/apps/client/src/app/app.component.ts b/apps/client/src/app/app.component.ts index 5d198580e..7f308c7a7 100644 --- a/apps/client/src/app/app.component.ts +++ b/apps/client/src/app/app.component.ts @@ -2,8 +2,12 @@ import { GfHoldingDetailDialogComponent } from '@ghostfolio/client/components/ho import { HoldingDetailDialogParams } from '@ghostfolio/client/components/holding-detail-dialog/interfaces/interfaces'; import { getCssVariable } from '@ghostfolio/common/helper'; import { InfoItem, User } from '@ghostfolio/common/interfaces'; -import { paths } from '@ghostfolio/common/paths'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { + internalRoutes, + publicRoutes, + routes +} from '@ghostfolio/common/routes'; import { ColorScheme } from '@ghostfolio/common/types'; import { DOCUMENT } from '@angular/common'; @@ -63,25 +67,25 @@ export class AppComponent implements OnDestroy, OnInit { public hasTabs = false; public info: InfoItem; public pageTitle: string; - public routerLinkAbout = ['/' + paths.about]; - public routerLinkAboutChangelog = ['/' + paths.about, paths.changelog]; - public routerLinkAboutLicense = ['/' + paths.about, paths.license]; + public routerLinkAbout = ['/' + routes.about]; + public routerLinkAboutChangelog = ['/' + routes.about, routes.changelog]; + public routerLinkAboutLicense = ['/' + routes.about, routes.license]; public routerLinkAboutPrivacyPolicy = [ - '/' + paths.about, - paths.privacyPolicy + '/' + routes.about, + routes.privacyPolicy ]; public routerLinkAboutTermsOfService = [ - '/' + paths.about, - paths.termsOfService + '/' + routes.about, + routes.termsOfService ]; - public routerLinkBlog = ['/' + paths.blog]; - public routerLinkFaq = ['/' + paths.faq]; - public routerLinkFeatures = ['/' + paths.features]; - public routerLinkMarkets = ['/' + paths.markets]; - public routerLinkOpenStartup = ['/' + paths.openStartup]; - public routerLinkPricing = ['/' + paths.pricing]; - public routerLinkRegister = ['/' + paths.register]; - public routerLinkResources = ['/' + paths.resources]; + public routerLinkBlog = ['/' + routes.blog]; + public routerLinkFaq = ['/' + routes.faq]; + public routerLinkFeatures = ['/' + routes.features]; + public routerLinkMarkets = ['/' + routes.markets]; + public routerLinkOpenStartup = publicRoutes.openStartup.routerLink; + public routerLinkPricing = ['/' + routes.pricing]; + public routerLinkRegister = publicRoutes.register.routerLink; + public routerLinkResources = ['/' + routes.resources]; public showFooter = false; public user: User; @@ -160,12 +164,14 @@ export class AppComponent implements OnDestroy, OnInit { this.currentSubRoute = urlSegments[1]?.path; if ( - (this.currentRoute === 'home' && !this.currentSubRoute) || - (this.currentRoute === 'home' && - this.currentSubRoute === 'holdings') || - (this.currentRoute === 'portfolio' && !this.currentSubRoute) || - (this.currentRoute === 'zen' && !this.currentSubRoute) || - (this.currentRoute === 'zen' && this.currentSubRoute === 'holdings') + ((this.currentRoute === internalRoutes.home.path && + !this.currentSubRoute) || + (this.currentRoute === internalRoutes.home.path && + this.currentSubRoute === + internalRoutes.home.subRoutes.holdings.path) || + (this.currentRoute === internalRoutes.portfolio.path && + !this.currentSubRoute)) && + this.user?.settings?.viewMode !== 'ZEN' ) { this.hasPermissionToChangeDateRange = true; } else { @@ -173,14 +179,19 @@ export class AppComponent implements OnDestroy, OnInit { } if ( - (this.currentRoute === 'home' && - this.currentSubRoute === 'holdings') || - (this.currentRoute === 'portfolio' && !this.currentSubRoute) || - (this.currentRoute === 'portfolio' && - this.currentSubRoute === 'activities') || - (this.currentRoute === 'portfolio' && - this.currentSubRoute === 'allocations') || - (this.currentRoute === 'zen' && this.currentSubRoute === 'holdings') + (this.currentRoute === internalRoutes.home.path && + this.currentSubRoute === + internalRoutes.home.subRoutes.holdings.path) || + (this.currentRoute === internalRoutes.portfolio.path && + !this.currentSubRoute) || + (this.currentRoute === internalRoutes.portfolio.path && + this.currentSubRoute === + internalRoutes.portfolio.subRoutes.activities.path) || + (this.currentRoute === internalRoutes.portfolio.path && + this.currentSubRoute === routes.allocations) || + (this.currentRoute === internalRoutes.zen.path && + this.currentSubRoute === + internalRoutes.home.subRoutes.holdings.path) ) { this.hasPermissionToChangeFilters = true; } else { @@ -188,25 +199,25 @@ export class AppComponent implements OnDestroy, OnInit { } this.hasTabs = - (this.currentRoute === this.routerLinkAbout[0].slice(1) || - this.currentRoute === this.routerLinkFaq[0].slice(1) || - this.currentRoute === this.routerLinkResources[0].slice(1) || - this.currentRoute === 'account' || - this.currentRoute === 'admin' || - this.currentRoute === 'home' || - this.currentRoute === 'portfolio' || - this.currentRoute === 'zen') && + (this.currentRoute === routes.about || + this.currentRoute === routes.faq || + this.currentRoute === routes.resources || + this.currentRoute === routes.account || + this.currentRoute === routes.adminControl || + this.currentRoute === internalRoutes.home.path || + this.currentRoute === internalRoutes.portfolio.path || + this.currentRoute === internalRoutes.zen.path) && this.deviceType !== 'mobile'; this.showFooter = - (this.currentRoute === 'blog' || - this.currentRoute === this.routerLinkFeatures[0].slice(1) || - this.currentRoute === this.routerLinkMarkets[0].slice(1) || - this.currentRoute === 'open' || - this.currentRoute === 'p' || - this.currentRoute === this.routerLinkPricing[0].slice(1) || - this.currentRoute === this.routerLinkRegister[0].slice(1) || - this.currentRoute === 'start') && + (this.currentRoute === routes.blog || + this.currentRoute === routes.features || + this.currentRoute === routes.markets || + this.currentRoute === publicRoutes.openStartup.path || + this.currentRoute === routes.public || + this.currentRoute === routes.pricing || + this.currentRoute === publicRoutes.register.path || + this.currentRoute === routes.start) && this.deviceType !== 'mobile'; if (this.deviceType === 'mobile') { diff --git a/apps/client/src/app/components/access-table/access-table.component.ts b/apps/client/src/app/components/access-table/access-table.component.ts index e70b6684a..5487f570d 100644 --- a/apps/client/src/app/components/access-table/access-table.component.ts +++ b/apps/client/src/app/components/access-table/access-table.component.ts @@ -1,8 +1,7 @@ import { ConfirmationDialogType } from '@ghostfolio/client/core/notification/confirmation-dialog/confirmation-dialog.type'; import { NotificationService } from '@ghostfolio/client/core/notification/notification.service'; -import { DEFAULT_LANGUAGE_CODE } from '@ghostfolio/common/config'; import { Access, User } from '@ghostfolio/common/interfaces'; -import { paths } from '@ghostfolio/common/paths'; +import { routes } from '@ghostfolio/common/routes'; import { Clipboard } from '@angular/cdk/clipboard'; import { @@ -54,9 +53,9 @@ export class AccessTableComponent implements OnChanges { } public getPublicUrl(aId: string): string { - const languageCode = this.user?.settings?.language ?? DEFAULT_LANGUAGE_CODE; + const languageCode = this.user.settings.language; - return `${this.baseUrl}/${languageCode}/${paths.public}/${aId}`; + return `${this.baseUrl}/${languageCode}/${routes.public}/${aId}`; } public onCopyUrlToClipboard(aId: string): void { diff --git a/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts b/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts index ba3b9e871..aea1c544c 100644 --- a/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts +++ b/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts @@ -9,8 +9,8 @@ import { PortfolioPosition, User } from '@ghostfolio/common/interfaces'; -import { paths } from '@ghostfolio/common/paths'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { internalRoutes } from '@ghostfolio/common/routes'; import { OrderWithAccount } from '@ghostfolio/common/types'; import { @@ -93,9 +93,12 @@ export class AccountDetailDialog implements OnDestroy, OnInit { } public onCloneActivity(aActivity: Activity) { - this.router.navigate(['/' + paths.portfolio, paths.activities], { - queryParams: { activityId: aActivity.id, createDialog: true } - }); + this.router.navigate( + internalRoutes.portfolio.subRoutes.activities.routerLink, + { + queryParams: { activityId: aActivity.id, createDialog: true } + } + ); this.dialogRef.close(); } @@ -152,9 +155,12 @@ export class AccountDetailDialog implements OnDestroy, OnInit { } public onUpdateActivity(aActivity: Activity) { - this.router.navigate(['/' + paths.portfolio, paths.activities], { - queryParams: { activityId: aActivity.id, editDialog: true } - }); + this.router.navigate( + internalRoutes.portfolio.subRoutes.activities.routerLink, + { + queryParams: { activityId: aActivity.id, editDialog: true } + } + ); this.dialogRef.close(); } diff --git a/apps/client/src/app/components/accounts-table/accounts-table.component.html b/apps/client/src/app/components/accounts-table/accounts-table.component.html index ecb51fc29..41ae74bec 100644 --- a/apps/client/src/app/components/accounts-table/accounts-table.component.html +++ b/apps/client/src/app/components/accounts-table/accounts-table.component.html @@ -44,10 +44,10 @@ @if (element.Platform?.url) { - } {{ element.name }} @@ -92,10 +92,10 @@ >
@if (element.Platform?.url) { - } {{ element.Platform?.name }} diff --git a/apps/client/src/app/components/accounts-table/accounts-table.module.ts b/apps/client/src/app/components/accounts-table/accounts-table.module.ts index 879ca13ea..d7c6bf9fe 100644 --- a/apps/client/src/app/components/accounts-table/accounts-table.module.ts +++ b/apps/client/src/app/components/accounts-table/accounts-table.module.ts @@ -1,4 +1,4 @@ -import { GfAssetProfileIconComponent } from '@ghostfolio/client/components/asset-profile-icon/asset-profile-icon.component'; +import { GfEntityLogoComponent } from '@ghostfolio/ui/entity-logo'; import { GfValueComponent } from '@ghostfolio/ui/value'; import { CommonModule } from '@angular/common'; @@ -17,7 +17,7 @@ import { AccountsTableComponent } from './accounts-table.component'; exports: [AccountsTableComponent], imports: [ CommonModule, - GfAssetProfileIconComponent, + GfEntityLogoComponent, GfValueComponent, MatButtonModule, MatMenuModule, diff --git a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html index f10b6dc02..4c7d39fc0 100644 --- a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html +++ b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -507,7 +507,7 @@ Url @if (assetProfileForm.get('url').value) { - { + this.snackBar.open( + '✅ ' + $localize`Demo user account has been synced.`, + undefined, + { + duration: ms('3 seconds') + } + ); + }); + } + public ngOnDestroy() { this.unsubscribeSubject.next(); this.unsubscribeSubject.complete(); diff --git a/apps/client/src/app/components/admin-overview/admin-overview.html b/apps/client/src/app/components/admin-overview/admin-overview.html index bcbf666ef..246e5fe04 100644 --- a/apps/client/src/app/components/admin-overview/admin-overview.html +++ b/apps/client/src/app/components/admin-overview/admin-overview.html @@ -169,10 +169,23 @@
Housekeeping
- +
+ @if (hasPermissionToSyncDemoUserAccount) { + + } + +
diff --git a/apps/client/src/app/components/admin-overview/admin-overview.module.ts b/apps/client/src/app/components/admin-overview/admin-overview.module.ts index da49eb858..1c5fba202 100644 --- a/apps/client/src/app/components/admin-overview/admin-overview.module.ts +++ b/apps/client/src/app/components/admin-overview/admin-overview.module.ts @@ -9,6 +9,7 @@ import { MatCardModule } from '@angular/material/card'; import { MatMenuModule } from '@angular/material/menu'; import { MatSelectModule } from '@angular/material/select'; import { MatSlideToggleModule } from '@angular/material/slide-toggle'; +import { MatSnackBarModule } from '@angular/material/snack-bar'; import { RouterModule } from '@angular/router'; import { AdminOverviewComponent } from './admin-overview.component'; @@ -24,6 +25,7 @@ import { AdminOverviewComponent } from './admin-overview.component'; MatCardModule, MatMenuModule, MatSelectModule, + MatSnackBarModule, MatSlideToggleModule, ReactiveFormsModule, RouterModule diff --git a/apps/client/src/app/components/admin-platform/admin-platform.component.html b/apps/client/src/app/components/admin-platform/admin-platform.component.html index 47fee3c8a..9e38d5de7 100644 --- a/apps/client/src/app/components/admin-platform/admin-platform.component.html +++ b/apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -23,7 +23,7 @@ @if (element.url) { - @if (data.platform.url) { - + }
diff --git a/apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.module.ts b/apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.module.ts index ac97e57cf..a6239566c 100644 --- a/apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.module.ts +++ b/apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.module.ts @@ -1,4 +1,4 @@ -import { GfAssetProfileIconComponent } from '@ghostfolio/client/components/asset-profile-icon/asset-profile-icon.component'; +import { GfEntityLogoComponent } from '@ghostfolio/ui/entity-logo'; import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; @@ -14,8 +14,8 @@ import { CreateOrUpdatePlatformDialog } from './create-or-update-platform-dialog declarations: [CreateOrUpdatePlatformDialog], imports: [ CommonModule, - GfAssetProfileIconComponent, FormsModule, + GfEntityLogoComponent, MatButtonModule, MatDialogModule, MatFormFieldModule, diff --git a/apps/client/src/app/components/admin-settings/admin-settings.component.html b/apps/client/src/app/components/admin-settings/admin-settings.component.html index 2dcdefdd0..41069fb10 100644 --- a/apps/client/src/app/components/admin-settings/admin-settings.component.html +++ b/apps/client/src/app/components/admin-settings/admin-settings.component.html @@ -9,7 +9,7 @@
- +
@if (isGhostfolioDataProvider(element)) { @if (isGhostfolioApiKeyValid === false) { - Early Access } @@ -105,12 +105,11 @@ } @else if (isGhostfolioApiKeyValid === false) { } } diff --git a/apps/client/src/app/components/admin-settings/admin-settings.component.scss b/apps/client/src/app/components/admin-settings/admin-settings.component.scss index c08ba95bc..384143300 100644 --- a/apps/client/src/app/components/admin-settings/admin-settings.component.scss +++ b/apps/client/src/app/components/admin-settings/admin-settings.component.scss @@ -1,6 +1,19 @@ :host { display: block; + button { + &.special { + background: linear-gradient(45deg, rgb(228, 94, 237), rgb(104, 94, 237)); + color: #fff; + } + } + + .badge { + &.early-access { + border: 1px solid var(--mat-table-row-item-outline-color); + } + } + .mat-mdc-progress-bar { --mdc-linear-progress-active-indicator-height: 0.5rem; --mdc-linear-progress-track-height: 0.5rem; diff --git a/apps/client/src/app/components/admin-settings/admin-settings.component.ts b/apps/client/src/app/components/admin-settings/admin-settings.component.ts index 3ff8370cd..e6fdb53cc 100644 --- a/apps/client/src/app/components/admin-settings/admin-settings.component.ts +++ b/apps/client/src/app/components/admin-settings/admin-settings.component.ts @@ -3,17 +3,14 @@ import { NotificationService } from '@ghostfolio/client/core/notification/notifi import { AdminService } from '@ghostfolio/client/services/admin.service'; import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; -import { - DEFAULT_LANGUAGE_CODE, - PROPERTY_API_KEY_GHOSTFOLIO -} from '@ghostfolio/common/config'; +import { PROPERTY_API_KEY_GHOSTFOLIO } from '@ghostfolio/common/config'; import { getDateFormatString } from '@ghostfolio/common/helper'; import { DataProviderGhostfolioStatusResponse, DataProviderInfo, User } from '@ghostfolio/common/interfaces'; -import { paths } from '@ghostfolio/common/paths'; +import { routes } from '@ghostfolio/common/routes'; import { ChangeDetectionStrategy, @@ -70,13 +67,12 @@ export class AdminSettingsComponent implements OnDestroy, OnInit { this.user = state.user; this.defaultDateFormat = getDateFormatString( - this.user?.settings?.locale + this.user.settings.locale ); - const languageCode = - this.user?.settings?.language ?? DEFAULT_LANGUAGE_CODE; + const languageCode = this.user.settings.language; - this.pricingUrl = `https://ghostfol.io/${languageCode}/${paths.pricing}`; + this.pricingUrl = `https://ghostfol.io/${languageCode}/${routes.pricing}`; this.changeDetectorRef.markForCheck(); } diff --git a/apps/client/src/app/components/admin-settings/admin-settings.module.ts b/apps/client/src/app/components/admin-settings/admin-settings.module.ts index 706f20a87..0a798df11 100644 --- a/apps/client/src/app/components/admin-settings/admin-settings.module.ts +++ b/apps/client/src/app/components/admin-settings/admin-settings.module.ts @@ -1,6 +1,6 @@ import { GfAdminPlatformModule } from '@ghostfolio/client/components/admin-platform/admin-platform.module'; import { GfAdminTagModule } from '@ghostfolio/client/components/admin-tag/admin-tag.module'; -import { GfAssetProfileIconComponent } from '@ghostfolio/client/components/asset-profile-icon/asset-profile-icon.component'; +import { GfEntityLogoComponent } from '@ghostfolio/ui/entity-logo'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { CommonModule } from '@angular/common'; @@ -20,7 +20,7 @@ import { AdminSettingsComponent } from './admin-settings.component'; CommonModule, GfAdminPlatformModule, GfAdminTagModule, - GfAssetProfileIconComponent, + GfEntityLogoComponent, GfPremiumIndicatorComponent, MatButtonModule, MatMenuModule, diff --git a/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts b/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts index c98f01fb7..74a2f85d6 100644 --- a/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts +++ b/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -12,8 +12,8 @@ import { parseDate } from '@ghostfolio/common/helper'; import { LineChartItem, User } from '@ghostfolio/common/interfaces'; -import { paths } from '@ghostfolio/common/paths'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { routes } from '@ghostfolio/common/routes'; import { ColorScheme } from '@ghostfolio/common/types'; import { @@ -65,8 +65,8 @@ export class BenchmarkComparatorComponent implements OnChanges, OnDestroy { public chart: Chart<'line'>; public hasPermissionToAccessAdminControl: boolean; public routerLinkAdminControlMarketData = [ - '/' + paths.adminControl, - paths.marketData + '/' + routes.adminControl, + routes.marketData ]; public constructor() { diff --git a/apps/client/src/app/components/header/header.component.html b/apps/client/src/app/components/header/header.component.html index 74737ca05..c1475d549 100644 --- a/apps/client/src/app/components/header/header.component.html +++ b/apps/client/src/app/components/header/header.component.html @@ -20,9 +20,11 @@ mat-flat-button [ngClass]="{ 'font-weight-bold': - currentRoute === paths.home || currentRoute === paths.zen, + currentRoute === internalRoutes.home.path || + currentRoute === internalRoutes.zen.path, 'text-decoration-underline': - currentRoute === paths.home || currentRoute === paths.zen + currentRoute === internalRoutes.home.path || + currentRoute === internalRoutes.zen.path }" [routerLink]="['/']" >OverviewPortfolioAccountsAdmin ControlOverviewPortfolioAccounts My Ghostfolio @@ -271,7 +278,7 @@ i18n mat-menu-item [ngClass]="{ - 'font-weight-bold': currentRoute === paths.adminControl + 'font-weight-bold': currentRoute === routes.adminControl }" [routerLink]="routerLinkAdminControl" >Admin Control(); diff --git a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts index 028866009..6e8fc2af5 100644 --- a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts +++ b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts @@ -13,8 +13,8 @@ import { LineChartItem, User } from '@ghostfolio/common/interfaces'; -import { paths } from '@ghostfolio/common/paths'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { internalRoutes } from '@ghostfolio/common/routes'; import { GfActivitiesTableComponent } from '@ghostfolio/ui/activities-table'; import { GfDataProviderCreditsComponent } from '@ghostfolio/ui/data-provider-credits'; import { GfHistoricalMarketDataEditorComponent } from '@ghostfolio/ui/historical-market-data-editor'; @@ -102,8 +102,8 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { public hasPermissionToCreateOwnTag: boolean; public hasPermissionToReadMarketDataOfOwnAssetProfile: boolean; public historicalDataItems: LineChartItem[]; - public investment: number; - public investmentPrecision = 2; + public investmentInBaseCurrencyWithCurrencyEffect: number; + public investmentInBaseCurrencyWithCurrencyEffectPrecision = 2; public marketDataItems: MarketData[] = []; public marketPrice: number; public marketPriceMax: number; @@ -233,7 +233,7 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { feeInBaseCurrency, firstBuyDate, historicalData, - investment, + investmentInBaseCurrencyWithCurrencyEffect, marketPrice, marketPriceMax, marketPriceMin, @@ -288,13 +288,15 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { } ); - this.investment = investment; + this.investmentInBaseCurrencyWithCurrencyEffect = + investmentInBaseCurrencyWithCurrencyEffect; if ( this.data.deviceType === 'mobile' && - this.investment >= NUMERICAL_PRECISION_THRESHOLD + this.investmentInBaseCurrencyWithCurrencyEffect >= + NUMERICAL_PRECISION_THRESHOLD ) { - this.investmentPrecision = 0; + this.investmentInBaseCurrencyWithCurrencyEffectPrecision = 0; } this.marketPrice = marketPrice; @@ -450,10 +452,9 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { if (state?.user) { this.user = state.user; - this.hasPermissionToCreateOwnTag = hasPermission( - this.user.permissions, - permissions.createOwnTag - ); + this.hasPermissionToCreateOwnTag = + hasPermission(this.user.permissions, permissions.createOwnTag) && + this.user?.settings?.isExperimentalFeatures; this.tagsAvailable = this.user?.tags?.map((tag) => { @@ -469,9 +470,12 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { } public onCloneActivity(aActivity: Activity) { - this.router.navigate(['/' + paths.portfolio, paths.activities], { - queryParams: { activityId: aActivity.id, createDialog: true } - }); + this.router.navigate( + internalRoutes.portfolio.subRoutes.activities.routerLink, + { + queryParams: { activityId: aActivity.id, createDialog: true } + } + ); this.dialogRef.close(); } @@ -511,9 +515,12 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { } public onUpdateActivity(aActivity: Activity) { - this.router.navigate(['/' + paths.portfolio, paths.activities], { - queryParams: { activityId: aActivity.id, editDialog: true } - }); + this.router.navigate( + internalRoutes.portfolio.subRoutes.activities.routerLink, + { + queryParams: { activityId: aActivity.id, editDialog: true } + } + ); this.dialogRef.close(); } diff --git a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html index 11898c44e..0f6c46a80 100644 --- a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html +++ b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -146,9 +146,9 @@ size="medium" [isCurrency]="true" [locale]="data.locale" - [precision]="investmentPrecision" + [precision]="investmentInBaseCurrencyWithCurrencyEffectPrecision" [unit]="data.baseCurrency" - [value]="investment" + [value]="investmentInBaseCurrencyWithCurrencyEffect" >Investment
@@ -388,9 +388,7 @@ ( HomeHoldingsComponent.DEFAULT_HOLDINGS_VIEW_MODE diff --git a/apps/client/src/app/components/home-market/home-market.html b/apps/client/src/app/components/home-market/home-market.html index 189c87c8f..a9bdf4e68 100644 --- a/apps/client/src/app/components/home-market/home-market.html +++ b/apps/client/src/app/components/home-market/home-market.html @@ -37,8 +37,10 @@ [user]="user" /> @if (benchmarks?.length > 0) { -
- +
+ Calculations are based on delayed market data and may not be displayed in real-time. diff --git a/apps/client/src/app/components/home-overview/home-overview.component.ts b/apps/client/src/app/components/home-overview/home-overview.component.ts index 783b7d1b9..776967c3d 100644 --- a/apps/client/src/app/components/home-overview/home-overview.component.ts +++ b/apps/client/src/app/components/home-overview/home-overview.component.ts @@ -10,8 +10,8 @@ import { PortfolioPerformance, User } from '@ghostfolio/common/interfaces'; -import { paths } from '@ghostfolio/common/paths'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { internalRoutes } from '@ghostfolio/common/routes'; import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { DeviceDetectorService } from 'ngx-device-detector'; @@ -37,12 +37,10 @@ export class HomeOverviewComponent implements OnDestroy, OnInit { public isLoadingPerformance = true; public performance: PortfolioPerformance; public precision = 2; - public routerLinkAccounts = ['/' + paths.accounts]; - public routerLinkPortfolio = ['/' + paths.portfolio]; - public routerLinkPortfolioActivities = [ - '/' + paths.portfolio, - paths.activities - ]; + public routerLinkAccounts = internalRoutes.accounts.routerLink; + public routerLinkPortfolio = internalRoutes.portfolio.routerLink; + public routerLinkPortfolioActivities = + internalRoutes.portfolio.subRoutes.activities.routerLink; public showDetails = false; public unit: string; public user: User; diff --git a/apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.component.ts b/apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.component.ts index 233493d13..df257a001 100644 --- a/apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.component.ts +++ b/apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.component.ts @@ -1,4 +1,4 @@ -import { paths } from '@ghostfolio/common/paths'; +import { routes } from '@ghostfolio/common/routes'; import { ChangeDetectionStrategy, @@ -28,7 +28,7 @@ export class SubscriptionInterstitialDialog implements OnInit { public remainingSkipButtonDelay = SubscriptionInterstitialDialog.SKIP_BUTTON_DELAY_IN_SECONDS; - public routerLinkPricing = ['/' + paths.pricing]; + public routerLinkPricing = ['/' + routes.pricing]; public variantIndex: number; private unsubscribeSubject = new Subject(); diff --git a/apps/client/src/app/components/user-account-membership/user-account-membership.component.ts b/apps/client/src/app/components/user-account-membership/user-account-membership.component.ts index 82810392c..27655915b 100644 --- a/apps/client/src/app/components/user-account-membership/user-account-membership.component.ts +++ b/apps/client/src/app/components/user-account-membership/user-account-membership.component.ts @@ -4,8 +4,8 @@ import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { getDateFormatString } from '@ghostfolio/common/helper'; import { User } from '@ghostfolio/common/interfaces'; -import { paths } from '@ghostfolio/common/paths'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { routes } from '@ghostfolio/common/routes'; import { ChangeDetectionStrategy, @@ -37,7 +37,7 @@ export class UserAccountMembershipComponent implements OnDestroy { public hasPermissionToUpdateUserSettings: boolean; public price: number; public priceId: string; - public routerLinkPricing = ['/' + paths.pricing]; + public routerLinkPricing = ['/' + routes.pricing]; public trySubscriptionMail = 'mailto:hi@ghostfol.io?Subject=Ghostfolio Premium Trial&body=Hello%0D%0DI am interested in Ghostfolio Premium. Can you please send me a coupon code to try it for some time?%0D%0DKind regards'; public user: User; diff --git a/apps/client/src/app/core/auth.guard.ts b/apps/client/src/app/core/auth.guard.ts index 87ef23d60..919a88bd5 100644 --- a/apps/client/src/app/core/auth.guard.ts +++ b/apps/client/src/app/core/auth.guard.ts @@ -1,7 +1,11 @@ import { DataService } from '@ghostfolio/client/services/data.service'; import { SettingsStorageService } from '@ghostfolio/client/services/settings-storage.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; -import { paths } from '@ghostfolio/common/paths'; +import { + internalRoutes, + publicRoutes, + routes +} from '@ghostfolio/common/routes'; import { Injectable } from '@angular/core'; import { @@ -15,17 +19,17 @@ import { catchError } from 'rxjs/operators'; @Injectable({ providedIn: 'root' }) export class AuthGuard { private static PUBLIC_PAGE_ROUTES = [ - `/${paths.about}`, - `/${paths.blog}`, - `/${paths.demo}`, - `/${paths.faq}`, - `/${paths.features}`, - `/${paths.markets}`, - `/${paths.openStartup}`, - `/${paths.pricing}`, - `/${paths.public}`, - `/${paths.register}`, - `/${paths.resources}` + `/${routes.about}`, + `/${routes.blog}`, + `/${routes.demo}`, + `/${routes.faq}`, + `/${routes.features}`, + `/${routes.markets}`, + `/${publicRoutes.openStartup.path}`, + `/${routes.pricing}`, + `/${routes.public}`, + `/${publicRoutes.register.path}`, + `/${routes.resources}` ]; public constructor( @@ -48,10 +52,10 @@ export class AuthGuard { .pipe( catchError(() => { if (utmSource === 'ios') { - this.router.navigate(['/' + paths.demo]); + this.router.navigate(['/' + routes.demo]); resolve(false); } else if (utmSource === 'trusted-web-activity') { - this.router.navigate(['/' + paths.register]); + this.router.navigate(publicRoutes.register.routerLink); resolve(false); } else if ( AuthGuard.PUBLIC_PAGE_ROUTES.some((publicPageRoute) => { @@ -62,7 +66,7 @@ export class AuthGuard { resolve(true); return EMPTY; } else if (state.url !== '/start') { - this.router.navigate(['/' + paths.start]); + this.router.navigate(['/' + routes.start]); resolve(false); return EMPTY; } @@ -88,26 +92,26 @@ export class AuthGuard { resolve(true); return; } else if ( - state.url.startsWith(`/${paths.home}`) && + state.url.startsWith(`/${internalRoutes.home.path}`) && user.settings.viewMode === 'ZEN' ) { - this.router.navigate(['/' + paths.zen]); + this.router.navigate(internalRoutes.zen.routerLink); resolve(false); return; - } else if (state.url.startsWith(`/${paths.start}`)) { + } else if (state.url.startsWith(`/${routes.start}`)) { if (user.settings.viewMode === 'ZEN') { - this.router.navigate(['/' + paths.zen]); + this.router.navigate(internalRoutes.zen.routerLink); } else { - this.router.navigate(['/' + paths.home]); + this.router.navigate(internalRoutes.home.routerLink); } resolve(false); return; } else if ( - state.url.startsWith(`/${paths.zen}`) && + state.url.startsWith(`/${internalRoutes.zen.path}`) && user.settings.viewMode === 'DEFAULT' ) { - this.router.navigate(['/' + paths.home]); + this.router.navigate(internalRoutes.home.routerLink); resolve(false); return; } diff --git a/apps/client/src/app/core/http-response.interceptor.ts b/apps/client/src/app/core/http-response.interceptor.ts index 32c5350bb..31e1c1947 100644 --- a/apps/client/src/app/core/http-response.interceptor.ts +++ b/apps/client/src/app/core/http-response.interceptor.ts @@ -2,7 +2,7 @@ import { DataService } from '@ghostfolio/client/services/data.service'; import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service'; import { WebAuthnService } from '@ghostfolio/client/services/web-authn.service'; import { InfoItem } from '@ghostfolio/common/interfaces'; -import { paths } from '@ghostfolio/common/paths'; +import { routes } from '@ghostfolio/common/routes'; import { HTTP_INTERCEPTORS, @@ -75,7 +75,7 @@ export class HttpResponseInterceptor implements HttpInterceptor { }); this.snackBarRef.onAction().subscribe(() => { - this.router.navigate(['/' + paths.pricing]); + this.router.navigate(['/' + routes.pricing]); }); } } else if (error.status === StatusCodes.INTERNAL_SERVER_ERROR) { @@ -111,7 +111,7 @@ export class HttpResponseInterceptor implements HttpInterceptor { } else if (error.status === StatusCodes.UNAUTHORIZED) { if (!error.url.includes('/data-providers/ghostfolio/status')) { if (this.webAuthnService.isEnabled()) { - this.router.navigate(['/' + paths.webauthn]); + this.router.navigate(['/' + routes.webauthn]); } else { this.tokenStorageService.signOut(); } diff --git a/apps/client/src/app/pages/about/about-page-routing.module.ts b/apps/client/src/app/pages/about/about-page-routing.module.ts index d8d70a2da..d17612584 100644 --- a/apps/client/src/app/pages/about/about-page-routing.module.ts +++ b/apps/client/src/app/pages/about/about-page-routing.module.ts @@ -1,5 +1,5 @@ import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; -import { paths } from '@ghostfolio/common/paths'; +import { routes as ghostfolioRoutes } from '@ghostfolio/common/routes'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; @@ -18,35 +18,35 @@ const routes: Routes = [ ) }, { - path: paths.changelog, + path: ghostfolioRoutes.changelog, loadChildren: () => import('./changelog/changelog-page.module').then( (m) => m.ChangelogPageModule ) }, { - path: paths.license, + path: ghostfolioRoutes.license, loadChildren: () => import('./license/license-page.module').then( (m) => m.LicensePageModule ) }, { - path: paths.ossFriends, + path: ghostfolioRoutes.ossFriends, loadChildren: () => import('./oss-friends/oss-friends-page.module').then( (m) => m.OpenSourceSoftwareFriendsPageModule ) }, { - path: paths.privacyPolicy, + path: ghostfolioRoutes.privacyPolicy, loadChildren: () => import('./privacy-policy/privacy-policy-page.module').then( (m) => m.PrivacyPolicyPageModule ) }, { - path: paths.termsOfService, + path: ghostfolioRoutes.termsOfService, loadChildren: () => import('./terms-of-service/terms-of-service-page.module').then( (m) => m.TermsOfServicePageModule diff --git a/apps/client/src/app/pages/about/about-page.component.ts b/apps/client/src/app/pages/about/about-page.component.ts index deeffa166..de307cbf9 100644 --- a/apps/client/src/app/pages/about/about-page.component.ts +++ b/apps/client/src/app/pages/about/about-page.component.ts @@ -1,8 +1,8 @@ import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { TabConfiguration, User } from '@ghostfolio/common/interfaces'; -import { paths } from '@ghostfolio/common/paths'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { routes } from '@ghostfolio/common/routes'; import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { DeviceDetectorService } from 'ngx-device-detector'; @@ -44,17 +44,17 @@ export class AboutPageComponent implements OnDestroy, OnInit { { iconName: 'information-circle-outline', label: $localize`About`, - path: ['/' + paths.about] + path: ['/' + routes.about] }, { iconName: 'sparkles-outline', label: $localize`Changelog`, - path: ['/' + paths.about, paths.changelog] + path: ['/' + routes.about, routes.changelog] }, { iconName: 'ribbon-outline', label: $localize`License`, - path: ['/' + paths.about, paths.license], + path: ['/' + routes.about, routes.license], showCondition: !this.hasPermissionForSubscription } ]; @@ -63,14 +63,14 @@ export class AboutPageComponent implements OnDestroy, OnInit { this.tabs.push({ iconName: 'shield-checkmark-outline', label: $localize`Privacy Policy`, - path: ['/' + paths.about, paths.privacyPolicy], + path: ['/' + routes.about, routes.privacyPolicy], showCondition: this.hasPermissionForSubscription }); this.tabs.push({ iconName: 'document-text-outline', label: $localize`Terms of Service`, - path: ['/' + paths.about, paths.termsOfService], + path: ['/' + routes.about, routes.termsOfService], showCondition: this.hasPermissionForSubscription }); @@ -82,7 +82,7 @@ export class AboutPageComponent implements OnDestroy, OnInit { this.tabs.push({ iconName: 'happy-outline', label: 'OSS Friends', - path: ['/' + paths.about, paths.ossFriends] + path: ['/' + routes.about, routes.ossFriends] }); }); } 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 ec135e4d3..c4ce08aee 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 @@ -1,8 +1,8 @@ import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { User } from '@ghostfolio/common/interfaces'; -import { paths } from '@ghostfolio/common/paths'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { publicRoutes, routes } from '@ghostfolio/common/routes'; import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { Subject } from 'rxjs'; @@ -18,10 +18,10 @@ export class AboutOverviewPageComponent implements OnDestroy, OnInit { public hasPermissionForStatistics: boolean; public hasPermissionForSubscription: boolean; public isLoggedIn: boolean; - public routerLinkBlog = ['/' + paths.blog]; - public routerLinkFaq = ['/' + paths.faq]; - public routerLinkFeatures = ['/' + paths.features]; - public routerLinkOpenStartup = ['/' + paths.openStartup]; + public routerLinkBlog = ['/' + routes.blog]; + public routerLinkFaq = ['/' + routes.faq]; + public routerLinkFeatures = ['/' + routes.features]; + public routerLinkOpenStartup = publicRoutes.openStartup.routerLink; public user: User; private unsubscribeSubject = new Subject(); diff --git a/apps/client/src/app/pages/accounts/accounts-page-routing.module.ts b/apps/client/src/app/pages/accounts/accounts-page-routing.module.ts index 59c708006..d34ab48fb 100644 --- a/apps/client/src/app/pages/accounts/accounts-page-routing.module.ts +++ b/apps/client/src/app/pages/accounts/accounts-page-routing.module.ts @@ -1,4 +1,5 @@ import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; +import { internalRoutes } from '@ghostfolio/common/routes'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; @@ -10,7 +11,7 @@ const routes: Routes = [ canActivate: [AuthGuard], component: AccountsPageComponent, path: '', - title: $localize`Accounts` + title: internalRoutes.accounts.title } ]; diff --git a/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html b/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html index af97bfce3..a38baa6ec 100644 --- a/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html +++ b/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -61,7 +61,7 @@ ) { -
@if (account.Platform?.url) { -
@if (account.Platform?.url) { - import('./saas/saas-page.module').then((m) => m.SaasPageModule) }, { - path: paths.selfHosting, + path: ghostfolioRoutes.selfHosting, loadChildren: () => import('./self-hosting/self-hosting-page.module').then( (m) => m.SelfHostingPageModule 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 270719cf3..8bfbdcbcc 100644 --- a/apps/client/src/app/pages/faq/faq-page.component.ts +++ b/apps/client/src/app/pages/faq/faq-page.component.ts @@ -1,7 +1,7 @@ import { DataService } from '@ghostfolio/client/services/data.service'; import { TabConfiguration } from '@ghostfolio/common/interfaces'; -import { paths } from '@ghostfolio/common/paths'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { routes } from '@ghostfolio/common/routes'; import { Component, OnDestroy, OnInit } from '@angular/core'; import { DeviceDetectorService } from 'ngx-device-detector'; @@ -36,18 +36,18 @@ export class FaqPageComponent implements OnDestroy, OnInit { { iconName: 'reader-outline', label: $localize`General`, - path: ['/' + paths.faq] + path: ['/' + routes.faq] }, { iconName: 'cloudy-outline', label: $localize`Cloud` + ' (SaaS)', - path: ['/' + paths.faq, paths.saas], + path: ['/' + routes.faq, routes.saas], showCondition: this.hasPermissionForSubscription }, { iconName: 'server-outline', label: $localize`Self-Hosting`, - path: ['/' + paths.faq, paths.selfHosting] + path: ['/' + routes.faq, routes.selfHosting] } ]; } diff --git a/apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts b/apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts index 4e5ed76b9..a59bb7160 100644 --- a/apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts +++ b/apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts @@ -1,6 +1,6 @@ import { UserService } from '@ghostfolio/client/services/user/user.service'; import { User } from '@ghostfolio/common/interfaces'; -import { paths } from '@ghostfolio/common/paths'; +import { routes } from '@ghostfolio/common/routes'; import { ChangeDetectorRef, Component, OnDestroy } from '@angular/core'; import { Subject, takeUntil } from 'rxjs'; @@ -13,8 +13,8 @@ import { Subject, takeUntil } from 'rxjs'; standalone: false }) export class FaqOverviewPageComponent implements OnDestroy { - public pricingUrl = `https://ghostfol.io/${document.documentElement.lang}/${paths.pricing}`; - public routerLinkFeatures = ['/' + paths.features]; + public pricingUrl = `https://ghostfol.io/${document.documentElement.lang}/${routes.pricing}`; + public routerLinkFeatures = ['/' + routes.features]; public user: User; private unsubscribeSubject = new Subject(); diff --git a/apps/client/src/app/pages/faq/overview/faq-overview-page.html b/apps/client/src/app/pages/faq/overview/faq-overview-page.html index f8fd62eb0..bc7f6ba37 100644 --- a/apps/client/src/app/pages/faq/overview/faq-overview-page.html +++ b/apps/client/src/app/pages/faq/overview/faq-overview-page.html @@ -40,6 +40,21 @@ here. + + + Which calculation method does Ghostfolio use for + performance? + + Ghostfolio uses the Return on Average Investment (ROAI) + calculation method based on the average amount of capital invested + over time. ROAI aims to provide a more insightful view of investment + performance than simpler approaches, especially when contributions are + made over time. + Can I use Ghostfolio anonymously? diff --git a/apps/client/src/app/pages/faq/saas/saas-page.component.ts b/apps/client/src/app/pages/faq/saas/saas-page.component.ts index b6e6b7002..7f7e2c709 100644 --- a/apps/client/src/app/pages/faq/saas/saas-page.component.ts +++ b/apps/client/src/app/pages/faq/saas/saas-page.component.ts @@ -1,6 +1,6 @@ import { UserService } from '@ghostfolio/client/services/user/user.service'; import { User } from '@ghostfolio/common/interfaces'; -import { paths } from '@ghostfolio/common/paths'; +import { publicRoutes, routes } from '@ghostfolio/common/routes'; import { ChangeDetectorRef, Component, OnDestroy } from '@angular/core'; import { Subject, takeUntil } from 'rxjs'; @@ -13,11 +13,14 @@ import { Subject, takeUntil } from 'rxjs'; standalone: false }) export class SaasPageComponent implements OnDestroy { - public pricingUrl = `https://ghostfol.io/${document.documentElement.lang}/${paths.pricing}`; - public routerLinkAccount = ['/' + paths.account]; - public routerLinkAccountMembership = ['/' + paths.account, paths.membership]; - public routerLinkMarkets = ['/' + paths.markets]; - public routerLinkRegister = ['/' + paths.register]; + public pricingUrl = `https://ghostfol.io/${document.documentElement.lang}/${routes.pricing}`; + public routerLinkAccount = ['/' + routes.account]; + public routerLinkAccountMembership = [ + '/' + routes.account, + routes.membership + ]; + public routerLinkMarkets = ['/' + routes.markets]; + public routerLinkRegister = publicRoutes.register.routerLink; public user: User; private unsubscribeSubject = new Subject(); 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 1b7836755..864db7af3 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,4 +1,4 @@ -import { paths } from '@ghostfolio/common/paths'; +import { routes } from '@ghostfolio/common/routes'; import { Component, OnDestroy } from '@angular/core'; import { Subject } from 'rxjs'; @@ -11,7 +11,7 @@ import { Subject } from 'rxjs'; standalone: false }) export class SelfHostingPageComponent implements OnDestroy { - public pricingUrl = `https://ghostfol.io/${document.documentElement.lang}/${paths.pricing}`; + public pricingUrl = `https://ghostfol.io/${document.documentElement.lang}/${routes.pricing}`; private unsubscribeSubject = new Subject(); 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 1057516bd..abe5cab0f 100644 --- a/apps/client/src/app/pages/features/features-page.component.ts +++ b/apps/client/src/app/pages/features/features-page.component.ts @@ -1,8 +1,8 @@ import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { InfoItem, User } from '@ghostfolio/common/interfaces'; -import { paths } from '@ghostfolio/common/paths'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { publicRoutes, routes } from '@ghostfolio/common/routes'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { ChangeDetectorRef, Component, OnDestroy } from '@angular/core'; @@ -26,8 +26,8 @@ import { Subject, takeUntil } from 'rxjs'; export class GfFeaturesPageComponent implements OnDestroy { public hasPermissionForSubscription: boolean; public info: InfoItem; - public routerLinkRegister = ['/' + paths.register]; - public routerLinkResources = ['/' + paths.resources]; + public routerLinkRegister = publicRoutes.register.routerLink; + public routerLinkResources = ['/' + routes.resources]; public user: User; private unsubscribeSubject = new Subject(); diff --git a/apps/client/src/app/pages/home/home-page-routing.module.ts b/apps/client/src/app/pages/home/home-page-routing.module.ts index a28ea864f..7f00ceabe 100644 --- a/apps/client/src/app/pages/home/home-page-routing.module.ts +++ b/apps/client/src/app/pages/home/home-page-routing.module.ts @@ -4,7 +4,10 @@ import { HomeOverviewComponent } from '@ghostfolio/client/components/home-overvi import { HomeSummaryComponent } from '@ghostfolio/client/components/home-summary/home-summary.component'; import { HomeWatchlistComponent } from '@ghostfolio/client/components/home-watchlist/home-watchlist.component'; import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; -import { paths } from '@ghostfolio/common/paths'; +import { + routes as ghostfolioRoutes, + internalRoutes +} from '@ghostfolio/common/routes'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; @@ -20,28 +23,29 @@ const routes: Routes = [ component: HomeOverviewComponent }, { - path: paths.holdings, + path: internalRoutes.home.subRoutes.holdings.path, component: HomeHoldingsComponent, - title: $localize`Holdings` + title: internalRoutes.home.subRoutes.holdings.title }, { - path: paths.summary, + path: ghostfolioRoutes.summary, component: HomeSummaryComponent, title: $localize`Summary` }, { - path: paths.market, + path: ghostfolioRoutes.market, component: HomeMarketComponent, title: $localize`Markets` }, { - path: paths.watchlist, + path: ghostfolioRoutes.watchlist, component: HomeWatchlistComponent, title: $localize`Watchlist` } ], component: HomePageComponent, - path: '' + path: '', + title: internalRoutes.home.title } ]; 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 ecb8ff0be..870930b4e 100644 --- a/apps/client/src/app/pages/home/home-page.component.ts +++ b/apps/client/src/app/pages/home/home-page.component.ts @@ -1,7 +1,7 @@ import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { TabConfiguration, User } from '@ghostfolio/common/interfaces'; -import { paths } from '@ghostfolio/common/paths'; +import { internalRoutes, routes } from '@ghostfolio/common/routes'; import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { DeviceDetectorService } from 'ngx-device-detector'; @@ -36,28 +36,28 @@ export class HomePageComponent implements OnDestroy, OnInit { this.tabs = [ { iconName: 'analytics-outline', - label: $localize`Overview`, - path: ['/' + paths.home] + label: internalRoutes.home.title, + path: internalRoutes.home.routerLink }, { iconName: 'wallet-outline', - label: $localize`Holdings`, - path: ['/' + paths.home, paths.holdings] + label: internalRoutes.home.subRoutes.holdings.title, + path: internalRoutes.home.subRoutes.holdings.routerLink }, { iconName: 'reader-outline', label: $localize`Summary`, - path: ['/' + paths.home, paths.summary] + path: ['/' + internalRoutes.home.path, routes.summary] }, { iconName: 'bookmark-outline', label: $localize`Watchlist`, - path: ['/' + paths.home, paths.watchlist] + path: ['/' + internalRoutes.home.path, routes.watchlist] }, { iconName: 'newspaper-outline', label: $localize`Markets`, - path: ['/' + paths.home, paths.market] + path: ['/' + internalRoutes.home.path, routes.market] } ]; diff --git a/apps/client/src/app/pages/i18n/i18n-page.html b/apps/client/src/app/pages/i18n/i18n-page.html index b23129c45..565d5b68f 100644 --- a/apps/client/src/app/pages/i18n/i18n-page.html +++ b/apps/client/src/app/pages/i18n/i18n-page.html @@ -11,6 +11,22 @@ performance, portfolio, software, stock, trading, wealth, web3
  • My Account
  • +
  • Emergency Fund: Set up
  • +
  • + No emergency fund has been set up +
  • +
  • + An emergency fund has been set up +
  • +
  • Fee Ratio
  • +
  • + The fees do exceed ${thresholdMax}% of your initial investment + (${feeRatio}%) +
  • +
  • + The fees do not exceed ${thresholdMax}% of your initial + investment (${feeRatio}%) +
  • Open Source Wealth Management Software
  • diff --git a/apps/client/src/app/pages/landing/landing-page.component.ts b/apps/client/src/app/pages/landing/landing-page.component.ts index 9777a6c01..bdfff38fb 100644 --- a/apps/client/src/app/pages/landing/landing-page.component.ts +++ b/apps/client/src/app/pages/landing/landing-page.component.ts @@ -1,7 +1,7 @@ import { DataService } from '@ghostfolio/client/services/data.service'; import { Statistics } from '@ghostfolio/common/interfaces'; -import { paths } from '@ghostfolio/common/paths'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { publicRoutes, routes } from '@ghostfolio/common/routes'; import { Component, OnDestroy, OnInit } from '@angular/core'; import { format } from 'date-fns'; @@ -25,10 +25,10 @@ export class LandingPageComponent implements OnDestroy, OnInit { public hasPermissionForStatistics: boolean; public hasPermissionForSubscription: boolean; public hasPermissionToCreateUser: boolean; - public routerLinkAbout = ['/' + paths.about]; - public routerLinkDemo = ['/' + paths.demo]; - public routerLinkOpenStartup = ['/' + paths.openStartup]; - public routerLinkRegister = ['/' + paths.register]; + public routerLinkAbout = ['/' + routes.about]; + public routerLinkDemo = ['/' + routes.demo]; + public routerLinkOpenStartup = publicRoutes.openStartup.routerLink; + public routerLinkRegister = publicRoutes.register.routerLink; public statistics: Statistics; public testimonials = [ { diff --git a/apps/client/src/app/pages/open/open-page-routing.module.ts b/apps/client/src/app/pages/open/open-page-routing.module.ts index b9db4ab10..cd113d361 100644 --- a/apps/client/src/app/pages/open/open-page-routing.module.ts +++ b/apps/client/src/app/pages/open/open-page-routing.module.ts @@ -1,4 +1,5 @@ import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; +import { publicRoutes } from '@ghostfolio/common/routes'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; @@ -10,7 +11,7 @@ const routes: Routes = [ canActivate: [AuthGuard], component: OpenPageComponent, path: '', - title: 'Open Startup' + title: publicRoutes.openStartup.title } ]; diff --git a/apps/client/src/app/pages/portfolio/activities/activities-page-routing.module.ts b/apps/client/src/app/pages/portfolio/activities/activities-page-routing.module.ts index 00962d563..38a594c99 100644 --- a/apps/client/src/app/pages/portfolio/activities/activities-page-routing.module.ts +++ b/apps/client/src/app/pages/portfolio/activities/activities-page-routing.module.ts @@ -1,4 +1,5 @@ import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; +import { internalRoutes } from '@ghostfolio/common/routes'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; @@ -10,7 +11,7 @@ const routes: Routes = [ canActivate: [AuthGuard], component: ActivitiesPageComponent, path: '', - title: $localize`Activities` + title: internalRoutes.portfolio.subRoutes.activities.title } ]; diff --git a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts index 5f651195a..4982125fe 100644 --- a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts +++ b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts @@ -1,6 +1,8 @@ import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto'; import { UpdateOrderDto } from '@ghostfolio/api/app/order/update-order.dto'; +import { UserService } from '@ghostfolio/client/services/user/user.service'; import { getDateFormatString } from '@ghostfolio/common/helper'; +import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { translate } from '@ghostfolio/ui/i18n'; import { @@ -42,6 +44,7 @@ export class CreateOrUpdateActivityDialog implements OnDestroy { public currencyOfAssetProfile: string; public currentMarketPrice = null; public defaultDateFormat: string; + public hasPermissionToCreateOwnTag: boolean; public isLoading = false; public isToday = isToday; public mode: 'create' | 'update'; @@ -60,11 +63,15 @@ export class CreateOrUpdateActivityDialog implements OnDestroy { private dateAdapter: DateAdapter, public dialogRef: MatDialogRef, private formBuilder: FormBuilder, - @Inject(MAT_DATE_LOCALE) private locale: string + @Inject(MAT_DATE_LOCALE) private locale: string, + private userService: UserService ) {} public ngOnInit() { this.currencyOfAssetProfile = this.data.activity?.SymbolProfile?.currency; + this.hasPermissionToCreateOwnTag = + this.data.user?.settings?.isExperimentalFeatures && + hasPermission(this.data.user?.permissions, permissions.createOwnTag); this.locale = this.data.user?.settings?.locale; this.mode = this.data.activity?.id ? 'update' : 'create'; @@ -219,6 +226,34 @@ export class CreateOrUpdateActivityDialog implements OnDestroy { this.changeDetectorRef.markForCheck(); }); + this.activityForm.get('tags').valueChanges.subscribe((tags: Tag[]) => { + const newTag = tags.find(({ id }) => { + return id === undefined; + }); + + if (newTag && this.hasPermissionToCreateOwnTag) { + this.dataService + .postTag({ ...newTag, userId: this.data.user.id }) + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe((tag) => { + this.activityForm.get('tags').setValue( + tags.map((currentTag) => { + if (currentTag.id === undefined) { + return tag; + } + + return currentTag; + }) + ); + + this.userService + .get(true) + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe(); + }); + } + }); + this.activityForm .get('type') .valueChanges.pipe(takeUntil(this.unsubscribeSubject)) diff --git a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html index 08e1b5162..a1ca6e323 100644 --- a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html +++ b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -94,7 +94,7 @@
    @if (account.Platform?.url) { -
    -
    +
    import('./activities/activities-page.module').then( (m) => m.ActivitiesPageModule ) }, { - path: paths.allocations, + path: ghostfolioRoutes.allocations, loadChildren: () => import('./allocations/allocations-page.module').then( (m) => m.AllocationsPageModule ) }, { - path: paths.fire, + path: ghostfolioRoutes.fire, loadChildren: () => import('./fire/fire-page.module').then((m) => m.FirePageModule) }, { - path: paths.xRay, + path: ghostfolioRoutes.xRay, loadChildren: () => import('./x-ray/x-ray-page.module').then((m) => m.XRayPageModule) } ], component: PortfolioPageComponent, path: '', - title: $localize`Portfolio` + title: internalRoutes.portfolio.title } ]; 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 926ec7a8b..8e0748f64 100644 --- a/apps/client/src/app/pages/portfolio/portfolio-page.component.ts +++ b/apps/client/src/app/pages/portfolio/portfolio-page.component.ts @@ -1,6 +1,6 @@ import { UserService } from '@ghostfolio/client/services/user/user.service'; import { TabConfiguration, User } from '@ghostfolio/common/interfaces'; -import { paths } from '@ghostfolio/common/paths'; +import { internalRoutes, routes } from '@ghostfolio/common/routes'; import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { DeviceDetectorService } from 'ngx-device-detector'; @@ -34,27 +34,27 @@ export class PortfolioPageComponent implements OnDestroy, OnInit { { iconName: 'analytics-outline', label: $localize`Analysis`, - path: ['/' + paths.portfolio] + path: internalRoutes.portfolio.routerLink }, { iconName: 'swap-vertical-outline', - label: $localize`Activities`, - path: ['/' + paths.portfolio, paths.activities] + label: internalRoutes.portfolio.subRoutes.activities.title, + path: internalRoutes.portfolio.subRoutes.activities.routerLink }, { iconName: 'pie-chart-outline', label: $localize`Allocations`, - path: ['/' + paths.portfolio, paths.allocations] + path: ['/' + internalRoutes.portfolio.path, routes.allocations] }, { iconName: 'calculator-outline', label: 'FIRE ', - path: ['/' + paths.portfolio, paths.fire] + path: ['/' + internalRoutes.portfolio.path, routes.fire] }, { iconName: 'scan-outline', label: 'X-ray', - path: ['/' + paths.portfolio, paths.xRay] + path: ['/' + internalRoutes.portfolio.path, routes.xRay] } ]; this.user = state.user; diff --git a/apps/client/src/app/pages/pricing/pricing-page.component.ts b/apps/client/src/app/pages/pricing/pricing-page.component.ts index 68573dde5..1e9001632 100644 --- a/apps/client/src/app/pages/pricing/pricing-page.component.ts +++ b/apps/client/src/app/pages/pricing/pricing-page.component.ts @@ -2,8 +2,8 @@ import { NotificationService } from '@ghostfolio/client/core/notification/notifi import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { User } from '@ghostfolio/common/interfaces'; -import { paths } from '@ghostfolio/common/paths'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { publicRoutes, routes } from '@ghostfolio/common/routes'; import { translate } from '@ghostfolio/ui/i18n'; import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; @@ -41,8 +41,8 @@ export class PricingPageComponent implements OnDestroy, OnInit { public professionalDataProviderTooltipPremium = translate( 'PROFESSIONAL_DATA_PROVIDER_TOOLTIP_PREMIUM' ); - public routerLinkFeatures = ['/' + paths.features]; - public routerLinkRegister = ['/' + paths.register]; + public routerLinkFeatures = ['/' + routes.features]; + public routerLinkRegister = publicRoutes.register.routerLink; public user: User; private unsubscribeSubject = new Subject(); diff --git a/apps/client/src/app/pages/register/register-page-routing.module.ts b/apps/client/src/app/pages/register/register-page-routing.module.ts index 80ab69b62..81af9f09f 100644 --- a/apps/client/src/app/pages/register/register-page-routing.module.ts +++ b/apps/client/src/app/pages/register/register-page-routing.module.ts @@ -1,4 +1,5 @@ import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; +import { publicRoutes } from '@ghostfolio/common/routes'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; @@ -10,7 +11,7 @@ const routes: Routes = [ canActivate: [AuthGuard], component: RegisterPageComponent, path: '', - title: $localize`Registration` + title: publicRoutes.register.title } ]; diff --git a/apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.component.ts b/apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.component.ts index 5b7de607d..fb35a357d 100644 --- a/apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.component.ts +++ b/apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.component.ts @@ -1,5 +1,5 @@ import { DataService } from '@ghostfolio/client/services/data.service'; -import { paths } from '@ghostfolio/common/paths'; +import { routes } from '@ghostfolio/common/routes'; import { ChangeDetectionStrategy, @@ -31,8 +31,8 @@ export class ShowAccessTokenDialog { public isDisclaimerChecked = false; public role: string; public routerLinkAboutTermsOfService = [ - '/' + paths.about, - paths.termsOfService + '/' + routes.about, + routes.termsOfService ]; private unsubscribeSubject = new Subject(); diff --git a/apps/client/src/app/pages/resources/glossary/resources-glossary.component.ts b/apps/client/src/app/pages/resources/glossary/resources-glossary.component.ts index 2734707d1..f05b353d2 100644 --- a/apps/client/src/app/pages/resources/glossary/resources-glossary.component.ts +++ b/apps/client/src/app/pages/resources/glossary/resources-glossary.component.ts @@ -1,7 +1,7 @@ import { DataService } from '@ghostfolio/client/services/data.service'; import { InfoItem } from '@ghostfolio/common/interfaces'; -import { paths } from '@ghostfolio/common/paths'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { routes } from '@ghostfolio/common/routes'; import { Component, OnInit } from '@angular/core'; @@ -15,8 +15,8 @@ export class ResourcesGlossaryPageComponent implements OnInit { public hasPermissionForSubscription: boolean; public info: InfoItem; public routerLinkResourcesPersonalFinanceTools = [ - '/' + paths.resources, - paths.personalFinanceTools + '/' + routes.resources, + routes.personalFinanceTools ]; public constructor(private dataService: DataService) { diff --git a/apps/client/src/app/pages/resources/overview/resources-overview.component.ts b/apps/client/src/app/pages/resources/overview/resources-overview.component.ts index cca9aa9bf..6cf136ed9 100644 --- a/apps/client/src/app/pages/resources/overview/resources-overview.component.ts +++ b/apps/client/src/app/pages/resources/overview/resources-overview.component.ts @@ -1,4 +1,4 @@ -import { paths } from '@ghostfolio/common/paths'; +import { routes } from '@ghostfolio/common/routes'; import { Component } from '@angular/core'; @@ -14,25 +14,25 @@ export class ResourcesOverviewComponent { title: 'Frequently Asked Questions (FAQ)', description: 'Find quick answers to commonly asked questions about Ghostfolio in our Frequently Asked Questions (FAQ) section.', - link: ['/' + paths.faq] + link: ['/' + routes.faq] }, { title: 'Guides', description: 'Explore our guides to help you get started with investing and managing your finances.', - link: ['/' + paths.resources, paths.guides] + link: ['/' + routes.resources, routes.guides] }, { title: 'Markets', description: 'Access various market resources and tools to stay informed about financial markets.', - link: ['/' + paths.resources, paths.markets] + link: ['/' + routes.resources, routes.markets] }, { title: 'Glossary', description: 'Learn key financial terms and concepts in our comprehensive glossary.', - link: ['/' + paths.resources, paths.glossary] + link: ['/' + routes.resources, routes.glossary] } ]; } diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page-routing.module.ts b/apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page-routing.module.ts index 2b5146d89..921b7340d 100644 --- a/apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page-routing.module.ts +++ b/apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page-routing.module.ts @@ -1,6 +1,6 @@ import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; -import { paths } from '@ghostfolio/common/paths'; import { personalFinanceTools } from '@ghostfolio/common/personal-finance-tools'; +import { routes as ghostfolioRoutes } from '@ghostfolio/common/routes'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; @@ -24,7 +24,7 @@ const routes: Routes = [ return GfProductPageComponent; } ), - path: `${paths.openSourceAlternativeTo}-${alias ?? key}`, + path: `${ghostfolioRoutes.openSourceAlternativeTo}-${alias ?? key}`, title: $localize`Open Source Alternative to ${name}` }; }) 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 f2b6a6541..e6394098c 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,5 +1,5 @@ -import { paths } from '@ghostfolio/common/paths'; import { personalFinanceTools } from '@ghostfolio/common/personal-finance-tools'; +import { routes } from '@ghostfolio/common/routes'; import { Component, OnDestroy } from '@angular/core'; import { Subject } from 'rxjs'; @@ -12,12 +12,12 @@ import { Subject } from 'rxjs'; standalone: false }) export class PersonalFinanceToolsPageComponent implements OnDestroy { - public pathAlternativeTo = paths.openSourceAlternativeTo + '-'; - public pathResources = '/' + paths.resources; + public pathAlternativeTo = routes.openSourceAlternativeTo + '-'; + public pathResources = '/' + routes.resources; public personalFinanceTools = personalFinanceTools.sort((a, b) => { return a.name.localeCompare(b.name, undefined, { sensitivity: 'base' }); }); - public routerLinkAbout = ['/' + paths.about]; + public routerLinkAbout = ['/' + routes.about]; private unsubscribeSubject = new Subject(); diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts b/apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts index 6c3e8b551..9024acc7e 100644 --- a/apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts +++ b/apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -1,7 +1,7 @@ import { DataService } from '@ghostfolio/client/services/data.service'; import { Product } from '@ghostfolio/common/interfaces'; -import { paths } from '@ghostfolio/common/paths'; import { personalFinanceTools } from '@ghostfolio/common/personal-finance-tools'; +import { routes } from '@ghostfolio/common/routes'; import { translate } from '@ghostfolio/ui/i18n'; import { Component, OnInit } from '@angular/core'; @@ -20,11 +20,11 @@ export class GfProductPageComponent implements OnInit { public price: number; public product1: Product; public product2: Product; - public routerLinkAbout = ['/' + paths.about]; - public routerLinkFeatures = ['/' + paths.features]; + public routerLinkAbout = ['/' + routes.about]; + public routerLinkFeatures = ['/' + routes.features]; public routerLinkResourcesPersonalFinanceTools = [ - '/' + paths.resources, - paths.personalFinanceTools + '/' + routes.resources, + routes.personalFinanceTools ]; public tags: string[]; diff --git a/apps/client/src/app/pages/resources/resources-page-routing.module.ts b/apps/client/src/app/pages/resources/resources-page-routing.module.ts index b7c1734be..fe226a896 100644 --- a/apps/client/src/app/pages/resources/resources-page-routing.module.ts +++ b/apps/client/src/app/pages/resources/resources-page-routing.module.ts @@ -1,5 +1,5 @@ import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; -import { paths } from '@ghostfolio/common/paths'; +import { routes as ghostfolioRoutes } from '@ghostfolio/common/routes'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; @@ -19,27 +19,27 @@ const routes: Routes = [ ) }, { - path: paths.glossary, + path: ghostfolioRoutes.glossary, loadChildren: () => import('./glossary/resources-glossary.module').then( (m) => m.ResourcesGlossaryPageModule ) }, { - path: paths.guides, + path: ghostfolioRoutes.guides, loadChildren: () => import('./guides/resources-guides.module').then( (m) => m.ResourcesGuidesModule ) }, { - path: paths.markets, + path: ghostfolioRoutes.markets, loadChildren: () => import('./markets/resources-markets.module').then( (m) => m.ResourcesMarketsModule ) }, - ...[paths.personalFinanceTools].map((path) => ({ + ...[ghostfolioRoutes.personalFinanceTools].map((path) => ({ path, loadChildren: () => import( diff --git a/apps/client/src/app/pages/resources/resources-page.component.ts b/apps/client/src/app/pages/resources/resources-page.component.ts index ba38fac18..907779ed8 100644 --- a/apps/client/src/app/pages/resources/resources-page.component.ts +++ b/apps/client/src/app/pages/resources/resources-page.component.ts @@ -1,4 +1,4 @@ -import { paths } from '@ghostfolio/common/paths'; +import { routes } from '@ghostfolio/common/routes'; import { Component, OnInit } from '@angular/core'; import { DeviceDetectorService } from 'ngx-device-detector'; @@ -20,17 +20,17 @@ export class ResourcesPageComponent implements OnInit { iconName: 'reader-outline' }, { - path: paths.guides, + path: routes.guides, label: $localize`Guides`, iconName: 'book-outline' }, { - path: paths.markets, + path: routes.markets, label: $localize`Markets`, iconName: 'newspaper-outline' }, { - path: paths.glossary, + path: routes.glossary, label: $localize`Glossary`, iconName: 'library-outline' } diff --git a/apps/client/src/app/pages/user-account/user-account-page-routing.module.ts b/apps/client/src/app/pages/user-account/user-account-page-routing.module.ts index 003d0df75..9701c20a2 100644 --- a/apps/client/src/app/pages/user-account/user-account-page-routing.module.ts +++ b/apps/client/src/app/pages/user-account/user-account-page-routing.module.ts @@ -2,7 +2,7 @@ import { UserAccountAccessComponent } from '@ghostfolio/client/components/user-a import { UserAccountMembershipComponent } from '@ghostfolio/client/components/user-account-membership/user-account-membership.component'; import { UserAccountSettingsComponent } from '@ghostfolio/client/components/user-account-settings/user-account-settings.component'; import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; -import { paths } from '@ghostfolio/common/paths'; +import { routes as ghostfolioRoutes } from '@ghostfolio/common/routes'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; @@ -19,12 +19,12 @@ const routes: Routes = [ title: $localize`Settings` }, { - path: paths.membership, + path: ghostfolioRoutes.membership, component: UserAccountMembershipComponent, title: $localize`Membership` }, { - path: paths.access, + path: ghostfolioRoutes.access, component: UserAccountAccessComponent, title: $localize`Access` } 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 c18598910..da53c1fd6 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 @@ -1,6 +1,6 @@ import { UserService } from '@ghostfolio/client/services/user/user.service'; import { TabConfiguration, User } from '@ghostfolio/common/interfaces'; -import { paths } from '@ghostfolio/common/paths'; +import { routes } from '@ghostfolio/common/routes'; import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { DeviceDetectorService } from 'ngx-device-detector'; @@ -35,18 +35,18 @@ export class UserAccountPageComponent implements OnDestroy, OnInit { { iconName: 'settings-outline', label: $localize`Settings`, - path: ['/' + paths.account] + path: ['/' + routes.account] }, { iconName: 'diamond-outline', label: $localize`Membership`, - path: ['/' + paths.account, paths.membership], + path: ['/' + routes.account, routes.membership], showCondition: !!this.user?.subscription }, { iconName: 'key-outline', label: $localize`Access`, - path: ['/' + paths.account, paths.access] + path: ['/' + routes.account, routes.access] } ]; diff --git a/apps/client/src/app/pages/webauthn/webauthn-page.html b/apps/client/src/app/pages/webauthn/webauthn-page.html index e2b0cdd3a..308a7096b 100644 --- a/apps/client/src/app/pages/webauthn/webauthn-page.html +++ b/apps/client/src/app/pages/webauthn/webauthn-page.html @@ -19,15 +19,17 @@ Oops, authentication has failed. -
    or
    -
    diff --git a/apps/client/src/app/pages/zen/zen-page-routing.module.ts b/apps/client/src/app/pages/zen/zen-page-routing.module.ts index 819f39f7e..8ca947957 100644 --- a/apps/client/src/app/pages/zen/zen-page-routing.module.ts +++ b/apps/client/src/app/pages/zen/zen-page-routing.module.ts @@ -1,7 +1,7 @@ import { HomeHoldingsComponent } from '@ghostfolio/client/components/home-holdings/home-holdings.component'; import { HomeOverviewComponent } from '@ghostfolio/client/components/home-overview/home-overview.component'; import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; -import { paths } from '@ghostfolio/common/paths'; +import { internalRoutes } from '@ghostfolio/common/routes'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; @@ -12,12 +12,19 @@ const routes: Routes = [ { canActivate: [AuthGuard], children: [ - { path: '', component: HomeOverviewComponent }, - { path: paths.holdings, component: HomeHoldingsComponent } + { + path: '', + component: HomeOverviewComponent + }, + { + path: internalRoutes.zen.subRoutes.holdings.path, + component: HomeHoldingsComponent, + title: internalRoutes.home.subRoutes.holdings.title + } ], component: ZenPageComponent, path: '', - title: $localize`Overview` + title: internalRoutes.zen.title } ]; 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 cad969bd5..ae15c1532 100644 --- a/apps/client/src/app/pages/zen/zen-page.component.ts +++ b/apps/client/src/app/pages/zen/zen-page.component.ts @@ -1,6 +1,6 @@ import { UserService } from '@ghostfolio/client/services/user/user.service'; import { TabConfiguration, User } from '@ghostfolio/common/interfaces'; -import { paths } from '@ghostfolio/common/paths'; +import { internalRoutes } from '@ghostfolio/common/routes'; import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { DeviceDetectorService } from 'ngx-device-detector'; @@ -33,13 +33,13 @@ export class ZenPageComponent implements OnDestroy, OnInit { this.tabs = [ { iconName: 'analytics-outline', - label: $localize`Overview`, - path: ['/' + paths.zen] + label: internalRoutes.zen.title, + path: internalRoutes.zen.routerLink }, { iconName: 'wallet-outline', - label: $localize`Holdings`, - path: ['/' + paths.zen, paths.holdings] + label: internalRoutes.zen.subRoutes.holdings.title, + path: internalRoutes.zen.subRoutes.holdings.routerLink } ]; this.user = state.user; diff --git a/apps/client/src/app/services/admin.service.ts b/apps/client/src/app/services/admin.service.ts index cb72fb9fd..670535291 100644 --- a/apps/client/src/app/services/admin.service.ts +++ b/apps/client/src/app/services/admin.service.ts @@ -246,6 +246,10 @@ export class AdminService { ); } + public syncDemoUserAccount() { + return this.http.get(`/api/v1/admin/demo-user/sync`); + } + public testMarketData({ dataSource, scraperConfiguration, diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index 8a4062e55..63a6e47ef 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -6,7 +6,7 @@ Característiques apps/client/src/app/app-routing.module.ts - 74 + 78 @@ -14,7 +14,7 @@ Internacionalització apps/client/src/app/app-routing.module.ts - 88 + 92 @@ -22,11 +22,11 @@ Iniciar sessió apps/client/src/app/app-routing.module.ts - 150 + 154 apps/client/src/app/components/header/header.component.ts - 237 + 242 @@ -74,7 +74,7 @@ apps/client/src/app/components/header/header.component.html - 396 + 403 apps/client/src/app/components/home-market/home-market.html @@ -94,11 +94,11 @@ apps/client/src/app/components/header/header.component.html - 82 + 86 apps/client/src/app/components/header/header.component.html - 289 + 296 apps/client/src/app/pages/resources/overview/resources-overview.component.html @@ -114,11 +114,11 @@ apps/client/src/app/components/header/header.component.html - 117 + 121 apps/client/src/app/components/header/header.component.html - 362 + 369 @@ -238,7 +238,7 @@ apps/client/src/app/components/header/header.component.html - 349 + 356 apps/client/src/app/pages/features/features-page.html @@ -278,15 +278,15 @@ apps/client/src/app/components/header/header.component.html - 99 + 103 apps/client/src/app/components/header/header.component.html - 301 + 308 apps/client/src/app/components/header/header.component.html - 377 + 384 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -370,8 +370,8 @@ sobre kebab-case - libs/common/src/lib/paths.ts - 36 + libs/common/src/lib/routes.ts + 29 @@ -379,8 +379,8 @@ llicències kebab-case - libs/common/src/lib/paths.ts - 42 + libs/common/src/lib/routes.ts + 36 @@ -388,8 +388,8 @@ política de privacitat kebab-case - libs/common/src/lib/paths.ts - 48 + libs/common/src/lib/routes.ts + 41 @@ -397,8 +397,8 @@ faq kebab-case - libs/common/src/lib/paths.ts - 38 + libs/common/src/lib/routes.ts + 32 @@ -406,8 +406,8 @@ característiques kebab-case - libs/common/src/lib/paths.ts - 39 + libs/common/src/lib/routes.ts + 33 @@ -415,8 +415,8 @@ mercats kebab-case - libs/common/src/lib/paths.ts - 43 + libs/common/src/lib/routes.ts + 37 @@ -424,8 +424,8 @@ preu kebab-case - libs/common/src/lib/paths.ts - 47 + libs/common/src/lib/routes.ts + 40 @@ -433,8 +433,12 @@ registrar-se kebab-case - libs/common/src/lib/paths.ts - 49 + libs/common/src/lib/routes.ts + 100 + + + libs/common/src/lib/routes.ts + 101 @@ -442,8 +446,8 @@ recursos kebab-case - libs/common/src/lib/paths.ts - 50 + libs/common/src/lib/routes.ts + 42 @@ -523,7 +527,7 @@ Realment vol revocar aquest accés? apps/client/src/app/components/access-table/access-table.component.ts - 80 + 79 @@ -693,10 +697,6 @@ libs/ui/src/lib/activities-table/activities-table.component.html 138 - - libs/ui/src/lib/benchmark/benchmark.component.html - 4 - libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -863,7 +863,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 155 + 169 @@ -1099,7 +1099,7 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html - 42 + 38 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html @@ -1123,7 +1123,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 336 + 337 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -1147,7 +1147,7 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html - 49 + 45 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html @@ -1171,7 +1171,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 343 + 344 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -1591,7 +1591,7 @@ Està segur qeu vol eliminar aquest cupó? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 134 + 142 @@ -1599,7 +1599,7 @@ Està segur que vol eliminar aquest missatge del sistema? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 147 + 155 @@ -1607,7 +1607,7 @@ Està segur que vol depurar el cache? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 171 + 179 @@ -1615,7 +1615,7 @@ Si us plau, afegeixi el seu missatge del sistema: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 191 + 199 @@ -1735,7 +1735,7 @@ Depurar el Cache apps/client/src/app/components/admin-overview/admin-overview.html - 174 + 186 @@ -1759,11 +1759,11 @@ apps/client/src/app/components/header/header.component.html - 54 + 58 apps/client/src/app/components/header/header.component.html - 259 + 266 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1803,7 +1803,7 @@ Plataformes apps/client/src/app/components/admin-settings/admin-settings.component.html - 137 + 136 @@ -1811,7 +1811,7 @@ Etiquetes apps/client/src/app/components/admin-settings/admin-settings.component.html - 143 + 142 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -1945,14 +1945,14 @@ apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts 122 - - apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts - 47 - apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 94 + + libs/common/src/lib/routes.ts + 76 + Benchmark @@ -1975,11 +1975,11 @@ Visió General apps/client/src/app/components/header/header.component.html - 28 + 30 apps/client/src/app/components/header/header.component.html - 241 + 246 @@ -1987,11 +1987,11 @@ Portfolio apps/client/src/app/components/header/header.component.html - 41 + 44 apps/client/src/app/components/header/header.component.html - 251 + 256 @@ -1999,11 +1999,11 @@ Panell d’Administració apps/client/src/app/components/header/header.component.html - 68 + 72 apps/client/src/app/components/header/header.component.html - 277 + 284 @@ -2011,7 +2011,7 @@ Millora la teva Subscripció apps/client/src/app/components/header/header.component.html - 187 + 191 apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html @@ -2031,7 +2031,7 @@ Renova la teva Subscripció apps/client/src/app/components/header/header.component.html - 185 + 189 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -2047,7 +2047,7 @@ Tu apps/client/src/app/components/header/header.component.html - 207 + 211 @@ -2059,7 +2059,7 @@ apps/client/src/app/components/header/header.component.html - 225 + 229 @@ -2067,7 +2067,7 @@ El meu Ghostfolio apps/client/src/app/components/header/header.component.html - 266 + 273 @@ -2075,7 +2075,7 @@ Sobre Ghostfolio apps/client/src/app/components/header/header.component.html - 314 + 321 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -2087,7 +2087,7 @@ Iniciar Sessió apps/client/src/app/components/header/header.component.html - 410 + 417 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -2099,7 +2099,7 @@ Primers Passos apps/client/src/app/components/header/header.component.html - 420 + 427 @@ -2107,7 +2107,7 @@ Oooh! El testimoni de seguretat és incorrecte. apps/client/src/app/components/header/header.component.ts - 252 + 257 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -2231,7 +2231,7 @@ Informar d’un Problema amb les Dades apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 409 + 407 @@ -2463,7 +2463,7 @@ apps/client/src/app/pages/webauthn/webauthn-page.html - 29 + 30 @@ -2516,7 +2516,7 @@ {VAR_PLURAL, plural, =1 {activity} other {activities}} - {VAR_PLURAL, plural, =1 {activity} other {activities}} + {VAR_PLURAL, plural, =1 {activitat} other {activitats}} apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html 14 @@ -3330,8 +3330,8 @@ Accounts Comptes - apps/client/src/app/pages/accounts/accounts-page-routing.module.ts - 13 + libs/common/src/lib/routes.ts + 51 @@ -3461,21 +3461,17 @@ apps/client/src/app/pages/admin/admin-page.component.ts 29 - - apps/client/src/app/pages/home/home-page.component.ts - 39 - apps/client/src/app/pages/resources/resources-page.component.ts 19 - apps/client/src/app/pages/zen/zen-page-routing.module.ts - 20 + libs/common/src/lib/routes.ts + 64 - apps/client/src/app/pages/zen/zen-page.component.ts - 36 + libs/common/src/lib/routes.ts + 89 @@ -3551,8 +3547,8 @@ autoallotjament kebab-case - libs/common/src/lib/paths.ts - 51 + libs/common/src/lib/routes.ts + 43 @@ -3711,16 +3707,12 @@ Holdings Explotacions - apps/client/src/app/pages/home/home-page-routing.module.ts - 25 - - - apps/client/src/app/pages/home/home-page.component.ts - 44 + libs/common/src/lib/routes.ts + 61 - apps/client/src/app/pages/zen/zen-page.component.ts - 41 + libs/common/src/lib/routes.ts + 86 @@ -3728,7 +3720,7 @@ Resum apps/client/src/app/pages/home/home-page-routing.module.ts - 30 + 33 apps/client/src/app/pages/home/home-page.component.ts @@ -3740,7 +3732,7 @@ Mercats apps/client/src/app/pages/home/home-page-routing.module.ts - 35 + 38 apps/client/src/app/pages/home/home-page.component.ts @@ -3788,7 +3780,7 @@ Programari de gestió patrimonial de codi obert apps/client/src/app/pages/i18n/i18n-page.html - 14 + 30 @@ -4203,12 +4195,8 @@ Activities Activitats - apps/client/src/app/pages/portfolio/activities/activities-page-routing.module.ts - 13 - - - apps/client/src/app/pages/portfolio/portfolio-page.component.ts - 41 + libs/common/src/lib/routes.ts + 73 @@ -4257,7 +4245,7 @@ Mortgages, personal loans, credit cards - Mortgages, personal loans, credit cards + Hipoteques, préstecs personals, targetes de crèdit apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 57 @@ -4265,7 +4253,7 @@ Luxury items, real estate, private companies - Luxury items, real estate, private companies + Articles de luxe, immobiliari, empreses privades apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 73 @@ -4273,7 +4261,7 @@ Account - Account + Compte apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 85 @@ -4289,7 +4277,7 @@ Update Cash Balance - Update Cash Balance + Actualitzar el saldo d’efectiu apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 112 @@ -4297,7 +4285,7 @@ Unit Price - Unit Price + Preu unitari apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 213 @@ -4309,7 +4297,7 @@ Fee - Fee + Quota apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 261 @@ -4321,7 +4309,7 @@ Import Activities - Import Activities + Activitats d’importació apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts 47 @@ -4329,7 +4317,7 @@ Import Dividends - Import Dividends + Importar dividends apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts 88 @@ -4337,7 +4325,7 @@ Importing data... - Importing data... + S’estan important dades... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts 126 @@ -4345,7 +4333,7 @@ Import has been completed - Import has been completed + La importació s’ha completat apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts 134 @@ -4353,7 +4341,7 @@ Validating data... - Validating data... + S’estan validant les dades... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts 242 @@ -4361,7 +4349,7 @@ Select Holding - Select Holding + Seleccioneu Holding apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html 20 @@ -4369,7 +4357,7 @@ Select File - Select File + Seleccioneu Fitxer apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html 22 @@ -4389,7 +4377,7 @@ Load Dividends - Load Dividends + Càrrega de dividends apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html 68 @@ -4397,7 +4385,7 @@ Choose or drop a file here - Choose or drop a file here + Trieu o deixeu anar un fitxer aquí apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html 84 @@ -4405,7 +4393,7 @@ The following file formats are supported: - The following file formats are supported: + S’admeten els formats de fitxer següents: apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html 90 @@ -4413,7 +4401,7 @@ Select Dividends - Select Dividends + Seleccioneu Dividends apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html 113 @@ -4421,7 +4409,7 @@ Select Activities - Select Activities + Seleccioneu Activitats apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html 115 @@ -4429,7 +4417,7 @@ Back - Back + Enrere apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html 144 @@ -4441,7 +4429,7 @@ Allocations - Allocations + Allocations apps/client/src/app/pages/portfolio/allocations/allocations-page-routing.module.ts 13 @@ -4453,7 +4441,7 @@ Allocations - Allocations + Assignacions apps/client/src/app/pages/portfolio/allocations/allocations-page.html 4 @@ -4461,7 +4449,7 @@ Proportion of Net Worth - Proportion of Net Worth + Proporció del patrimoni net apps/client/src/app/pages/portfolio/allocations/allocations-page.html 12 @@ -4469,7 +4457,7 @@ By Platform - By Platform + Per plataforma apps/client/src/app/pages/portfolio/allocations/allocations-page.html 44 @@ -4477,7 +4465,7 @@ By Currency - By Currency + Per Moneda apps/client/src/app/pages/portfolio/allocations/allocations-page.html 63 @@ -4485,7 +4473,7 @@ By Asset Class - By Asset Class + Per classe d’actiu apps/client/src/app/pages/portfolio/allocations/allocations-page.html 85 @@ -4493,7 +4481,7 @@ By Holding - By Holding + Per Holding apps/client/src/app/pages/portfolio/allocations/allocations-page.html 107 @@ -4501,7 +4489,7 @@ By Sector - By Sector + Per sectors apps/client/src/app/pages/portfolio/allocations/allocations-page.html 130 @@ -4509,7 +4497,7 @@ By Continent - By Continent + Per continent apps/client/src/app/pages/portfolio/allocations/allocations-page.html 153 @@ -4517,7 +4505,7 @@ By Market - By Market + Per Mercat apps/client/src/app/pages/portfolio/allocations/allocations-page.html 175 @@ -4537,7 +4525,7 @@ Developed Markets - Developed Markets + Mercats desenvolupats apps/client/src/app/pages/portfolio/allocations/allocations-page.html 222 @@ -4549,7 +4537,7 @@ Emerging Markets - Emerging Markets + Mercats emergents apps/client/src/app/pages/portfolio/allocations/allocations-page.html 231 @@ -4561,7 +4549,7 @@ Other Markets - Other Markets + Altres Mercats apps/client/src/app/pages/portfolio/allocations/allocations-page.html 240 @@ -4573,7 +4561,7 @@ No data available - No data available + No hi ha dades disponibles apps/client/src/app/pages/portfolio/allocations/allocations-page.html 250 @@ -4584,7 +4572,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 188 + 202 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -4593,7 +4581,7 @@ By Country - By Country + Per País apps/client/src/app/pages/portfolio/allocations/allocations-page.html 264 @@ -5075,8 +5063,8 @@ Registration Registration - apps/client/src/app/pages/register/register-page-routing.module.ts - 13 + libs/common/src/lib/routes.ts + 102 @@ -5116,8 +5104,8 @@ open-source-alternative-to kebab-case - libs/common/src/lib/paths.ts - 44 + libs/common/src/lib/routes.ts + 38 @@ -5501,7 +5489,7 @@ Go back to Home Page apps/client/src/app/pages/webauthn/webauthn-page.html - 31 + 33 @@ -5725,7 +5713,7 @@ 50-Day Trend libs/ui/src/lib/benchmark/benchmark.component.html - 16 + 25 @@ -5733,7 +5721,7 @@ 200-Day Trend libs/ui/src/lib/benchmark/benchmark.component.html - 45 + 54 @@ -5741,7 +5729,7 @@ Last All Time High libs/ui/src/lib/benchmark/benchmark.component.html - 74 + 83 @@ -5749,7 +5737,7 @@ Change from All Time High libs/ui/src/lib/benchmark/benchmark.component.html - 96 + 110 @@ -5757,7 +5745,7 @@ from ATH libs/ui/src/lib/benchmark/benchmark.component.html - 98 + 112 @@ -6893,7 +6881,7 @@ Set API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 113 + 112 @@ -6949,8 +6937,8 @@ guides kebab-case - libs/common/src/lib/paths.ts - 41 + libs/common/src/lib/routes.ts + 35 @@ -6958,8 +6946,8 @@ glossary kebab-case - libs/common/src/lib/paths.ts - 40 + libs/common/src/lib/routes.ts + 34 @@ -7015,7 +7003,7 @@ Do you really want to delete the API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 102 + 98 @@ -7167,7 +7155,7 @@ Link has been copied to the clipboard apps/client/src/app/components/access-table/access-table.component.ts - 66 + 65 @@ -7419,8 +7407,8 @@ terms-of-service kebab-case - libs/common/src/lib/paths.ts - 52 + libs/common/src/lib/routes.ts + 44 @@ -7556,7 +7544,7 @@ Watchlist apps/client/src/app/pages/home/home-page-routing.module.ts - 40 + 43 apps/client/src/app/pages/home/home-page.component.ts @@ -7576,7 +7564,7 @@ Do you really want to delete this item? libs/ui/src/lib/benchmark/benchmark.component.ts - 122 + 132 @@ -7584,7 +7572,7 @@ Log out apps/client/src/app/components/header/header.component.html - 317 + 324 @@ -7592,7 +7580,7 @@ Calculations are based on delayed market data and may not be displayed in real-time. apps/client/src/app/components/home-market/home-market.html - 41 + 43 @@ -7600,26 +7588,80 @@ changelog kebab-case - libs/common/src/lib/paths.ts - 37 + libs/common/src/lib/routes.ts + 31 - - oss-friends - oss-friends - kebab-case + + Demo user account has been synced. + Demo user account has been synced. - libs/common/src/lib/paths.ts - 46 + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 223 - - open - open - kebab-case + + Sync Demo User Account + Sync Demo User Account - libs/common/src/lib/paths.ts - 45 + apps/client/src/app/components/admin-overview/admin-overview.html + 181 + + + + Emergency Fund: Set up + Emergency Fund: Set up + + apps/client/src/app/pages/i18n/i18n-page.html + 14 + + + + No emergency fund has been set up + No emergency fund has been set up + + apps/client/src/app/pages/i18n/i18n-page.html + 15 + + + + An emergency fund has been set up + An emergency fund has been set up + + apps/client/src/app/pages/i18n/i18n-page.html + 18 + + + + Fee Ratio + Fee Ratio + + apps/client/src/app/pages/i18n/i18n-page.html + 21 + + + + The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + + apps/client/src/app/pages/i18n/i18n-page.html + 22 + + + + The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + + apps/client/src/app/pages/i18n/i18n-page.html + 26 + + + + Name + Name + + libs/ui/src/lib/benchmark/benchmark.component.html + 11 diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index 9c6b24ba3..bd1e9e165 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -78,7 +78,7 @@ Möchtest du diese Zugangsberechtigung wirklich widerrufen? apps/client/src/app/components/access-table/access-table.component.ts - 80 + 79 @@ -168,10 +168,6 @@ libs/ui/src/lib/activities-table/activities-table.component.html 138 - - libs/ui/src/lib/benchmark/benchmark.component.html - 4 - libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -306,7 +302,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 155 + 169 @@ -510,7 +506,7 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html - 42 + 38 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html @@ -534,7 +530,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 336 + 337 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -558,7 +554,7 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html - 49 + 45 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html @@ -582,7 +578,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 343 + 344 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -634,7 +630,7 @@ Möchtest du diesen Gutscheincode wirklich löschen? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 134 + 142 @@ -642,7 +638,7 @@ Möchtest du den Cache wirklich leeren? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 171 + 179 @@ -650,7 +646,7 @@ Bitte gebe deine Systemmeldung ein: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 191 + 199 @@ -762,7 +758,7 @@ Cache leeren apps/client/src/app/components/admin-overview/admin-overview.html - 174 + 186 @@ -782,7 +778,7 @@ apps/client/src/app/components/header/header.component.html - 225 + 229 @@ -822,11 +818,11 @@ Übersicht apps/client/src/app/components/header/header.component.html - 28 + 30 apps/client/src/app/components/header/header.component.html - 241 + 246 @@ -834,11 +830,11 @@ Portfolio apps/client/src/app/components/header/header.component.html - 41 + 44 apps/client/src/app/components/header/header.component.html - 251 + 256 @@ -854,11 +850,11 @@ apps/client/src/app/components/header/header.component.html - 54 + 58 apps/client/src/app/components/header/header.component.html - 259 + 266 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -874,11 +870,11 @@ Administration apps/client/src/app/components/header/header.component.html - 68 + 72 apps/client/src/app/components/header/header.component.html - 277 + 284 @@ -890,11 +886,11 @@ apps/client/src/app/components/header/header.component.html - 82 + 86 apps/client/src/app/components/header/header.component.html - 289 + 296 apps/client/src/app/pages/resources/overview/resources-overview.component.html @@ -910,15 +906,15 @@ apps/client/src/app/components/header/header.component.html - 99 + 103 apps/client/src/app/components/header/header.component.html - 301 + 308 apps/client/src/app/components/header/header.component.html - 377 + 384 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -934,11 +930,11 @@ apps/client/src/app/components/header/header.component.html - 117 + 121 apps/client/src/app/components/header/header.component.html - 362 + 369 @@ -946,7 +942,7 @@ Ich apps/client/src/app/components/header/header.component.html - 207 + 211 @@ -954,7 +950,7 @@ Mein Ghostfolio apps/client/src/app/components/header/header.component.html - 266 + 273 @@ -962,7 +958,7 @@ Über Ghostfolio apps/client/src/app/components/header/header.component.html - 314 + 321 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -978,7 +974,7 @@ apps/client/src/app/components/header/header.component.html - 349 + 356 apps/client/src/app/pages/features/features-page.html @@ -994,7 +990,7 @@ apps/client/src/app/components/header/header.component.html - 396 + 403 apps/client/src/app/components/home-market/home-market.html @@ -1022,11 +1018,11 @@ Einloggen apps/client/src/app/app-routing.module.ts - 150 + 154 apps/client/src/app/components/header/header.component.ts - 237 + 242 @@ -1034,7 +1030,7 @@ Ups! Falsches Sicherheits-Token. apps/client/src/app/components/header/header.component.ts - 252 + 257 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -1114,7 +1110,7 @@ apps/client/src/app/pages/webauthn/webauthn-page.html - 29 + 30 @@ -1146,7 +1142,7 @@ Einloggen apps/client/src/app/components/header/header.component.html - 410 + 417 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -1338,7 +1334,7 @@ Tags apps/client/src/app/components/admin-settings/admin-settings.component.html - 143 + 142 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -1354,7 +1350,7 @@ Datenfehler melden apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 409 + 407 @@ -1825,8 +1821,8 @@ Accounts Konten - apps/client/src/app/pages/accounts/accounts-page-routing.module.ts - 13 + libs/common/src/lib/routes.ts + 51 @@ -1966,7 +1962,7 @@ Features apps/client/src/app/app-routing.module.ts - 74 + 78 @@ -1976,21 +1972,17 @@ apps/client/src/app/pages/admin/admin-page.component.ts 29 - - apps/client/src/app/pages/home/home-page.component.ts - 39 - apps/client/src/app/pages/resources/resources-page.component.ts 19 - apps/client/src/app/pages/zen/zen-page-routing.module.ts - 20 + libs/common/src/lib/routes.ts + 64 - apps/client/src/app/pages/zen/zen-page.component.ts - 36 + libs/common/src/lib/routes.ts + 89 @@ -1998,7 +1990,7 @@ Märkte apps/client/src/app/pages/home/home-page-routing.module.ts - 35 + 38 apps/client/src/app/pages/home/home-page.component.ts @@ -2177,16 +2169,12 @@ Holdings Positionen - apps/client/src/app/pages/home/home-page-routing.module.ts - 25 - - - apps/client/src/app/pages/home/home-page.component.ts - 44 + libs/common/src/lib/routes.ts + 61 - apps/client/src/app/pages/zen/zen-page.component.ts - 41 + libs/common/src/lib/routes.ts + 86 @@ -2345,12 +2333,8 @@ Activities Aktivitäten - apps/client/src/app/pages/portfolio/activities/activities-page-routing.module.ts - 13 - - - apps/client/src/app/pages/portfolio/portfolio-page.component.ts - 41 + libs/common/src/lib/routes.ts + 73 @@ -2384,14 +2368,14 @@ apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts 122 - - apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts - 47 - apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 94 + + libs/common/src/lib/routes.ts + 76 + Currencies @@ -2421,8 +2405,8 @@ Registration Registrierung - apps/client/src/app/pages/register/register-page-routing.module.ts - 13 + libs/common/src/lib/routes.ts + 102 @@ -2478,7 +2462,7 @@ Zurück zur Startseite apps/client/src/app/pages/webauthn/webauthn-page.html - 31 + 33 @@ -2550,7 +2534,7 @@ Änderung vom Allzeithoch libs/ui/src/lib/benchmark/benchmark.component.html - 96 + 110 @@ -2558,7 +2542,7 @@ vom AZH libs/ui/src/lib/benchmark/benchmark.component.html - 98 + 112 @@ -2590,7 +2574,7 @@ Registrieren apps/client/src/app/components/header/header.component.html - 420 + 427 @@ -3358,7 +3342,7 @@ Zusammenfassung apps/client/src/app/pages/home/home-page-routing.module.ts - 30 + 33 apps/client/src/app/pages/home/home-page.component.ts @@ -3574,7 +3558,7 @@ Abonnement abschliessen apps/client/src/app/components/header/header.component.html - 187 + 191 apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html @@ -3866,7 +3850,7 @@ Abonnement erneuern apps/client/src/app/components/header/header.component.html - 185 + 189 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -3966,7 +3950,7 @@ Plattformen apps/client/src/app/components/admin-settings/admin-settings.component.html - 137 + 136 @@ -4694,7 +4678,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 188 + 202 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5174,8 +5158,8 @@ haeufig-gestellte-fragen kebab-case - libs/common/src/lib/paths.ts - 38 + libs/common/src/lib/routes.ts + 32 @@ -5183,8 +5167,8 @@ features kebab-case - libs/common/src/lib/paths.ts - 39 + libs/common/src/lib/routes.ts + 33 @@ -5192,8 +5176,8 @@ ueber-uns kebab-case - libs/common/src/lib/paths.ts - 36 + libs/common/src/lib/routes.ts + 29 @@ -5201,8 +5185,8 @@ datenschutzbestimmungen kebab-case - libs/common/src/lib/paths.ts - 48 + libs/common/src/lib/routes.ts + 41 @@ -5210,8 +5194,8 @@ lizenz kebab-case - libs/common/src/lib/paths.ts - 42 + libs/common/src/lib/routes.ts + 36 @@ -5219,8 +5203,8 @@ maerkte kebab-case - libs/common/src/lib/paths.ts - 43 + libs/common/src/lib/routes.ts + 37 @@ -5228,8 +5212,8 @@ preise kebab-case - libs/common/src/lib/paths.ts - 47 + libs/common/src/lib/routes.ts + 40 @@ -5237,8 +5221,12 @@ registrierung kebab-case - libs/common/src/lib/paths.ts - 49 + libs/common/src/lib/routes.ts + 100 + + + libs/common/src/lib/routes.ts + 101 @@ -5246,8 +5234,8 @@ ressourcen kebab-case - libs/common/src/lib/paths.ts - 50 + libs/common/src/lib/routes.ts + 42 @@ -5319,8 +5307,8 @@ open-source-alternative-zu kebab-case - libs/common/src/lib/paths.ts - 44 + libs/common/src/lib/routes.ts + 38 @@ -5652,7 +5640,7 @@ Letztes Allzeithoch libs/ui/src/lib/benchmark/benchmark.component.html - 74 + 83 @@ -5676,7 +5664,7 @@ Open Source Software für die Vermögensverwaltung apps/client/src/app/pages/i18n/i18n-page.html - 14 + 30 @@ -5732,7 +5720,7 @@ Möchtest du diese Systemmeldung wirklich löschen? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 147 + 155 @@ -5740,7 +5728,7 @@ 50 Tage Trend libs/ui/src/lib/benchmark/benchmark.component.html - 16 + 25 @@ -5748,7 +5736,7 @@ 200 Tage Trend libs/ui/src/lib/benchmark/benchmark.component.html - 45 + 54 @@ -6096,8 +6084,8 @@ self-hosting kebab-case - libs/common/src/lib/paths.ts - 51 + libs/common/src/lib/routes.ts + 43 @@ -6221,7 +6209,7 @@ Internationalisierung apps/client/src/app/app-routing.module.ts - 88 + 92 @@ -6917,7 +6905,7 @@ API-Schlüssel setzen apps/client/src/app/components/admin-settings/admin-settings.component.html - 113 + 112 @@ -6973,8 +6961,8 @@ ratgeber kebab-case - libs/common/src/lib/paths.ts - 41 + libs/common/src/lib/routes.ts + 35 @@ -6982,8 +6970,8 @@ lexikon kebab-case - libs/common/src/lib/paths.ts - 40 + libs/common/src/lib/routes.ts + 34 @@ -7039,7 +7027,7 @@ Möchtest du den API-Schlüssel wirklich löschen? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 102 + 98 @@ -7132,7 +7120,7 @@ rules align with your portfolio. - Regeln werden von Ihrem Portfolio erfüllt. + Regeln werden von deinem Portfolio erfüllt. apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html 58 @@ -7191,7 +7179,7 @@ Link wurde in die Zwischenablage kopiert apps/client/src/app/components/access-table/access-table.component.ts - 66 + 65 @@ -7443,8 +7431,8 @@ allgemeine-geschaeftsbedingungen kebab-case - libs/common/src/lib/paths.ts - 52 + libs/common/src/lib/routes.ts + 44 @@ -7556,7 +7544,7 @@ Beobachtungsliste apps/client/src/app/pages/home/home-page-routing.module.ts - 40 + 43 apps/client/src/app/pages/home/home-page.component.ts @@ -7576,7 +7564,7 @@ Möchtest du diesen Eintrag wirklich löschen? libs/ui/src/lib/benchmark/benchmark.component.ts - 122 + 132 @@ -7584,7 +7572,7 @@ Ausloggen apps/client/src/app/components/header/header.component.html - 317 + 324 @@ -7592,34 +7580,88 @@ Berechnungen basieren auf verzögerten Marktdaten und werden nicht in Echtzeit angezeigt. apps/client/src/app/components/home-market/home-market.html - 41 + 43 changelog - changelog + changelog kebab-case - libs/common/src/lib/paths.ts - 37 + libs/common/src/lib/routes.ts + 31 - - oss-friends - oss-freunde - kebab-case + + Demo user account has been synced. + Demo Benutzerkonto wurde synchronisiert. - libs/common/src/lib/paths.ts - 46 + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 223 - - open - open - kebab-case + + Sync Demo User Account + Synchronisiere Demo Benutzerkonto - libs/common/src/lib/paths.ts - 45 + apps/client/src/app/components/admin-overview/admin-overview.html + 181 + + + + Emergency Fund: Set up + Notfallfonds: Einrichtung + + apps/client/src/app/pages/i18n/i18n-page.html + 14 + + + + No emergency fund has been set up + Es wurde kein Notfallfonds eingerichtet + + apps/client/src/app/pages/i18n/i18n-page.html + 15 + + + + An emergency fund has been set up + Ein Notfallfonds wurde eingerichtet + + apps/client/src/app/pages/i18n/i18n-page.html + 18 + + + + Fee Ratio + Gebührenverhältnis + + apps/client/src/app/pages/i18n/i18n-page.html + 21 + + + + The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + Die Gebühren übersteigen ${thresholdMax}% deiner ursprünglichen Investition (${feeRatio}%) + + apps/client/src/app/pages/i18n/i18n-page.html + 22 + + + + The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + Die Gebühren übersteigen ${thresholdMax}% deiner ursprünglichen Investition (${feeRatio}%) nicht + + apps/client/src/app/pages/i18n/i18n-page.html + 26 + + + + Name + Name + + libs/ui/src/lib/benchmark/benchmark.component.html + 11 diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 8235b386f..fee61f309 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -79,7 +79,7 @@ ¿Quieres revocar el acceso concedido? apps/client/src/app/components/access-table/access-table.component.ts - 80 + 79 @@ -169,10 +169,6 @@ libs/ui/src/lib/activities-table/activities-table.component.html 138 - - libs/ui/src/lib/benchmark/benchmark.component.html - 4 - libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -307,7 +303,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 155 + 169 @@ -511,7 +507,7 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html - 42 + 38 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html @@ -535,7 +531,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 336 + 337 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -559,7 +555,7 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html - 49 + 45 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html @@ -583,7 +579,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 343 + 344 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -635,7 +631,7 @@ ¿Estás seguro de eliminar este cupón? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 134 + 142 @@ -643,7 +639,7 @@ ¿Estás seguro de limpiar la caché? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 171 + 179 @@ -651,7 +647,7 @@ Por favor, establece tu mensaje del sistema: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 191 + 199 @@ -747,7 +743,7 @@ Limpiar caché apps/client/src/app/components/admin-overview/admin-overview.html - 174 + 186 @@ -767,7 +763,7 @@ apps/client/src/app/components/header/header.component.html - 225 + 229 @@ -807,11 +803,11 @@ Visión general apps/client/src/app/components/header/header.component.html - 28 + 30 apps/client/src/app/components/header/header.component.html - 241 + 246 @@ -819,11 +815,11 @@ Cartera apps/client/src/app/components/header/header.component.html - 41 + 44 apps/client/src/app/components/header/header.component.html - 251 + 256 @@ -839,11 +835,11 @@ apps/client/src/app/components/header/header.component.html - 54 + 58 apps/client/src/app/components/header/header.component.html - 259 + 266 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -859,11 +855,11 @@ Control de administrador apps/client/src/app/components/header/header.component.html - 68 + 72 apps/client/src/app/components/header/header.component.html - 277 + 284 @@ -875,11 +871,11 @@ apps/client/src/app/components/header/header.component.html - 82 + 86 apps/client/src/app/components/header/header.component.html - 289 + 296 apps/client/src/app/pages/resources/overview/resources-overview.component.html @@ -895,15 +891,15 @@ apps/client/src/app/components/header/header.component.html - 99 + 103 apps/client/src/app/components/header/header.component.html - 301 + 308 apps/client/src/app/components/header/header.component.html - 377 + 384 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -919,11 +915,11 @@ apps/client/src/app/components/header/header.component.html - 117 + 121 apps/client/src/app/components/header/header.component.html - 362 + 369 @@ -931,7 +927,7 @@ apps/client/src/app/components/header/header.component.html - 207 + 211 @@ -939,7 +935,7 @@ Mi Ghostfolio apps/client/src/app/components/header/header.component.html - 266 + 273 @@ -947,7 +943,7 @@ Sobre Ghostfolio apps/client/src/app/components/header/header.component.html - 314 + 321 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -963,7 +959,7 @@ apps/client/src/app/components/header/header.component.html - 349 + 356 apps/client/src/app/pages/features/features-page.html @@ -979,7 +975,7 @@ apps/client/src/app/components/header/header.component.html - 396 + 403 apps/client/src/app/components/home-market/home-market.html @@ -1007,11 +1003,11 @@ Iniciar sesión apps/client/src/app/app-routing.module.ts - 150 + 154 apps/client/src/app/components/header/header.component.ts - 237 + 242 @@ -1019,7 +1015,7 @@ Vaya! Token de seguridad incorrecto. apps/client/src/app/components/header/header.component.ts - 252 + 257 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -1099,7 +1095,7 @@ apps/client/src/app/pages/webauthn/webauthn-page.html - 29 + 30 @@ -1131,7 +1127,7 @@ Iniciar sesión apps/client/src/app/components/header/header.component.html - 410 + 417 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -1323,7 +1319,7 @@ Etiquetas apps/client/src/app/components/admin-settings/admin-settings.component.html - 143 + 142 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -1339,7 +1335,7 @@ Reporta un anomalía de los datos apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 409 + 407 @@ -1810,8 +1806,8 @@ Accounts Cuentas - apps/client/src/app/pages/accounts/accounts-page-routing.module.ts - 13 + libs/common/src/lib/routes.ts + 51 @@ -1951,7 +1947,7 @@ Funcionalidades apps/client/src/app/app-routing.module.ts - 74 + 78 @@ -1961,21 +1957,17 @@ apps/client/src/app/pages/admin/admin-page.component.ts 29 - - apps/client/src/app/pages/home/home-page.component.ts - 39 - apps/client/src/app/pages/resources/resources-page.component.ts 19 - apps/client/src/app/pages/zen/zen-page-routing.module.ts - 20 + libs/common/src/lib/routes.ts + 64 - apps/client/src/app/pages/zen/zen-page.component.ts - 36 + libs/common/src/lib/routes.ts + 89 @@ -1983,7 +1975,7 @@ Mercados apps/client/src/app/pages/home/home-page-routing.module.ts - 35 + 38 apps/client/src/app/pages/home/home-page.component.ts @@ -2162,16 +2154,12 @@ Holdings Participaciones - apps/client/src/app/pages/home/home-page-routing.module.ts - 25 - - - apps/client/src/app/pages/home/home-page.component.ts - 44 + libs/common/src/lib/routes.ts + 61 - apps/client/src/app/pages/zen/zen-page.component.ts - 41 + libs/common/src/lib/routes.ts + 86 @@ -2330,12 +2318,8 @@ Activities Operación - apps/client/src/app/pages/portfolio/activities/activities-page-routing.module.ts - 13 - - - apps/client/src/app/pages/portfolio/portfolio-page.component.ts - 41 + libs/common/src/lib/routes.ts + 73 @@ -2369,14 +2353,14 @@ apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts 122 - - apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts - 47 - apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 94 + + libs/common/src/lib/routes.ts + 76 + Currencies @@ -2406,8 +2390,8 @@ Registration Registro - apps/client/src/app/pages/register/register-page-routing.module.ts - 13 + libs/common/src/lib/routes.ts + 102 @@ -2463,7 +2447,7 @@ Volver a la página principal apps/client/src/app/pages/webauthn/webauthn-page.html - 31 + 33 @@ -2535,7 +2519,7 @@ Variación respecto al máximo histórico (ATH) libs/ui/src/lib/benchmark/benchmark.component.html - 96 + 110 @@ -2543,7 +2527,7 @@ desde el máximo histórico (ATH) libs/ui/src/lib/benchmark/benchmark.component.html - 98 + 112 @@ -2575,7 +2559,7 @@ Comenzar apps/client/src/app/components/header/header.component.html - 420 + 427 @@ -3343,7 +3327,7 @@ Resumen apps/client/src/app/pages/home/home-page-routing.module.ts - 30 + 33 apps/client/src/app/pages/home/home-page.component.ts @@ -3559,7 +3543,7 @@ Mejorar plan apps/client/src/app/components/header/header.component.html - 187 + 191 apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html @@ -3843,7 +3827,7 @@ Renovar Plan apps/client/src/app/components/header/header.component.html - 185 + 189 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -3943,7 +3927,7 @@ Plataformas apps/client/src/app/components/admin-settings/admin-settings.component.html - 137 + 136 @@ -4620,7 +4604,7 @@ Get a comprehensive financial overview by adding your bank and brokerage accounts. - Get a comprehensive financial overview by adding your bank and brokerage accounts. + Obtén una visión financiera completa agregando tus cuentas bancarias y de corretaje. apps/client/src/app/components/home-overview/home-overview.html 17 @@ -4628,7 +4612,7 @@ Capture your activities - Capture your activities + Captura tus actividades apps/client/src/app/components/home-overview/home-overview.html 24 @@ -4636,7 +4620,7 @@ Record your investment activities to keep your portfolio up to date. - Record your investment activities to keep your portfolio up to date. + Registra tus actividades de inversión para mantener tu portafolio actualizado. apps/client/src/app/components/home-overview/home-overview.html 26 @@ -4644,7 +4628,7 @@ Monitor and analyze your portfolio - Monitor and analyze your portfolio + Monitorea y analiza tu portafolio apps/client/src/app/components/home-overview/home-overview.html 33 @@ -4652,7 +4636,7 @@ Track your progress in real-time with comprehensive analysis and insights. - Track your progress in real-time with comprehensive analysis and insights. + Sigue tu progreso en tiempo real con análisis e información detallada. apps/client/src/app/components/home-overview/home-overview.html 35 @@ -4660,7 +4644,7 @@ No data available - No data available + No hay datos disponibles. apps/client/src/app/pages/portfolio/allocations/allocations-page.html 250 @@ -4671,7 +4655,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 188 + 202 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -4680,7 +4664,7 @@ Ready to take control of your personal finances? - Ready to take control of your personal finances? + ¿Listo para tomar el control de tus finanzas personales? apps/client/src/app/components/home-overview/home-overview.html 8 @@ -4688,7 +4672,7 @@ Setup accounts - Setup accounts + Configura tus cuentas apps/client/src/app/components/home-overview/home-overview.html 48 @@ -4696,7 +4680,7 @@ Biometric Authentication - Biometric Authentication + Autenticación biométrica apps/client/src/app/components/user-account-settings/user-account-settings.html 218 @@ -4704,7 +4688,7 @@ At Ghostfolio, transparency is at the core of our values. We publish the source code as open source software (OSS) under the AGPL-3.0 license and we openly share aggregated key metrics of the platform’s operational status. - At Ghostfolio, transparency is at the core of our values. We publish the source code as open source software (OSS) under the AGPL-3.0 license and we openly share aggregated key metrics of the platform’s operational status. + En Ghostfolio, la transparencia está en el centro de nuestros valores. Publicamos el código fuente como software de código abierto (OSS) bajo la licencia Licencia AGPL-3.0 y compartimos abiertamente métricas clave agregadas sobre el estado operativo de la plataforma. apps/client/src/app/pages/open/open-page.html 6 @@ -4712,7 +4696,7 @@ Active Users - Active Users + Usuarios activos apps/client/src/app/pages/open/open-page.html 40 @@ -4724,7 +4708,7 @@ New Users - New Users + Nuevos usuarios apps/client/src/app/pages/open/open-page.html 51 @@ -4732,7 +4716,7 @@ Users in Slack community - Users in Slack community + Usuarios en la comunidad de Slack apps/client/src/app/pages/open/open-page.html 75 @@ -4740,7 +4724,7 @@ Contributors on GitHub - Contributors on GitHub + Colaboradores en GitHub apps/client/src/app/pages/open/open-page.html 89 @@ -4748,7 +4732,7 @@ Stars on GitHub - Stars on GitHub + Estrellas en GitHub apps/client/src/app/pages/landing/landing-page.html 88 @@ -4760,7 +4744,7 @@ Pulls on Docker Hub - Pulls on Docker Hub + Descargas en Docker Hub apps/client/src/app/pages/landing/landing-page.html 106 @@ -4772,7 +4756,7 @@ Uptime - Uptime + Tiempo de actividad apps/client/src/app/pages/open/open-page.html 132 @@ -4780,7 +4764,7 @@ Export Data - Export Data + Exportar datos apps/client/src/app/components/user-account-settings/user-account-settings.html 260 @@ -4788,7 +4772,7 @@ Currencies - Currencies + Monedas apps/client/src/app/components/admin-market-data/admin-market-data.component.ts 86 @@ -4796,7 +4780,7 @@ Our - Our + Nuestro apps/client/src/app/pages/about/oss-friends/oss-friends-page.html 6 @@ -4804,7 +4788,7 @@ Visit - Visit + Visitar apps/client/src/app/pages/about/oss-friends/oss-friends-page.html 28 @@ -4812,7 +4796,7 @@ Discover other exciting Open Source Software projects - Discover other exciting Open Source Software projects + Descubre otros proyectos emocionantes de software de código abierto apps/client/src/app/pages/about/oss-friends/oss-friends-page.html 9 @@ -4820,7 +4804,7 @@ Frequently Asked Questions (FAQ) - Frequently Asked Questions (FAQ) + Preguntas Frecuentes (FAQ) apps/client/src/app/pages/faq/overview/faq-overview-page.html 4 @@ -4836,7 +4820,7 @@ Check out the numerous features of Ghostfolio to manage your wealth - Check out the numerous features of Ghostfolio to manage your wealth + Descubra las numerosas funciones de Ghostfolio para gestionar su patrimonio apps/client/src/app/pages/features/features-page.html 6 @@ -4844,7 +4828,7 @@ Discover the latest Ghostfolio updates and insights on personal finance - Discover the latest Ghostfolio updates and insights on personal finance + Conoce las últimas actualizaciones de Ghostfolio y obtén información sobre finanzas personales apps/client/src/app/pages/blog/blog-page.html 7 @@ -4852,7 +4836,7 @@ If you prefer to run Ghostfolio on your own infrastructure, please find the source code and further instructions on GitHub. - If you prefer to run Ghostfolio on your own infrastructure, please find the source code and further instructions on GitHub. + Si prefieres ejecutar Ghostfolio en tu propia infraestructura, puedes encontrar el código fuente e instrucciones adicionales en GitHub. apps/client/src/app/pages/pricing/pricing-page.html 26 @@ -4860,7 +4844,7 @@ Manage your wealth like a boss - Manage your wealth like a boss + Gestiona tu patrimonio como un jefe apps/client/src/app/pages/landing/landing-page.html 5 @@ -4868,7 +4852,7 @@ Ghostfolio is a privacy-first, open source dashboard for your personal finances. Break down your asset allocation, know your net worth and make solid, data-driven investment decisions. - Ghostfolio is a privacy-first, open source dashboard for your personal finances. Break down your asset allocation, know your net worth and make solid, data-driven investment decisions. + Ghostfolio es un panel de control de código abierto y centrado en la privacidad para tus finanzas personales. Analiza la asignación de tus activos, conoce tu patrimonio neto y toma decisiones de inversión sólidas basadas en datos. apps/client/src/app/pages/landing/landing-page.html 9 @@ -4888,7 +4872,7 @@ Monthly Active Users - Monthly Active Users + Usuarios activos mensuales apps/client/src/app/pages/landing/landing-page.html 70 @@ -4896,7 +4880,7 @@ As seen in - As seen in + Visto en apps/client/src/app/pages/landing/landing-page.html 115 @@ -4904,7 +4888,7 @@ Protect your assets. Refine your personal investment strategy. - Protect your assets. Refine your personal investment strategy. + Protege tus assets. Mejora tu estrategia de inversión personal. apps/client/src/app/pages/landing/landing-page.html 225 @@ -4912,7 +4896,7 @@ Ghostfolio empowers busy people to keep track of stocks, ETFs or cryptocurrencies without being tracked. - Ghostfolio empowers busy people to keep track of stocks, ETFs or cryptocurrencies without being tracked. + Ghostfolio permite a las personas ocupadas hacer un seguimiento de acciones, ETFs o criptomonedas sin ser rastreadas. apps/client/src/app/pages/landing/landing-page.html 229 @@ -4920,7 +4904,7 @@ 360° View - 360° View + Vista 360° apps/client/src/app/pages/landing/landing-page.html 240 @@ -4928,7 +4912,7 @@ Web3 Ready - Web3 Ready + Preparado para Web3 apps/client/src/app/pages/landing/landing-page.html 251 @@ -4936,7 +4920,7 @@ Use Ghostfolio anonymously and own your financial data. - Use Ghostfolio anonymously and own your financial data. + Usa Ghostfolio de forma anónima y sé dueño de tus datos financieros. apps/client/src/app/pages/landing/landing-page.html 253 @@ -4944,7 +4928,7 @@ Open Source - Open Source + Código Abierto apps/client/src/app/pages/landing/landing-page.html 261 @@ -4952,7 +4936,7 @@ Benefit from continuous improvements through a strong community. - Benefit from continuous improvements through a strong community. + Disfruta de mejoras continuas gracias a una comunidad sólida. apps/client/src/app/pages/landing/landing-page.html 263 @@ -4960,7 +4944,7 @@ Why Ghostfolio? - Why Ghostfolio? + ¿Por qué Ghostfolio? apps/client/src/app/pages/landing/landing-page.html 272 @@ -4968,7 +4952,7 @@ Ghostfolio is for you if you are... - Ghostfolio is for you if you are... + Ghostfolio es para ti si estás... apps/client/src/app/pages/landing/landing-page.html 273 @@ -4976,7 +4960,7 @@ trading stocks, ETFs or cryptocurrencies on multiple platforms - trading stocks, ETFs or cryptocurrencies on multiple platforms + operando con acciones, ETFs o criptomonedas en múltiples plataformas apps/client/src/app/pages/landing/landing-page.html 280 @@ -4984,7 +4968,7 @@ pursuing a buy & hold strategy - pursuing a buy & hold strategy + persiguiendo una compra & mantener estrategia apps/client/src/app/pages/landing/landing-page.html 286 @@ -4992,7 +4976,7 @@ interested in getting insights of your portfolio composition - interested in getting insights of your portfolio composition + interesado en obtener información sobre la composición de tu portafolio apps/client/src/app/pages/landing/landing-page.html 291 @@ -5000,7 +4984,7 @@ valuing privacy and data ownership - valuing privacy and data ownership + valorando la privacidad y la propiedad de tus datos apps/client/src/app/pages/landing/landing-page.html 296 @@ -5008,7 +4992,7 @@ into minimalism - into minimalism + en el minimalismo apps/client/src/app/pages/landing/landing-page.html 299 @@ -5016,7 +5000,7 @@ caring about diversifying your financial resources - caring about diversifying your financial resources + preocuparse por diversificar tus recursos financieros apps/client/src/app/pages/landing/landing-page.html 303 @@ -5024,7 +5008,7 @@ interested in financial independence - interested in financial independence + interesado en la independencia financiera apps/client/src/app/pages/landing/landing-page.html 307 @@ -5032,7 +5016,7 @@ saying no to spreadsheets in - saying no to spreadsheets in + diciendo no a las hojas de cálculo en apps/client/src/app/pages/landing/landing-page.html 311 @@ -5040,7 +5024,7 @@ still reading this list - still reading this list + todavía leyendo esta lista apps/client/src/app/pages/landing/landing-page.html 314 @@ -5048,7 +5032,7 @@ Learn more about Ghostfolio - Learn more about Ghostfolio + Más información sobre Ghostfolio apps/client/src/app/pages/landing/landing-page.html 319 @@ -5056,7 +5040,7 @@ What our users are saying - What our users are saying + Lo que nuestros usuarios están diciendo apps/client/src/app/pages/landing/landing-page.html 327 @@ -5064,7 +5048,7 @@ Members from around the globe are using Ghostfolio Premium - Members from around the globe are using Ghostfolio Premium + Miembros de todo el mundo están usando Ghostfolio Premium apps/client/src/app/pages/landing/landing-page.html 366 @@ -5072,7 +5056,7 @@ How does Ghostfolio work? - How does Ghostfolio work? + ¿Cómo Ghostfolio work? apps/client/src/app/pages/landing/landing-page.html 383 @@ -5080,7 +5064,7 @@ Sign up anonymously* - Sign up anonymously* + Regístrate de forma anónima* apps/client/src/app/pages/landing/landing-page.html 392 @@ -5088,7 +5072,7 @@ * no e-mail address nor credit card required - * no e-mail address nor credit card required + * no se requiere dirección de correo electrónico ni tarjeta de crédito apps/client/src/app/pages/landing/landing-page.html 394 @@ -5096,7 +5080,7 @@ Add any of your historical transactions - Add any of your historical transactions + Agrega cualquiera de tus transacciones históricas apps/client/src/app/pages/landing/landing-page.html 405 @@ -5104,7 +5088,7 @@ Get valuable insights of your portfolio composition - Get valuable insights of your portfolio composition + Obtén información valiosa sobre la composición de tu portafolio apps/client/src/app/pages/landing/landing-page.html 417 @@ -5112,7 +5096,7 @@ Are you ready? - Are you ready? + ¿Estás listo? apps/client/src/app/pages/landing/landing-page.html 431 @@ -5120,7 +5104,7 @@ Live Demo - Live Demo + Demostración en vivo apps/client/src/app/pages/landing/landing-page.html 49 @@ -5132,7 +5116,7 @@ Get the full picture of your personal finances across multiple platforms. - Get the full picture of your personal finances across multiple platforms. + Obtén una visión completa de tus finanzas personales en múltiples plataformas. apps/client/src/app/pages/landing/landing-page.html 242 @@ -5140,7 +5124,7 @@ Get started in only 3 steps - Get started in only 3 steps + Comienza en solo 3 pasos apps/client/src/app/pages/landing/landing-page.html 386 @@ -5151,8 +5135,8 @@ preguntas-mas-frecuentes kebab-case - libs/common/src/lib/paths.ts - 38 + libs/common/src/lib/routes.ts + 32 @@ -5160,8 +5144,8 @@ funcionalidades kebab-case - libs/common/src/lib/paths.ts - 39 + libs/common/src/lib/routes.ts + 33 @@ -5169,8 +5153,8 @@ sobre kebab-case - libs/common/src/lib/paths.ts - 36 + libs/common/src/lib/routes.ts + 29 @@ -5178,8 +5162,8 @@ politica-de-privacidad kebab-case - libs/common/src/lib/paths.ts - 48 + libs/common/src/lib/routes.ts + 41 @@ -5187,8 +5171,8 @@ licencia kebab-case - libs/common/src/lib/paths.ts - 42 + libs/common/src/lib/routes.ts + 36 @@ -5196,8 +5180,8 @@ mercados kebab-case - libs/common/src/lib/paths.ts - 43 + libs/common/src/lib/routes.ts + 37 @@ -5205,8 +5189,8 @@ precios kebab-case - libs/common/src/lib/paths.ts - 47 + libs/common/src/lib/routes.ts + 40 @@ -5214,8 +5198,12 @@ registro kebab-case - libs/common/src/lib/paths.ts - 49 + libs/common/src/lib/routes.ts + 100 + + + libs/common/src/lib/routes.ts + 101 @@ -5223,13 +5211,13 @@ recursos kebab-case - libs/common/src/lib/paths.ts - 50 + libs/common/src/lib/routes.ts + 42 This overview page features a curated collection of personal finance tools compared to the open source alternative Ghostfolio. If you value transparency, data privacy, and community collaboration, Ghostfolio provides an excellent opportunity to take control of your financial management. - This overview page features a curated collection of personal finance tools compared to the open source alternative Ghostfolio. If you value transparency, data privacy, and community collaboration, Ghostfolio provides an excellent opportunity to take control of your financial management. + Esta página de resumen presenta una colección seleccionada de herramientas de finanzas personales, comparadas con la alternativa de código abierto Ghostfolio. Si valoras la transparencia, la privacidad de los datos y la colaboración comunitaria, Ghostfolio ofrece una excelente oportunidad para tomar el control de tu gestión financiera. apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html 8 @@ -5237,7 +5225,7 @@ Explore the links below to compare a variety of personal finance tools with Ghostfolio. - Explore the links below to compare a variety of personal finance tools with Ghostfolio. + Explora los siguientes enlaces para comparar una variedad de herramientas de finanzas personales con Ghostfolio. apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html 16 @@ -5245,7 +5233,7 @@ Open Source Alternative to - Alternativa de software libre a + Alternativa de software libre a apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html 42 @@ -5269,7 +5257,7 @@ Are you looking for an open source alternative to ? Ghostfolio is a powerful portfolio management tool that provides individuals with a comprehensive platform to track, analyze, and optimize their investments. Whether you are an experienced investor or just starting out, Ghostfolio offers an intuitive user interface and a wide range of functionalities to help you make informed decisions and take control of your financial future. - Are you looking for an open source alternative to ? Ghostfolio is a powerful portfolio management tool that provides individuals with a comprehensive platform to track, analyze, and optimize their investments. Whether you are an experienced investor or just starting out, Ghostfolio offers an intuitive user interface and a wide range of functionalities to help you make informed decisions and take control of your financial future. + ¿Estás buscando una alternativa de código abierto a ? Ghostfolio es una potente herramienta de gestión de carteras que ofrece a los usuarios una plataforma integral para rastrear, analizar y optimizar sus inversiones. Ya seas un inversor con experiencia o estés comenzando, Ghostfolio ofrece una interfaz intuitiva y una amplia gama de funcionalidades para ayudarte a tomar decisiones informadas y tener el control de tu futuro financiero. apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 18 @@ -5277,7 +5265,7 @@ Ghostfolio is an open source software (OSS), providing a cost-effective alternative to making it particularly suitable for individuals on a tight budget, such as those pursuing Financial Independence, Retire Early (FIRE). By leveraging the collective efforts of a community of developers and personal finance enthusiasts, Ghostfolio continuously enhances its capabilities, security, and user experience. - Ghostfolio is an open source software (OSS), providing a cost-effective alternative to making it particularly suitable for individuals on a tight budget, such as those pursuing Financial Independence, Retire Early (FIRE). By leveraging the collective efforts of a community of developers and personal finance enthusiasts, Ghostfolio continuously enhances its capabilities, security, and user experience. + Ghostfolio es un software de código abierto (OSS), que ofrece una alternativa rentable a lo que lo hace especialmente adecuado para personas con un presupuesto ajustado, como aquellas que buscan la Independencia Financiera y Jubilación Anticipada (FIRE). Al aprovechar los esfuerzos colectivos de una comunidad de desarrolladores y entusiastas de las finanzas personales, Ghostfolio mejora continuamente sus capacidades, seguridad y experiencia de usuario. apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 32 @@ -5285,7 +5273,7 @@ Let’s dive deeper into the detailed Ghostfolio vs comparison table below to gain a thorough understanding of how Ghostfolio positions itself relative to . We will explore various aspects such as features, data privacy, pricing, and more, allowing you to make a well-informed choice for your personal requirements. - Let’s dive deeper into the detailed Ghostfolio vs comparison table below to gain a thorough understanding of how Ghostfolio positions itself relative to . We will explore various aspects such as features, data privacy, pricing, and more, allowing you to make a well-informed choice for your personal requirements. + Analicemos en detalle la tabla comparativa entre Ghostfolio y que encontrarás a continuación, para obtener una comprensión completa de cómo se posiciona Ghostfolio en relación con . Exploraremos diversos aspectos como funcionalidades, privacidad de los datos, precios y más, lo que te permitirá tomar una decisión bien fundamentada según tus necesidades personales. apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 43 @@ -5296,13 +5284,13 @@ alternativa-de-software-libre-a kebab-case - libs/common/src/lib/paths.ts - 44 + libs/common/src/lib/routes.ts + 38 Please note that the information provided in the Ghostfolio vs comparison table is based on our independent research and analysis. This website is not affiliated with or any other product mentioned in the comparison. As the landscape of personal finance tools evolves, it is essential to verify any specific details or changes directly from the respective product page. Data needs a refresh? Help us maintain accurate data on GitHub. - Please note that the information provided in the Ghostfolio vs comparison table is based on our independent research and analysis. This website is not affiliated with or any other product mentioned in the comparison. As the landscape of personal finance tools evolves, it is essential to verify any specific details or changes directly from the respective product page. Data needs a refresh? Help us maintain accurate data on GitHub. + Ten en cuenta que la información proporcionada en la tabla comparativa entre Ghostfolio y se basa en nuestra investigación y análisis independientes. Este sitio web no está afiliado con ni con ningún otro producto mencionado en la comparación. Dado que el panorama de las herramientas de finanzas personales evoluciona constantemente, es fundamental verificar cualquier detalle específico o cambio directamente en la página oficial del producto correspondiente. ¿Los datos necesitan una actualización? Ayúdanos a mantener la información precisa en GitHub. apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 311 @@ -5318,7 +5306,7 @@ Get Started - Get Started + Comenzar apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 333 @@ -5326,7 +5314,7 @@ Switzerland - Switzerland + Suiza apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 59 @@ -5338,7 +5326,7 @@ Global - Global + Global apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 60 @@ -5350,7 +5338,7 @@ (Last 24 hours) - (Last 24 hours) + (Últimas 24 horas) apps/client/src/app/pages/open/open-page.html 37 @@ -5358,7 +5346,7 @@ (Last 30 days) - (Last 30 days) + (Últimos 30 días) apps/client/src/app/pages/open/open-page.html 48 @@ -5370,7 +5358,7 @@ (Last 90 days) - (Last 90 days) + (Últimos 90 días) apps/client/src/app/pages/open/open-page.html 127 @@ -5378,7 +5366,7 @@ Choose or drop a file here - Choose or drop a file here + Elige o suelta un archivo aquí apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html 84 @@ -5386,7 +5374,7 @@ You are using the Live Demo. - You are using the Live Demo. + Estás usando la demostración en vivo. apps/client/src/app/app.component.html 12 @@ -5394,7 +5382,7 @@ One-time fee, annual account fees - One-time fee, annual account fees + Tarifa única, tarifas anuales de la cuenta apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 33 @@ -5402,7 +5390,7 @@ Distribution of corporate earnings - Distribution of corporate earnings + Distribución de ganancias corporativas apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 41 @@ -5410,7 +5398,7 @@ Fee - Fee + Tarifa libs/ui/src/lib/i18n.ts 37 @@ -5418,7 +5406,7 @@ Interest - Interest + Interés apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html 307 @@ -5426,7 +5414,7 @@ Revenue for lending out money - Revenue for lending out money + Ingresos por prestar dinero apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 49 @@ -5434,7 +5422,7 @@ Add Tag - Add Tag + Agregar etiqueta apps/client/src/app/components/admin-tag/admin-tag.component.html 8 @@ -5442,7 +5430,7 @@ Do you really want to delete this tag? - Do you really want to delete this tag? + ¿Realmente deseas eliminar esta etiqueta? apps/client/src/app/components/admin-tag/admin-tag.component.ts 85 @@ -5450,7 +5438,7 @@ Update tag - Update tag + Actualizar etiqueta apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 8 @@ -5458,7 +5446,7 @@ Add tag - Add tag + Añadir etiqueta apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 10 @@ -5466,7 +5454,7 @@ Currency Cluster Risks - Currency Cluster Risks + Riesgos de clúster de divisas apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html 93 @@ -5474,7 +5462,7 @@ Account Cluster Risks - Account Cluster Risks + Riesgos de clúster de cuentas apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html 141 @@ -5482,7 +5470,7 @@ Transfer Cash Balance - Transfer Cash Balance + Transferir saldo de efectivo apps/client/src/app/components/accounts-table/accounts-table.component.html 10 @@ -5494,7 +5482,7 @@ Benchmark - Benchmark + Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 346 @@ -5502,7 +5490,7 @@ Version - Version + Versión apps/client/src/app/components/admin-overview/admin-overview.html 7 @@ -5510,7 +5498,7 @@ Settings - Settings + Configuración apps/client/src/app/components/user-account-settings/user-account-settings.html 2 @@ -5518,7 +5506,7 @@ From - From + Desde apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html 11 @@ -5526,7 +5514,7 @@ To - To + A apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html 32 @@ -5534,7 +5522,7 @@ Transfer - Transfer + Transferir apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html 72 @@ -5542,7 +5530,7 @@ Membership - Membership + Membresía apps/client/src/app/pages/user-account/user-account-page-routing.module.ts 24 @@ -5554,7 +5542,7 @@ Access - Access + Acceso apps/client/src/app/pages/user-account/user-account-page-routing.module.ts 29 @@ -5566,7 +5554,7 @@ Find holding... - Find holding... + Buscar holding... libs/ui/src/lib/assistant/assistant.component.ts 143 @@ -5574,7 +5562,7 @@ No entries... - No entries... + No hay entradas... libs/ui/src/lib/assistant/assistant.html 62 @@ -5586,7 +5574,7 @@ Asset Profile - Asset Profile + Perfil de activo apps/client/src/app/components/admin-jobs/admin-jobs.html 35 @@ -5594,7 +5582,7 @@ Do you really want to delete this asset profile? - Do you really want to delete this asset profile? + ¿Realmente deseas eliminar este perfil de activo? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts 37 @@ -5602,7 +5590,7 @@ Search - Search + Buscar apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 16 @@ -5610,7 +5598,7 @@ Add Manually - Add Manually + Añadir manualmente apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 19 @@ -5618,7 +5606,7 @@ Ghostfolio is a personal finance dashboard to keep track of your net worth including cash, stocks, ETFs and cryptocurrencies across multiple platforms. - Ghostfolio es un dashboard de finanzas personales para hacer un seguimiento de tus activos como acciones, ETFs o criptodivisas a través de múltiples plataformas. + Ghostfolio es un dashboard de finanzas personales para hacer un seguimiento de tus activos como acciones, ETFs o criptodivisas a través de múltiples plataformas. apps/client/src/app/pages/i18n/i18n-page.html 4 @@ -5626,15 +5614,15 @@ Last All Time High - Last All Time High + Último máximo histórico libs/ui/src/lib/benchmark/benchmark.component.html - 74 + 83 User - User + Usuario apps/client/src/app/components/admin-users/admin-users.html 29 @@ -5650,10 +5638,10 @@ Open Source Wealth Management Software - Open Source Wealth Management Software + Software de gestión de patrimonio de código abierto apps/client/src/app/pages/i18n/i18n-page.html - 14 + 30 @@ -5666,7 +5654,7 @@ Oops, cash balance transfer has failed. - Oops, cash balance transfer has failed. + Oops, el saldo de efectivo no se ha transferido. apps/client/src/app/pages/accounts/accounts-page.component.ts 318 @@ -5709,7 +5697,7 @@ Do you really want to delete this system message? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 147 + 155 @@ -5717,7 +5705,7 @@ 50-Day Trend libs/ui/src/lib/benchmark/benchmark.component.html - 16 + 25 @@ -5725,7 +5713,7 @@ 200-Day Trend libs/ui/src/lib/benchmark/benchmark.component.html - 45 + 54 @@ -6073,8 +6061,8 @@ auto alojado kebab-case - libs/common/src/lib/paths.ts - 51 + libs/common/src/lib/routes.ts + 43 @@ -6198,7 +6186,7 @@ Internacionalización apps/client/src/app/app-routing.module.ts - 88 + 92 @@ -6894,7 +6882,7 @@ Set API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 113 + 112 @@ -6950,8 +6938,8 @@ guides kebab-case - libs/common/src/lib/paths.ts - 41 + libs/common/src/lib/routes.ts + 35 @@ -6959,8 +6947,8 @@ glossary kebab-case - libs/common/src/lib/paths.ts - 40 + libs/common/src/lib/routes.ts + 34 @@ -7016,7 +7004,7 @@ Do you really want to delete the API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 102 + 98 @@ -7168,7 +7156,7 @@ Link has been copied to the clipboard apps/client/src/app/components/access-table/access-table.component.ts - 66 + 65 @@ -7420,8 +7408,8 @@ terms-of-service kebab-case - libs/common/src/lib/paths.ts - 52 + libs/common/src/lib/routes.ts + 44 @@ -7557,7 +7545,7 @@ Watchlist apps/client/src/app/pages/home/home-page-routing.module.ts - 40 + 43 apps/client/src/app/pages/home/home-page.component.ts @@ -7577,7 +7565,7 @@ Do you really want to delete this item? libs/ui/src/lib/benchmark/benchmark.component.ts - 122 + 132 @@ -7585,7 +7573,7 @@ Log out apps/client/src/app/components/header/header.component.html - 317 + 324 @@ -7593,7 +7581,7 @@ Calculations are based on delayed market data and may not be displayed in real-time. apps/client/src/app/components/home-market/home-market.html - 41 + 43 @@ -7601,26 +7589,80 @@ changelog kebab-case - libs/common/src/lib/paths.ts - 37 + libs/common/src/lib/routes.ts + 31 - - oss-friends - oss-friends - kebab-case + + Demo user account has been synced. + Demo user account has been synced. - libs/common/src/lib/paths.ts - 46 + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 223 - - open - open - kebab-case + + Sync Demo User Account + Sync Demo User Account - libs/common/src/lib/paths.ts - 45 + apps/client/src/app/components/admin-overview/admin-overview.html + 181 + + + + Emergency Fund: Set up + Emergency Fund: Set up + + apps/client/src/app/pages/i18n/i18n-page.html + 14 + + + + No emergency fund has been set up + No emergency fund has been set up + + apps/client/src/app/pages/i18n/i18n-page.html + 15 + + + + An emergency fund has been set up + An emergency fund has been set up + + apps/client/src/app/pages/i18n/i18n-page.html + 18 + + + + Fee Ratio + Fee Ratio + + apps/client/src/app/pages/i18n/i18n-page.html + 21 + + + + The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + + apps/client/src/app/pages/i18n/i18n-page.html + 22 + + + + The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + + apps/client/src/app/pages/i18n/i18n-page.html + 26 + + + + Name + Name + + libs/ui/src/lib/benchmark/benchmark.component.html + 11 diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index 6de915283..7389e81a1 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -70,7 +70,7 @@ Voulez-vous vraiment révoquer cet accès ? apps/client/src/app/components/access-table/access-table.component.ts - 80 + 79 @@ -176,10 +176,6 @@ libs/ui/src/lib/activities-table/activities-table.component.html 138 - - libs/ui/src/lib/benchmark/benchmark.component.html - 4 - libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -362,7 +358,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 155 + 169 @@ -566,7 +562,7 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html - 42 + 38 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html @@ -590,7 +586,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 336 + 337 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -614,7 +610,7 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html - 49 + 45 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html @@ -638,7 +634,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 343 + 344 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -874,7 +870,7 @@ Voulez-vous vraiment supprimer ce code promotionnel ? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 134 + 142 @@ -882,7 +878,7 @@ Voulez-vous vraiment vider le cache ? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 171 + 179 @@ -890,7 +886,7 @@ Veuillez définir votre message système : apps/client/src/app/components/admin-overview/admin-overview.component.ts - 191 + 199 @@ -930,7 +926,7 @@ Étiquettes apps/client/src/app/components/admin-settings/admin-settings.component.html - 143 + 142 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -1006,7 +1002,7 @@ Vider le Cache apps/client/src/app/components/admin-overview/admin-overview.html - 174 + 186 @@ -1026,7 +1022,7 @@ apps/client/src/app/components/header/header.component.html - 225 + 229 @@ -1050,11 +1046,11 @@ apps/client/src/app/components/header/header.component.html - 54 + 58 apps/client/src/app/components/header/header.component.html - 259 + 266 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1108,14 +1104,14 @@ apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts 122 - - apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts - 47 - apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 94 + + libs/common/src/lib/routes.ts + 76 + Benchmark @@ -1138,11 +1134,11 @@ Aperçu apps/client/src/app/components/header/header.component.html - 28 + 30 apps/client/src/app/components/header/header.component.html - 241 + 246 @@ -1150,11 +1146,11 @@ Portefeuille apps/client/src/app/components/header/header.component.html - 41 + 44 apps/client/src/app/components/header/header.component.html - 251 + 256 @@ -1162,11 +1158,11 @@ Contrôle Administrateur apps/client/src/app/components/header/header.component.html - 68 + 72 apps/client/src/app/components/header/header.component.html - 277 + 284 @@ -1178,11 +1174,11 @@ apps/client/src/app/components/header/header.component.html - 82 + 86 apps/client/src/app/components/header/header.component.html - 289 + 296 apps/client/src/app/pages/resources/overview/resources-overview.component.html @@ -1198,15 +1194,15 @@ apps/client/src/app/components/header/header.component.html - 99 + 103 apps/client/src/app/components/header/header.component.html - 301 + 308 apps/client/src/app/components/header/header.component.html - 377 + 384 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -1222,11 +1218,11 @@ apps/client/src/app/components/header/header.component.html - 117 + 121 apps/client/src/app/components/header/header.component.html - 362 + 369 @@ -1234,7 +1230,7 @@ Moi apps/client/src/app/components/header/header.component.html - 207 + 211 @@ -1242,7 +1238,7 @@ Mon Ghostfolio apps/client/src/app/components/header/header.component.html - 266 + 273 @@ -1250,7 +1246,7 @@ À propos de Ghostfolio apps/client/src/app/components/header/header.component.html - 314 + 321 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -1266,7 +1262,7 @@ apps/client/src/app/components/header/header.component.html - 349 + 356 apps/client/src/app/pages/features/features-page.html @@ -1282,7 +1278,7 @@ apps/client/src/app/components/header/header.component.html - 396 + 403 apps/client/src/app/components/home-market/home-market.html @@ -1298,7 +1294,7 @@ Se connecter apps/client/src/app/components/header/header.component.html - 410 + 417 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -1310,7 +1306,7 @@ Démarrer apps/client/src/app/components/header/header.component.html - 420 + 427 @@ -1318,11 +1314,11 @@ Se connecter apps/client/src/app/app-routing.module.ts - 150 + 154 apps/client/src/app/components/header/header.component.ts - 237 + 242 @@ -1330,7 +1326,7 @@ Oups! Jeton de Sécurité Incorrect. apps/client/src/app/components/header/header.component.ts - 252 + 257 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -1450,7 +1446,7 @@ apps/client/src/app/pages/webauthn/webauthn-page.html - 29 + 30 @@ -1682,7 +1678,7 @@ Signaler une Erreur de Données apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 409 + 407 @@ -2165,8 +2161,8 @@ Accounts Comptes - apps/client/src/app/pages/accounts/accounts-page-routing.module.ts - 13 + libs/common/src/lib/routes.ts + 51 @@ -2362,23 +2358,19 @@ Fonctionnalités apps/client/src/app/app-routing.module.ts - 74 + 78 Holdings Positions - apps/client/src/app/pages/home/home-page-routing.module.ts - 25 - - - apps/client/src/app/pages/home/home-page.component.ts - 44 + libs/common/src/lib/routes.ts + 61 - apps/client/src/app/pages/zen/zen-page.component.ts - 41 + libs/common/src/lib/routes.ts + 86 @@ -2386,7 +2378,7 @@ Résumé apps/client/src/app/pages/home/home-page-routing.module.ts - 30 + 33 apps/client/src/app/pages/home/home-page.component.ts @@ -2398,7 +2390,7 @@ Marchés apps/client/src/app/pages/home/home-page-routing.module.ts - 35 + 38 apps/client/src/app/pages/home/home-page.component.ts @@ -2421,12 +2413,8 @@ Activities Activités - apps/client/src/app/pages/portfolio/activities/activities-page-routing.module.ts - 13 - - - apps/client/src/app/pages/portfolio/portfolio-page.component.ts - 41 + libs/common/src/lib/routes.ts + 73 @@ -2881,8 +2869,8 @@ Registration Enregistrement - apps/client/src/app/pages/register/register-page-routing.module.ts - 13 + libs/common/src/lib/routes.ts + 102 @@ -2958,7 +2946,7 @@ Retour à la Page d’Accueil apps/client/src/app/pages/webauthn/webauthn-page.html - 31 + 33 @@ -2968,21 +2956,17 @@ apps/client/src/app/pages/admin/admin-page.component.ts 29 - - apps/client/src/app/pages/home/home-page.component.ts - 39 - apps/client/src/app/pages/resources/resources-page.component.ts 19 - apps/client/src/app/pages/zen/zen-page-routing.module.ts - 20 + libs/common/src/lib/routes.ts + 64 - apps/client/src/app/pages/zen/zen-page.component.ts - 36 + libs/common/src/lib/routes.ts + 89 @@ -3054,7 +3038,7 @@ Différence avec le Record Historique libs/ui/src/lib/benchmark/benchmark.component.html - 96 + 110 @@ -3062,7 +3046,7 @@ par rapport au record historique libs/ui/src/lib/benchmark/benchmark.component.html - 98 + 112 @@ -3558,7 +3542,7 @@ Mettre à niveau l’Abonnement apps/client/src/app/components/header/header.component.html - 187 + 191 apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html @@ -3842,7 +3826,7 @@ Renouveler l’Abonnement apps/client/src/app/components/header/header.component.html - 185 + 189 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -3942,7 +3926,7 @@ Platformes apps/client/src/app/components/admin-settings/admin-settings.component.html - 137 + 136 @@ -4670,7 +4654,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 188 + 202 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5150,8 +5134,8 @@ foire-aux-questions kebab-case - libs/common/src/lib/paths.ts - 38 + libs/common/src/lib/routes.ts + 32 @@ -5159,8 +5143,8 @@ fonctionnalites kebab-case - libs/common/src/lib/paths.ts - 39 + libs/common/src/lib/routes.ts + 33 @@ -5168,8 +5152,8 @@ a-propos kebab-case - libs/common/src/lib/paths.ts - 36 + libs/common/src/lib/routes.ts + 29 @@ -5177,8 +5161,8 @@ politique-de-confidentialite kebab-case - libs/common/src/lib/paths.ts - 48 + libs/common/src/lib/routes.ts + 41 @@ -5186,8 +5170,8 @@ licence kebab-case - libs/common/src/lib/paths.ts - 42 + libs/common/src/lib/routes.ts + 36 @@ -5195,8 +5179,8 @@ marches kebab-case - libs/common/src/lib/paths.ts - 43 + libs/common/src/lib/routes.ts + 37 @@ -5204,8 +5188,8 @@ prix kebab-case - libs/common/src/lib/paths.ts - 47 + libs/common/src/lib/routes.ts + 40 @@ -5213,8 +5197,12 @@ enregistrement kebab-case - libs/common/src/lib/paths.ts - 49 + libs/common/src/lib/routes.ts + 100 + + + libs/common/src/lib/routes.ts + 101 @@ -5222,8 +5210,8 @@ ressources kebab-case - libs/common/src/lib/paths.ts - 50 + libs/common/src/lib/routes.ts + 42 @@ -5295,8 +5283,8 @@ alternative-open-source-a kebab-case - libs/common/src/lib/paths.ts - 44 + libs/common/src/lib/routes.ts + 38 @@ -5628,7 +5616,7 @@ Dernier All Time High libs/ui/src/lib/benchmark/benchmark.component.html - 74 + 83 @@ -5652,7 +5640,7 @@ Logiciel libre de Gestion de Patrimoine apps/client/src/app/pages/i18n/i18n-page.html - 14 + 30 @@ -5708,7 +5696,7 @@ Confirmer la suppresion de ce message système? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 147 + 155 @@ -5716,7 +5704,7 @@ Tendance 50 jours libs/ui/src/lib/benchmark/benchmark.component.html - 16 + 25 @@ -5724,7 +5712,7 @@ Tendance 200 jours libs/ui/src/lib/benchmark/benchmark.component.html - 45 + 54 @@ -6072,8 +6060,8 @@ self-hosting kebab-case - libs/common/src/lib/paths.ts - 51 + libs/common/src/lib/routes.ts + 43 @@ -6197,7 +6185,7 @@ Internationalisation apps/client/src/app/app-routing.module.ts - 88 + 92 @@ -6893,7 +6881,7 @@ Définir clé API apps/client/src/app/components/admin-settings/admin-settings.component.html - 113 + 112 @@ -6949,8 +6937,8 @@ guides kebab-case - libs/common/src/lib/paths.ts - 41 + libs/common/src/lib/routes.ts + 35 @@ -6958,8 +6946,8 @@ glossaire kebab-case - libs/common/src/lib/paths.ts - 40 + libs/common/src/lib/routes.ts + 34 @@ -7015,7 +7003,7 @@ Voulez-vous vraiment supprimer la clé API? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 102 + 98 @@ -7167,7 +7155,7 @@ Le lien a été copié dans le presse-papiers apps/client/src/app/components/access-table/access-table.component.ts - 66 + 65 @@ -7419,8 +7407,8 @@ conditions-d-utilisation kebab-case - libs/common/src/lib/paths.ts - 52 + libs/common/src/lib/routes.ts + 44 @@ -7556,7 +7544,7 @@ Liste de suivi apps/client/src/app/pages/home/home-page-routing.module.ts - 40 + 43 apps/client/src/app/pages/home/home-page.component.ts @@ -7576,7 +7564,7 @@ Voulez-vous vraiment supprimer cet élément? libs/ui/src/lib/benchmark/benchmark.component.ts - 122 + 132 @@ -7584,42 +7572,96 @@ Se déconnecter apps/client/src/app/components/header/header.component.html - 317 + 324 Calculations are based on delayed market data and may not be displayed in real-time. - Calculations are based on delayed market data and may not be displayed in real-time. + Les calculs sont basés sur des données de marché retardées et peuvent ne pas être affichés en temps réel. apps/client/src/app/components/home-market/home-market.html - 41 + 43 changelog - changelog + journal-des-modifications kebab-case - libs/common/src/lib/paths.ts - 37 + libs/common/src/lib/routes.ts + 31 - - oss-friends - oss-friends - kebab-case + + Demo user account has been synced. + Le compte utilisateur de démonstration a été synchronisé. - libs/common/src/lib/paths.ts - 46 + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 223 - - open - open - kebab-case + + Sync Demo User Account + Synchroniser le compte utilisateur de démonstration - libs/common/src/lib/paths.ts - 45 + apps/client/src/app/components/admin-overview/admin-overview.html + 181 + + + + Emergency Fund: Set up + Fonds d’urgence : Mise en place + + apps/client/src/app/pages/i18n/i18n-page.html + 14 + + + + No emergency fund has been set up + Aucun fonds d’urgence n’a été mis en place + + apps/client/src/app/pages/i18n/i18n-page.html + 15 + + + + An emergency fund has been set up + Un fonds d’urgence a été mis en place + + apps/client/src/app/pages/i18n/i18n-page.html + 18 + + + + Fee Ratio + Ratio de frais + + apps/client/src/app/pages/i18n/i18n-page.html + 21 + + + + The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + Les frais dépassent ${thresholdMax}% de votre investissement initial (${feeRatio}%) + + apps/client/src/app/pages/i18n/i18n-page.html + 22 + + + + The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + Les frais ne dépassent pas ${thresholdMax}% de votre investissement initial (${feeRatio}%) + + apps/client/src/app/pages/i18n/i18n-page.html + 26 + + + + Name + Nom + + libs/ui/src/lib/benchmark/benchmark.component.html + 11 diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index cbbe11d88..9d98d4da9 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -79,7 +79,7 @@ Vuoi davvero revocare l’accesso concesso? apps/client/src/app/components/access-table/access-table.component.ts - 80 + 79 @@ -169,10 +169,6 @@ libs/ui/src/lib/activities-table/activities-table.component.html 138 - - libs/ui/src/lib/benchmark/benchmark.component.html - 4 - libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -307,7 +303,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 155 + 169 @@ -511,7 +507,7 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html - 42 + 38 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html @@ -535,7 +531,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 336 + 337 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -559,7 +555,7 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html - 49 + 45 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html @@ -583,7 +579,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 343 + 344 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -635,7 +631,7 @@ Vuoi davvero eliminare questo buono? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 134 + 142 @@ -643,7 +639,7 @@ Vuoi davvero svuotare la cache? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 171 + 179 @@ -651,7 +647,7 @@ Imposta il messaggio di sistema: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 191 + 199 @@ -747,7 +743,7 @@ Svuota la cache apps/client/src/app/components/admin-overview/admin-overview.html - 174 + 186 @@ -767,7 +763,7 @@ apps/client/src/app/components/header/header.component.html - 225 + 229 @@ -807,11 +803,11 @@ Panoramica apps/client/src/app/components/header/header.component.html - 28 + 30 apps/client/src/app/components/header/header.component.html - 241 + 246 @@ -819,11 +815,11 @@ Portafoglio apps/client/src/app/components/header/header.component.html - 41 + 44 apps/client/src/app/components/header/header.component.html - 251 + 256 @@ -839,11 +835,11 @@ apps/client/src/app/components/header/header.component.html - 54 + 58 apps/client/src/app/components/header/header.component.html - 259 + 266 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -859,11 +855,11 @@ Controllo amministrativo apps/client/src/app/components/header/header.component.html - 68 + 72 apps/client/src/app/components/header/header.component.html - 277 + 284 @@ -875,11 +871,11 @@ apps/client/src/app/components/header/header.component.html - 82 + 86 apps/client/src/app/components/header/header.component.html - 289 + 296 apps/client/src/app/pages/resources/overview/resources-overview.component.html @@ -895,15 +891,15 @@ apps/client/src/app/components/header/header.component.html - 99 + 103 apps/client/src/app/components/header/header.component.html - 301 + 308 apps/client/src/app/components/header/header.component.html - 377 + 384 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -919,11 +915,11 @@ apps/client/src/app/components/header/header.component.html - 117 + 121 apps/client/src/app/components/header/header.component.html - 362 + 369 @@ -931,7 +927,7 @@ Io apps/client/src/app/components/header/header.component.html - 207 + 211 @@ -939,7 +935,7 @@ Il mio Ghostfolio apps/client/src/app/components/header/header.component.html - 266 + 273 @@ -947,7 +943,7 @@ Informazioni su Ghostfolio apps/client/src/app/components/header/header.component.html - 314 + 321 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -963,7 +959,7 @@ apps/client/src/app/components/header/header.component.html - 349 + 356 apps/client/src/app/pages/features/features-page.html @@ -979,7 +975,7 @@ apps/client/src/app/components/header/header.component.html - 396 + 403 apps/client/src/app/components/home-market/home-market.html @@ -1007,11 +1003,11 @@ Accedi apps/client/src/app/app-routing.module.ts - 150 + 154 apps/client/src/app/components/header/header.component.ts - 237 + 242 @@ -1019,7 +1015,7 @@ Ops! Token di sicurezza errato. apps/client/src/app/components/header/header.component.ts - 252 + 257 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -1099,7 +1095,7 @@ apps/client/src/app/pages/webauthn/webauthn-page.html - 29 + 30 @@ -1131,7 +1127,7 @@ Accedi apps/client/src/app/components/header/header.component.html - 410 + 417 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -1323,7 +1319,7 @@ Tag apps/client/src/app/components/admin-settings/admin-settings.component.html - 143 + 142 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -1339,7 +1335,7 @@ Segnala un’anomalia dei dati apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 409 + 407 @@ -1810,8 +1806,8 @@ Accounts Account - apps/client/src/app/pages/accounts/accounts-page-routing.module.ts - 13 + libs/common/src/lib/routes.ts + 51 @@ -1951,7 +1947,7 @@ Funzionalità apps/client/src/app/app-routing.module.ts - 74 + 78 @@ -1961,21 +1957,17 @@ apps/client/src/app/pages/admin/admin-page.component.ts 29 - - apps/client/src/app/pages/home/home-page.component.ts - 39 - apps/client/src/app/pages/resources/resources-page.component.ts 19 - apps/client/src/app/pages/zen/zen-page-routing.module.ts - 20 + libs/common/src/lib/routes.ts + 64 - apps/client/src/app/pages/zen/zen-page.component.ts - 36 + libs/common/src/lib/routes.ts + 89 @@ -1983,7 +1975,7 @@ Mercati apps/client/src/app/pages/home/home-page-routing.module.ts - 35 + 38 apps/client/src/app/pages/home/home-page.component.ts @@ -2162,16 +2154,12 @@ Holdings Partecipazioni - apps/client/src/app/pages/home/home-page-routing.module.ts - 25 - - - apps/client/src/app/pages/home/home-page.component.ts - 44 + libs/common/src/lib/routes.ts + 61 - apps/client/src/app/pages/zen/zen-page.component.ts - 41 + libs/common/src/lib/routes.ts + 86 @@ -2330,12 +2318,8 @@ Activities Attività - apps/client/src/app/pages/portfolio/activities/activities-page-routing.module.ts - 13 - - - apps/client/src/app/pages/portfolio/portfolio-page.component.ts - 41 + libs/common/src/lib/routes.ts + 73 @@ -2369,14 +2353,14 @@ apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts 122 - - apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts - 47 - apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 94 + + libs/common/src/lib/routes.ts + 76 + Currencies @@ -2406,8 +2390,8 @@ Registration Iscrizione - apps/client/src/app/pages/register/register-page-routing.module.ts - 13 + libs/common/src/lib/routes.ts + 102 @@ -2463,7 +2447,7 @@ Torna alla pagina iniziale apps/client/src/app/pages/webauthn/webauthn-page.html - 31 + 33 @@ -2535,7 +2519,7 @@ Variazione rispetto al massimo storico (ATH) libs/ui/src/lib/benchmark/benchmark.component.html - 96 + 110 @@ -2543,7 +2527,7 @@ dal massimo storico (ATH) libs/ui/src/lib/benchmark/benchmark.component.html - 98 + 112 @@ -2575,7 +2559,7 @@ Inizia apps/client/src/app/components/header/header.component.html - 420 + 427 @@ -3343,7 +3327,7 @@ Summario apps/client/src/app/pages/home/home-page-routing.module.ts - 30 + 33 apps/client/src/app/pages/home/home-page.component.ts @@ -3559,7 +3543,7 @@ Aggiorna il piano apps/client/src/app/components/header/header.component.html - 187 + 191 apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html @@ -3843,7 +3827,7 @@ Rinnova il piano apps/client/src/app/components/header/header.component.html - 185 + 189 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -3943,7 +3927,7 @@ Piattaforme apps/client/src/app/components/admin-settings/admin-settings.component.html - 137 + 136 @@ -4671,7 +4655,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 188 + 202 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5151,8 +5135,8 @@ domande-piu-frequenti kebab-case - libs/common/src/lib/paths.ts - 38 + libs/common/src/lib/routes.ts + 32 @@ -5160,8 +5144,8 @@ funzionalita kebab-case - libs/common/src/lib/paths.ts - 39 + libs/common/src/lib/routes.ts + 33 @@ -5169,8 +5153,8 @@ informazioni-su kebab-case - libs/common/src/lib/paths.ts - 36 + libs/common/src/lib/routes.ts + 29 @@ -5178,8 +5162,8 @@ informativa-sulla-privacy kebab-case - libs/common/src/lib/paths.ts - 48 + libs/common/src/lib/routes.ts + 41 @@ -5187,8 +5171,8 @@ licenza kebab-case - libs/common/src/lib/paths.ts - 42 + libs/common/src/lib/routes.ts + 36 @@ -5196,8 +5180,8 @@ mercati kebab-case - libs/common/src/lib/paths.ts - 43 + libs/common/src/lib/routes.ts + 37 @@ -5205,8 +5189,8 @@ prezzi kebab-case - libs/common/src/lib/paths.ts - 47 + libs/common/src/lib/routes.ts + 40 @@ -5214,8 +5198,12 @@ iscrizione kebab-case - libs/common/src/lib/paths.ts - 49 + libs/common/src/lib/routes.ts + 100 + + + libs/common/src/lib/routes.ts + 101 @@ -5223,8 +5211,8 @@ risorse kebab-case - libs/common/src/lib/paths.ts - 50 + libs/common/src/lib/routes.ts + 42 @@ -5296,8 +5284,8 @@ alternativa-open-source-a kebab-case - libs/common/src/lib/paths.ts - 44 + libs/common/src/lib/routes.ts + 38 @@ -5629,7 +5617,7 @@ Ultimo massimo storico libs/ui/src/lib/benchmark/benchmark.component.html - 74 + 83 @@ -5653,7 +5641,7 @@ Software Open Source per la gestione della tua ricchezza apps/client/src/app/pages/i18n/i18n-page.html - 14 + 30 @@ -5709,7 +5697,7 @@ Confermi di voler cancellare questo messaggio di sistema? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 147 + 155 @@ -5717,7 +5705,7 @@ Trend a 50 giorni libs/ui/src/lib/benchmark/benchmark.component.html - 16 + 25 @@ -5725,7 +5713,7 @@ Trend a 200 giorni libs/ui/src/lib/benchmark/benchmark.component.html - 45 + 54 @@ -6073,8 +6061,8 @@ self-hosting kebab-case - libs/common/src/lib/paths.ts - 51 + libs/common/src/lib/routes.ts + 43 @@ -6198,7 +6186,7 @@ Internazionalizzazione apps/client/src/app/app-routing.module.ts - 88 + 92 @@ -6894,7 +6882,7 @@ Imposta API Key apps/client/src/app/components/admin-settings/admin-settings.component.html - 113 + 112 @@ -6950,8 +6938,8 @@ guide kebab-case - libs/common/src/lib/paths.ts - 41 + libs/common/src/lib/routes.ts + 35 @@ -6959,8 +6947,8 @@ glossario kebab-case - libs/common/src/lib/paths.ts - 40 + libs/common/src/lib/routes.ts + 34 @@ -7016,7 +7004,7 @@ Vuoi davvero eliminare l’API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 102 + 98 @@ -7168,7 +7156,7 @@ Il link è stato copiato negli appunti apps/client/src/app/components/access-table/access-table.component.ts - 66 + 65 @@ -7420,8 +7408,8 @@ termini-e-condizioni kebab-case - libs/common/src/lib/paths.ts - 52 + libs/common/src/lib/routes.ts + 44 @@ -7557,7 +7545,7 @@ Watchlist apps/client/src/app/pages/home/home-page-routing.module.ts - 40 + 43 apps/client/src/app/pages/home/home-page.component.ts @@ -7577,7 +7565,7 @@ Vuoi davvero eliminare questo elemento? libs/ui/src/lib/benchmark/benchmark.component.ts - 122 + 132 @@ -7585,7 +7573,7 @@ Esci apps/client/src/app/components/header/header.component.html - 317 + 324 @@ -7593,7 +7581,7 @@ I calcoli sono basati su dati di mercato ritardati e potrebbero non essere visualizzati in tempo reale. apps/client/src/app/components/home-market/home-market.html - 41 + 43 @@ -7601,26 +7589,80 @@ registro-delle-modifiche kebab-case - libs/common/src/lib/paths.ts - 37 + libs/common/src/lib/routes.ts + 31 - - oss-friends - oss-amici - kebab-case + + Demo user account has been synced. + Demo user account has been synced. - libs/common/src/lib/paths.ts - 46 + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 223 - - open - open - kebab-case + + Sync Demo User Account + Sync Demo User Account - libs/common/src/lib/paths.ts - 45 + apps/client/src/app/components/admin-overview/admin-overview.html + 181 + + + + Emergency Fund: Set up + Emergency Fund: Set up + + apps/client/src/app/pages/i18n/i18n-page.html + 14 + + + + No emergency fund has been set up + No emergency fund has been set up + + apps/client/src/app/pages/i18n/i18n-page.html + 15 + + + + An emergency fund has been set up + An emergency fund has been set up + + apps/client/src/app/pages/i18n/i18n-page.html + 18 + + + + Fee Ratio + Fee Ratio + + apps/client/src/app/pages/i18n/i18n-page.html + 21 + + + + The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + + apps/client/src/app/pages/i18n/i18n-page.html + 22 + + + + The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + + apps/client/src/app/pages/i18n/i18n-page.html + 26 + + + + Name + Name + + libs/ui/src/lib/benchmark/benchmark.component.html + 11 diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index 0b8f7c8f7..8a6dd3cf7 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -78,7 +78,7 @@ Wil je deze verleende toegang echt intrekken? apps/client/src/app/components/access-table/access-table.component.ts - 80 + 79 @@ -168,10 +168,6 @@ libs/ui/src/lib/activities-table/activities-table.component.html 138 - - libs/ui/src/lib/benchmark/benchmark.component.html - 4 - libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -306,7 +302,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 155 + 169 @@ -510,7 +506,7 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html - 42 + 38 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html @@ -534,7 +530,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 336 + 337 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -558,7 +554,7 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html - 49 + 45 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html @@ -582,7 +578,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 343 + 344 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -634,7 +630,7 @@ Wil je deze coupon echt verwijderen? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 134 + 142 @@ -642,7 +638,7 @@ Wil je echt de cache legen? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 171 + 179 @@ -650,7 +646,7 @@ Stel je systeemboodschap in: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 191 + 199 @@ -746,7 +742,7 @@ Cache legen apps/client/src/app/components/admin-overview/admin-overview.html - 174 + 186 @@ -766,7 +762,7 @@ apps/client/src/app/components/header/header.component.html - 225 + 229 @@ -806,11 +802,11 @@ Overzicht apps/client/src/app/components/header/header.component.html - 28 + 30 apps/client/src/app/components/header/header.component.html - 241 + 246 @@ -818,11 +814,11 @@ Portefeuille apps/client/src/app/components/header/header.component.html - 41 + 44 apps/client/src/app/components/header/header.component.html - 251 + 256 @@ -838,11 +834,11 @@ apps/client/src/app/components/header/header.component.html - 54 + 58 apps/client/src/app/components/header/header.component.html - 259 + 266 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -858,11 +854,11 @@ Beheer apps/client/src/app/components/header/header.component.html - 68 + 72 apps/client/src/app/components/header/header.component.html - 277 + 284 @@ -874,11 +870,11 @@ apps/client/src/app/components/header/header.component.html - 82 + 86 apps/client/src/app/components/header/header.component.html - 289 + 296 apps/client/src/app/pages/resources/overview/resources-overview.component.html @@ -894,15 +890,15 @@ apps/client/src/app/components/header/header.component.html - 99 + 103 apps/client/src/app/components/header/header.component.html - 301 + 308 apps/client/src/app/components/header/header.component.html - 377 + 384 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -918,11 +914,11 @@ apps/client/src/app/components/header/header.component.html - 117 + 121 apps/client/src/app/components/header/header.component.html - 362 + 369 @@ -930,7 +926,7 @@ Ik apps/client/src/app/components/header/header.component.html - 207 + 211 @@ -938,7 +934,7 @@ Mijn Ghostfolio apps/client/src/app/components/header/header.component.html - 266 + 273 @@ -946,7 +942,7 @@ Over Ghostfolio apps/client/src/app/components/header/header.component.html - 314 + 321 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -962,7 +958,7 @@ apps/client/src/app/components/header/header.component.html - 349 + 356 apps/client/src/app/pages/features/features-page.html @@ -978,7 +974,7 @@ apps/client/src/app/components/header/header.component.html - 396 + 403 apps/client/src/app/components/home-market/home-market.html @@ -1006,11 +1002,11 @@ Aanmelden apps/client/src/app/app-routing.module.ts - 150 + 154 apps/client/src/app/components/header/header.component.ts - 237 + 242 @@ -1018,7 +1014,7 @@ Oeps! Onjuiste beveiligingstoken. apps/client/src/app/components/header/header.component.ts - 252 + 257 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -1098,7 +1094,7 @@ apps/client/src/app/pages/webauthn/webauthn-page.html - 29 + 30 @@ -1130,7 +1126,7 @@ Aanmelden apps/client/src/app/components/header/header.component.html - 410 + 417 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -1322,7 +1318,7 @@ Tags apps/client/src/app/components/admin-settings/admin-settings.component.html - 143 + 142 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -1338,7 +1334,7 @@ Gegevensstoring melden apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 409 + 407 @@ -1809,8 +1805,8 @@ Accounts Rekeningen - apps/client/src/app/pages/accounts/accounts-page-routing.module.ts - 13 + libs/common/src/lib/routes.ts + 51 @@ -1950,7 +1946,7 @@ Functionaliteiten apps/client/src/app/app-routing.module.ts - 74 + 78 @@ -1960,21 +1956,17 @@ apps/client/src/app/pages/admin/admin-page.component.ts 29 - - apps/client/src/app/pages/home/home-page.component.ts - 39 - apps/client/src/app/pages/resources/resources-page.component.ts 19 - apps/client/src/app/pages/zen/zen-page-routing.module.ts - 20 + libs/common/src/lib/routes.ts + 64 - apps/client/src/app/pages/zen/zen-page.component.ts - 36 + libs/common/src/lib/routes.ts + 89 @@ -1982,7 +1974,7 @@ Markten apps/client/src/app/pages/home/home-page-routing.module.ts - 35 + 38 apps/client/src/app/pages/home/home-page.component.ts @@ -2161,16 +2153,12 @@ Holdings Posities - apps/client/src/app/pages/home/home-page-routing.module.ts - 25 - - - apps/client/src/app/pages/home/home-page.component.ts - 44 + libs/common/src/lib/routes.ts + 61 - apps/client/src/app/pages/zen/zen-page.component.ts - 41 + libs/common/src/lib/routes.ts + 86 @@ -2329,12 +2317,8 @@ Activities Activiteiten - apps/client/src/app/pages/portfolio/activities/activities-page-routing.module.ts - 13 - - - apps/client/src/app/pages/portfolio/portfolio-page.component.ts - 41 + libs/common/src/lib/routes.ts + 73 @@ -2368,14 +2352,14 @@ apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts 122 - - apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts - 47 - apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 94 + + libs/common/src/lib/routes.ts + 76 + Currencies @@ -2405,8 +2389,8 @@ Registration Registratie - apps/client/src/app/pages/register/register-page-routing.module.ts - 13 + libs/common/src/lib/routes.ts + 102 @@ -2462,7 +2446,7 @@ Ga terug naar de startpagina apps/client/src/app/pages/webauthn/webauthn-page.html - 31 + 33 @@ -2534,7 +2518,7 @@ Verandering van Recordhoogte libs/ui/src/lib/benchmark/benchmark.component.html - 96 + 110 @@ -2542,7 +2526,7 @@ van ATH libs/ui/src/lib/benchmark/benchmark.component.html - 98 + 112 @@ -2574,7 +2558,7 @@ Aan de slag apps/client/src/app/components/header/header.component.html - 420 + 427 @@ -3342,7 +3326,7 @@ Samenvatting apps/client/src/app/pages/home/home-page-routing.module.ts - 30 + 33 apps/client/src/app/pages/home/home-page.component.ts @@ -3558,7 +3542,7 @@ Abonnement uitbreiden apps/client/src/app/components/header/header.component.html - 187 + 191 apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html @@ -3842,7 +3826,7 @@ Abonnement Vernieuwen apps/client/src/app/components/header/header.component.html - 185 + 189 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -3942,7 +3926,7 @@ Platforms apps/client/src/app/components/admin-settings/admin-settings.component.html - 137 + 136 @@ -4670,7 +4654,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 188 + 202 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5150,8 +5134,8 @@ veelgestelde-vragen kebab-case - libs/common/src/lib/paths.ts - 38 + libs/common/src/lib/routes.ts + 32 @@ -5159,8 +5143,8 @@ functionaliteiten kebab-case - libs/common/src/lib/paths.ts - 39 + libs/common/src/lib/routes.ts + 33 @@ -5168,8 +5152,8 @@ over kebab-case - libs/common/src/lib/paths.ts - 36 + libs/common/src/lib/routes.ts + 29 @@ -5177,8 +5161,8 @@ privacybeleid kebab-case - libs/common/src/lib/paths.ts - 48 + libs/common/src/lib/routes.ts + 41 @@ -5186,8 +5170,8 @@ licentie kebab-case - libs/common/src/lib/paths.ts - 42 + libs/common/src/lib/routes.ts + 36 @@ -5195,8 +5179,8 @@ markten kebab-case - libs/common/src/lib/paths.ts - 43 + libs/common/src/lib/routes.ts + 37 @@ -5204,8 +5188,8 @@ prijzen kebab-case - libs/common/src/lib/paths.ts - 47 + libs/common/src/lib/routes.ts + 40 @@ -5213,8 +5197,12 @@ registratie kebab-case - libs/common/src/lib/paths.ts - 49 + libs/common/src/lib/routes.ts + 100 + + + libs/common/src/lib/routes.ts + 101 @@ -5222,8 +5210,8 @@ bronnen kebab-case - libs/common/src/lib/paths.ts - 50 + libs/common/src/lib/routes.ts + 42 @@ -5295,8 +5283,8 @@ open-source-alternatief-voor kebab-case - libs/common/src/lib/paths.ts - 44 + libs/common/src/lib/routes.ts + 38 @@ -5481,7 +5469,7 @@ Transfer Cash Balance - Transfer Cash Balance + Contant saldo overboeken apps/client/src/app/components/accounts-table/accounts-table.component.html 10 @@ -5628,7 +5616,7 @@ Laatste Recordhoogte libs/ui/src/lib/benchmark/benchmark.component.html - 74 + 83 @@ -5652,7 +5640,7 @@ Open Source Vermogensbeheer Software apps/client/src/app/pages/i18n/i18n-page.html - 14 + 30 @@ -5708,7 +5696,7 @@ Wilt u dit systeembericht echt verwijderen? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 147 + 155 @@ -5716,7 +5704,7 @@ 50-Daagse Trend libs/ui/src/lib/benchmark/benchmark.component.html - 16 + 25 @@ -5724,7 +5712,7 @@ 200-Daagse Trend libs/ui/src/lib/benchmark/benchmark.component.html - 45 + 54 @@ -5933,7 +5921,7 @@ WTD - WTD + Week tot nu toe libs/ui/src/lib/assistant/assistant.component.ts 222 @@ -5965,7 +5953,7 @@ View - View + Weergave apps/client/src/app/components/access-table/access-table.component.html 23 @@ -6072,8 +6060,8 @@ zelf hosten kebab-case - libs/common/src/lib/paths.ts - 51 + libs/common/src/lib/routes.ts + 43 @@ -6197,7 +6185,7 @@ Internationalizering apps/client/src/app/app-routing.module.ts - 88 + 92 @@ -6893,7 +6881,7 @@ API-sleutel instellen apps/client/src/app/components/admin-settings/admin-settings.component.html - 113 + 112 @@ -6949,8 +6937,8 @@ gidsen kebab-case - libs/common/src/lib/paths.ts - 41 + libs/common/src/lib/routes.ts + 35 @@ -6958,8 +6946,8 @@ woordenlijst kebab-case - libs/common/src/lib/paths.ts - 40 + libs/common/src/lib/routes.ts + 34 @@ -7015,7 +7003,7 @@ Wilt u de API-sleutel echt verwijderen? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 102 + 98 @@ -7167,7 +7155,7 @@ Link is gekopieerd naar klemboord apps/client/src/app/components/access-table/access-table.component.ts - 66 + 65 @@ -7188,7 +7176,7 @@ Lazy - Lazy + Lui apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 138 @@ -7196,7 +7184,7 @@ Instant - Instant + Direct apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 142 @@ -7220,7 +7208,7 @@ Selector - Selector + Kiezer apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 439 @@ -7419,8 +7407,8 @@ servicevoorwaarden kebab-case - libs/common/src/lib/paths.ts - 52 + libs/common/src/lib/routes.ts + 44 @@ -7556,7 +7544,7 @@ Volglijst apps/client/src/app/pages/home/home-page-routing.module.ts - 40 + 43 apps/client/src/app/pages/home/home-page.component.ts @@ -7576,7 +7564,7 @@ Wilt u dit item echt verwijderen? libs/ui/src/lib/benchmark/benchmark.component.ts - 122 + 132 @@ -7584,42 +7572,96 @@ Uitloggen apps/client/src/app/components/header/header.component.html - 317 + 324 Calculations are based on delayed market data and may not be displayed in real-time. - Calculations are based on delayed market data and may not be displayed in real-time. + Berekeningen zijn gebaseerd op vertraagde marktgegevens en worden mogelijk niet in realtime weergegeven. apps/client/src/app/components/home-market/home-market.html - 41 + 43 changelog - changelog + wijzigingslogboek kebab-case - libs/common/src/lib/paths.ts - 37 + libs/common/src/lib/routes.ts + 31 - - oss-friends - oss-friends - kebab-case + + Demo user account has been synced. + Demo user account has been synced. - libs/common/src/lib/paths.ts - 46 + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 223 - - open - open - kebab-case + + Sync Demo User Account + Sync Demo User Account - libs/common/src/lib/paths.ts - 45 + apps/client/src/app/components/admin-overview/admin-overview.html + 181 + + + + Emergency Fund: Set up + Emergency Fund: Set up + + apps/client/src/app/pages/i18n/i18n-page.html + 14 + + + + No emergency fund has been set up + No emergency fund has been set up + + apps/client/src/app/pages/i18n/i18n-page.html + 15 + + + + An emergency fund has been set up + An emergency fund has been set up + + apps/client/src/app/pages/i18n/i18n-page.html + 18 + + + + Fee Ratio + Fee Ratio + + apps/client/src/app/pages/i18n/i18n-page.html + 21 + + + + The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + + apps/client/src/app/pages/i18n/i18n-page.html + 22 + + + + The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + + apps/client/src/app/pages/i18n/i18n-page.html + 26 + + + + Name + Name + + libs/ui/src/lib/benchmark/benchmark.component.html + 11 diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index 6d46d32df..c063e7beb 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -6,8 +6,8 @@ o-ghostfolio kebab-case - libs/common/src/lib/paths.ts - 36 + libs/common/src/lib/routes.ts + 29 @@ -15,8 +15,8 @@ faq kebab-case - libs/common/src/lib/paths.ts - 38 + libs/common/src/lib/routes.ts + 32 @@ -24,8 +24,8 @@ funkcje kebab-case - libs/common/src/lib/paths.ts - 39 + libs/common/src/lib/routes.ts + 33 @@ -33,8 +33,8 @@ licencja kebab-case - libs/common/src/lib/paths.ts - 42 + libs/common/src/lib/routes.ts + 36 @@ -42,8 +42,8 @@ rynki kebab-case - libs/common/src/lib/paths.ts - 43 + libs/common/src/lib/routes.ts + 37 @@ -51,8 +51,8 @@ cennik kebab-case - libs/common/src/lib/paths.ts - 47 + libs/common/src/lib/routes.ts + 40 @@ -60,8 +60,8 @@ polityka-prywatnosci kebab-case - libs/common/src/lib/paths.ts - 48 + libs/common/src/lib/routes.ts + 41 @@ -69,8 +69,12 @@ zarejestruj kebab-case - libs/common/src/lib/paths.ts - 49 + libs/common/src/lib/routes.ts + 100 + + + libs/common/src/lib/routes.ts + 101 @@ -78,8 +82,8 @@ zasoby kebab-case - libs/common/src/lib/paths.ts - 50 + libs/common/src/lib/routes.ts + 42 @@ -127,7 +131,7 @@ apps/client/src/app/components/header/header.component.html - 396 + 403 apps/client/src/app/components/home-market/home-market.html @@ -147,11 +151,11 @@ apps/client/src/app/components/header/header.component.html - 82 + 86 apps/client/src/app/components/header/header.component.html - 289 + 296 apps/client/src/app/pages/resources/overview/resources-overview.component.html @@ -167,11 +171,11 @@ apps/client/src/app/components/header/header.component.html - 117 + 121 apps/client/src/app/components/header/header.component.html - 362 + 369 @@ -291,7 +295,7 @@ apps/client/src/app/components/header/header.component.html - 349 + 356 apps/client/src/app/pages/features/features-page.html @@ -331,15 +335,15 @@ apps/client/src/app/components/header/header.component.html - 99 + 103 apps/client/src/app/components/header/header.component.html - 301 + 308 apps/client/src/app/components/header/header.component.html - 377 + 384 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -479,7 +483,7 @@ Czy na pewno chcesz cofnąć przyznany dostęp? apps/client/src/app/components/access-table/access-table.component.ts - 80 + 79 @@ -621,10 +625,6 @@ libs/ui/src/lib/activities-table/activities-table.component.html 138 - - libs/ui/src/lib/benchmark/benchmark.component.html - 4 - libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -791,7 +791,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 155 + 169 @@ -991,7 +991,7 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html - 42 + 38 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html @@ -1015,7 +1015,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 336 + 337 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -1039,7 +1039,7 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html - 49 + 45 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html @@ -1063,7 +1063,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 343 + 344 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -1415,7 +1415,7 @@ Czy naprawdę chcesz usunąć ten kupon? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 134 + 142 @@ -1423,7 +1423,7 @@ Czy naprawdę chcesz usunąć tę wiadomość systemową? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 147 + 155 @@ -1431,7 +1431,7 @@ Czy naprawdę chcesz wyczyścić pamięć podręczną? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 171 + 179 @@ -1439,7 +1439,7 @@ Proszę ustawić swoją wiadomość systemową: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 191 + 199 @@ -1547,7 +1547,7 @@ Wyczyszczenie pamięci podręcznej apps/client/src/app/components/admin-overview/admin-overview.html - 174 + 186 @@ -1591,11 +1591,11 @@ apps/client/src/app/components/header/header.component.html - 54 + 58 apps/client/src/app/components/header/header.component.html - 259 + 266 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1635,7 +1635,7 @@ Platformy apps/client/src/app/components/admin-settings/admin-settings.component.html - 137 + 136 @@ -1643,7 +1643,7 @@ Tagi apps/client/src/app/components/admin-settings/admin-settings.component.html - 143 + 142 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -1777,14 +1777,14 @@ apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts 122 - - apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts - 47 - apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 94 + + libs/common/src/lib/routes.ts + 76 + Benchmark @@ -1807,11 +1807,11 @@ Przegląd apps/client/src/app/components/header/header.component.html - 28 + 30 apps/client/src/app/components/header/header.component.html - 241 + 246 @@ -1819,11 +1819,11 @@ Portfel apps/client/src/app/components/header/header.component.html - 41 + 44 apps/client/src/app/components/header/header.component.html - 251 + 256 @@ -1831,11 +1831,11 @@ Nadzór Administratora apps/client/src/app/components/header/header.component.html - 68 + 72 apps/client/src/app/components/header/header.component.html - 277 + 284 @@ -1843,7 +1843,7 @@ Ja apps/client/src/app/components/header/header.component.html - 207 + 211 @@ -1855,7 +1855,7 @@ apps/client/src/app/components/header/header.component.html - 225 + 229 @@ -1863,7 +1863,7 @@ Moje Ghostfolio apps/client/src/app/components/header/header.component.html - 266 + 273 @@ -1871,7 +1871,7 @@ O Ghostfolio apps/client/src/app/components/header/header.component.html - 314 + 321 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -1883,7 +1883,7 @@ Zaloguj się apps/client/src/app/components/header/header.component.html - 410 + 417 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -1895,7 +1895,7 @@ Rozpocznij apps/client/src/app/components/header/header.component.html - 420 + 427 @@ -1903,11 +1903,11 @@ Zaloguj się apps/client/src/app/app-routing.module.ts - 150 + 154 apps/client/src/app/components/header/header.component.ts - 237 + 242 @@ -1915,7 +1915,7 @@ Ups! Nieprawidłowy token bezpieczeństwa. apps/client/src/app/components/header/header.component.ts - 252 + 257 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -2119,7 +2119,7 @@ apps/client/src/app/pages/webauthn/webauthn-page.html - 29 + 30 @@ -2403,7 +2403,7 @@ Zgłoś Błąd Danych apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 409 + 407 @@ -2543,7 +2543,7 @@ Ulepsz Plan apps/client/src/app/components/header/header.component.html - 187 + 191 apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html @@ -3014,8 +3014,8 @@ Accounts Konta - apps/client/src/app/pages/accounts/accounts-page-routing.module.ts - 13 + libs/common/src/lib/routes.ts + 51 @@ -3133,21 +3133,17 @@ apps/client/src/app/pages/admin/admin-page.component.ts 29 - - apps/client/src/app/pages/home/home-page.component.ts - 39 - apps/client/src/app/pages/resources/resources-page.component.ts 19 - apps/client/src/app/pages/zen/zen-page-routing.module.ts - 20 + libs/common/src/lib/routes.ts + 64 - apps/client/src/app/pages/zen/zen-page.component.ts - 36 + libs/common/src/lib/routes.ts + 89 @@ -3207,7 +3203,7 @@ Funkcje apps/client/src/app/app-routing.module.ts - 74 + 78 @@ -3338,16 +3334,12 @@ Holdings Inwestycje - apps/client/src/app/pages/home/home-page-routing.module.ts - 25 - - - apps/client/src/app/pages/home/home-page.component.ts - 44 + libs/common/src/lib/routes.ts + 61 - apps/client/src/app/pages/zen/zen-page.component.ts - 41 + libs/common/src/lib/routes.ts + 86 @@ -3355,7 +3347,7 @@ Podsumowanie apps/client/src/app/pages/home/home-page-routing.module.ts - 30 + 33 apps/client/src/app/pages/home/home-page.component.ts @@ -3367,7 +3359,7 @@ Rynki apps/client/src/app/pages/home/home-page-routing.module.ts - 35 + 38 apps/client/src/app/pages/home/home-page.component.ts @@ -3407,7 +3399,7 @@ Oprogramowanie Open Source do Zarządzania Majątkiem apps/client/src/app/pages/i18n/i18n-page.html - 14 + 30 @@ -3806,12 +3798,8 @@ Activities Aktywności - apps/client/src/app/pages/portfolio/activities/activities-page-routing.module.ts - 13 - - - apps/client/src/app/pages/portfolio/portfolio-page.component.ts - 41 + libs/common/src/lib/routes.ts + 73 @@ -4195,7 +4183,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 188 + 202 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -4571,7 +4559,7 @@ Odnów Plan apps/client/src/app/components/header/header.component.html - 185 + 189 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -4642,8 +4630,8 @@ Registration Rejestracja - apps/client/src/app/pages/register/register-page-routing.module.ts - 13 + libs/common/src/lib/routes.ts + 102 @@ -4683,8 +4671,8 @@ alternatywa-open-source-dla kebab-case - libs/common/src/lib/paths.ts - 44 + libs/common/src/lib/routes.ts + 38 @@ -5044,7 +5032,7 @@ Wróć do Strony Głównej apps/client/src/app/pages/webauthn/webauthn-page.html - 31 + 33 @@ -5164,7 +5152,7 @@ Ostatni Najwyższy Punkt w Historii libs/ui/src/lib/benchmark/benchmark.component.html - 74 + 83 @@ -5172,7 +5160,7 @@ Zmiana od Najwyższego Punktu w Historii libs/ui/src/lib/benchmark/benchmark.component.html - 96 + 110 @@ -5180,7 +5168,7 @@ od ATH libs/ui/src/lib/benchmark/benchmark.component.html - 98 + 112 @@ -5716,7 +5704,7 @@ 50-Dniowy Trend libs/ui/src/lib/benchmark/benchmark.component.html - 16 + 25 @@ -5724,7 +5712,7 @@ 200-Dniowy Trend libs/ui/src/lib/benchmark/benchmark.component.html - 45 + 54 @@ -6072,8 +6060,8 @@ wlasny-hosting kebab-case - libs/common/src/lib/paths.ts - 51 + libs/common/src/lib/routes.ts + 43 @@ -6170,7 +6158,7 @@ {VAR_PLURAL, plural, =1 {activity} other {activities}} - {VAR_PLURAL, plural, =1 {activity} other {activities}} + {VAR_PLURAL, plural, =1 {działalność} other {działalność}} apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html 14 @@ -6197,7 +6185,7 @@ Internacjonalizacja apps/client/src/app/app-routing.module.ts - 88 + 92 @@ -6893,12 +6881,12 @@ Skonfiguruj klucz API apps/client/src/app/components/admin-settings/admin-settings.component.html - 113 + 112 Get access to 80’000+ tickers from over 50 exchanges - Uzyskaj dostęp do ponad 100 000 pasków notowań giełdowych z ponad 50 giełd + Uzyskaj dostęp do ponad 80 000 pasków notowań giełdowych z ponad 50 giełd libs/ui/src/lib/i18n.ts 24 @@ -6949,8 +6937,8 @@ poradniki kebab-case - libs/common/src/lib/paths.ts - 41 + libs/common/src/lib/routes.ts + 35 @@ -6958,8 +6946,8 @@ slowniczek kebab-case - libs/common/src/lib/paths.ts - 40 + libs/common/src/lib/routes.ts + 34 @@ -7015,7 +7003,7 @@ Czy na pewno chcesz usunąć klucz API?? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 102 + 98 @@ -7167,7 +7155,7 @@ Link został skopiowany do schowka apps/client/src/app/components/access-table/access-table.component.ts - 66 + 65 @@ -7204,7 +7192,7 @@ Default Market Price - Default Market Price + Domyślna cena rynkowa apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 386 @@ -7212,7 +7200,7 @@ Mode - Mode + Tryb apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 423 @@ -7220,7 +7208,7 @@ Selector - Selector + Selektor apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 439 @@ -7228,7 +7216,7 @@ HTTP Request Headers - HTTP Request Headers + Nagłówki żądań HTTP apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 399 @@ -7236,7 +7224,7 @@ end of day - end of day + koniec dnia apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 138 @@ -7244,7 +7232,7 @@ real-time - real-time + w czasie rzeczywistym apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 142 @@ -7268,7 +7256,7 @@ Market Data - Market Data + Dane rynkowe apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html 374 @@ -7419,8 +7407,8 @@ warunki-świadczenia-usług kebab-case - libs/common/src/lib/paths.ts - 52 + libs/common/src/lib/routes.ts + 44 @@ -7477,7 +7465,7 @@ with API access for - with API access for + z dostępem API dla apps/client/src/app/pages/pricing/pricing-page.html 266 @@ -7485,7 +7473,7 @@ Gather Recent Historical Market Data - Gather Recent Historical Market Data + Zbierz najnowsze historyczne dane rynkowe apps/client/src/app/components/admin-market-data/admin-market-data.html 226 @@ -7493,7 +7481,7 @@ Gather All Historical Market Data - Gather All Historical Market Data + Zbierz wszystkie historyczne dane rynkowe apps/client/src/app/components/admin-market-data/admin-market-data.html 231 @@ -7501,7 +7489,7 @@ Gather Historical Market Data - Gather Historical Market Data + Zbierz historyczne dane rynkowe apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 29 @@ -7509,7 +7497,7 @@ Data Gathering is off - Data Gathering is off + Zbieranie danych jest wyłączone apps/client/src/app/components/admin-market-data/admin-market-data.html 38 @@ -7517,7 +7505,7 @@ Performance Calculation - Performance Calculation + Obliczanie wydajności apps/client/src/app/components/user-account-settings/user-account-settings.html 31 @@ -7525,7 +7513,7 @@ someone - someone + ktoś apps/client/src/app/pages/public/public-page.component.ts 33 @@ -7533,7 +7521,7 @@ Add asset to watchlist - Add asset to watchlist + Dodaj zasób do listy obserwowanych apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html 7 @@ -7541,7 +7529,7 @@ Watchlist - Watchlist + Lista obserwowanych apps/client/src/app/components/home-watchlist/home-watchlist.html 4 @@ -7553,10 +7541,10 @@ Watchlist - Watchlist + Lista obserwowanych apps/client/src/app/pages/home/home-page-routing.module.ts - 40 + 43 apps/client/src/app/pages/home/home-page.component.ts @@ -7565,7 +7553,7 @@ Get Early Access - Get Early Access + Uzyskaj wcześniejszy dostęp apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html 29 @@ -7573,53 +7561,107 @@ Do you really want to delete this item? - Do you really want to delete this item? + Czy na pewno chcesz usunąć ten element? libs/ui/src/lib/benchmark/benchmark.component.ts - 122 + 132 Log out - Log out + Wyloguj się apps/client/src/app/components/header/header.component.html - 317 + 324 Calculations are based on delayed market data and may not be displayed in real-time. - Calculations are based on delayed market data and may not be displayed in real-time. + Obliczenia opierają się na opóźnionych danych rynkowych i mogą nie być wyświetlane w czasie rzeczywistym. apps/client/src/app/components/home-market/home-market.html - 41 + 43 changelog - changelog + dziennik zmian kebab-case - libs/common/src/lib/paths.ts - 37 + libs/common/src/lib/routes.ts + 31 - - oss-friends - oss-friends - kebab-case + + Demo user account has been synced. + Konto użytkownika demonstracyjnego zostało zsynchronizowane. - libs/common/src/lib/paths.ts - 46 + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 223 - - open - open - kebab-case + + Sync Demo User Account + Synchronizuj konto użytkownika demonstracyjnego - libs/common/src/lib/paths.ts - 45 + apps/client/src/app/components/admin-overview/admin-overview.html + 181 + + + + Emergency Fund: Set up + Fundusz awaryjny: Utworzenie + + apps/client/src/app/pages/i18n/i18n-page.html + 14 + + + + No emergency fund has been set up + Nie utworzono funduszu awaryjnego + + apps/client/src/app/pages/i18n/i18n-page.html + 15 + + + + An emergency fund has been set up + Utworzono fundusz awaryjny + + apps/client/src/app/pages/i18n/i18n-page.html + 18 + + + + Fee Ratio + Stosunek opłat + + apps/client/src/app/pages/i18n/i18n-page.html + 21 + + + + The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + + apps/client/src/app/pages/i18n/i18n-page.html + 22 + + + + The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + + apps/client/src/app/pages/i18n/i18n-page.html + 26 + + + + Name + Nazwa + + libs/ui/src/lib/benchmark/benchmark.component.html + 11 diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index e83918250..8846806a9 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -70,7 +70,7 @@ Pretende realmente revogar este acesso concedido? apps/client/src/app/components/access-table/access-table.component.ts - 80 + 79 @@ -176,10 +176,6 @@ libs/ui/src/lib/activities-table/activities-table.component.html 138 - - libs/ui/src/lib/benchmark/benchmark.component.html - 4 - libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -362,7 +358,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 155 + 169 @@ -566,7 +562,7 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html - 42 + 38 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html @@ -590,7 +586,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 336 + 337 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -614,7 +610,7 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html - 49 + 45 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html @@ -638,7 +634,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 343 + 344 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -778,7 +774,7 @@ Deseja realmente eliminar este cupão? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 134 + 142 @@ -786,7 +782,7 @@ Deseja realmente limpar a cache? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 171 + 179 @@ -794,7 +790,7 @@ Por favor, defina a sua mensagem do sistema: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 191 + 199 @@ -878,7 +874,7 @@ Limpar Cache apps/client/src/app/components/admin-overview/admin-overview.html - 174 + 186 @@ -898,7 +894,7 @@ apps/client/src/app/components/header/header.component.html - 225 + 229 @@ -922,11 +918,11 @@ apps/client/src/app/components/header/header.component.html - 54 + 58 apps/client/src/app/components/header/header.component.html - 259 + 266 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -980,14 +976,14 @@ apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts 122 - - apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts - 47 - apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 94 + + libs/common/src/lib/routes.ts + 76 + Benchmark @@ -1010,11 +1006,11 @@ Visão geral apps/client/src/app/components/header/header.component.html - 28 + 30 apps/client/src/app/components/header/header.component.html - 241 + 246 @@ -1022,11 +1018,11 @@ Portefólio apps/client/src/app/components/header/header.component.html - 41 + 44 apps/client/src/app/components/header/header.component.html - 251 + 256 @@ -1034,11 +1030,11 @@ Controlo Administrativo apps/client/src/app/components/header/header.component.html - 68 + 72 apps/client/src/app/components/header/header.component.html - 277 + 284 @@ -1050,11 +1046,11 @@ apps/client/src/app/components/header/header.component.html - 82 + 86 apps/client/src/app/components/header/header.component.html - 289 + 296 apps/client/src/app/pages/resources/overview/resources-overview.component.html @@ -1070,15 +1066,15 @@ apps/client/src/app/components/header/header.component.html - 99 + 103 apps/client/src/app/components/header/header.component.html - 301 + 308 apps/client/src/app/components/header/header.component.html - 377 + 384 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -1094,11 +1090,11 @@ apps/client/src/app/components/header/header.component.html - 117 + 121 apps/client/src/app/components/header/header.component.html - 362 + 369 @@ -1106,7 +1102,7 @@ Eu apps/client/src/app/components/header/header.component.html - 207 + 211 @@ -1114,7 +1110,7 @@ O meu Ghostfolio apps/client/src/app/components/header/header.component.html - 266 + 273 @@ -1122,7 +1118,7 @@ Sobre o Ghostfolio apps/client/src/app/components/header/header.component.html - 314 + 321 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -1138,7 +1134,7 @@ apps/client/src/app/components/header/header.component.html - 349 + 356 apps/client/src/app/pages/features/features-page.html @@ -1154,7 +1150,7 @@ apps/client/src/app/components/header/header.component.html - 396 + 403 apps/client/src/app/components/home-market/home-market.html @@ -1170,7 +1166,7 @@ Iniciar sessão apps/client/src/app/components/header/header.component.html - 410 + 417 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -1182,7 +1178,7 @@ Começar apps/client/src/app/components/header/header.component.html - 420 + 427 @@ -1190,11 +1186,11 @@ Iniciar sessão apps/client/src/app/app-routing.module.ts - 150 + 154 apps/client/src/app/components/header/header.component.ts - 237 + 242 @@ -1202,7 +1198,7 @@ Oops! Token de Segurança Incorreto. apps/client/src/app/components/header/header.component.ts - 252 + 257 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -1330,7 +1326,7 @@ apps/client/src/app/pages/webauthn/webauthn-page.html - 29 + 30 @@ -1626,7 +1622,7 @@ Marcadores apps/client/src/app/components/admin-settings/admin-settings.component.html - 143 + 142 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -1642,7 +1638,7 @@ Dados do Relatório com Problema apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 409 + 407 @@ -2109,8 +2105,8 @@ Accounts Contas - apps/client/src/app/pages/accounts/accounts-page-routing.module.ts - 13 + libs/common/src/lib/routes.ts + 51 @@ -2282,7 +2278,7 @@ Funcionalidades apps/client/src/app/app-routing.module.ts - 74 + 78 @@ -2292,21 +2288,17 @@ apps/client/src/app/pages/admin/admin-page.component.ts 29 - - apps/client/src/app/pages/home/home-page.component.ts - 39 - apps/client/src/app/pages/resources/resources-page.component.ts 19 - apps/client/src/app/pages/zen/zen-page-routing.module.ts - 20 + libs/common/src/lib/routes.ts + 64 - apps/client/src/app/pages/zen/zen-page.component.ts - 36 + libs/common/src/lib/routes.ts + 89 @@ -2314,7 +2306,7 @@ Mercados apps/client/src/app/pages/home/home-page-routing.module.ts - 35 + 38 apps/client/src/app/pages/home/home-page.component.ts @@ -2337,12 +2329,8 @@ Activities Atividades - apps/client/src/app/pages/portfolio/activities/activities-page-routing.module.ts - 13 - - - apps/client/src/app/pages/portfolio/portfolio-page.component.ts - 41 + libs/common/src/lib/routes.ts + 73 @@ -2689,16 +2677,12 @@ Holdings Posições - apps/client/src/app/pages/home/home-page-routing.module.ts - 25 - - - apps/client/src/app/pages/home/home-page.component.ts - 44 + libs/common/src/lib/routes.ts + 61 - apps/client/src/app/pages/zen/zen-page.component.ts - 41 + libs/common/src/lib/routes.ts + 86 @@ -2777,8 +2761,8 @@ Registration Registo - apps/client/src/app/pages/register/register-page-routing.module.ts - 13 + libs/common/src/lib/routes.ts + 102 @@ -2854,7 +2838,7 @@ Voltar à Página Inicial apps/client/src/app/pages/webauthn/webauthn-page.html - 31 + 33 @@ -2926,7 +2910,7 @@ Diferença desde o Máximo Histórico libs/ui/src/lib/benchmark/benchmark.component.html - 96 + 110 @@ -2934,7 +2918,7 @@ a partir do ATH (All Time High) libs/ui/src/lib/benchmark/benchmark.component.html - 98 + 112 @@ -3290,7 +3274,7 @@ Sumário apps/client/src/app/pages/home/home-page-routing.module.ts - 30 + 33 apps/client/src/app/pages/home/home-page.component.ts @@ -3558,7 +3542,7 @@ Atualizar Plano apps/client/src/app/components/header/header.component.html - 187 + 191 apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html @@ -3842,7 +3826,7 @@ Renovar Plano apps/client/src/app/components/header/header.component.html - 185 + 189 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -3942,7 +3926,7 @@ Plataformas apps/client/src/app/components/admin-settings/admin-settings.component.html - 137 + 136 @@ -4670,7 +4654,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 188 + 202 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5150,8 +5134,8 @@ perguntas-mais-frequentes kebab-case - libs/common/src/lib/paths.ts - 38 + libs/common/src/lib/routes.ts + 32 @@ -5159,8 +5143,8 @@ funcionalidades kebab-case - libs/common/src/lib/paths.ts - 39 + libs/common/src/lib/routes.ts + 33 @@ -5168,8 +5152,8 @@ sobre kebab-case - libs/common/src/lib/paths.ts - 36 + libs/common/src/lib/routes.ts + 29 @@ -5177,8 +5161,8 @@ politica-de-privacidade kebab-case - libs/common/src/lib/paths.ts - 48 + libs/common/src/lib/routes.ts + 41 @@ -5186,8 +5170,8 @@ licenca kebab-case - libs/common/src/lib/paths.ts - 42 + libs/common/src/lib/routes.ts + 36 @@ -5195,8 +5179,8 @@ mercados kebab-case - libs/common/src/lib/paths.ts - 43 + libs/common/src/lib/routes.ts + 37 @@ -5204,8 +5188,8 @@ precos kebab-case - libs/common/src/lib/paths.ts - 47 + libs/common/src/lib/routes.ts + 40 @@ -5213,8 +5197,12 @@ registo kebab-case - libs/common/src/lib/paths.ts - 49 + libs/common/src/lib/routes.ts + 100 + + + libs/common/src/lib/routes.ts + 101 @@ -5222,8 +5210,8 @@ recursos kebab-case - libs/common/src/lib/paths.ts - 50 + libs/common/src/lib/routes.ts + 42 @@ -5295,8 +5283,8 @@ alternativa-de-software-livre-ao kebab-case - libs/common/src/lib/paths.ts - 44 + libs/common/src/lib/routes.ts + 38 @@ -5628,7 +5616,7 @@ Última alta de todos os tempos libs/ui/src/lib/benchmark/benchmark.component.html - 74 + 83 @@ -5652,7 +5640,7 @@ Software de gerenciamento de patrimônio de código aberto apps/client/src/app/pages/i18n/i18n-page.html - 14 + 30 @@ -5708,7 +5696,7 @@ Você realmente deseja excluir esta mensagem do sistema? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 147 + 155 @@ -5716,7 +5704,7 @@ Tendência de 50 dias libs/ui/src/lib/benchmark/benchmark.component.html - 16 + 25 @@ -5724,7 +5712,7 @@ Tendência de 200 dias libs/ui/src/lib/benchmark/benchmark.component.html - 45 + 54 @@ -6072,8 +6060,8 @@ self-hosting kebab-case - libs/common/src/lib/paths.ts - 51 + libs/common/src/lib/routes.ts + 43 @@ -6197,7 +6185,7 @@ Internationalization apps/client/src/app/app-routing.module.ts - 88 + 92 @@ -6893,7 +6881,7 @@ Set API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 113 + 112 @@ -6949,8 +6937,8 @@ guides kebab-case - libs/common/src/lib/paths.ts - 41 + libs/common/src/lib/routes.ts + 35 @@ -6958,8 +6946,8 @@ glossary kebab-case - libs/common/src/lib/paths.ts - 40 + libs/common/src/lib/routes.ts + 34 @@ -7015,7 +7003,7 @@ Do you really want to delete the API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 102 + 98 @@ -7167,7 +7155,7 @@ Link has been copied to the clipboard apps/client/src/app/components/access-table/access-table.component.ts - 66 + 65 @@ -7419,8 +7407,8 @@ terms-of-service kebab-case - libs/common/src/lib/paths.ts - 52 + libs/common/src/lib/routes.ts + 44 @@ -7556,7 +7544,7 @@ Watchlist apps/client/src/app/pages/home/home-page-routing.module.ts - 40 + 43 apps/client/src/app/pages/home/home-page.component.ts @@ -7576,7 +7564,7 @@ Do you really want to delete this item? libs/ui/src/lib/benchmark/benchmark.component.ts - 122 + 132 @@ -7584,7 +7572,7 @@ Log out apps/client/src/app/components/header/header.component.html - 317 + 324 @@ -7592,7 +7580,7 @@ Calculations are based on delayed market data and may not be displayed in real-time. apps/client/src/app/components/home-market/home-market.html - 41 + 43 @@ -7600,26 +7588,80 @@ changelog kebab-case - libs/common/src/lib/paths.ts - 37 + libs/common/src/lib/routes.ts + 31 - - oss-friends - oss-friends - kebab-case + + Demo user account has been synced. + Demo user account has been synced. - libs/common/src/lib/paths.ts - 46 + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 223 - - open - open - kebab-case + + Sync Demo User Account + Sync Demo User Account - libs/common/src/lib/paths.ts - 45 + apps/client/src/app/components/admin-overview/admin-overview.html + 181 + + + + Emergency Fund: Set up + Emergency Fund: Set up + + apps/client/src/app/pages/i18n/i18n-page.html + 14 + + + + No emergency fund has been set up + No emergency fund has been set up + + apps/client/src/app/pages/i18n/i18n-page.html + 15 + + + + An emergency fund has been set up + An emergency fund has been set up + + apps/client/src/app/pages/i18n/i18n-page.html + 18 + + + + Fee Ratio + Fee Ratio + + apps/client/src/app/pages/i18n/i18n-page.html + 21 + + + + The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + + apps/client/src/app/pages/i18n/i18n-page.html + 22 + + + + The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + + apps/client/src/app/pages/i18n/i18n-page.html + 26 + + + + Name + Name + + libs/ui/src/lib/benchmark/benchmark.component.html + 11 diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index 7aca7e0b0..f2db105b6 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -6,8 +6,8 @@ hakkinda kebab-case - libs/common/src/lib/paths.ts - 36 + libs/common/src/lib/routes.ts + 29 @@ -15,8 +15,8 @@ sss kebab-case - libs/common/src/lib/paths.ts - 38 + libs/common/src/lib/routes.ts + 32 @@ -24,8 +24,8 @@ oezellikler kebab-case - libs/common/src/lib/paths.ts - 39 + libs/common/src/lib/routes.ts + 33 @@ -33,8 +33,8 @@ lisans kebab-case - libs/common/src/lib/paths.ts - 42 + libs/common/src/lib/routes.ts + 36 @@ -42,8 +42,8 @@ piyasalar kebab-case - libs/common/src/lib/paths.ts - 43 + libs/common/src/lib/routes.ts + 37 @@ -51,8 +51,8 @@ fiyatlandirma kebab-case - libs/common/src/lib/paths.ts - 47 + libs/common/src/lib/routes.ts + 40 @@ -60,8 +60,8 @@ gizlilik-politikasi kebab-case - libs/common/src/lib/paths.ts - 48 + libs/common/src/lib/routes.ts + 41 @@ -69,8 +69,12 @@ kayit-ol kebab-case - libs/common/src/lib/paths.ts - 49 + libs/common/src/lib/routes.ts + 100 + + + libs/common/src/lib/routes.ts + 101 @@ -78,8 +82,8 @@ kaynaklar kebab-case - libs/common/src/lib/paths.ts - 50 + libs/common/src/lib/routes.ts + 42 @@ -99,7 +103,7 @@ apps/client/src/app/components/header/header.component.html - 396 + 403 apps/client/src/app/components/home-market/home-market.html @@ -112,18 +116,18 @@ Resources - Piyasalar + Kaynaklar apps/client/src/app/app.component.html 64 apps/client/src/app/components/header/header.component.html - 82 + 86 apps/client/src/app/components/header/header.component.html - 289 + 296 apps/client/src/app/pages/resources/overview/resources-overview.component.html @@ -139,11 +143,11 @@ apps/client/src/app/components/header/header.component.html - 117 + 121 apps/client/src/app/components/header/header.component.html - 362 + 369 @@ -263,7 +267,7 @@ apps/client/src/app/components/header/header.component.html - 349 + 356 apps/client/src/app/pages/features/features-page.html @@ -303,15 +307,15 @@ apps/client/src/app/components/header/header.component.html - 99 + 103 apps/client/src/app/components/header/header.component.html - 301 + 308 apps/client/src/app/components/header/header.component.html - 377 + 384 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -451,7 +455,7 @@ Bu erişim iznini geri almayı gerçekten istiyor musunuz? apps/client/src/app/components/access-table/access-table.component.ts - 80 + 79 @@ -581,10 +585,6 @@ libs/ui/src/lib/activities-table/activities-table.component.html 138 - - libs/ui/src/lib/benchmark/benchmark.component.html - 4 - libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -751,7 +751,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 155 + 169 @@ -955,7 +955,7 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html - 42 + 38 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html @@ -979,7 +979,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 336 + 337 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -1003,7 +1003,7 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html - 49 + 45 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html @@ -1027,7 +1027,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 343 + 344 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -1320,18 +1320,18 @@ Do you really want to delete this coupon? - Önbelleği temizlemeyi gerçekten istiyor musunuz? + Bu kuponu gerçekten silmek istiyor musunuz? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 134 + 142 Do you really want to flush the cache? - Önbelleği temizlemeyi gerçekten istiyor musunuz + Önbelleği temizlemeyi gerçekten istiyor musunuz? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 171 + 179 @@ -1339,7 +1339,7 @@ Lütfen sistem mesajınızı belirleyin: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 191 + 199 @@ -1379,7 +1379,7 @@ Etiketler apps/client/src/app/components/admin-settings/admin-settings.component.html - 143 + 142 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -1455,7 +1455,7 @@ Önbelleği temizle apps/client/src/app/components/admin-overview/admin-overview.html - 174 + 186 @@ -1499,11 +1499,11 @@ apps/client/src/app/components/header/header.component.html - 54 + 58 apps/client/src/app/components/header/header.component.html - 259 + 266 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1543,12 +1543,12 @@ Platformlar apps/client/src/app/components/admin-settings/admin-settings.component.html - 137 + 136 Do you really want to delete this user? - Bu kullanıcıyı silmeyi gerçekten istiyor musunu? + Bu kullanıcıyı silmeyi gerçekten istiyor musunuz? apps/client/src/app/components/admin-users/admin-users.component.ts 142 @@ -1563,7 +1563,7 @@ apps/client/src/app/components/header/header.component.html - 225 + 229 @@ -1641,14 +1641,14 @@ apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts 122 - - apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts - 47 - apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 94 + + libs/common/src/lib/routes.ts + 76 + Benchmark @@ -1671,11 +1671,11 @@ Genel Bakış apps/client/src/app/components/header/header.component.html - 28 + 30 apps/client/src/app/components/header/header.component.html - 241 + 246 @@ -1683,11 +1683,11 @@ Portföy apps/client/src/app/components/header/header.component.html - 41 + 44 apps/client/src/app/components/header/header.component.html - 251 + 256 @@ -1695,11 +1695,11 @@ Yönetici Kontrolü apps/client/src/app/components/header/header.component.html - 68 + 72 apps/client/src/app/components/header/header.component.html - 277 + 284 @@ -1707,7 +1707,7 @@ Ben apps/client/src/app/components/header/header.component.html - 207 + 211 @@ -1715,7 +1715,7 @@ Ghostfolio’m apps/client/src/app/components/header/header.component.html - 266 + 273 @@ -1723,7 +1723,7 @@ Ghostfolio Hakkında apps/client/src/app/components/header/header.component.html - 314 + 321 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -1735,7 +1735,7 @@ Giriş apps/client/src/app/components/header/header.component.html - 410 + 417 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -1744,10 +1744,10 @@ Get started - Haydi Başlayalım + Haydi Başlayalım apps/client/src/app/components/header/header.component.html - 420 + 427 @@ -1755,11 +1755,11 @@ Giriş apps/client/src/app/app-routing.module.ts - 150 + 154 apps/client/src/app/components/header/header.component.ts - 237 + 242 @@ -1767,7 +1767,7 @@ Hay Allah! Güvenlik anahtarı yanlış. apps/client/src/app/components/header/header.component.ts - 252 + 257 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -1971,7 +1971,7 @@ apps/client/src/app/pages/webauthn/webauthn-page.html - 29 + 30 @@ -2247,7 +2247,7 @@ Rapor Veri Sorunu apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 409 + 407 @@ -2387,7 +2387,7 @@ Üyeliğinizi Yükseltin apps/client/src/app/components/header/header.component.html - 187 + 191 apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html @@ -2594,8 +2594,8 @@ Accounts Hesaplar - apps/client/src/app/pages/accounts/accounts-page-routing.module.ts - 13 + libs/common/src/lib/routes.ts + 51 @@ -2681,21 +2681,17 @@ apps/client/src/app/pages/admin/admin-page.component.ts 29 - - apps/client/src/app/pages/home/home-page.component.ts - 39 - apps/client/src/app/pages/resources/resources-page.component.ts 19 - apps/client/src/app/pages/zen/zen-page-routing.module.ts - 20 + libs/common/src/lib/routes.ts + 64 - apps/client/src/app/pages/zen/zen-page.component.ts - 36 + libs/common/src/lib/routes.ts + 89 @@ -2755,7 +2751,7 @@ Özellikler apps/client/src/app/app-routing.module.ts - 74 + 78 @@ -2898,16 +2894,12 @@ Holdings Varlıklar - apps/client/src/app/pages/home/home-page-routing.module.ts - 25 - - - apps/client/src/app/pages/home/home-page.component.ts - 44 + libs/common/src/lib/routes.ts + 61 - apps/client/src/app/pages/zen/zen-page.component.ts - 41 + libs/common/src/lib/routes.ts + 86 @@ -2915,7 +2907,7 @@ Özet apps/client/src/app/pages/home/home-page-routing.module.ts - 30 + 33 apps/client/src/app/pages/home/home-page.component.ts @@ -2927,7 +2919,7 @@ Piyasalar apps/client/src/app/pages/home/home-page-routing.module.ts - 35 + 38 apps/client/src/app/pages/home/home-page.component.ts @@ -3314,12 +3306,8 @@ Activities İşlemler - apps/client/src/app/pages/portfolio/activities/activities-page-routing.module.ts - 13 - - - apps/client/src/app/pages/portfolio/portfolio-page.component.ts - 41 + libs/common/src/lib/routes.ts + 73 @@ -3687,7 +3675,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 188 + 202 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -4047,7 +4035,7 @@ Aboneliği Yenile apps/client/src/app/components/header/header.component.html - 185 + 189 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -4118,8 +4106,8 @@ Registration Kayıt - apps/client/src/app/pages/register/register-page-routing.module.ts - 13 + libs/common/src/lib/routes.ts + 102 @@ -4179,8 +4167,8 @@ Açık kaynak alternatif kebab-case - libs/common/src/lib/paths.ts - 44 + libs/common/src/lib/routes.ts + 38 @@ -4772,7 +4760,7 @@ Ana Sayfaya Geri Dön apps/client/src/app/pages/webauthn/webauthn-page.html - 31 + 33 @@ -4860,7 +4848,7 @@ Tüm Zamanların En Yüksek Seviyesinden (ATH) Değişim libs/ui/src/lib/benchmark/benchmark.component.html - 96 + 110 @@ -4868,7 +4856,7 @@ Tüm Zamanların En Yüksek Seviyesinden libs/ui/src/lib/benchmark/benchmark.component.html - 98 + 112 @@ -5628,7 +5616,7 @@ Son, ATH libs/ui/src/lib/benchmark/benchmark.component.html - 74 + 83 @@ -5652,7 +5640,7 @@ Açık Kaynak Varlık Yönetim Yazılımı apps/client/src/app/pages/i18n/i18n-page.html - 14 + 30 @@ -5708,7 +5696,7 @@ Bu sistem mesajını silmeyi gerçekten istiyor musunuz? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 147 + 155 @@ -5716,7 +5704,7 @@ 50 Günlük Trend libs/ui/src/lib/benchmark/benchmark.component.html - 16 + 25 @@ -5724,7 +5712,7 @@ 200 Günlük Trend libs/ui/src/lib/benchmark/benchmark.component.html - 45 + 54 @@ -6072,8 +6060,8 @@ Kendini-Barındırma kebab-case - libs/common/src/lib/paths.ts - 51 + libs/common/src/lib/routes.ts + 43 @@ -6197,7 +6185,7 @@ İnternasyonalizasyon apps/client/src/app/app-routing.module.ts - 88 + 92 @@ -6893,7 +6881,7 @@ API anahtarını ayarla apps/client/src/app/components/admin-settings/admin-settings.component.html - 113 + 112 @@ -6949,8 +6937,8 @@ kılavuzlar kebab-case - libs/common/src/lib/paths.ts - 41 + libs/common/src/lib/routes.ts + 35 @@ -6958,8 +6946,8 @@ sözlük kebab-case - libs/common/src/lib/paths.ts - 40 + libs/common/src/lib/routes.ts + 34 @@ -7015,7 +7003,7 @@ API anahtarını silmek istediğinize emin misiniz? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 102 + 98 @@ -7167,7 +7155,7 @@ Bağlantı panoya kopyalandı apps/client/src/app/components/access-table/access-table.component.ts - 66 + 65 @@ -7419,8 +7407,8 @@ Hizmet Koşulları kebab-case - libs/common/src/lib/paths.ts - 52 + libs/common/src/lib/routes.ts + 44 @@ -7556,7 +7544,7 @@ İzleme Listesi apps/client/src/app/pages/home/home-page-routing.module.ts - 40 + 43 apps/client/src/app/pages/home/home-page.component.ts @@ -7576,7 +7564,7 @@ Bu öğeyi silmek istediğinize emin misiniz? libs/ui/src/lib/benchmark/benchmark.component.ts - 122 + 132 @@ -7584,7 +7572,7 @@ Oturumu kapat apps/client/src/app/components/header/header.component.html - 317 + 324 @@ -7592,7 +7580,7 @@ Hesaplamalar gecikmeli piyasa verilerine dayanmaktadır ve gerçek zamanlı olarak görüntülenemeyebilir. apps/client/src/app/components/home-market/home-market.html - 41 + 43 @@ -7600,26 +7588,80 @@ degisiklik-gunlugu kebab-case - libs/common/src/lib/paths.ts - 37 + libs/common/src/lib/routes.ts + 31 - - oss-friends - oss-arkadaslar - kebab-case + + Demo user account has been synced. + Demo kullanıcı hesabı senkronize edildi. - libs/common/src/lib/paths.ts - 46 + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 223 - - open - open - kebab-case + + Sync Demo User Account + Demo Kullanıcı Hesabını Senkronize Et - libs/common/src/lib/paths.ts - 45 + apps/client/src/app/components/admin-overview/admin-overview.html + 181 + + + + Emergency Fund: Set up + Emergency Fund: Set up + + apps/client/src/app/pages/i18n/i18n-page.html + 14 + + + + No emergency fund has been set up + No emergency fund has been set up + + apps/client/src/app/pages/i18n/i18n-page.html + 15 + + + + An emergency fund has been set up + An emergency fund has been set up + + apps/client/src/app/pages/i18n/i18n-page.html + 18 + + + + Fee Ratio + Fee Ratio + + apps/client/src/app/pages/i18n/i18n-page.html + 21 + + + + The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + + apps/client/src/app/pages/i18n/i18n-page.html + 22 + + + + The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + + apps/client/src/app/pages/i18n/i18n-page.html + 26 + + + + Name + Name + + libs/ui/src/lib/benchmark/benchmark.component.html + 11 diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index 168e50bfb..013649efc 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -6,7 +6,7 @@ Функції apps/client/src/app/app-routing.module.ts - 74 + 78 @@ -14,7 +14,7 @@ Інтернаціоналізація apps/client/src/app/app-routing.module.ts - 88 + 92 @@ -22,11 +22,11 @@ Увійти apps/client/src/app/app-routing.module.ts - 150 + 154 apps/client/src/app/components/header/header.component.ts - 237 + 242 @@ -74,7 +74,7 @@ apps/client/src/app/components/header/header.component.html - 396 + 403 apps/client/src/app/components/home-market/home-market.html @@ -94,11 +94,11 @@ apps/client/src/app/components/header/header.component.html - 82 + 86 apps/client/src/app/components/header/header.component.html - 289 + 296 apps/client/src/app/pages/resources/overview/resources-overview.component.html @@ -114,11 +114,11 @@ apps/client/src/app/components/header/header.component.html - 117 + 121 apps/client/src/app/components/header/header.component.html - 362 + 369 @@ -238,7 +238,7 @@ apps/client/src/app/components/header/header.component.html - 349 + 356 apps/client/src/app/pages/features/features-page.html @@ -278,15 +278,15 @@ apps/client/src/app/components/header/header.component.html - 99 + 103 apps/client/src/app/components/header/header.component.html - 301 + 308 apps/client/src/app/components/header/header.component.html - 377 + 384 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -370,8 +370,8 @@ about kebab-case - libs/common/src/lib/paths.ts - 36 + libs/common/src/lib/routes.ts + 29 @@ -379,8 +379,8 @@ license kebab-case - libs/common/src/lib/paths.ts - 42 + libs/common/src/lib/routes.ts + 36 @@ -388,8 +388,8 @@ privacy-policy kebab-case - libs/common/src/lib/paths.ts - 48 + libs/common/src/lib/routes.ts + 41 @@ -397,8 +397,8 @@ faq kebab-case - libs/common/src/lib/paths.ts - 38 + libs/common/src/lib/routes.ts + 32 @@ -406,8 +406,8 @@ features kebab-case - libs/common/src/lib/paths.ts - 39 + libs/common/src/lib/routes.ts + 33 @@ -415,8 +415,8 @@ markets kebab-case - libs/common/src/lib/paths.ts - 43 + libs/common/src/lib/routes.ts + 37 @@ -424,8 +424,8 @@ pricing kebab-case - libs/common/src/lib/paths.ts - 47 + libs/common/src/lib/routes.ts + 40 @@ -433,8 +433,12 @@ register kebab-case - libs/common/src/lib/paths.ts - 49 + libs/common/src/lib/routes.ts + 100 + + + libs/common/src/lib/routes.ts + 101 @@ -442,8 +446,8 @@ resources kebab-case - libs/common/src/lib/paths.ts - 50 + libs/common/src/lib/routes.ts + 42 @@ -531,7 +535,7 @@ Посилання скопійовано в буфер обміну apps/client/src/app/components/access-table/access-table.component.ts - 66 + 65 @@ -539,7 +543,7 @@ Ви дійсно хочете відкликати цей наданий доступ? apps/client/src/app/components/access-table/access-table.component.ts - 80 + 79 @@ -709,10 +713,6 @@ libs/ui/src/lib/activities-table/activities-table.component.html 138 - - libs/ui/src/lib/benchmark/benchmark.component.html - 4 - libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -879,7 +879,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 155 + 169 @@ -1443,7 +1443,7 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html - 42 + 38 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html @@ -1467,7 +1467,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 336 + 337 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -1491,7 +1491,7 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html - 49 + 45 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html @@ -1515,7 +1515,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 343 + 344 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -1587,7 +1587,7 @@ Ви дійсно хочете видалити цей купон? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 134 + 142 @@ -1595,7 +1595,7 @@ Ви дійсно хочете видалити це системне повідомлення? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 147 + 155 @@ -1603,7 +1603,7 @@ Ви дійсно хочете очистити кеш? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 171 + 179 @@ -1611,7 +1611,7 @@ Будь ласка, встановіть ваше системне повідомлення: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 191 + 199 @@ -1723,7 +1723,7 @@ Очистити кеш apps/client/src/app/components/admin-overview/admin-overview.html - 174 + 186 @@ -1747,11 +1747,11 @@ apps/client/src/app/components/header/header.component.html - 54 + 58 apps/client/src/app/components/header/header.component.html - 259 + 266 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1835,7 +1835,7 @@ Встановити ключ API apps/client/src/app/components/admin-settings/admin-settings.component.html - 113 + 112 @@ -1843,7 +1843,7 @@ Платформи apps/client/src/app/components/admin-settings/admin-settings.component.html - 137 + 136 @@ -1851,7 +1851,7 @@ Теги apps/client/src/app/components/admin-settings/admin-settings.component.html - 143 + 142 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -1867,7 +1867,7 @@ Ви дійсно хочете видалити ключ API? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 102 + 98 @@ -1907,7 +1907,7 @@ apps/client/src/app/pages/webauthn/webauthn-page.html - 29 + 30 @@ -1935,7 +1935,7 @@ apps/client/src/app/components/header/header.component.html - 225 + 229 @@ -2061,14 +2061,14 @@ apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts 122 - - apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts - 47 - apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 94 + + libs/common/src/lib/routes.ts + 76 + Benchmark @@ -2091,11 +2091,11 @@ Огляд apps/client/src/app/components/header/header.component.html - 28 + 30 apps/client/src/app/components/header/header.component.html - 241 + 246 @@ -2103,11 +2103,11 @@ Портфель apps/client/src/app/components/header/header.component.html - 41 + 44 apps/client/src/app/components/header/header.component.html - 251 + 256 @@ -2115,11 +2115,11 @@ Управління адміністратором apps/client/src/app/components/header/header.component.html - 68 + 72 apps/client/src/app/components/header/header.component.html - 277 + 284 @@ -2127,7 +2127,7 @@ Оновити план apps/client/src/app/components/header/header.component.html - 187 + 191 apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html @@ -2147,7 +2147,7 @@ Поновити план apps/client/src/app/components/header/header.component.html - 185 + 189 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -2163,7 +2163,7 @@ Я apps/client/src/app/components/header/header.component.html - 207 + 211 @@ -2171,7 +2171,7 @@ Мій Ghostfolio apps/client/src/app/components/header/header.component.html - 266 + 273 @@ -2179,7 +2179,7 @@ Про Ghostfolio apps/client/src/app/components/header/header.component.html - 314 + 321 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -2191,7 +2191,7 @@ Увійти apps/client/src/app/components/header/header.component.html - 410 + 417 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -2203,7 +2203,7 @@ Почати apps/client/src/app/components/header/header.component.html - 420 + 427 @@ -2211,7 +2211,7 @@ Упс! Неправильний Секретний Токен. apps/client/src/app/components/header/header.component.ts - 252 + 257 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -2220,7 +2220,7 @@ Change with currency effect Change - Зміна з урахуванням валютного ефекту Зміна + Зміна з урахуванням валютного ефекту Зміна apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html 50 @@ -2228,7 +2228,7 @@ Performance with currency effect Performance - Прибутковість з урахуванням валютного ефекту валюти Прибутковість + Прибутковість з урахуванням валютного ефекту валюти Прибутковість apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html 69 @@ -2343,7 +2343,7 @@ Повідомити про збій даних apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 409 + 407 @@ -3538,8 +3538,8 @@ Accounts Рахунки - apps/client/src/app/pages/accounts/accounts-page-routing.module.ts - 13 + libs/common/src/lib/routes.ts + 51 @@ -3669,21 +3669,17 @@ apps/client/src/app/pages/admin/admin-page.component.ts 29 - - apps/client/src/app/pages/home/home-page.component.ts - 39 - apps/client/src/app/pages/resources/resources-page.component.ts 19 - apps/client/src/app/pages/zen/zen-page-routing.module.ts - 20 + libs/common/src/lib/routes.ts + 64 - apps/client/src/app/pages/zen/zen-page.component.ts - 36 + libs/common/src/lib/routes.ts + 89 @@ -3767,8 +3763,8 @@ самохостинг kebab-case - libs/common/src/lib/paths.ts - 51 + libs/common/src/lib/routes.ts + 43 @@ -3927,16 +3923,12 @@ Holdings Активи - apps/client/src/app/pages/home/home-page-routing.module.ts - 25 - - - apps/client/src/app/pages/home/home-page.component.ts - 44 + libs/common/src/lib/routes.ts + 61 - apps/client/src/app/pages/zen/zen-page.component.ts - 41 + libs/common/src/lib/routes.ts + 86 @@ -3944,7 +3936,7 @@ Зведення apps/client/src/app/pages/home/home-page-routing.module.ts - 30 + 33 apps/client/src/app/pages/home/home-page.component.ts @@ -3956,7 +3948,7 @@ Ринки apps/client/src/app/pages/home/home-page-routing.module.ts - 35 + 38 apps/client/src/app/pages/home/home-page.component.ts @@ -4004,7 +3996,7 @@ Програмне забезпечення управління багатством з відкритим кодом apps/client/src/app/pages/i18n/i18n-page.html - 14 + 30 @@ -4419,12 +4411,8 @@ Activities Активності - apps/client/src/app/pages/portfolio/activities/activities-page-routing.module.ts - 13 - - - apps/client/src/app/pages/portfolio/portfolio-page.component.ts - 41 + libs/common/src/lib/routes.ts + 73 @@ -4836,7 +4824,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 188 + 202 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5399,8 +5387,8 @@ Registration Реєстрація - apps/client/src/app/pages/register/register-page-routing.module.ts - 13 + libs/common/src/lib/routes.ts + 102 @@ -5472,8 +5460,8 @@ guides kebab-case - libs/common/src/lib/paths.ts - 41 + libs/common/src/lib/routes.ts + 35 @@ -5481,8 +5469,8 @@ glossary kebab-case - libs/common/src/lib/paths.ts - 40 + libs/common/src/lib/routes.ts + 34 @@ -5498,8 +5486,8 @@ відкритий-альтернативний-для kebab-case - libs/common/src/lib/paths.ts - 44 + libs/common/src/lib/routes.ts + 38 @@ -6115,7 +6103,7 @@ Повернутися на головну сторінку apps/client/src/app/pages/webauthn/webauthn-page.html - 31 + 33 @@ -6347,7 +6335,7 @@ Тренд на 50 днів libs/ui/src/lib/benchmark/benchmark.component.html - 16 + 25 @@ -6355,7 +6343,7 @@ Тренд на 200 днів libs/ui/src/lib/benchmark/benchmark.component.html - 45 + 54 @@ -6363,7 +6351,7 @@ Останній рекордний максимум libs/ui/src/lib/benchmark/benchmark.component.html - 74 + 83 @@ -6371,7 +6359,7 @@ Зміна від Історичного Максимуму libs/ui/src/lib/benchmark/benchmark.component.html - 96 + 110 @@ -6379,7 +6367,7 @@ від ІМ libs/ui/src/lib/benchmark/benchmark.component.html - 98 + 112 @@ -6656,7 +6644,7 @@ Get access to 80’000+ tickers from over 50 exchanges - Отримайте доступ до 100 000+ тікерів з понад 50 бірж + Отримайте доступ до 80 000+ тікерів з понад 50 бірж libs/ui/src/lib/i18n.ts 24 @@ -7419,8 +7407,8 @@ terms-of-service kebab-case - libs/common/src/lib/paths.ts - 52 + libs/common/src/lib/routes.ts + 44 @@ -7556,7 +7544,7 @@ Watchlist apps/client/src/app/pages/home/home-page-routing.module.ts - 40 + 43 apps/client/src/app/pages/home/home-page.component.ts @@ -7576,7 +7564,7 @@ Do you really want to delete this item? libs/ui/src/lib/benchmark/benchmark.component.ts - 122 + 132 @@ -7584,7 +7572,7 @@ Log out apps/client/src/app/components/header/header.component.html - 317 + 324 @@ -7592,7 +7580,7 @@ Calculations are based on delayed market data and may not be displayed in real-time. apps/client/src/app/components/home-market/home-market.html - 41 + 43 @@ -7600,26 +7588,80 @@ changelog kebab-case - libs/common/src/lib/paths.ts - 37 + libs/common/src/lib/routes.ts + 31 - - oss-friends - oss-friends - kebab-case + + Demo user account has been synced. + Demo user account has been synced. - libs/common/src/lib/paths.ts - 46 + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 223 - - open - open - kebab-case + + Sync Demo User Account + Sync Demo User Account - libs/common/src/lib/paths.ts - 45 + apps/client/src/app/components/admin-overview/admin-overview.html + 181 + + + + Emergency Fund: Set up + Emergency Fund: Set up + + apps/client/src/app/pages/i18n/i18n-page.html + 14 + + + + No emergency fund has been set up + No emergency fund has been set up + + apps/client/src/app/pages/i18n/i18n-page.html + 15 + + + + An emergency fund has been set up + An emergency fund has been set up + + apps/client/src/app/pages/i18n/i18n-page.html + 18 + + + + Fee Ratio + Fee Ratio + + apps/client/src/app/pages/i18n/i18n-page.html + 21 + + + + The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + + apps/client/src/app/pages/i18n/i18n-page.html + 22 + + + + The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + + apps/client/src/app/pages/i18n/i18n-page.html + 26 + + + + Name + Name + + libs/ui/src/lib/benchmark/benchmark.component.html + 11 diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index 720902ba2..f9d89c9ca 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -6,72 +6,76 @@ about kebab-case - libs/common/src/lib/paths.ts - 36 + libs/common/src/lib/routes.ts + 29 faq kebab-case - libs/common/src/lib/paths.ts - 38 + libs/common/src/lib/routes.ts + 32 features kebab-case - libs/common/src/lib/paths.ts - 39 + libs/common/src/lib/routes.ts + 33 license kebab-case - libs/common/src/lib/paths.ts - 42 + libs/common/src/lib/routes.ts + 36 markets kebab-case - libs/common/src/lib/paths.ts - 43 + libs/common/src/lib/routes.ts + 37 pricing kebab-case - libs/common/src/lib/paths.ts - 47 + libs/common/src/lib/routes.ts + 40 privacy-policy kebab-case - libs/common/src/lib/paths.ts - 48 + libs/common/src/lib/routes.ts + 41 register kebab-case - libs/common/src/lib/paths.ts - 49 + libs/common/src/lib/routes.ts + 100 + + + libs/common/src/lib/routes.ts + 101 resources kebab-case - libs/common/src/lib/paths.ts - 50 + libs/common/src/lib/routes.ts + 42 @@ -115,7 +119,7 @@ apps/client/src/app/components/header/header.component.html - 396 + 403 apps/client/src/app/components/home-market/home-market.html @@ -134,11 +138,11 @@ apps/client/src/app/components/header/header.component.html - 82 + 86 apps/client/src/app/components/header/header.component.html - 289 + 296 apps/client/src/app/pages/resources/overview/resources-overview.component.html @@ -153,11 +157,11 @@ apps/client/src/app/components/header/header.component.html - 117 + 121 apps/client/src/app/components/header/header.component.html - 362 + 369 @@ -274,7 +278,7 @@ apps/client/src/app/components/header/header.component.html - 349 + 356 apps/client/src/app/pages/features/features-page.html @@ -311,15 +315,15 @@ apps/client/src/app/components/header/header.component.html - 99 + 103 apps/client/src/app/components/header/header.component.html - 301 + 308 apps/client/src/app/components/header/header.component.html - 377 + 384 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -450,7 +454,7 @@ Do you really want to revoke this granted access? apps/client/src/app/components/access-table/access-table.component.ts - 80 + 79 @@ -593,10 +597,6 @@ libs/ui/src/lib/activities-table/activities-table.component.html 138 - - libs/ui/src/lib/benchmark/benchmark.component.html - 4 - libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -758,7 +758,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 155 + 169 @@ -941,7 +941,7 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html - 42 + 38 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html @@ -965,7 +965,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 336 + 337 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -988,7 +988,7 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html - 49 + 45 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html @@ -1012,7 +1012,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 343 + 344 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -1356,28 +1356,28 @@ Do you really want to delete this coupon? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 134 + 142 Do you really want to delete this system message? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 147 + 155 Do you really want to flush the cache? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 171 + 179 Please set your system message: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 191 + 199 @@ -1472,7 +1472,7 @@ Flush Cache apps/client/src/app/components/admin-overview/admin-overview.html - 174 + 186 @@ -1513,11 +1513,11 @@ apps/client/src/app/components/header/header.component.html - 54 + 58 apps/client/src/app/components/header/header.component.html - 259 + 266 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1553,14 +1553,14 @@ Platforms apps/client/src/app/components/admin-settings/admin-settings.component.html - 137 + 136 Tags apps/client/src/app/components/admin-settings/admin-settings.component.html - 143 + 142 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -1679,14 +1679,14 @@ apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts 122 - - apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts - 47 - apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 94 + + libs/common/src/lib/routes.ts + 76 + Benchmark @@ -1706,40 +1706,40 @@ Overview apps/client/src/app/components/header/header.component.html - 28 + 30 apps/client/src/app/components/header/header.component.html - 241 + 246 Portfolio apps/client/src/app/components/header/header.component.html - 41 + 44 apps/client/src/app/components/header/header.component.html - 251 + 256 Admin Control apps/client/src/app/components/header/header.component.html - 68 + 72 apps/client/src/app/components/header/header.component.html - 277 + 284 Me apps/client/src/app/components/header/header.component.html - 207 + 211 @@ -1750,21 +1750,21 @@ apps/client/src/app/components/header/header.component.html - 225 + 229 My Ghostfolio apps/client/src/app/components/header/header.component.html - 266 + 273 About Ghostfolio apps/client/src/app/components/header/header.component.html - 314 + 321 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -1775,7 +1775,7 @@ Sign in apps/client/src/app/components/header/header.component.html - 410 + 417 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -1786,25 +1786,25 @@ Get started apps/client/src/app/components/header/header.component.html - 420 + 427 Sign in apps/client/src/app/app-routing.module.ts - 150 + 154 apps/client/src/app/components/header/header.component.ts - 237 + 242 Oops! Incorrect Security Token. apps/client/src/app/components/header/header.component.ts - 252 + 257 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -1989,7 +1989,7 @@ apps/client/src/app/pages/webauthn/webauthn-page.html - 29 + 30 @@ -2243,7 +2243,7 @@ Report Data Glitch apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 409 + 407 @@ -2372,7 +2372,7 @@ Upgrade Plan apps/client/src/app/components/header/header.component.html - 187 + 191 apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html @@ -2795,8 +2795,8 @@ Accounts - apps/client/src/app/pages/accounts/accounts-page-routing.module.ts - 13 + libs/common/src/lib/routes.ts + 51 @@ -2902,21 +2902,17 @@ apps/client/src/app/pages/admin/admin-page.component.ts 29 - - apps/client/src/app/pages/home/home-page.component.ts - 39 - apps/client/src/app/pages/resources/resources-page.component.ts 19 - apps/client/src/app/pages/zen/zen-page-routing.module.ts - 20 + libs/common/src/lib/routes.ts + 64 - apps/client/src/app/pages/zen/zen-page.component.ts - 36 + libs/common/src/lib/routes.ts + 89 @@ -2970,7 +2966,7 @@ Features apps/client/src/app/app-routing.module.ts - 74 + 78 @@ -3085,23 +3081,19 @@ Holdings - apps/client/src/app/pages/home/home-page-routing.module.ts - 25 - - - apps/client/src/app/pages/home/home-page.component.ts - 44 + libs/common/src/lib/routes.ts + 61 - apps/client/src/app/pages/zen/zen-page.component.ts - 41 + libs/common/src/lib/routes.ts + 86 Summary apps/client/src/app/pages/home/home-page-routing.module.ts - 30 + 33 apps/client/src/app/pages/home/home-page.component.ts @@ -3112,7 +3104,7 @@ Markets apps/client/src/app/pages/home/home-page-routing.module.ts - 35 + 38 apps/client/src/app/pages/home/home-page.component.ts @@ -3149,7 +3141,7 @@ Open Source Wealth Management Software apps/client/src/app/pages/i18n/i18n-page.html - 14 + 30 @@ -3501,12 +3493,8 @@ Activities - apps/client/src/app/pages/portfolio/activities/activities-page-routing.module.ts - 13 - - - apps/client/src/app/pages/portfolio/portfolio-page.component.ts - 41 + libs/common/src/lib/routes.ts + 73 @@ -3849,7 +3837,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 188 + 202 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -4186,7 +4174,7 @@ Renew Plan apps/client/src/app/components/header/header.component.html - 185 + 189 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -4249,8 +4237,8 @@ Registration - apps/client/src/app/pages/register/register-page-routing.module.ts - 13 + libs/common/src/lib/routes.ts + 102 @@ -4285,8 +4273,8 @@ open-source-alternative-to kebab-case - libs/common/src/lib/paths.ts - 44 + libs/common/src/lib/routes.ts + 38 @@ -4632,7 +4620,7 @@ Go back to Home Page apps/client/src/app/pages/webauthn/webauthn-page.html - 31 + 33 @@ -4747,35 +4735,35 @@ 50-Day Trend libs/ui/src/lib/benchmark/benchmark.component.html - 16 + 25 200-Day Trend libs/ui/src/lib/benchmark/benchmark.component.html - 45 + 54 Last All Time High libs/ui/src/lib/benchmark/benchmark.component.html - 74 + 83 Change from All Time High libs/ui/src/lib/benchmark/benchmark.component.html - 96 + 110 from ATH libs/ui/src/lib/benchmark/benchmark.component.html - 98 + 112 @@ -5474,8 +5462,8 @@ self-hosting kebab-case - libs/common/src/lib/paths.ts - 51 + libs/common/src/lib/routes.ts + 43 @@ -5624,7 +5612,7 @@ Internationalization apps/client/src/app/app-routing.module.ts - 88 + 92 @@ -6233,7 +6221,7 @@ Set API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 113 + 112 @@ -6272,8 +6260,8 @@ glossary kebab-case - libs/common/src/lib/paths.ts - 40 + libs/common/src/lib/routes.ts + 34 @@ -6291,8 +6279,8 @@ guides kebab-case - libs/common/src/lib/paths.ts - 41 + libs/common/src/lib/routes.ts + 35 @@ -6334,7 +6322,7 @@ Do you really want to delete the API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 102 + 98 @@ -6474,7 +6462,7 @@ Link has been copied to the clipboard apps/client/src/app/components/access-table/access-table.component.ts - 66 + 65 @@ -6699,8 +6687,8 @@ terms-of-service kebab-case - libs/common/src/lib/paths.ts - 52 + libs/common/src/lib/routes.ts + 44 @@ -6784,7 +6772,7 @@ Watchlist apps/client/src/app/pages/home/home-page-routing.module.ts - 40 + 43 apps/client/src/app/pages/home/home-page.component.ts @@ -6813,45 +6801,92 @@ Do you really want to delete this item? libs/ui/src/lib/benchmark/benchmark.component.ts - 122 + 132 Log out apps/client/src/app/components/header/header.component.html - 317 + 324 Calculations are based on delayed market data and may not be displayed in real-time. apps/client/src/app/components/home-market/home-market.html - 41 + 43 - - oss-friends + + changelog kebab-case - libs/common/src/lib/paths.ts - 46 + libs/common/src/lib/routes.ts + 31 - - changelog - kebab-case + + Sync Demo User Account - libs/common/src/lib/paths.ts - 37 + apps/client/src/app/components/admin-overview/admin-overview.html + 181 - - open - kebab-case + + Demo user account has been synced. - libs/common/src/lib/paths.ts - 45 + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 223 + + + + Name + + libs/ui/src/lib/benchmark/benchmark.component.html + 11 + + + + Emergency Fund: Set up + + apps/client/src/app/pages/i18n/i18n-page.html + 14 + + + + No emergency fund has been set up + + apps/client/src/app/pages/i18n/i18n-page.html + 15 + + + + An emergency fund has been set up + + apps/client/src/app/pages/i18n/i18n-page.html + 18 + + + + Fee Ratio + + apps/client/src/app/pages/i18n/i18n-page.html + 21 + + + + The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + + apps/client/src/app/pages/i18n/i18n-page.html + 22 + + + + The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + + apps/client/src/app/pages/i18n/i18n-page.html + 26 diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index 7c90eb7d9..743926cd4 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -7,8 +7,8 @@ 关于 kebab-case - libs/common/src/lib/paths.ts - 36 + libs/common/src/lib/routes.ts + 29 @@ -16,8 +16,8 @@ 常见问题 kebab-case - libs/common/src/lib/paths.ts - 38 + libs/common/src/lib/routes.ts + 32 @@ -25,8 +25,8 @@ 功能 kebab-case - libs/common/src/lib/paths.ts - 39 + libs/common/src/lib/routes.ts + 33 @@ -34,8 +34,8 @@ 许可证 kebab-case - libs/common/src/lib/paths.ts - 42 + libs/common/src/lib/routes.ts + 36 @@ -43,8 +43,8 @@ 市场 kebab-case - libs/common/src/lib/paths.ts - 43 + libs/common/src/lib/routes.ts + 37 @@ -52,8 +52,8 @@ 价钱 kebab-case - libs/common/src/lib/paths.ts - 47 + libs/common/src/lib/routes.ts + 40 @@ -61,8 +61,8 @@ 隐私政策 kebab-case - libs/common/src/lib/paths.ts - 48 + libs/common/src/lib/routes.ts + 41 @@ -70,8 +70,12 @@ 注册 kebab-case - libs/common/src/lib/paths.ts - 49 + libs/common/src/lib/routes.ts + 100 + + + libs/common/src/lib/routes.ts + 101 @@ -79,8 +83,8 @@ 资源 kebab-case - libs/common/src/lib/paths.ts - 50 + libs/common/src/lib/routes.ts + 42 @@ -128,7 +132,7 @@ apps/client/src/app/components/header/header.component.html - 396 + 403 apps/client/src/app/components/home-market/home-market.html @@ -148,11 +152,11 @@ apps/client/src/app/components/header/header.component.html - 82 + 86 apps/client/src/app/components/header/header.component.html - 289 + 296 apps/client/src/app/pages/resources/overview/resources-overview.component.html @@ -168,11 +172,11 @@ apps/client/src/app/components/header/header.component.html - 117 + 121 apps/client/src/app/components/header/header.component.html - 362 + 369 @@ -292,7 +296,7 @@ apps/client/src/app/components/header/header.component.html - 349 + 356 apps/client/src/app/pages/features/features-page.html @@ -332,15 +336,15 @@ apps/client/src/app/components/header/header.component.html - 99 + 103 apps/client/src/app/components/header/header.component.html - 301 + 308 apps/client/src/app/components/header/header.component.html - 377 + 384 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -480,7 +484,7 @@ 您真的要撤销此授予的访问权限吗? apps/client/src/app/components/access-table/access-table.component.ts - 80 + 79 @@ -630,10 +634,6 @@ libs/ui/src/lib/activities-table/activities-table.component.html 138 - - libs/ui/src/lib/benchmark/benchmark.component.html - 4 - libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -800,7 +800,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 155 + 169 @@ -1000,7 +1000,7 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html - 42 + 38 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html @@ -1024,7 +1024,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 336 + 337 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -1048,7 +1048,7 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html - 49 + 45 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html @@ -1072,7 +1072,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 343 + 344 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -1424,7 +1424,7 @@ 您确实要删除此优惠券吗? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 134 + 142 @@ -1432,7 +1432,7 @@ 您真的要删除这条系统消息吗? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 147 + 155 @@ -1440,7 +1440,7 @@ 您真的要刷新缓存吗? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 171 + 179 @@ -1448,7 +1448,7 @@ 请设置您的系统消息: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 191 + 199 @@ -1556,7 +1556,7 @@ 刷新缓存 apps/client/src/app/components/admin-overview/admin-overview.html - 174 + 186 @@ -1600,11 +1600,11 @@ apps/client/src/app/components/header/header.component.html - 54 + 58 apps/client/src/app/components/header/header.component.html - 259 + 266 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1644,7 +1644,7 @@ 平台 apps/client/src/app/components/admin-settings/admin-settings.component.html - 137 + 136 @@ -1652,7 +1652,7 @@ 标签 apps/client/src/app/components/admin-settings/admin-settings.component.html - 143 + 142 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -1786,14 +1786,14 @@ apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts 122 - - apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts - 47 - apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 94 + + libs/common/src/lib/routes.ts + 76 + Benchmark @@ -1816,11 +1816,11 @@ 概述 apps/client/src/app/components/header/header.component.html - 28 + 30 apps/client/src/app/components/header/header.component.html - 241 + 246 @@ -1828,11 +1828,11 @@ 投资组合 apps/client/src/app/components/header/header.component.html - 41 + 44 apps/client/src/app/components/header/header.component.html - 251 + 256 @@ -1840,11 +1840,11 @@ 管理控制 apps/client/src/app/components/header/header.component.html - 68 + 72 apps/client/src/app/components/header/header.component.html - 277 + 284 @@ -1852,7 +1852,7 @@ apps/client/src/app/components/header/header.component.html - 207 + 211 @@ -1864,7 +1864,7 @@ apps/client/src/app/components/header/header.component.html - 225 + 229 @@ -1872,7 +1872,7 @@ 我的 Ghostfolio apps/client/src/app/components/header/header.component.html - 266 + 273 @@ -1880,7 +1880,7 @@ 关于 Ghostfolio apps/client/src/app/components/header/header.component.html - 314 + 321 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -1892,7 +1892,7 @@ 登入 apps/client/src/app/components/header/header.component.html - 410 + 417 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -1904,7 +1904,7 @@ 开始使用 apps/client/src/app/components/header/header.component.html - 420 + 427 @@ -1912,11 +1912,11 @@ 登入 apps/client/src/app/app-routing.module.ts - 150 + 154 apps/client/src/app/components/header/header.component.ts - 237 + 242 @@ -1924,7 +1924,7 @@ 哎呀!安全令牌不正确。 apps/client/src/app/components/header/header.component.ts - 252 + 257 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -2128,7 +2128,7 @@ apps/client/src/app/pages/webauthn/webauthn-page.html - 29 + 30 @@ -2412,7 +2412,7 @@ 报告数据故障 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 409 + 407 @@ -2552,7 +2552,7 @@ 升级计划 apps/client/src/app/components/header/header.component.html - 187 + 191 apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html @@ -3023,8 +3023,8 @@ Accounts 账户 - apps/client/src/app/pages/accounts/accounts-page-routing.module.ts - 13 + libs/common/src/lib/routes.ts + 51 @@ -3142,21 +3142,17 @@ apps/client/src/app/pages/admin/admin-page.component.ts 29 - - apps/client/src/app/pages/home/home-page.component.ts - 39 - apps/client/src/app/pages/resources/resources-page.component.ts 19 - apps/client/src/app/pages/zen/zen-page-routing.module.ts - 20 + libs/common/src/lib/routes.ts + 64 - apps/client/src/app/pages/zen/zen-page.component.ts - 36 + libs/common/src/lib/routes.ts + 89 @@ -3216,7 +3212,7 @@ 功能 apps/client/src/app/app-routing.module.ts - 74 + 78 @@ -3347,16 +3343,12 @@ Holdings 持仓 - apps/client/src/app/pages/home/home-page-routing.module.ts - 25 - - - apps/client/src/app/pages/home/home-page.component.ts - 44 + libs/common/src/lib/routes.ts + 61 - apps/client/src/app/pages/zen/zen-page.component.ts - 41 + libs/common/src/lib/routes.ts + 86 @@ -3364,7 +3356,7 @@ 汇总 apps/client/src/app/pages/home/home-page-routing.module.ts - 30 + 33 apps/client/src/app/pages/home/home-page.component.ts @@ -3376,7 +3368,7 @@ 市场 apps/client/src/app/pages/home/home-page-routing.module.ts - 35 + 38 apps/client/src/app/pages/home/home-page.component.ts @@ -3416,7 +3408,7 @@ 开源财富管理软件 apps/client/src/app/pages/i18n/i18n-page.html - 14 + 30 @@ -3815,12 +3807,8 @@ Activities 活动 - apps/client/src/app/pages/portfolio/activities/activities-page-routing.module.ts - 13 - - - apps/client/src/app/pages/portfolio/portfolio-page.component.ts - 41 + libs/common/src/lib/routes.ts + 73 @@ -4204,7 +4192,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 188 + 202 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -4580,7 +4568,7 @@ 更新计划 apps/client/src/app/components/header/header.component.html - 185 + 189 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -4651,8 +4639,8 @@ Registration 注册 - apps/client/src/app/pages/register/register-page-routing.module.ts - 13 + libs/common/src/lib/routes.ts + 102 @@ -4692,8 +4680,8 @@ 开源替代方案 kebab-case - libs/common/src/lib/paths.ts - 44 + libs/common/src/lib/routes.ts + 38 @@ -5077,7 +5065,7 @@ 返回首页 apps/client/src/app/pages/webauthn/webauthn-page.html - 31 + 33 @@ -5205,7 +5193,7 @@ 50 天趋势 libs/ui/src/lib/benchmark/benchmark.component.html - 16 + 25 @@ -5213,7 +5201,7 @@ 200天趋势 libs/ui/src/lib/benchmark/benchmark.component.html - 45 + 54 @@ -5221,7 +5209,7 @@ 上次历史最高纪录 libs/ui/src/lib/benchmark/benchmark.component.html - 74 + 83 @@ -5229,7 +5217,7 @@ 较历史最高纪录涨跌 libs/ui/src/lib/benchmark/benchmark.component.html - 96 + 110 @@ -5237,7 +5225,7 @@ 来自 ATH libs/ui/src/lib/benchmark/benchmark.component.html - 98 + 112 @@ -6029,8 +6017,8 @@ 自托管 kebab-case - libs/common/src/lib/paths.ts - 51 + libs/common/src/lib/routes.ts + 43 @@ -6198,7 +6186,7 @@ 国际化 apps/client/src/app/app-routing.module.ts - 88 + 92 @@ -6894,7 +6882,7 @@ 设置 API 密钥 apps/client/src/app/components/admin-settings/admin-settings.component.html - 113 + 112 @@ -6950,8 +6938,8 @@ 指南 kebab-case - libs/common/src/lib/paths.ts - 41 + libs/common/src/lib/routes.ts + 35 @@ -6959,8 +6947,8 @@ 词汇表 kebab-case - libs/common/src/lib/paths.ts - 40 + libs/common/src/lib/routes.ts + 34 @@ -7016,7 +7004,7 @@ 您确定要删除此 API 密钥吗? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 102 + 98 @@ -7168,7 +7156,7 @@ 链接已复制到剪贴板 apps/client/src/app/components/access-table/access-table.component.ts - 66 + 65 @@ -7420,8 +7408,8 @@ 服务条款 kebab-case - libs/common/src/lib/paths.ts - 52 + libs/common/src/lib/routes.ts + 44 @@ -7557,7 +7545,7 @@ 关注列表 apps/client/src/app/pages/home/home-page-routing.module.ts - 40 + 43 apps/client/src/app/pages/home/home-page.component.ts @@ -7577,7 +7565,7 @@ 您确定要删除此项目吗? libs/ui/src/lib/benchmark/benchmark.component.ts - 122 + 132 @@ -7585,7 +7573,7 @@ 登出 apps/client/src/app/components/header/header.component.html - 317 + 324 @@ -7593,7 +7581,7 @@ 计算基于延迟的市场数据,可能无法实时显示。 apps/client/src/app/components/home-market/home-market.html - 41 + 43 @@ -7601,26 +7589,80 @@ 变更日志 kebab-case - libs/common/src/lib/paths.ts - 37 + libs/common/src/lib/routes.ts + 31 - - oss-friends - 开源朋友 - kebab-case + + Demo user account has been synced. + Demo user account has been synced. - libs/common/src/lib/paths.ts - 46 + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 223 - - open - open - kebab-case + + Sync Demo User Account + Sync Demo User Account - libs/common/src/lib/paths.ts - 45 + apps/client/src/app/components/admin-overview/admin-overview.html + 181 + + + + Emergency Fund: Set up + Emergency Fund: Set up + + apps/client/src/app/pages/i18n/i18n-page.html + 14 + + + + No emergency fund has been set up + No emergency fund has been set up + + apps/client/src/app/pages/i18n/i18n-page.html + 15 + + + + An emergency fund has been set up + An emergency fund has been set up + + apps/client/src/app/pages/i18n/i18n-page.html + 18 + + + + Fee Ratio + Fee Ratio + + apps/client/src/app/pages/i18n/i18n-page.html + 21 + + + + The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + + apps/client/src/app/pages/i18n/i18n-page.html + 22 + + + + The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + + apps/client/src/app/pages/i18n/i18n-page.html + 26 + + + + Name + Name + + libs/ui/src/lib/benchmark/benchmark.component.html + 11 diff --git a/apps/client/src/styles.scss b/apps/client/src/styles.scss index b4723d377..1975b02b3 100644 --- a/apps/client/src/styles.scss +++ b/apps/client/src/styles.scss @@ -414,6 +414,14 @@ ngx-skeleton-loader { } } +.mat-mdc-card { + .mat-mdc-card-title { + --mat-card-title-text-line-height: 1.2; + + margin-bottom: 0.5rem; + } +} + .mat-mdc-checkbox { label { margin-bottom: 0; diff --git a/apps/ui-e2e/project.json b/apps/ui-e2e/project.json index 4595b6c66..a5b4cf53a 100644 --- a/apps/ui-e2e/project.json +++ b/apps/ui-e2e/project.json @@ -3,13 +3,14 @@ "$schema": "../../node_modules/nx/schemas/project-schema.json", "sourceRoot": "apps/ui-e2e/src", "projectType": "application", + "tags": [], + "implicitDependencies": ["ui"], "targets": { "e2e": { "executor": "@nx/cypress:cypress", "options": { "cypressConfig": "apps/ui-e2e/cypress.json", - "devServerTarget": "ui:storybook", - "tsConfig": "apps/ui-e2e/tsconfig.json" + "devServerTarget": "ui:storybook" }, "configurations": { "ci": { @@ -23,7 +24,5 @@ "lintFilePatterns": ["apps/ui-e2e/**/*.{js,ts}"] } } - }, - "tags": [], - "implicitDependencies": ["ui"] + } } diff --git a/libs/common/src/lib/calculation-helper.ts b/libs/common/src/lib/calculation-helper.ts index 4292f2383..d67384a30 100644 --- a/libs/common/src/lib/calculation-helper.ts +++ b/libs/common/src/lib/calculation-helper.ts @@ -23,10 +23,14 @@ export function getAnnualizedPerformancePercent({ }): Big { if (isNumber(daysInMarket) && daysInMarket > 0) { const exponent = new Big(365).div(daysInMarket).toNumber(); + const growthFactor = Math.pow( + netPerformancePercentage.plus(1).toNumber(), + exponent + ); - return new Big( - Math.pow(netPerformancePercentage.plus(1).toNumber(), exponent) - ).minus(1); + if (!isNaN(growthFactor)) { + return new Big(growthFactor).minus(1); + } } return new Big(0); diff --git a/libs/common/src/lib/config.ts b/libs/common/src/lib/config.ts index 06ff59bb7..e124360a1 100644 --- a/libs/common/src/lib/config.ts +++ b/libs/common/src/lib/config.ts @@ -76,8 +76,6 @@ export const DERIVED_CURRENCIES = [ } ]; -export const EMERGENCY_FUND_TAG_ID = '4452656d-9fa4-4bd0-ba38-70492e31d180'; - export const GATHER_ASSET_PROFILE_PROCESS_JOB_NAME = 'GATHER_ASSET_PROFILE'; export const GATHER_ASSET_PROFILE_PROCESS_JOB_OPTIONS: JobOptions = { attempts: 12, @@ -122,6 +120,7 @@ export const PROPERTY_CURRENCIES = 'CURRENCIES'; export const PROPERTY_DATA_SOURCE_MAPPING = 'DATA_SOURCE_MAPPING'; export const PROPERTY_DATA_SOURCES_GHOSTFOLIO_DATA_PROVIDER_MAX_REQUESTS = 'DATA_SOURCES_GHOSTFOLIO_DATA_PROVIDER_MAX_REQUESTS'; +export const PROPERTY_DEMO_ACCOUNT_ID = 'DEMO_ACCOUNT_ID'; export const PROPERTY_DEMO_USER_ID = 'DEMO_USER_ID'; export const PROPERTY_IS_DATA_GATHERING_ENABLED = 'IS_DATA_GATHERING_ENABLED'; export const PROPERTY_IS_READ_ONLY_MODE = 'IS_READ_ONLY_MODE'; @@ -171,4 +170,7 @@ export const SUPPORTED_LANGUAGE_CODES = [ 'zh' ]; +export const TAG_ID_EMERGENCY_FUND = '4452656d-9fa4-4bd0-ba38-70492e31d180'; +export const TAG_ID_DEMO = 'efa08cb3-9b9d-4974-ac68-db13a19c4874'; + export const UNKNOWN_KEY = 'UNKNOWN'; diff --git a/libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts b/libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts index b330e8baa..000460228 100644 --- a/libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts +++ b/libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts @@ -22,7 +22,7 @@ export interface PortfolioHoldingResponse { grossPerformancePercentWithCurrencyEffect: number; grossPerformanceWithCurrencyEffect: number; historicalData: HistoricalDataItem[]; - investment: number; + investmentInBaseCurrencyWithCurrencyEffect: number; marketPrice: number; marketPriceMax: number; marketPriceMin: number; diff --git a/libs/common/src/lib/paths.ts b/libs/common/src/lib/paths.ts deleted file mode 100644 index 06633ca95..000000000 --- a/libs/common/src/lib/paths.ts +++ /dev/null @@ -1,53 +0,0 @@ -import '@angular/localize/init'; - -export const paths = { - access: 'access', - account: 'account', - accounts: 'accounts', - activities: 'activities', - adminControl: 'admin', - allocations: 'allocations', - api: 'api', - auth: 'auth', - blog: 'blog', - demo: 'demo', - fire: 'fire', - holdings: 'holdings', - home: 'home', - i18n: 'i18n', - jobs: 'jobs', - market: 'market', - marketData: 'market-data', - membership: 'membership', - personalFinanceTools: 'personal-finance-tools', - portfolio: 'portfolio', - public: 'p', - saas: 'saas', - settings: 'settings', - start: 'start', - summary: 'summary', - users: 'users', - watchlist: 'watchlist', - webauthn: 'webauthn', - xRay: 'x-ray', - zen: 'zen', - - // Localized paths (public-facing pages) - about: $localize`:kebab-case:about`, - changelog: $localize`:kebab-case:changelog`, - faq: $localize`:kebab-case:faq`, - features: $localize`:kebab-case:features`, - glossary: $localize`:kebab-case:glossary`, - guides: $localize`:kebab-case:guides`, - license: $localize`:kebab-case:license`, - markets: $localize`:kebab-case:markets`, - openSourceAlternativeTo: $localize`:kebab-case:open-source-alternative-to`, - openStartup: $localize`:kebab-case:open`, - ossFriends: $localize`:kebab-case:oss-friends`, - pricing: $localize`:kebab-case:pricing`, - privacyPolicy: $localize`:kebab-case:privacy-policy`, - register: $localize`:kebab-case:register`, - resources: $localize`:kebab-case:resources`, - selfHosting: $localize`:kebab-case:self-hosting`, - termsOfService: $localize`:kebab-case:terms-of-service` -}; diff --git a/libs/common/src/lib/permissions.ts b/libs/common/src/lib/permissions.ts index 592167562..8f8a10427 100644 --- a/libs/common/src/lib/permissions.ts +++ b/libs/common/src/lib/permissions.ts @@ -45,6 +45,7 @@ export const permissions = { readTags: 'readTags', readWatchlist: 'readWatchlist', reportDataGlitch: 'reportDataGlitch', + syncDemoUserAccount: 'syncDemoUserAccount', toggleReadOnlyMode: 'toggleReadOnlyMode', updateAccount: 'updateAccount', updateAuthDevice: 'updateAuthDevice', diff --git a/libs/common/src/lib/routes.ts b/libs/common/src/lib/routes.ts new file mode 100644 index 000000000..44a19bc8a --- /dev/null +++ b/libs/common/src/lib/routes.ts @@ -0,0 +1,104 @@ +import '@angular/localize/init'; + +export const routes = { + access: 'access', + account: 'account', + adminControl: 'admin', + allocations: 'allocations', + api: 'api', + auth: 'auth', + demo: 'demo', + fire: 'fire', + i18n: 'i18n', + jobs: 'jobs', + market: 'market', + marketData: 'market-data', + membership: 'membership', + personalFinanceTools: 'personal-finance-tools', + public: 'p', + saas: 'saas', + settings: 'settings', + start: 'start', + summary: 'summary', + users: 'users', + watchlist: 'watchlist', + webauthn: 'webauthn', + xRay: 'x-ray', + + // Publicly accessible pages + about: $localize`:kebab-case:about`, + blog: 'blog', + changelog: $localize`:kebab-case:changelog`, + faq: $localize`:kebab-case:faq`, + features: $localize`:kebab-case:features`, + glossary: $localize`:kebab-case:glossary`, + guides: $localize`:kebab-case:guides`, + license: $localize`:kebab-case:license`, + markets: $localize`:kebab-case:markets`, + openSourceAlternativeTo: $localize`:kebab-case:open-source-alternative-to`, + ossFriends: 'oss-friends', + pricing: $localize`:kebab-case:pricing`, + privacyPolicy: $localize`:kebab-case:privacy-policy`, + resources: $localize`:kebab-case:resources`, + selfHosting: $localize`:kebab-case:self-hosting`, + termsOfService: $localize`:kebab-case:terms-of-service` +}; + +export const internalRoutes = { + accounts: { + path: 'accounts', + routerLink: ['/accounts'], + title: $localize`Accounts` + }, + home: { + excludeFromAssistant: true, + path: 'home', + routerLink: ['/home'], + subRoutes: { + holdings: { + path: 'holdings', + routerLink: ['/home', 'holdings'], + title: $localize`Holdings` + } + }, + title: $localize`Overview` + }, + portfolio: { + path: 'portfolio', + routerLink: ['/portfolio'], + subRoutes: { + activities: { + path: 'activities', + routerLink: ['/portfolio', 'activities'], + title: $localize`Activities` + } + }, + title: $localize`Portfolio` + }, + zen: { + excludeFromAssistant: true, + path: 'zen', + routerLink: ['/zen'], + subRoutes: { + holdings: { + path: 'holdings', + routerLink: ['/zen', 'holdings'], + title: $localize`Holdings` + } + }, + title: $localize`Overview` + } +}; + +export const publicRoutes = { + openStartup: { + path: 'open', + routerLink: ['/open'], + title: 'Open Startup' + }, + register: { + path: $localize`:kebab-case:register`, + routerLink: ['/' + $localize`:kebab-case:register`], + title: $localize`Registration` + } +}; diff --git a/libs/common/src/lib/types/user-with-settings.type.ts b/libs/common/src/lib/types/user-with-settings.type.ts index 5fb25a664..9bff8c625 100644 --- a/libs/common/src/lib/types/user-with-settings.type.ts +++ b/libs/common/src/lib/types/user-with-settings.type.ts @@ -6,7 +6,7 @@ import { Access, Account, Settings, User } from '@prisma/client'; // TODO: Compare with User interface export type UserWithSettings = User & { Access: Access[]; - Account: Account[]; + accounts: Account[]; activityCount: number; dataProviderGhostfolioDailyRequests: number; permissions?: string[]; diff --git a/libs/ui/src/lib/activities-table/activities-table.component.html b/libs/ui/src/lib/activities-table/activities-table.component.html index 79a7d3417..a0607789a 100644 --- a/libs/ui/src/lib/activities-table/activities-table.component.html +++ b/libs/ui/src/lib/activities-table/activities-table.component.html @@ -124,7 +124,7 @@ -
    @if (element.Account?.Platform?.url) { -
    - - +
    - + @@ -91,7 +100,12 @@ -
    Name + Name + {{ element?.name }} + Change from All Time High diff --git a/libs/ui/src/lib/benchmark/benchmark.component.scss b/libs/ui/src/lib/benchmark/benchmark.component.scss index 5d4e87f30..990b8b294 100644 --- a/libs/ui/src/lib/benchmark/benchmark.component.scss +++ b/libs/ui/src/lib/benchmark/benchmark.component.scss @@ -1,3 +1,13 @@ :host { display: block; + + .gf-table { + th { + ::ng-deep { + .mat-sort-header-container { + justify-content: inherit; + } + } + } + } } diff --git a/libs/ui/src/lib/benchmark/benchmark.component.ts b/libs/ui/src/lib/benchmark/benchmark.component.ts index e773caecf..7269bb70c 100644 --- a/libs/ui/src/lib/benchmark/benchmark.component.ts +++ b/libs/ui/src/lib/benchmark/benchmark.component.ts @@ -19,14 +19,16 @@ import { Input, OnChanges, OnDestroy, - Output + Output, + ViewChild } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; import { MatDialog } from '@angular/material/dialog'; import { MatMenuModule } from '@angular/material/menu'; -import { MatTableModule } from '@angular/material/table'; +import { MatSort, MatSortModule } from '@angular/material/sort'; +import { MatTableDataSource, MatTableModule } from '@angular/material/table'; import { ActivatedRoute, Router, RouterModule } from '@angular/router'; -import { isNumber } from 'lodash'; +import { get, isNumber } from 'lodash'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { Subject, takeUntil } from 'rxjs'; @@ -41,6 +43,7 @@ import { BenchmarkDetailDialogParams } from './benchmark-detail-dialog/interface GfValueComponent, MatButtonModule, MatMenuModule, + MatSortModule, MatTableModule, NgxSkeletonLoaderModule, RouterModule @@ -59,6 +62,9 @@ export class GfBenchmarkComponent implements OnChanges, OnDestroy { @Output() itemDeleted = new EventEmitter(); + @ViewChild(MatSort) sort: MatSort; + + public dataSource = new MatTableDataSource([]); public displayedColumns = [ 'name', 'date', @@ -97,6 +103,10 @@ export class GfBenchmarkComponent implements OnChanges, OnDestroy { public ngOnChanges() { if (this.benchmarks) { + this.dataSource.data = this.benchmarks; + this.dataSource.sort = this.sort; + this.dataSource.sortingDataAccessor = get; + this.isLoading = false; } diff --git a/apps/client/src/app/components/asset-profile-icon/asset-profile-icon.component.html b/libs/ui/src/lib/entity-logo/entity-logo.component.html similarity index 100% rename from apps/client/src/app/components/asset-profile-icon/asset-profile-icon.component.html rename to libs/ui/src/lib/entity-logo/entity-logo.component.html diff --git a/apps/client/src/app/components/asset-profile-icon/asset-profile-icon.component.scss b/libs/ui/src/lib/entity-logo/entity-logo.component.scss similarity index 100% rename from apps/client/src/app/components/asset-profile-icon/asset-profile-icon.component.scss rename to libs/ui/src/lib/entity-logo/entity-logo.component.scss diff --git a/apps/client/src/app/components/asset-profile-icon/asset-profile-icon.component.ts b/libs/ui/src/lib/entity-logo/entity-logo.component.ts similarity index 76% rename from apps/client/src/app/components/asset-profile-icon/asset-profile-icon.component.ts rename to libs/ui/src/lib/entity-logo/entity-logo.component.ts index 179193da0..ee41c8da8 100644 --- a/apps/client/src/app/components/asset-profile-icon/asset-profile-icon.component.ts +++ b/libs/ui/src/lib/entity-logo/entity-logo.component.ts @@ -10,11 +10,11 @@ import { DataSource } from '@prisma/client'; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, schemas: [CUSTOM_ELEMENTS_SCHEMA], - selector: 'gf-asset-profile-icon', - styleUrls: ['./asset-profile-icon.component.scss'], - templateUrl: './asset-profile-icon.component.html' + selector: 'gf-entity-logo', + styleUrls: ['./entity-logo.component.scss'], + templateUrl: './entity-logo.component.html' }) -export class GfAssetProfileIconComponent implements OnChanges { +export class GfEntityLogoComponent implements OnChanges { @Input() dataSource: DataSource; @Input() size: 'large'; @Input() symbol: string; diff --git a/libs/ui/src/lib/entity-logo/index.ts b/libs/ui/src/lib/entity-logo/index.ts new file mode 100644 index 000000000..9c5885208 --- /dev/null +++ b/libs/ui/src/lib/entity-logo/index.ts @@ -0,0 +1 @@ +export * from './entity-logo.component'; diff --git a/libs/ui/src/lib/holdings-table/holdings-table.component.html b/libs/ui/src/lib/holdings-table/holdings-table.component.html index dde103077..2c238b137 100644 --- a/libs/ui/src/lib/holdings-table/holdings-table.component.html +++ b/libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -10,7 +10,7 @@ - (); - public routerLinkPricing = ['/' + paths.pricing]; + public routerLinkPricing = ['/' + routes.pricing]; public onGenerateApiKey(event: MouseEvent) { event.preventDefault(); diff --git a/libs/ui/src/lib/mocks/httpClient.mock.ts b/libs/ui/src/lib/mocks/httpClient.mock.ts new file mode 100644 index 000000000..6ef79af61 --- /dev/null +++ b/libs/ui/src/lib/mocks/httpClient.mock.ts @@ -0,0 +1,18 @@ +import { Observable } from 'rxjs'; + +export class HttpClientMock { + public constructor(private mockResponses: Map) {} + + public get(url: string, options?: any): Observable { + if (this.mockResponses.has(url) && options) { + return new Observable((subscriber) => { + subscriber.next(this.mockResponses.get(url)); + subscriber.complete(); + }); + } + + return new Observable((subscriber) => { + subscriber.error(new Error(`No mock data for URL: ${url}`)); + }); + } +} diff --git a/libs/ui/src/lib/no-transactions-info/no-transactions-info.component.ts b/libs/ui/src/lib/no-transactions-info/no-transactions-info.component.ts index 286aeb322..f948edcca 100644 --- a/libs/ui/src/lib/no-transactions-info/no-transactions-info.component.ts +++ b/libs/ui/src/lib/no-transactions-info/no-transactions-info.component.ts @@ -1,4 +1,4 @@ -import { paths } from '@ghostfolio/common/paths'; +import { internalRoutes } from '@ghostfolio/common/routes'; import { CUSTOM_ELEMENTS_SCHEMA, @@ -23,8 +23,6 @@ import { GfLogoComponent } from '../logo'; export class GfNoTransactionsInfoComponent { @HostBinding('class.has-border') @Input() hasBorder = true; - public routerLinkPortfolioActivities = [ - '/' + paths.portfolio, - paths.activities - ]; + public routerLinkPortfolioActivities = + internalRoutes.portfolio.subRoutes.activities.routerLink; } diff --git a/libs/ui/src/lib/premium-indicator/premium-indicator.component.ts b/libs/ui/src/lib/premium-indicator/premium-indicator.component.ts index 90198fed6..56ce7cf58 100644 --- a/libs/ui/src/lib/premium-indicator/premium-indicator.component.ts +++ b/libs/ui/src/lib/premium-indicator/premium-indicator.component.ts @@ -1,4 +1,4 @@ -import { paths } from '@ghostfolio/common/paths'; +import { routes } from '@ghostfolio/common/routes'; import { CommonModule } from '@angular/common'; import { @@ -20,5 +20,5 @@ import { RouterModule } from '@angular/router'; export class GfPremiumIndicatorComponent { @Input() enableLink = true; - public routerLinkPricing = ['/' + paths.pricing]; + public routerLinkPricing = ['/' + routes.pricing]; } diff --git a/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html index c6327c318..456cd9940 100644 --- a/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html +++ b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html @@ -12,7 +12,7 @@ (optionSelected)="onUpdateSymbol($event)" > @if (!isLoading) { - @for (lookupItem of filteredLookupItems; track lookupItem) { + @for (lookupItem of lookupItems; track lookupItem) { ; + +type Story = StoryObj; + +export const Default: Story = { + args: {} +}; + +export const WithDefaultItems: Story = { + args: { + defaultLookupItems: DEFAULT_OPTIONS + } +}; diff --git a/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts index 3c56c4748..4d73e3c53 100644 --- a/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts +++ b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts @@ -76,16 +76,17 @@ export class GfSymbolAutocompleteComponent extends AbstractMatFormField implements OnInit, OnDestroy { - @Input() private includeIndices = false; + @Input() public defaultLookupItems: LookupItem[] = []; @Input() public isLoading = false; - @ViewChild(MatInput) private input: MatInput; - @ViewChild('symbolAutocomplete') public symbolAutocomplete: MatAutocomplete; + @Input() private includeIndices = false; + + @ViewChild(MatInput) private input: MatInput; + public control = new FormControl(); - public filteredLookupItems: (LookupItem & { assetSubClassString: string })[] = - []; + public lookupItems: (LookupItem & { assetSubClassString: string })[] = []; private unsubscribeSubject = new Subject(); @@ -106,6 +107,10 @@ export class GfSymbolAutocompleteComponent this.control.disable(); } + if (this.defaultLookupItems?.length) { + this.showDefaultOptions(); + } + this.control.valueChanges .pipe(takeUntil(this.unsubscribeSubject)) .subscribe(() => { @@ -117,7 +122,13 @@ export class GfSymbolAutocompleteComponent this.control.valueChanges .pipe( filter((query) => { - return isString(query) && query.length > 1; + if (query.length === 0) { + this.showDefaultOptions(); + + return false; + } + + return isString(query); }), tap(() => { this.isLoading = true; @@ -135,7 +146,7 @@ export class GfSymbolAutocompleteComponent }) ) .subscribe((filteredLookupItems) => { - this.filteredLookupItems = filteredLookupItems.map((lookupItem) => { + this.lookupItems = filteredLookupItems.map((lookupItem) => { return { ...lookupItem, assetSubClassString: translate(lookupItem.assetSubClass) @@ -161,7 +172,7 @@ export class GfSymbolAutocompleteComponent } public isValueInOptions(value: string) { - return this.filteredLookupItems.some((item) => { + return this.lookupItems.some((item) => { return item.symbol === value; }); } @@ -193,6 +204,17 @@ export class GfSymbolAutocompleteComponent this.unsubscribeSubject.complete(); } + private showDefaultOptions() { + this.lookupItems = this.defaultLookupItems.map((lookupItem) => { + return { + ...lookupItem, + assetSubClassString: translate(lookupItem.assetSubClass) + }; + }); + + this.changeDetectorRef.markForCheck(); + } + private validateRequired() { const requiredCheck = super.required ? !super.value?.dataSource || !super.value?.symbol diff --git a/nx.json b/nx.json index 785ffa781..d843d15b3 100644 --- a/nx.json +++ b/nx.json @@ -72,6 +72,5 @@ ] }, "parallel": 1, - "defaultBase": "origin/main", - "useLegacyCache": true + "defaultBase": "origin/main" } diff --git a/package-lock.json b/package-lock.json index 484ce76d1..6a585a001 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ghostfolio", - "version": "2.163.0", + "version": "2.169.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ghostfolio", - "version": "2.163.0", + "version": "2.169.0", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { @@ -30,24 +30,24 @@ "@dfinity/principal": "0.15.7", "@dinero.js/currencies": "2.0.0-alpha.8", "@internationalized/number": "3.6.0", - "@keyv/redis": "4.3.4", + "@keyv/redis": "4.4.0", "@nestjs/bull": "11.0.2", "@nestjs/cache-manager": "3.0.1", - "@nestjs/common": "11.1.0", + "@nestjs/common": "11.1.3", "@nestjs/config": "4.0.2", - "@nestjs/core": "11.1.0", + "@nestjs/core": "11.1.3", "@nestjs/event-emitter": "3.0.1", "@nestjs/jwt": "11.0.0", "@nestjs/passport": "11.0.5", - "@nestjs/platform-express": "11.1.0", + "@nestjs/platform-express": "11.1.3", "@nestjs/schedule": "6.0.0", "@nestjs/serve-static": "5.0.3", "@prisma/client": "6.8.2", "@simplewebauthn/browser": "13.1.0", "@simplewebauthn/server": "13.1.1", - "@stripe/stripe-js": "5.4.0", + "@stripe/stripe-js": "7.3.0", "alphavantage": "2.2.0", - "big.js": "6.2.2", + "big.js": "7.0.1", "bootstrap": "4.6.2", "bull": "4.16.5", "chart.js": "4.4.9", @@ -72,11 +72,11 @@ "lodash": "4.17.21", "marked": "15.0.4", "ms": "3.0.0-canary.1", - "ng-extract-i18n-merge": "2.14.3", + "ng-extract-i18n-merge": "2.15.1", "ngx-device-detector": "9.0.0", "ngx-markdown": "19.0.0", "ngx-skeleton-loader": "11.0.0", - "ngx-stripe": "19.0.0", + "ngx-stripe": "19.7.0", "open-color": "1.9.1", "papaparse": "5.3.1", "passport": "0.7.0", @@ -85,12 +85,12 @@ "passport-jwt": "4.0.1", "reflect-metadata": "0.2.2", "rxjs": "7.8.1", - "stripe": "17.3.0", + "stripe": "18.1.0", "svgmap": "2.12.2", "twitter-api-v2": "1.23.0", "uuid": "11.1.0", - "yahoo-finance2": "3.3.4", - "zone.js": "0.15.0" + "yahoo-finance2": "3.3.5", + "zone.js": "0.15.1" }, "devDependencies": { "@angular-devkit/build-angular": "19.2.1", @@ -107,18 +107,18 @@ "@eslint/eslintrc": "3.3.1", "@eslint/js": "9.24.0", "@nestjs/schematics": "11.0.5", - "@nestjs/testing": "11.1.0", - "@nx/angular": "20.8.1", - "@nx/cypress": "20.8.1", - "@nx/eslint-plugin": "20.8.1", - "@nx/jest": "20.8.1", - "@nx/js": "20.8.1", - "@nx/module-federation": "20.8.1", - "@nx/nest": "20.8.1", - "@nx/node": "20.8.1", - "@nx/storybook": "20.8.1", - "@nx/web": "20.8.1", - "@nx/workspace": "20.8.1", + "@nestjs/testing": "11.1.3", + "@nx/angular": "21.1.2", + "@nx/cypress": "21.1.2", + "@nx/eslint-plugin": "21.1.2", + "@nx/jest": "21.1.2", + "@nx/js": "21.1.2", + "@nx/module-federation": "21.1.2", + "@nx/nest": "21.1.2", + "@nx/node": "21.1.2", + "@nx/storybook": "21.1.2", + "@nx/web": "21.1.2", + "@nx/workspace": "21.1.2", "@schematics/angular": "19.2.1", "@storybook/addon-essentials": "8.6.12", "@storybook/addon-interactions": "8.6.12", @@ -129,7 +129,7 @@ "@types/google-spreadsheet": "3.1.5", "@types/jest": "29.5.13", "@types/lodash": "4.17.16", - "@types/node": "20.14.10", + "@types/node": "22.15.17", "@types/papaparse": "5.3.7", "@types/passport-google-oauth20": "2.0.16", "@typescript-eslint/eslint-plugin": "8.29.0", @@ -145,7 +145,7 @@ "jest": "29.7.0", "jest-environment-jsdom": "29.7.0", "jest-preset-angular": "14.4.2", - "nx": "20.8.1", + "nx": "21.1.2", "prettier": "3.5.3", "prettier-plugin-organize-attributes": "1.0.0", "prisma": "6.8.2", @@ -161,7 +161,7 @@ "webpack-bundle-analyzer": "4.10.2" }, "engines": { - "node": ">=20" + "node": ">=22" } }, "node_modules/@adobe/css-tools": { @@ -4962,13 +4962,13 @@ } }, "node_modules/@keyv/redis": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@keyv/redis/-/redis-4.3.4.tgz", - "integrity": "sha512-PLWmawfq9McxEvtHa2Uj5WjI7g6qWtv2eOvXvXJ9tkwEV5vLkqA+pFeZ/0pz9xvP20NQiAkGm4521YJ0DhuFiw==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@keyv/redis/-/redis-4.4.0.tgz", + "integrity": "sha512-n/KEj3S7crVkoykggqsMUtcjNGvjagGPlJYgO/r6m9hhGZfhp1txJElHxcdJ1ANi/LJoBuOSILj15g6HD2ucqQ==", "license": "MIT", "dependencies": { - "cluster-key-slot": "^1.1.2", - "redis": "^4.7.0" + "@redis/client": "^1.6.0", + "cluster-key-slot": "^1.1.2" }, "engines": { "node": ">= 18" @@ -5185,14 +5185,14 @@ } }, "node_modules/@modern-js/node-bundle-require": { - "version": "2.65.1", - "resolved": "https://registry.npmjs.org/@modern-js/node-bundle-require/-/node-bundle-require-2.65.1.tgz", - "integrity": "sha512-XpEkciVEfDbkkLUI662ZFlI9tXsUQtLXk4NRJDBGosNnk9uL2XszmC8sKsdCSLK8AYuPW2w6MTVWuJsOR0EU8A==", + "version": "2.67.6", + "resolved": "https://registry.npmjs.org/@modern-js/node-bundle-require/-/node-bundle-require-2.67.6.tgz", + "integrity": "sha512-rRiDQkrm3kgn0E/GNrcvqo4c71PaUs2R8Xmpv6GUKbEr6lz7VNgfZmAhdAQPtNfRfiBe+1sFLzEcwfEdDo/dTA==", "dev": true, "license": "MIT", "dependencies": { - "@modern-js/utils": "2.65.1", - "@swc/helpers": "0.5.13", + "@modern-js/utils": "2.67.6", + "@swc/helpers": "^0.5.17", "esbuild": "0.17.19" } }, @@ -5570,16 +5570,6 @@ "node": ">=12" } }, - "node_modules/@modern-js/node-bundle-require/node_modules/@swc/helpers": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.13.tgz", - "integrity": "sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@modern-js/node-bundle-require/node_modules/esbuild": { "version": "0.17.19", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", @@ -5619,28 +5609,18 @@ } }, "node_modules/@modern-js/utils": { - "version": "2.65.1", - "resolved": "https://registry.npmjs.org/@modern-js/utils/-/utils-2.65.1.tgz", - "integrity": "sha512-HrChf19F+6nALo5XPra8ycjhXGQfGi23+S7Y2FLfTKe8vaNnky8duT/XvRWpbS4pp3SQj8ryO8m/qWSsJ1Rogw==", + "version": "2.67.6", + "resolved": "https://registry.npmjs.org/@modern-js/utils/-/utils-2.67.6.tgz", + "integrity": "sha512-cxY7HsSH0jIN3rlL6RZ0tgzC1tH0gHW++8X6h7sXCNCylhUdbGZI9yTGbpAS8bU7c97NmPaTKg+/ILt00Kju1Q==", "dev": true, "license": "MIT", "dependencies": { - "@swc/helpers": "0.5.13", + "@swc/helpers": "^0.5.17", "caniuse-lite": "^1.0.30001520", "lodash": "^4.17.21", "rslog": "^1.1.0" } }, - "node_modules/@modern-js/utils/node_modules/@swc/helpers": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.13.tgz", - "integrity": "sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@module-federation/bridge-react-webpack-plugin": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-0.9.1.tgz", @@ -5667,15 +5647,15 @@ } }, "node_modules/@module-federation/cli": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@module-federation/cli/-/cli-0.13.0.tgz", - "integrity": "sha512-5n7fjeTNq0O+0M4j1Behp/kfNqTpmib0CwcETNov3Bw7J4ohiyrGS76CRB0OrkE7WlE6psFlyCPAiPI9YsDldg==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/cli/-/cli-0.14.3.tgz", + "integrity": "sha512-BRR1d+piUSKW5OAuU+ej/zS3pMS4ismea9XHD/DWGJXW/Am7h1pFxRNYAZ8iflLJQ46oqjS/j1ECc5WJmbHlxw==", "dev": true, "license": "MIT", "dependencies": { - "@modern-js/node-bundle-require": "2.65.1", - "@module-federation/dts-plugin": "0.13.0", - "@module-federation/sdk": "0.13.0", + "@modern-js/node-bundle-require": "2.67.6", + "@module-federation/dts-plugin": "0.14.3", + "@module-federation/sdk": "0.14.3", "chalk": "3.0.0", "commander": "11.1.0" }, @@ -5687,16 +5667,16 @@ } }, "node_modules/@module-federation/cli/node_modules/@module-federation/dts-plugin": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-0.13.0.tgz", - "integrity": "sha512-+I3kaf1BHZLTv37dxQTQ/WErAePAnVWKs1cdkea1PA/oRo4IJRVkMya53mKRlawR/Tam9GldphrR1ylOJxMl4w==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-0.14.3.tgz", + "integrity": "sha512-QiE4wcra6dNo36028cX//QfX0uKF6UeoQoaVIIu06imF4KjCNQD3bE91D6H3DlVVD/UjnIDeUSt9AoGesLzbSA==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/error-codes": "0.13.0", - "@module-federation/managers": "0.13.0", - "@module-federation/sdk": "0.13.0", - "@module-federation/third-party-dts-extractor": "0.13.0", + "@module-federation/error-codes": "0.14.3", + "@module-federation/managers": "0.14.3", + "@module-federation/sdk": "0.14.3", + "@module-federation/third-party-dts-extractor": "0.14.3", "adm-zip": "^0.5.10", "ansi-colors": "^4.1.3", "axios": "^1.8.2", @@ -5721,35 +5701,35 @@ } }, "node_modules/@module-federation/cli/node_modules/@module-federation/error-codes": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.13.0.tgz", - "integrity": "sha512-4soAMLr7qcVWuvCsyRmBbiBfuhxmnDeyl+qzjMx8VurQgL+XQDQJapM9RXngNGT4g8FoCq9o7rM5YWNgFFNUiw==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.14.3.tgz", + "integrity": "sha512-sBJ3XKU9g5Up31jFeXPFsD8AgORV7TLO/cCSMuRewSfgYbG/3vSKLJmfHrO6+PvjZSb9VyV2UaF02ojktW65vw==", "dev": true, "license": "MIT" }, "node_modules/@module-federation/cli/node_modules/@module-federation/managers": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-0.13.0.tgz", - "integrity": "sha512-dpfRjIE4UR4QRP20rENQJs9HfnuWzzsA9W6Eu+r+G+obZnzNIxbONUzg5bCMmhbDsR3krxU6LRrwU1zXnA6bxw==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-0.14.3.tgz", + "integrity": "sha512-uQiLRUvy2yiWm7Xa75y8/He3swW0l2hn8Ef09mvSXhjewwFQMPClQAmZa1UCgNk1F7s/dXDtL9E8vlnX/aZdOQ==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/sdk": "0.13.0", + "@module-federation/sdk": "0.14.3", "find-pkg": "2.0.0", "fs-extra": "9.1.0" } }, "node_modules/@module-federation/cli/node_modules/@module-federation/sdk": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.13.0.tgz", - "integrity": "sha512-JdMZaPD+EQvMJYS+/8/8QjaAHQ3qljogvioXBsAuedcStu/msn5e1Fswc0G34kXY9ixs2hUPZU2cAllfSKWIBQ==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.14.3.tgz", + "integrity": "sha512-THJZMfbXpqjQOLblCQ8jjcBFFXsGRJwUWE9l/Q4SmuCSKMgAwie7yLT0qSGrHmyBYrsUjAuy+xNB4nfKP0pnGw==", "dev": true, "license": "MIT" }, "node_modules/@module-federation/cli/node_modules/@module-federation/third-party-dts-extractor": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-0.13.0.tgz", - "integrity": "sha512-0sBgo917+AksBjFXrdWOhX58D+wjHR/vXtiCbwFdAGDwLuMs7crMMc4Aay2FJRwPCm1fMGy/4kYvLh5MRhUHRA==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-0.14.3.tgz", + "integrity": "sha512-XAbUoN5hP9iSnrKGikDIy8CloWCKHRIpe+DWOlq8u7uXoRpAPs/a5K7uegxB27dZUNxSFEfqDeHrpQORNnDqPg==", "dev": true, "license": "MIT", "dependencies": { @@ -6041,16 +6021,15 @@ } }, "node_modules/@module-federation/node": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/@module-federation/node/-/node-2.7.1.tgz", - "integrity": "sha512-CKFoCq0R6k01Wt+qfWqWnF7XSHNDdIq4reVGvx1/TtAcv3U1opfI1Fgn2zWci9b8E0xQKteCVD5lI3Ws3dJt6w==", + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/@module-federation/node/-/node-2.7.6.tgz", + "integrity": "sha512-QZlUvOOKrwMMDA9CULIi/wrwlnssDi2WDctat3oszxsoziPSpwwbsfm9tGPasw2FvMCvZDO0kCMWSmvuIIeEKg==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/enhanced": "0.13.0", - "@module-federation/runtime": "0.13.0", - "@module-federation/sdk": "0.13.0", - "@module-federation/utilities": "3.1.53", + "@module-federation/enhanced": "0.14.3", + "@module-federation/runtime": "0.14.3", + "@module-federation/sdk": "0.14.3", "btoa": "1.2.1", "encoding": "^0.1.13", "node-fetch": "2.7.0" @@ -6073,26 +6052,26 @@ } }, "node_modules/@module-federation/node/node_modules/@module-federation/bridge-react-webpack-plugin": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-0.13.0.tgz", - "integrity": "sha512-5p+LKEq0fwuPGIIzt/dsPlz0atgwv/G2ijeqtzh1K/1tEhtasfr6LNjjnOsjZNA8YR3v0agQAijabIpT6B7PYQ==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-0.14.3.tgz", + "integrity": "sha512-lRkAeNpRdsOFIYx+SSEzsWUZbr2RdfcLA0UbadBaWV3FgeoSd0mef9IO9+KlY1y05anvwOS17VlsX0DeCbvMXg==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/sdk": "0.13.0", + "@module-federation/sdk": "0.14.3", "@types/semver": "7.5.8", "semver": "7.6.3" } }, "node_modules/@module-federation/node/node_modules/@module-federation/data-prefetch": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@module-federation/data-prefetch/-/data-prefetch-0.13.0.tgz", - "integrity": "sha512-mimi7eqKySOmKrXDCo3Lk4KZq1i0PZDwSmP9Es5RWK8senaCRu10WwFLhAVJ/yIH2Wt7HFy23ZyYNukrLikedQ==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/data-prefetch/-/data-prefetch-0.14.3.tgz", + "integrity": "sha512-jGSeo4e32PxTIqPxxwb11oqBXLzygx7fsbV0RXHhy0W1IXDzFObYbHCN95ohxAEh25Hn5jinxBCFn/ltEzQUlA==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/runtime": "0.13.0", - "@module-federation/sdk": "0.13.0", + "@module-federation/runtime": "0.14.3", + "@module-federation/sdk": "0.14.3", "fs-extra": "9.1.0" }, "peerDependencies": { @@ -6101,16 +6080,16 @@ } }, "node_modules/@module-federation/node/node_modules/@module-federation/dts-plugin": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-0.13.0.tgz", - "integrity": "sha512-+I3kaf1BHZLTv37dxQTQ/WErAePAnVWKs1cdkea1PA/oRo4IJRVkMya53mKRlawR/Tam9GldphrR1ylOJxMl4w==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-0.14.3.tgz", + "integrity": "sha512-QiE4wcra6dNo36028cX//QfX0uKF6UeoQoaVIIu06imF4KjCNQD3bE91D6H3DlVVD/UjnIDeUSt9AoGesLzbSA==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/error-codes": "0.13.0", - "@module-federation/managers": "0.13.0", - "@module-federation/sdk": "0.13.0", - "@module-federation/third-party-dts-extractor": "0.13.0", + "@module-federation/error-codes": "0.14.3", + "@module-federation/managers": "0.14.3", + "@module-federation/sdk": "0.14.3", + "@module-federation/third-party-dts-extractor": "0.14.3", "adm-zip": "^0.5.10", "ansi-colors": "^4.1.3", "axios": "^1.8.2", @@ -6135,23 +6114,23 @@ } }, "node_modules/@module-federation/node/node_modules/@module-federation/enhanced": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@module-federation/enhanced/-/enhanced-0.13.0.tgz", - "integrity": "sha512-G9R5U6sQVkHAKW+VYlT8DprkJJasV0H9vPyt8CLrNxL1myzz3YVObr1RG3JciF+RsBC3zdmSNftXkUz15nUZ/Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@module-federation/bridge-react-webpack-plugin": "0.13.0", - "@module-federation/cli": "0.13.0", - "@module-federation/data-prefetch": "0.13.0", - "@module-federation/dts-plugin": "0.13.0", - "@module-federation/error-codes": "0.13.0", - "@module-federation/inject-external-runtime-core-plugin": "0.13.0", - "@module-federation/managers": "0.13.0", - "@module-federation/manifest": "0.13.0", - "@module-federation/rspack": "0.13.0", - "@module-federation/runtime-tools": "0.13.0", - "@module-federation/sdk": "0.13.0", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/enhanced/-/enhanced-0.14.3.tgz", + "integrity": "sha512-9R15Sm+hCn9yNtOTEwN1cHppC/sMb/LfoTcA94jLMB6lcyYz+uNzc5JliyrMawU1/guOQiBZkUVL/thB8DHURw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/bridge-react-webpack-plugin": "0.14.3", + "@module-federation/cli": "0.14.3", + "@module-federation/data-prefetch": "0.14.3", + "@module-federation/dts-plugin": "0.14.3", + "@module-federation/error-codes": "0.14.3", + "@module-federation/inject-external-runtime-core-plugin": "0.14.3", + "@module-federation/managers": "0.14.3", + "@module-federation/manifest": "0.14.3", + "@module-federation/rspack": "0.14.3", + "@module-federation/runtime-tools": "0.14.3", + "@module-federation/sdk": "0.14.3", "btoa": "^1.2.1", "schema-utils": "^4.3.0", "upath": "2.0.1" @@ -6177,62 +6156,62 @@ } }, "node_modules/@module-federation/node/node_modules/@module-federation/error-codes": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.13.0.tgz", - "integrity": "sha512-4soAMLr7qcVWuvCsyRmBbiBfuhxmnDeyl+qzjMx8VurQgL+XQDQJapM9RXngNGT4g8FoCq9o7rM5YWNgFFNUiw==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.14.3.tgz", + "integrity": "sha512-sBJ3XKU9g5Up31jFeXPFsD8AgORV7TLO/cCSMuRewSfgYbG/3vSKLJmfHrO6+PvjZSb9VyV2UaF02ojktW65vw==", "dev": true, "license": "MIT" }, "node_modules/@module-federation/node/node_modules/@module-federation/inject-external-runtime-core-plugin": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@module-federation/inject-external-runtime-core-plugin/-/inject-external-runtime-core-plugin-0.13.0.tgz", - "integrity": "sha512-+V6Dhpqg8N9nqGHqOKDYebaHdJYqaTEFlF2VcrTmNlIcIYuiSLZngEQliebOkMRwUmO2T3eVS5IzzTlL/jfrJw==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/inject-external-runtime-core-plugin/-/inject-external-runtime-core-plugin-0.14.3.tgz", + "integrity": "sha512-OurBx/gDkRPKl9pidefG4EtJeSk8izaj3ZVN/sGGMOXLFeWLK2i0ZSUM/5ogPLj9NPdQC8tTlPalEUsRQ38DoA==", "dev": true, "license": "MIT", "peerDependencies": { - "@module-federation/runtime-tools": "0.13.0" + "@module-federation/runtime-tools": "0.14.3" } }, "node_modules/@module-federation/node/node_modules/@module-federation/managers": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-0.13.0.tgz", - "integrity": "sha512-dpfRjIE4UR4QRP20rENQJs9HfnuWzzsA9W6Eu+r+G+obZnzNIxbONUzg5bCMmhbDsR3krxU6LRrwU1zXnA6bxw==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-0.14.3.tgz", + "integrity": "sha512-uQiLRUvy2yiWm7Xa75y8/He3swW0l2hn8Ef09mvSXhjewwFQMPClQAmZa1UCgNk1F7s/dXDtL9E8vlnX/aZdOQ==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/sdk": "0.13.0", + "@module-federation/sdk": "0.14.3", "find-pkg": "2.0.0", "fs-extra": "9.1.0" } }, "node_modules/@module-federation/node/node_modules/@module-federation/manifest": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@module-federation/manifest/-/manifest-0.13.0.tgz", - "integrity": "sha512-YHJW4qavvfqfpUusz+BlT9snPmbXmiiS5bO5nReFPjfWXT3/9xFA1TvcwpRc+EXNDNKnf5bPF5E/rsaGxSlp7A==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/manifest/-/manifest-0.14.3.tgz", + "integrity": "sha512-GsD4PK7JTDOX8g2NyGhsoejhfyP88h6wCaxW4zAq6X91CE9Yu1R/Ec6QHhp9jfXdQlgkoXz1nQRlkbiU7RNTDA==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/dts-plugin": "0.13.0", - "@module-federation/managers": "0.13.0", - "@module-federation/sdk": "0.13.0", + "@module-federation/dts-plugin": "0.14.3", + "@module-federation/managers": "0.14.3", + "@module-federation/sdk": "0.14.3", "chalk": "3.0.0", "find-pkg": "2.0.0" } }, "node_modules/@module-federation/node/node_modules/@module-federation/rspack": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-0.13.0.tgz", - "integrity": "sha512-hb60x8EdiOXfzJGQLlbv1MDJVjEpQ3ppH0ONIra8CAkGRPGjB+eTwg9nLB6wkcI3xdMjgax509DwbSG+BDmCqw==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-0.14.3.tgz", + "integrity": "sha512-s02E7n9CnR+IMraYwGqfSU2uScENPU+TUd45YteMKxcKOIqNRALtGMn/YT24bbnj+wZ/jhvzr7Rbcx9AkaxKhA==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/bridge-react-webpack-plugin": "0.13.0", - "@module-federation/dts-plugin": "0.13.0", - "@module-federation/inject-external-runtime-core-plugin": "0.13.0", - "@module-federation/managers": "0.13.0", - "@module-federation/manifest": "0.13.0", - "@module-federation/runtime-tools": "0.13.0", - "@module-federation/sdk": "0.13.0", + "@module-federation/bridge-react-webpack-plugin": "0.14.3", + "@module-federation/dts-plugin": "0.14.3", + "@module-federation/inject-external-runtime-core-plugin": "0.14.3", + "@module-federation/managers": "0.14.3", + "@module-federation/manifest": "0.14.3", + "@module-federation/runtime-tools": "0.14.3", + "@module-federation/sdk": "0.14.3", "btoa": "1.2.1" }, "peerDependencies": { @@ -6250,50 +6229,50 @@ } }, "node_modules/@module-federation/node/node_modules/@module-federation/runtime": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.13.0.tgz", - "integrity": "sha512-Ne/3AEVWz6LL6G/i41O5MC6YYlg0SatNNqG/0XbuMAfyGM+llRmB6VKt0o2+JR4isxWuPNp97TbUkkfORit6Eg==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.14.3.tgz", + "integrity": "sha512-7ZHpa3teUDVhraYdxQGkfGHzPbjna4LtwbpudgzAxSLLFxLDNanaxCuSeIgSM9c+8sVUNC9kvzUgJEZB0krPJw==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/error-codes": "0.13.0", - "@module-federation/runtime-core": "0.13.0", - "@module-federation/sdk": "0.13.0" + "@module-federation/error-codes": "0.14.3", + "@module-federation/runtime-core": "0.14.3", + "@module-federation/sdk": "0.14.3" } }, "node_modules/@module-federation/node/node_modules/@module-federation/runtime-core": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.13.0.tgz", - "integrity": "sha512-Oj/1p0mfxZ+8EbU7ND4gMvRmikFpIvPCbblOgat9N8ZIVAKYpTimCgMhzg4yRqAwzlGCVwnnW7XZ8UlA+Zqrvg==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.14.3.tgz", + "integrity": "sha512-xMFQXflLVW/AJTWb4soAFP+LB4XuhE7ryiLIX8oTyUoBBgV6U2OPghnFljPjeXbud72O08NYlQ1qsHw1kN/V8Q==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/error-codes": "0.13.0", - "@module-federation/sdk": "0.13.0" + "@module-federation/error-codes": "0.14.3", + "@module-federation/sdk": "0.14.3" } }, "node_modules/@module-federation/node/node_modules/@module-federation/runtime-tools": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.13.0.tgz", - "integrity": "sha512-6ECWX18yGrQKcmkrQoNPd5VEpxZP1SMaB/Bp55xlpEhsrpn4zHnriQluxDw6xldjSOLl1qbokfxwCwjS2OaEbg==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.14.3.tgz", + "integrity": "sha512-QBETX7iMYXdSa3JtqFlYU+YkpymxETZqyIIRiqg0gW+XGpH3jgU68yjrme2NBJp7URQi/CFZG8KWtfClk0Pjgw==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/runtime": "0.13.0", - "@module-federation/webpack-bundler-runtime": "0.13.0" + "@module-federation/runtime": "0.14.3", + "@module-federation/webpack-bundler-runtime": "0.14.3" } }, "node_modules/@module-federation/node/node_modules/@module-federation/sdk": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.13.0.tgz", - "integrity": "sha512-JdMZaPD+EQvMJYS+/8/8QjaAHQ3qljogvioXBsAuedcStu/msn5e1Fswc0G34kXY9ixs2hUPZU2cAllfSKWIBQ==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.14.3.tgz", + "integrity": "sha512-THJZMfbXpqjQOLblCQ8jjcBFFXsGRJwUWE9l/Q4SmuCSKMgAwie7yLT0qSGrHmyBYrsUjAuy+xNB4nfKP0pnGw==", "dev": true, "license": "MIT" }, "node_modules/@module-federation/node/node_modules/@module-federation/third-party-dts-extractor": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-0.13.0.tgz", - "integrity": "sha512-0sBgo917+AksBjFXrdWOhX58D+wjHR/vXtiCbwFdAGDwLuMs7crMMc4Aay2FJRwPCm1fMGy/4kYvLh5MRhUHRA==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-0.14.3.tgz", + "integrity": "sha512-XAbUoN5hP9iSnrKGikDIy8CloWCKHRIpe+DWOlq8u7uXoRpAPs/a5K7uegxB27dZUNxSFEfqDeHrpQORNnDqPg==", "dev": true, "license": "MIT", "dependencies": { @@ -6303,14 +6282,14 @@ } }, "node_modules/@module-federation/node/node_modules/@module-federation/webpack-bundler-runtime": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.13.0.tgz", - "integrity": "sha512-ycgAsFeCTo+3GR8JxkhCyg2UZm6Au98ISdLTdVXYphO4UDcO/KjqyJen1LXEslkpCEohDj68Prei2fUHRruK6g==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.14.3.tgz", + "integrity": "sha512-hIyJFu34P7bY2NeMIUHAS/mYUHEY71VTAsN0A0AqEJFSVPszheopu9VdXq0VDLrP9KQfuXT8SDxeYeJXyj0mgA==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/runtime": "0.13.0", - "@module-federation/sdk": "0.13.0" + "@module-federation/runtime": "0.14.3", + "@module-federation/sdk": "0.14.3" } }, "node_modules/@module-federation/node/node_modules/chalk": { @@ -6540,39 +6519,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@module-federation/utilities": { - "version": "3.1.53", - "resolved": "https://registry.npmjs.org/@module-federation/utilities/-/utilities-3.1.53.tgz", - "integrity": "sha512-6pM6wf9wJ+qebFSAdz7Mqn+k8XRubdcORp3866fMQhBUGLvNhOJuN2Vfd4/0HsPyKx2snCo2IamQyr9OqG7NRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@module-federation/sdk": "0.13.0" - }, - "peerDependencies": { - "react": "^16 || ^17 || ^18", - "react-dom": "^16 || ^17 || ^18", - "webpack": "^5.40.0" - }, - "peerDependenciesMeta": { - "next": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, - "node_modules/@module-federation/utilities/node_modules/@module-federation/sdk": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.13.0.tgz", - "integrity": "sha512-JdMZaPD+EQvMJYS+/8/8QjaAHQ3qljogvioXBsAuedcStu/msn5e1Fswc0G34kXY9ixs2hUPZU2cAllfSKWIBQ==", - "dev": true, - "license": "MIT" - }, "node_modules/@module-federation/webpack-bundler-runtime": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.9.1.tgz", @@ -7004,12 +6950,12 @@ } }, "node_modules/@nestjs/common": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.1.0.tgz", - "integrity": "sha512-8MrajltjtIN6eW9cTpv+1IZogqz2Zsrc8YDt0LwQPUq8cSq0j50DETdQpPsNMeib+p9avkV41+NrzGk1z2o5Wg==", + "version": "11.1.3", + "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.1.3.tgz", + "integrity": "sha512-ogEK+GriWodIwCw6buQ1rpcH4Kx+G7YQ9EwuPySI3rS05pSdtQ++UhucjusSI9apNidv+QURBztJkRecwwJQXg==", "license": "MIT", "dependencies": { - "file-type": "20.4.1", + "file-type": "21.0.0", "iterare": "1.2.1", "load-esm": "1.0.2", "tslib": "2.8.1", @@ -7020,8 +6966,8 @@ "url": "https://opencollective.com/nest" }, "peerDependencies": { - "class-transformer": "*", - "class-validator": "*", + "class-transformer": ">=0.4.1", + "class-validator": ">=0.13.2", "reflect-metadata": "^0.1.12 || ^0.2.0", "rxjs": "^7.1.0" }, @@ -7050,9 +6996,9 @@ } }, "node_modules/@nestjs/core": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-11.1.0.tgz", - "integrity": "sha512-IeXbTRPrr6xAVbETlDE+miSkNmYf/cPhCa9GU9gFtPO6pVNuAeG/dNrjLVc23mJtUlT/ibdsoW35TlSyHLkzEA==", + "version": "11.1.3", + "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-11.1.3.tgz", + "integrity": "sha512-5lTni0TCh8x7bXETRD57pQFnKnEg1T6M+VLE7wAmyQRIecKQU+2inRGZD+A4v2DC1I04eA0WffP0GKLxjOKlzw==", "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -7136,14 +7082,14 @@ } }, "node_modules/@nestjs/platform-express": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-11.1.0.tgz", - "integrity": "sha512-lxv73GT9VdQaxndciqKcyzLsT2j3gMRX+tO6J06oa7RIfp4Dp4oMTIu57lM1gkIJ+gLGq29bob+mfPv/K8RIuw==", + "version": "11.1.3", + "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-11.1.3.tgz", + "integrity": "sha512-hEDNMlaPiBO72fxxX/CuRQL3MEhKRc/sIYGVoXjrnw6hTxZdezvvM6A95UaLsYknfmcZZa/CdG1SMBZOu9agHQ==", "license": "MIT", "dependencies": { "cors": "2.8.5", "express": "5.1.0", - "multer": "1.4.5-lts.2", + "multer": "2.0.1", "path-to-regexp": "8.2.0", "tslib": "2.8.1" }, @@ -7279,9 +7225,9 @@ } }, "node_modules/@nestjs/testing": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-11.1.0.tgz", - "integrity": "sha512-gQ+NGshkHbNrDNXMVaPiwduqZ8YHpXrnsQqhSsnyNYOcDNPdBbB+0FDq7XiiklluXqjdLAN8i+bS7MbGlZIhKw==", + "version": "11.1.3", + "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-11.1.3.tgz", + "integrity": "sha512-CeXG6/eEqgFIkPkmU00y18Dd3DLOIDFhPItzJK1SWckKo6IhcnfoRJzGx75bmuvUMjb51j6An96S/+MJ2ty9jA==", "dev": true, "license": "MIT", "dependencies": { @@ -7664,20 +7610,20 @@ } }, "node_modules/@nx/angular": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/angular/-/angular-20.8.1.tgz", - "integrity": "sha512-BT6kc2CMwC1RpzdJdl1jbaZa7yCp5sN4BCHj8w+MOCnX6630EcrN6lCi+u5xSVvY2DmemP5I1ZHybSYkYilLLg==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/angular/-/angular-21.1.2.tgz", + "integrity": "sha512-xkHatgZaSBSJ3G+pRbQ025sPtf+brtsqQGLk3YxoICf6S/pYLUIOZwnPn3pVqDQCM4ObOPdA2IMTQnKLClD9aw==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "20.8.1", - "@nx/eslint": "20.8.1", - "@nx/js": "20.8.1", - "@nx/module-federation": "20.8.1", - "@nx/rspack": "20.8.1", - "@nx/web": "20.8.1", - "@nx/webpack": "20.8.1", - "@nx/workspace": "20.8.1", + "@nx/devkit": "21.1.2", + "@nx/eslint": "21.1.2", + "@nx/js": "21.1.2", + "@nx/module-federation": "21.1.2", + "@nx/rspack": "21.1.2", + "@nx/web": "21.1.2", + "@nx/webpack": "21.1.2", + "@nx/workspace": "21.1.2", "@phenomnomnominal/tsquery": "~5.0.1", "@typescript-eslint/type-utils": "^8.0.0", "enquirer": "~2.3.6", @@ -7713,18 +7659,19 @@ } }, "node_modules/@nx/cypress": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/cypress/-/cypress-20.8.1.tgz", - "integrity": "sha512-eVPBZ4R0qgkRxaKPg46OXhA/xQdgVO4zjKoRjKkNX7dDRmq8o2xXHBoU+ZnuNITeFV1fmJ9Cr1qpGMWrHXb2Ew==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/cypress/-/cypress-21.1.2.tgz", + "integrity": "sha512-LnQ5etyx7MV+JtHQiCbilt9R4NQOcq4o8wgJj+Jlb+qU6FMLFEXGtSxFE1vGXNVCM5obsNa226tAh1VaGV7vAA==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "20.8.1", - "@nx/eslint": "20.8.1", - "@nx/js": "20.8.1", + "@nx/devkit": "21.1.2", + "@nx/eslint": "21.1.2", + "@nx/js": "21.1.2", "@phenomnomnominal/tsquery": "~5.0.1", "detect-port": "^1.5.1", "semver": "^7.6.3", + "tree-kill": "1.2.2", "tslib": "^2.3.0" }, "peerDependencies": { @@ -7737,9 +7684,9 @@ } }, "node_modules/@nx/devkit": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-20.8.1.tgz", - "integrity": "sha512-N3nwIg/7RIZeB76iuVo29q+l9WyTtvuBSgDFM2msiIK6Q928ilzoeNPZ/p7w/TE3Gqs5XVhq9ExMvDAOTxdmXA==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-21.1.2.tgz", + "integrity": "sha512-1dgjwSsNDdp/VXydZnSfzfVwySEB3C9yjzeIw6+3+nRvZfH16a7ggZE7MF5sJTq4d+01hAgIDz3KyvGa6Jf73g==", "dev": true, "license": "MIT", "dependencies": { @@ -7753,7 +7700,7 @@ "yargs-parser": "21.1.1" }, "peerDependencies": { - "nx": ">= 19 <= 21" + "nx": "21.1.2" } }, "node_modules/@nx/devkit/node_modules/brace-expansion": { @@ -7783,14 +7730,14 @@ } }, "node_modules/@nx/eslint": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/eslint/-/eslint-20.8.1.tgz", - "integrity": "sha512-eIfNZ4bGdCKAeq7c8dhJ31wW3D422UJaAGl3hT3mJoxW2qbaKDZhgUr5EJqiMAO78vycpnYaLrN1KPEKeFrQZg==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/eslint/-/eslint-21.1.2.tgz", + "integrity": "sha512-Mp8u0RlkhxYtZ47d2ou6t8XIpRy7N/n23OzikqMro4Wt/DK1irGyShSoNIqdGdwalAE5MG1OFXspttXB+y/wOQ==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "20.8.1", - "@nx/js": "20.8.1", + "@nx/devkit": "21.1.2", + "@nx/js": "21.1.2", "semver": "^7.5.3", "tslib": "^2.3.0", "typescript": "~5.7.2" @@ -7806,14 +7753,14 @@ } }, "node_modules/@nx/eslint-plugin": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/eslint-plugin/-/eslint-plugin-20.8.1.tgz", - "integrity": "sha512-AF3oxqflCUL73OjfZUdFOuDnYuAqNiozXJrZCVRxyi/9a+dO/kvukU3x5ObwvnZFamWQIwfsfVzgk/nI0WDwjQ==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/eslint-plugin/-/eslint-plugin-21.1.2.tgz", + "integrity": "sha512-kwhwe6e8dZ0pf5CYPq4OBck15NEJrfuivCEGRTIDZWu3WDYJIw7OvhfyCdGuoZLeHGoCVRjIU6xV5hOzkD9RSw==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "20.8.1", - "@nx/js": "20.8.1", + "@nx/devkit": "21.1.2", + "@nx/js": "21.1.2", "@typescript-eslint/type-utils": "^8.0.0", "@typescript-eslint/utils": "^8.0.0", "chalk": "^4.1.0", @@ -7847,16 +7794,16 @@ } }, "node_modules/@nx/jest": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/jest/-/jest-20.8.1.tgz", - "integrity": "sha512-Cx2cOOWprB2HiggCRg72vl3/evg2fcoANShhnrb+VCTJLHcq87hkwdrAcHwlbENpXwTd4bjlqYJdP1HobdH3FA==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/jest/-/jest-21.1.2.tgz", + "integrity": "sha512-y4VZita9LFb6XajulRIwjMcqHU6/f73C4SNSH6IM5BYmkN68ovICmzTGvoaL7wGTaYrA4Moh/WoKwEwQWKxRPQ==", "dev": true, "license": "MIT", "dependencies": { "@jest/reporters": "^29.4.1", "@jest/test-result": "^29.4.1", - "@nx/devkit": "20.8.1", - "@nx/js": "20.8.1", + "@nx/devkit": "21.1.2", + "@nx/js": "21.1.2", "@phenomnomnominal/tsquery": "~5.0.1", "identity-obj-proxy": "3.0.0", "jest-config": "^29.4.1", @@ -7897,9 +7844,9 @@ } }, "node_modules/@nx/js": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/js/-/js-20.8.1.tgz", - "integrity": "sha512-D3T84PuZggEdraS41S2Frzef2FhebWAHzXcs0IE1ZLInUtwek5P5aTN2d3i/JwYB3mcOyvx8XN3HVADap4KRpg==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/js/-/js-21.1.2.tgz", + "integrity": "sha512-ZF6Zf4Ys+RBvH0GoQHio94C/0N07Px/trAvseMuQ8PKc0tSkXycu/EBc1uAZQvgJThR5o3diAKtIQug77pPYMQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7910,8 +7857,8 @@ "@babel/preset-env": "^7.23.2", "@babel/preset-typescript": "^7.22.5", "@babel/runtime": "^7.22.6", - "@nx/devkit": "20.8.1", - "@nx/workspace": "20.8.1", + "@nx/devkit": "21.1.2", + "@nx/workspace": "21.1.2", "@zkochan/js-yaml": "0.0.7", "babel-plugin-const-enum": "^1.0.1", "babel-plugin-macros": "^3.1.0", @@ -8084,19 +8031,19 @@ } }, "node_modules/@nx/module-federation": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/module-federation/-/module-federation-20.8.1.tgz", - "integrity": "sha512-El+qAxP/jqVxgkir43ZN6pwki+FrhtSEcfdk1G8f+cU1DCmZgbKlDYjDjZ/e7SdXkjtJran5fPg7sfLEUyoFew==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/module-federation/-/module-federation-21.1.2.tgz", + "integrity": "sha512-19aodN8uh3fEI2ifXYDXTV4hpQMk5Ko3UAFW+x0dQwlzSUIObt2mBMHL0PIkFXlT1fyz/rH+tkx67/DAAUxVZw==", "dev": true, "license": "MIT", "dependencies": { "@module-federation/enhanced": "^0.9.0", "@module-federation/node": "^2.6.26", "@module-federation/sdk": "^0.9.0", - "@nx/devkit": "20.8.1", - "@nx/js": "20.8.1", - "@nx/web": "20.8.1", - "@rspack/core": "^1.1.5", + "@nx/devkit": "21.1.2", + "@nx/js": "21.1.2", + "@nx/web": "21.1.2", + "@rspack/core": "^1.3.8", "express": "^4.21.2", "http-proxy-middleware": "^3.0.3", "picocolors": "^1.1.0", @@ -8104,38 +8051,6 @@ "webpack": "^5.88.0" } }, - "node_modules/@nx/module-federation/node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@nx/module-federation/node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, "node_modules/@nx/module-federation/node_modules/cookie": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", @@ -8210,25 +8125,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/@nx/module-federation/node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/@nx/module-federation/node_modules/merge-descriptors": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", @@ -8246,57 +8142,18 @@ "dev": true, "license": "MIT" }, - "node_modules/@nx/module-federation/node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@nx/module-federation/node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@nx/module-federation/node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/@nx/nest": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/nest/-/nest-20.8.1.tgz", - "integrity": "sha512-B7DBXrIXw/NBqhLltZpZ6An3P/W3x61aw/fZgvugkwLwZx3rlX+XnWCmyNx37U2jna0tYaUkf6tnzebiQOtbMQ==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/nest/-/nest-21.1.2.tgz", + "integrity": "sha512-TEiePYfxGB8dWEU8MOHZCUDpyNcxKTCh4Aj9f2zxfvYBqKMmsqpZRvWKXo6OL6IPdCqyqXtPNqoZyv9XbFakKQ==", "dev": true, "license": "MIT", "dependencies": { "@nestjs/schematics": "^9.1.0", - "@nx/devkit": "20.8.1", - "@nx/eslint": "20.8.1", - "@nx/js": "20.8.1", - "@nx/node": "20.8.1", + "@nx/devkit": "21.1.2", + "@nx/eslint": "21.1.2", + "@nx/js": "21.1.2", + "@nx/node": "21.1.2", "tslib": "^2.3.0" } }, @@ -8490,23 +8347,25 @@ } }, "node_modules/@nx/node": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/node/-/node-20.8.1.tgz", - "integrity": "sha512-ffZ8ePEWj2g2OTZWalX1xZBgvTHhoirs5NEkcYxgUya3/DohG4Css3FV9gzVFfKkQdP++bUMkG8GJ2LrtqzUxA==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/node/-/node-21.1.2.tgz", + "integrity": "sha512-BCKooOKT04MJDzLy6U4w3mFWhHCsuoMXqUjcd5g/3zf4bFXOK3ooklvVkxjHUQxRXVG/uPJ+ZcgTC1SE0vpS6g==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "20.8.1", - "@nx/eslint": "20.8.1", - "@nx/jest": "20.8.1", - "@nx/js": "20.8.1", + "@nx/devkit": "21.1.2", + "@nx/eslint": "21.1.2", + "@nx/jest": "21.1.2", + "@nx/js": "21.1.2", + "kill-port": "^1.6.1", + "tcp-port-used": "^1.0.2", "tslib": "^2.3.0" } }, "node_modules/@nx/nx-darwin-arm64": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-20.8.1.tgz", - "integrity": "sha512-Gat4Io66cV70Oa1CjrMJPsEx5ICpAGayv9hejOtBUEDb6XjR12L2e4wV+4EHliF0UbEcuZAr8/lTROEPk0RGWQ==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-21.1.2.tgz", + "integrity": "sha512-9dO32jd+h7SrvQafJph6b7Bsmp2IotTE0w7dAGb4MGBQni3JWCXaxlMMpWUZXWW1pM5uIkFJO5AASW4UOI7w2w==", "cpu": [ "arm64" ], @@ -8515,15 +8374,12 @@ "optional": true, "os": [ "darwin" - ], - "engines": { - "node": ">= 10" - } + ] }, "node_modules/@nx/nx-darwin-x64": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-20.8.1.tgz", - "integrity": "sha512-TB9mZk7neGFKgBr2wSBgY6c4kFF9vvChNSp3TrEeXR3FppFcYG5eK4AaKfzWCpYb0wMtseAm7NMX1Lu74utClQ==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-21.1.2.tgz", + "integrity": "sha512-5sf+4PRVg9pDVgD53NE1hoPz4lC8Ni34UovQsOrZgDvwU5mqPbIhTzVYRDH86i/086AcCvjT5tEt7rEcuRwlKw==", "cpu": [ "x64" ], @@ -8532,15 +8388,12 @@ "optional": true, "os": [ "darwin" - ], - "engines": { - "node": ">= 10" - } + ] }, "node_modules/@nx/nx-freebsd-x64": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-20.8.1.tgz", - "integrity": "sha512-7UQu0/Afna5Af2GagEQ6rbKfUh75NfUn+g66wsoQoUGBvDW0U7B8P3Ph5Bk4Urub0BSfMVcNg2X7CgfypLFN/g==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-21.1.2.tgz", + "integrity": "sha512-E5HR44fimXlQuAgn/tP9esmvxbzt/92AIl0PBT6L3Juh/xYiXKWhda63H4+UNT8AcLRxVXwfZrGPuGCDs+7y/Q==", "cpu": [ "x64" ], @@ -8549,15 +8402,12 @@ "optional": true, "os": [ "freebsd" - ], - "engines": { - "node": ">= 10" - } + ] }, "node_modules/@nx/nx-linux-arm-gnueabihf": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-20.8.1.tgz", - "integrity": "sha512-Tjh8JkTP+x1jSrzx+ofx1pKpkhIbXd7bi0bPdpYt6NI1lZz2HB/dv8vtdzP80jXEDztHf0AeGnEJVgJKsgI6yg==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-21.1.2.tgz", + "integrity": "sha512-V4n6DE+r12gwJHFjZs+e2GmWYZdhpgA2DYWbsYWRYb1XQCNUg4vPzt+YFzWZ+K2o91k93EBnlLfrag7CqxUslw==", "cpu": [ "arm" ], @@ -8566,15 +8416,12 @@ "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">= 10" - } + ] }, "node_modules/@nx/nx-linux-arm64-gnu": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-20.8.1.tgz", - "integrity": "sha512-2+qPIwav2vrytH6pe7fukBe8+yN5JGbEDCnDO8wKQsHeeZMLAQJiZ7EJH/+vynRkI7oWf87mihIKNQME19+w6A==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-21.1.2.tgz", + "integrity": "sha512-NFhsp27O+mS3r7PWLmJgyZy42WQ72c2pTQSpYfhaBbZPTI5DqBHdANa0sEPmV+ON24qkl5CZKvsmhzjsNmyW6A==", "cpu": [ "arm64" ], @@ -8583,15 +8430,12 @@ "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">= 10" - } + ] }, "node_modules/@nx/nx-linux-arm64-musl": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-20.8.1.tgz", - "integrity": "sha512-DsKc+DiMsuHqpBWchUUUg6zv4OaexRqpFXys6auZlrpFpn80kSqLQ3S4zZ5AUu+26wxZqEVJs+uxHGwFbhEssQ==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-21.1.2.tgz", + "integrity": "sha512-BgS9npARwcnw+hoaRsbas6vdBAJRBAj5qSeL57LO8Dva+e/6PYqoNyVJ0BgJ98xPXDpzM/NnpeRsndQGpLyhDw==", "cpu": [ "arm64" ], @@ -8600,15 +8444,12 @@ "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">= 10" - } + ] }, "node_modules/@nx/nx-linux-x64-gnu": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-20.8.1.tgz", - "integrity": "sha512-Kzru44beVKAmSG84ShuMIIfyu2Uu5r8gsHdtiQPBIOGkZa0Z/e6YtUxcN3w1UZ7yvvzoQ4pQLvqU6UZRSWZtEg==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-21.1.2.tgz", + "integrity": "sha512-tjBINbymQgxnIlNK/m6B0P5eiGRSHSYPNkFdh3+sra80AP/ymHGLRxxZy702Ga2xg8RVr9zEvuXYHI+QBa1YmA==", "cpu": [ "x64" ], @@ -8617,15 +8458,12 @@ "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">= 10" - } + ] }, "node_modules/@nx/nx-linux-x64-musl": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-20.8.1.tgz", - "integrity": "sha512-cSVVb7DVMhrxCaj/n55okBZS6lZoP5a5vynOBGIV4z3/OJLev+xI9A+3imn/aXnBl8iS69HogYyrW0YTXv4Xaw==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-21.1.2.tgz", + "integrity": "sha512-+0V0YAOWMh1wvpQZuayQ7y+sj2MhE3l7z0JMD9SX/4xv9zLOWGv+EiUmN/fGoU/mwsSkH2wTCo6G6quKF1E8jQ==", "cpu": [ "x64" ], @@ -8634,15 +8472,12 @@ "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">= 10" - } + ] }, "node_modules/@nx/nx-win32-arm64-msvc": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-20.8.1.tgz", - "integrity": "sha512-gte5HcvI24CN6b9I6IYTXh/A0CtRfnlAFaJomPpfT8Wcq637aOZzS0arAEZVoU8QZty1350hj6sfu+wSIjoP7A==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-21.1.2.tgz", + "integrity": "sha512-E+ECMQIMJ6R47BMW5YpDyOhTqczvFaL8k24umRkcvlRh3SraczyxBVPkYHDukDp7tCeIszc5EvdWc83C3W8U4w==", "cpu": [ "arm64" ], @@ -8651,15 +8486,12 @@ "optional": true, "os": [ "win32" - ], - "engines": { - "node": ">= 10" - } + ] }, "node_modules/@nx/nx-win32-x64-msvc": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-20.8.1.tgz", - "integrity": "sha512-6c2fVEPdPwJdnRbckBatRDF/g6JAp6p3Mfl90DpuaEF2DZC5pmCXKOsXE0aSIZ+gODom2JIchM++2KmDZPJUoA==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-21.1.2.tgz", + "integrity": "sha512-J9rNTBOS7Ld6CybU/cou1Fg52AHSYsiwpZISM2RNM0XIoVSDk3Jsvh4OJgS2rvV0Sp/cgDg3ieOMAreekH+TKw==", "cpu": [ "x64" ], @@ -8668,25 +8500,22 @@ "optional": true, "os": [ "win32" - ], - "engines": { - "node": ">= 10" - } + ] }, "node_modules/@nx/rspack": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/rspack/-/rspack-20.8.1.tgz", - "integrity": "sha512-R7+tkwLD+4KYn22r+c4grKfnB4ghxyH2lXUYgmxu7lg/pJsxiy0/Xn7rTHnzI4izTeap2LK9m1F5ZLC3oeJQ6Q==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/rspack/-/rspack-21.1.2.tgz", + "integrity": "sha512-CJBD4e/TXrZyKesAZ7Su8wHuRnBo07ZRpYXgUTEBILeOFiSvnU2630cq47CuyjFFPpWTJ78VOOPnA27G46sHcg==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "20.8.1", - "@nx/js": "20.8.1", - "@nx/module-federation": "20.8.1", - "@nx/web": "20.8.1", + "@nx/devkit": "21.1.2", + "@nx/js": "21.1.2", + "@nx/module-federation": "21.1.2", + "@nx/web": "21.1.2", "@phenomnomnominal/tsquery": "~5.0.1", - "@rspack/core": "^1.1.5", - "@rspack/dev-server": "^1.0.9", + "@rspack/core": "^1.3.8", + "@rspack/dev-server": "^1.1.1", "@rspack/plugin-react-refresh": "^1.0.0", "autoprefixer": "^10.4.9", "browserslist": "^4.21.4", @@ -8697,6 +8526,7 @@ "less-loader": "11.1.0", "license-webpack-plugin": "^4.0.2", "loader-utils": "^2.0.3", + "parse5": "4.0.0", "picocolors": "^1.1.0", "postcss": "^8.4.38", "postcss-import": "~14.1.0", @@ -8716,13 +8546,6 @@ "@module-federation/node": "^2.6.26" } }, - "node_modules/@nx/rspack/node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true, - "license": "MIT" - }, "node_modules/@nx/rspack/node_modules/big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -8733,31 +8556,6 @@ "node": "*" } }, - "node_modules/@nx/rspack/node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, "node_modules/@nx/rspack/node_modules/cookie": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", @@ -8868,25 +8666,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/@nx/rspack/node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/@nx/rspack/node_modules/less-loader": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.0.tgz", @@ -8940,70 +8719,38 @@ "dev": true, "license": "MIT" }, - "node_modules/@nx/rspack/node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "node_modules/@nx/rspack/node_modules/parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", "dev": true, "license": "MIT" }, - "node_modules/@nx/rspack/node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@nx/rspack/node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/@nx/storybook": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/storybook/-/storybook-20.8.1.tgz", - "integrity": "sha512-SlneVKhePyoG30s3LHFIWU1ZjoeekCQFZ9IktseElHwOxb83wcXXV/61tKCphur3htZEZ7EL226RzMXQYPIknA==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/storybook/-/storybook-21.1.2.tgz", + "integrity": "sha512-X/5zT+5uovvZneGR1FS8gh5+4ySlazWb2ra9Ifjn5nFBLFpJ84vnPrWyh/ANMgI4MAAV6seMQwmlwuS2xjcoWw==", "dev": true, "license": "MIT", "dependencies": { - "@nx/cypress": "20.8.1", - "@nx/devkit": "20.8.1", - "@nx/eslint": "20.8.1", - "@nx/js": "20.8.1", + "@nx/cypress": "21.1.2", + "@nx/devkit": "21.1.2", + "@nx/eslint": "21.1.2", + "@nx/js": "21.1.2", "@phenomnomnominal/tsquery": "~5.0.1", "semver": "^7.5.3", "tslib": "^2.3.0" } }, "node_modules/@nx/web": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/web/-/web-20.8.1.tgz", - "integrity": "sha512-sZjL5vLkL3IDBGJwPlZG9PP7hDe/PjnQkVji0VmaFRRhiEQqxyfbNy6k9f5BWvc3tj3IITDofLcVvmTFMSHisw==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/web/-/web-21.1.2.tgz", + "integrity": "sha512-ONw3bEO6rc9DqM9Jnt6Rc5xkSBMzruWA2KvHVlU4qaoUs1VKbnmJ28dM72lFMn8wbOOeq+RG7GC2nBpifBPLHw==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "20.8.1", - "@nx/js": "20.8.1", + "@nx/devkit": "21.1.2", + "@nx/js": "21.1.2", "detect-port": "^1.5.1", "http-server": "^14.1.0", "picocolors": "^1.1.0", @@ -9011,15 +8758,15 @@ } }, "node_modules/@nx/webpack": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/webpack/-/webpack-20.8.1.tgz", - "integrity": "sha512-Xz1badU23VvRl6ij20D5eTndBsPGxOUC67h7gQfmLqnsUxf9R6NgOnMxt2Y42QWRx5jXxuQf1AbJ/0N+z2fi8A==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/webpack/-/webpack-21.1.2.tgz", + "integrity": "sha512-MtTXjxT8HB47uaMi4Hw6VGnyycQ5gm7Trazk4Fq7mr4ReIrP0vp1BGnNgho2d1dFONY0eA6MeBf9j/5jOI+MBA==", "dev": true, "license": "MIT", "dependencies": { "@babel/core": "^7.23.2", - "@nx/devkit": "20.8.1", - "@nx/js": "20.8.1", + "@nx/devkit": "21.1.2", + "@nx/js": "21.1.2", "@phenomnomnominal/tsquery": "~5.0.1", "ajv": "^8.12.0", "autoprefixer": "^10.4.9", @@ -9070,13 +8817,6 @@ "@types/send": "*" } }, - "node_modules/@nx/webpack/node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true, - "license": "MIT" - }, "node_modules/@nx/webpack/node_modules/big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -9087,31 +8827,6 @@ "node": "*" } }, - "node_modules/@nx/webpack/node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, "node_modules/@nx/webpack/node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -9285,25 +9000,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/@nx/webpack/node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/@nx/webpack/node_modules/globby": { "version": "12.2.0", "resolved": "https://registry.npmjs.org/globby/-/globby-12.2.0.tgz", @@ -9493,13 +9189,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@nx/webpack/node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "dev": true, - "license": "MIT" - }, "node_modules/@nx/webpack/node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -9547,22 +9236,6 @@ "webpack": "^5.0.0" } }, - "node_modules/@nx/webpack/node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/@nx/webpack/node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -9576,22 +9249,6 @@ "node": ">=8.10.0" } }, - "node_modules/@nx/webpack/node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/@nx/webpack/node_modules/slash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", @@ -9675,17 +9332,17 @@ } }, "node_modules/@nx/workspace": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-20.8.1.tgz", - "integrity": "sha512-Y6HlERFJbLHn1J9JHMsPDSRK5iBSH4hbw9TkqwkINeHBDX8bIilnO3tK6VVMIPTzTHJldxI+zQ1IrzVisZpJsA==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-21.1.2.tgz", + "integrity": "sha512-I4e/X/GN0Vx3FDZv/7bFYmXfOPmcMI3cDO/rg+TqudsuxVM7tJ7+8jtwdpU4I2IEpI6oU9FZ7Fu9R2uNqL5rrQ==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "20.8.1", + "@nx/devkit": "21.1.2", "@zkochan/js-yaml": "0.0.7", "chalk": "^4.1.0", "enquirer": "~2.3.6", - "nx": "20.8.1", + "nx": "21.1.2", "picomatch": "4.0.2", "tslib": "^2.3.0", "yargs-parser": "21.1.1" @@ -10218,19 +9875,10 @@ "@prisma/debug": "6.8.2" } }, - "node_modules/@redis/bloom": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.2.0.tgz", - "integrity": "sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==", - "license": "MIT", - "peerDependencies": { - "@redis/client": "^1.0.0" - } - }, "node_modules/@redis/client": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.6.0.tgz", - "integrity": "sha512-aR0uffYI700OEEH4gYnitAnv3vzVGXCFvYfdpu/CJKvk4pHfLPEy/JSZyrpQ+15WhXe1yJRXLtfQ84s4mEXnPg==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.6.1.tgz", + "integrity": "sha512-/KCsg3xSlR+nCK8/8ZYSknYxvXHwubJrU82F3Lm1Fp6789VQ0/3RJKfsmRXjqfaTA++23CvC3hqmqe/2GEt6Kw==", "license": "MIT", "dependencies": { "cluster-key-slot": "1.1.2", @@ -10241,42 +9889,6 @@ "node": ">=14" } }, - "node_modules/@redis/graph": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.1.tgz", - "integrity": "sha512-FEMTcTHZozZciLRl6GiiIB4zGm5z5F3F6a6FZCyrfxdKOhFlGkiAqlexWMBzCi4DcRoyiOsuLfW+cjlGWyExOw==", - "license": "MIT", - "peerDependencies": { - "@redis/client": "^1.0.0" - } - }, - "node_modules/@redis/json": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.7.tgz", - "integrity": "sha512-6UyXfjVaTBTJtKNG4/9Z8PSpKE6XgSyEb8iwaqDcy+uKrd/DGYHTWkUdnQDyzm727V7p21WUMhsqz5oy65kPcQ==", - "license": "MIT", - "peerDependencies": { - "@redis/client": "^1.0.0" - } - }, - "node_modules/@redis/search": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.2.0.tgz", - "integrity": "sha512-tYoDBbtqOVigEDMAcTGsRlMycIIjwMCgD8eR2t0NANeQmgK/lvxNAvYyb6bZDD4frHRhIHkJu2TBRvB0ERkOmw==", - "license": "MIT", - "peerDependencies": { - "@redis/client": "^1.0.0" - } - }, - "node_modules/@redis/time-series": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.1.0.tgz", - "integrity": "sha512-c1Q99M5ljsIuc4YdaCwfUEXsofakb9c8+Zse2qxTadu8TalLXuAESzLvFAvNVbkmSlvlzIQOLpBCmWI9wTOt+g==", - "license": "MIT", - "peerDependencies": { - "@redis/client": "^1.0.0" - } - }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.34.8", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.8.tgz", @@ -10447,9 +10059,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.2.tgz", - "integrity": "sha512-5W6vNYkhgfh7URiXTO1E9a0cy4fSgfE4+Hl5agb/U1sa0kjOLMLC1wObxwKxecE17j0URxuTrYZZME4/VH57Hg==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.41.1.tgz", + "integrity": "sha512-LdIUOb3gvfmpkgFZuccNa2uYiqtgZAz3PTzjuM5bH3nvuy9ty6RGc/Q0+HDFrHrizJGVpjnTZ1yS5TNNjFlklw==", "cpu": [ "riscv64" ], @@ -10539,27 +10151,27 @@ ] }, "node_modules/@rspack/binding": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.2.8.tgz", - "integrity": "sha512-T3FMB3N9P1AbSAryfkSRJkPtmeSYs/Gj9zUZoPz1ckPEIcWZmpUOQbJylldjbw5waxtCL1haHNbi0pcSvxiaJw==", + "version": "1.3.13", + "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.3.13.tgz", + "integrity": "sha512-BdM6tfLCP7/0H5uGc+okG6AYsU9JEnR5bRHq4YuGaS4tb+N5ct0czm0LprGMZ7zRAnIql/zoLn/bHlheNxZw3g==", "devOptional": true, "license": "MIT", "optionalDependencies": { - "@rspack/binding-darwin-arm64": "1.2.8", - "@rspack/binding-darwin-x64": "1.2.8", - "@rspack/binding-linux-arm64-gnu": "1.2.8", - "@rspack/binding-linux-arm64-musl": "1.2.8", - "@rspack/binding-linux-x64-gnu": "1.2.8", - "@rspack/binding-linux-x64-musl": "1.2.8", - "@rspack/binding-win32-arm64-msvc": "1.2.8", - "@rspack/binding-win32-ia32-msvc": "1.2.8", - "@rspack/binding-win32-x64-msvc": "1.2.8" + "@rspack/binding-darwin-arm64": "1.3.13", + "@rspack/binding-darwin-x64": "1.3.13", + "@rspack/binding-linux-arm64-gnu": "1.3.13", + "@rspack/binding-linux-arm64-musl": "1.3.13", + "@rspack/binding-linux-x64-gnu": "1.3.13", + "@rspack/binding-linux-x64-musl": "1.3.13", + "@rspack/binding-win32-arm64-msvc": "1.3.13", + "@rspack/binding-win32-ia32-msvc": "1.3.13", + "@rspack/binding-win32-x64-msvc": "1.3.13" } }, "node_modules/@rspack/binding-darwin-arm64": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.2.8.tgz", - "integrity": "sha512-bDlrlroY3iMlzna/3i1gD6eRmhJW2zRyC3Ov6aR1micshVQ9RteigYZWkjZuQfyC5Z8dCcLUQJVojz+pqp0JXg==", + "version": "1.3.13", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.3.13.tgz", + "integrity": "sha512-1c+KC+TFaKRWu+SO4cJZ5oHKOFuDhTIitbSIG9boJpDRoZmJxHDmFyTTxVI2r2QUjxJaDdUlSFepybhhJ3UiPg==", "cpu": [ "arm64" ], @@ -10571,9 +10183,9 @@ ] }, "node_modules/@rspack/binding-darwin-x64": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.2.8.tgz", - "integrity": "sha512-0/qOVbMuzZ+WbtDa4TbH46R4vph/W6MHcXbrXDO+vpdTMFDVJ64DnZXT7aqvGcY+7vTCIGm0GT+6ooR4KaIX8A==", + "version": "1.3.13", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.3.13.tgz", + "integrity": "sha512-YBF+XjoGSjhJ5o/xOaCBd39BntMudMeup11j2Dz+rrTH+wG6TvH017HYIgDMT3UBVv66eNsQpzA0ZW5raJ0lbA==", "cpu": [ "x64" ], @@ -10585,9 +10197,9 @@ ] }, "node_modules/@rspack/binding-linux-arm64-gnu": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.8.tgz", - "integrity": "sha512-En/SMl45s19iUVb1/ZDFQvFDxIjnlfk7yqV3drMWWAL5HSgksNejaTIFTO52aoohIBbmwuk5wSGcbU0G0IFiPg==", + "version": "1.3.13", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.3.13.tgz", + "integrity": "sha512-II71Ez7Z0/5ZpcK+kCgvXFKK0AysS9La8LNQbqf2wmzxDJi5H8eVUiwkM5BabICxzOWYtTGJLZ89QbCYaFbqCg==", "cpu": [ "arm64" ], @@ -10599,9 +10211,9 @@ ] }, "node_modules/@rspack/binding-linux-arm64-musl": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.8.tgz", - "integrity": "sha512-N1oZsXfJ9VLLcK7p1PS65cxLYQCZ7iqHW2OP6Ew2+hlz/d1hzngxgzrtZMCXFOHXDvTzVu5ff6jGS2v7+zv2tA==", + "version": "1.3.13", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.3.13.tgz", + "integrity": "sha512-JFFhqglKVjlWcmmVwdS80Kw6v35yY9xlQJup09mL8gMtiiFiT36wTyTujz15Iv+2+S/Dv0Z+UeUJ99KRbQxgcQ==", "cpu": [ "arm64" ], @@ -10613,9 +10225,9 @@ ] }, "node_modules/@rspack/binding-linux-x64-gnu": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.8.tgz", - "integrity": "sha512-BdPaepoLKuaVwip4QK/nGqNi1xpbCWSxiycPbKRrGqKgt/QGihxxFgiqr4EpWQVIJNIMy4nCsg4arO0+H1KWGQ==", + "version": "1.3.13", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.3.13.tgz", + "integrity": "sha512-ogm4rt+PMQHkMg/0mA9VTjfGE3c+YaHZQT8KrFgTsoj2YCW9WO2J/RjdMc6STG4Y10BWO9Ar2azLxxHrKb+8UQ==", "cpu": [ "x64" ], @@ -10627,9 +10239,9 @@ ] }, "node_modules/@rspack/binding-linux-x64-musl": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.8.tgz", - "integrity": "sha512-GFv0Bod268OcXIcjeLoPlK0oz8rClEIxIRFkz+ejhbvfCwRJ+Fd+EKaaKQTBfZQujPqc0h2GctIF25nN5pFTmA==", + "version": "1.3.13", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.3.13.tgz", + "integrity": "sha512-8icDyXhg1iMKhQ3X2FTgAGQTQqnli9FyqHCuRIBauxy1V4W478Mp9Y+V+ErVUY1YxbZEUrkt3a59hssjGeDEeg==", "cpu": [ "x64" ], @@ -10641,9 +10253,9 @@ ] }, "node_modules/@rspack/binding-win32-arm64-msvc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.8.tgz", - "integrity": "sha512-aEU+uJdbvJJGrzzAsjbjrPeNbG/bcG8JoXK2kSsUB+/sWHTIkHX0AQ3oX3aV/lcLKgZWrUxLAfLoCXEnIHMEyQ==", + "version": "1.3.13", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.3.13.tgz", + "integrity": "sha512-y5XxwxDW4DrPKy+8P6t7I7IbA7B/iXjLoaS0jP/EwjSHWf/EnZzq9MgWqdop1km8Mwx6s1zcj+0qs73jL2N98w==", "cpu": [ "arm64" ], @@ -10655,9 +10267,9 @@ ] }, "node_modules/@rspack/binding-win32-ia32-msvc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.2.8.tgz", - "integrity": "sha512-GHYzNOSoiLyG9elLTmMqADJMQzjll+co4irp5AgZ+KHG9EVq0qEHxDqDIJxZnUA15U8JDvCgo6YAo3T0BFEL0Q==", + "version": "1.3.13", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.3.13.tgz", + "integrity": "sha512-n24sznsZe3lC8ok6MgsT1nG4lVx3SQ/lZ0g23i2BGMRN8/p+kaC2eoPaHe/4m9Liz/W4Z5LhZCCvg4DQMEzeLA==", "cpu": [ "ia32" ], @@ -10669,9 +10281,9 @@ ] }, "node_modules/@rspack/binding-win32-x64-msvc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.8.tgz", - "integrity": "sha512-EigKLhKLH1kfv1e/ZgXuSKlIjkbyneJtiLbNDz7EeEVFGV1XMM6bsCea1sb2WOxsPYiOX4Q5JmR1j1KGrZS/LA==", + "version": "1.3.13", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.3.13.tgz", + "integrity": "sha512-CLyTNo0OrOD7xFKusFciKKG+8CXPowjPz+tcdkkrKYqGzAPzOcszblikITJhMbc7DLMzdTRSZUTkKLRydYH9sw==", "cpu": [ "x64" ], @@ -10683,16 +10295,15 @@ ] }, "node_modules/@rspack/core": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.2.8.tgz", - "integrity": "sha512-ppj3uQQtkhgrYDLrUqb33YbpNEZCpAudpfVuOHGsvUrAnu1PijbfJJymoA5ZvUhM+HNMvPI5D1ie97TXyb0UVg==", + "version": "1.3.13", + "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.3.13.tgz", + "integrity": "sha512-j9jsNzKeEN14yraqX4jAFrM/nMfX5YEPgEMPlp4g5NAu3siaBa8gDF5brbdNq6TDXnTHK1MwwjaMdKA+3YeBKQ==", "devOptional": true, "license": "MIT", "dependencies": { - "@module-federation/runtime-tools": "0.8.4", - "@rspack/binding": "1.2.8", - "@rspack/lite-tapable": "1.0.1", - "caniuse-lite": "^1.0.30001702" + "@module-federation/runtime-tools": "0.14.3", + "@rspack/binding": "1.3.13", + "@rspack/lite-tapable": "1.0.1" }, "engines": { "node": ">=16.0.0" @@ -10707,68 +10318,74 @@ } }, "node_modules/@rspack/core/node_modules/@module-federation/error-codes": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.8.4.tgz", - "integrity": "sha512-55LYmrDdKb4jt+qr8qE8U3al62ZANp3FhfVaNPOaAmdTh0jHdD8M3yf5HKFlr5xVkVO4eV/F/J2NCfpbh+pEXQ==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.14.3.tgz", + "integrity": "sha512-sBJ3XKU9g5Up31jFeXPFsD8AgORV7TLO/cCSMuRewSfgYbG/3vSKLJmfHrO6+PvjZSb9VyV2UaF02ojktW65vw==", "devOptional": true, "license": "MIT" }, "node_modules/@rspack/core/node_modules/@module-federation/runtime": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.8.4.tgz", - "integrity": "sha512-yZeZ7z2Rx4gv/0E97oLTF3V6N25vglmwXGgoeju/W2YjsFvWzVtCDI7zRRb0mJhU6+jmSM8jP1DeQGbea/AiZQ==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.14.3.tgz", + "integrity": "sha512-7ZHpa3teUDVhraYdxQGkfGHzPbjna4LtwbpudgzAxSLLFxLDNanaxCuSeIgSM9c+8sVUNC9kvzUgJEZB0krPJw==", "devOptional": true, "license": "MIT", "dependencies": { - "@module-federation/error-codes": "0.8.4", - "@module-federation/sdk": "0.8.4" + "@module-federation/error-codes": "0.14.3", + "@module-federation/runtime-core": "0.14.3", + "@module-federation/sdk": "0.14.3" } }, - "node_modules/@rspack/core/node_modules/@module-federation/runtime-tools": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.8.4.tgz", - "integrity": "sha512-fjVOsItJ1u5YY6E9FnS56UDwZgqEQUrWFnouRiPtK123LUuqUI9FH4redZoKWlE1PB0ir1Z3tnqy8eFYzPO38Q==", + "node_modules/@rspack/core/node_modules/@module-federation/runtime-core": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.14.3.tgz", + "integrity": "sha512-xMFQXflLVW/AJTWb4soAFP+LB4XuhE7ryiLIX8oTyUoBBgV6U2OPghnFljPjeXbud72O08NYlQ1qsHw1kN/V8Q==", "devOptional": true, "license": "MIT", "dependencies": { - "@module-federation/runtime": "0.8.4", - "@module-federation/webpack-bundler-runtime": "0.8.4" + "@module-federation/error-codes": "0.14.3", + "@module-federation/sdk": "0.14.3" } }, - "node_modules/@rspack/core/node_modules/@module-federation/sdk": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.8.4.tgz", - "integrity": "sha512-waABomIjg/5m1rPDBWYG4KUhS5r7OUUY7S+avpaVIY/tkPWB3ibRDKy2dNLLAMaLKq0u+B1qIdEp4NIWkqhqpg==", + "node_modules/@rspack/core/node_modules/@module-federation/runtime-tools": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.14.3.tgz", + "integrity": "sha512-QBETX7iMYXdSa3JtqFlYU+YkpymxETZqyIIRiqg0gW+XGpH3jgU68yjrme2NBJp7URQi/CFZG8KWtfClk0Pjgw==", "devOptional": true, "license": "MIT", "dependencies": { - "isomorphic-rslog": "0.0.6" + "@module-federation/runtime": "0.14.3", + "@module-federation/webpack-bundler-runtime": "0.14.3" } }, + "node_modules/@rspack/core/node_modules/@module-federation/sdk": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.14.3.tgz", + "integrity": "sha512-THJZMfbXpqjQOLblCQ8jjcBFFXsGRJwUWE9l/Q4SmuCSKMgAwie7yLT0qSGrHmyBYrsUjAuy+xNB4nfKP0pnGw==", + "devOptional": true, + "license": "MIT" + }, "node_modules/@rspack/core/node_modules/@module-federation/webpack-bundler-runtime": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.8.4.tgz", - "integrity": "sha512-HggROJhvHPUX7uqBD/XlajGygMNM1DG0+4OAkk8MBQe4a18QzrRNzZt6XQbRTSG4OaEoyRWhQHvYD3Yps405tQ==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.14.3.tgz", + "integrity": "sha512-hIyJFu34P7bY2NeMIUHAS/mYUHEY71VTAsN0A0AqEJFSVPszheopu9VdXq0VDLrP9KQfuXT8SDxeYeJXyj0mgA==", "devOptional": true, "license": "MIT", "dependencies": { - "@module-federation/runtime": "0.8.4", - "@module-federation/sdk": "0.8.4" + "@module-federation/runtime": "0.14.3", + "@module-federation/sdk": "0.14.3" } }, "node_modules/@rspack/dev-server": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@rspack/dev-server/-/dev-server-1.1.1.tgz", - "integrity": "sha512-9r7vOml2SrFA8cvbcJdSan9wHEo1TPXezF22+s5jvdyAAywg8w7HqDol6TPVv64NUonP1DOdyLxZ+6UW6WZiwg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rspack/dev-server/-/dev-server-1.1.2.tgz", + "integrity": "sha512-YNzXxWn6DV3X9yeJZ9bqX77wuhm2ko3sGavilBGi1MWuNihhWfhh9dlbipudPyoiwLl0lbioxA/hevosr+ajLg==", "dev": true, "license": "MIT", "dependencies": { "chokidar": "^3.6.0", - "express": "^4.21.2", "http-proxy-middleware": "^2.0.7", - "mime-types": "^2.1.35", "p-retry": "^6.2.0", - "webpack-dev-middleware": "^7.4.2", "webpack-dev-server": "5.2.0", "ws": "^8.18.0" }, @@ -10779,38 +10396,6 @@ "@rspack/core": "*" } }, - "node_modules/@rspack/dev-server/node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rspack/dev-server/node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, "node_modules/@rspack/dev-server/node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -10836,99 +10421,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/@rspack/dev-server/node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@rspack/dev-server/node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rspack/dev-server/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/@rspack/dev-server/node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@rspack/dev-server/node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/@rspack/dev-server/node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -10967,30 +10459,6 @@ } } }, - "node_modules/@rspack/dev-server/node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@rspack/dev-server/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rspack/dev-server/node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "dev": true, - "license": "MIT" - }, "node_modules/@rspack/dev-server/node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -11004,22 +10472,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/@rspack/dev-server/node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/@rspack/dev-server/node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -11033,22 +10485,6 @@ "node": ">=8.10.0" } }, - "node_modules/@rspack/dev-server/node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/@rspack/lite-tapable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@rspack/lite-tapable/-/lite-tapable-1.0.1.tgz", @@ -11060,9 +10496,9 @@ } }, "node_modules/@rspack/plugin-react-refresh": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@rspack/plugin-react-refresh/-/plugin-react-refresh-1.4.1.tgz", - "integrity": "sha512-bRALP4qEauvrB7RcMQ95rUHu1dw19V6c6uYukUTpA2OZDyMHTQ9cpEe28kaDwH/xsAuDNuYqnUZOW3NdLO/q3A==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@rspack/plugin-react-refresh/-/plugin-react-refresh-1.4.3.tgz", + "integrity": "sha512-wZx4vWgy5oMEvgyNGd/oUKcdnKaccYWHCRkOqTdAPJC3WcytxhTX+Kady8ERurSBiLyQpoMiU3Iyd+F1Y2Arbw==", "dev": true, "license": "MIT", "dependencies": { @@ -12113,9 +11549,9 @@ } }, "node_modules/@stripe/stripe-js": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@stripe/stripe-js/-/stripe-js-5.4.0.tgz", - "integrity": "sha512-3tfMbSvLGB+OsJ2MsjWjWo+7sp29dwx+3+9kG/TEnZQJt+EwbF/Nomm43cSK+6oXZA9uhspgyrB+BbrPRumx4g==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@stripe/stripe-js/-/stripe-js-7.3.0.tgz", + "integrity": "sha512-xnCyFIEI5SQnQrKkCxVj7nS5fWTZap+zuIGzmmxLMdlmgahFJaihK4zogqE8YyKKTLtrp/EldkEijSgtXsRVDg==", "license": "MIT", "engines": { "node": ">=12.16" @@ -13002,12 +12438,12 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "20.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", - "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", + "version": "22.15.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.17.tgz", + "integrity": "sha512-wIX2aSZL5FE+MR0JlvF87BNVrtFWf6AE6rxSE9X7OwnVvoyCQjpzSRJ+M87se/4QCkCiebQAqrJ0y6fwIyi7nw==", "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.21.0" } }, "node_modules/@types/node-forge": { @@ -14490,6 +13926,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, "node_modules/array-includes": { "version": "3.1.8", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", @@ -15220,9 +14662,9 @@ } }, "node_modules/big.js": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.2.2.tgz", - "integrity": "sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-7.0.1.tgz", + "integrity": "sha512-iFgV784tD8kq4ccF1xtNMZnXeZzVuXWWM+ERFzKQjv+A5G9HC8CY3DuV45vgzFFcW+u2tIvmF95+AzWgs6BjCg==", "license": "MIT", "engines": { "node": "*" @@ -15278,6 +14720,60 @@ "dev": true, "license": "MIT" }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/body-parser/node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/bonjour-service": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", @@ -15715,13 +15211,13 @@ } }, "node_modules/cache-manager": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/cache-manager/-/cache-manager-6.4.0.tgz", - "integrity": "sha512-eUmPyVqQYzWCt7hx1QrYzQ7oC3MGKM1etxxe8zuq1o7IB4NzdBeWcUGDSWYahaI8fkd538SEZRGadyZWQfvOzQ==", + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/cache-manager/-/cache-manager-6.4.3.tgz", + "integrity": "sha512-VV5eq/QQ5rIVix7/aICO4JyvSeEv9eIQuKL5iFwgM2BrcYoE0A/D1mNsAHJAsB0WEbNdBlKkn6Tjz6fKzh/cKQ==", "license": "MIT", "peer": true, "dependencies": { - "keyv": "^5.2.3" + "keyv": "^5.3.3" } }, "node_modules/cachedir": { @@ -16701,6 +16197,7 @@ "version": "1.6.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, "engines": [ "node >= 0.8" ], @@ -16716,12 +16213,14 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, "license": "MIT" }, "node_modules/concat-stream/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", @@ -16737,12 +16236,14 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, "license": "MIT" }, "node_modules/concat-stream/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" @@ -20309,18 +19810,18 @@ } }, "node_modules/file-type": { - "version": "20.4.1", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-20.4.1.tgz", - "integrity": "sha512-hw9gNZXUfZ02Jo0uafWLaFVPter5/k2rfcrjFJJHX/77xtSDOfJuEFb6oKlFV86FLP1SuyHMW1PSk0U9M5tKkQ==", + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-21.0.0.tgz", + "integrity": "sha512-ek5xNX2YBYlXhiUXui3D/BXa3LdqPmoLJ7rqEx2bKJ7EAUEfmXgW0Das7Dc6Nr9MvqaOnIqiPV0mZk/r/UpNAg==", "license": "MIT", "dependencies": { - "@tokenizer/inflate": "^0.2.6", - "strtok3": "^10.2.0", + "@tokenizer/inflate": "^0.2.7", + "strtok3": "^10.2.2", "token-types": "^6.0.0", "uint8array-extras": "^1.4.0" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sindresorhus/file-type?sponsor=1" @@ -20413,6 +19914,39 @@ "node": ">=8" } }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, "node_modules/find-cache-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", @@ -21120,6 +20654,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-them-args": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/get-them-args/-/get-them-args-1.3.2.tgz", + "integrity": "sha512-LRn8Jlk+DwZE4GTlDbT3Hikd1wSHgLMme/+7ddlqKd7ldwR6LjJgTVWzBnR01wnYGe4KgrXjg287RaI22UHmAw==", + "dev": true, + "license": "MIT" + }, "node_modules/getos": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", @@ -22496,6 +22037,16 @@ "node": ">= 12" } }, + "node_modules/ip-regex": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", + "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -23070,6 +22621,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", + "dev": true, + "license": "MIT" + }, "node_modules/is-weakmap": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", @@ -23147,6 +22705,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is2": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/is2/-/is2-2.0.9.tgz", + "integrity": "sha512-rZkHeBn9Zzq52sd9IUIV3a5mfwBY+o2HePMh0wkGBM4z4qjvy2GwVxQ6nNXSfw6MmVP6gf1QIlWjiOavhM3x5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "ip-regex": "^4.1.0", + "is-url": "^1.2.4" + }, + "engines": { + "node": ">=v0.10.0" + } + }, "node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", @@ -23179,16 +22752,6 @@ "node": ">=0.10.0" } }, - "node_modules/isomorphic-rslog": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/isomorphic-rslog/-/isomorphic-rslog-0.0.6.tgz", - "integrity": "sha512-HM0q6XqQ93psDlqvuViNs/Ea3hAyGDkIdVAHlrEocjjAwGrs1fZ+EdQjS9eUPacnYB7Y8SoDdSY3H8p3ce205A==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=14.17.6" - } - }, "node_modules/isomorphic-ws": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", @@ -24937,6 +24500,20 @@ "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==", "optional": true }, + "node_modules/kill-port": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/kill-port/-/kill-port-1.6.1.tgz", + "integrity": "sha512-un0Y55cOM7JKGaLnGja28T38tDDop0AQ8N0KlAdyh+B1nmMoX8AnNmqPNZbS3mUMgiST51DCVqmbFT1gNJpVNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-them-args": "1.3.2", + "shell-exec": "1.0.2" + }, + "bin": { + "kill-port": "cli.js" + } + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -26927,21 +26504,36 @@ } }, "node_modules/multer": { - "version": "1.4.5-lts.2", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.2.tgz", - "integrity": "sha512-VzGiVigcG9zUAoCNU+xShztrlr1auZOlurXynNvO9GiWD1/mTBbUljOKY+qMeazBqXgRnjzeEgJI/wyjJUHg9A==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.1.tgz", + "integrity": "sha512-Ug8bXeTIUlxurg8xLTEskKShvcKDZALo1THEX5E41pYCD2sCVub5/kIRIGqWNoqV6szyLyQKV6mD4QUrWE5GCQ==", "license": "MIT", "dependencies": { "append-field": "^1.0.0", - "busboy": "^1.0.0", - "concat-stream": "^1.5.2", - "mkdirp": "^0.5.4", + "busboy": "^1.6.0", + "concat-stream": "^2.0.0", + "mkdirp": "^0.5.6", "object-assign": "^4.1.1", - "type-is": "^1.6.4", - "xtend": "^4.0.0" + "type-is": "^1.6.18", + "xtend": "^4.0.2" }, "engines": { - "node": ">= 6.0.0" + "node": ">= 10.16.0" + } + }, + "node_modules/multer/node_modules/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "engines": [ + "node >= 6.0" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" } }, "node_modules/multicast-dns": { @@ -26967,9 +26559,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.9.tgz", - "integrity": "sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "funding": [ { "type": "github", @@ -27037,22 +26629,22 @@ "license": "MIT" }, "node_modules/ng-extract-i18n-merge": { - "version": "2.14.3", - "resolved": "https://registry.npmjs.org/ng-extract-i18n-merge/-/ng-extract-i18n-merge-2.14.3.tgz", - "integrity": "sha512-5zYuS/divhP2Tk0fizk7D8q5TyhwRjyj/DgaEgurrRwkWfIZFDUGc98eTziR3vIMsb9/sgbUSyeA+8LllCkKyA==", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/ng-extract-i18n-merge/-/ng-extract-i18n-merge-2.15.1.tgz", + "integrity": "sha512-vNr+sVySO13imQ1Y7Jwe3JtGKP4Hck4Gzb7i4HxOq9fDLDORDIoazLTiwmZVoW4ZAyqK7kkDavjS0XD+VSMZUA==", "license": "MIT", "dependencies": { - "@angular-devkit/architect": "^0.1301.0 || ^0.1401.0 || ^0.1501.0 || ^0.1601.0 || ^0.1700.0 || ^0.1800.0 || ^0.1900.0", - "@angular-devkit/core": "^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "@angular-devkit/schematics": "^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "@schematics/angular": "^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "@angular-devkit/architect": "^0.1301.0 || ^0.1401.0 || ^0.1501.0 || ^0.1601.0 || ^0.1700.0 || ^0.1800.0 || ^0.1900.0 || ^0.2000.0", + "@angular-devkit/core": "^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0", + "@angular-devkit/schematics": "^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0", + "@schematics/angular": "^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0", "xmldoc": "^1.1.3" }, "engines": { "node": ">=14.0.0" }, "peerDependencies": { - "@angular-devkit/build-angular": "^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + "@angular-devkit/build-angular": "^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0" } }, "node_modules/ng-extract-i18n-merge/node_modules/@angular-devkit/architect": { @@ -27148,9 +26740,9 @@ } }, "node_modules/ngx-stripe": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/ngx-stripe/-/ngx-stripe-19.0.0.tgz", - "integrity": "sha512-Q95EnHcEjZrHg4f4XMwMhRlJNg/jenBfypk9JISC3T4R2hc+J6HS2NMHBuft9hfRepKrcQY+FiSLzH2yS+5cAg==", + "version": "19.7.0", + "resolved": "https://registry.npmjs.org/ngx-stripe/-/ngx-stripe-19.7.0.tgz", + "integrity": "sha512-WQ7IMJT1LmQEa/3y0blAEvbPbtASrIdSGPGC69bodcEEXpKVkEUVEklYKEsJHFMFPqIU36lMA8iue0bfyxuMpA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -27158,7 +26750,7 @@ "peerDependencies": { "@angular/common": ">=19.0.0 <20.0.0", "@angular/core": ">=19.0.0 <20.0.0", - "@stripe/stripe-js": ">=5.0.0 <6.0.0" + "@stripe/stripe-js": ">=7.0.0 <8.0.0" } }, "node_modules/no-case": { @@ -27626,9 +27218,9 @@ "license": "MIT" }, "node_modules/nx": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/nx/-/nx-20.8.1.tgz", - "integrity": "sha512-73Uw8YXpsjeLqHSl7NMCmGdCs+8ynPzoNJFWAqVanPETEY9zPd5wevVQmeyzYtNNQU35uj6Os4iUzYunmwnFaA==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/nx/-/nx-21.1.2.tgz", + "integrity": "sha512-oczAEOOkQHElxCXs2g2jXDRabDRsmub/h5SAgqAUDSJ2CRnYGVVlgZX7l+o+A9kSqfONyLy5FlJ1pSWlvPuG4w==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -27662,6 +27254,7 @@ "string-width": "^4.2.3", "tar-stream": "~2.2.0", "tmp": "~0.2.1", + "tree-kill": "^1.2.2", "tsconfig-paths": "^4.1.2", "tslib": "^2.3.0", "yaml": "^2.6.0", @@ -27673,16 +27266,16 @@ "nx-cloud": "bin/nx-cloud.js" }, "optionalDependencies": { - "@nx/nx-darwin-arm64": "20.8.1", - "@nx/nx-darwin-x64": "20.8.1", - "@nx/nx-freebsd-x64": "20.8.1", - "@nx/nx-linux-arm-gnueabihf": "20.8.1", - "@nx/nx-linux-arm64-gnu": "20.8.1", - "@nx/nx-linux-arm64-musl": "20.8.1", - "@nx/nx-linux-x64-gnu": "20.8.1", - "@nx/nx-linux-x64-musl": "20.8.1", - "@nx/nx-win32-arm64-msvc": "20.8.1", - "@nx/nx-win32-x64-msvc": "20.8.1" + "@nx/nx-darwin-arm64": "21.1.2", + "@nx/nx-darwin-x64": "21.1.2", + "@nx/nx-freebsd-x64": "21.1.2", + "@nx/nx-linux-arm-gnueabihf": "21.1.2", + "@nx/nx-linux-arm64-gnu": "21.1.2", + "@nx/nx-linux-arm64-musl": "21.1.2", + "@nx/nx-linux-x64-gnu": "21.1.2", + "@nx/nx-linux-x64-musl": "21.1.2", + "@nx/nx-win32-arm64-msvc": "21.1.2", + "@nx/nx-win32-x64-msvc": "21.1.2" }, "peerDependencies": { "@swc-node/register": "^1.8.0", @@ -28654,6 +28247,12 @@ "devOptional": true, "license": "ISC" }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -28923,9 +28522,9 @@ } }, "node_modules/portfinder": { - "version": "1.0.36", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.36.tgz", - "integrity": "sha512-gMKUzCoP+feA7t45moaSx7UniU7PgGN3hA8acAB+3Qn7/js0/lJ07fYZlxt9riE9S3myyxDCyAFzSrLlta0c9g==", + "version": "1.0.37", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.37.tgz", + "integrity": "sha512-yuGIEjDAYnnOex9ddMnKZEMFE0CcGo6zbfzDklkmT1m5z734ss6JMzN9rNB3+RR7iS+F10D4/BVIaXOyh8PQKw==", "dev": true, "license": "MIT", "dependencies": { @@ -30134,23 +29733,6 @@ "node": ">=8" } }, - "node_modules/redis": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/redis/-/redis-4.7.0.tgz", - "integrity": "sha512-zvmkHEAdGMn+hMRXuMBtu4Vo5P6rHQjLoHftu+lBqq8ZTA3RCVC/WzD790bkKKiNFp7d5/9PcSD19fJyyRvOdQ==", - "license": "MIT", - "workspaces": [ - "./packages/*" - ], - "dependencies": { - "@redis/bloom": "1.2.0", - "@redis/client": "1.6.0", - "@redis/graph": "1.1.1", - "@redis/json": "1.0.7", - "@redis/search": "1.2.0", - "@redis/time-series": "1.1.0" - } - }, "node_modules/redis-errors": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", @@ -31730,6 +31312,21 @@ "node": ">= 0.6" } }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -31820,6 +31417,13 @@ "node": ">=8" } }, + "node_modules/shell-exec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/shell-exec/-/shell-exec-1.0.2.tgz", + "integrity": "sha512-jyVd+kU2X+mWKMmGhx4fpWbPsjvD53k9ivqetutVW/BQ+WIZoDoP4d8vUMGezV6saZsiNoW2f9GIhg9Dondohg==", + "dev": true, + "license": "MIT" + }, "node_modules/shell-quote": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", @@ -32716,16 +32320,23 @@ } }, "node_modules/stripe": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/stripe/-/stripe-17.3.0.tgz", - "integrity": "sha512-WACmytj1MssbIwGwPfAomo61jgldb2B/cB6A3W/Bqs9zId1olVcAa8X7HERkqpw4190GSsbvrD7KnkZogatyvw==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/stripe/-/stripe-18.1.0.tgz", + "integrity": "sha512-MLDiniPTHqcfIT3anyBPmOEcaiDhYa7/jRaNypQ3Rt2SJnayQZBvVbFghIziUCZdltGAndm/ZxVOSw6uuSCDig==", "license": "MIT", "dependencies": { - "@types/node": ">=8.1.0", "qs": "^6.11.0" }, "engines": { "node": ">=12.*" + }, + "peerDependencies": { + "@types/node": ">=12.x.x" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/strtok3": { @@ -33120,6 +32731,42 @@ "node": ">=10" } }, + "node_modules/tcp-port-used": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tcp-port-used/-/tcp-port-used-1.0.2.tgz", + "integrity": "sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4.3.1", + "is2": "^2.0.6" + } + }, + "node_modules/tcp-port-used/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/tcp-port-used/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "license": "MIT" + }, "node_modules/telejson": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/telejson/-/telejson-7.2.0.tgz", @@ -33500,15 +33147,16 @@ } }, "node_modules/ts-checker-rspack-plugin": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ts-checker-rspack-plugin/-/ts-checker-rspack-plugin-1.1.1.tgz", - "integrity": "sha512-BlpPqnfAmV0TcDg58H+1qV8Zb57ilv0x+ajjnxrVQ6BWgC8HzAdc+TycqDOJ4sZZYIV+hywQGozZFGklzbCR6A==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/ts-checker-rspack-plugin/-/ts-checker-rspack-plugin-1.1.3.tgz", + "integrity": "sha512-VpB+L+F330T484qGp5KqyoU00PRlUlz4kO1ifBpQ5CkKXEFXye8nmeXlZ5rvZAXjFAMRFiG+sI9OewO6Bd9UvA==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.16.7", "@rspack/lite-tapable": "^1.0.0", "chokidar": "^3.5.3", + "is-glob": "^4.0.3", "memfs": "^4.14.0", "minimatch": "^9.0.5", "picocolors": "^1.1.1" @@ -33575,9 +33223,9 @@ } }, "node_modules/ts-checker-rspack-plugin/node_modules/memfs": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.17.0.tgz", - "integrity": "sha512-4eirfZ7thblFmqFjywlTmuWVSvccHAJbn1r8qQLzmTO11qcqpohOjmY2mFce6x7x7WtskzRqApPD0hv+Oa74jg==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.17.2.tgz", + "integrity": "sha512-NgYhCOWgovOXSzvYgUW0LQ7Qy72rWQMGGFJDoWg4G30RHd3z77VbYdtJ4fembJXBy8pMIUA31XNAupobOQlwdg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -34266,9 +33914,9 @@ } }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "license": "MIT" }, "node_modules/unicode-canonical-property-names-ecmascript": { @@ -34640,9 +34288,9 @@ "license": "MIT" }, "node_modules/vite": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.1.tgz", - "integrity": "sha512-n2GnqDb6XPhlt9B8olZPrgMD/es/Nd1RdChF6CBD/fHW6pUyUTt2sQW2fPRX5GiD9XEa6+8A6A4f2vT6pSsE7Q==", + "version": "6.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", + "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", "license": "MIT", "peer": true, "dependencies": { @@ -34715,9 +34363,9 @@ } }, "node_modules/vite/node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.2.tgz", - "integrity": "sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.41.1.tgz", + "integrity": "sha512-NELNvyEWZ6R9QMkiytB4/L4zSEaBC03KIXEghptLGLZWJ6VPrL63ooZQCOnlx36aQPGhzuOMwDerC1Eb2VmrLw==", "cpu": [ "arm" ], @@ -34729,9 +34377,9 @@ "peer": true }, "node_modules/vite/node_modules/@rollup/rollup-android-arm64": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.2.tgz", - "integrity": "sha512-13unNoZ8NzUmnndhPTkWPWbX3vtHodYmy+I9kuLxN+F+l+x3LdVF7UCu8TWVMt1POHLh6oDHhnOA04n8oJZhBw==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.41.1.tgz", + "integrity": "sha512-DXdQe1BJ6TK47ukAoZLehRHhfKnKg9BjnQYUu9gzhI8Mwa1d2fzxA1aw2JixHVl403bwp1+/o/NhhHtxWJBgEA==", "cpu": [ "arm64" ], @@ -34743,9 +34391,9 @@ "peer": true }, "node_modules/vite/node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.2.tgz", - "integrity": "sha512-Gzf1Hn2Aoe8VZzevHostPX23U7N5+4D36WJNHK88NZHCJr7aVMG4fadqkIf72eqVPGjGc0HJHNuUaUcxiR+N/w==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.41.1.tgz", + "integrity": "sha512-5afxvwszzdulsU2w8JKWwY8/sJOLPzf0e1bFuvcW5h9zsEg+RQAojdW0ux2zyYAz7R8HvvzKCjLNJhVq965U7w==", "cpu": [ "arm64" ], @@ -34757,9 +34405,9 @@ "peer": true }, "node_modules/vite/node_modules/@rollup/rollup-darwin-x64": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.2.tgz", - "integrity": "sha512-47N4hxa01a4x6XnJoskMKTS8XZ0CZMd8YTbINbi+w03A2w4j1RTlnGHOz/P0+Bg1LaVL6ufZyNprSg+fW5nYQQ==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.41.1.tgz", + "integrity": "sha512-egpJACny8QOdHNNMZKf8xY0Is6gIMz+tuqXlusxquWu3F833DcMwmGM7WlvCO9sB3OsPjdC4U0wHw5FabzCGZg==", "cpu": [ "x64" ], @@ -34771,9 +34419,9 @@ "peer": true }, "node_modules/vite/node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.2.tgz", - "integrity": "sha512-8t6aL4MD+rXSHHZUR1z19+9OFJ2rl1wGKvckN47XFRVO+QL/dUSpKA2SLRo4vMg7ELA8pzGpC+W9OEd1Z/ZqoQ==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.41.1.tgz", + "integrity": "sha512-DBVMZH5vbjgRk3r0OzgjS38z+atlupJ7xfKIDJdZZL6sM6wjfDNo64aowcLPKIx7LMQi8vybB56uh1Ftck/Atg==", "cpu": [ "arm64" ], @@ -34785,9 +34433,9 @@ "peer": true }, "node_modules/vite/node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.2.tgz", - "integrity": "sha512-C+AyHBzfpsOEYRFjztcYUFsH4S7UsE9cDtHCtma5BK8+ydOZYgMmWg1d/4KBytQspJCld8ZIujFMAdKG1xyr4Q==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.41.1.tgz", + "integrity": "sha512-3FkydeohozEskBxNWEIbPfOE0aqQgB6ttTkJ159uWOFn42VLyfAiyD9UK5mhu+ItWzft60DycIN1Xdgiy8o/SA==", "cpu": [ "x64" ], @@ -34799,9 +34447,9 @@ "peer": true }, "node_modules/vite/node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.2.tgz", - "integrity": "sha512-de6TFZYIvJwRNjmW3+gaXiZ2DaWL5D5yGmSYzkdzjBDS3W+B9JQ48oZEsmMvemqjtAFzE16DIBLqd6IQQRuG9Q==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.41.1.tgz", + "integrity": "sha512-wC53ZNDgt0pqx5xCAgNunkTzFE8GTgdZ9EwYGVcg+jEjJdZGtq9xPjDnFgfFozQI/Xm1mh+D9YlYtl+ueswNEg==", "cpu": [ "arm" ], @@ -34813,9 +34461,9 @@ "peer": true }, "node_modules/vite/node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.2.tgz", - "integrity": "sha512-urjaEZubdIkacKc930hUDOfQPysezKla/O9qV+O89enqsqUmQm8Xj8O/vh0gHg4LYfv7Y7UsE3QjzLQzDYN1qg==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.41.1.tgz", + "integrity": "sha512-jwKCca1gbZkZLhLRtsrka5N8sFAaxrGz/7wRJ8Wwvq3jug7toO21vWlViihG85ei7uJTpzbXZRcORotE+xyrLA==", "cpu": [ "arm" ], @@ -34827,9 +34475,9 @@ "peer": true }, "node_modules/vite/node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.2.tgz", - "integrity": "sha512-KlE8IC0HFOC33taNt1zR8qNlBYHj31qGT1UqWqtvR/+NuCVhfufAq9fxO8BMFC22Wu0rxOwGVWxtCMvZVLmhQg==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.41.1.tgz", + "integrity": "sha512-g0UBcNknsmmNQ8V2d/zD2P7WWfJKU0F1nu0k5pW4rvdb+BIqMm8ToluW/eeRmxCared5dD76lS04uL4UaNgpNA==", "cpu": [ "arm64" ], @@ -34841,9 +34489,9 @@ "peer": true }, "node_modules/vite/node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.2.tgz", - "integrity": "sha512-j8CgxvfM0kbnhu4XgjnCWJQyyBOeBI1Zq91Z850aUddUmPeQvuAy6OiMdPS46gNFgy8gN1xkYyLgwLYZG3rBOg==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.41.1.tgz", + "integrity": "sha512-XZpeGB5TKEZWzIrj7sXr+BEaSgo/ma/kCgrZgL0oo5qdB1JlTzIYQKel/RmhT6vMAvOdM2teYlAaOGJpJ9lahg==", "cpu": [ "arm64" ], @@ -34855,9 +34503,9 @@ "peer": true }, "node_modules/vite/node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.2.tgz", - "integrity": "sha512-Ybc/1qUampKuRF4tQXc7G7QY9YRyeVSykfK36Y5Qc5dmrIxwFhrOzqaVTNoZygqZ1ZieSWTibfFhQ5qK8jpWxw==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.41.1.tgz", + "integrity": "sha512-bkCfDJ4qzWfFRCNt5RVV4DOw6KEgFTUZi2r2RuYhGWC8WhCA8lCAJhDeAmrM/fdiAH54m0mA0Vk2FGRPyzI+tw==", "cpu": [ "loong64" ], @@ -34869,9 +34517,9 @@ "peer": true }, "node_modules/vite/node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.2.tgz", - "integrity": "sha512-3FCIrnrt03CCsZqSYAOW/k9n625pjpuMzVfeI+ZBUSDT3MVIFDSPfSUgIl9FqUftxcUXInvFah79hE1c9abD+Q==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.41.1.tgz", + "integrity": "sha512-3mr3Xm+gvMX+/8EKogIZSIEF0WUu0HL9di+YWlJpO8CQBnoLAEL/roTCxuLncEdgcfJcvA4UMOf+2dnjl4Ut1A==", "cpu": [ "ppc64" ], @@ -34883,9 +34531,9 @@ "peer": true }, "node_modules/vite/node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.2.tgz", - "integrity": "sha512-QNU7BFHEvHMp2ESSY3SozIkBPaPBDTsfVNGx3Xhv+TdvWXFGOSH2NJvhD1zKAT6AyuuErJgbdvaJhYVhVqrWTg==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.41.1.tgz", + "integrity": "sha512-3rwCIh6MQ1LGrvKJitQjZFuQnT2wxfU+ivhNBzmxXTXPllewOF7JR1s2vMX/tWtUYFgphygxjqMl76q4aMotGw==", "cpu": [ "riscv64" ], @@ -34897,9 +34545,9 @@ "peer": true }, "node_modules/vite/node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.2.tgz", - "integrity": "sha512-B7LKIz+0+p348JoAL4X/YxGx9zOx3sR+o6Hj15Y3aaApNfAshK8+mWZEf759DXfRLeL2vg5LYJBB7DdcleYCoQ==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.41.1.tgz", + "integrity": "sha512-oIE6M8WC9ma6xYqjvPhzZYk6NbobIURvP/lEbh7FWplcMO6gn7MM2yHKA1eC/GvYwzNKK/1LYgqzdkZ8YFxR8g==", "cpu": [ "s390x" ], @@ -34911,9 +34559,9 @@ "peer": true }, "node_modules/vite/node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.2.tgz", - "integrity": "sha512-lG7Xa+BmBNwpjmVUbmyKxdQJ3Q6whHjMjzQplOs5Z+Gj7mxPtWakGHqzMqNER68G67kmCX9qX57aRsW5V0VOng==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.41.1.tgz", + "integrity": "sha512-cWBOvayNvA+SyeQMp79BHPK8ws6sHSsYnK5zDcsC3Hsxr1dgTABKjMnMslPq1DvZIp6uO7kIWhiGwaTdR4Og9A==", "cpu": [ "x64" ], @@ -34925,9 +34573,9 @@ "peer": true }, "node_modules/vite/node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.2.tgz", - "integrity": "sha512-tD46wKHd+KJvsmije4bUskNuvWKFcTOIM9tZ/RrmIvcXnbi0YK/cKS9FzFtAm7Oxi2EhV5N2OpfFB348vSQRXA==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.41.1.tgz", + "integrity": "sha512-y5CbN44M+pUCdGDlZFzGGBSKCA4A/J2ZH4edTYSSxFg7ce1Xt3GtydbVKWLlzL+INfFIZAEg1ZV6hh9+QQf9YQ==", "cpu": [ "x64" ], @@ -34939,9 +34587,9 @@ "peer": true }, "node_modules/vite/node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.2.tgz", - "integrity": "sha512-Bjv/HG8RRWLNkXwQQemdsWw4Mg+IJ29LK+bJPW2SCzPKOUaMmPEppQlu/Fqk1d7+DX3V7JbFdbkh/NMmurT6Pg==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.41.1.tgz", + "integrity": "sha512-lZkCxIrjlJlMt1dLO/FbpZbzt6J/A8p4DnqzSa4PWqPEUUUnzXLeki/iyPLfV0BmHItlYgHUqJe+3KiyydmiNQ==", "cpu": [ "arm64" ], @@ -34953,9 +34601,9 @@ "peer": true }, "node_modules/vite/node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.2.tgz", - "integrity": "sha512-dt1llVSGEsGKvzeIO76HToiYPNPYPkmjhMHhP00T9S4rDern8P2ZWvWAQUEJ+R1UdMWJ/42i/QqJ2WV765GZcA==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.41.1.tgz", + "integrity": "sha512-+psFT9+pIh2iuGsxFYYa/LhS5MFKmuivRsx9iPJWNSGbh2XVEjk90fmpUEjCnILPEPJnikAU6SFDiEUyOv90Pg==", "cpu": [ "ia32" ], @@ -34967,9 +34615,9 @@ "peer": true }, "node_modules/vite/node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.2.tgz", - "integrity": "sha512-bwspbWB04XJpeElvsp+DCylKfF4trJDa2Y9Go8O6A7YLX2LIKGcNK/CYImJN6ZP4DcuOHB4Utl3iCbnR62DudA==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.41.1.tgz", + "integrity": "sha512-Wq2zpapRYLfi4aKxf2Xff0tN+7slj2d4R87WEzqw7ZLsVvO5zwYCIuEGSZYiK41+GlwUo1HiR+GdkLEJnCKTCw==", "cpu": [ "x64" ], @@ -34988,9 +34636,9 @@ "peer": true }, "node_modules/vite/node_modules/postcss": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.4.tgz", + "integrity": "sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w==", "funding": [ { "type": "opencollective", @@ -35008,7 +34656,7 @@ "license": "MIT", "peer": true, "dependencies": { - "nanoid": "^3.3.8", + "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -35017,9 +34665,9 @@ } }, "node_modules/vite/node_modules/rollup": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.2.tgz", - "integrity": "sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.41.1.tgz", + "integrity": "sha512-cPmwD3FnFv8rKMBc1MxWCwVQFxwf1JEmSX3iQXrRVVG15zerAIXRjMFVWnd5Q5QvgKF7Aj+5ykXFhUl+QGnyOw==", "license": "MIT", "peer": true, "dependencies": { @@ -35033,26 +34681,26 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.40.2", - "@rollup/rollup-android-arm64": "4.40.2", - "@rollup/rollup-darwin-arm64": "4.40.2", - "@rollup/rollup-darwin-x64": "4.40.2", - "@rollup/rollup-freebsd-arm64": "4.40.2", - "@rollup/rollup-freebsd-x64": "4.40.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.40.2", - "@rollup/rollup-linux-arm-musleabihf": "4.40.2", - "@rollup/rollup-linux-arm64-gnu": "4.40.2", - "@rollup/rollup-linux-arm64-musl": "4.40.2", - "@rollup/rollup-linux-loongarch64-gnu": "4.40.2", - "@rollup/rollup-linux-powerpc64le-gnu": "4.40.2", - "@rollup/rollup-linux-riscv64-gnu": "4.40.2", - "@rollup/rollup-linux-riscv64-musl": "4.40.2", - "@rollup/rollup-linux-s390x-gnu": "4.40.2", - "@rollup/rollup-linux-x64-gnu": "4.40.2", - "@rollup/rollup-linux-x64-musl": "4.40.2", - "@rollup/rollup-win32-arm64-msvc": "4.40.2", - "@rollup/rollup-win32-ia32-msvc": "4.40.2", - "@rollup/rollup-win32-x64-msvc": "4.40.2", + "@rollup/rollup-android-arm-eabi": "4.41.1", + "@rollup/rollup-android-arm64": "4.41.1", + "@rollup/rollup-darwin-arm64": "4.41.1", + "@rollup/rollup-darwin-x64": "4.41.1", + "@rollup/rollup-freebsd-arm64": "4.41.1", + "@rollup/rollup-freebsd-x64": "4.41.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.41.1", + "@rollup/rollup-linux-arm-musleabihf": "4.41.1", + "@rollup/rollup-linux-arm64-gnu": "4.41.1", + "@rollup/rollup-linux-arm64-musl": "4.41.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.41.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.41.1", + "@rollup/rollup-linux-riscv64-gnu": "4.41.1", + "@rollup/rollup-linux-riscv64-musl": "4.41.1", + "@rollup/rollup-linux-s390x-gnu": "4.41.1", + "@rollup/rollup-linux-x64-gnu": "4.41.1", + "@rollup/rollup-linux-x64-musl": "4.41.1", + "@rollup/rollup-win32-arm64-msvc": "4.41.1", + "@rollup/rollup-win32-ia32-msvc": "4.41.1", + "@rollup/rollup-win32-x64-msvc": "4.41.1", "fsevents": "~2.3.2" } }, @@ -35422,36 +35070,6 @@ } } }, - "node_modules/webpack-dev-server/node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "license": "MIT" - }, - "node_modules/webpack-dev-server/node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, "node_modules/webpack-dev-server/node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -35546,24 +35164,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/webpack-dev-server/node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/webpack-dev-server/node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -35624,12 +35224,6 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, - "node_modules/webpack-dev-server/node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "license": "MIT" - }, "node_modules/webpack-dev-server/node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -35642,21 +35236,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/webpack-dev-server/node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/webpack-dev-server/node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -35669,21 +35248,6 @@ "node": ">=8.10.0" } }, - "node_modules/webpack-dev-server/node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/webpack-hot-middleware": { "version": "2.26.1", "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.26.1.tgz", @@ -36101,9 +35665,9 @@ } }, "node_modules/yahoo-finance2": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/yahoo-finance2/-/yahoo-finance2-3.3.4.tgz", - "integrity": "sha512-LusAnc5R/5t0x/uhXdwLMzC/Q15Ekc2VGRpS21mL8XpTsrgnKEYmx12UlammXjna9S2Y+pFkST7TYZTDH7gn0w==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/yahoo-finance2/-/yahoo-finance2-3.3.5.tgz", + "integrity": "sha512-rLsoKpxOGD5x2aT62mfF89yFBKBUNM3RMttvW4JuLH1K0JgADwyOfBm3zJzl4zLFoSOnqeOjRvlhhF59R6X3HA==", "license": "MIT", "dependencies": { "@deno/shim-deno": "~0.18.0", @@ -36228,9 +35792,9 @@ } }, "node_modules/zone.js": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.15.0.tgz", - "integrity": "sha512-9oxn0IIjbCZkJ67L+LkhYWRyAy7axphb3VgE2MBDlOqnmHMPWGYMxJxBYFueFq/JGY2GMwS0rU+UCLunEmy5UA==", + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.15.1.tgz", + "integrity": "sha512-XE96n56IQpJM7NAoXswY3XRLcWFW83xe0BiAOeMD7K5k5xecOeul3Qcpx6GqEeeHNkW5DWL5zOyTbEfB4eti8w==", "license": "MIT" } } diff --git a/package.json b/package.json index 3e203fbc9..4ed3dc73b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "2.163.0", + "version": "2.169.0", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio", @@ -76,24 +76,24 @@ "@dfinity/principal": "0.15.7", "@dinero.js/currencies": "2.0.0-alpha.8", "@internationalized/number": "3.6.0", - "@keyv/redis": "4.3.4", + "@keyv/redis": "4.4.0", "@nestjs/bull": "11.0.2", "@nestjs/cache-manager": "3.0.1", - "@nestjs/common": "11.1.0", + "@nestjs/common": "11.1.3", "@nestjs/config": "4.0.2", - "@nestjs/core": "11.1.0", + "@nestjs/core": "11.1.3", "@nestjs/event-emitter": "3.0.1", "@nestjs/jwt": "11.0.0", "@nestjs/passport": "11.0.5", - "@nestjs/platform-express": "11.1.0", + "@nestjs/platform-express": "11.1.3", "@nestjs/schedule": "6.0.0", "@nestjs/serve-static": "5.0.3", "@prisma/client": "6.8.2", "@simplewebauthn/browser": "13.1.0", "@simplewebauthn/server": "13.1.1", - "@stripe/stripe-js": "5.4.0", + "@stripe/stripe-js": "7.3.0", "alphavantage": "2.2.0", - "big.js": "6.2.2", + "big.js": "7.0.1", "bootstrap": "4.6.2", "bull": "4.16.5", "chart.js": "4.4.9", @@ -118,11 +118,11 @@ "lodash": "4.17.21", "marked": "15.0.4", "ms": "3.0.0-canary.1", - "ng-extract-i18n-merge": "2.14.3", + "ng-extract-i18n-merge": "2.15.1", "ngx-device-detector": "9.0.0", "ngx-markdown": "19.0.0", "ngx-skeleton-loader": "11.0.0", - "ngx-stripe": "19.0.0", + "ngx-stripe": "19.7.0", "open-color": "1.9.1", "papaparse": "5.3.1", "passport": "0.7.0", @@ -131,12 +131,12 @@ "passport-jwt": "4.0.1", "reflect-metadata": "0.2.2", "rxjs": "7.8.1", - "stripe": "17.3.0", + "stripe": "18.1.0", "svgmap": "2.12.2", "twitter-api-v2": "1.23.0", "uuid": "11.1.0", - "yahoo-finance2": "3.3.4", - "zone.js": "0.15.0" + "yahoo-finance2": "3.3.5", + "zone.js": "0.15.1" }, "devDependencies": { "@angular-devkit/build-angular": "19.2.1", @@ -153,18 +153,18 @@ "@eslint/eslintrc": "3.3.1", "@eslint/js": "9.24.0", "@nestjs/schematics": "11.0.5", - "@nestjs/testing": "11.1.0", - "@nx/angular": "20.8.1", - "@nx/cypress": "20.8.1", - "@nx/eslint-plugin": "20.8.1", - "@nx/jest": "20.8.1", - "@nx/js": "20.8.1", - "@nx/module-federation": "20.8.1", - "@nx/nest": "20.8.1", - "@nx/node": "20.8.1", - "@nx/storybook": "20.8.1", - "@nx/web": "20.8.1", - "@nx/workspace": "20.8.1", + "@nestjs/testing": "11.1.3", + "@nx/angular": "21.1.2", + "@nx/cypress": "21.1.2", + "@nx/eslint-plugin": "21.1.2", + "@nx/jest": "21.1.2", + "@nx/js": "21.1.2", + "@nx/module-federation": "21.1.2", + "@nx/nest": "21.1.2", + "@nx/node": "21.1.2", + "@nx/storybook": "21.1.2", + "@nx/web": "21.1.2", + "@nx/workspace": "21.1.2", "@schematics/angular": "19.2.1", "@storybook/addon-essentials": "8.6.12", "@storybook/addon-interactions": "8.6.12", @@ -175,7 +175,7 @@ "@types/google-spreadsheet": "3.1.5", "@types/jest": "29.5.13", "@types/lodash": "4.17.16", - "@types/node": "20.14.10", + "@types/node": "22.15.17", "@types/papaparse": "5.3.7", "@types/passport-google-oauth20": "2.0.16", "@typescript-eslint/eslint-plugin": "8.29.0", @@ -191,7 +191,7 @@ "jest": "29.7.0", "jest-environment-jsdom": "29.7.0", "jest-preset-angular": "14.4.2", - "nx": "20.8.1", + "nx": "21.1.2", "prettier": "3.5.3", "prettier-plugin-organize-attributes": "1.0.0", "prisma": "6.8.2", @@ -207,7 +207,7 @@ "webpack-bundle-analyzer": "4.10.2" }, "engines": { - "node": ">=20" + "node": ">=22" }, "prisma": { "seed": "npx ts-node --compiler-options {\"module\":\"CommonJS\"} prisma/seed.ts" diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 6182ebfe4..ede19470d 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -233,11 +233,11 @@ model Subscription { } model Tag { - id String @id @default(uuid()) - name String - orders Order[] - userId String? - User User? @relation(fields: [userId], onDelete: Cascade, references: [id]) + activities Order[] + id String @id @default(uuid()) + name String + userId String? + User User? @relation(fields: [userId], onDelete: Cascade, references: [id]) @@unique([name, userId]) @@index([name]) @@ -245,6 +245,7 @@ model Tag { model User { accessToken String? + accounts Account[] activities Order[] authChallenge String? createdAt DateTime @default(now()) @@ -252,18 +253,17 @@ model User { provider Provider @default(ANONYMOUS) role Role @default(USER) subscriptions Subscription[] + tags Tag[] thirdPartyId String? updatedAt DateTime @updatedAt watchlist SymbolProfile[] @relation("UserWatchlist") Access Access[] @relation("accessGet") AccessGive Access[] @relation("accessGive") - Account Account[] Analytics Analytics? ApiKey ApiKey[] AuthDevice AuthDevice[] Settings Settings? SymbolProfile SymbolProfile[] - Tag Tag[] @@index([accessToken]) @@index([createdAt]) diff --git a/test/import/ok.json b/test/import/ok.json index 4bce98ba2..d3e05e610 100644 --- a/test/import/ok.json +++ b/test/import/ok.json @@ -6,6 +6,16 @@ "accounts": [ { "balance": 2000, + "balances": [ + { + "date": "2024-12-31T00:00:00.000Z", + "value": 2000 + }, + { + "date": "2023-12-31T00:00:00.000Z", + "value": 1000 + } + ], "currency": "USD", "id": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", "isExcluded": false,