Browse Source

Merge branch 'main' into feature/remove-deprecated-environment-variable-BASE_CURRENCY

pull/2255/head
Thomas Kaul 2 years ago
committed by GitHub
parent
commit
c9e7abbe40
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 1
      .prettierrc
  2. 60
      CHANGELOG.md
  3. 5
      apps/api/src/app/auth/auth.controller.ts
  4. 2
      apps/api/src/app/auth/auth.service.ts
  5. 2
      apps/api/src/app/exchange-rate/exchange-rate.controller.ts
  6. 18
      apps/api/src/app/health/health.controller.ts
  7. 3
      apps/api/src/app/health/health.module.ts
  8. 6
      apps/api/src/app/health/health.service.ts
  9. 2
      apps/api/src/app/import/import.service.ts
  10. 5
      apps/api/src/app/info/info.module.ts
  11. 27
      apps/api/src/app/info/info.service.ts
  12. 20
      apps/api/src/app/portfolio/portfolio.service.ts
  13. 5
      apps/api/src/app/subscription/subscription.service.ts
  14. 2
      apps/api/src/app/symbol/symbol.controller.ts
  15. 4
      apps/api/src/app/user/user.service.ts
  16. 158
      apps/api/src/assets/cryptocurrencies/cryptocurrencies.json
  17. 1
      apps/api/src/assets/cryptocurrencies/custom.json
  18. 112
      apps/api/src/assets/sitemap.xml
  19. 4
      apps/api/src/middlewares/html-template.middleware.ts
  20. 10
      apps/api/src/services/data-gathering/data-gathering.service.ts
  21. 8
      apps/api/src/services/data-provider/data-enhancer/data-enhancer.module.ts
  22. 44
      apps/api/src/services/data-provider/data-enhancer/data-enhancer.service.ts
  23. 30
      apps/api/src/services/data-provider/data-enhancer/trackinsight/trackinsight.service.ts
  24. 14
      apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.ts
  25. 2
      apps/api/src/services/data-provider/interfaces/data-enhancer.interface.ts
  26. 5
      apps/api/src/services/twitter-bot/twitter-bot.service.ts
  27. 2
      apps/client/src/app/components/admin-market-data-detail/admin-market-data-detail.component.html
  28. 27
      apps/client/src/app/components/header/header.component.html
  29. 8
      apps/client/src/app/components/header/header.component.scss
  30. 5
      apps/client/src/app/pages/about/about-page-routing.module.ts
  31. 128
      apps/client/src/app/pages/about/oss-friends/oss-friends-page.component.ts
  32. 15
      apps/client/src/app/pages/about/oss-friends/oss-friends-page.html
  33. 4
      apps/client/src/app/pages/about/oss-friends/oss-friends-page.module.ts
  34. 6
      apps/client/src/app/pages/about/oss-friends/oss-friends-page.scss
  35. 2
      apps/client/src/app/pages/blog/2023/07/exploring-the-path-to-fire/exploring-the-path-to-fire-page.html
  36. 14
      apps/client/src/app/pages/blog/2023/08/ghostfolio-joins-oss-friends/ghostfolio-joins-oss-friends-page.component.ts
  37. 167
      apps/client/src/app/pages/blog/2023/08/ghostfolio-joins-oss-friends/ghostfolio-joins-oss-friends-page.html
  38. 9
      apps/client/src/app/pages/blog/blog-page-routing.module.ts
  39. 26
      apps/client/src/app/pages/blog/blog-page.html
  40. 8
      apps/client/src/app/pages/landing/landing-page.html
  41. 5
      apps/client/src/app/pages/landing/landing-page.scss
  42. 4
      apps/client/src/app/pages/open/open-page.html
  43. 2
      apps/client/src/app/pages/pricing/pricing-page.html
  44. 4
      apps/client/src/app/pages/register/register-page.component.ts
  45. 1
      apps/client/src/app/pages/register/register-page.html
  46. 2
      apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page-routing.module.ts
  47. 1
      apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.component.ts
  48. 2
      apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html
  49. 16
      apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html
  50. 82
      apps/client/src/app/pages/resources/personal-finance-tools/products.ts
  51. 5
      apps/client/src/app/services/page-title.strategy.ts
  52. BIN
      apps/client/src/assets/images/blog/ghostfolio-joins-oss-friends.png
  53. 3
      apps/client/src/assets/images/logo-hacker-news.svg
  54. 126
      apps/client/src/assets/oss-friends.json
  55. 2
      apps/client/src/index.html
  56. 1218
      apps/client/src/locales/messages.de.xlf
  57. 1218
      apps/client/src/locales/messages.es.xlf
  58. 1218
      apps/client/src/locales/messages.fr.xlf
  59. 1218
      apps/client/src/locales/messages.it.xlf
  60. 1218
      apps/client/src/locales/messages.nl.xlf
  61. 1218
      apps/client/src/locales/messages.pt.xlf
  62. 1195
      apps/client/src/locales/messages.xlf
  63. 8
      docker/docker-compose.build.yml
  64. 5
      docker/docker-compose.dev.yml
  65. 8
      docker/docker-compose.yml
  66. 2
      libs/ui/.storybook/preview-head.html
  67. 2
      libs/ui/src/lib/activities-table/activities-table.component.html
  68. 2
      libs/ui/src/lib/fire-calculator/fire-calculator.component.html
  69. 40
      package.json
  70. 586
      yarn.lock

1
.prettierrc

@ -9,6 +9,7 @@
], ],
"attributeSort": "ASC", "attributeSort": "ASC",
"endOfLine": "auto", "endOfLine": "auto",
"plugins": ["prettier-plugin-organize-attributes"],
"printWidth": 80, "printWidth": 80,
"singleQuote": true, "singleQuote": true,
"tabWidth": 2, "tabWidth": 2,

60
CHANGELOG.md

@ -7,9 +7,67 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## Unreleased ## Unreleased
### Added
- Added support for the cryptocurrency _CyberConnect_
### Changed ### Changed
- Removed the deprecated environment variable `BASE_CURRENCY` - **Breaking Change**: Removed the deprecated environment variable `BASE_CURRENCY`
- Improved the validation in the activities import
- Deactivated _Internet Identity_ as a social login provider for the account registration
- Improved the language localization for German (`de`)
- Refreshed the cryptocurrencies list
- Changed the version in the `docker-compose` files from `3.7` to `3.9`
### Fixed
- Fixed an issue in the _Yahoo Finance_ data enhancer where countries and sectors have been removed
## 1.305.0 - 2023-09-03
### Added
- Added _Hacker News_ to the _As seen in_ section on the landing page
### Changed
- Shortened the page titles
- Improved the language localization for German (`de`)
- Upgraded `prisma` from version `4.16.2` to `5.2.0`
- Upgraded `replace-in-file` from version `6.3.5` to `7.0.1`
- Upgraded `yahoo-finance2` from version `2.4.3` to `2.4.4`
### Fixed
- Fixed the alignment in the header navigation
- Fixed the alignment in the menu of the impersonation mode
## 1.304.0 - 2023-08-27
### Added
- Added health check endpoints for data enhancers
### Changed
- Upgraded `Nx` from version `16.7.2` to `16.7.4`
- Upgraded `prettier` from version `2.8.4` to `3.0.2`
## 1.303.0 - 2023-08-23
### Added
- Added a blog post: _Ghostfolio joins OSS Friends_
### Changed
- Refreshed the cryptocurrencies list
- Improved the _OSS Friends_ page
### Fixed
- Fixed an issue with the _Trackinsight_ data enhancer for asset profile data
## 1.302.0 - 2023-08-20 ## 1.302.0 - 2023-08-20

5
apps/api/src/app/auth/auth.controller.ts

@ -41,9 +41,8 @@ export class AuthController {
@Param('accessToken') accessToken: string @Param('accessToken') accessToken: string
): Promise<OAuthResponse> { ): Promise<OAuthResponse> {
try { try {
const authToken = await this.authService.validateAnonymousLogin( const authToken =
accessToken await this.authService.validateAnonymousLogin(accessToken);
);
return { authToken }; return { authToken };
} catch { } catch {
throw new HttpException( throw new HttpException(

2
apps/api/src/app/auth/auth.service.ts

@ -55,7 +55,7 @@ export class AuthService {
const isUserSignupEnabled = const isUserSignupEnabled =
await this.propertyService.isUserSignupEnabled(); await this.propertyService.isUserSignupEnabled();
if (!isUserSignupEnabled) { if (!isUserSignupEnabled || true) {
throw new Error('Sign up forbidden'); throw new Error('Sign up forbidden');
} }

2
apps/api/src/app/exchange-rate/exchange-rate.controller.ts

@ -7,10 +7,10 @@ import {
UseGuards UseGuards
} from '@nestjs/common'; } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport'; import { AuthGuard } from '@nestjs/passport';
import { parseISO } from 'date-fns';
import { StatusCodes, getReasonPhrase } from 'http-status-codes'; import { StatusCodes, getReasonPhrase } from 'http-status-codes';
import { ExchangeRateService } from './exchange-rate.service'; import { ExchangeRateService } from './exchange-rate.service';
import { parseISO } from 'date-fns';
@Controller('exchange-rate') @Controller('exchange-rate')
export class ExchangeRateController { export class ExchangeRateController {

18
apps/api/src/app/health/health.controller.ts

@ -18,6 +18,19 @@ export class HealthController {
@Get() @Get()
public async getHealth() {} public async getHealth() {}
@Get('data-enhancer/:name')
public async getHealthOfDataEnhancer(@Param('name') name: string) {
const hasResponse =
await this.healthService.hasResponseFromDataEnhancer(name);
if (hasResponse !== true) {
throw new HttpException(
getReasonPhrase(StatusCodes.SERVICE_UNAVAILABLE),
StatusCodes.SERVICE_UNAVAILABLE
);
}
}
@Get('data-provider/:dataSource') @Get('data-provider/:dataSource')
@UseInterceptors(TransformDataSourceInRequestInterceptor) @UseInterceptors(TransformDataSourceInRequestInterceptor)
public async getHealthOfDataProvider( public async getHealthOfDataProvider(
@ -30,9 +43,8 @@ export class HealthController {
); );
} }
const hasResponse = await this.healthService.hasResponseFromDataProvider( const hasResponse =
dataSource await this.healthService.hasResponseFromDataProvider(dataSource);
);
if (hasResponse !== true) { if (hasResponse !== true) {
throw new HttpException( throw new HttpException(

3
apps/api/src/app/health/health.module.ts

@ -1,4 +1,5 @@
import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module';
import { DataEnhancerModule } from '@ghostfolio/api/services/data-provider/data-enhancer/data-enhancer.module';
import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module'; import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module';
import { Module } from '@nestjs/common'; import { Module } from '@nestjs/common';
@ -7,7 +8,7 @@ import { HealthService } from './health.service';
@Module({ @Module({
controllers: [HealthController], controllers: [HealthController],
imports: [ConfigurationModule, DataProviderModule], imports: [ConfigurationModule, DataEnhancerModule, DataProviderModule],
providers: [HealthService] providers: [HealthService]
}) })
export class HealthModule {} export class HealthModule {}

6
apps/api/src/app/health/health.service.ts

@ -1,3 +1,4 @@
import { DataEnhancerService } from '@ghostfolio/api/services/data-provider/data-enhancer/data-enhancer.service';
import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service';
import { Injectable } from '@nestjs/common'; import { Injectable } from '@nestjs/common';
import { DataSource } from '@prisma/client'; import { DataSource } from '@prisma/client';
@ -5,9 +6,14 @@ import { DataSource } from '@prisma/client';
@Injectable() @Injectable()
export class HealthService { export class HealthService {
public constructor( public constructor(
private readonly dataEnhancerService: DataEnhancerService,
private readonly dataProviderService: DataProviderService private readonly dataProviderService: DataProviderService
) {} ) {}
public async hasResponseFromDataEnhancer(aName: string) {
return this.dataEnhancerService.enhance(aName);
}
public async hasResponseFromDataProvider(aDataSource: DataSource) { public async hasResponseFromDataProvider(aDataSource: DataSource) {
return this.dataProviderService.checkQuote(aDataSource); return this.dataProviderService.checkQuote(aDataSource);
} }

2
apps/api/src/app/import/import.service.ts

@ -566,7 +566,7 @@ export class ImportService {
]) ])
)?.[symbol]; )?.[symbol];
if (!assetProfile) { if (!assetProfile?.name) {
throw new Error( throw new Error(
`activities.${index}.symbol ("${symbol}") is not valid for the specified data source ("${dataSource}")` `activities.${index}.symbol ("${symbol}") is not valid for the specified data source ("${dataSource}")`
); );

5
apps/api/src/app/info/info.module.ts

@ -1,6 +1,7 @@
import { BenchmarkModule } from '@ghostfolio/api/app/benchmark/benchmark.module'; import { BenchmarkModule } from '@ghostfolio/api/app/benchmark/benchmark.module';
import { PlatformModule } from '@ghostfolio/api/app/platform/platform.module'; import { PlatformModule } from '@ghostfolio/api/app/platform/platform.module';
import { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.module'; import { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.module';
import { UserModule } from '@ghostfolio/api/app/user/user.module';
import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module';
import { DataGatheringModule } from '@ghostfolio/api/services/data-gathering/data-gathering.module'; import { DataGatheringModule } from '@ghostfolio/api/services/data-gathering/data-gathering.module';
import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module'; import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module';
@ -28,11 +29,11 @@ import { InfoService } from './info.service';
signOptions: { expiresIn: '30 days' } signOptions: { expiresIn: '30 days' }
}), }),
PlatformModule, PlatformModule,
PrismaModule,
PropertyModule, PropertyModule,
RedisCacheModule, RedisCacheModule,
SymbolProfileModule, SymbolProfileModule,
TagModule TagModule,
UserModule
], ],
providers: [InfoService] providers: [InfoService]
}) })

27
apps/api/src/app/info/info.service.ts

@ -1,9 +1,9 @@
import { BenchmarkService } from '@ghostfolio/api/app/benchmark/benchmark.service'; import { BenchmarkService } from '@ghostfolio/api/app/benchmark/benchmark.service';
import { PlatformService } from '@ghostfolio/api/app/platform/platform.service'; import { PlatformService } from '@ghostfolio/api/app/platform/platform.service';
import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service'; import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service';
import { UserService } from '@ghostfolio/api/app/user/user.service';
import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service';
import { PropertyService } from '@ghostfolio/api/services/property/property.service'; import { PropertyService } from '@ghostfolio/api/services/property/property.service';
import { TagService } from '@ghostfolio/api/services/tag/tag.service'; import { TagService } from '@ghostfolio/api/services/tag/tag.service';
import { import {
@ -45,10 +45,10 @@ export class InfoService {
private readonly exchangeRateDataService: ExchangeRateDataService, private readonly exchangeRateDataService: ExchangeRateDataService,
private readonly jwtService: JwtService, private readonly jwtService: JwtService,
private readonly platformService: PlatformService, private readonly platformService: PlatformService,
private readonly prismaService: PrismaService,
private readonly propertyService: PropertyService, private readonly propertyService: PropertyService,
private readonly redisCacheService: RedisCacheService, private readonly redisCacheService: RedisCacheService,
private readonly tagService: TagService private readonly tagService: TagService,
private readonly userService: UserService
) {} ) {}
public async get(): Promise<InfoItem> { public async get(): Promise<InfoItem> {
@ -146,12 +146,7 @@ export class InfoService {
} }
private async countActiveUsers(aDays: number) { private async countActiveUsers(aDays: number) {
return await this.prismaService.user.count({ return this.userService.count({
orderBy: {
Analytics: {
updatedAt: 'desc'
}
},
where: { where: {
AND: [ AND: [
{ {
@ -224,10 +219,7 @@ export class InfoService {
} }
private async countNewUsers(aDays: number) { private async countNewUsers(aDays: number) {
return await this.prismaService.user.count({ return this.userService.count({
orderBy: {
createdAt: 'desc'
},
where: { where: {
AND: [ AND: [
{ {
@ -318,11 +310,10 @@ export class InfoService {
return undefined; return undefined;
} }
const stripeConfig = (await this.prismaService.property.findUnique({ return (
where: { key: PROPERTY_STRIPE_CONFIG } ((await this.propertyService.getByKey(PROPERTY_STRIPE_CONFIG)) as any) ??
})) ?? { value: '{}' }; {}
);
return JSON.parse(stripeConfig.value);
} }
private async getUptime(): Promise<number> { private async getUptime(): Promise<number> {

20
apps/api/src/app/portfolio/portfolio.service.ts

@ -465,9 +465,8 @@ export class PortfolioService {
transactionPoints[0]?.date ?? format(new Date(), DATE_FORMAT) transactionPoints[0]?.date ?? format(new Date(), DATE_FORMAT)
); );
const startDate = this.getStartDate(dateRange, portfolioStart); const startDate = this.getStartDate(dateRange, portfolioStart);
const currentPositions = await portfolioCalculator.getCurrentPositions( const currentPositions =
startDate await portfolioCalculator.getCurrentPositions(startDate);
);
const cashDetails = await this.accountService.getCashDetails({ const cashDetails = await this.accountService.getCashDetails({
filters, filters,
@ -805,9 +804,8 @@ export class PortfolioService {
const transactionPoints = portfolioCalculator.getTransactionPoints(); const transactionPoints = portfolioCalculator.getTransactionPoints();
const portfolioStart = parseDate(transactionPoints[0].date); const portfolioStart = parseDate(transactionPoints[0].date);
const currentPositions = await portfolioCalculator.getCurrentPositions( const currentPositions =
portfolioStart await portfolioCalculator.getCurrentPositions(portfolioStart);
);
const position = currentPositions.positions.find( const position = currentPositions.positions.find(
(item) => item.symbol === aSymbol (item) => item.symbol === aSymbol
@ -1041,9 +1039,8 @@ export class PortfolioService {
const portfolioStart = parseDate(transactionPoints[0].date); const portfolioStart = parseDate(transactionPoints[0].date);
const startDate = this.getStartDate(dateRange, portfolioStart); const startDate = this.getStartDate(dateRange, portfolioStart);
const currentPositions = await portfolioCalculator.getCurrentPositions( const currentPositions =
startDate await portfolioCalculator.getCurrentPositions(startDate);
);
const positions = currentPositions.positions.filter( const positions = currentPositions.positions.filter(
(item) => !item.quantity.eq(0) (item) => !item.quantity.eq(0)
@ -1233,9 +1230,8 @@ export class PortfolioService {
portfolioCalculator.setTransactionPoints(transactionPoints); portfolioCalculator.setTransactionPoints(transactionPoints);
const portfolioStart = parseDate(transactionPoints[0].date); const portfolioStart = parseDate(transactionPoints[0].date);
const currentPositions = await portfolioCalculator.getCurrentPositions( const currentPositions =
portfolioStart await portfolioCalculator.getCurrentPositions(portfolioStart);
);
const positions = currentPositions.positions.filter( const positions = currentPositions.positions.filter(
(item) => !item.quantity.eq(0) (item) => !item.quantity.eq(0)

5
apps/api/src/app/subscription/subscription.service.ts

@ -93,9 +93,8 @@ export class SubscriptionService {
public async createSubscriptionViaStripe(aCheckoutSessionId: string) { public async createSubscriptionViaStripe(aCheckoutSessionId: string) {
try { try {
const session = await this.stripe.checkout.sessions.retrieve( const session =
aCheckoutSessionId await this.stripe.checkout.sessions.retrieve(aCheckoutSessionId);
);
await this.createSubscription({ await this.createSubscription({
price: session.amount_total / 100, price: session.amount_total / 100,

2
apps/api/src/app/symbol/symbol.controller.ts

@ -15,13 +15,13 @@ import {
import { REQUEST } from '@nestjs/core'; import { REQUEST } from '@nestjs/core';
import { AuthGuard } from '@nestjs/passport'; import { AuthGuard } from '@nestjs/passport';
import { DataSource } from '@prisma/client'; import { DataSource } from '@prisma/client';
import { parseISO } from 'date-fns';
import { StatusCodes, getReasonPhrase } from 'http-status-codes'; import { StatusCodes, getReasonPhrase } from 'http-status-codes';
import { isDate, isEmpty } from 'lodash'; import { isDate, isEmpty } from 'lodash';
import { LookupItem } from './interfaces/lookup-item.interface'; import { LookupItem } from './interfaces/lookup-item.interface';
import { SymbolItem } from './interfaces/symbol-item.interface'; import { SymbolItem } from './interfaces/symbol-item.interface';
import { SymbolService } from './symbol.service'; import { SymbolService } from './symbol.service';
import { parseISO } from 'date-fns';
@Controller('symbol') @Controller('symbol')
export class SymbolController { export class SymbolController {

4
apps/api/src/app/user/user.service.ts

@ -33,6 +33,10 @@ export class UserService {
private readonly tagService: TagService private readonly tagService: TagService
) {} ) {}
public async count(args?: Prisma.UserCountArgs) {
return this.prismaService.user.count(args);
}
public async getUser( public async getUser(
{ Account, id, permissions, Settings, subscription }: UserWithSettings, { Account, id, permissions, Settings, subscription }: UserWithSettings,
aLocale = locale aLocale = locale

158
apps/api/src/assets/cryptocurrencies/cryptocurrencies.json

@ -51,7 +51,9 @@
"3FT": "ThreeFold Token", "3FT": "ThreeFold Token",
"3ULL": "3ULL Coin", "3ULL": "3ULL Coin",
"3XD": "3DChain", "3XD": "3DChain",
"420CHAN": "420chan",
"4ART": "4ART Coin", "4ART": "4ART Coin",
"4CHAN": "4Chan",
"4JNET": "4JNET", "4JNET": "4JNET",
"77G": "GraphenTech", "77G": "GraphenTech",
"7E": "7ELEVEN", "7E": "7ELEVEN",
@ -60,6 +62,7 @@
"8BT": "8 Circuit Studios", "8BT": "8 Circuit Studios",
"8PAY": "8Pay", "8PAY": "8Pay",
"8X8": "8X8 Protocol", "8X8": "8X8 Protocol",
"9GAG": "9GAG",
"A5T": "Alpha5", "A5T": "Alpha5",
"AAA": "Moon Rabbit", "AAA": "Moon Rabbit",
"AAB": "AAX Token", "AAB": "AAX Token",
@ -101,6 +104,7 @@
"ACN": "AvonCoin", "ACN": "AvonCoin",
"ACOIN": "ACoin", "ACOIN": "ACoin",
"ACP": "Anarchists Prime", "ACP": "Anarchists Prime",
"ACQ": "Acquire.Fi",
"ACS": "Access Protocol", "ACS": "Access Protocol",
"ACT": "Achain", "ACT": "Achain",
"ACTIN": "Actinium", "ACTIN": "Actinium",
@ -180,7 +184,7 @@
"AGX": "Agricoin", "AGX": "Agricoin",
"AHOO": "Ahoolee", "AHOO": "Ahoolee",
"AHT": "AhaToken", "AHT": "AhaToken",
"AI": "Multiverse", "AI": "AiDoge",
"AIB": "AdvancedInternetBlock", "AIB": "AdvancedInternetBlock",
"AIBB": "AiBB", "AIBB": "AiBB",
"AIBK": "AIB Utility Token", "AIBK": "AIB Utility Token",
@ -213,6 +217,7 @@
"AKA": "Akroma", "AKA": "Akroma",
"AKITA": "Akita Inu", "AKITA": "Akita Inu",
"AKN": "Akoin", "AKN": "Akoin",
"AKNC": "Aave KNC v1",
"AKRO": "Akropolis", "AKRO": "Akropolis",
"AKT": "Akash Network", "AKT": "Akash Network",
"AKTIO": "AKTIO Coin", "AKTIO": "AKTIO Coin",
@ -237,12 +242,14 @@
"ALIC": "AliCoin", "ALIC": "AliCoin",
"ALICE": "My Neighbor Alice", "ALICE": "My Neighbor Alice",
"ALIEN": "AlienCoin", "ALIEN": "AlienCoin",
"ALINK": "Aave LINK v1",
"ALIS": "ALISmedia", "ALIS": "ALISmedia",
"ALITA": "Alita Network", "ALITA": "Alita Network",
"ALIX": "AlinX", "ALIX": "AlinX",
"ALKI": "Alkimi", "ALKI": "Alkimi",
"ALLBI": "ALL BEST ICO", "ALLBI": "ALL BEST ICO",
"ALLEY": "NFT Alley", "ALLEY": "NFT Alley",
"ALLIN": "All in",
"ALN": "Aluna", "ALN": "Aluna",
"ALOHA": "Aloha", "ALOHA": "Aloha",
"ALP": "Alphacon", "ALP": "Alphacon",
@ -410,12 +417,14 @@
"ARIX": "Arix", "ARIX": "Arix",
"ARK": "ARK", "ARK": "ARK",
"ARKER": "Arker", "ARKER": "Arker",
"ARKM": "Arkham",
"ARKN": "Ark Rivals", "ARKN": "Ark Rivals",
"ARM": "Armory Coin", "ARM": "Armory Coin",
"ARMOR": "ARMOR", "ARMOR": "ARMOR",
"ARMR": "ARMR", "ARMR": "ARMR",
"ARMS": "2Acoin", "ARMS": "2Acoin",
"ARNA": "ARNA Panacea", "ARNA": "ARNA Panacea",
"ARNM": "Arenum",
"ARNO": "ARNO", "ARNO": "ARNO",
"ARNX": "Aeron", "ARNX": "Aeron",
"ARNXM": "Armor NXM", "ARNXM": "Armor NXM",
@ -472,6 +481,7 @@
"ASTO": "Altered State Token", "ASTO": "Altered State Token",
"ASTON": "Aston", "ASTON": "Aston",
"ASTR": "Astar", "ASTR": "Astar",
"ASTRAFER": "Astrafer",
"ASTRAL": "Astral", "ASTRAL": "Astral",
"ASTRO": "AstroSwap", "ASTRO": "AstroSwap",
"ASTROC": "Astroport Classic", "ASTROC": "Astroport Classic",
@ -531,6 +541,7 @@
"AURY": "Aurory", "AURY": "Aurory",
"AUSCM": "Auric Network", "AUSCM": "Auric Network",
"AUSD": "Appeal dollar", "AUSD": "Appeal dollar",
"AUSDC": "Aave USDC v1",
"AUT": "Autoria", "AUT": "Autoria",
"AUTHORSHIP": "Authorship", "AUTHORSHIP": "Authorship",
"AUTO": "Auto", "AUTO": "Auto",
@ -612,6 +623,7 @@
"BACK": "DollarBack", "BACK": "DollarBack",
"BACOIN": "BACoin", "BACOIN": "BACoin",
"BACON": "BaconDAO (BACON)", "BACON": "BaconDAO (BACON)",
"BAD": "Bad Idea AI",
"BADGER": "Badger DAO", "BADGER": "Badger DAO",
"BAG": "BondAppetit", "BAG": "BondAppetit",
"BAGS": "Basis Gold Share", "BAGS": "Basis Gold Share",
@ -662,6 +674,7 @@
"BBCT": "TraDove B2BCoin", "BBCT": "TraDove B2BCoin",
"BBDT": "BBD Token", "BBDT": "BBD Token",
"BBF": "Bubblefong", "BBF": "Bubblefong",
"BBFT": "Block Busters Tech Token",
"BBG": "BigBang", "BBG": "BigBang",
"BBGC": "BigBang Game", "BBGC": "BigBang Game",
"BBI": "BelugaPay", "BBI": "BelugaPay",
@ -725,6 +738,7 @@
"BDX": "Beldex", "BDX": "Beldex",
"BDY": "Buddy DAO", "BDY": "Buddy DAO",
"BEACH": "BeachCoin", "BEACH": "BeachCoin",
"BEAI": "BeNFT Solutions",
"BEAM": "Beam", "BEAM": "Beam",
"BEAN": "BeanCash", "BEAN": "BeanCash",
"BEAST": "CryptoBeast", "BEAST": "CryptoBeast",
@ -806,6 +820,7 @@
"BIDR": "Binance IDR Stable Coin", "BIDR": "Binance IDR Stable Coin",
"BIFI": "Beefy.Finance", "BIFI": "Beefy.Finance",
"BIFIF": "BiFi", "BIFIF": "BiFi",
"BIG": "Big Eyes",
"BIGHAN": "BighanCoin", "BIGHAN": "BighanCoin",
"BIGSB": "BigShortBets", "BIGSB": "BigShortBets",
"BIGUP": "BigUp", "BIGUP": "BigUp",
@ -1090,6 +1105,7 @@
"BRNK": "Brank", "BRNK": "Brank",
"BRNX": "Bronix", "BRNX": "Bronix",
"BRO": "Bitradio", "BRO": "Bitradio",
"BROCK": "Bitrock",
"BRONZ": "BitBronze", "BRONZ": "BitBronze",
"BRT": "Bikerush", "BRT": "Bikerush",
"BRTR": "Barter", "BRTR": "Barter",
@ -1226,7 +1242,7 @@
"BULL": "Bullieverse", "BULL": "Bullieverse",
"BULLC": "BuySell", "BULLC": "BuySell",
"BULLION": "BullionFX", "BULLION": "BullionFX",
"BULLS": "BullshitCoin", "BULLS": "Bull Coin",
"BULLSH": "Bullshit Inu", "BULLSH": "Bullshit Inu",
"BUMN": "BUMooN", "BUMN": "BUMooN",
"BUMP": "Bumper", "BUMP": "Bumper",
@ -1277,6 +1293,7 @@
"BZKY": "Bizkey", "BZKY": "Bizkey",
"BZL": "BZLCoin", "BZL": "BZLCoin",
"BZNT": "Bezant", "BZNT": "Bezant",
"BZR": "Bazaars",
"BZRX": "bZx Protocol", "BZRX": "bZx Protocol",
"BZX": "Bitcoin Zero", "BZX": "Bitcoin Zero",
"BZZ": "Swarmv", "BZZ": "Swarmv",
@ -1319,8 +1336,10 @@
"CAP": "BottleCaps", "CAP": "BottleCaps",
"CAPD": "Capdax", "CAPD": "Capdax",
"CAPP": "Cappasity", "CAPP": "Cappasity",
"CAPRICOIN": "CapriCoin",
"CAPS": "Ternoa", "CAPS": "Ternoa",
"CAPT": "Bitcoin Captain", "CAPT": "Bitcoin Captain",
"CAPTAINPLANET": "Captain Planet",
"CAR": "CarBlock", "CAR": "CarBlock",
"CARAT": "Carats Token", "CARAT": "Carats Token",
"CARBON": "Carboncoin", "CARBON": "Carboncoin",
@ -1478,6 +1497,7 @@
"CHECKR": "CheckerChain", "CHECKR": "CheckerChain",
"CHECOIN": "CheCoin", "CHECOIN": "CheCoin",
"CHEDDA": "Chedda", "CHEDDA": "Chedda",
"CHEEL": "Cheelee",
"CHEESE": "CHEESE", "CHEESE": "CHEESE",
"CHEESUS": "Cheesus", "CHEESUS": "Cheesus",
"CHEQ": "CHEQD Network", "CHEQ": "CHEQD Network",
@ -1520,7 +1540,8 @@
"CHX": "Own", "CHX": "Own",
"CHY": "Concern Poverty Chain", "CHY": "Concern Poverty Chain",
"CHZ": "Chiliz", "CHZ": "Chiliz",
"CIC": "CIChain", "CIC": "Crazy Internet Coin",
"CICHAIN": "CIChain",
"CIF": "Crypto Improvement Fund", "CIF": "Crypto Improvement Fund",
"CIM": "COINCOME", "CIM": "COINCOME",
"CIN": "CinderCoin", "CIN": "CinderCoin",
@ -1630,7 +1651,6 @@
"COB": "Cobinhood", "COB": "Cobinhood",
"COC": "Coin of the champions", "COC": "Coin of the champions",
"COCK": "Shibacock", "COCK": "Shibacock",
"COCOS": "COCOS BCX",
"CODEO": "Codeo Token", "CODEO": "Codeo Token",
"CODEX": "CODEX Finance", "CODEX": "CODEX Finance",
"CODI": "Codi Finance", "CODI": "Codi Finance",
@ -1659,7 +1679,7 @@
"COLX": "ColossusCoinXT", "COLX": "ColossusCoinXT",
"COM": "Coliseum", "COM": "Coliseum",
"COMB": "Combo", "COMB": "Combo",
"COMBO": "Furucombo", "COMBO": "COMBO",
"COMFI": "CompliFi", "COMFI": "CompliFi",
"COMM": "Community Coin", "COMM": "Community Coin",
"COMMUNITYCOIN": "Community Coin", "COMMUNITYCOIN": "Community Coin",
@ -1672,7 +1692,6 @@
"CONI": "CoinBene", "CONI": "CoinBene",
"CONS": "ConSpiracy Coin", "CONS": "ConSpiracy Coin",
"CONSENTIUM": "Consentium", "CONSENTIUM": "Consentium",
"CONT": "Contentos",
"CONUN": "CONUN", "CONUN": "CONUN",
"CONV": "Convergence", "CONV": "Convergence",
"COOK": "Cook", "COOK": "Cook",
@ -1683,17 +1702,19 @@
"COPS": "Cops Finance", "COPS": "Cops Finance",
"COR": "Corion", "COR": "Corion",
"CORAL": "CoralPay", "CORAL": "CoralPay",
"CORE": "Coreum", "CORE": "Core",
"COREDAO": "coreDAO", "COREDAO": "coreDAO",
"COREG": "Core Group Asset", "COREG": "Core Group Asset",
"COREUM": "Coreum",
"CORGI": "Corgi Inu", "CORGI": "Corgi Inu",
"CORN": "CORN", "CORN": "CORN",
"CORX": "CorionX", "CORX": "CorionX",
"COS": "COS", "COS": "Contentos",
"COSHI": "CoShi Inu", "COSHI": "CoShi Inu",
"COSM": "CosmoChain", "COSM": "CosmoChain",
"COSMIC": "CosmicSwap", "COSMIC": "CosmicSwap",
"COSP": "Cosplay Token", "COSP": "Cosplay Token",
"COSS": "COS",
"COSX": "Cosmecoin", "COSX": "Cosmecoin",
"COT": "CoTrader", "COT": "CoTrader",
"COTI": "COTI", "COTI": "COTI",
@ -1729,7 +1750,7 @@
"CPOOL": "Clearpool", "CPOOL": "Clearpool",
"CPROP": "CPROP", "CPROP": "CPROP",
"CPRX": "Crypto Perx", "CPRX": "Crypto Perx",
"CPS": "CapriCoin", "CPS": "Cryptostone",
"CPT": "Cryptaur", "CPT": "Cryptaur",
"CPU": "CPUcoin", "CPU": "CPUcoin",
"CPX": "Apex Token", "CPX": "Apex Token",
@ -1796,6 +1817,7 @@
"CRTS": "Cratos", "CRTS": "Cratos",
"CRU": "Crust Network", "CRU": "Crust Network",
"CRV": "Curve DAO Token", "CRV": "Curve DAO Token",
"CRVUSD": "crvUSD",
"CRW": "Crown Coin", "CRW": "Crown Coin",
"CRWD": "CRWD Network", "CRWD": "CRWD Network",
"CRWNY": "Crowny Token", "CRWNY": "Crowny Token",
@ -1843,7 +1865,7 @@
"CTLX": "Cash Telex", "CTLX": "Cash Telex",
"CTN": "Continuum Finance", "CTN": "Continuum Finance",
"CTO": "Crypto", "CTO": "Crypto",
"CTP": "Captain Planet", "CTP": "Ctomorrow Platform",
"CTPL": "Cultiplan", "CTPL": "Cultiplan",
"CTPT": "Contents Protocol", "CTPT": "Contents Protocol",
"CTR": "Creator Platform", "CTR": "Creator Platform",
@ -2007,6 +2029,7 @@
"DBC": "DeepBrain Chain", "DBC": "DeepBrain Chain",
"DBCCOIN": "Datablockchain", "DBCCOIN": "Datablockchain",
"DBD": "Day By Day", "DBD": "Day By Day",
"DBEAR": "DBear Coin",
"DBET": "Decent.bet", "DBET": "Decent.bet",
"DBIC": "DubaiCoin", "DBIC": "DubaiCoin",
"DBIX": "DubaiCoin", "DBIX": "DubaiCoin",
@ -2058,6 +2081,7 @@
"DEEP": "DeepCloud AI", "DEEP": "DeepCloud AI",
"DEEPG": "Deep Gold", "DEEPG": "Deep Gold",
"DEEX": "DEEX", "DEEX": "DEEX",
"DEEZ": "DEEZ NUTS",
"DEFI": "Defi", "DEFI": "Defi",
"DEFI5": "DEFI Top 5 Tokens Index", "DEFI5": "DEFI Top 5 Tokens Index",
"DEFIL": "DeFIL", "DEFIL": "DeFIL",
@ -2162,11 +2186,12 @@
"DIEM": "Facebook Diem", "DIEM": "Facebook Diem",
"DIESEL": "Diesel", "DIESEL": "Diesel",
"DIFX": "Digital Financial Exchange", "DIFX": "Digital Financial Exchange",
"DIG": "Dignity", "DIG": "DIEGO",
"DIGG": "DIGG", "DIGG": "DIGG",
"DIGIC": "DigiCube", "DIGIC": "DigiCube",
"DIGIF": "DigiFel", "DIGIF": "DigiFel",
"DIGITAL": "Digital Reserve Currency", "DIGITAL": "Digital Reserve Currency",
"DIGNITY": "Dignity",
"DIGS": "Diggits", "DIGS": "Diggits",
"DIKO": "Arkadiko", "DIKO": "Arkadiko",
"DILI": "D Community", "DILI": "D Community",
@ -2246,6 +2271,7 @@
"DOGBOSS": "Dog Boss", "DOGBOSS": "Dog Boss",
"DOGDEFI": "DogDeFiCoin", "DOGDEFI": "DogDeFiCoin",
"DOGE": "Dogecoin", "DOGE": "Dogecoin",
"DOGE20": "Doge 2.0",
"DOGEBNB": "DogeBNB", "DOGEBNB": "DogeBNB",
"DOGEC": "DogeCash", "DOGEC": "DogeCash",
"DOGECEO": "Doge CEO", "DOGECEO": "Doge CEO",
@ -2539,7 +2565,7 @@
"ELONGT": "Elon GOAT", "ELONGT": "Elon GOAT",
"ELONONE": "AstroElon", "ELONONE": "AstroElon",
"ELP": "Ellerium", "ELP": "Ellerium",
"ELS": "Elysium", "ELS": "Ethlas",
"ELT": "Element Black", "ELT": "Element Black",
"ELTC2": "eLTC", "ELTC2": "eLTC",
"ELTCOIN": "ELTCOIN", "ELTCOIN": "ELTCOIN",
@ -2548,6 +2574,7 @@
"ELVN": "11Minutes", "ELVN": "11Minutes",
"ELX": "Energy Ledger", "ELX": "Energy Ledger",
"ELY": "Elysian", "ELY": "Elysian",
"ELYSIUM": "Elysium",
"EM": "Eminer", "EM": "Eminer",
"EMANATE": "EMANATE", "EMANATE": "EMANATE",
"EMAR": "EmaratCoin", "EMAR": "EmaratCoin",
@ -2559,6 +2586,7 @@
"EMC2": "Einsteinium", "EMC2": "Einsteinium",
"EMD": "Emerald", "EMD": "Emerald",
"EMIGR": "EmiratesGoldCoin", "EMIGR": "EmiratesGoldCoin",
"EML": "EML Protocol",
"EMN.CUR": "Eastman Chemical", "EMN.CUR": "Eastman Chemical",
"EMON": "Ethermon", "EMON": "Ethermon",
"EMOT": "Sentigraph.io", "EMOT": "Sentigraph.io",
@ -2692,6 +2720,7 @@
"ETHD": "Ethereum Dark", "ETHD": "Ethereum Dark",
"ETHER": "Etherparty", "ETHER": "Etherparty",
"ETHERDELTA": "EtherDelta", "ETHERDELTA": "EtherDelta",
"ETHERKING": "Ether Kingdoms Token",
"ETHERNITY": "Ethernity Chain", "ETHERNITY": "Ethernity Chain",
"ETHF": "EthereumFair", "ETHF": "EthereumFair",
"ETHIX": "EthicHub", "ETHIX": "EthicHub",
@ -2709,6 +2738,7 @@
"ETHSHIB": "Eth Shiba", "ETHSHIB": "Eth Shiba",
"ETHV": "Ethverse", "ETHV": "Ethverse",
"ETHW": "Ethereum PoW", "ETHW": "Ethereum PoW",
"ETHX": "Stader ETHx",
"ETHY": "Ethereum Yield", "ETHY": "Ethereum Yield",
"ETI": "EtherInc", "ETI": "EtherInc",
"ETK": "Energi Token", "ETK": "Energi Token",
@ -2722,7 +2752,7 @@
"ETR": "Electric Token", "ETR": "Electric Token",
"ETRNT": "Eternal Trusts", "ETRNT": "Eternal Trusts",
"ETS": "ETH Share", "ETS": "ETH Share",
"ETSC": "Ether star blockchain", "ETSC": "Ether star blockchain",
"ETT": "EncryptoTel", "ETT": "EncryptoTel",
"ETY": "Ethereum Cloud", "ETY": "Ethereum Cloud",
"ETZ": "EtherZero", "ETZ": "EtherZero",
@ -2773,6 +2803,7 @@
"EXB": "ExaByte (EXB)", "EXB": "ExaByte (EXB)",
"EXC": "Eximchain", "EXC": "Eximchain",
"EXCC": "ExchangeCoin", "EXCC": "ExchangeCoin",
"EXCHANGEN": "ExchangeN",
"EXCL": "Exclusive Coin", "EXCL": "Exclusive Coin",
"EXE": "ExeCoin", "EXE": "ExeCoin",
"EXFI": "Flare Finance", "EXFI": "Flare Finance",
@ -2781,7 +2812,7 @@
"EXLT": "ExtraLovers", "EXLT": "ExtraLovers",
"EXM": "EXMO Coin", "EXM": "EXMO Coin",
"EXMR": "EXMR FDN", "EXMR": "EXMR FDN",
"EXN": "ExchangeN", "EXN": "Exeno",
"EXO": "Exosis", "EXO": "Exosis",
"EXP": "Expanse", "EXP": "Expanse",
"EXRD": "Radix", "EXRD": "Radix",
@ -2814,6 +2845,7 @@
"FAIR": "FairCoin", "FAIR": "FairCoin",
"FAIRC": "Faireum Token", "FAIRC": "Faireum Token",
"FAIRG": "FairGame", "FAIRG": "FairGame",
"FAKE": "FAKE COIN",
"FAKT": "Medifakt", "FAKT": "Medifakt",
"FALCONS": "Falcon Swaps", "FALCONS": "Falcon Swaps",
"FAME": "Fame MMA", "FAME": "Fame MMA",
@ -2860,6 +2892,7 @@
"FDO": "Firdaos", "FDO": "Firdaos",
"FDR": "French Digital Reserve", "FDR": "French Digital Reserve",
"FDT": "Frutti Dino", "FDT": "Frutti Dino",
"FDUSD": "First Digital USD",
"FDX": "fidentiaX", "FDX": "fidentiaX",
"FDZ": "Friendz", "FDZ": "Friendz",
"FEAR": "Fear", "FEAR": "Fear",
@ -2870,6 +2903,7 @@
"FEN": "First Ever NFT", "FEN": "First Ever NFT",
"FENOMY": "Fenomy", "FENOMY": "Fenomy",
"FER": "Ferro", "FER": "Ferro",
"FERC": "FairERC20",
"FERMA": "Ferma", "FERMA": "Ferma",
"FESS": "Fesschain", "FESS": "Fesschain",
"FET": "Fetch.AI", "FET": "Fetch.AI",
@ -2931,7 +2965,7 @@
"FLASH": "Flashstake", "FLASH": "Flashstake",
"FLASHC": "FLASH coin", "FLASHC": "FLASH coin",
"FLC": "FlowChainCoin", "FLC": "FlowChainCoin",
"FLD": "FLUID", "FLD": "FluidAI",
"FLDC": "Folding Coin", "FLDC": "Folding Coin",
"FLDT": "FairyLand", "FLDT": "FairyLand",
"FLETA": "FLETA", "FLETA": "FLETA",
@ -3091,6 +3125,7 @@
"FUEL": "Jetfuel Finance", "FUEL": "Jetfuel Finance",
"FUJIN": "Fujinto", "FUJIN": "Fujinto",
"FUKU": "Furukuru", "FUKU": "Furukuru",
"FUMO": "Alien Milady Fumo",
"FUN": "FUN Token", "FUN": "FUN Token",
"FUNC": "FunCoin", "FUNC": "FunCoin",
"FUND": "Unification", "FUND": "Unification",
@ -3101,6 +3136,7 @@
"FUNDZ": "FundFantasy", "FUNDZ": "FundFantasy",
"FUNK": "Cypherfunks Coin", "FUNK": "Cypherfunks Coin",
"FUR": "Furio", "FUR": "Furio",
"FURU": "Furucombo",
"FURY": "Engines of Fury", "FURY": "Engines of Fury",
"FUS": "Fus", "FUS": "Fus",
"FUSE": "Fuse Network Token", "FUSE": "Fuse Network Token",
@ -3118,6 +3154,7 @@
"FXP": "FXPay", "FXP": "FXPay",
"FXS": "Frax Share", "FXS": "Frax Share",
"FXT": "FuzeX", "FXT": "FuzeX",
"FXY": "Floxypay",
"FYN": "Affyn", "FYN": "Affyn",
"FYP": "FlypMe", "FYP": "FlypMe",
"FYZ": "Fyooz", "FYZ": "Fyooz",
@ -3172,6 +3209,7 @@
"GAT": "GATCOIN", "GAT": "GATCOIN",
"GATE": "GATENet", "GATE": "GATENet",
"GATEWAY": "Gateway Protocol", "GATEWAY": "Gateway Protocol",
"GAYPEPE": "Gay Pepe",
"GAZE": "GazeTV", "GAZE": "GazeTV",
"GB": "GoldBlocks", "GB": "GoldBlocks",
"GBA": "Geeba", "GBA": "Geeba",
@ -3222,6 +3260,7 @@
"GEMZ": "Gemz Social", "GEMZ": "Gemz Social",
"GEN": "DAOstack", "GEN": "DAOstack",
"GENE": "Genopets", "GENE": "Genopets",
"GENIE": "The Genie",
"GENIX": "Genix", "GENIX": "Genix",
"GENS": "Genshiro", "GENS": "Genshiro",
"GENSTAKE": "Genstake", "GENSTAKE": "Genstake",
@ -3261,6 +3300,7 @@
"GHCOLD": "Galaxy Heroes Coin", "GHCOLD": "Galaxy Heroes Coin",
"GHD": "Giftedhands", "GHD": "Giftedhands",
"GHNY": "Grizzly Honey", "GHNY": "Grizzly Honey",
"GHO": "GHO",
"GHOST": "GhostbyMcAfee", "GHOST": "GhostbyMcAfee",
"GHOSTCOIN": "GhostCoin", "GHOSTCOIN": "GhostCoin",
"GHOSTM": "GhostMarket", "GHOSTM": "GhostMarket",
@ -3274,6 +3314,7 @@
"GIFT": "GiftNet", "GIFT": "GiftNet",
"GIG": "GigaCoin", "GIG": "GigaCoin",
"GIGA": "GigaSwap", "GIGA": "GigaSwap",
"GIGX": "GigXCoin",
"GIM": "Gimli", "GIM": "Gimli",
"GIMMER": "Gimmer", "GIMMER": "Gimmer",
"GIN": "GINcoin", "GIN": "GINcoin",
@ -3385,6 +3426,7 @@
"GOVT": "The Government Network", "GOVT": "The Government Network",
"GOZ": "Göztepe S.K. Fan Token", "GOZ": "Göztepe S.K. Fan Token",
"GP": "Wizards And Dragons", "GP": "Wizards And Dragons",
"GPBP": "Genius Playboy Billionaire Philanthropist",
"GPKR": "Gold Poker", "GPKR": "Gold Poker",
"GPL": "Gold Pressed Latinum", "GPL": "Gold Pressed Latinum",
"GPPT": "Pluto Project Coin", "GPPT": "Pluto Project Coin",
@ -3501,7 +3543,8 @@
"HALF": "0.5X Long Bitcoin Token", "HALF": "0.5X Long Bitcoin Token",
"HALFSHIT": "0.5X Long Shitcoin Index Token", "HALFSHIT": "0.5X Long Shitcoin Index Token",
"HALLO": "Halloween Coin", "HALLO": "Halloween Coin",
"HALO": "Halo Platform", "HALO": "Halo Coin",
"HALOPLATFORM": "Halo Platform",
"HAM": "Hamster", "HAM": "Hamster",
"HAMS": "HamsterCoin", "HAMS": "HamsterCoin",
"HANA": "Hanacoin", "HANA": "Hanacoin",
@ -3598,6 +3641,7 @@
"HILL": "President Clinton", "HILL": "President Clinton",
"HINA": "Hina Inu", "HINA": "Hina Inu",
"HINT": "Hintchain", "HINT": "Hintchain",
"HIPPO": "HIPPO",
"HIRE": "HireMatch", "HIRE": "HireMatch",
"HIT": "HitChain", "HIT": "HitChain",
"HITBTC": "HitBTC Token", "HITBTC": "HitBTC Token",
@ -3634,6 +3678,7 @@
"HNTR": "Hunter", "HNTR": "Hunter",
"HNY": "Honey", "HNY": "Honey",
"HNZO": "Hanzo Inu", "HNZO": "Hanzo Inu",
"HOBO": "HOBO THE BEAR",
"HOD": "HoDooi.com", "HOD": "HoDooi.com",
"HODL": "HOdlcoin", "HODL": "HOdlcoin",
"HOGE": "Hoge Finance", "HOGE": "Hoge Finance",
@ -3839,7 +3884,7 @@
"IMPCN": "Brain Space", "IMPCN": "Brain Space",
"IMPER": "Impermax", "IMPER": "Impermax",
"IMPS": "Impulse Coin", "IMPS": "Impulse Coin",
"IMPT": "Ether Kingdoms Token", "IMPT": "IMPT",
"IMPULSE": "IMPULSE by FDR", "IMPULSE": "IMPULSE by FDR",
"IMS": "Independent Money System", "IMS": "Independent Money System",
"IMST": "Imsmart", "IMST": "Imsmart",
@ -4001,6 +4046,7 @@
"JAM": "Tune.Fm", "JAM": "Tune.Fm",
"JANE": "JaneCoin", "JANE": "JaneCoin",
"JAR": "Jarvis+", "JAR": "Jarvis+",
"JARED": "Jared From Subway",
"JASMY": "JasmyCoin", "JASMY": "JasmyCoin",
"JBS": "JumBucks Coin", "JBS": "JumBucks Coin",
"JBX": "Juicebox", "JBX": "Juicebox",
@ -4163,9 +4209,10 @@
"KIN": "Kin", "KIN": "Kin",
"KIND": "Kind Ads", "KIND": "Kind Ads",
"KINE": "Kine Protocol", "KINE": "Kine Protocol",
"KING": "King Finance", "KING": "KING",
"KING93": "King93", "KING93": "King93",
"KINGDOMQUEST": "Kingdom Quest", "KINGDOMQUEST": "Kingdom Quest",
"KINGF": "King Finance",
"KINGSHIB": "King Shiba", "KINGSHIB": "King Shiba",
"KINGSWAP": "KingSwap", "KINGSWAP": "KingSwap",
"KINT": "Kintsugi", "KINT": "Kintsugi",
@ -4175,6 +4222,7 @@
"KISC": "Kaiser", "KISC": "Kaiser",
"KISHIMOTO": "Kishimoto Inu", "KISHIMOTO": "Kishimoto Inu",
"KISHU": "Kishu Inu", "KISHU": "Kishu Inu",
"KITA": "KITA INU",
"KITSU": "Kitsune Inu", "KITSU": "Kitsune Inu",
"KITTY": "Kitty Inu", "KITTY": "Kitty Inu",
"KKO": "Kineko", "KKO": "Kineko",
@ -4267,10 +4315,12 @@
"KUBO": "KUBO", "KUBO": "KUBO",
"KUBOS": "KubosCoin", "KUBOS": "KubosCoin",
"KUE": "Kuende", "KUE": "Kuende",
"KUJI": "Kujira",
"KUMA": "Kuma Inu", "KUMA": "Kuma Inu",
"KUNCI": "Kunci Coin", "KUNCI": "Kunci Coin",
"KUR": "Kuro", "KUR": "Kuro",
"KURT": "Kurrent", "KURT": "Kurrent",
"KUSA": "Kusa Inu",
"KUSD": "Kowala", "KUSD": "Kowala",
"KUSH": "KushCoin", "KUSH": "KushCoin",
"KUV": "Kuverit", "KUV": "Kuverit",
@ -4280,6 +4330,7 @@
"KVT": "Kinesis Velocity Token", "KVT": "Kinesis Velocity Token",
"KWATT": "4New", "KWATT": "4New",
"KWD": "KIWI DEFI", "KWD": "KIWI DEFI",
"KWENTA": "Kwenta",
"KWH": "KWHCoin", "KWH": "KWHCoin",
"KWIK": "KwikSwap", "KWIK": "KwikSwap",
"KWS": "Knight War Spirits", "KWS": "Knight War Spirits",
@ -4299,7 +4350,9 @@
"LABX": "Stakinglab", "LABX": "Stakinglab",
"LACCOIN": "LocalAgro", "LACCOIN": "LocalAgro",
"LACE": "Lovelace World", "LACE": "Lovelace World",
"LADYS": "Milady Meme Coin",
"LAEEB": "LaEeb", "LAEEB": "LaEeb",
"LAELAPS": "Laelaps",
"LAIKA": "Laika Protocol", "LAIKA": "Laika Protocol",
"LALA": "LaLa World", "LALA": "LaLa World",
"LAMB": "Lambda", "LAMB": "Lambda",
@ -4455,13 +4508,14 @@
"LLAND": "Lyfe Land", "LLAND": "Lyfe Land",
"LLG": "Loligo", "LLG": "Loligo",
"LLION": "Lydian Lion", "LLION": "Lydian Lion",
"LM": "LM Token", "LM": "LeisureMeta",
"LMAO": "LMAO Finance", "LMAO": "LMAO Finance",
"LMC": "LomoCoin", "LMC": "LomoCoin",
"LMCH": "Latamcash", "LMCH": "Latamcash",
"LMCSWAP": "LimoCoin SWAP", "LMCSWAP": "LimoCoin SWAP",
"LMR": "Lumerin", "LMR": "Lumerin",
"LMT": "Lympo Market Token", "LMT": "Lympo Market Token",
"LMTOKEN": "LM Token",
"LMXC": "LimonX", "LMXC": "LimonX",
"LMY": "Lunch Money", "LMY": "Lunch Money",
"LN": "LINK", "LN": "LINK",
@ -4530,6 +4584,7 @@
"LRG": "Largo Coin", "LRG": "Largo Coin",
"LRN": "Loopring [NEO]", "LRN": "Loopring [NEO]",
"LSD": "LightSpeedCoin", "LSD": "LightSpeedCoin",
"LSETH": "Liquid Staked ETH",
"LSK": "Lisk", "LSK": "Lisk",
"LSP": "Lumenswap", "LSP": "Lumenswap",
"LSS": "Lossless", "LSS": "Lossless",
@ -4626,6 +4681,7 @@
"MAEP": "Maester Protocol", "MAEP": "Maester Protocol",
"MAG": "Magnet", "MAG": "Magnet",
"MAGIC": "Magic", "MAGIC": "Magic",
"MAGICF": "MagicFox",
"MAHA": "MahaDAO", "MAHA": "MahaDAO",
"MAI": "Mindsync", "MAI": "Mindsync",
"MAID": "MaidSafe Coin", "MAID": "MaidSafe Coin",
@ -4639,6 +4695,7 @@
"MANDOX": "MandoX", "MANDOX": "MandoX",
"MANGA": "Manga Token", "MANGA": "Manga Token",
"MANNA": "Manna", "MANNA": "Manna",
"MANTLE": "Mantle",
"MAP": "MAP Protocol", "MAP": "MAP Protocol",
"MAPC": "MapCoin", "MAPC": "MapCoin",
"MAPE": "Mecha Morphing", "MAPE": "Mecha Morphing",
@ -4672,6 +4729,7 @@
"MATIC": "Polygon", "MATIC": "Polygon",
"MATPAD": "MaticPad", "MATPAD": "MaticPad",
"MATTER": "AntiMatter", "MATTER": "AntiMatter",
"MAV": "Maverick Protocol",
"MAX": "MaxCoin", "MAX": "MaxCoin",
"MAXR": "Max Revive", "MAXR": "Max Revive",
"MAY": "Theresa May Coin", "MAY": "Theresa May Coin",
@ -4776,6 +4834,7 @@
"MESA": "MetaVisa", "MESA": "MetaVisa",
"MESG": "MESG", "MESG": "MESG",
"MESH": "MeshBox", "MESH": "MeshBox",
"MESSI": "MESSI COIN",
"MET": "Metronome", "MET": "Metronome",
"META": "Metadium", "META": "Metadium",
"METAC": "Metacoin", "METAC": "Metacoin",
@ -4881,6 +4940,7 @@
"MIODIO": "MIODIOCOIN", "MIODIO": "MIODIOCOIN",
"MIOTA": "IOTA", "MIOTA": "IOTA",
"MIR": "Mirror Protocol", "MIR": "Mirror Protocol",
"MIRACLE": "MIRACLE",
"MIRC": "MIR COIN", "MIRC": "MIR COIN",
"MIS": "Mithril Share", "MIS": "Mithril Share",
"MISA": "Sangkara", "MISA": "Sangkara",
@ -4938,7 +4998,6 @@
"MNRB": "MoneyRebel", "MNRB": "MoneyRebel",
"MNS": "Monnos", "MNS": "Monnos",
"MNST": "MoonStarter", "MNST": "MoonStarter",
"MNT": "microNFT",
"MNTC": "Manet Coin", "MNTC": "Manet Coin",
"MNTG": "Monetas", "MNTG": "Monetas",
"MNTL": "AssetMantle", "MNTL": "AssetMantle",
@ -4967,6 +5026,7 @@
"MOF": "Molecular Future (TRC20)", "MOF": "Molecular Future (TRC20)",
"MOFI": "MobiFi", "MOFI": "MobiFi",
"MOFOLD": "Molecular Future (ERC20)", "MOFOLD": "Molecular Future (ERC20)",
"MOG": "Mog Coin",
"MOGU": "Mogu", "MOGU": "Mogu",
"MOGX": "Mogu", "MOGX": "Mogu",
"MOI": "MyOwnItem", "MOI": "MyOwnItem",
@ -4989,9 +5049,11 @@
"MONEYIMT": "MoneyToken", "MONEYIMT": "MoneyToken",
"MONF": "Monfter", "MONF": "Monfter",
"MONG": "MongCoin", "MONG": "MongCoin",
"MONG20": "Mongoose 2.0",
"MONI": "Monsta Infinite", "MONI": "Monsta Infinite",
"MONK": "Monkey Project", "MONK": "Monkey Project",
"MONKEY": "Monkey", "MONKEY": "Monkey",
"MONKEYS": "Monkeys Token",
"MONO": "MonoX", "MONO": "MonoX",
"MONONOKEINU": "Mononoke Inu", "MONONOKEINU": "Mononoke Inu",
"MONS": "Monsters Clan", "MONS": "Monsters Clan",
@ -5011,11 +5073,13 @@
"MOONSHOT": "Moonshot", "MOONSHOT": "Moonshot",
"MOOO": "Hashtagger", "MOOO": "Hashtagger",
"MOOV": "dotmoovs", "MOOV": "dotmoovs",
"MOOX": "Moox Protocol",
"MOPS": "Mops", "MOPS": "Mops",
"MORA": "Meliora", "MORA": "Meliora",
"MORE": "More Coin", "MORE": "More Coin",
"MOS": "MOS Coin", "MOS": "MOS Coin",
"MOT": "Olympus Labs", "MOT": "Olympus Labs",
"MOTG": "MetaOctagon",
"MOTI": "Motion", "MOTI": "Motion",
"MOTO": "Motocoin", "MOTO": "Motocoin",
"MOV": "MovieCoin", "MOV": "MovieCoin",
@ -5076,6 +5140,7 @@
"MSWAP": "MoneySwap", "MSWAP": "MoneySwap",
"MT": "MyToken", "MT": "MyToken",
"MTA": "Meta", "MTA": "Meta",
"MTB": "MetaBridge",
"MTBC": "Metabolic", "MTBC": "Metabolic",
"MTC": "MEDICAL TOKEN CURRENCY", "MTC": "MEDICAL TOKEN CURRENCY",
"MTCMN": "MTC Mesh", "MTCMN": "MTC Mesh",
@ -5108,6 +5173,7 @@
"MUE": "MonetaryUnit", "MUE": "MonetaryUnit",
"MULTI": "Multichain", "MULTI": "Multichain",
"MULTIBOT": "Multibot", "MULTIBOT": "Multibot",
"MULTIV": "Multiverse",
"MUN": "MUNcoin", "MUN": "MUNcoin",
"MUNCH": "Munch Token", "MUNCH": "Munch Token",
"MUSD": "mStable USD", "MUSD": "mStable USD",
@ -5648,6 +5714,7 @@
"OZP": "OZAPHYRE", "OZP": "OZAPHYRE",
"P202": "Project 202", "P202": "Project 202",
"P2PS": "P2P Solutions Foundation", "P2PS": "P2P Solutions Foundation",
"PAAL": "PAAL AI",
"PAC": "PAC Protocol", "PAC": "PAC Protocol",
"PACOCA": "Pacoca", "PACOCA": "Pacoca",
"PAD": "NearPad", "PAD": "NearPad",
@ -5736,6 +5803,7 @@
"PEARL": "Pearl Finance", "PEARL": "Pearl Finance",
"PEC": "PeaceCoin", "PEC": "PeaceCoin",
"PEEL": "Meta Apes", "PEEL": "Meta Apes",
"PEEPA": "Peepa",
"PEEPS": "The People’s Coin", "PEEPS": "The People’s Coin",
"PEG": "PegNet", "PEG": "PegNet",
"PEGS": "PegShares", "PEGS": "PegShares",
@ -5748,6 +5816,7 @@
"PEOPLE": "ConstitutionDAO", "PEOPLE": "ConstitutionDAO",
"PEOS": "pEOS", "PEOS": "pEOS",
"PEPE": "Pepe", "PEPE": "Pepe",
"PEPE20": "Pepe 2.0",
"PEPECASH": "Pepe Cash", "PEPECASH": "Pepe Cash",
"PEPPER": "Pepper Token", "PEPPER": "Pepper Token",
"PEPS": "PEPS Coin", "PEPS": "PEPS Coin",
@ -5822,6 +5891,7 @@
"PINK": "PinkCoin", "PINK": "PinkCoin",
"PINKX": "PantherCoin", "PINKX": "PantherCoin",
"PINMO": "Pinmo", "PINMO": "Pinmo",
"PINO": "Pinocchu",
"PINU": "Piccolo Inu", "PINU": "Piccolo Inu",
"PIO": "Pioneershares", "PIO": "Pioneershares",
"PIPI": "Pippi Finance", "PIPI": "Pippi Finance",
@ -5885,6 +5955,7 @@
"PLS": "Pulsechain", "PLS": "Pulsechain",
"PLSD": "PulseDogecoin", "PLSD": "PulseDogecoin",
"PLSPAD": "PulsePad", "PLSPAD": "PulsePad",
"PLSX": "PulseX",
"PLT": "Poollotto.finance", "PLT": "Poollotto.finance",
"PLTC": "PlatonCoin", "PLTC": "PlatonCoin",
"PLTX": "PlutusX", "PLTX": "PlutusX",
@ -5911,7 +5982,6 @@
"PNK": "Kleros", "PNK": "Kleros",
"PNL": "True PNL", "PNL": "True PNL",
"PNODE": "Pinknode", "PNODE": "Pinknode",
"PNP": "LogisticsX",
"PNT": "pNetwork Token", "PNT": "pNetwork Token",
"PNX": "PhantomX", "PNX": "PhantomX",
"PNY": "Peony Coin", "PNY": "Peony Coin",
@ -5927,6 +5997,7 @@
"POINTS": "Cryptsy Points", "POINTS": "Cryptsy Points",
"POK": "Pokmonsters", "POK": "Pokmonsters",
"POKEM": "Pokemonio", "POKEM": "Pokemonio",
"POKEMON": "Pokemon",
"POKER": "PokerCoin", "POKER": "PokerCoin",
"POKT": "Pocket Network", "POKT": "Pocket Network",
"POL": "Pool-X", "POL": "Pool-X",
@ -6010,6 +6081,7 @@
"PRIME": "Echelon Prime", "PRIME": "Echelon Prime",
"PRIMECHAIN": "PrimeChain", "PRIMECHAIN": "PrimeChain",
"PRINT": "Printer.Finance", "PRINT": "Printer.Finance",
"PRINTERIUM": "Printerium",
"PRINTS": "FingerprintsDAO", "PRINTS": "FingerprintsDAO",
"PRISM": "Prism", "PRISM": "Prism",
"PRIX": "Privatix", "PRIX": "Privatix",
@ -6033,7 +6105,7 @@
"PROTON": "Proton", "PROTON": "Proton",
"PROUD": "PROUD Money", "PROUD": "PROUD Money",
"PROXI": "PROXI", "PROXI": "PROXI",
"PRP": "Papyrus", "PRP": "Pepe Prime",
"PRPS": "Purpose", "PRPS": "Purpose",
"PRPT": "Purple Token", "PRPT": "Purple Token",
"PRQ": "PARSIQ", "PRQ": "PARSIQ",
@ -6042,7 +6114,7 @@
"PRTG": "Pre-Retogeum", "PRTG": "Pre-Retogeum",
"PRV": "PrivacySwap", "PRV": "PrivacySwap",
"PRVS": "Previse", "PRVS": "Previse",
"PRX": "Printerium", "PRX": "Parex",
"PRXY": "Proxy", "PRXY": "Proxy",
"PRY": "PRIMARY", "PRY": "PRIMARY",
"PSB": "Planet Sandbox", "PSB": "Planet Sandbox",
@ -6120,6 +6192,7 @@
"PYRAM": "Pyram Token", "PYRAM": "Pyram Token",
"PYRK": "Pyrk", "PYRK": "Pyrk",
"PYT": "Payther", "PYT": "Payther",
"PYUSD": "PayPal USD",
"PZM": "Prizm", "PZM": "Prizm",
"Q1S": "Quantum1Net", "Q1S": "Quantum1Net",
"Q2C": "QubitCoin", "Q2C": "QubitCoin",
@ -6178,6 +6251,7 @@
"QUA": "Quantum Tech", "QUA": "Quantum Tech",
"QUACK": "Rich Quack", "QUACK": "Rich Quack",
"QUAM": "Quam Network", "QUAM": "Quam Network",
"QUANT": "Quant Finance",
"QUARASHI": "Quarashi Network", "QUARASHI": "Quarashi Network",
"QUARTZ": "Sandclock", "QUARTZ": "Sandclock",
"QUASA": "Quasacoin", "QUASA": "Quasacoin",
@ -6201,7 +6275,7 @@
"RAC": "RAcoin", "RAC": "RAcoin",
"RACA": "Radio Caca", "RACA": "Radio Caca",
"RACEFI": "RaceFi", "RACEFI": "RaceFi",
"RAD": "Radicle", "RAD": "Radworks",
"RADAR": "DappRadar", "RADAR": "DappRadar",
"RADI": "RadicalCoin", "RADI": "RadicalCoin",
"RADIO": "RadioShack", "RADIO": "RadioShack",
@ -6220,7 +6294,7 @@
"RAM": "Ramifi Protocol", "RAM": "Ramifi Protocol",
"RAMP": "RAMP", "RAMP": "RAMP",
"RANKER": "RankerDao", "RANKER": "RankerDao",
"RAP": "Rapture", "RAP": "Philosoraptor",
"RAPDOGE": "RapDoge", "RAPDOGE": "RapDoge",
"RARE": "SuperRare", "RARE": "SuperRare",
"RARI": "Rarible", "RARI": "Rarible",
@ -6277,6 +6351,7 @@
"REA": "Realisto", "REA": "Realisto",
"REAL": "RealLink", "REAL": "RealLink",
"REALM": "Realm", "REALM": "Realm",
"REALMS": "Realms of Ethernity",
"REALPLATFORM": "REAL", "REALPLATFORM": "REAL",
"REALY": "Realy Metaverse", "REALY": "Realy Metaverse",
"REAP": "ReapChain", "REAP": "ReapChain",
@ -6287,6 +6362,7 @@
"RED": "RED TOKEN", "RED": "RED TOKEN",
"REDC": "RedCab", "REDC": "RedCab",
"REDCO": "Redcoin", "REDCO": "Redcoin",
"REDDIT": "Reddit",
"REDI": "REDi", "REDI": "REDi",
"REDLANG": "RED", "REDLANG": "RED",
"REDLC": "Redlight Chain", "REDLC": "Redlight Chain",
@ -6324,7 +6400,7 @@
"REST": "Restore", "REST": "Restore",
"RET": "RealTract", "RET": "RealTract",
"RETAIL": "Retail.Global", "RETAIL": "Retail.Global",
"RETH": "Realms of Ethernity", "RETH": "Rocket Pool ETH",
"RETH2": "rETH2", "RETH2": "rETH2",
"RETIRE": "Retire Token", "RETIRE": "Retire Token",
"REU": "REUCOIN", "REU": "REUCOIN",
@ -6351,6 +6427,7 @@
"RGP": "Rigel Protocol", "RGP": "Rigel Protocol",
"RGT": "Rari Governance Token", "RGT": "Rari Governance Token",
"RHEA": "Rhea", "RHEA": "Rhea",
"RHINO": "RHINO",
"RHOC": "RChain", "RHOC": "RChain",
"RHP": "Rhypton Club", "RHP": "Rhypton Club",
"RIC": "Riecoin", "RIC": "Riecoin",
@ -6490,6 +6567,7 @@
"RWE": "Real-World Evidence", "RWE": "Real-World Evidence",
"RWN": "Rowan Token", "RWN": "Rowan Token",
"RWS": "Robonomics Web Services", "RWS": "Robonomics Web Services",
"RXD": "Radiant",
"RXT": "RIMAUNANGIS", "RXT": "RIMAUNANGIS",
"RYC": "RoyalCoin", "RYC": "RoyalCoin",
"RYCN": "RoyalCoin 2.0", "RYCN": "RoyalCoin 2.0",
@ -6564,6 +6642,7 @@
"SBTC": "Super Bitcoin", "SBTC": "Super Bitcoin",
"SC": "Siacoin", "SC": "Siacoin",
"SCA": "SiaClassic", "SCA": "SiaClassic",
"SCAM": "Scam Coin",
"SCAP": "SafeCapital", "SCAP": "SafeCapital",
"SCAR": "Velhalla", "SCAR": "Velhalla",
"SCASH": "SpaceCash", "SCASH": "SpaceCash",
@ -6624,6 +6703,7 @@
"SEER": "SEER", "SEER": "SEER",
"SEI": "Sei", "SEI": "Sei",
"SEL": "SelenCoin", "SEL": "SelenCoin",
"SELF": "SELFCrypto",
"SEM": "Semux", "SEM": "Semux",
"SEN": "Sentaro", "SEN": "Sentaro",
"SENATE": "SENATE", "SENATE": "SENATE",
@ -6665,6 +6745,7 @@
"SGE": "Society of Galactic Exploration", "SGE": "Society of Galactic Exploration",
"SGLY": "Singularity", "SGLY": "Singularity",
"SGN": "Signals Network", "SGN": "Signals Network",
"SGO": "SafuuGO",
"SGOLD": "SpaceGold", "SGOLD": "SpaceGold",
"SGP": "SGPay", "SGP": "SGPay",
"SGR": "Sogur Currency", "SGR": "Sogur Currency",
@ -6684,6 +6765,7 @@
"SHEESH": "Sheesh it is bussin bussin", "SHEESH": "Sheesh it is bussin bussin",
"SHEESHA": "Sheesha Finance", "SHEESHA": "Sheesha Finance",
"SHELL": "Shell Token", "SHELL": "Shell Token",
"SHERA": "Shera Tokens",
"SHFL": "SHUFFLE!", "SHFL": "SHUFFLE!",
"SHFT": "Shyft Network", "SHFT": "Shyft Network",
"SHI": "Shirtum", "SHI": "Shirtum",
@ -6719,6 +6801,8 @@
"SHR": "ShareToken", "SHR": "ShareToken",
"SHREK": "ShrekCoin", "SHREK": "ShrekCoin",
"SHROOM": "Shroom.Finance", "SHROOM": "Shroom.Finance",
"SHROOMFOX": "Magic Shroom",
"SHS": "SHEESH",
"SHX": "Stronghold Token", "SHX": "Stronghold Token",
"SI": "Siren", "SI": "Siren",
"SIB": "SibCoin", "SIB": "SibCoin",
@ -7018,9 +7102,11 @@
"STEN": "Steneum Coin", "STEN": "Steneum Coin",
"STEP": "Step Finance", "STEP": "Step Finance",
"STEPH": "Step Hero", "STEPH": "Step Hero",
"STEPR": "Step",
"STEPS": "Steps", "STEPS": "Steps",
"STERLINGCOIN": "SterlingCoin", "STERLINGCOIN": "SterlingCoin",
"STETH": "Staked Ether", "STETH": "Staked Ether",
"STEWIE": "Stewie Coin",
"STEX": "STEX", "STEX": "STEX",
"STF": "Structure Finance", "STF": "Structure Finance",
"STFX": "STFX", "STFX": "STFX",
@ -7055,7 +7141,7 @@
"STR": "Sourceless", "STR": "Sourceless",
"STRAKS": "Straks", "STRAKS": "Straks",
"STRAX": "Stratis", "STRAX": "Stratis",
"STRAY": "Animal Token", "STRAY": "Stray Dog",
"STREAM": "STREAMIT COIN", "STREAM": "STREAMIT COIN",
"STRIP": "Stripto", "STRIP": "Stripto",
"STRK": "Strike", "STRK": "Strike",
@ -7361,6 +7447,7 @@
"TOM": "TOM Finance", "TOM": "TOM Finance",
"TOMAHAWKCOIN": "Tomahawkcoin", "TOMAHAWKCOIN": "Tomahawkcoin",
"TOMB": "Tomb", "TOMB": "Tomb",
"TOMI": "tomiNet",
"TOMO": "TomoChain", "TOMO": "TomoChain",
"TOMOE": "TomoChain ERC20", "TOMOE": "TomoChain ERC20",
"TOMS": "TomTomCoin", "TOMS": "TomTomCoin",
@ -7385,6 +7472,7 @@
"TOTM": "Totem", "TOTM": "Totem",
"TOWER": "Tower", "TOWER": "Tower",
"TOWN": "Town Star", "TOWN": "Town Star",
"TOX": "INTOverse",
"TOZ": "Tozex", "TOZ": "Tozex",
"TP": "Token Swap", "TP": "Token Swap",
"TPAD": "TrustPad", "TPAD": "TrustPad",
@ -7600,6 +7688,7 @@
"UNITY": "SuperNET", "UNITY": "SuperNET",
"UNIVRS": "Universe", "UNIVRS": "Universe",
"UNIX": "UniX", "UNIX": "UniX",
"UNLEASH": "UnleashClub",
"UNN": "UNION Protocol Governance Token", "UNN": "UNION Protocol Governance Token",
"UNO": "Unobtanium", "UNO": "Unobtanium",
"UNORE": "UnoRe", "UNORE": "UnoRe",
@ -7673,6 +7762,7 @@
"UTT": "United Traders Token", "UTT": "United Traders Token",
"UTU": "UTU Protocol", "UTU": "UTU Protocol",
"UUU": "U Network", "UUU": "U Network",
"UWU": "uwu",
"UZUMAKI": "Uzumaki Inu", "UZUMAKI": "Uzumaki Inu",
"VAB": "Vabble", "VAB": "Vabble",
"VADER": "Vader Protocol", "VADER": "Vader Protocol",
@ -7695,6 +7785,7 @@
"VCF": "Valencia CF Fan Token", "VCF": "Valencia CF Fan Token",
"VCG": "VCGamers", "VCG": "VCGamers",
"VCK": "28VCK", "VCK": "28VCK",
"VCORE": "VCORE",
"VDG": "VeriDocGlobal", "VDG": "VeriDocGlobal",
"VDL": "Vidulum", "VDL": "Vidulum",
"VDO": "VidioCoin", "VDO": "VidioCoin",
@ -7710,6 +7801,7 @@
"VEIL": "VEIL", "VEIL": "VEIL",
"VELA": "Vela Token", "VELA": "Vela Token",
"VELO": "Velo", "VELO": "Velo",
"VELOD": "Velodrome Finance",
"VELOX": "Velox", "VELOX": "Velox",
"VELOXPROJECT": "Velox", "VELOXPROJECT": "Velox",
"VEMP": "vEmpire DDAO", "VEMP": "vEmpire DDAO",
@ -7782,6 +7874,7 @@
"VNT": "VNT Chain", "VNT": "VNT Chain",
"VNTW": "Value Network Token", "VNTW": "Value Network Token",
"VNX": "VisionX", "VNX": "VisionX",
"VNXAU": "VNX Gold",
"VNXLU": "VNX Exchange", "VNXLU": "VNX Exchange",
"VOCO": "Provoco", "VOCO": "Provoco",
"VODKA": "Vodka Token", "VODKA": "Vodka Token",
@ -7902,7 +7995,8 @@
"WEC": "Whole Earth Coin", "WEC": "Whole Earth Coin",
"WEGEN": "WeGen Platform", "WEGEN": "WeGen Platform",
"WELD": "Weld", "WELD": "Weld",
"WELL": "Well", "WELL": "Moonwell",
"WELLTOKEN": "Well",
"WELT": "Fabwelt", "WELT": "Fabwelt",
"WELUPS": "Welups Blockchain", "WELUPS": "Welups Blockchain",
"WEMIX": "WEMIX", "WEMIX": "WEMIX",
@ -7958,6 +8052,7 @@
"WIX": "Wixlar", "WIX": "Wixlar",
"WIZ": "WIZ Protocol", "WIZ": "WIZ Protocol",
"WKD": "Wakanda Inu", "WKD": "Wakanda Inu",
"WLD": "Worldcoin",
"WLF": "Wolfs Group", "WLF": "Wolfs Group",
"WLITI": "wLITI", "WLITI": "wLITI",
"WLK": "Wolk", "WLK": "Wolk",
@ -7983,6 +8078,7 @@
"WNZ": "Winerz", "WNZ": "Winerz",
"WOA": "Wrapped Origin Axie", "WOA": "Wrapped Origin Axie",
"WOD": "World of Defish", "WOD": "World of Defish",
"WOID": "WORLD ID",
"WOJ": "Wojak Finance", "WOJ": "Wojak Finance",
"WOLF": "Insanity Coin", "WOLF": "Insanity Coin",
"WOLFILAND": "Wolfiland", "WOLFILAND": "Wolfiland",
@ -8000,6 +8096,7 @@
"WOOFY": "Woofy", "WOOFY": "Woofy",
"WOOL": "Wolf Game Wool", "WOOL": "Wolf Game Wool",
"WOONK": "Woonkly", "WOONK": "Woonkly",
"WOOO": "wooonen",
"WOOP": "Woonkly Power", "WOOP": "Woonkly Power",
"WOP": "WorldPay", "WOP": "WorldPay",
"WORLD": "World Token", "WORLD": "World Token",
@ -8010,6 +8107,7 @@
"WOZX": "Efforce", "WOZX": "Efforce",
"WPC": "WePiggy Coin", "WPC": "WePiggy Coin",
"WPE": "OPES (Wrapped PE)", "WPE": "OPES (Wrapped PE)",
"WPLS": "Wrapped Pulse",
"WPP": "Green Energy Token", "WPP": "Green Energy Token",
"WPR": "WePower", "WPR": "WePower",
"WQT": "Work Quest", "WQT": "Work Quest",
@ -8049,6 +8147,7 @@
"WZEC": "Wrapped Zcash", "WZEC": "Wrapped Zcash",
"WZENIQ": "Wrapped Zeniq (ETH)", "WZENIQ": "Wrapped Zeniq (ETH)",
"WZRD": "Wizardia", "WZRD": "Wizardia",
"X": "AI-X",
"X2": "X2Coin", "X2": "X2Coin",
"X2Y2": "X2Y2", "X2Y2": "X2Y2",
"X42": "X42 Protocol", "X42": "X42 Protocol",
@ -8096,7 +8195,7 @@
"XCI": "Cannabis Industry Coin", "XCI": "Cannabis Industry Coin",
"XCLR": "ClearCoin", "XCLR": "ClearCoin",
"XCM": "CoinMetro", "XCM": "CoinMetro",
"XCN": "Chain", "XCN": "Onyxcoin",
"XCO": "XCoin", "XCO": "XCoin",
"XCONSOL": "X-Consoles", "XCONSOL": "X-Consoles",
"XCP": "CounterParty", "XCP": "CounterParty",
@ -8365,6 +8464,7 @@
"YUANG": "Yuang Coin", "YUANG": "Yuang Coin",
"YUCJ": "Yu Coin", "YUCJ": "Yu Coin",
"YUCT": "Yucreat", "YUCT": "Yucreat",
"YUDI": "Yudi",
"YUM": "Yumerium", "YUM": "Yumerium",
"YUMMY": "Yummy", "YUMMY": "Yummy",
"YUP": "Crowdholding", "YUP": "Crowdholding",

1
apps/api/src/assets/cryptocurrencies/custom.json

@ -1,4 +1,5 @@
{ {
"CYBER24781": "CyberConnect",
"LUNA1": "Terra", "LUNA1": "Terra",
"LUNA2": "Terra", "LUNA2": "Terra",
"SGB1": "Songbird", "SGB1": "Songbird",

112
apps/api/src/assets/sitemap.xml

@ -50,6 +50,110 @@
<loc>https://ghostfol.io/de/ressourcen</loc> <loc>https://ghostfol.io/de/ressourcen</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod> <lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url> </url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-altoo</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-copilot-money</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-delta</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-divvydiary</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-exirio</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-folishare</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-getquin</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-gospatz</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-justetf</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-kubera</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-markets.sh</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-maybe-finance</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-monse</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-parqet</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-plannix</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-portfolio-dividend-tracker</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-portseido</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-projectionlab</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-seeking-alpha</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-sharesight</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-simple-portfolio</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-snowball-analytics</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-sumio</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-utluna</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-yeekatee</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url> <url>
<loc>https://ghostfol.io/de/ueber-uns</loc> <loc>https://ghostfol.io/de/ueber-uns</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod> <lastmod>${currentDate}T00:00:00+00:00</lastmod>
@ -142,6 +246,10 @@
<loc>https://ghostfol.io/en/blog/2023/07/exploring-the-path-to-fire</loc> <loc>https://ghostfol.io/en/blog/2023/07/exploring-the-path-to-fire</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod> <lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url> </url>
<url>
<loc>https://ghostfol.io/en/blog/2023/08/ghostfolio-joins-oss-friends</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url> <url>
<loc>https://ghostfol.io/en/faq</loc> <loc>https://ghostfol.io/en/faq</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod> <lastmod>${currentDate}T00:00:00+00:00</lastmod>
@ -492,6 +600,10 @@
<loc>https://ghostfol.io/nl/vaak-gestelde-vragen</loc> <loc>https://ghostfol.io/nl/vaak-gestelde-vragen</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod> <lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url> </url>
<url>
<loc>https://ghostfol.io/pt</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url> <url>
<loc>https://ghostfol.io/pt/blog</loc> <loc>https://ghostfol.io/pt/blog</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod> <lastmod>${currentDate}T00:00:00+00:00</lastmod>

4
apps/api/src/middlewares/html-template.middleware.ts

@ -71,6 +71,10 @@ const locales = {
'/en/blog/2023/07/exploring-the-path-to-fire': { '/en/blog/2023/07/exploring-the-path-to-fire': {
featureGraphicPath: 'assets/images/blog/20230701.jpg', featureGraphicPath: 'assets/images/blog/20230701.jpg',
title: `Exploring the Path to FIRE - ${titleShort}` title: `Exploring the Path to FIRE - ${titleShort}`
},
'/en/blog/2023/08/ghostfolio-joins-oss-friends': {
featureGraphicPath: 'assets/images/blog/ghostfolio-joins-oss-friends.png',
title: `Ghostfolio joins OSS Friends - ${titleShort}`
} }
}; };

10
apps/api/src/services/data-gathering/data-gathering.service.ts

@ -127,12 +127,10 @@ export class DataGatheringService {
uniqueAssets = await this.getUniqueAssets(); uniqueAssets = await this.getUniqueAssets();
} }
const assetProfiles = await this.dataProviderService.getAssetProfiles( const assetProfiles =
uniqueAssets await this.dataProviderService.getAssetProfiles(uniqueAssets);
); const symbolProfiles =
const symbolProfiles = await this.symbolProfileService.getSymbolProfiles( await this.symbolProfileService.getSymbolProfiles(uniqueAssets);
uniqueAssets
);
for (const [symbol, assetProfile] of Object.entries(assetProfiles)) { for (const [symbol, assetProfile] of Object.entries(assetProfiles)) {
const symbolMapping = symbolProfiles.find((symbolProfile) => { const symbolMapping = symbolProfiles.find((symbolProfile) => {

8
apps/api/src/services/data-provider/data-enhancer/data-enhancer.module.ts

@ -4,14 +4,18 @@ import { TrackinsightDataEnhancerService } from '@ghostfolio/api/services/data-p
import { YahooFinanceDataEnhancerService } from '@ghostfolio/api/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service'; import { YahooFinanceDataEnhancerService } from '@ghostfolio/api/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service';
import { Module } from '@nestjs/common'; import { Module } from '@nestjs/common';
import { DataEnhancerService } from './data-enhancer.service';
@Module({ @Module({
exports: [ exports: [
'DataEnhancers', DataEnhancerService,
TrackinsightDataEnhancerService, TrackinsightDataEnhancerService,
YahooFinanceDataEnhancerService YahooFinanceDataEnhancerService,
'DataEnhancers'
], ],
imports: [ConfigurationModule, CryptocurrencyModule], imports: [ConfigurationModule, CryptocurrencyModule],
providers: [ providers: [
DataEnhancerService,
TrackinsightDataEnhancerService, TrackinsightDataEnhancerService,
YahooFinanceDataEnhancerService, YahooFinanceDataEnhancerService,
{ {

44
apps/api/src/services/data-provider/data-enhancer/data-enhancer.service.ts

@ -0,0 +1,44 @@
import { DataEnhancerInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-enhancer.interface';
import { HttpException, Inject, Injectable } from '@nestjs/common';
import { Prisma } from '@prisma/client';
import { StatusCodes, getReasonPhrase } from 'http-status-codes';
@Injectable()
export class DataEnhancerService {
public constructor(
@Inject('DataEnhancers')
private readonly dataEnhancers: DataEnhancerInterface[]
) {}
public async enhance(aName: string) {
const dataEnhancer = this.dataEnhancers.find((dataEnhancer) => {
return dataEnhancer.getName() === aName;
});
if (!dataEnhancer) {
throw new HttpException(
getReasonPhrase(StatusCodes.NOT_FOUND),
StatusCodes.NOT_FOUND
);
}
try {
const assetProfile = await dataEnhancer.enhance({
response: {
assetClass: 'EQUITY',
assetSubClass: 'ETF'
},
symbol: dataEnhancer.getTestSymbol()
});
if (
(assetProfile.countries as unknown as Prisma.JsonArray)?.length > 0 &&
(assetProfile.sectors as unknown as Prisma.JsonArray)?.length > 0
) {
return true;
}
} catch {}
return false;
}
}

30
apps/api/src/services/data-provider/data-enhancer/trackinsight/trackinsight.service.ts

@ -7,7 +7,7 @@ import got from 'got';
@Injectable() @Injectable()
export class TrackinsightDataEnhancerService implements DataEnhancerInterface { export class TrackinsightDataEnhancerService implements DataEnhancerInterface {
private static baseUrl = 'https://data.trackinsight.com'; private static baseUrl = 'https://www.trackinsight.com/data-api';
private static countries = require('countries-list/dist/countries.json'); private static countries = require('countries-list/dist/countries.json');
private static countriesMapping = { private static countriesMapping = {
'Russian Federation': 'Russia' 'Russian Federation': 'Russia'
@ -33,14 +33,22 @@ export class TrackinsightDataEnhancerService implements DataEnhancerInterface {
} }
const profile = await got( const profile = await got(
`${TrackinsightDataEnhancerService.baseUrl}/data-api/funds/${symbol}.json` `${TrackinsightDataEnhancerService.baseUrl}/funds/${symbol}.json`
)
.json<any>()
.catch(() => {
return got(
`${TrackinsightDataEnhancerService.baseUrl}/funds/${symbol.split(
'.'
)?.[0]}.json`
) )
.json<any>() .json<any>()
.catch(() => { .catch(() => {
return {}; return {};
}); });
});
const isin = profile.isin?.split(';')?.[0]; const isin = profile?.isin?.split(';')?.[0];
if (isin) { if (isin) {
response.isin = isin; response.isin = isin;
@ -52,10 +60,14 @@ export class TrackinsightDataEnhancerService implements DataEnhancerInterface {
.json<any>() .json<any>()
.catch(() => { .catch(() => {
return got( return got(
`${TrackinsightDataEnhancerService.baseUrl}/holdings/${ `${TrackinsightDataEnhancerService.baseUrl}/holdings/${symbol.split(
symbol.split('.')?.[0] '.'
}.json` )?.[0]}.json`
); )
.json<any>()
.catch(() => {
return {};
});
}); });
if (holdings?.weight < 0.95) { if (holdings?.weight < 0.95) {
@ -114,4 +126,8 @@ export class TrackinsightDataEnhancerService implements DataEnhancerInterface {
public getName() { public getName() {
return 'TRACKINSIGHT'; return 'TRACKINSIGHT';
} }
public getTestSymbol() {
return 'QQQ';
}
} }

14
apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.ts

@ -7,6 +7,7 @@ import {
AssetClass, AssetClass,
AssetSubClass, AssetSubClass,
DataSource, DataSource,
Prisma,
SymbolProfile SymbolProfile
} from '@prisma/client'; } from '@prisma/client';
import { countries } from 'countries-list'; import { countries } from 'countries-list';
@ -90,15 +91,14 @@ export class YahooFinanceDataEnhancerService implements DataEnhancerInterface {
yahooSymbol = quotes[0].symbol; yahooSymbol = quotes[0].symbol;
} }
const { countries, sectors, url } = await this.getAssetProfile( const { countries, sectors, url } =
yahooSymbol await this.getAssetProfile(yahooSymbol);
);
if (countries) { if ((countries as unknown as Prisma.JsonArray)?.length > 0) {
response.countries = countries; response.countries = countries;
} }
if (sectors) { if ((sectors as unknown as Prisma.JsonArray)?.length > 0) {
response.sectors = sectors; response.sectors = sectors;
} }
@ -225,6 +225,10 @@ export class YahooFinanceDataEnhancerService implements DataEnhancerInterface {
return DataSource.YAHOO; return DataSource.YAHOO;
} }
public getTestSymbol() {
return 'AAPL';
}
public parseAssetClass({ public parseAssetClass({
quoteType, quoteType,
shortName shortName

2
apps/api/src/services/data-provider/interfaces/data-enhancer.interface.ts

@ -10,4 +10,6 @@ export interface DataEnhancerInterface {
}): Promise<Partial<SymbolProfile>>; }): Promise<Partial<SymbolProfile>>;
getName(): string; getName(): string;
getTestSymbol(): string;
} }

5
apps/api/src/services/twitter-bot/twitter-bot.service.ts

@ -65,9 +65,8 @@ export class TwitterBotService {
status += benchmarkListing; status += benchmarkListing;
} }
const { data: createdTweet } = await this.twitterClient.v2.tweet( const { data: createdTweet } =
status await this.twitterClient.v2.tweet(status);
);
Logger.log( Logger.log(
`Fear & Greed Index has been tweeted: https://twitter.com/ghostfolio_/status/${createdTweet.id}`, `Fear & Greed Index has been tweeted: https://twitter.com/ghostfolio_/status/${createdTweet.id}`,

2
apps/client/src/app/components/admin-market-data-detail/admin-market-data-detail.component.html

@ -29,7 +29,7 @@
}" }"
[title]=" [title]="
(itemByMonth.key + '-' + (i + 1 < 10 ? '0' + (i + 1) : i + 1) (itemByMonth.key + '-' + (i + 1 < 10 ? '0' + (i + 1) : i + 1)
| date : defaultDateFormat) ?? '' | date: defaultDateFormat) ?? ''
" "
(click)=" (click)="
onOpenMarketDataDetail({ onOpenMarketDataDetail({

27
apps/client/src/app/components/header/header.component.html

@ -26,7 +26,7 @@
</li> </li>
<li class="list-inline-item"> <li class="list-inline-item">
<a <a
class="d-none d-sm-block mx-1" class="d-none d-sm-block"
i18n i18n
mat-flat-button mat-flat-button
[ngClass]="{ [ngClass]="{
@ -39,7 +39,7 @@
</li> </li>
<li class="list-inline-item"> <li class="list-inline-item">
<a <a
class="d-none d-sm-block mx-1" class="d-none d-sm-block"
i18n i18n
mat-flat-button mat-flat-button
[ngClass]="{ [ngClass]="{
@ -52,7 +52,7 @@
</li> </li>
<li *ngIf="hasPermissionToAccessAdminControl" class="list-inline-item"> <li *ngIf="hasPermissionToAccessAdminControl" class="list-inline-item">
<a <a
class="d-none d-sm-block mx-1" class="d-none d-sm-block"
i18n i18n
mat-flat-button mat-flat-button
[ngClass]="{ [ngClass]="{
@ -65,7 +65,7 @@
</li> </li>
<li class="list-inline-item"> <li class="list-inline-item">
<a <a
class="d-none d-sm-block mx-1" class="d-none d-sm-block"
i18n i18n
mat-flat-button mat-flat-button
[ngClass]="{ [ngClass]="{
@ -83,7 +83,7 @@
class="list-inline-item" class="list-inline-item"
> >
<a <a
class="d-none d-sm-block mx-1" class="d-none d-sm-block"
i18n i18n
mat-flat-button mat-flat-button
[ngClass]="{ [ngClass]="{
@ -96,7 +96,7 @@
</li> </li>
<li class="list-inline-item"> <li class="list-inline-item">
<a <a
class="d-none d-sm-block mx-1" class="d-none d-sm-block"
i18n i18n
mat-flat-button mat-flat-button
[ngClass]="{ [ngClass]="{
@ -129,6 +129,7 @@
<mat-menu #accountMenu="matMenu" xPosition="before"> <mat-menu #accountMenu="matMenu" xPosition="before">
<ng-container *ngIf="user?.access?.length > 0"> <ng-container *ngIf="user?.access?.length > 0">
<button mat-menu-item (click)="impersonateAccount(null)"> <button mat-menu-item (click)="impersonateAccount(null)">
<span class="align-items-center d-flex">
<ion-icon <ion-icon
*ngIf="user?.access?.length > 0" *ngIf="user?.access?.length > 0"
class="mr-2" class="mr-2"
@ -139,12 +140,14 @@
" "
></ion-icon> ></ion-icon>
<span i18n>Me</span> <span i18n>Me</span>
</span>
</button> </button>
<button <button
*ngFor="let accessItem of user?.access" *ngFor="let accessItem of user?.access"
mat-menu-item mat-menu-item
(click)="impersonateAccount(accessItem.id)" (click)="impersonateAccount(accessItem.id)"
> >
<span class="align-items-center d-flex">
<ion-icon <ion-icon
class="mr-2" class="mr-2"
name="square-outline" name="square-outline"
@ -156,6 +159,7 @@
></ion-icon> ></ion-icon>
<span *ngIf="accessItem.alias">{{ accessItem.alias }}</span> <span *ngIf="accessItem.alias">{{ accessItem.alias }}</span>
<span *ngIf="!accessItem.alias" i18n>User</span> <span *ngIf="!accessItem.alias" i18n>User</span>
</span>
</button> </button>
<hr class="m-0" /> <hr class="m-0" />
</ng-container> </ng-container>
@ -256,7 +260,7 @@
<ul class="alig-items-center d-flex list-inline m-0"> <ul class="alig-items-center d-flex list-inline m-0">
<li class="list-inline-item"> <li class="list-inline-item">
<a <a
class="d-none d-sm-block mx-1" class="d-none d-sm-block"
i18n i18n
mat-flat-button mat-flat-button
[ngClass]="{ [ngClass]="{
@ -269,7 +273,7 @@
</li> </li>
<li class="list-inline-item"> <li class="list-inline-item">
<a <a
class="d-none d-sm-block mx-1" class="d-none d-sm-block"
i18n i18n
mat-flat-button mat-flat-button
[ngClass]="{ [ngClass]="{
@ -282,6 +286,7 @@
</li> </li>
<li *ngIf="hasPermissionForSubscription" class="list-inline-item"> <li *ngIf="hasPermissionForSubscription" class="list-inline-item">
<a <a
class="d-sm-block"
i18n i18n
mat-flat-button mat-flat-button
[ngClass]="{ [ngClass]="{
@ -297,7 +302,7 @@
class="list-inline-item" class="list-inline-item"
> >
<a <a
class="d-none d-sm-block mx-1" class="d-none d-sm-block"
i18n i18n
mat-flat-button mat-flat-button
[ngClass]="{ [ngClass]="{
@ -317,13 +322,13 @@
></a> ></a>
</li> </li>
<li class="list-inline-item"> <li class="list-inline-item">
<button class="mx-1" mat-flat-button (click)="openLoginDialog()"> <button class="d-sm-block" mat-flat-button (click)="openLoginDialog()">
<ng-container i18n>Sign in</ng-container> <ng-container i18n>Sign in</ng-container>
</button> </button>
</li> </li>
<li <li
*ngIf="currentRoute !== 'register' && hasPermissionToCreateUser" *ngIf="currentRoute !== 'register' && hasPermissionToCreateUser"
class="list-inline-item" class="list-inline-item ml-1"
> >
<a <a
class="d-none d-sm-block" class="d-none d-sm-block"

8
apps/client/src/app/components/header/header.component.scss

@ -7,8 +7,8 @@
.mat-toolbar { .mat-toolbar {
background-color: var(--light-background); background-color: var(--light-background);
.spacer { .list-inline-item {
flex: 1 1 auto; margin: 0;
} }
.mdc-button { .mdc-button {
@ -24,6 +24,10 @@
font-size: 1.5rem; font-size: 1.5rem;
} }
} }
.spacer {
flex: 1 1 auto;
}
} }
} }

5
apps/client/src/app/pages/about/about-page-routing.module.ts

@ -1,10 +1,11 @@
import * as path from 'path';
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router'; import { RouterModule, Routes } from '@angular/router';
import { paths } from '@ghostfolio/client/app-routing.module';
import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; import { AuthGuard } from '@ghostfolio/client/core/auth.guard';
import { AboutPageComponent } from './about-page.component'; import { AboutPageComponent } from './about-page.component';
import { paths } from '@ghostfolio/client/app-routing.module';
import * as path from 'path';
const routes: Routes = [ const routes: Routes = [
{ {

128
apps/client/src/app/pages/about/oss-friends/oss-friends-page.component.ts

@ -1,6 +1,8 @@
import { Component, OnDestroy } from '@angular/core'; import { Component, OnDestroy } from '@angular/core';
import { Subject } from 'rxjs'; import { Subject } from 'rxjs';
const ossFriends = require('../../../../assets/oss-friends.json');
@Component({ @Component({
host: { class: 'page' }, host: { class: 'page' },
selector: 'gf-oss-friends-page', selector: 'gf-oss-friends-page',
@ -8,131 +10,7 @@ import { Subject } from 'rxjs';
templateUrl: './oss-friends-page.html' templateUrl: './oss-friends-page.html'
}) })
export class OpenSourceSoftwareFriendsPageComponent implements OnDestroy { export class OpenSourceSoftwareFriendsPageComponent implements OnDestroy {
public ossFriends = [ public ossFriends = ossFriends.data;
{
description: 'Build custom software on top of your data.',
name: 'Appsmith',
url: 'https://www.appsmith.com'
},
{
description:
'BoxyHQ’s suite of APIs for security and privacy helps engineering teams build and ship compliant cloud applications faster.',
name: 'BoxyHQ',
url: 'https://boxyhq.com'
},
{
description:
'Cal.com is a scheduling tool that helps you schedule meetings without the back-and-forth emails.',
name: 'Cal.com',
url: 'https://cal.com'
},
{
description:
'Centralize community, product, and customer data to understand which companies are engaging with your open source project.',
name: 'Crowd.dev',
url: 'https://www.crowd.dev'
},
{
description:
'The Open-Source DocuSign Alternative. We aim to earn your trust by enabling you to self-host the platform and examine its inner workings.',
name: 'Documenso',
url: 'https://documenso.com'
},
{
description:
'The Open-Source HubSpot Alternative. A single XOS enables to create unique and life-changing experiences ​​that work for all types of business.',
name: 'Erxes',
url: 'https://erxes.io'
},
{
description:
'Survey granular user segments at any point in the user journey. Gather up to 6x more insights with targeted micro-surveys. All open-source.',
name: 'Formbricks',
url: 'https://formbricks.com'
},
{
description:
'GitWonk is an open-source technical documentation tool, designed and built focusing on the developer experience.',
name: 'GitWonk',
url: 'https://gitwonk.com'
},
{
description:
'Open-source authentication and user management for the passkey era. Integrated in minutes, for web and mobile apps.',
name: 'Hanko',
url: 'https://www.hanko.io'
},
{
description:
'HTMX is a dependency-free JavaScript library that allows you to access AJAX, CSS Transitions, WebSockets, and Server Sent Events directly in HTML.',
name: 'HTMX',
url: 'https://htmx.org'
},
{
description:
'Open source, end-to-end encrypted platform that lets you securely manage secrets and configs across your team, devices, and infrastructure.',
name: 'Infisical',
url: 'https://infisical.com'
},
{
description:
'Mockoon is the easiest and quickest way to design and run mock REST APIs.',
name: 'Mockoon',
url: 'https://mockoon.com'
},
{
description:
'The open-source notification infrastructure for developers. Simple components and APIs for managing all communication channels in one place.',
name: 'Novu',
url: 'https://novu.co'
},
{
description:
'Democratizing investment research through an open source financial ecosystem. The OpenBB Terminal allows everyone to perform investment research, from everywhere.',
name: 'OpenBB',
url: 'https://openbb.co'
},
{
description:
'Sniffnet is a network monitoring tool to help you easily keep track of your Internet traffic.',
name: 'Sniffnet',
url: 'https://www.sniffnet.net'
},
{
description: 'Software localization from A to Z made really easy.',
name: 'Tolgee',
url: 'https://tolgee.io'
},
{
description:
'Create long-running Jobs directly in your codebase with features like API integrations, webhooks, scheduling and delays.',
name: 'Trigger.dev',
url: 'https://trigger.dev'
},
{
description:
'Typebot gives you powerful blocks to create unique chat experiences. Embed them anywhere on your apps and start collecting results like magic.',
name: 'Typebot',
url: 'https://typebot.io'
},
{
description:
'A modern CRM offering the flexibility of open-source, advanced features and sleek design.',
name: 'Twenty',
url: 'https://twenty.com'
},
{
description:
'Open-source enterprise-grade serverless CMS. Own your data. Scale effortlessly. Customize everything.',
name: 'Webiny',
url: 'https://www.webiny.com'
},
{
description: 'Webstudio is an open source alternative to Webflow',
name: 'Webstudio',
url: 'https://webstudio.is'
}
];
private unsubscribeSubject = new Subject<void>(); private unsubscribeSubject = new Subject<void>();

15
apps/client/src/app/pages/about/oss-friends/oss-friends-page.html

@ -14,26 +14,27 @@
*ngFor="let ossFriend of ossFriends" *ngFor="let ossFriend of ossFriends"
class="col-xs-12 col-md-4 mb-3" class="col-xs-12 col-md-4 mb-3"
> >
<a target="_blank" [href]="ossFriend.href">
<mat-card appearance="outlined" class="d-flex flex-column h-100"> <mat-card appearance="outlined" class="d-flex flex-column h-100">
<mat-card-header> <mat-card-header>
<mat-card-title class="h4" <mat-card-title class="h4">{{ ossFriend.name }}</mat-card-title>
><a target="_blank" [href]="ossFriend.url"
>{{ ossFriend.name }}</a
></mat-card-title
>
</mat-card-header> </mat-card-header>
<mat-card-content class="flex-grow-1"> <mat-card-content class="flex-grow-1">
<p>{{ ossFriend.description }}</p> <p>{{ ossFriend.description }}</p>
</mat-card-content> </mat-card-content>
<mat-card-actions class="justify-content-end"> <mat-card-actions class="justify-content-end">
<a mat-button target="_blank" [href]="ossFriend.url"> <a mat-button target="_blank" [href]="ossFriend.href">
<span <span
><ng-container i18n>Visit</ng-container> {{ ossFriend.name ><ng-container i18n>Visit</ng-container> {{ ossFriend.name
}}</span }}</span
><ion-icon class="ml-1" name="arrow-forward-outline"></ion-icon> ><ion-icon
class="ml-1"
name="arrow-forward-outline"
></ion-icon>
</a> </a>
</mat-card-actions> </mat-card-actions>
</mat-card> </mat-card>
</a>
</div> </div>
</div> </div>
</div> </div>

4
apps/client/src/app/pages/about/oss-friends/oss-friends-page.module.ts

@ -1,10 +1,10 @@
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { MatButtonModule } from '@angular/material/button';
import { MatCardModule } from '@angular/material/card';
import { OpenSourceSoftwareFriendsPageRoutingModule } from './oss-friends-page-routing.module'; import { OpenSourceSoftwareFriendsPageRoutingModule } from './oss-friends-page-routing.module';
import { OpenSourceSoftwareFriendsPageComponent } from './oss-friends-page.component'; import { OpenSourceSoftwareFriendsPageComponent } from './oss-friends-page.component';
import { MatCardModule } from '@angular/material/card';
import { MatButtonModule } from '@angular/material/button';
@NgModule({ @NgModule({
declarations: [OpenSourceSoftwareFriendsPageComponent], declarations: [OpenSourceSoftwareFriendsPageComponent],

6
apps/client/src/app/pages/about/oss-friends/oss-friends-page.scss

@ -1,3 +1,9 @@
:host { :host {
display: block; display: block;
.mat-mdc-card {
&:hover {
border-color: var(--gf-theme-primary-500);
}
}
} }

2
apps/client/src/app/pages/blog/2023/07/exploring-the-path-to-fire/exploring-the-path-to-fire-page.html

@ -10,7 +10,7 @@
<div class="mb-3 text-muted"><small>2023-07-01</small></div> <div class="mb-3 text-muted"><small>2023-07-01</small></div>
<img <img
alt="Exploring the Path to Financial Independence and Retiring Early (FIRE) Teaser" alt="Exploring the Path to Financial Independence and Retiring Early (FIRE) Teaser"
class="border rounded w-100" class="rounded w-100"
src="../assets/images/blog/20230701.jpg" src="../assets/images/blog/20230701.jpg"
title="Exploring the Path to Financial Independence and Retiring Early (FIRE)" title="Exploring the Path to Financial Independence and Retiring Early (FIRE)"
/> />

14
apps/client/src/app/pages/blog/2023/08/ghostfolio-joins-oss-friends/ghostfolio-joins-oss-friends-page.component.ts

@ -0,0 +1,14 @@
import { Component } from '@angular/core';
import { MatButtonModule } from '@angular/material/button';
import { RouterModule } from '@angular/router';
@Component({
host: { class: 'page' },
imports: [MatButtonModule, RouterModule],
selector: 'gf-ghostfolio-joins-oss-friends-page',
standalone: true,
templateUrl: './ghostfolio-joins-oss-friends-page.html'
})
export class GhostfolioJoinsOssFriendsPageComponent {
public routerLinkAboutOssFriends = ['/' + $localize`about`, 'oss-friends'];
}

167
apps/client/src/app/pages/blog/2023/08/ghostfolio-joins-oss-friends/ghostfolio-joins-oss-friends-page.html

@ -0,0 +1,167 @@
<div class="blog container">
<div class="row">
<div class="col-md-8 offset-md-2">
<article>
<div class="mb-4 text-center">
<h1 class="mb-1">Ghostfolio joins OSS Friends</h1>
<div class="mb-3 text-muted"><small>2023-08-23</small></div>
<img
alt="Ghostfolio joins OSS Friends Teaser"
class="rounded w-100"
src="../assets/images/blog/ghostfolio-joins-oss-friends.png"
title="Ghostfolio joins OSS Friends"
/>
</div>
<section class="mb-4">
<p>
We are excited to announce that Ghostfolio is now part of the
<a [routerLink]="routerLinkAboutOssFriends">OSS Friends</a>. This
new initiative is all about helping open source projects grow and
become more popular.
</p>
</section>
<section class="mb-4">
<h2 class="h4">The Story of OSS Friends</h2>
<p>
OSS Friends started as a simple
<a
href="https://twitter.com/formbricks/status/1660735970281508878"
target="_blank"
>post</a
>
on X (formerly known as <i>Twitter</i>). The idea came from
<a href="https://formbricks.com" target="_blank">Formbricks</a>, an
open source experience management platform to create surveys in
minutes, and is all about giving open source projects a boost.
</p>
<p>
If you are excited about the OSS Friends movement and want to bring
your own open source project along, just take a moment to fill out
<a
href="https://app.formbricks.com/s/clhys1p9r001cpr0hu65rwh17"
target="_blank"
>this form</a
>. Let’s work and learn together – all the open source way.
</p>
</section>
<section class="mb-4">
<h2 class="h4">
Ghostfolio – Next Generation Software for your Personal Finances
</h2>
<p>
Money management can be tricky, especially when you have various
investments like cryptocurrencies, ETFs and stocks in your
portfolio. But guess what? There are cooler ways than staring at
boring spreadsheets. Say hello to Ghostfolio, a privacy-first, open
source dashboard for your personal finances.
</p>
</section>
<section class="mb-4 py-3">
<h2 class="h4 mb-0 text-center">
Would you like to simplify asset tracking?
</h2>
<p class="lead mb-2 text-center">
Ghostfolio empowers you to make informed investment decisions.
</p>
<div class="text-center">
<a color="primary" href="https://ghostfol.io" mat-flat-button>
Get Started
</a>
</div>
</section>
<section class="mb-4">
<ul class="list-inline">
<li class="list-inline-item">
<span class="badge badge-light">Asset</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Collaboration</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Cryptocurrency</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Community</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Dashboard</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">ETF</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Finance</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Fintech</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Ghostfolio</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Initiative</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Innovation</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Investment</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Open Source</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">OSS</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">OSS Friends</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Personal Finance</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Platform</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Portfolio</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Privacy</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Software</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Stock</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Technology</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Tracking</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Wealth Management</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Web3</span>
</li>
</ul>
</section>
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a i18n [routerLink]="['/blog']">Blog</a>
</li>
<li
aria-current="page"
class="active breadcrumb-item text-truncate"
>
Ghostfolio joins OSS Friends
</li>
</ol>
</nav>
</article>
</div>
</div>
</div>

9
apps/client/src/app/pages/blog/blog-page-routing.module.ts

@ -136,6 +136,15 @@ const routes: Routes = [
'./2023/07/exploring-the-path-to-fire/exploring-the-path-to-fire-page.component' './2023/07/exploring-the-path-to-fire/exploring-the-path-to-fire-page.component'
).then((c) => c.ExploringThePathToFirePageComponent), ).then((c) => c.ExploringThePathToFirePageComponent),
title: 'Exploring the Path to FIRE' title: 'Exploring the Path to FIRE'
},
{
canActivate: [AuthGuard],
path: '2023/08/ghostfolio-joins-oss-friends',
loadComponent: () =>
import(
'./2023/08/ghostfolio-joins-oss-friends/ghostfolio-joins-oss-friends-page.component'
).then((c) => c.GhostfolioJoinsOssFriendsPageComponent),
title: 'Ghostfolio joins OSS Friends'
} }
]; ];

26
apps/client/src/app/pages/blog/blog-page.html

@ -8,6 +8,32 @@
finance</small finance</small
> >
</h1> </h1>
<mat-card appearance="outlined" class="mb-3">
<mat-card-content>
<div class="container p-0">
<div class="flex-nowrap no-gutters row">
<a
class="d-flex overflow-hidden w-100"
href="../en/blog/2023/08/ghostfolio-joins-oss-friends"
>
<div class="flex-grow-1 overflow-hidden">
<div class="h6 m-0 text-truncate">
Ghostfolio joins OSS Friends
</div>
<div class="d-flex text-muted">2023-08-23</div>
</div>
<div class="align-items-center d-flex">
<ion-icon
class="chevron text-muted"
name="chevron-forward-outline"
size="small"
></ion-icon>
</div>
</a>
</div>
</div>
</mat-card-content>
</mat-card>
<mat-card appearance="outlined" class="mb-3"> <mat-card appearance="outlined" class="mb-3">
<mat-card-content> <mat-card-content>
<div class="container p-0"> <div class="container p-0">

8
apps/client/src/app/pages/landing/landing-page.html

@ -134,6 +134,14 @@
title="DEV Community - A constructive and inclusive social network for software developers" title="DEV Community - A constructive and inclusive social network for software developers"
></a> ></a>
</div> </div>
<div class="col-md-3 d-flex justify-content-center my-1">
<a
class="d-block logo logo-hacker-news mask"
href="https://news.ycombinator.com"
target="_blank"
title="Hacker News"
></a>
</div>
<div class="col-md-3 d-flex justify-content-center my-1"> <div class="col-md-3 d-flex justify-content-center my-1">
<a <a
class="d-block logo logo-openstartup" class="d-block logo logo-openstartup"

5
apps/client/src/app/pages/landing/landing-page.scss

@ -53,6 +53,10 @@
mask-image: url('/assets/images/logo-dev-community.svg'); mask-image: url('/assets/images/logo-dev-community.svg');
} }
&.logo-hacker-news {
mask-image: url('/assets/images/logo-hacker-news.svg');
}
&.logo-openstartup { &.logo-openstartup {
background-image: url('/assets/images/logo-openstartup.png'); background-image: url('/assets/images/logo-openstartup.png');
background-position: center; background-position: center;
@ -128,6 +132,7 @@
&.logo-agplv3, &.logo-agplv3,
&.logo-alternative-to, &.logo-alternative-to,
&.logo-dev-community, &.logo-dev-community,
&.logo-hacker-news,
&.logo-privacy-tools, &.logo-privacy-tools,
&.logo-reddit, &.logo-reddit,
&.logo-sackgeld, &.logo-sackgeld,

4
apps/client/src/app/pages/open/open-page.html

@ -32,6 +32,7 @@
<div class="col-xs-12 col-md-4 my-2"> <div class="col-xs-12 col-md-4 my-2">
<gf-value <gf-value
i18n i18n
i18n-subLabel
size="large" size="large"
subLabel="(Last 24 hours)" subLabel="(Last 24 hours)"
[locale]="user?.settings?.locale" [locale]="user?.settings?.locale"
@ -42,6 +43,7 @@
<div class="col-xs-12 col-md-4 my-2"> <div class="col-xs-12 col-md-4 my-2">
<gf-value <gf-value
i18n i18n
i18n-subLabel
size="large" size="large"
subLabel="(Last 30 days)" subLabel="(Last 30 days)"
[locale]="user?.settings?.locale" [locale]="user?.settings?.locale"
@ -52,6 +54,7 @@
<div class="col-xs-12 col-md-4 my-2"> <div class="col-xs-12 col-md-4 my-2">
<gf-value <gf-value
i18n i18n
i18n-subLabel
size="large" size="large"
subLabel="(Last 30 days)" subLabel="(Last 30 days)"
[locale]="user?.settings?.locale" [locale]="user?.settings?.locale"
@ -119,6 +122,7 @@
<a class="d-block" href="https://status.ghostfol.io"> <a class="d-block" href="https://status.ghostfol.io">
<gf-value <gf-value
i18n i18n
i18n-subLabel
size="large" size="large"
subLabel="(Last 90 days)" subLabel="(Last 90 days)"
[isPercent]="true" [isPercent]="true"

2
apps/client/src/app/pages/pricing/pricing-page.html

@ -329,7 +329,7 @@
>{{ baseCurrency }}&nbsp;<strong >{{ baseCurrency }}&nbsp;<strong
>{{ price }}</strong >{{ price }}</strong
></ng-container ></ng-container
>&nbsp;<span>per year</span></span >&nbsp;<span i18n>per year</span></span
> >
</p> </p>
<div <div

4
apps/client/src/app/pages/register/register-page.component.ts

@ -4,7 +4,6 @@ import { Router } from '@angular/router';
import { DataService } from '@ghostfolio/client/services/data.service'; import { DataService } from '@ghostfolio/client/services/data.service';
import { InternetIdentityService } from '@ghostfolio/client/services/internet-identity.service'; import { InternetIdentityService } from '@ghostfolio/client/services/internet-identity.service';
import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service'; import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service';
import { UserService } from '@ghostfolio/client/services/user/user.service';
import { InfoItem, LineChartItem } from '@ghostfolio/common/interfaces'; import { InfoItem, LineChartItem } from '@ghostfolio/common/interfaces';
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { Role } from '@prisma/client'; import { Role } from '@prisma/client';
@ -36,8 +35,7 @@ export class RegisterPageComponent implements OnDestroy, OnInit {
private dialog: MatDialog, private dialog: MatDialog,
private internetIdentityService: InternetIdentityService, private internetIdentityService: InternetIdentityService,
private router: Router, private router: Router,
private tokenStorageService: TokenStorageService, private tokenStorageService: TokenStorageService
private userService: UserService
) { ) {
this.info = this.dataService.fetchInfo(); this.info = this.dataService.fetchInfo();

1
apps/client/src/app/pages/register/register-page.html

@ -28,6 +28,7 @@
<ng-container *ngIf="hasPermissionForSocialLogin"> <ng-container *ngIf="hasPermissionForSocialLogin">
<div class="my-3 text-muted" i18n>or</div> <div class="my-3 text-muted" i18n>or</div>
<button <button
*ngIf="false"
class="d-block mb-2 px-4 rounded-pill" class="d-block mb-2 px-4 rounded-pill"
mat-stroked-button mat-stroked-button
(click)="onLoginWithInternetIdentity()" (click)="onLoginWithInternetIdentity()"

2
apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page-routing.module.ts

@ -19,7 +19,7 @@ const routes: Routes = [
.map(({ component, key, name }) => { .map(({ component, key, name }) => {
return { return {
canActivate: [AuthGuard], canActivate: [AuthGuard],
path: `open-source-alternative-to-${key}`, path: $localize`open-source-alternative-to` + `-${key}`,
loadComponent: () => loadComponent: () =>
import(`./products/${key}-page.component`).then(() => component), import(`./products/${key}-page.component`).then(() => component),
title: $localize`Open Source Alternative to ${name}` title: $localize`Open Source Alternative to ${name}`

1
apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.component.ts

@ -10,6 +10,7 @@ import { products } from './products';
templateUrl: './personal-finance-tools-page.html' templateUrl: './personal-finance-tools-page.html'
}) })
export class PersonalFinanceToolsPageComponent implements OnDestroy { export class PersonalFinanceToolsPageComponent implements OnDestroy {
public pathAlternativeTo = $localize`open-source-alternative-to` + '-';
public pathResources = '/' + $localize`resources`; public pathResources = '/' + $localize`resources`;
public products = products.filter(({ key }) => { public products = products.filter(({ key }) => {
return key !== 'ghostfolio'; return key !== 'ghostfolio';

2
apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html

@ -29,7 +29,7 @@
<a <a
class="d-flex overflow-hidden w-100" class="d-flex overflow-hidden w-100"
title="Compare Ghostfolio to {{ product.name }}" title="Compare Ghostfolio to {{ product.name }}"
[routerLink]="[pathResources, 'personal-finance-tools', 'open-source-alternative-to-' + product.key]" [routerLink]="[pathResources, 'personal-finance-tools', pathAlternativeTo + product.key]"
> >
<div class="flex-grow-1 overflow-hidden"> <div class="flex-grow-1 overflow-hidden">
<div class="h6 m-0 text-truncate" i18n> <div class="h6 m-0 text-truncate" i18n>

16
apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html

@ -10,7 +10,7 @@
</h1> </h1>
</div> </div>
<section class="mb-4"> <section class="mb-4">
<p> <p i18n>
Are you looking for an open source alternative to {{ product2.name Are you looking for an open source alternative to {{ product2.name
}}? <a [routerLink]="routerLinkAbout">Ghostfolio</a> is a powerful }}? <a [routerLink]="routerLinkAbout">Ghostfolio</a> is a powerful
portfolio management tool that provides individuals with a portfolio management tool that provides individuals with a
@ -23,7 +23,7 @@
to help you make informed decisions and take control of your to help you make informed decisions and take control of your
financial future. financial future.
</p> </p>
<p> <p i18n>
Ghostfolio is an open source software (OSS), providing a Ghostfolio is an open source software (OSS), providing a
cost-effective alternative to {{ product2.name }} making it cost-effective alternative to {{ product2.name }} making it
particularly suitable for individuals on a tight budget, such as particularly suitable for individuals on a tight budget, such as
@ -34,7 +34,7 @@
and personal finance enthusiasts, Ghostfolio continuously enhances and personal finance enthusiasts, Ghostfolio continuously enhances
its capabilities, security, and user experience. its capabilities, security, and user experience.
</p> </p>
<p> <p i18n>
Let’s dive deeper into the detailed comparison table below to gain a Let’s dive deeper into the detailed comparison table below to gain a
thorough understanding of how Ghostfolio positions itself relative thorough understanding of how Ghostfolio positions itself relative
to {{ product2.name }}. We will explore various aspects such as to {{ product2.name }}. We will explore various aspects such as
@ -177,11 +177,11 @@
</tr> </tr>
<tr class="mat-mdc-row"> <tr class="mat-mdc-row">
<td class="mat-mdc-cell px-3 py-2 text-right" i18n>Pricing</td> <td class="mat-mdc-cell px-3 py-2 text-right" i18n>Pricing</td>
<td class="mat-mdc-cell px-1 py-2"> <td class="mat-mdc-cell px-1 py-2" i18n>
Starting from {{ product1.pricingPerYear }} / year Starting from {{ product1.pricingPerYear }} / year
</td> </td>
<td class="mat-mdc-cell px-1 py-2"> <td class="mat-mdc-cell px-1 py-2">
<ng-container *ngIf="product2.pricingPerYear" <ng-container *ngIf="product2.pricingPerYear" i18n
>Starting from {{ product2.pricingPerYear }} / >Starting from {{ product2.pricingPerYear }} /
year</ng-container year</ng-container
> >
@ -196,7 +196,7 @@
</table> </table>
</section> </section>
<section class="mb-4"> <section class="mb-4">
<p> <p i18n>
Please note that the information provided is based on our Please note that the information provided is based on our
independent research and analysis. This website is not affiliated independent research and analysis. This website is not affiliated
with {{ product2.name }} or any other product mentioned in the with {{ product2.name }} or any other product mentioned in the
@ -208,7 +208,7 @@
</p> </p>
</section> </section>
<section class="call-to-action mb-4 py-3 rounded"> <section class="call-to-action mb-4 py-3 rounded">
<h2 class="h4 mb-0 text-center"> <h2 class="h4 mb-0 text-center" i18n>
Ready to take your <strong>investments</strong> to the Ready to take your <strong>investments</strong> to the
<strong>next level</strong>? <strong>next level</strong>?
</h2> </h2>
@ -217,7 +217,7 @@
Ghostfolio. Ghostfolio.
</p> </p>
<div class="text-center"> <div class="text-center">
<a color="primary" href="https://ghostfol.io" mat-flat-button> <a color="primary" href="https://ghostfol.io" i18n mat-flat-button>
Get Started Get Started
</a> </a>
</div> </div>

82
apps/client/src/app/pages/resources/personal-finance-tools/products.ts

@ -35,18 +35,18 @@ export const products: Product[] = [
isOpenSource: true, isOpenSource: true,
key: 'ghostfolio', key: 'ghostfolio',
languages: [ languages: [
'Dutch', 'Deutsch',
'English', 'English',
'French', 'Español',
'German', 'Français',
'Italian', 'Italiano',
'Portuguese', 'Nederlands',
'Spanish' 'Português'
], ],
name: 'Ghostfolio', name: 'Ghostfolio',
origin: 'Switzerland', origin: $localize`Switzerland`,
pricingPerYear: '$19', pricingPerYear: '$19',
region: 'Global', region: $localize`Global`,
slogan: 'Open Source Wealth Management', slogan: 'Open Source Wealth Management',
useAnonymously: true useAnonymously: true
}, },
@ -57,7 +57,7 @@ export const products: Product[] = [
isOpenSource: false, isOpenSource: false,
key: 'altoo', key: 'altoo',
name: 'Altoo Wealth Platform', name: 'Altoo Wealth Platform',
origin: 'Switzerland', origin: $localize`Switzerland`,
slogan: 'Simplicity for Complex Wealth' slogan: 'Simplicity for Complex Wealth'
}, },
{ {
@ -68,7 +68,7 @@ export const products: Product[] = [
isOpenSource: false, isOpenSource: false,
key: 'copilot-money', key: 'copilot-money',
name: 'Copilot Money', name: 'Copilot Money',
origin: 'United States', origin: $localize`United States`,
pricingPerYear: '$70', pricingPerYear: '$70',
slogan: 'Do money better with Copilot' slogan: 'Do money better with Copilot'
}, },
@ -81,7 +81,7 @@ export const products: Product[] = [
key: 'delta', key: 'delta',
name: 'Delta Investment Tracker', name: 'Delta Investment Tracker',
note: 'Acquired by eToro', note: 'Acquired by eToro',
origin: 'Belgium', origin: $localize`Belgium`,
slogan: 'The app to track all your investments. Make smart moves only.' slogan: 'The app to track all your investments. Make smart moves only.'
}, },
{ {
@ -91,9 +91,9 @@ export const products: Product[] = [
hasSelfHostingAbility: false, hasSelfHostingAbility: false,
isOpenSource: false, isOpenSource: false,
key: 'divvydiary', key: 'divvydiary',
languages: ['English', 'German'], languages: ['Deutsch', 'English'],
name: 'DivvyDiary', name: 'DivvyDiary',
origin: 'Germany', origin: $localize`Germany`,
pricingPerYear: '€65', pricingPerYear: '€65',
slogan: 'Your personal Dividend Calendar' slogan: 'Your personal Dividend Calendar'
}, },
@ -105,7 +105,7 @@ export const products: Product[] = [
isOpenSource: false, isOpenSource: false,
key: 'exirio', key: 'exirio',
name: 'Exirio', name: 'Exirio',
origin: 'United States', origin: $localize`United States`,
pricingPerYear: '$100', pricingPerYear: '$100',
slogan: 'All your wealth, in one place.' slogan: 'All your wealth, in one place.'
}, },
@ -115,9 +115,9 @@ export const products: Product[] = [
hasSelfHostingAbility: false, hasSelfHostingAbility: false,
isOpenSource: false, isOpenSource: false,
key: 'folishare', key: 'folishare',
languages: ['English', 'German'], languages: ['Deutsch', 'English'],
name: 'folishare', name: 'folishare',
origin: 'Austria', origin: $localize`Austria`,
pricingPerYear: '$65', pricingPerYear: '$65',
slogan: 'Take control over your investments' slogan: 'Take control over your investments'
}, },
@ -128,9 +128,9 @@ export const products: Product[] = [
hasSelfHostingAbility: false, hasSelfHostingAbility: false,
isOpenSource: false, isOpenSource: false,
key: 'getquin', key: 'getquin',
languages: ['English', 'German'], languages: ['Deutsch', 'English'],
name: 'getquin', name: 'getquin',
origin: 'Germany', origin: $localize`Germany`,
pricingPerYear: '€48', pricingPerYear: '€48',
slogan: 'Portfolio Tracker, Analysis & Community' slogan: 'Portfolio Tracker, Analysis & Community'
}, },
@ -141,7 +141,7 @@ export const products: Product[] = [
isOpenSource: false, isOpenSource: false,
key: 'gospatz', key: 'gospatz',
name: 'goSPATZ', name: 'goSPATZ',
origin: 'Germany', origin: $localize`Germany`,
slogan: 'Volle Kontrolle über deine Investitionen' slogan: 'Volle Kontrolle über deine Investitionen'
}, },
{ {
@ -152,7 +152,7 @@ export const products: Product[] = [
isOpenSource: false, isOpenSource: false,
key: 'justetf', key: 'justetf',
name: 'justETF', name: 'justETF',
origin: 'Germany', origin: $localize`Germany`,
pricingPerYear: '€119', pricingPerYear: '€119',
slogan: 'ETF portfolios made simple' slogan: 'ETF portfolios made simple'
}, },
@ -164,7 +164,7 @@ export const products: Product[] = [
isOpenSource: false, isOpenSource: false,
key: 'kubera', key: 'kubera',
name: 'Kubera®', name: 'Kubera®',
origin: 'United States', origin: $localize`United States`,
pricingPerYear: '$150', pricingPerYear: '$150',
slogan: 'The Time Machine for your Net Worth' slogan: 'The Time Machine for your Net Worth'
}, },
@ -177,9 +177,9 @@ export const products: Product[] = [
key: 'markets.sh', key: 'markets.sh',
languages: ['English'], languages: ['English'],
name: 'markets.sh', name: 'markets.sh',
origin: 'Germany', origin: $localize`Germany`,
pricingPerYear: '€168', pricingPerYear: '€168',
region: 'Global', region: $localize`Global`,
slogan: 'Track your investments' slogan: 'Track your investments'
}, },
{ {
@ -191,9 +191,9 @@ export const products: Product[] = [
languages: ['English'], languages: ['English'],
name: 'Maybe Finance', name: 'Maybe Finance',
note: 'Sunset in 2023', note: 'Sunset in 2023',
origin: 'United States', origin: $localize`United States`,
pricingPerYear: '$145', pricingPerYear: '$145',
region: 'United States', region: $localize`United States`,
slogan: 'Your financial future, in your control' slogan: 'Your financial future, in your control'
}, },
{ {
@ -215,7 +215,7 @@ export const products: Product[] = [
key: 'parqet', key: 'parqet',
name: 'Parqet', name: 'Parqet',
note: 'Originally named as Tresor One', note: 'Originally named as Tresor One',
origin: 'Germany', origin: $localize`Germany`,
pricingPerYear: '€88', pricingPerYear: '€88',
region: 'Austria, Germany, Switzerland', region: 'Austria, Germany, Switzerland',
slogan: 'Dein Vermögen immer im Blick' slogan: 'Dein Vermögen immer im Blick'
@ -227,7 +227,7 @@ export const products: Product[] = [
isOpenSource: false, isOpenSource: false,
key: 'plannix', key: 'plannix',
name: 'Plannix', name: 'Plannix',
origin: 'Italy', origin: $localize`Italy`,
slogan: 'Your Personal Finance Hub' slogan: 'Your Personal Finance Hub'
}, },
{ {
@ -236,9 +236,9 @@ export const products: Product[] = [
hasSelfHostingAbility: false, hasSelfHostingAbility: false,
isOpenSource: false, isOpenSource: false,
key: 'portfolio-dividend-tracker', key: 'portfolio-dividend-tracker',
languages: ['English', 'Dutch'], languages: ['English', 'Nederlands'],
name: 'Portfolio Dividend Tracker', name: 'Portfolio Dividend Tracker',
origin: 'Netherlands', origin: $localize`Netherlands`,
pricingPerYear: '€60', pricingPerYear: '€60',
slogan: 'Manage all your portfolios' slogan: 'Manage all your portfolios'
}, },
@ -249,9 +249,9 @@ export const products: Product[] = [
hasSelfHostingAbility: false, hasSelfHostingAbility: false,
isOpenSource: false, isOpenSource: false,
key: 'portseido', key: 'portseido',
languages: ['Dutch', 'English', 'French', 'German'], languages: ['Deutsch', 'English', 'Français', 'Nederlands'],
name: 'Portseido', name: 'Portseido',
origin: 'Thailand', origin: $localize`Thailand`,
pricingPerYear: '$96', pricingPerYear: '$96',
slogan: 'Portfolio Performance and Dividend Tracker' slogan: 'Portfolio Performance and Dividend Tracker'
}, },
@ -263,7 +263,7 @@ export const products: Product[] = [
isOpenSource: false, isOpenSource: false,
key: 'projectionlab', key: 'projectionlab',
name: 'ProjectionLab', name: 'ProjectionLab',
origin: 'United States', origin: $localize`United States`,
pricingPerYear: '$108', pricingPerYear: '$108',
slogan: 'Build Financial Plans You Love.' slogan: 'Build Financial Plans You Love.'
}, },
@ -275,7 +275,7 @@ export const products: Product[] = [
isOpenSource: false, isOpenSource: false,
key: 'seeking-alpha', key: 'seeking-alpha',
name: 'Seeking Alpha', name: 'Seeking Alpha',
origin: 'United States', origin: $localize`United States`,
pricingPerYear: '$239', pricingPerYear: '$239',
slogan: 'Stock Market Analysis & Tools for Investors' slogan: 'Stock Market Analysis & Tools for Investors'
}, },
@ -287,9 +287,9 @@ export const products: Product[] = [
isOpenSource: false, isOpenSource: false,
key: 'sharesight', key: 'sharesight',
name: 'Sharesight', name: 'Sharesight',
origin: 'New Zealand', origin: $localize`New Zealand`,
pricingPerYear: '$135', pricingPerYear: '$135',
region: 'Global', region: $localize`Global`,
slogan: 'Stock Portfolio Tracker' slogan: 'Stock Portfolio Tracker'
}, },
{ {
@ -299,7 +299,7 @@ export const products: Product[] = [
isOpenSource: false, isOpenSource: false,
key: 'simple-portfolio', key: 'simple-portfolio',
name: 'Simple Portfolio', name: 'Simple Portfolio',
origin: 'Czech Republic', origin: $localize`Czech Republic`,
pricingPerYear: '€80', pricingPerYear: '€80',
slogan: 'Stock Portfolio Tracker' slogan: 'Stock Portfolio Tracker'
}, },
@ -322,7 +322,7 @@ export const products: Product[] = [
isOpenSource: false, isOpenSource: false,
key: 'sumio', key: 'sumio',
name: 'Sumio', name: 'Sumio',
origin: 'Czech Republic', origin: $localize`Czech Republic`,
pricingPerYear: '$20', pricingPerYear: '$20',
slogan: 'Sum up and build your wealth.' slogan: 'Sum up and build your wealth.'
}, },
@ -332,9 +332,9 @@ export const products: Product[] = [
hasSelfHostingAbility: false, hasSelfHostingAbility: false,
isOpenSource: false, isOpenSource: false,
key: 'utluna', key: 'utluna',
languages: ['English', 'French', 'German'], languages: ['Deutsch', 'English', 'Français'],
name: 'Utluna', name: 'Utluna',
origin: 'Switzerland', origin: $localize`Switzerland`,
pricingPerYear: '$300', pricingPerYear: '$300',
slogan: 'Your Portfolio. Revealed.', slogan: 'Your Portfolio. Revealed.',
useAnonymously: true useAnonymously: true
@ -346,8 +346,8 @@ export const products: Product[] = [
isOpenSource: false, isOpenSource: false,
key: 'yeekatee', key: 'yeekatee',
name: 'yeekatee', name: 'yeekatee',
origin: 'Switzerland', origin: $localize`Switzerland`,
region: 'Switzerland', region: $localize`Switzerland`,
slogan: 'Connect. Share. Invest.' slogan: 'Connect. Share. Invest.'
} }
]; ];

5
apps/client/src/app/services/page-title.strategy.ts

@ -6,6 +6,7 @@ import { RouterStateSnapshot, TitleStrategy } from '@angular/router';
export class PageTitleStrategy extends TitleStrategy { export class PageTitleStrategy extends TitleStrategy {
private static readonly DEFAULT_TITLE = private static readonly DEFAULT_TITLE =
'Ghostfolio – Open Source Wealth Management Software'; 'Ghostfolio – Open Source Wealth Management Software';
private static readonly DEFAULT_TITLE_SHORT = 'Ghostfolio';
public constructor(private readonly title: Title) { public constructor(private readonly title: Title) {
super(); super();
@ -15,7 +16,9 @@ export class PageTitleStrategy extends TitleStrategy {
const title = this.buildTitle(routerState); const title = this.buildTitle(routerState);
if (title) { if (title) {
this.title.setTitle(`${title}${PageTitleStrategy.DEFAULT_TITLE}`); this.title.setTitle(
`${title}${PageTitleStrategy.DEFAULT_TITLE_SHORT}`
);
} else { } else {
this.title.setTitle(`${PageTitleStrategy.DEFAULT_TITLE}`); this.title.setTitle(`${PageTitleStrategy.DEFAULT_TITLE}`);
} }

BIN
apps/client/src/assets/images/blog/ghostfolio-joins-oss-friends.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

3
apps/client/src/assets/images/logo-hacker-news.svg

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="256px" height="256px">
<path d="M 1 1 L 1 14 L 14 14 L 14 1 Z M 2 2 L 13 2 L 13 13 L 2 13 Z M 4.644531 4 L 7 8.125 L 7 11 L 8 11 L 8 8.140625 L 10.367188 4 L 9.21875 4 L 7.507813 6.992188 L 5.796875 4 Z"/>
</svg>

After

Width:  |  Height:  |  Size: 282 B

126
apps/client/src/assets/oss-friends.json

@ -0,0 +1,126 @@
{
"createdAt": "2023-09-02T07:02:24.422Z",
"data": [
{
"name": "Appsmith",
"description": "Build build custom software on top of your data.",
"href": "https://www.appsmith.com"
},
{
"name": "BoxyHQ",
"description": "BoxyHQ’s suite of APIs for security and privacy helps engineering teams build and ship compliant cloud applications faster.",
"href": "https://boxyhq.com"
},
{
"name": "Cal.com",
"description": "Cal.com is a scheduling tool that helps you schedule meetings without the back-and-forth emails.",
"href": "https://cal.com"
},
{
"name": "Crowd.dev",
"description": "Centralize community, product, and customer data to understand which companies are engaging with your open source project.",
"href": "https://www.crowd.dev"
},
{
"name": "Documenso",
"description": "The Open-Source DocuSign Alternative. We aim to earn your trust by enabling you to self-host the platform and examine its inner workings.",
"href": "https://documenso.com"
},
{
"name": "Erxes",
"description": "The Open-Source HubSpot Alternative. A single XOS enables to create unique and life-changing experiences that work for all types of business.",
"href": "https://erxes.io"
},
{
"name": "Formbricks",
"description": "Survey granular user segments at any point in the user journey. Gather up to 6x more insights with targeted micro-surveys. All open-source.",
"href": "https://formbricks.com"
},
{
"name": "Ghostfolio",
"description": "Ghostfolio is a privacy-first, open source dashboard for your personal finances. Designed to simplify asset tracking and empower informed investment decisions.",
"href": "https://ghostfol.io"
},
{
"name": "GitWonk",
"description": "GitWonk is an open-source technical documentation tool, designed and built focusing on the developer experience.",
"href": "https://gitwonk.com"
},
{
"name": "Hanko",
"description": "Open-source authentication and user management for the passkey era. Integrated in minutes, for web and mobile apps.",
"href": "https://www.hanko.io"
},
{
"name": "HTMX",
"description": "HTMX is a dependency-free JavaScript library that allows you to access AJAX, CSS Transitions, WebSockets, and Server Sent Events directly in HTML.",
"href": "https://htmx.org"
},
{
"name": "Infisical",
"description": "Open source, end-to-end encrypted platform that lets you securely manage secrets and configs across your team, devices, and infrastructure.",
"href": "https://infisical.com"
},
{
"name": "Mockoon",
"description": "Mockoon is the easiest and quickest way to design and run mock REST APIs.",
"href": "https://mockoon.com"
},
{
"name": "Novu",
"description": "The open-source notification infrastructure for developers. Simple components and APIs for managing all communication channels in one place.",
"href": "https://novu.co"
},
{
"name": "OpenBB",
"description": "Democratizing investment research through an open source financial ecosystem. The OpenBB Terminal allows everyone to perform investment research, from everywhere.",
"href": "https://openbb.co"
},
{
"name": "Rivet",
"description": "Open-source solution to deploy, scale, and operate your multiplayer game.",
"href": "https://rivet.gg"
},
{
"name": "Sniffnet",
"description": "Sniffnet is a network monitoring tool to help you easily keep track of your Internet traffic.",
"href": "https://www.sniffnet.net"
},
{
"name": "Tolgee",
"description": "Software localization from A to Z made really easy.",
"href": "https://tolgee.io"
},
{
"name": "Trigger.dev",
"description": "Create long-running Jobs directly in your codebase with features like API integrations, webhooks, scheduling and delays.",
"href": "https://trigger.dev"
},
{
"name": "Typebot",
"description": "Typebot gives you powerful blocks to create unique chat experiences. Embed them anywhere on your apps and start collecting results like magic.",
"href": "https://typebot.io"
},
{
"name": "Twenty",
"description": "A modern CRM offering the flexibility of open-source, advanced features and sleek design.",
"href": "https://twenty.com"
},
{
"name": "Webiny",
"description": "Open-source enterprise-grade serverless CMS. Own your data. Scale effortlessly. Customize everything.",
"href": "https://www.webiny.com"
},
{
"name": "Webstudio",
"description": "Webstudio is an open source alternative to Webflow",
"href": "https://webstudio.is"
},
{
"name": "Spark.NET",
"description": "The .NET Web Framework for Makers. Build production ready, full-stack web applications fast without sweating the small stuff.",
"href": "https://spark-framework.net"
}
],
"source": "https://formbricks.com/api/oss-friends"
}

2
apps/client/src/index.html

@ -1,4 +1,4 @@
<!DOCTYPE html> <!doctype html>
<html class="h-100 position-relative" lang="${languageCode}"> <html class="h-100 position-relative" lang="${languageCode}">
<head> <head>
<title>${title}</title> <title>${title}</title>

1218
apps/client/src/locales/messages.de.xlf

File diff suppressed because it is too large

1218
apps/client/src/locales/messages.es.xlf

File diff suppressed because it is too large

1218
apps/client/src/locales/messages.fr.xlf

File diff suppressed because it is too large

1218
apps/client/src/locales/messages.it.xlf

File diff suppressed because it is too large

1218
apps/client/src/locales/messages.nl.xlf

File diff suppressed because it is too large

1218
apps/client/src/locales/messages.pt.xlf

File diff suppressed because it is too large

1195
apps/client/src/locales/messages.xlf

File diff suppressed because it is too large

8
docker/docker-compose.build.yml

@ -1,4 +1,4 @@
version: '3.7' version: '3.9'
services: services:
ghostfolio: ghostfolio:
build: ../ build: ../
@ -7,7 +7,7 @@ services:
environment: environment:
DATABASE_URL: postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}?connect_timeout=300&sslmode=prefer DATABASE_URL: postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}?connect_timeout=300&sslmode=prefer
NODE_ENV: production NODE_ENV: production
REDIS_HOST: 'redis' REDIS_HOST: redis
REDIS_PASSWORD: ${REDIS_PASSWORD} REDIS_PASSWORD: ${REDIS_PASSWORD}
ports: ports:
- 3333:3333 - 3333:3333
@ -16,7 +16,6 @@ services:
condition: service_healthy condition: service_healthy
redis: redis:
condition: service_healthy condition: service_healthy
postgres: postgres:
image: postgres:12 image: postgres:12
env_file: env_file:
@ -28,9 +27,8 @@ services:
retries: 5 retries: 5
volumes: volumes:
- postgres:/var/lib/postgresql/data - postgres:/var/lib/postgresql/data
redis: redis:
image: 'redis:alpine' image: redis:alpine
healthcheck: healthcheck:
test: ['CMD-SHELL', 'redis-cli ping | grep PONG'] test: ['CMD-SHELL', 'redis-cli ping | grep PONG']
interval: 10s interval: 10s

5
docker/docker-compose.dev.yml

@ -1,4 +1,4 @@
version: '3.7' version: '3.9'
services: services:
postgres: postgres:
image: postgres:12 image: postgres:12
@ -10,9 +10,8 @@ services:
- 5432:5432 - 5432:5432
volumes: volumes:
- postgres:/var/lib/postgresql/data - postgres:/var/lib/postgresql/data
redis: redis:
image: 'redis:alpine' image: redis:alpine
container_name: redis container_name: redis
restart: unless-stopped restart: unless-stopped
ports: ports:

8
docker/docker-compose.yml

@ -1,4 +1,4 @@
version: '3.7' version: '3.9'
services: services:
ghostfolio: ghostfolio:
image: ghostfolio/ghostfolio:latest image: ghostfolio/ghostfolio:latest
@ -7,7 +7,7 @@ services:
environment: environment:
DATABASE_URL: postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}?connect_timeout=300&sslmode=prefer DATABASE_URL: postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}?connect_timeout=300&sslmode=prefer
NODE_ENV: production NODE_ENV: production
REDIS_HOST: 'redis' REDIS_HOST: redis
REDIS_PASSWORD: ${REDIS_PASSWORD} REDIS_PASSWORD: ${REDIS_PASSWORD}
ports: ports:
- 3333:3333 - 3333:3333
@ -16,7 +16,6 @@ services:
condition: service_healthy condition: service_healthy
redis: redis:
condition: service_healthy condition: service_healthy
postgres: postgres:
image: postgres:12 image: postgres:12
env_file: env_file:
@ -28,9 +27,8 @@ services:
retries: 5 retries: 5
volumes: volumes:
- postgres:/var/lib/postgresql/data - postgres:/var/lib/postgresql/data
redis: redis:
image: 'redis:alpine' image: redis:alpine
healthcheck: healthcheck:
test: ['CMD-SHELL', 'redis-cli ping | grep PONG'] test: ['CMD-SHELL', 'redis-cli ping | grep PONG']
interval: 10s interval: 10s

2
libs/ui/.storybook/preview-head.html

@ -1,6 +1,6 @@
<script <script
type="module"
src="https://unpkg.com/ionicons@5.5.1/dist/ionicons/ionicons.esm.js" src="https://unpkg.com/ionicons@5.5.1/dist/ionicons/ionicons.esm.js"
type="module"
></script> ></script>
<script <script
nomodule nomodule

2
libs/ui/src/lib/activities-table/activities-table.component.html

@ -145,7 +145,7 @@
</th> </th>
<td *matCellDef="let element" class="px-1" mat-cell> <td *matCellDef="let element" class="px-1" mat-cell>
<div class="d-flex"> <div class="d-flex">
{{ element.date | date : defaultDateFormat }} {{ element.date | date: defaultDateFormat }}
</div> </div>
</td> </td>
<td *matFooterCellDef class="px-1" i18n mat-footer-cell>Total</td> <td *matFooterCellDef class="px-1" i18n mat-footer-cell>Total</td>

2
libs/ui/src/lib/fire-calculator/fire-calculator.component.html

@ -33,7 +33,7 @@
<div> <div>
{{ {{
calculatorForm.controls['retirementDate'].value calculatorForm.controls['retirementDate'].value
| date : 'MMMM YYYY' | date: 'MMMM YYYY'
}} }}
</div> </div>
<input <input

40
package.json

@ -1,6 +1,6 @@
{ {
"name": "ghostfolio", "name": "ghostfolio",
"version": "1.302.0", "version": "1.305.0",
"homepage": "https://ghostfol.io", "homepage": "https://ghostfol.io",
"license": "AGPL-3.0", "license": "AGPL-3.0",
"repository": "https://github.com/ghostfolio/ghostfolio", "repository": "https://github.com/ghostfolio/ghostfolio",
@ -34,7 +34,7 @@
"format:write": "nx format:write", "format:write": "nx format:write",
"help": "nx help", "help": "nx help",
"import-sort": "import-sort --write '{apps,libs}/**/*.ts'", "import-sort": "import-sort --write '{apps,libs}/**/*.ts'",
"lint": "nx workspace-lint && ng lint", "lint": "nx lint",
"ng": "nx", "ng": "nx",
"nx": "nx", "nx": "nx",
"postinstall": "prisma generate", "postinstall": "prisma generate",
@ -81,7 +81,7 @@
"@nestjs/platform-express": "10.1.3", "@nestjs/platform-express": "10.1.3",
"@nestjs/schedule": "3.0.2", "@nestjs/schedule": "3.0.2",
"@nestjs/serve-static": "4.0.0", "@nestjs/serve-static": "4.0.0",
"@prisma/client": "4.16.2", "@prisma/client": "5.2.0",
"@simplewebauthn/browser": "5.2.1", "@simplewebauthn/browser": "5.2.1",
"@simplewebauthn/server": "5.2.1", "@simplewebauthn/server": "5.2.1",
"@stripe/stripe-js": "1.47.0", "@stripe/stripe-js": "1.47.0",
@ -122,14 +122,14 @@
"passport": "0.6.0", "passport": "0.6.0",
"passport-google-oauth20": "2.0.0", "passport-google-oauth20": "2.0.0",
"passport-jwt": "4.0.0", "passport-jwt": "4.0.0",
"prisma": "4.16.2", "prisma": "5.2.0",
"reflect-metadata": "0.1.13", "reflect-metadata": "0.1.13",
"rxjs": "7.5.6", "rxjs": "7.5.6",
"stripe": "11.12.0", "stripe": "11.12.0",
"svgmap": "2.6.0", "svgmap": "2.6.0",
"twitter-api-v2": "1.14.2", "twitter-api-v2": "1.14.2",
"uuid": "9.0.0", "uuid": "9.0.0",
"yahoo-finance2": "2.4.3", "yahoo-finance2": "2.4.4",
"zone.js": "0.13.1" "zone.js": "0.13.1"
}, },
"devDependencies": { "devDependencies": {
@ -146,16 +146,16 @@
"@angular/pwa": "16.2.0", "@angular/pwa": "16.2.0",
"@nestjs/schematics": "10.0.1", "@nestjs/schematics": "10.0.1",
"@nestjs/testing": "10.1.3", "@nestjs/testing": "10.1.3",
"@nx/angular": "16.7.2", "@nx/angular": "16.7.4",
"@nx/cypress": "16.7.2", "@nx/cypress": "16.7.4",
"@nx/eslint-plugin": "16.7.2", "@nx/eslint-plugin": "16.7.4",
"@nx/jest": "16.7.2", "@nx/jest": "16.7.4",
"@nx/js": "16.7.2", "@nx/js": "16.7.4",
"@nx/nest": "16.7.2", "@nx/nest": "16.7.4",
"@nx/node": "16.7.2", "@nx/node": "16.7.4",
"@nx/storybook": "16.7.2", "@nx/storybook": "16.7.4",
"@nx/web": "16.7.2", "@nx/web": "16.7.4",
"@nx/workspace": "16.7.2", "@nx/workspace": "16.7.4",
"@schematics/angular": "16.2.0", "@schematics/angular": "16.2.0",
"@simplewebauthn/typescript-types": "5.2.1", "@simplewebauthn/typescript-types": "5.2.1",
"@storybook/addon-essentials": "7.3.2", "@storybook/addon-essentials": "7.3.2",
@ -187,13 +187,13 @@
"jest": "29.4.3", "jest": "29.4.3",
"jest-environment-jsdom": "29.4.3", "jest-environment-jsdom": "29.4.3",
"jest-preset-angular": "13.1.1", "jest-preset-angular": "13.1.1",
"nx": "16.7.2", "nx": "16.7.4",
"nx-cloud": "16.4.0-beta.1", "nx-cloud": "16.3.0",
"prettier": "2.8.4", "prettier": "3.0.2",
"prettier-plugin-organize-attributes": "0.0.5", "prettier-plugin-organize-attributes": "1.0.0",
"react": "18.2.0", "react": "18.2.0",
"react-dom": "18.2.0", "react-dom": "18.2.0",
"replace-in-file": "6.3.5", "replace-in-file": "7.0.1",
"storybook": "7.0.9", "storybook": "7.0.9",
"ts-jest": "29.1.0", "ts-jest": "29.1.0",
"ts-node": "10.9.1", "ts-node": "10.9.1",

586
yarn.lock

@ -3825,112 +3825,112 @@
read-package-json-fast "^3.0.0" read-package-json-fast "^3.0.0"
which "^3.0.0" which "^3.0.0"
"@nrwl/angular@16.7.2": "@nrwl/angular@16.7.4":
version "16.7.2" version "16.7.4"
resolved "https://registry.yarnpkg.com/@nrwl/angular/-/angular-16.7.2.tgz#11661914c5eb8c6ba3618fee5af5b5072e8a730c" resolved "https://registry.yarnpkg.com/@nrwl/angular/-/angular-16.7.4.tgz#0f348b6f77109ecbb3bab90987fb850f772e2b52"
integrity sha512-qL0zkVtMopyWSXh1XFunG7z9hzg46Me3CplMCaE8nHfACg7qhfybwWhZ9NQZQVm4CXWcKJpJ6NJDi9wZyrMqbA== integrity sha512-Qj6QEKounpRB6XR4YM/LN5Vq2chesw+5Xec8BMTyAzFoBYfty2EvmikOyT/cszHMVNwE3veDh6cZP7IHWxc2dg==
dependencies: dependencies:
"@nx/angular" "16.7.2" "@nx/angular" "16.7.4"
tslib "^2.3.0" tslib "^2.3.0"
"@nrwl/cypress@16.7.2": "@nrwl/cypress@16.7.4":
version "16.7.2" version "16.7.4"
resolved "https://registry.yarnpkg.com/@nrwl/cypress/-/cypress-16.7.2.tgz#49fc75b0aaa736e2401d1dcaf81ffd191882956f" resolved "https://registry.yarnpkg.com/@nrwl/cypress/-/cypress-16.7.4.tgz#63e1d0fe0f54b67c6bc046fa43bd28859f4619de"
integrity sha512-QAjvfTD/NuBhkciIc0EXttOPzKDwba8VdXFGO9xxMtsq9X9AN9xUHA5ZZStMtP/dnS1qi/BD6vG5d/h1g+c2sw== integrity sha512-FmpCWrBIpoS0MsrMlusSBF7Wr8N6v8nbDpo8M8Bl8a6mGZu3lLnJ1ZnhYtCzwEoK0EnEQLGv76TwagRDhjVvmA==
dependencies: dependencies:
"@nx/cypress" "16.7.2" "@nx/cypress" "16.7.4"
"@nrwl/devkit@16.7.2": "@nrwl/devkit@16.7.4":
version "16.7.2" version "16.7.4"
resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-16.7.2.tgz#2aad677797c594c42138ce7dea960d35e4a82997" resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-16.7.4.tgz#c69e3ae4455447dc3a0cc5515c149692aadba940"
integrity sha512-xJIQFtmPoLFWX5gKl6QOGMzXjn+TZPkTMv5pQ12y2StpuGa3T2n8m7TnHPHGAk43ayiPDcDD97cZ75Fue+mK/w== integrity sha512-Gt2q3cqDWzGP1woavGIo4bl8g9YaXic/Xfsl7qPq0LHJedLj49p1vXetB0wawkavSE2MTyo7yDh6YDK/38XoLw==
dependencies: dependencies:
"@nx/devkit" "16.7.2" "@nx/devkit" "16.7.4"
"@nrwl/eslint-plugin-nx@16.7.2": "@nrwl/eslint-plugin-nx@16.7.4":
version "16.7.2" version "16.7.4"
resolved "https://registry.yarnpkg.com/@nrwl/eslint-plugin-nx/-/eslint-plugin-nx-16.7.2.tgz#6b65fdc3fef24bb6fb2a64a04ddcb7035a86536a" resolved "https://registry.yarnpkg.com/@nrwl/eslint-plugin-nx/-/eslint-plugin-nx-16.7.4.tgz#2719debd24db6829908e63d8f22527122f289034"
integrity sha512-NS6TZ08Q0uY6YdNXZRwgwTzlNN3sedfGfibSrbUrPZIxnpBUvI9h+1SNkWNwMu9cGpq6ZrAoSaXUyXGWvC7YFw== integrity sha512-/qN/Gn0f+7fxmxLO/mSacous3fkBXCeauKKIeJQl6uSi1aVhV/u4BddNK+d2zn5WNN/xBI+xZThM+DYJMsiXjA==
dependencies: dependencies:
"@nx/eslint-plugin" "16.7.2" "@nx/eslint-plugin" "16.7.4"
"@nrwl/jest@16.7.2": "@nrwl/jest@16.7.4":
version "16.7.2" version "16.7.4"
resolved "https://registry.yarnpkg.com/@nrwl/jest/-/jest-16.7.2.tgz#9da1a09aa980de29156ef5573fdb2fdc3a1161f3" resolved "https://registry.yarnpkg.com/@nrwl/jest/-/jest-16.7.4.tgz#56ed128605b4ba6e46d054b26b2380c2c406b2da"
integrity sha512-SXqANeAi4UNEPj3xg+o1x6kK8sXZiOk4+VhTtE8vftD/TdhgNVUiyG0DvHXvpLCWNhfFftJHhbUB2sg9vma9jg== integrity sha512-1DNBEUzYHK+rfqt6ewshYnVJaW59UqaQhMc3vpu5gI8hUbBnjun8CUAh3CHcZdxDVBG0akTAN7+JkB7UqQD2dg==
dependencies: dependencies:
"@nx/jest" "16.7.2" "@nx/jest" "16.7.4"
"@nrwl/js@16.7.2": "@nrwl/js@16.7.4":
version "16.7.2" version "16.7.4"
resolved "https://registry.yarnpkg.com/@nrwl/js/-/js-16.7.2.tgz#53b488c2c8bf8dc4c5fe0e19af2bcd37c0263497" resolved "https://registry.yarnpkg.com/@nrwl/js/-/js-16.7.4.tgz#2977a79b94b8c73b0a63a69eb07e8aa57cc2a979"
integrity sha512-RflIReJoMmBhvBuSKzWLNJvqhz0uDy3Alg7QylGct0uzrTFqOH9fn35W9gYYN3EE8WQXpBlcQk3t+5xs9oHGXg== integrity sha512-7mQnzhUUSpMOnSxM10Q2XOWWEj+GdtV7HVt1s+LDvRVXSFNLWBOucjfBunbttYGO36aKk+ZPCU53SvwH2aL5eA==
dependencies: dependencies:
"@nx/js" "16.7.2" "@nx/js" "16.7.4"
"@nrwl/linter@16.7.2": "@nrwl/linter@16.7.4":
version "16.7.2" version "16.7.4"
resolved "https://registry.yarnpkg.com/@nrwl/linter/-/linter-16.7.2.tgz#35d83244d3ab48c1f7722ab7714f9a8fcbb0d816" resolved "https://registry.yarnpkg.com/@nrwl/linter/-/linter-16.7.4.tgz#152c1d25109c7196c579fbd8c03731d75c47e7f7"
integrity sha512-tY5Vi9I9mjwkeVBD96hkcNAwDxs2gxcWxwIs5bnAoGw4GM93toHnbe2vB72m89NwH4bYxD1UkDAqvYnOfEZ5/Q== integrity sha512-XBxFn/2nbJUPAfAJ6y7rDlEZIpkN2cZ4z1C0+QvDJkIT24YhHUIdSvYBUav0TX17xneH7+NQhY2EHelgXFf4yw==
dependencies: dependencies:
"@nx/linter" "16.7.2" "@nx/linter" "16.7.4"
"@nrwl/nest@16.7.2": "@nrwl/nest@16.7.4":
version "16.7.2" version "16.7.4"
resolved "https://registry.yarnpkg.com/@nrwl/nest/-/nest-16.7.2.tgz#703678229982a4f3aa90730d9752040f0ffba6b5" resolved "https://registry.yarnpkg.com/@nrwl/nest/-/nest-16.7.4.tgz#6f35bb8b92d1b7bcafa2fe8ce92612a55bf92970"
integrity sha512-kKwuWYbSnzCSr0V2wCDLt/Ij3OJpwGhohAK0U/EghCwCpkeTy4B1pL7WscR+cB8UVrBq7Vz/DQhOGOloLjyBww== integrity sha512-ax/sSCM5SFfAZ2t0nLuAqP9U4+03uPw5IqdB6zHISEcSkJqQw+mcR3RiQiyzdNsJlCDA8mWKP7N8niLS7yuTPg==
dependencies: dependencies:
"@nx/nest" "16.7.2" "@nx/nest" "16.7.4"
"@nrwl/node@16.7.2": "@nrwl/node@16.7.4":
version "16.7.2" version "16.7.4"
resolved "https://registry.yarnpkg.com/@nrwl/node/-/node-16.7.2.tgz#74a5d4498cd1265fc7e9e3dce4dccb99a1680b6f" resolved "https://registry.yarnpkg.com/@nrwl/node/-/node-16.7.4.tgz#e34e7f0d58ac1cf7e8cefdfa9b61ef5afaa2aa39"
integrity sha512-HPhtGAxiM/N/JihRacHMVH4+MGp1eTPLw/T3RBtf5VyuBI/aRW0gF1nCqJxizSs+Vy9FD2XE+fUoca9FZIrxxg== integrity sha512-GJW3j27LX36AYcBMhkQASTTfVnIz5L3oOxNSMGb6xzL9xsoiiQU5Fo/Yz4jI9iw7hUaht3EgzbATYbJhq4wETA==
dependencies: dependencies:
"@nx/node" "16.7.2" "@nx/node" "16.7.4"
"@nrwl/nx-cloud@16.4.0-beta.1": "@nrwl/nx-cloud@16.3.0":
version "16.4.0-beta.1" version "16.3.0"
resolved "https://registry.yarnpkg.com/@nrwl/nx-cloud/-/nx-cloud-16.4.0-beta.1.tgz#bcd4ba73a9afed241391ef49aae51b847a6d3ebc" resolved "https://registry.yarnpkg.com/@nrwl/nx-cloud/-/nx-cloud-16.3.0.tgz#0f1d563200af5bb6ce51a8408d698774d5ccdbbd"
integrity sha512-XQFmpVtGJghvR+JJWgp2so0eeJSG7U1W0/WcyAskTnCSMt8M5FFotJmF4upFfRK1rexlECZ7xbcZzUXuIEqzsw== integrity sha512-nJrGsVufhY74KcP7kM7BqFOGAoO5OEF6+wfiM295DgmEG9c1yW+x5QiQaC42K9SWYn/eKQa1X7466ZA5lynXoQ==
dependencies: dependencies:
nx-cloud "16.4.0-beta.1" nx-cloud "16.3.0"
"@nrwl/storybook@16.7.2": "@nrwl/storybook@16.7.4":
version "16.7.2" version "16.7.4"
resolved "https://registry.yarnpkg.com/@nrwl/storybook/-/storybook-16.7.2.tgz#ebac9edaca0bdf7db2688866da13206cf679df6a" resolved "https://registry.yarnpkg.com/@nrwl/storybook/-/storybook-16.7.4.tgz#146298468a92eadf2898c84b9000cef056f86ef7"
integrity sha512-F0LZoo7F+S1zGNhMKO5GQojGScZKnPr9/29WzyOXggtoICO4JpYkIjTr5PqYZtFLJE8UrYAeLL9N6uRJD7Wh7g== integrity sha512-qRqDW8ILyvgTwd55dw1hRjaz9CAz3KYvmkQuZvMIQ4HTTodgx2ZOznG8ujvO154m8drWowurBIOLdXDq/BPUqg==
dependencies: dependencies:
"@nx/storybook" "16.7.2" "@nx/storybook" "16.7.4"
"@nrwl/tao@16.7.2": "@nrwl/tao@16.7.4":
version "16.7.2" version "16.7.4"
resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-16.7.2.tgz#53dbb5a1ed221f0226c73d165d12d706b9069386" resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-16.7.4.tgz#2b2e2cc26ce6c50884da63e69ba8ccf0fcbb9455"
integrity sha512-4Wc3ic5VtZL3t4qqCMJlEad/wWuFxNUX78U5ohEStN3UFFJIjwJJpKZYZDtxhaOLWUdXbk6CI3KfSIpWgwPdbQ== integrity sha512-hH03oF+yVmaf19UZfyLDSuVEh0KasU5YfYezuNsdRkXNdTU/WmpDrk4qoo0j6fVoMPrqbbPOn1YMRtulP2WyYA==
dependencies: dependencies:
nx "16.7.2" nx "16.7.4"
tslib "^2.3.0" tslib "^2.3.0"
"@nrwl/web@16.7.2": "@nrwl/web@16.7.4":
version "16.7.2" version "16.7.4"
resolved "https://registry.yarnpkg.com/@nrwl/web/-/web-16.7.2.tgz#03e67d93d4462febfdb149b70ddb3de19dc9a943" resolved "https://registry.yarnpkg.com/@nrwl/web/-/web-16.7.4.tgz#5fca83ad10abd7254ef2db0b4b60810fc45b81a3"
integrity sha512-hjFacN2WOdyVqVnN8SauOc9jKZ79sfQOrUZX75bfrWzUeZmXVG+DAGFhvtEroczm4B1MDxpx62tcZ0nC9m+zSA== integrity sha512-HB3dYp2gJTl/bw5jn4gIcoyBGU2rfJ3OrIyBRjlUMRwgFayAadweyqfIFirHSPc+S7E6NNKhTRxifGJOrwyYTQ==
dependencies: dependencies:
"@nx/web" "16.7.2" "@nx/web" "16.7.4"
"@nrwl/webpack@16.7.2": "@nrwl/webpack@16.7.4":
version "16.7.2" version "16.7.4"
resolved "https://registry.yarnpkg.com/@nrwl/webpack/-/webpack-16.7.2.tgz#ab9ac908294a596d2d84ea550b708c3036d42487" resolved "https://registry.yarnpkg.com/@nrwl/webpack/-/webpack-16.7.4.tgz#8cb19b11789d665924e0c311a8f4c3f205b94f63"
integrity sha512-M4JCakc+piRt4eYEuC3s/Pu+J2z7l7Mr63K3FfeZJMLsX7sI87xWifm4Jf4sJvaRNzQHzrykb3xluWMQ/B22Ag== integrity sha512-AFplOBmoq+IehP9XML1loEHJQLhPIqibpyOLmt2kZbne0BVKrLcLxmIztqbVHWfqJz9A1QO6DgxTcHdFF8447A==
dependencies: dependencies:
"@nx/webpack" "16.7.2" "@nx/webpack" "16.7.4"
"@nrwl/workspace@16.7.2": "@nrwl/workspace@16.7.4":
version "16.7.2" version "16.7.4"
resolved "https://registry.yarnpkg.com/@nrwl/workspace/-/workspace-16.7.2.tgz#8ef4eb11acc7d95c4f2e663a095b477cb2bbfcb8" resolved "https://registry.yarnpkg.com/@nrwl/workspace/-/workspace-16.7.4.tgz#fcac4467e78477125dcb771e007b7a6bfd8411ea"
integrity sha512-PTYFfSG64DBJPII/AiUQXP9uuPRfllVBMKKLwvMgVp9siClvgmyctlf5XONlbWfYNJ5jRI7/To8FF52EuQ95Zg== integrity sha512-i2mMSzF/qfsFbTD0DBMSRTNKSahJZoJCnDrTSgwZeTVfLoKYOO5QaiAqB0zKh/5qTsBCt/rKtAlfTd5uGpBzPQ==
dependencies: dependencies:
"@nx/workspace" "16.7.2" "@nx/workspace" "16.7.4"
"@nuxtjs/opencollective@0.3.2": "@nuxtjs/opencollective@0.3.2":
version "0.3.2" version "0.3.2"
@ -3941,19 +3941,19 @@
consola "^2.15.0" consola "^2.15.0"
node-fetch "^2.6.1" node-fetch "^2.6.1"
"@nx/angular@16.7.2": "@nx/angular@16.7.4":
version "16.7.2" version "16.7.4"
resolved "https://registry.yarnpkg.com/@nx/angular/-/angular-16.7.2.tgz#347a29028b814c5481589a3138f7ca31660cfc38" resolved "https://registry.yarnpkg.com/@nx/angular/-/angular-16.7.4.tgz#53d645c57ff71039e6deec17316be0423567966c"
integrity sha512-OOgVtOIFsnoqiaG+jLXmdZPZgqXp2Oefj2AbH4RwN3mYDSpieO8/MyoX0YcB5pBPOMM1iIREqEbYtq625Q8lmw== integrity sha512-Avo8NdJKnuWmBRPwO/F7pg6wpW83HYnrKKL/QsAaBlp3jzi+u4UrVwZvh8OSFwQvdAYk7+qzfQe2163L76yDkg==
dependencies: dependencies:
"@nrwl/angular" "16.7.2" "@nrwl/angular" "16.7.4"
"@nx/cypress" "16.7.2" "@nx/cypress" "16.7.4"
"@nx/devkit" "16.7.2" "@nx/devkit" "16.7.4"
"@nx/jest" "16.7.2" "@nx/jest" "16.7.4"
"@nx/js" "16.7.2" "@nx/js" "16.7.4"
"@nx/linter" "16.7.2" "@nx/linter" "16.7.4"
"@nx/webpack" "16.7.2" "@nx/webpack" "16.7.4"
"@nx/workspace" "16.7.2" "@nx/workspace" "16.7.4"
"@phenomnomnominal/tsquery" "~5.0.1" "@phenomnomnominal/tsquery" "~5.0.1"
"@typescript-eslint/type-utils" "^5.36.1" "@typescript-eslint/type-utils" "^5.36.1"
chalk "^4.1.0" chalk "^4.1.0"
@ -3967,27 +3967,27 @@
webpack "^5.80.0" webpack "^5.80.0"
webpack-merge "^5.8.0" webpack-merge "^5.8.0"
"@nx/cypress@16.7.2": "@nx/cypress@16.7.4":
version "16.7.2" version "16.7.4"
resolved "https://registry.yarnpkg.com/@nx/cypress/-/cypress-16.7.2.tgz#a780fa1eb16dd7f296e6a6d8c35aadec26f47f69" resolved "https://registry.yarnpkg.com/@nx/cypress/-/cypress-16.7.4.tgz#0b33d9c12e2a6b06f2ce5cf60e911de612a81a14"
integrity sha512-KBNd2whuBc/aY2dG9uiyMi7LHl5OUbKzKSY4s6bCjgJUiByFbSX6tP6U9QxWxlPmWWjw1OwcoeCWGuUAs/HUZw== integrity sha512-rqVnTZbM8rr7K8p+O51uMBko9pYlFPpGqkFQbGOpzFjhoCXW0d4MqYMd03Iele4HjBLCNqVjgmUg3TZacO9vTQ==
dependencies: dependencies:
"@nrwl/cypress" "16.7.2" "@nrwl/cypress" "16.7.4"
"@nx/devkit" "16.7.2" "@nx/devkit" "16.7.4"
"@nx/js" "16.7.2" "@nx/js" "16.7.4"
"@nx/linter" "16.7.2" "@nx/linter" "16.7.4"
"@phenomnomnominal/tsquery" "~5.0.1" "@phenomnomnominal/tsquery" "~5.0.1"
detect-port "^1.5.1" detect-port "^1.5.1"
dotenv "~16.3.1" dotenv "~16.3.1"
semver "7.5.3" semver "7.5.3"
tslib "^2.3.0" tslib "^2.3.0"
"@nx/devkit@16.7.2": "@nx/devkit@16.7.4":
version "16.7.2" version "16.7.4"
resolved "https://registry.yarnpkg.com/@nx/devkit/-/devkit-16.7.2.tgz#cb34103221a257608ee9f330e615071a430148eb" resolved "https://registry.yarnpkg.com/@nx/devkit/-/devkit-16.7.4.tgz#c03c308bc190a18642e0dc0c183323662c38c426"
integrity sha512-Gf6FwxhVUH7h3u6Vp/62sDAqgiPR0WvU/etw/DQmJvOqauM9Nj43r0mBCmgh29yZZEgW1zMIMCTOtUYqFFl1ew== integrity sha512-SLito+/TAeDYR+d7IIpp/sBJm41WM+nIevILv0TSQW4Pq0ylUy1nUvV8Pe7l1ohZccDrQuebMUWPwGO0hv8SeQ==
dependencies: dependencies:
"@nrwl/devkit" "16.7.2" "@nrwl/devkit" "16.7.4"
ejs "^3.1.7" ejs "^3.1.7"
enquirer "~2.3.6" enquirer "~2.3.6"
ignore "^5.0.4" ignore "^5.0.4"
@ -3995,14 +3995,14 @@
tmp "~0.2.1" tmp "~0.2.1"
tslib "^2.3.0" tslib "^2.3.0"
"@nx/eslint-plugin@16.7.2": "@nx/eslint-plugin@16.7.4":
version "16.7.2" version "16.7.4"
resolved "https://registry.yarnpkg.com/@nx/eslint-plugin/-/eslint-plugin-16.7.2.tgz#e13137c2eea2a5c04d9c6336d371f48448657b6c" resolved "https://registry.yarnpkg.com/@nx/eslint-plugin/-/eslint-plugin-16.7.4.tgz#09c04ff657955959f061724f8018dcfcd64677a6"
integrity sha512-EEElrgkTmjkkyrl0tOBoN0nMZynOagAEiri7wOznUeBffqcR0QJt1CeUald3O8DJt49P7ywRSsceW3ZircSpiw== integrity sha512-PjpXeW/Tr/y/PJSEaB9X2xNaqW6mYXzcFSAXQrlxuDNdVEtrieSj+OiAGKfaYjkcN1d/X9dupV6b/L0V+HcSlw==
dependencies: dependencies:
"@nrwl/eslint-plugin-nx" "16.7.2" "@nrwl/eslint-plugin-nx" "16.7.4"
"@nx/devkit" "16.7.2" "@nx/devkit" "16.7.4"
"@nx/js" "16.7.2" "@nx/js" "16.7.4"
"@typescript-eslint/type-utils" "^5.60.1" "@typescript-eslint/type-utils" "^5.60.1"
"@typescript-eslint/utils" "^5.60.1" "@typescript-eslint/utils" "^5.60.1"
chalk "^4.1.0" chalk "^4.1.0"
@ -4011,16 +4011,16 @@
semver "7.5.3" semver "7.5.3"
tslib "^2.3.0" tslib "^2.3.0"
"@nx/jest@16.7.2": "@nx/jest@16.7.4":
version "16.7.2" version "16.7.4"
resolved "https://registry.yarnpkg.com/@nx/jest/-/jest-16.7.2.tgz#68e8262c145d93b82ee426965a0c54745c631c8c" resolved "https://registry.yarnpkg.com/@nx/jest/-/jest-16.7.4.tgz#4df84dc7dc99645ac0b2ad256ab3997474765a69"
integrity sha512-PoUxUPha2zWA3DOatjXxoCvqk+XySSGJV8XM+7oWdlVXWpWB60XAfs8f9Tl4krUk1v+JlB+9svwds8KLRoj++w== integrity sha512-/96+Pf9duar1ynjF+rWw+B5UJbM8ldLlHoGAkH8755Yq20INrwr6XEqQAu/HdosBlR7Ytbg3YnFPwb3lTOuLEw==
dependencies: dependencies:
"@jest/reporters" "^29.4.1" "@jest/reporters" "^29.4.1"
"@jest/test-result" "^29.4.1" "@jest/test-result" "^29.4.1"
"@nrwl/jest" "16.7.2" "@nrwl/jest" "16.7.4"
"@nx/devkit" "16.7.2" "@nx/devkit" "16.7.4"
"@nx/js" "16.7.2" "@nx/js" "16.7.4"
"@phenomnomnominal/tsquery" "~5.0.1" "@phenomnomnominal/tsquery" "~5.0.1"
chalk "^4.1.0" chalk "^4.1.0"
dotenv "~16.3.1" dotenv "~16.3.1"
@ -4031,10 +4031,10 @@
resolve.exports "1.1.0" resolve.exports "1.1.0"
tslib "^2.3.0" tslib "^2.3.0"
"@nx/js@16.7.2": "@nx/js@16.7.4":
version "16.7.2" version "16.7.4"
resolved "https://registry.yarnpkg.com/@nx/js/-/js-16.7.2.tgz#32f576bd7a48c7fb00ab21910a22061a13148a47" resolved "https://registry.yarnpkg.com/@nx/js/-/js-16.7.4.tgz#6870c072503b0d42a2bca05327818a4b365a6658"
integrity sha512-6mkOfZlI+RpqkF8Lwte+ZmC2Lx46cHcDUjvdYkoIud40C2uf7eaqnMKh4zw3M25mdzm51BAf22LV31b8q3mBmg== integrity sha512-aJnpJkgGgEt1IjsV/ywZRLZ4B5/jDkTtdVu+Wf+6UrtlWji7sq2PC96NSuKeEHjq3oAvNsBc8+u2rjB/9a+8jQ==
dependencies: dependencies:
"@babel/core" "^7.22.9" "@babel/core" "^7.22.9"
"@babel/plugin-proposal-class-properties" "^7.18.6" "@babel/plugin-proposal-class-properties" "^7.18.6"
@ -4043,9 +4043,9 @@
"@babel/preset-env" "^7.22.9" "@babel/preset-env" "^7.22.9"
"@babel/preset-typescript" "^7.22.5" "@babel/preset-typescript" "^7.22.5"
"@babel/runtime" "^7.22.6" "@babel/runtime" "^7.22.6"
"@nrwl/js" "16.7.2" "@nrwl/js" "16.7.4"
"@nx/devkit" "16.7.2" "@nx/devkit" "16.7.4"
"@nx/workspace" "16.7.2" "@nx/workspace" "16.7.4"
"@phenomnomnominal/tsquery" "~5.0.1" "@phenomnomnominal/tsquery" "~5.0.1"
babel-plugin-const-enum "^1.0.1" babel-plugin-const-enum "^1.0.1"
babel-plugin-macros "^2.8.0" babel-plugin-macros "^2.8.0"
@ -4063,121 +4063,121 @@
tsconfig-paths "^4.1.2" tsconfig-paths "^4.1.2"
tslib "^2.3.0" tslib "^2.3.0"
"@nx/linter@16.7.2": "@nx/linter@16.7.4":
version "16.7.2" version "16.7.4"
resolved "https://registry.yarnpkg.com/@nx/linter/-/linter-16.7.2.tgz#49d960cf1509a9ae5ccb9967c69c7cf04085f936" resolved "https://registry.yarnpkg.com/@nx/linter/-/linter-16.7.4.tgz#a571f4b66428d106d9e7e95c0be2a142a0aaddea"
integrity sha512-rmgE7y0nUupG1iamdTH5S4SVp/+0VC/VvvXnB50mJgVn1XwtvgvmLMb90oFAy1azjxtrboK4y1tI1UC4eSytSw== integrity sha512-AGuPfpDIk44fBIwcloo2Hb0+ROmoD69n6ypzdpZvRrBS6KHROGjT3SoWKituyj75bSgtWndNC1ywBhcVnRfamg==
dependencies: dependencies:
"@nrwl/linter" "16.7.2" "@nrwl/linter" "16.7.4"
"@nx/devkit" "16.7.2" "@nx/devkit" "16.7.4"
"@nx/js" "16.7.2" "@nx/js" "16.7.4"
"@phenomnomnominal/tsquery" "~5.0.1" "@phenomnomnominal/tsquery" "~5.0.1"
tmp "~0.2.1" tmp "~0.2.1"
tslib "^2.3.0" tslib "^2.3.0"
"@nx/nest@16.7.2": "@nx/nest@16.7.4":
version "16.7.2" version "16.7.4"
resolved "https://registry.yarnpkg.com/@nx/nest/-/nest-16.7.2.tgz#3b67fc2491aaae1c2da46e83fdd6b1ef6354e78e" resolved "https://registry.yarnpkg.com/@nx/nest/-/nest-16.7.4.tgz#b24ff76357d97e54b76c8dbc72c3171300c72c5b"
integrity sha512-PDRNdmOQt1Njv4EzBnvGFNjPvZR+27bwSIKMwUSh2HfNQLkhommmb4w6WOOV5QY4FN0NATc3JhJJilARzWubKw== integrity sha512-ccxVD6W08cuRWSaruiDsbJXZ3CFgJih10XINNgBUh6g0AYtOFtPjn1s7RVbRyR1i4urNsTSp2oq7wisU5sRV0Q==
dependencies: dependencies:
"@nestjs/schematics" "^9.1.0" "@nestjs/schematics" "^9.1.0"
"@nrwl/nest" "16.7.2" "@nrwl/nest" "16.7.4"
"@nx/devkit" "16.7.2" "@nx/devkit" "16.7.4"
"@nx/js" "16.7.2" "@nx/js" "16.7.4"
"@nx/linter" "16.7.2" "@nx/linter" "16.7.4"
"@nx/node" "16.7.2" "@nx/node" "16.7.4"
"@phenomnomnominal/tsquery" "~5.0.1" "@phenomnomnominal/tsquery" "~5.0.1"
enquirer "~2.3.6" enquirer "~2.3.6"
semver "7.5.3" semver "7.5.3"
tslib "^2.3.0" tslib "^2.3.0"
"@nx/node@16.7.2": "@nx/node@16.7.4":
version "16.7.2" version "16.7.4"
resolved "https://registry.yarnpkg.com/@nx/node/-/node-16.7.2.tgz#145914640c8883b970d1baba878b1c49c306cde1" resolved "https://registry.yarnpkg.com/@nx/node/-/node-16.7.4.tgz#c242063fa1f0dd9981175bd14427cf383421d1c0"
integrity sha512-BQ+dOGOXoc3/qlttJxsk/5Ty/EqjyjgiC95icV67o2bpfEnC+A7EzobsxiG23ZNGrkvxd8SxStv6VrbtH1Ox1g== integrity sha512-lO8y58y0qlOmXj/rmRQe/JaUic2vTUa8irT9ByWkfwpp2iLmIw5/qrf3TiC5kqu4LsOuPkZiiLRQyA01LhWwRw==
dependencies: dependencies:
"@nrwl/node" "16.7.2" "@nrwl/node" "16.7.4"
"@nx/devkit" "16.7.2" "@nx/devkit" "16.7.4"
"@nx/jest" "16.7.2" "@nx/jest" "16.7.4"
"@nx/js" "16.7.2" "@nx/js" "16.7.4"
"@nx/linter" "16.7.2" "@nx/linter" "16.7.4"
"@nx/workspace" "16.7.2" "@nx/workspace" "16.7.4"
tslib "^2.3.0" tslib "^2.3.0"
"@nx/nx-darwin-arm64@16.7.2": "@nx/nx-darwin-arm64@16.7.4":
version "16.7.2" version "16.7.4"
resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-16.7.2.tgz#b693d389c89edf1bdb82f533d843534f63b41282" resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-16.7.4.tgz#1a797805850444cc6c0aa56668bf6f832093d641"
integrity sha512-dkTHAzOTbqRHUQtnw7knEJq4ll6hew11u+9B0fThs9gC/X0iPK0eDXD4TqbIKEbcWAsxpuGiWPzGoNPo7Gwl9A== integrity sha512-pRNjxn6KlcR6iGkU1j/1pzcogwXFv97pYiZaibpF7UV0vfdEUA3EETpDcs+hbNAcKMvVtn/TgN857/5LQ/lGUg==
"@nx/nx-darwin-x64@16.7.2": "@nx/nx-darwin-x64@16.7.4":
version "16.7.2" version "16.7.4"
resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-16.7.2.tgz#be7da3c22f50d36d2976be0d87b63cc24ecd7c59" resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-16.7.4.tgz#53f681c86d9d8e8bcebfc8ba54dd7b2ec9f71207"
integrity sha512-EKhjX7DCRIA5U8yAxIgGXeIFaq1dhgLJy8OAG4n1Ud8c21px+bBSrcZvv0ww5VoEulhggQ+c6fW1cjKtGgLknQ== integrity sha512-GANXeabAAWRoF85WDla2ZPxtr8vnqvXjwyCIhRCda8hlKiVCpM98GemucN25z97G5H6MgyV9Dd9t9jrr2Fn0Og==
"@nx/nx-freebsd-x64@16.7.2": "@nx/nx-freebsd-x64@16.7.4":
version "16.7.2" version "16.7.4"
resolved "https://registry.yarnpkg.com/@nx/nx-freebsd-x64/-/nx-freebsd-x64-16.7.2.tgz#710e3d4b2cbf76997b5e8b5e5663bf045bb6157e" resolved "https://registry.yarnpkg.com/@nx/nx-freebsd-x64/-/nx-freebsd-x64-16.7.4.tgz#df88ff9b6ed0b51723d76d711b9467a1a4726f00"
integrity sha512-3QhXZq0wxvi4lg1MJqwq72F7PE/d0Hcl3uwheenYQtwUvAFAmijC/Z4AVPSqbKJ+QaoqASnXRim9z3EIfeD+DQ== integrity sha512-zmBBDYjPaHhIHx1YASUJJIy+oz7mCrj5f0f3kOzfMraQOjkQZ0xYgNNUzBqmnYu1855yiphu94MkAMYJnbk0jw==
"@nx/nx-linux-arm-gnueabihf@16.7.2": "@nx/nx-linux-arm-gnueabihf@16.7.4":
version "16.7.2" version "16.7.4"
resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-16.7.2.tgz#3f318c003c0678d11556e1bc7be0d4094e2939dd" resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-16.7.4.tgz#2cfac69e65237245560326039bb319691147daed"
integrity sha512-7bny8NvE9iyfwRfq9/mOZjzMNWthT70Ce1N9suB2zdbgbLUEDPQQhBNbg969yT6/LbWMWuWZXeIbz/Fwndf9zA== integrity sha512-d3Cmz/vdtoSasTUANoh4ZYLJESNA3+PCP/HnXNqmrr6AEHo+T8DcI+qsamO3rmYUSFxTMAeMyoihZMU8OKGZ1A==
"@nx/nx-linux-arm64-gnu@16.7.2": "@nx/nx-linux-arm64-gnu@16.7.4":
version "16.7.2" version "16.7.4"
resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-16.7.2.tgz#2fc032b217c0f99a94bdc4872080f969101326e7" resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-16.7.4.tgz#492fb66b804aa6154cd44ded6eaaf6cfcb32ea9f"
integrity sha512-+UdeFB1HY/3GU2+mflydFWpztghFRQiVzJV6MTcjtOzE3jfgXzz9TP580pDxozTvNSRPlblH07X+iB8DhVcB9w== integrity sha512-W1u4O78lTHCwvUP0vakeKWFXeSZ13nYzbd6FARICnImY2my8vz41rLm6aU9TYWaiOGEGL2xKpHKSgiNwbLjhFw==
"@nx/nx-linux-arm64-musl@16.7.2": "@nx/nx-linux-arm64-musl@16.7.4":
version "16.7.2" version "16.7.4"
resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-16.7.2.tgz#9f3b256332d2ca074854ee1a0b4667aa44ff2640" resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-16.7.4.tgz#ad32f35f05067e918eff9a97d8720f3923c034cb"
integrity sha512-YfkWu+4GKXageuYiH5a77gIDAXnit5SIyfI+RWe/j04uFy171KnUt167DC417fv/fTGxeXY1tzOu112Y+x5ixw== integrity sha512-Dc8IQFvhfH/Z3GmhBBNNxGd2Ehw6Y5SePEgJj1c2JyPdoVtc2OjGzkUaZkT4z5z77VKtju6Yi10T6Enps+y+kw==
"@nx/nx-linux-x64-gnu@16.7.2": "@nx/nx-linux-x64-gnu@16.7.4":
version "16.7.2" version "16.7.4"
resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-16.7.2.tgz#e9e42c800fcbd489501b618e3a2f0ed12481e007" resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-16.7.4.tgz#40271f7d21ef3ba0676c046b73c84cf9eb1ed94a"
integrity sha512-/TtSa2rHR+1gNuALR1yafl4fzBK2/GAhosf+skn00OgwsJ0c8ie9tuuftlMo+2n3LcXY/IaPDaD7t6fln4qsQg== integrity sha512-4B58C/pXeuovSznBOeicsxNieBApbGMoi2du8jR6Is1gYFPv4l8fFHQHHGAa1l5XJC5JuGJqFywS4elInWprNw==
"@nx/nx-linux-x64-musl@16.7.2": "@nx/nx-linux-x64-musl@16.7.4":
version "16.7.2" version "16.7.4"
resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-16.7.2.tgz#8279d458e7e763f02ae2f10cbfcbb46eb80ce9aa" resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-16.7.4.tgz#8bd13692a0922df51c6305df93d69a3c66b4b716"
integrity sha512-VC638hxdWSA8VTDU9rAXjr60mmMP3ZyCUbSkJ+8ydEe83StMDY3PAXS5Hw3n/ouxDfCF9r1kWIGFe4g+emvfBw== integrity sha512-spqqvEdGSSeV2ByJHkex5m8MRQfM6lQlnon25XgVBdPR47lKMWSikUsaWCiE7bVAFU9BFyWY2L4HfZ4+LiNY7A==
"@nx/nx-win32-arm64-msvc@16.7.2": "@nx/nx-win32-arm64-msvc@16.7.4":
version "16.7.2" version "16.7.4"
resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-16.7.2.tgz#7258e46f3af9e93d667ff42a73ee6a36a484bc2b" resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-16.7.4.tgz#dfbe5b28c62c1c1ceadad12e79029f76e450d855"
integrity sha512-sSUqgANLgQFFzKTvyMczh5D6xiqTQnB8daJTLX+QUCv5vO5+ZSwuVDyNfr6g/HV2+ak0M9/wVQUae11TgUIPYw== integrity sha512-etNnbuCcSqAYOeDcS6si6qw0WR/IS87ovTzLS17ETKpdHcHN5nM4l02CQyupKiD58ShxrXHxXmvgBfbXxoN5Ew==
"@nx/nx-win32-x64-msvc@16.7.2": "@nx/nx-win32-x64-msvc@16.7.4":
version "16.7.2" version "16.7.4"
resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-16.7.2.tgz#1b0a286a5b0cb9c8545c7c49e7514aaf464fe9a7" resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-16.7.4.tgz#e4b270107e02e73451d7c5dc7c4237fffe18aa75"
integrity sha512-+n01cT9/P3o95x+FlRWYf9sFZ29ooxYD/WLcmxACeXN0V1bdbnZxKVSuJqrXZhmpHe7P+/+IRmniv9cdpkxz7g== integrity sha512-y6pugK6ino1wvo2FbgtXG2cVbEm3LzJwOSBKBRBXSWhUgjP7T92uGfOt6KVQKpaqDvS9lA9TO/2DcygcLHXh7A==
"@nx/storybook@16.7.2": "@nx/storybook@16.7.4":
version "16.7.2" version "16.7.4"
resolved "https://registry.yarnpkg.com/@nx/storybook/-/storybook-16.7.2.tgz#2c158bbcc6fc5874d93970f2a83b71a2e124b269" resolved "https://registry.yarnpkg.com/@nx/storybook/-/storybook-16.7.4.tgz#9f7dce572b03b7e7a715d3a6c412339a16b16e32"
integrity sha512-vnyS6sYXEEknqOCvQJ9OO55GHOQVrkXkOU5k+/LrHAJekYvDsjVpZjXLUgfeGqJEasXiAtBzyExIRHroUmSd6g== integrity sha512-tXR3iPc8EXqQzxG33EcKZIICYj9oXTIr/C8aW/hwDc51AAz4HAjXT0E9zzus+FynLeV4Ser58BfzBkEqycVjIw==
dependencies: dependencies:
"@nrwl/storybook" "16.7.2" "@nrwl/storybook" "16.7.4"
"@nx/cypress" "16.7.2" "@nx/cypress" "16.7.4"
"@nx/devkit" "16.7.2" "@nx/devkit" "16.7.4"
"@nx/js" "16.7.2" "@nx/js" "16.7.4"
"@nx/linter" "16.7.2" "@nx/linter" "16.7.4"
"@nx/workspace" "16.7.2" "@nx/workspace" "16.7.4"
"@phenomnomnominal/tsquery" "~5.0.1" "@phenomnomnominal/tsquery" "~5.0.1"
dotenv "~16.3.1" dotenv "~16.3.1"
semver "7.5.3" semver "7.5.3"
tslib "^2.3.0" tslib "^2.3.0"
"@nx/web@16.7.2": "@nx/web@16.7.4":
version "16.7.2" version "16.7.4"
resolved "https://registry.yarnpkg.com/@nx/web/-/web-16.7.2.tgz#08a17330a5ad79d3b19d45d663c049a227022103" resolved "https://registry.yarnpkg.com/@nx/web/-/web-16.7.4.tgz#09f6233e7ff81b6ea7b51c90565a0b475c917653"
integrity sha512-IYi3gGKewvfkEUgspgVmUlEKFK2yxmKt2wUOQtlhdC5cPJcRoR7Ql64rg7BoJu3t34ftXiTPD63qqv/uBC566g== integrity sha512-keR+jZES/H9MZBOIvN3zLyOw7qP05cOs14NNHc7tkj5jOvifQxslLQRdx+h62tJigmS6TZY43mlJfVCWvYwdXg==
dependencies: dependencies:
"@nrwl/web" "16.7.2" "@nrwl/web" "16.7.4"
"@nx/devkit" "16.7.2" "@nx/devkit" "16.7.4"
"@nx/js" "16.7.2" "@nx/js" "16.7.4"
chalk "^4.1.0" chalk "^4.1.0"
chokidar "^3.5.1" chokidar "^3.5.1"
detect-port "^1.5.1" detect-port "^1.5.1"
@ -4185,15 +4185,15 @@
ignore "^5.0.4" ignore "^5.0.4"
tslib "^2.3.0" tslib "^2.3.0"
"@nx/webpack@16.7.2": "@nx/webpack@16.7.4":
version "16.7.2" version "16.7.4"
resolved "https://registry.yarnpkg.com/@nx/webpack/-/webpack-16.7.2.tgz#8fbf0c7e520ee1ff5423ab9bf08e6db2c863f599" resolved "https://registry.yarnpkg.com/@nx/webpack/-/webpack-16.7.4.tgz#7c9ceb1ab480db94cf9ceb07e3d5b2fdb130d56e"
integrity sha512-nZPgIISyUpPLTvPSfRMJo4IY2f3cABxJH4LKJ0U0+uV0fTvzMs9GO8JIQ8534m9b2KISjSbaPL6efJhGkn2VbQ== integrity sha512-fAPuH14BO+Hzjn4Y6zJNn8b05lBDmqM0oy/yi3U3FHGoc9S1cmaLiajBMlle6nWlQjbd7S3R6Dk5xwr76Ii8yw==
dependencies: dependencies:
"@babel/core" "^7.22.9" "@babel/core" "^7.22.9"
"@nrwl/webpack" "16.7.2" "@nrwl/webpack" "16.7.4"
"@nx/devkit" "16.7.2" "@nx/devkit" "16.7.4"
"@nx/js" "16.7.2" "@nx/js" "16.7.4"
autoprefixer "^10.4.9" autoprefixer "^10.4.9"
babel-loader "^9.1.2" babel-loader "^9.1.2"
browserslist "^4.21.4" browserslist "^4.21.4"
@ -4230,16 +4230,16 @@
webpack-node-externals "^3.0.0" webpack-node-externals "^3.0.0"
webpack-subresource-integrity "^5.1.0" webpack-subresource-integrity "^5.1.0"
"@nx/workspace@16.7.2": "@nx/workspace@16.7.4":
version "16.7.2" version "16.7.4"
resolved "https://registry.yarnpkg.com/@nx/workspace/-/workspace-16.7.2.tgz#25b54090b37db9f45d795327c013781d290b6a95" resolved "https://registry.yarnpkg.com/@nx/workspace/-/workspace-16.7.4.tgz#7c002c548c921c1b0f63a338a5ec80f051f59b5b"
integrity sha512-6bI2EBXxbMcUI/Gtin+M95l9kQdoov9UIB97j8pX/V/4K8Xvegn01+MF99De9/oApkQjNehmR2dpi4hPo0FFUw== integrity sha512-mbefKyHg3avgK1jN6GChCDz2wc1qvi22BOUd/4WO+o88sShAA2h0gg8SMvkzLTNvGcNUWok66dInBfAJHvUOnw==
dependencies: dependencies:
"@nrwl/workspace" "16.7.2" "@nrwl/workspace" "16.7.4"
"@nx/devkit" "16.7.2" "@nx/devkit" "16.7.4"
chalk "^4.1.0" chalk "^4.1.0"
ignore "^5.0.4" ignore "^5.0.4"
nx "16.7.2" nx "16.7.4"
rxjs "^7.8.0" rxjs "^7.8.0"
tslib "^2.3.0" tslib "^2.3.0"
yargs-parser "21.1.1" yargs-parser "21.1.1"
@ -4293,22 +4293,22 @@
resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33"
integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==
"@prisma/client@4.16.2": "@prisma/client@5.2.0":
version "4.16.2" version "5.2.0"
resolved "https://registry.yarnpkg.com/@prisma/client/-/client-4.16.2.tgz#3bb9ebd49b35c8236b3d468d0215192267016e2b" resolved "https://registry.yarnpkg.com/@prisma/client/-/client-5.2.0.tgz#cbfdd440614b38736563a7999f39922fcde0ed50"
integrity sha512-qCoEyxv1ZrQ4bKy39GnylE8Zq31IRmm8bNhNbZx7bF2cU5aiCCnSa93J2imF88MBjn7J9eUQneNxUQVJdl/rPQ== integrity sha512-AiTjJwR4J5Rh6Z/9ZKrBBLel3/5DzUNntMohOy7yObVnVoTNVFi2kvpLZlFuKO50d7yDspOtW6XBpiAd0BVXbQ==
dependencies: dependencies:
"@prisma/engines-version" "4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81" "@prisma/engines-version" "5.2.0-25.2804dc98259d2ea960602aca6b8e7fdc03c1758f"
"@prisma/engines-version@4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81": "@prisma/engines-version@5.2.0-25.2804dc98259d2ea960602aca6b8e7fdc03c1758f":
version "4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81" version "5.2.0-25.2804dc98259d2ea960602aca6b8e7fdc03c1758f"
resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81.tgz#d3b5dcf95b6d220e258cbf6ae19b06d30a7e9f14" resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-5.2.0-25.2804dc98259d2ea960602aca6b8e7fdc03c1758f.tgz#11366e7ff031c908debf4983248d40046016de37"
integrity sha512-q617EUWfRIDTriWADZ4YiWRZXCa/WuhNgLTVd+HqWLffjMSPzyM5uOWoauX91wvQClSKZU4pzI4JJLQ9Kl62Qg== integrity sha512-jsnKT5JIDIE01lAeCj2ghY9IwxkedhKNvxQeoyLs6dr4ZXynetD0vTy7u6wMJt8vVPv8I5DPy/I4CFaoXAgbtg==
"@prisma/engines@4.16.2": "@prisma/engines@5.2.0":
version "4.16.2" version "5.2.0"
resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-4.16.2.tgz#5ec8dd672c2173d597e469194916ad4826ce2e5f" resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-5.2.0.tgz#e5dff48eb324c8137393933292d44ea5c3bc2ce7"
integrity sha512-vx1nxVvN4QeT/cepQce68deh/Turxy5Mr+4L4zClFuK1GlxN3+ivxfuv+ej/gvidWn1cE1uAhW7ALLNlYbRUAw== integrity sha512-dT7FOLUCdZmq+AunLqB1Iz+ZH/IIS1Fz2THmKZQ6aFONrQD/BQ5ecJ7g2wGS2OgyUFf4OaLam6/bxmgdOBDqig==
"@radix-ui/number@1.0.1": "@radix-ui/number@1.0.1":
version "1.0.1" version "1.0.1"
@ -5729,13 +5729,6 @@
"@swc/core-win32-ia32-msvc" "1.3.74" "@swc/core-win32-ia32-msvc" "1.3.74"
"@swc/core-win32-x64-msvc" "1.3.74" "@swc/core-win32-x64-msvc" "1.3.74"
"@swc/helpers@0.5.1":
version "0.5.1"
resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.1.tgz#e9031491aa3f26bfcc974a67f48bd456c8a5357a"
integrity sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==
dependencies:
tslib "^2.4.0"
"@szmarczak/http-timer@^4.0.5": "@szmarczak/http-timer@^4.0.5":
version "4.0.6" version "4.0.6"
resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807" resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807"
@ -11359,7 +11352,7 @@ glob@^10.0.0, glob@^10.2.2:
minipass "^5.0.0 || ^6.0.2 || ^7.0.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0"
path-scurry "^1.10.1" path-scurry "^1.10.1"
glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0: glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6:
version "7.2.3" version "7.2.3"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
@ -14830,13 +14823,12 @@ nwsapi@^2.2.0, nwsapi@^2.2.2:
resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30"
integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==
nx-cloud@16.4.0-beta.1: nx-cloud@16.3.0:
version "16.4.0-beta.1" version "16.3.0"
resolved "https://registry.yarnpkg.com/nx-cloud/-/nx-cloud-16.4.0-beta.1.tgz#87aede180e32ee77c1965b033c6f91634b5a4bfc" resolved "https://registry.yarnpkg.com/nx-cloud/-/nx-cloud-16.3.0.tgz#f916c0be1d7eb5d017d542fea349e09893502ee9"
integrity sha512-I62IBQDjbA3h+P8JVFrannVllj8O9/3YYfyg8sPLVYxFKwnqqsgR6kG2zHxB9Q2k0hoSU7JZ02d9oPJsRzL5rg== integrity sha512-hmNgpeLO4v4WDSWa8YhwX+q+9ohIyY8iqxlWyIKixWzQH2XfRgYFjOLH4IDLGOlKa3hg7MB6+4+75cK9CfSmKw==
dependencies: dependencies:
"@nrwl/nx-cloud" "16.4.0-beta.1" "@nrwl/nx-cloud" "16.3.0"
"@swc/helpers" "0.5.1"
axios "1.1.3" axios "1.1.3"
chalk "^4.1.0" chalk "^4.1.0"
dotenv "~10.0.0" dotenv "~10.0.0"
@ -14847,12 +14839,12 @@ nx-cloud@16.4.0-beta.1:
tar "6.1.11" tar "6.1.11"
yargs-parser ">=21.1.1" yargs-parser ">=21.1.1"
nx@16.7.2: nx@16.7.4:
version "16.7.2" version "16.7.4"
resolved "https://registry.yarnpkg.com/nx/-/nx-16.7.2.tgz#d5886f183f0b99c1e218f0c0e6edac72f9be637d" resolved "https://registry.yarnpkg.com/nx/-/nx-16.7.4.tgz#355cfe9187822fa29676b88da1673a09acab990e"
integrity sha512-T7cRC97qJ4H9fg498ZGwFQaTzJdLQaRp6DFUwzFo1B9qzR56A2tA3HBvT/huo85THaDX+/pcgLyeixJKEE5RPg== integrity sha512-L0Cbikk5kO+IBH0UQ2BOAut5ndeHXBlACKzjOPOCluY8WYh2sxWYt9/N/juFBN3XXRX7ionTr1PhWUzNE0Mzqw==
dependencies: dependencies:
"@nrwl/tao" "16.7.2" "@nrwl/tao" "16.7.4"
"@parcel/watcher" "2.0.4" "@parcel/watcher" "2.0.4"
"@yarnpkg/lockfile" "^1.1.0" "@yarnpkg/lockfile" "^1.1.0"
"@yarnpkg/parsers" "3.0.0-rc.46" "@yarnpkg/parsers" "3.0.0-rc.46"
@ -14888,16 +14880,16 @@ nx@16.7.2:
yargs "^17.6.2" yargs "^17.6.2"
yargs-parser "21.1.1" yargs-parser "21.1.1"
optionalDependencies: optionalDependencies:
"@nx/nx-darwin-arm64" "16.7.2" "@nx/nx-darwin-arm64" "16.7.4"
"@nx/nx-darwin-x64" "16.7.2" "@nx/nx-darwin-x64" "16.7.4"
"@nx/nx-freebsd-x64" "16.7.2" "@nx/nx-freebsd-x64" "16.7.4"
"@nx/nx-linux-arm-gnueabihf" "16.7.2" "@nx/nx-linux-arm-gnueabihf" "16.7.4"
"@nx/nx-linux-arm64-gnu" "16.7.2" "@nx/nx-linux-arm64-gnu" "16.7.4"
"@nx/nx-linux-arm64-musl" "16.7.2" "@nx/nx-linux-arm64-musl" "16.7.4"
"@nx/nx-linux-x64-gnu" "16.7.2" "@nx/nx-linux-x64-gnu" "16.7.4"
"@nx/nx-linux-x64-musl" "16.7.2" "@nx/nx-linux-x64-musl" "16.7.4"
"@nx/nx-win32-arm64-msvc" "16.7.2" "@nx/nx-win32-arm64-msvc" "16.7.4"
"@nx/nx-win32-x64-msvc" "16.7.2" "@nx/nx-win32-x64-msvc" "16.7.4"
oauth@0.9.x: oauth@0.9.x:
version "0.9.15" version "0.9.15"
@ -15884,15 +15876,15 @@ prelude-ls@~1.1.2:
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==
prettier-plugin-organize-attributes@0.0.5: prettier-plugin-organize-attributes@1.0.0:
version "0.0.5" version "1.0.0"
resolved "https://registry.yarnpkg.com/prettier-plugin-organize-attributes/-/prettier-plugin-organize-attributes-0.0.5.tgz#46e54533936fc42a3cff3d876a738a3f98df0360" resolved "https://registry.yarnpkg.com/prettier-plugin-organize-attributes/-/prettier-plugin-organize-attributes-1.0.0.tgz#037870ee3111b3c1d6371f677b64888de353cc63"
integrity sha512-dSts16q8wd+oq8Zwk5mwmYXo1aN3B+ZkEJqx/ar5fedNHdOvx7S4XDMH/pNK7rmBW0bPXkp/kJX5gAANsWzh3A== integrity sha512-+NmameaLxbCcylEXsKPmawtzla5EE6ECqvGkpfQz4KM847fXDifB1gFnPQEpoADAq6IXg+cMI8Z0ISJEXa6fhg==
prettier@2.8.4: prettier@3.0.2:
version "2.8.4" version "3.0.2"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.4.tgz#34dd2595629bfbb79d344ac4a91ff948694463c3" resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.0.2.tgz#78fcecd6d870551aa5547437cdae39d4701dca5b"
integrity sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw== integrity sha512-o2YR9qtniXvwEZlOKbveKfDQVyqxbEIWn48Z8m3ZJjBjcCmUy3xZGIv+7AkaeuaTr6yPXJjwv07ZWlsWbEy1rQ==
prettier@^2.8.0: prettier@^2.8.0:
version "2.8.8" version "2.8.8"
@ -15926,12 +15918,12 @@ pretty-hrtime@^1.0.3:
resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1"
integrity sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A== integrity sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==
prisma@4.16.2: prisma@5.2.0:
version "4.16.2" version "5.2.0"
resolved "https://registry.yarnpkg.com/prisma/-/prisma-4.16.2.tgz#469e0a0991c6ae5bcde289401726bb012253339e" resolved "https://registry.yarnpkg.com/prisma/-/prisma-5.2.0.tgz#a302dc2635cdec1d22d552ece837fb29a03563b9"
integrity sha512-SYCsBvDf0/7XSJyf2cHTLjLeTLVXYfqp7pG5eEVafFLeT0u/hLFz/9W196nDRGUOo1JfPatAEb+uEnTQImQC1g== integrity sha512-FfFlpjVCkZwrqxDnP4smlNYSH1so+CbfjgdpioFzGGqlQAEm6VHAYSzV7jJgC3ebtY9dNOhDMS2+4/1DDSM7bQ==
dependencies: dependencies:
"@prisma/engines" "4.16.2" "@prisma/engines" "5.2.0"
prismjs@^1.28.0: prismjs@^1.28.0:
version "1.29.0" version "1.29.0"
@ -16474,14 +16466,14 @@ repeat-string@^1.6.1:
resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==
replace-in-file@6.3.5: replace-in-file@7.0.1:
version "6.3.5" version "7.0.1"
resolved "https://registry.yarnpkg.com/replace-in-file/-/replace-in-file-6.3.5.tgz#ff956b0ab5bc96613207d603d197cd209400a654" resolved "https://registry.yarnpkg.com/replace-in-file/-/replace-in-file-7.0.1.tgz#1bb69a2e5596341cc6f0f581309add6c1d364b71"
integrity sha512-arB9d3ENdKva2fxRnSjwBEXfK1npgyci7ZZuwysgAp7ORjHSyxz6oqIjTEv8R0Ydl4Ll7uOAZXL4vbkhGIizCg== integrity sha512-KbhgPq04eA+TxXuUxpgWIH9k/TjF+28ofon2PXP7vq6izAILhxOtksCVcLuuQLtyjouBaPdlH6RJYYcSPVxCOA==
dependencies: dependencies:
chalk "^4.1.2" chalk "^4.1.2"
glob "^7.2.0" glob "^8.1.0"
yargs "^17.2.1" yargs "^17.7.2"
request-progress@^3.0.0: request-progress@^3.0.0:
version "3.0.0" version "3.0.0"
@ -19043,10 +19035,10 @@ y18n@^5.0.5:
resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
yahoo-finance2@2.4.3: yahoo-finance2@2.4.4:
version "2.4.3" version "2.4.4"
resolved "https://registry.yarnpkg.com/yahoo-finance2/-/yahoo-finance2-2.4.3.tgz#be4099182dc0a2e2908779e04d7b802688c15f0e" resolved "https://registry.yarnpkg.com/yahoo-finance2/-/yahoo-finance2-2.4.4.tgz#3149a4f2e6fab04430aabe7758bfbc70f240503e"
integrity sha512-LVcl+h4XBMe3N/l8BOZdDFoK7AGMiblSBE00dU9t2zB0Zfxa6QQMESnUkJ1m35RWBr8QXFJyJnToPt+qKiEQXQ== integrity sha512-dL8bz3ubmPYRHd2M85hyL8kcVVlvpTGdzqeuewMH6X1Ej/lo4/2qlbAqZVT4qlcFeuEdlEIZ1N/mFp6SFnW8Uw==
dependencies: dependencies:
"@types/tough-cookie" "^4.0.2" "@types/tough-cookie" "^4.0.2"
ajv "8.10.0" ajv "8.10.0"
@ -19082,7 +19074,7 @@ yargs-parser@^11.1.1:
camelcase "^5.0.0" camelcase "^5.0.0"
decamelize "^1.2.0" decamelize "^1.2.0"
yargs@17.7.2, yargs@^17.2.1, yargs@^17.3.1, yargs@^17.6.2: yargs@17.7.2, yargs@^17.2.1, yargs@^17.3.1, yargs@^17.6.2, yargs@^17.7.2:
version "17.7.2" version "17.7.2"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269"
integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==

Loading…
Cancel
Save