diff --git a/.eslintrc.json b/.eslintrc.json index 445d2d477..41157718c 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -143,7 +143,6 @@ // The following rules are part of @typescript-eslint/stylistic-type-checked // and can be remove once solved "@typescript-eslint/prefer-nullish-coalescing": "warn", // TODO: Requires strictNullChecks: true - "@typescript-eslint/consistent-type-assertions": "warn", "@typescript-eslint/prefer-optional-chain": "warn", "@typescript-eslint/consistent-indexed-object-style": "warn", "@typescript-eslint/consistent-generic-constructors": "warn" diff --git a/CHANGELOG.md b/CHANGELOG.md index f42b96b10..f049bed09 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### Changed + +- Switched the `consistent-type-assertions` rule from `warn` to `error` in the `eslint` configuration + ## 2.119.0 - 2024-10-26 ### Changed diff --git a/apps/api/src/app/account-balance/account-balance.service.ts b/apps/api/src/app/account-balance/account-balance.service.ts index f2b5f907e..34d98d266 100644 --- a/apps/api/src/app/account-balance/account-balance.service.ts +++ b/apps/api/src/app/account-balance/account-balance.service.ts @@ -88,7 +88,7 @@ export class AccountBalanceService { this.eventEmitter.emit( PortfolioChangedEvent.getName(), new PortfolioChangedEvent({ - userId: where.userId + userId: where.userId as string }) ); diff --git a/apps/api/src/app/account/account.service.ts b/apps/api/src/app/account/account.service.ts index 096caba48..df369859b 100644 --- a/apps/api/src/app/account/account.service.ts +++ b/apps/api/src/app/account/account.service.ts @@ -209,8 +209,8 @@ export class AccountService { const { data, where } = params; await this.accountBalanceService.createOrUpdateAccountBalance({ - accountId: data.id, - balance: data.balance, + accountId: data.id as string, + balance: data.balance as number, date: format(new Date(), DATE_FORMAT), userId: aUserId }); diff --git a/apps/api/src/app/admin/queue/queue.controller.ts b/apps/api/src/app/admin/queue/queue.controller.ts index 978cb9721..060abd247 100644 --- a/apps/api/src/app/admin/queue/queue.controller.ts +++ b/apps/api/src/app/admin/queue/queue.controller.ts @@ -26,7 +26,7 @@ export class QueueController { public async deleteJobs( @Query('status') filterByStatus?: string ): Promise { - const status = filterByStatus?.split(',') ?? undefined; + const status = (filterByStatus?.split(',') as JobStatus[]) ?? undefined; return this.queueService.deleteJobs({ status }); } @@ -36,7 +36,7 @@ export class QueueController { public async getJobs( @Query('status') filterByStatus?: string ): Promise { - const status = filterByStatus?.split(',') ?? undefined; + const status = (filterByStatus?.split(',') as JobStatus[]) ?? undefined; return this.queueService.getJobs({ status }); } diff --git a/apps/api/src/app/auth/auth.controller.ts b/apps/api/src/app/auth/auth.controller.ts index 5019bef21..a91525269 100644 --- a/apps/api/src/app/auth/auth.controller.ts +++ b/apps/api/src/app/auth/auth.controller.ts @@ -85,7 +85,7 @@ export class AuthController { @Res() response: Response ) { // Handles the Google OAuth2 callback - const jwt: string = (request.user).jwt; + const jwt: string = (request.user as any).jwt; if (jwt) { response.redirect( diff --git a/apps/api/src/app/benchmark/benchmark.service.ts b/apps/api/src/app/benchmark/benchmark.service.ts index 34f101a8e..36f196842 100644 --- a/apps/api/src/app/benchmark/benchmark.service.ts +++ b/apps/api/src/app/benchmark/benchmark.service.ts @@ -442,10 +442,10 @@ export class BenchmarkService { await this.redisCacheService.set( this.CACHE_KEY_BENCHMARKS, - JSON.stringify({ + JSON.stringify({ benchmarks, expiration: expiration.getTime() - }), + } as BenchmarkValue), CACHE_TTL_INFINITE ); } diff --git a/apps/api/src/app/order/order.service.ts b/apps/api/src/app/order/order.service.ts index 8e69aae6f..5613adc5c 100644 --- a/apps/api/src/app/order/order.service.ts +++ b/apps/api/src/app/order/order.service.ts @@ -410,7 +410,7 @@ export class OrderService { where.SymbolProfile, { AND: [ - { dataSource: filterByDataSource }, + { dataSource: filterByDataSource as DataSource }, { symbol: filterBySymbol } ] } @@ -419,7 +419,7 @@ export class OrderService { } else { where.SymbolProfile = { AND: [ - { dataSource: filterByDataSource }, + { dataSource: filterByDataSource as DataSource }, { symbol: filterBySymbol } ] }; @@ -638,7 +638,7 @@ export class OrderService { { dataSource: data.SymbolProfile.connect.dataSource_symbol.dataSource, - date: data.date, + date: data.date as Date, symbol: data.SymbolProfile.connect.dataSource_symbol.symbol } ], diff --git a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts index 950d9e4d3..6c0d230b0 100644 --- a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts @@ -796,7 +796,7 @@ export class TWRPortfolioCalculator extends PortfolioCalculator { [key: DateRange]: Big; } = {}; - for (const dateRange of [ + for (const dateRange of [ '1d', '1y', '5y', @@ -812,7 +812,7 @@ export class TWRPortfolioCalculator extends PortfolioCalculator { // .map((date) => { // return format(date, 'yyyy'); // }) - ]) { + ] as DateRange[]) { const dateInterval = getIntervalFromDateRange(dateRange); const endDate = dateInterval.endDate; let startDate = dateInterval.startDate; diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index 28df6398d..d88d925a4 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -138,7 +138,7 @@ export class PortfolioService { some: { SymbolProfile: { AND: [ - { dataSource: filterByDataSource }, + { dataSource: filterByDataSource as DataSource }, { symbol: filterBySymbol } ] } @@ -1160,7 +1160,7 @@ export class PortfolioService { public async getReport(impersonationId: string): Promise { const userId = await this.getUserId(impersonationId, this.request.user.id); - const userSettings = this.request.user.Settings.settings; + const userSettings = this.request.user.Settings.settings as UserSettings; const { accounts, holdings, markets, summary } = await this.getDetails({ impersonationId, diff --git a/apps/api/src/app/redis-cache/redis-cache.module.ts b/apps/api/src/app/redis-cache/redis-cache.module.ts index a507479b9..5411309bd 100644 --- a/apps/api/src/app/redis-cache/redis-cache.module.ts +++ b/apps/api/src/app/redis-cache/redis-cache.module.ts @@ -19,11 +19,11 @@ import { RedisCacheService } from './redis-cache.service'; configurationService.get('REDIS_PASSWORD') ); - return { + return { store: redisStore, ttl: configurationService.get('CACHE_TTL'), url: `redis://${redisPassword ? `:${redisPassword}` : ''}@${configurationService.get('REDIS_HOST')}:${configurationService.get('REDIS_PORT')}/${configurationService.get('REDIS_DB')}` - }; + } as RedisClientOptions; } }), ConfigurationModule diff --git a/apps/api/src/app/subscription/subscription.controller.ts b/apps/api/src/app/subscription/subscription.controller.ts index a042b2ea2..f37543fdf 100644 --- a/apps/api/src/app/subscription/subscription.controller.ts +++ b/apps/api/src/app/subscription/subscription.controller.ts @@ -95,7 +95,7 @@ export class SubscriptionController { @Res() response: Response ) { const userId = await this.subscriptionService.createSubscriptionViaStripe( - request.query.checkoutSessionId + request.query.checkoutSessionId as string ); Logger.log( diff --git a/apps/api/src/app/user/update-user-setting.dto.ts b/apps/api/src/app/user/update-user-setting.dto.ts index a4441af92..13a3a5d2c 100644 --- a/apps/api/src/app/user/update-user-setting.dto.ts +++ b/apps/api/src/app/user/update-user-setting.dto.ts @@ -31,11 +31,11 @@ export class UpdateUserSettingDto { @IsOptional() benchmark?: string; - @IsIn(['DARK', 'LIGHT']) + @IsIn(['DARK', 'LIGHT'] as ColorScheme[]) @IsOptional() colorScheme?: ColorScheme; - @IsIn([ + @IsIn([ '1d', '1y', '5y', @@ -48,7 +48,7 @@ export class UpdateUserSettingDto { return format(date, 'yyyy'); } ) - ]) + ] as DateRange[]) @IsOptional() dateRange?: DateRange; @@ -68,7 +68,7 @@ export class UpdateUserSettingDto { @IsOptional() 'filters.tags'?: string[]; - @IsIn(['CHART', 'TABLE']) + @IsIn(['CHART', 'TABLE'] as HoldingsViewMode[]) @IsOptional() holdingsViewMode?: HoldingsViewMode; @@ -100,7 +100,7 @@ export class UpdateUserSettingDto { @IsOptional() savingsRate?: number; - @IsIn(['DEFAULT', 'ZEN']) + @IsIn(['DEFAULT', 'ZEN'] as ViewMode[]) @IsOptional() viewMode?: ViewMode; diff --git a/apps/api/src/app/user/user.controller.ts b/apps/api/src/app/user/user.controller.ts index c23870437..149e06285 100644 --- a/apps/api/src/app/user/user.controller.ts +++ b/apps/api/src/app/user/user.controller.ts @@ -148,7 +148,7 @@ export class UserController { const userSettings: UserSettings = merge( {}, - this.request.user.Settings.settings, + this.request.user.Settings.settings as UserSettings, data ); diff --git a/apps/api/src/app/user/user.service.ts b/apps/api/src/app/user/user.service.ts index d0b7ab983..556d28340 100644 --- a/apps/api/src/app/user/user.service.ts +++ b/apps/api/src/app/user/user.service.ts @@ -116,8 +116,8 @@ export class UserService { accounts: Account, dateOfFirstActivity: firstActivity?.date ?? new Date(), settings: { - ...(Settings.settings), - locale: (Settings.settings)?.locale ?? aLocale + ...(Settings.settings as UserSettings), + locale: (Settings.settings as UserSettings)?.locale ?? aLocale } }; } diff --git a/apps/api/src/services/api/api.service.ts b/apps/api/src/services/api/api.service.ts index 8ff438ef1..052119246 100644 --- a/apps/api/src/services/api/api.service.ts +++ b/apps/api/src/services/api/api.service.ts @@ -34,28 +34,28 @@ export class ApiService { const filters = [ ...accountIds.map((accountId) => { - return { + return { id: accountId, type: 'ACCOUNT' - }; + } as Filter; }), ...assetClasses.map((assetClass) => { - return { + return { id: assetClass, type: 'ASSET_CLASS' - }; + } as Filter; }), ...assetSubClasses.map((assetClass) => { - return { + return { id: assetClass, type: 'ASSET_SUB_CLASS' - }; + } as Filter; }), ...tagIds.map((tagId) => { - return { + return { id: tagId, type: 'TAG' - }; + } as Filter; }) ]; diff --git a/apps/api/src/services/market-data/market-data.service.ts b/apps/api/src/services/market-data/market-data.service.ts index 09f591b9e..c0abdf04e 100644 --- a/apps/api/src/services/market-data/market-data.service.ts +++ b/apps/api/src/services/market-data/market-data.service.ts @@ -144,21 +144,21 @@ export class MarketDataService { ({ dataSource, date, marketPrice, symbol, state }) => { return this.prismaService.marketData.upsert({ create: { - dataSource: dataSource, - date: date, - marketPrice: marketPrice, - state: state, - symbol: symbol + dataSource: dataSource as DataSource, + date: date as Date, + marketPrice: marketPrice as number, + state: state as MarketDataState, + symbol: symbol as string }, update: { - marketPrice: marketPrice, - state: state + marketPrice: marketPrice as number, + state: state as MarketDataState }, where: { dataSource_date_symbol: { - dataSource: dataSource, - date: date, - symbol: symbol + dataSource: dataSource as DataSource, + date: date as Date, + symbol: symbol as string } } }); diff --git a/apps/api/src/services/queues/data-gathering/data-gathering.processor.ts b/apps/api/src/services/queues/data-gathering/data-gathering.processor.ts index 5d0d1e131..dc8cc5996 100644 --- a/apps/api/src/services/queues/data-gathering/data-gathering.processor.ts +++ b/apps/api/src/services/queues/data-gathering/data-gathering.processor.ts @@ -78,7 +78,7 @@ export class DataGatheringProcessor { public async gatherHistoricalMarketData(job: Job) { try { const { dataSource, date, symbol } = job.data; - let currentDate = parseISO((date)); + let currentDate = parseISO(date as unknown as string); Logger.log( `Historical market data gathering has been started for ${symbol} (${dataSource}) at ${format( diff --git a/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.processor.ts b/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.processor.ts index c586a51b3..a5a9a37e0 100644 --- a/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.processor.ts +++ b/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.processor.ts @@ -94,10 +94,10 @@ export class PortfolioSnapshotProcessor { filters: job.data.filters, userId: job.data.userId }), - JSON.stringify(({ + JSON.stringify({ expiration: expiration.getTime(), portfolioSnapshot: snapshot - })), + } as unknown as PortfolioSnapshotValue), CACHE_TTL_INFINITE ); diff --git a/apps/api/src/services/symbol-profile/symbol-profile.service.ts b/apps/api/src/services/symbol-profile/symbol-profile.service.ts index 283da7b52..eb8778c34 100644 --- a/apps/api/src/services/symbol-profile/symbol-profile.service.ts +++ b/apps/api/src/services/symbol-profile/symbol-profile.service.ts @@ -176,7 +176,7 @@ export class SymbolProfileService { countries: this.getCountries( symbolProfile?.countries as unknown as Prisma.JsonArray ), - dateOfFirstActivity: undefined, + dateOfFirstActivity: undefined as Date, holdings: this.getHoldings(symbolProfile), scraperConfiguration: this.getScraperConfiguration(symbolProfile), sectors: this.getSectors(symbolProfile), diff --git a/apps/client/src/app/app.component.ts b/apps/client/src/app/app.component.ts index bc16f8080..b67165b68 100644 --- a/apps/client/src/app/app.component.ts +++ b/apps/client/src/app/app.component.ts @@ -292,7 +292,7 @@ export class AppComponent implements OnDestroy, OnInit { const dialogRef = this.dialog.open(GfHoldingDetailDialogComponent, { autoFocus: false, - data: { + data: { dataSource, symbol, baseCurrency: this.user?.settings?.baseCurrency, @@ -312,7 +312,7 @@ export class AppComponent implements OnDestroy, OnInit { hasPermission(this.user?.permissions, permissions.updateOrder) && !this.user?.settings?.isRestrictedView, locale: this.user?.settings?.locale - }, + } as HoldingDetailDialogParams, height: this.deviceType === 'mobile' ? '98vh' : '80vh', width: this.deviceType === 'mobile' ? '100vw' : '50rem' }); diff --git a/apps/client/src/app/components/admin-market-data-detail/admin-market-data-detail.component.ts b/apps/client/src/app/components/admin-market-data-detail/admin-market-data-detail.component.ts index c8ba46851..1742d8307 100644 --- a/apps/client/src/app/components/admin-market-data-detail/admin-market-data-detail.component.ts +++ b/apps/client/src/app/components/admin-market-data-detail/admin-market-data-detail.component.ts @@ -178,14 +178,14 @@ export class AdminMarketDataDetailComponent implements OnChanges { const marketPrice = this.marketDataByMonth[yearMonth]?.[day]?.marketPrice; const dialogRef = this.dialog.open(MarketDataDetailDialog, { - data: { + data: { marketPrice, currency: this.currency, dataSource: this.dataSource, dateString: `${yearMonth}-${day}`, symbol: this.symbol, user: this.user - }, + } as MarketDataDetailDialogParams, height: this.deviceType === 'mobile' ? '98vh' : '80vh', width: this.deviceType === 'mobile' ? '100vw' : '50rem' }); diff --git a/apps/client/src/app/components/admin-market-data/admin-market-data.component.ts b/apps/client/src/app/components/admin-market-data/admin-market-data.component.ts index 777a08d6c..5eb869694 100644 --- a/apps/client/src/app/components/admin-market-data/admin-market-data.component.ts +++ b/apps/client/src/app/components/admin-market-data/admin-market-data.component.ts @@ -71,36 +71,35 @@ export class AdminMarketDataComponent return { id: assetSubClass.toString(), label: translate(assetSubClass), - type: 'ASSET_SUB_CLASS' + type: 'ASSET_SUB_CLASS' as Filter['type'] }; }) .concat([ { id: 'BENCHMARKS', label: $localize`Benchmarks`, - type: 'PRESET_ID' + type: 'PRESET_ID' as Filter['type'] }, { id: 'CURRENCIES', label: $localize`Currencies`, - type: 'PRESET_ID' + type: 'PRESET_ID' as Filter['type'] }, { id: 'ETF_WITHOUT_COUNTRIES', label: $localize`ETFs without Countries`, - type: 'PRESET_ID' + type: 'PRESET_ID' as Filter['type'] }, { id: 'ETF_WITHOUT_SECTORS', label: $localize`ETFs without Sectors`, - type: 'PRESET_ID' + type: 'PRESET_ID' as Filter['type'] } ]); public benchmarks: Partial[]; public currentDataSource: DataSource; public currentSymbol: string; - public dataSource: MatTableDataSource = - new MatTableDataSource(); + public dataSource = new MatTableDataSource(); public defaultDateFormat: string; public deviceType: string; public displayedColumns: string[] = []; @@ -375,13 +374,13 @@ export class AdminMarketDataComponent const dialogRef = this.dialog.open(AssetProfileDialog, { autoFocus: false, - data: { + data: { dataSource, symbol, colorScheme: this.user?.settings.colorScheme, deviceType: this.deviceType, locale: this.user?.settings?.locale - }, + } as AssetProfileDialogParams, height: this.deviceType === 'mobile' ? '98vh' : '80vh', width: this.deviceType === 'mobile' ? '100vw' : '50rem' }); @@ -404,10 +403,10 @@ export class AdminMarketDataComponent const dialogRef = this.dialog.open(CreateAssetProfileDialog, { autoFocus: false, - data: { + data: { deviceType: this.deviceType, locale: this.user?.settings?.locale - }, + } as CreateAssetProfileDialogParams, width: this.deviceType === 'mobile' ? '100vw' : '50rem' }); diff --git a/apps/client/src/app/components/admin-overview/admin-overview.component.ts b/apps/client/src/app/components/admin-overview/admin-overview.component.ts index 15547bb6d..82bb85c13 100644 --- a/apps/client/src/app/components/admin-overview/admin-overview.component.ts +++ b/apps/client/src/app/components/admin-overview/admin-overview.component.ts @@ -225,10 +225,10 @@ export class AdminOverviewComponent implements OnDestroy, OnInit { $localize`Please set your system message:`, JSON.stringify( this.systemMessage ?? - { + ({ message: '⚒️ Scheduled maintenance in progress...', targetGroups: ['Basic', 'Premium'] - } + } as SystemMessage) ) ); diff --git a/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts b/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts index 2035d06a9..4ea3422ec 100644 --- a/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts +++ b/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -98,7 +98,7 @@ export class BenchmarkComparatorComponent implements OnChanges, OnDestroy { } private initialize() { - const benchmarkDataValues: { [date: string]: number } = {}; + const benchmarkDataValues: Record = {}; for (const { date, value } of this.benchmarkDataItems) { benchmarkDataValues[date] = value; @@ -133,9 +133,8 @@ export class BenchmarkComparatorComponent implements OnChanges, OnDestroy { if (this.chartCanvas) { if (this.chart) { this.chart.data = data; - this.chart.options.plugins.tooltip = ( - this.getTooltipPluginConfiguration() - ); + this.chart.options.plugins.tooltip = + this.getTooltipPluginConfiguration() as unknown; this.chart.update(); } else { this.chart = new Chart(this.chartCanvas.nativeElement, { @@ -154,7 +153,7 @@ export class BenchmarkComparatorComponent implements OnChanges, OnDestroy { }, interaction: { intersect: false, mode: 'index' }, maintainAspectRatio: true, - plugins: { + plugins: { annotation: { annotations: { yAxis: { @@ -173,7 +172,7 @@ export class BenchmarkComparatorComponent implements OnChanges, OnDestroy { verticalHoverLine: { color: `rgba(${getTextColor(this.colorScheme)}, 0.1)` } - }, + } as unknown, responsive: true, scales: { x: { @@ -238,7 +237,7 @@ export class BenchmarkComparatorComponent implements OnChanges, OnDestroy { unit: '%' }), mode: 'index', - position: 'top', + position: 'top' as unknown, xAlign: 'center', yAlign: 'bottom' }; diff --git a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts index 792ec6f9c..b430f36ec 100644 --- a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts +++ b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts @@ -148,7 +148,7 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { public ngOnInit() { this.activityForm = this.formBuilder.group({ - tags: [] + tags: [] as string[] }); const filters: Filter[] = [ diff --git a/apps/client/src/app/components/investment-chart/investment-chart.component.ts b/apps/client/src/app/components/investment-chart/investment-chart.component.ts index 7c97ff3e2..aa0ce557a 100644 --- a/apps/client/src/app/components/investment-chart/investment-chart.component.ts +++ b/apps/client/src/app/components/investment-chart/investment-chart.component.ts @@ -154,9 +154,8 @@ export class InvestmentChartComponent implements OnChanges, OnDestroy { if (this.chartCanvas) { if (this.chart) { this.chart.data = chartData; - this.chart.options.plugins.tooltip = ( - this.getTooltipPluginConfiguration() - ); + this.chart.options.plugins.tooltip = + this.getTooltipPluginConfiguration() as unknown; if ( this.savingsRate && @@ -186,7 +185,7 @@ export class InvestmentChartComponent implements OnChanges, OnDestroy { }, interaction: { intersect: false, mode: 'index' }, maintainAspectRatio: true, - plugins: { + plugins: { annotation: { annotations: { savingsRate: this.savingsRate @@ -227,7 +226,7 @@ export class InvestmentChartComponent implements OnChanges, OnDestroy { verticalHoverLine: { color: `rgba(${getTextColor(this.colorScheme)}, 0.1)` } - }, + } as unknown, responsive: true, scales: { x: { @@ -294,7 +293,7 @@ export class InvestmentChartComponent implements OnChanges, OnDestroy { unit: this.isInPercent ? '%' : undefined }), mode: 'index', - position: 'top', + position: 'top' as unknown, xAlign: 'center', yAlign: 'bottom' }; diff --git a/apps/client/src/app/pages/accounts/accounts-page.component.ts b/apps/client/src/app/pages/accounts/accounts-page.component.ts index 88ad3c6a0..a6aa1264c 100644 --- a/apps/client/src/app/pages/accounts/accounts-page.component.ts +++ b/apps/client/src/app/pages/accounts/accounts-page.component.ts @@ -222,7 +222,7 @@ export class AccountsPageComponent implements OnDestroy, OnInit { private openAccountDetailDialog(aAccountId: string) { const dialogRef = this.dialog.open(AccountDetailDialog, { autoFocus: false, - data: { + data: { accountId: aAccountId, deviceType: this.deviceType, hasImpersonationId: this.hasImpersonationId, @@ -230,7 +230,7 @@ export class AccountsPageComponent implements OnDestroy, OnInit { !this.hasImpersonationId && hasPermission(this.user?.permissions, permissions.createOrder) && !this.user?.settings?.isRestrictedView - }, + } as AccountDetailDialogParams, height: this.deviceType === 'mobile' ? '98vh' : '80vh', width: this.deviceType === 'mobile' ? '100vw' : '50rem' }); diff --git a/apps/client/src/app/pages/portfolio/activities/activities-page.component.ts b/apps/client/src/app/pages/portfolio/activities/activities-page.component.ts index 8cab0741d..4f70993db 100644 --- a/apps/client/src/app/pages/portfolio/activities/activities-page.component.ts +++ b/apps/client/src/app/pages/portfolio/activities/activities-page.component.ts @@ -218,10 +218,10 @@ export class ActivitiesPageComponent implements OnDestroy, OnInit { public onImport() { const dialogRef = this.dialog.open(ImportActivitiesDialog, { - data: { + data: { deviceType: this.deviceType, user: this.user - }, + } as ImportActivitiesDialogParams, width: this.deviceType === 'mobile' ? '100vw' : '50rem' }); @@ -235,11 +235,11 @@ export class ActivitiesPageComponent implements OnDestroy, OnInit { public onImportDividends() { const dialogRef = this.dialog.open(ImportActivitiesDialog, { - data: { + data: { activityTypes: ['DIVIDEND'], deviceType: this.deviceType, user: this.user - }, + } as ImportActivitiesDialogParams, width: this.deviceType === 'mobile' ? '100vw' : '50rem' }); diff --git a/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts b/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts index 8ff0554cb..e647c54fb 100644 --- a/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts +++ b/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts @@ -505,7 +505,7 @@ export class AllocationsPageComponent implements OnDestroy, OnInit { private openAccountDetailDialog(aAccountId: string) { const dialogRef = this.dialog.open(AccountDetailDialog, { autoFocus: false, - data: { + data: { accountId: aAccountId, deviceType: this.deviceType, hasImpersonationId: this.hasImpersonationId, @@ -513,7 +513,7 @@ export class AllocationsPageComponent implements OnDestroy, OnInit { !this.hasImpersonationId && hasPermission(this.user?.permissions, permissions.createOrder) && !this.user?.settings?.isRestrictedView - }, + } as AccountDetailDialogParams, height: this.deviceType === 'mobile' ? '98vh' : '80vh', width: this.deviceType === 'mobile' ? '100vw' : '50rem' }); diff --git a/apps/client/src/app/services/data.service.ts b/apps/client/src/app/services/data.service.ts index b5affeb60..abf4b21a0 100644 --- a/apps/client/src/app/services/data.service.ts +++ b/apps/client/src/app/services/data.service.ts @@ -230,8 +230,8 @@ export class DataService { public fetchActivity(aActivityId: string) { return this.http.get(`/api/v1/order/${aActivityId}`).pipe( map((activity) => { - activity.createdAt = parseISO((activity.createdAt)); - activity.date = parseISO((activity.date)); + activity.createdAt = parseISO(activity.createdAt as unknown as string); + activity.date = parseISO(activity.date as unknown as string); return activity; }) @@ -387,8 +387,8 @@ export class DataService { map((data) => { if (data.orders) { for (const order of data.orders) { - order.createdAt = parseISO((order.createdAt)); - order.date = parseISO((order.date)); + order.createdAt = parseISO(order.createdAt as unknown as string); + order.date = parseISO(order.date as unknown as string); } } @@ -399,9 +399,9 @@ export class DataService { public fetchInfo(): InfoItem { const info = cloneDeep((window as any).info); - const utmSource = <'ios' | 'trusted-web-activity'>( - window.localStorage.getItem('utm_source') - ); + const utmSource = window.localStorage.getItem('utm_source') as + | 'ios' + | 'trusted-web-activity'; info.globalPermissions = filterGlobalPermissions( info.globalPermissions, @@ -715,9 +715,9 @@ export class DataService { public updateInfo() { this.http.get('/api/v1/info').subscribe((info) => { - const utmSource = <'ios' | 'trusted-web-activity'>( - window.localStorage.getItem('utm_source') - ); + const utmSource = window.localStorage.getItem('utm_source') as + | 'ios' + | 'trusted-web-activity'; info.globalPermissions = filterGlobalPermissions( info.globalPermissions, diff --git a/apps/client/src/app/services/user/user.service.ts b/apps/client/src/app/services/user/user.service.ts index a36f2a850..3ecc58c16 100644 --- a/apps/client/src/app/services/user/user.service.ts +++ b/apps/client/src/app/services/user/user.service.ts @@ -104,9 +104,9 @@ export class UserService extends ObservableStore { ) { const dialogRef = this.dialog.open(SubscriptionInterstitialDialog, { autoFocus: false, - data: { + data: { user - }, + } as SubscriptionInterstitialDialogParams, height: this.deviceType === 'mobile' ? '98vh' : '80vh', width: this.deviceType === 'mobile' ? '100vw' : '50rem' }); diff --git a/apps/client/src/main.ts b/apps/client/src/main.ts index 9f89777aa..2f656ddf2 100644 --- a/apps/client/src/main.ts +++ b/apps/client/src/main.ts @@ -12,9 +12,9 @@ import { environment } from './environments/environment'; (async () => { const response = await fetch('/api/v1/info'); const info: InfoItem = await response.json(); - const utmSource = <'ios' | 'trusted-web-activity'>( - window.localStorage.getItem('utm_source') - ); + const utmSource = window.localStorage.getItem('utm_source') as + | 'ios' + | 'trusted-web-activity'; info.globalPermissions = filterGlobalPermissions( info.globalPermissions, diff --git a/libs/common/src/lib/config.ts b/libs/common/src/lib/config.ts index 4580ef4df..fbd416bb7 100644 --- a/libs/common/src/lib/config.ts +++ b/libs/common/src/lib/config.ts @@ -125,14 +125,14 @@ export const PROPERTY_SLACK_COMMUNITY_USERS = 'SLACK_COMMUNITY_USERS'; export const PROPERTY_STRIPE_CONFIG = 'STRIPE_CONFIG'; export const PROPERTY_SYSTEM_MESSAGE = 'SYSTEM_MESSAGE'; -export const QUEUE_JOB_STATUS_LIST = [ +export const QUEUE_JOB_STATUS_LIST = [ 'active', 'completed', 'delayed', 'failed', 'paused', 'waiting' -]; +] as JobStatus[]; export const REPLACE_NAME_PARTS = [ 'Amundi Index Solutions -', diff --git a/libs/common/src/lib/helper.ts b/libs/common/src/lib/helper.ts index 005d3d77e..a7cf59a10 100644 --- a/libs/common/src/lib/helper.ts +++ b/libs/common/src/lib/helper.ts @@ -108,7 +108,7 @@ export function downloadAsFile({ content = JSON.stringify(content, undefined, ' '); } - const file = new Blob([content], { + const file = new Blob([content as string], { type: contentType }); a.href = URL.createObjectURL(file); diff --git a/libs/ui/src/lib/activities-filter/activities-filter.component.ts b/libs/ui/src/lib/activities-filter/activities-filter.component.ts index 6244fa5fc..a1258fc19 100644 --- a/libs/ui/src/lib/activities-filter/activities-filter.component.ts +++ b/libs/ui/src/lib/activities-filter/activities-filter.component.ts @@ -157,7 +157,7 @@ export class GfActivitiesFilterComponent implements OnChanges, OnDestroy { for (const type of Object.keys(filterGroupsMap)) { filterGroups.push({ - name: translate(type), + name: translate(type) as Filter['type'], filters: filterGroupsMap[type] }); } diff --git a/libs/ui/src/lib/assistant/assistant.component.ts b/libs/ui/src/lib/assistant/assistant.component.ts index c93d04303..d73cdb416 100644 --- a/libs/ui/src/lib/assistant/assistant.component.ts +++ b/libs/ui/src/lib/assistant/assistant.component.ts @@ -180,10 +180,10 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit { debounceTime(300), distinctUntilChanged(), mergeMap(async (searchTerm) => { - const result = { + const result = { assetProfiles: [], holdings: [] - }; + } as ISearchResults; try { if (searchTerm) { diff --git a/libs/ui/src/lib/benchmark/benchmark.component.ts b/libs/ui/src/lib/benchmark/benchmark.component.ts index f2298a64c..4afd8d053 100644 --- a/libs/ui/src/lib/benchmark/benchmark.component.ts +++ b/libs/ui/src/lib/benchmark/benchmark.component.ts @@ -109,13 +109,13 @@ export class GfBenchmarkComponent implements OnChanges, OnDestroy { symbol }: AssetProfileIdentifier) { const dialogRef = this.dialog.open(GfBenchmarkDetailDialogComponent, { - data: { + data: { dataSource, symbol, colorScheme: this.user?.settings?.colorScheme, deviceType: this.deviceType, locale: this.locale - }, + } as BenchmarkDetailDialogParams, height: this.deviceType === 'mobile' ? '98vh' : undefined, width: this.deviceType === 'mobile' ? '100vw' : '50rem' }); diff --git a/libs/ui/src/lib/line-chart/line-chart.component.ts b/libs/ui/src/lib/line-chart/line-chart.component.ts index e48ead9d9..dc2df1c73 100644 --- a/libs/ui/src/lib/line-chart/line-chart.component.ts +++ b/libs/ui/src/lib/line-chart/line-chart.component.ts @@ -172,15 +172,14 @@ export class GfLineChartComponent if (this.chartCanvas) { if (this.chart) { this.chart.data = data; - this.chart.options.plugins.tooltip = ( - this.getTooltipPluginConfiguration() - ); + this.chart.options.plugins.tooltip = + this.getTooltipPluginConfiguration() as unknown; this.chart.options.animation = this.isAnimated && - { + ({ x: this.getAnimationConfigurationForAxis({ labels, axis: 'x' }), y: this.getAnimationConfigurationForAxis({ labels, axis: 'y' }) - }; + } as unknown); this.chart.update(); } else { this.chart = new Chart(this.chartCanvas.nativeElement, { @@ -188,10 +187,10 @@ export class GfLineChartComponent options: { animation: this.isAnimated && - { + ({ x: this.getAnimationConfigurationForAxis({ labels, axis: 'x' }), y: this.getAnimationConfigurationForAxis({ labels, axis: 'y' }) - }, + } as unknown), aspectRatio: 16 / 9, elements: { point: { @@ -200,7 +199,7 @@ export class GfLineChartComponent } }, interaction: { intersect: false, mode: 'index' }, - plugins: { + plugins: { legend: { align: 'start', display: this.showLegend, @@ -210,7 +209,7 @@ export class GfLineChartComponent verticalHoverLine: { color: `rgba(${getTextColor(this.colorScheme)}, 0.1)` } - }, + } as unknown, scales: { x: { border: { @@ -325,7 +324,7 @@ export class GfLineChartComponent unit: this.unit }), mode: 'index', - position: 'top', + position: 'top' as unknown, xAlign: 'center', yAlign: 'bottom' }; diff --git a/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts b/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts index d3a28dffe..0eef25fa5 100644 --- a/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts +++ b/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts @@ -304,14 +304,14 @@ export class GfPortfolioProportionChartComponent if (this.chartCanvas) { if (this.chart) { this.chart.data = data; - this.chart.options.plugins.tooltip = ( - this.getTooltipPluginConfiguration(data) - ); + this.chart.options.plugins.tooltip = this.getTooltipPluginConfiguration( + data + ) as unknown; this.chart.update(); } else { this.chart = new Chart(this.chartCanvas.nativeElement, { data, - options: { + options: { animation: false, cutout: '70%', layout: { @@ -358,7 +358,7 @@ export class GfPortfolioProportionChartComponent legend: { display: false }, tooltip: this.getTooltipPluginConfiguration(data) } - }, + } as unknown, plugins: [ChartDataLabels], type: 'doughnut' }); @@ -405,7 +405,7 @@ export class GfPortfolioProportionChartComponent symbol = $localize`No data available`; } - const name = translate(this.positions[symbol]?.name); + const name = translate(this.positions[symbol as string]?.name); let sum = 0; for (const item of context.dataset.data) { @@ -414,12 +414,12 @@ export class GfPortfolioProportionChartComponent const percentage = (context.parsed * 100) / sum; - if (context.raw === Number.MAX_SAFE_INTEGER) { + if ((context.raw as number) === Number.MAX_SAFE_INTEGER) { return $localize`No data available`; } else if (this.isInPercent) { return [`${name ?? symbol}`, `${percentage.toFixed(2)}%`]; } else { - const value = context.raw; + const value = context.raw as number; return [ `${name ?? symbol}`, `${value.toLocaleString(this.locale, { diff --git a/libs/ui/src/lib/value/value.component.ts b/libs/ui/src/lib/value/value.component.ts index 43415e87a..06b885ff5 100644 --- a/libs/ui/src/lib/value/value.component.ts +++ b/libs/ui/src/lib/value/value.component.ts @@ -48,7 +48,7 @@ export class GfValueComponent implements OnChanges { if (isNumber(this.value)) { this.isNumber = true; this.isString = false; - this.absoluteValue = Math.abs(this.value); + this.absoluteValue = Math.abs(this.value as number); if (this.colorizeSign) { if (this.isCurrency) { @@ -113,7 +113,7 @@ export class GfValueComponent implements OnChanges { this.isString = true; if (this.isDate) { - this.formattedValue = new Date(this.value).toLocaleDateString( + this.formattedValue = new Date(this.value).toLocaleDateString( this.locale, { day: '2-digit',