diff --git a/CHANGELOG.md b/CHANGELOG.md index c4cf9b41b..a2e9f9823 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +#### Changed + +- Upgraded `envalid` from version `8.1.0` to `8.1.1` +- Upgraded `prettier` from version `3.7.3` to `3.7.4` + +## 2.221.0 - 2025-12-01 + ### Changed - Refactored the API query parameters in various data provider services @@ -17,6 +24,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - Improved the country weightings in the _Financial Modeling Prep_ service +- Improved the search functionality by name in the _Financial Modeling Prep_ service +- Resolved an issue in the user endpoint where the list was returning empty in the admin control panel’s users section ## 2.220.0 - 2025-11-29 @@ -2252,7 +2261,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - Fixed an issue in the portfolio summary with the currency conversion of fees -- Fixed an issue in the the search for a holding +- Fixed an issue in the search for a holding - Removed the show condition of the experimental features setting in the user settings ## 2.95.0 - 2024-07-12 diff --git a/apps/api/src/app/admin/admin.service.ts b/apps/api/src/app/admin/admin.service.ts index 0a6df7647..705085a48 100644 --- a/apps/api/src/app/admin/admin.service.ts +++ b/apps/api/src/app/admin/admin.service.ts @@ -532,12 +532,7 @@ export class AdminService { this.countUsersWithAnalytics(), this.getUsersWithAnalytics({ skip, - take, - where: { - NOT: { - analytics: null - } - } + take }) ]); @@ -855,6 +850,20 @@ export class AdminService { } } ]; + + const noAnalyticsCondition: Prisma.UserWhereInput['NOT'] = { + analytics: null + }; + + if (where) { + if (where.NOT) { + where.NOT = { ...where.NOT, ...noAnalyticsCondition }; + } else { + where.NOT = noAnalyticsCondition; + } + } else { + where = { NOT: noAnalyticsCondition }; + } } const usersWithAnalytics = await this.prismaService.user.findMany({ diff --git a/apps/api/src/app/subscription/subscription.service.ts b/apps/api/src/app/subscription/subscription.service.ts index 0458005c9..0fad8c8ac 100644 --- a/apps/api/src/app/subscription/subscription.service.ts +++ b/apps/api/src/app/subscription/subscription.service.ts @@ -179,6 +179,8 @@ export class SubscriptionService { offerKey = 'renewal-early-bird-2023'; } else if (isBefore(createdAt, parseDate('2024-01-01'))) { offerKey = 'renewal-early-bird-2024'; + } else if (isBefore(createdAt, parseDate('2025-12-01'))) { + offerKey = 'renewal-early-bird-2025'; } const offer = await this.getSubscriptionOffer({ diff --git a/apps/api/src/interceptors/redact-values-in-response/redact-values-in-response.interceptor.ts b/apps/api/src/interceptors/redact-values-in-response/redact-values-in-response.interceptor.ts index 5e28e1591..5ecf7c48d 100644 --- a/apps/api/src/interceptors/redact-values-in-response/redact-values-in-response.interceptor.ts +++ b/apps/api/src/interceptors/redact-values-in-response/redact-values-in-response.interceptor.ts @@ -16,9 +16,10 @@ import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; @Injectable() -export class RedactValuesInResponseInterceptor - implements NestInterceptor -{ +export class RedactValuesInResponseInterceptor implements NestInterceptor< + T, + any +> { public intercept( context: ExecutionContext, next: CallHandler diff --git a/apps/api/src/interceptors/transform-data-source-in-request/transform-data-source-in-request.interceptor.ts b/apps/api/src/interceptors/transform-data-source-in-request/transform-data-source-in-request.interceptor.ts index 3931f362c..3bd9c05e7 100644 --- a/apps/api/src/interceptors/transform-data-source-in-request/transform-data-source-in-request.interceptor.ts +++ b/apps/api/src/interceptors/transform-data-source-in-request/transform-data-source-in-request.interceptor.ts @@ -11,9 +11,9 @@ import { DataSource } from '@prisma/client'; import { Observable } from 'rxjs'; @Injectable() -export class TransformDataSourceInRequestInterceptor - implements NestInterceptor -{ +export class TransformDataSourceInRequestInterceptor< + T +> implements NestInterceptor { public constructor( private readonly configurationService: ConfigurationService ) {} diff --git a/apps/api/src/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor.ts b/apps/api/src/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor.ts index fea5d6fe6..9af256671 100644 --- a/apps/api/src/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor.ts +++ b/apps/api/src/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor.ts @@ -13,9 +13,9 @@ import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; @Injectable() -export class TransformDataSourceInResponseInterceptor - implements NestInterceptor -{ +export class TransformDataSourceInResponseInterceptor< + T +> implements NestInterceptor { private encodedDataSourceMap: { [dataSource: string]: string; } = {}; diff --git a/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.ts b/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.ts index ecbc38256..65bcd6c06 100644 --- a/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.ts +++ b/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.ts @@ -317,7 +317,7 @@ export class YahooFinanceDataEnhancerService implements DataEnhancerInterface { return { assetClass, assetSubClass }; } - private parseSector(aString: string): string { + private parseSector(aString: string) { let sector = UNKNOWN_KEY; switch (aString) { diff --git a/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts b/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts index 27f462c90..2b4193af5 100644 --- a/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts +++ b/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts @@ -41,6 +41,7 @@ import { isSameDay, parseISO } from 'date-fns'; +import { uniqBy } from 'lodash'; @Injectable() export class FinancialModelingPrepService implements DataProviderInterface { @@ -549,14 +550,27 @@ export class FinancialModelingPrepService implements DataProviderInterface { apikey: this.apiKey }); - const result = await fetch( - `${this.getUrl({ version: 'stable' })}/search-symbol?${queryParams.toString()}`, - { - signal: AbortSignal.timeout( - this.configurationService.get('REQUEST_TIMEOUT') - ) + const [nameResults, symbolResults] = await Promise.all([ + fetch( + `${this.getUrl({ version: 'stable' })}/search-name?${queryParams.toString()}`, + { + signal: AbortSignal.timeout(requestTimeout) + } + ).then((res) => res.json()), + fetch( + `${this.getUrl({ version: 'stable' })}/search-symbol?${queryParams.toString()}`, + { + signal: AbortSignal.timeout(requestTimeout) + } + ).then((res) => res.json()) + ]); + + const result = uniqBy( + [...nameResults, ...symbolResults], + ({ exchange, symbol }) => { + return `${exchange}-${symbol}`; } - ).then((res) => res.json()); + ); items = result .filter(({ exchange, symbol }) => { diff --git a/apps/client/src/app/pages/blog/blog-page.routes.ts b/apps/client/src/app/pages/blog/blog-page.routes.ts index 36d111c19..90d27bdfb 100644 --- a/apps/client/src/app/pages/blog/blog-page.routes.ts +++ b/apps/client/src/app/pages/blog/blog-page.routes.ts @@ -34,117 +34,117 @@ export const routes: Routes = [ canActivate: [AuthGuard], path: '2022/01/ghostfolio-first-months-in-open-source', loadComponent: () => - import( - './2022/01/first-months-in-open-source/first-months-in-open-source-page.component' - ).then((c) => c.FirstMonthsInOpenSourcePageComponent), + import('./2022/01/first-months-in-open-source/first-months-in-open-source-page.component').then( + (c) => c.FirstMonthsInOpenSourcePageComponent + ), title: 'First months in Open Source' }, { canActivate: [AuthGuard], path: '2022/07/ghostfolio-meets-internet-identity', loadComponent: () => - import( - './2022/07/ghostfolio-meets-internet-identity/ghostfolio-meets-internet-identity-page.component' - ).then((c) => c.GhostfolioMeetsInternetIdentityPageComponent), + import('./2022/07/ghostfolio-meets-internet-identity/ghostfolio-meets-internet-identity-page.component').then( + (c) => c.GhostfolioMeetsInternetIdentityPageComponent + ), title: 'Ghostfolio meets Internet Identity' }, { canActivate: [AuthGuard], path: '2022/07/how-do-i-get-my-finances-in-order', loadComponent: () => - import( - './2022/07/how-do-i-get-my-finances-in-order/how-do-i-get-my-finances-in-order-page.component' - ).then((c) => c.HowDoIGetMyFinancesInOrderPageComponent), + import('./2022/07/how-do-i-get-my-finances-in-order/how-do-i-get-my-finances-in-order-page.component').then( + (c) => c.HowDoIGetMyFinancesInOrderPageComponent + ), title: 'How do I get my finances in order?' }, { canActivate: [AuthGuard], path: '2022/08/500-stars-on-github', loadComponent: () => - import( - './2022/08/500-stars-on-github/500-stars-on-github-page.component' - ).then((c) => c.FiveHundredStarsOnGitHubPageComponent), + import('./2022/08/500-stars-on-github/500-stars-on-github-page.component').then( + (c) => c.FiveHundredStarsOnGitHubPageComponent + ), title: '500 Stars on GitHub' }, { canActivate: [AuthGuard], path: '2022/10/hacktoberfest-2022', loadComponent: () => - import( - './2022/10/hacktoberfest-2022/hacktoberfest-2022-page.component' - ).then((c) => c.Hacktoberfest2022PageComponent), + import('./2022/10/hacktoberfest-2022/hacktoberfest-2022-page.component').then( + (c) => c.Hacktoberfest2022PageComponent + ), title: 'Hacktoberfest 2022' }, { canActivate: [AuthGuard], path: '2022/11/black-friday-2022', loadComponent: () => - import( - './2022/11/black-friday-2022/black-friday-2022-page.component' - ).then((c) => c.BlackFriday2022PageComponent), + import('./2022/11/black-friday-2022/black-friday-2022-page.component').then( + (c) => c.BlackFriday2022PageComponent + ), title: 'Black Friday 2022' }, { canActivate: [AuthGuard], path: '2022/12/the-importance-of-tracking-your-personal-finances', loadComponent: () => - import( - './2022/12/the-importance-of-tracking-your-personal-finances/the-importance-of-tracking-your-personal-finances-page.component' - ).then((c) => c.TheImportanceOfTrackingYourPersonalFinancesPageComponent), + import('./2022/12/the-importance-of-tracking-your-personal-finances/the-importance-of-tracking-your-personal-finances-page.component').then( + (c) => c.TheImportanceOfTrackingYourPersonalFinancesPageComponent + ), title: 'The importance of tracking your personal finances' }, { canActivate: [AuthGuard], path: '2023/01/ghostfolio-auf-sackgeld-vorgestellt', loadComponent: () => - import( - './2023/01/ghostfolio-auf-sackgeld-vorgestellt/ghostfolio-auf-sackgeld-vorgestellt-page.component' - ).then((c) => c.GhostfolioAufSackgeldVorgestelltPageComponent), + import('./2023/01/ghostfolio-auf-sackgeld-vorgestellt/ghostfolio-auf-sackgeld-vorgestellt-page.component').then( + (c) => c.GhostfolioAufSackgeldVorgestelltPageComponent + ), title: 'Ghostfolio auf Sackgeld.com vorgestellt' }, { canActivate: [AuthGuard], path: '2023/02/ghostfolio-meets-umbrel', loadComponent: () => - import( - './2023/02/ghostfolio-meets-umbrel/ghostfolio-meets-umbrel-page.component' - ).then((c) => c.GhostfolioMeetsUmbrelPageComponent), + import('./2023/02/ghostfolio-meets-umbrel/ghostfolio-meets-umbrel-page.component').then( + (c) => c.GhostfolioMeetsUmbrelPageComponent + ), title: 'Ghostfolio meets Umbrel' }, { canActivate: [AuthGuard], path: '2023/03/ghostfolio-reaches-1000-stars-on-github', loadComponent: () => - import( - './2023/03/1000-stars-on-github/1000-stars-on-github-page.component' - ).then((c) => c.ThousandStarsOnGitHubPageComponent), + import('./2023/03/1000-stars-on-github/1000-stars-on-github-page.component').then( + (c) => c.ThousandStarsOnGitHubPageComponent + ), title: 'Ghostfolio reaches 1’000 Stars on GitHub' }, { canActivate: [AuthGuard], path: '2023/05/unlock-your-financial-potential-with-ghostfolio', loadComponent: () => - import( - './2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page.component' - ).then((c) => c.UnlockYourFinancialPotentialWithGhostfolioPageComponent), + import('./2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page.component').then( + (c) => c.UnlockYourFinancialPotentialWithGhostfolioPageComponent + ), title: 'Unlock your Financial Potential with Ghostfolio' }, { canActivate: [AuthGuard], path: '2023/07/exploring-the-path-to-fire', loadComponent: () => - import( - './2023/07/exploring-the-path-to-fire/exploring-the-path-to-fire-page.component' - ).then((c) => c.ExploringThePathToFirePageComponent), + import('./2023/07/exploring-the-path-to-fire/exploring-the-path-to-fire-page.component').then( + (c) => c.ExploringThePathToFirePageComponent + ), 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), + import('./2023/08/ghostfolio-joins-oss-friends/ghostfolio-joins-oss-friends-page.component').then( + (c) => c.GhostfolioJoinsOssFriendsPageComponent + ), title: 'Ghostfolio joins OSS Friends' }, { @@ -160,9 +160,9 @@ export const routes: Routes = [ canActivate: [AuthGuard], path: '2023/09/hacktoberfest-2023', loadComponent: () => - import( - './2023/09/hacktoberfest-2023/hacktoberfest-2023-page.component' - ).then((c) => c.Hacktoberfest2023PageComponent), + import('./2023/09/hacktoberfest-2023/hacktoberfest-2023-page.component').then( + (c) => c.Hacktoberfest2023PageComponent + ), title: 'Hacktoberfest 2023' }, { @@ -178,18 +178,18 @@ export const routes: Routes = [ canActivate: [AuthGuard], path: '2023/11/hacktoberfest-2023-debriefing', loadComponent: () => - import( - './2023/11/hacktoberfest-2023-debriefing/hacktoberfest-2023-debriefing-page.component' - ).then((c) => c.Hacktoberfest2023DebriefingPageComponent), + import('./2023/11/hacktoberfest-2023-debriefing/hacktoberfest-2023-debriefing-page.component').then( + (c) => c.Hacktoberfest2023DebriefingPageComponent + ), title: 'Hacktoberfest 2023 Debriefing' }, { canActivate: [AuthGuard], path: '2024/09/hacktoberfest-2024', loadComponent: () => - import( - './2024/09/hacktoberfest-2024/hacktoberfest-2024-page.component' - ).then((c) => c.Hacktoberfest2024PageComponent), + import('./2024/09/hacktoberfest-2024/hacktoberfest-2024-page.component').then( + (c) => c.Hacktoberfest2024PageComponent + ), title: 'Hacktoberfest 2024' }, { @@ -205,9 +205,9 @@ export const routes: Routes = [ canActivate: [AuthGuard], path: '2025/09/hacktoberfest-2025', loadComponent: () => - import( - './2025/09/hacktoberfest-2025/hacktoberfest-2025-page.component' - ).then((c) => c.Hacktoberfest2025PageComponent), + import('./2025/09/hacktoberfest-2025/hacktoberfest-2025-page.component').then( + (c) => c.Hacktoberfest2025PageComponent + ), title: 'Hacktoberfest 2025' }, { diff --git a/apps/client/src/app/pages/resources/resources-page.routes.ts b/apps/client/src/app/pages/resources/resources-page.routes.ts index 58cdad4d3..107988238 100644 --- a/apps/client/src/app/pages/resources/resources-page.routes.ts +++ b/apps/client/src/app/pages/resources/resources-page.routes.ts @@ -33,9 +33,9 @@ export const routes: Routes = [ { path: publicRoutes.resources.subRoutes.personalFinanceTools.path, loadChildren: () => - import( - './personal-finance-tools/personal-finance-tools-page.routes' - ).then((m) => m.routes) + import('./personal-finance-tools/personal-finance-tools-page.routes').then( + (m) => m.routes + ) } ], path: '', diff --git a/libs/common/src/lib/interfaces/responses/data-provider-ghostfolio-asset-profile-response.interface.ts b/libs/common/src/lib/interfaces/responses/data-provider-ghostfolio-asset-profile-response.interface.ts index 7fd0314fb..3ea635c6d 100644 --- a/libs/common/src/lib/interfaces/responses/data-provider-ghostfolio-asset-profile-response.interface.ts +++ b/libs/common/src/lib/interfaces/responses/data-provider-ghostfolio-asset-profile-response.interface.ts @@ -1,4 +1,3 @@ import { SymbolProfile } from '@prisma/client'; -export interface DataProviderGhostfolioAssetProfileResponse - extends Partial {} +export interface DataProviderGhostfolioAssetProfileResponse extends Partial {} diff --git a/libs/common/src/lib/interfaces/simplewebauthn.interface.ts b/libs/common/src/lib/interfaces/simplewebauthn.interface.ts index ef0a14ffa..69464b961 100644 --- a/libs/common/src/lib/interfaces/simplewebauthn.interface.ts +++ b/libs/common/src/lib/interfaces/simplewebauthn.interface.ts @@ -3,8 +3,7 @@ export interface AuthenticatorAssertionResponse extends AuthenticatorResponse { readonly signature: ArrayBuffer; readonly userHandle: ArrayBuffer | null; } -export interface AuthenticatorAttestationResponse - extends AuthenticatorResponse { +export interface AuthenticatorAttestationResponse extends AuthenticatorResponse { readonly attestationObject: ArrayBuffer; } export interface AuthenticationExtensionsClientInputs { @@ -57,8 +56,7 @@ export interface PublicKeyCredentialRequestOptions { timeout?: number; userVerification?: UserVerificationRequirement; } -export interface PublicKeyCredentialUserEntity - extends PublicKeyCredentialEntity { +export interface PublicKeyCredentialUserEntity extends PublicKeyCredentialEntity { displayName: string; id: BufferSource; } @@ -99,11 +97,10 @@ export declare type BufferSource = ArrayBufferView | ArrayBuffer; export declare type PublicKeyCredentialType = 'public-key'; export declare type UvmEntry = number[]; -export interface PublicKeyCredentialCreationOptionsJSON - extends Omit< - PublicKeyCredentialCreationOptions, - 'challenge' | 'user' | 'excludeCredentials' - > { +export interface PublicKeyCredentialCreationOptionsJSON extends Omit< + PublicKeyCredentialCreationOptions, + 'challenge' | 'user' | 'excludeCredentials' +> { user: PublicKeyCredentialUserEntityJSON; challenge: Base64URLString; excludeCredentials: PublicKeyCredentialDescriptorJSON[]; @@ -113,21 +110,24 @@ export interface PublicKeyCredentialCreationOptionsJSON * A variant of PublicKeyCredentialRequestOptions suitable for JSON transmission to the browser to * (eventually) get passed into navigator.credentials.get(...) in the browser. */ -export interface PublicKeyCredentialRequestOptionsJSON - extends Omit< - PublicKeyCredentialRequestOptions, - 'challenge' | 'allowCredentials' - > { +export interface PublicKeyCredentialRequestOptionsJSON extends Omit< + PublicKeyCredentialRequestOptions, + 'challenge' | 'allowCredentials' +> { challenge: Base64URLString; allowCredentials?: PublicKeyCredentialDescriptorJSON[]; extensions?: AuthenticationExtensionsClientInputs; } -export interface PublicKeyCredentialDescriptorJSON - extends Omit { +export interface PublicKeyCredentialDescriptorJSON extends Omit< + PublicKeyCredentialDescriptor, + 'id' +> { id: Base64URLString; } -export interface PublicKeyCredentialUserEntityJSON - extends Omit { +export interface PublicKeyCredentialUserEntityJSON extends Omit< + PublicKeyCredentialUserEntity, + 'id' +> { id: string; } /** @@ -140,11 +140,10 @@ export interface AttestationCredential extends PublicKeyCredential { * A slightly-modified AttestationCredential to simplify working with ArrayBuffers that * are Base64URL-encoded in the browser so that they can be sent as JSON to the server. */ -export interface AttestationCredentialJSON - extends Omit< - AttestationCredential, - 'response' | 'rawId' | 'getClientExtensionResults' - > { +export interface AttestationCredentialJSON extends Omit< + AttestationCredential, + 'response' | 'rawId' | 'getClientExtensionResults' +> { rawId: Base64URLString; response: AuthenticatorAttestationResponseJSON; clientExtensionResults: AuthenticationExtensionsClientOutputs; @@ -160,11 +159,10 @@ export interface AssertionCredential extends PublicKeyCredential { * A slightly-modified AssertionCredential to simplify working with ArrayBuffers that * are Base64URL-encoded in the browser so that they can be sent as JSON to the server. */ -export interface AssertionCredentialJSON - extends Omit< - AssertionCredential, - 'response' | 'rawId' | 'getClientExtensionResults' - > { +export interface AssertionCredentialJSON extends Omit< + AssertionCredential, + 'response' | 'rawId' | 'getClientExtensionResults' +> { rawId: Base64URLString; response: AuthenticatorAssertionResponseJSON; clientExtensionResults: AuthenticationExtensionsClientOutputs; @@ -173,11 +171,10 @@ export interface AssertionCredentialJSON * A slightly-modified AuthenticatorAttestationResponse to simplify working with ArrayBuffers that * are Base64URL-encoded in the browser so that they can be sent as JSON to the server. */ -export interface AuthenticatorAttestationResponseJSON - extends Omit< - AuthenticatorAttestationResponseFuture, - 'clientDataJSON' | 'attestationObject' - > { +export interface AuthenticatorAttestationResponseJSON extends Omit< + AuthenticatorAttestationResponseFuture, + 'clientDataJSON' | 'attestationObject' +> { clientDataJSON: Base64URLString; attestationObject: Base64URLString; } @@ -185,11 +182,10 @@ export interface AuthenticatorAttestationResponseJSON * A slightly-modified AuthenticatorAssertionResponse to simplify working with ArrayBuffers that * are Base64URL-encoded in the browser so that they can be sent as JSON to the server. */ -export interface AuthenticatorAssertionResponseJSON - extends Omit< - AuthenticatorAssertionResponse, - 'authenticatorData' | 'clientDataJSON' | 'signature' | 'userHandle' - > { +export interface AuthenticatorAssertionResponseJSON extends Omit< + AuthenticatorAssertionResponse, + 'authenticatorData' | 'clientDataJSON' | 'signature' | 'userHandle' +> { authenticatorData: Base64URLString; clientDataJSON: Base64URLString; signature: Base64URLString; @@ -217,8 +213,7 @@ export declare type Base64URLString = string; * * Properties marked optional are not supported in all browsers. */ -export interface AuthenticatorAttestationResponseFuture - extends AuthenticatorAttestationResponse { +export interface AuthenticatorAttestationResponseFuture extends AuthenticatorAttestationResponse { getTransports?: () => AuthenticatorTransport[]; getAuthenticatorData?: () => ArrayBuffer; getPublicKey?: () => ArrayBuffer; diff --git a/libs/common/src/lib/types/subscription-offer-key.type.ts b/libs/common/src/lib/types/subscription-offer-key.type.ts index f6d898a01..89322a400 100644 --- a/libs/common/src/lib/types/subscription-offer-key.type.ts +++ b/libs/common/src/lib/types/subscription-offer-key.type.ts @@ -2,4 +2,5 @@ export type SubscriptionOfferKey = | 'default' | 'renewal' | 'renewal-early-bird-2023' - | 'renewal-early-bird-2024'; + | 'renewal-early-bird-2024' + | 'renewal-early-bird-2025'; diff --git a/libs/common/src/lib/validators/is-currency-code.ts b/libs/common/src/lib/validators/is-currency-code.ts index 771818b05..76c6f4fe2 100644 --- a/libs/common/src/lib/validators/is-currency-code.ts +++ b/libs/common/src/lib/validators/is-currency-code.ts @@ -21,9 +21,7 @@ export function IsCurrencyCode(validationOptions?: ValidationOptions) { } @ValidatorConstraint({ async: false }) -export class IsExtendedCurrencyConstraint - implements ValidatorConstraintInterface -{ +export class IsExtendedCurrencyConstraint implements ValidatorConstraintInterface { public defaultMessage() { return '$property must be a valid ISO4217 currency code'; } diff --git a/libs/ui/src/lib/assistant/interfaces/interfaces.ts b/libs/ui/src/lib/assistant/interfaces/interfaces.ts index e018e0eb6..c00a2b832 100644 --- a/libs/ui/src/lib/assistant/interfaces/interfaces.ts +++ b/libs/ui/src/lib/assistant/interfaces/interfaces.ts @@ -3,8 +3,10 @@ import { AccountWithValue, DateRange } from '@ghostfolio/common/types'; import { SearchMode } from '../enums/search-mode'; -export interface AccountSearchResultItem - extends Pick { +export interface AccountSearchResultItem extends Pick< + AccountWithValue, + 'id' | 'name' +> { mode: SearchMode.ACCOUNT; routerLink: string[]; } diff --git a/libs/ui/src/lib/entity-logo/entity-logo.component.html b/libs/ui/src/lib/entity-logo/entity-logo.component.html index f0abad285..942ea23e5 100644 --- a/libs/ui/src/lib/entity-logo/entity-logo.component.html +++ b/libs/ui/src/lib/entity-logo/entity-logo.component.html @@ -1,6 +1,6 @@ @if (src) {