diff --git a/.env.dev b/.env.dev new file mode 100644 index 000000000..c4c8a0d35 --- /dev/null +++ b/.env.dev @@ -0,0 +1,25 @@ +COMPOSE_PROJECT_NAME=ghostfolio-development + +# CACHE +REDIS_HOST=localhost +REDIS_PORT=6379 +REDIS_PASSWORD= + +# POSTGRES +POSTGRES_DB=ghostfolio-db +POSTGRES_USER=user +POSTGRES_PASSWORD= + +# VARIOUS +ACCESS_TOKEN_SALT= +DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@localhost:5432/${POSTGRES_DB}?connect_timeout=300&sslmode=prefer +JWT_SECRET_KEY= + +# DEVELOPMENT + +# Nx 18 enables using plugins to infer targets by default +# This is disabled for existing workspaces to maintain compatibility +# For more info, see: https://nx.dev/concepts/inferred-tasks +NX_ADD_PLUGINS=false + +NX_NATIVE_COMMAND_RUNNER=false diff --git a/.env.example b/.env.example index 8df547e37..766894992 100644 --- a/.env.example +++ b/.env.example @@ -1,4 +1,4 @@ -COMPOSE_PROJECT_NAME=ghostfolio-development +COMPOSE_PROJECT_NAME=ghostfolio # CACHE REDIS_HOST=localhost @@ -10,6 +10,7 @@ POSTGRES_DB=ghostfolio-db POSTGRES_USER=user POSTGRES_PASSWORD= +# VARIOUS ACCESS_TOKEN_SALT= DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@localhost:5432/${POSTGRES_DB}?connect_timeout=300&sslmode=prefer JWT_SECRET_KEY= diff --git a/.prettierignore b/.prettierignore index 47a053eee..a40959061 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,3 +1,4 @@ /.nx/cache +/apps/client/src/polyfills.ts /dist /test/import diff --git a/.prettierrc b/.prettierrc index 6a8ad9afa..9a579e2ea 100644 --- a/.prettierrc +++ b/.prettierrc @@ -9,7 +9,26 @@ ], "attributeSort": "ASC", "endOfLine": "auto", - "plugins": ["prettier-plugin-organize-attributes"], + "importOrder": ["^@ghostfolio/(.*)$", "", "^[./]"], + "importOrderSeparation": true, + "overrides": [ + { + "files": "*.html", + "options": { + "parser": "angular" + } + }, + { + "files": "*.ts", + "options": { + "importOrderParserPlugins": ["decorators-legacy", "typescript"] + } + } + ], + "plugins": [ + "prettier-plugin-organize-attributes", + "@trivago/prettier-plugin-sort-imports" + ], "printWidth": 80, "singleQuote": true, "tabWidth": 2, diff --git a/CHANGELOG.md b/CHANGELOG.md index 22fecdb40..440784758 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,270 @@ 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 + +### Added + +- Added the symbol and ISIN number to the position detail dialog +- Added support to delete an asset profile in the asset profile details dialog of the admin control + +### Changed + +- Moved the support to grant private access with permissions from experimental to general availability + +## 2.64.0 - 2024-03-16 + +### Added + +- Added a toggle to switch between active and closed holdings on the portfolio holdings page +- Added support to update the cash balance of an account when adding a fee activity +- Added support to update the cash balance of an account when adding an interest activity +- Extended the content of the _General_ section by the product roadmap on the Frequently Asked Questions (FAQ) page + +### Changed + +- Improved the usability of the platform management in the admin control panel +- Improved the usability of the tag management in the admin control panel +- Improved the exception handling of various rules in the _X-ray_ section +- Increased the timeout to load benchmarks +- Upgraded `prisma` from version `5.10.2` to `5.11.0` + +### Fixed + +- Fixed an issue in the dividend calculation of the portfolio holdings +- Fixed the date conversion of the import of historical market data in the admin control panel + +## 2.63.2 - 2024-03-12 + +### Added + +- Extended the content of the _Self-Hosting_ section by available home server systems on the Frequently Asked Questions (FAQ) page +- Added support for the cryptocurrency _Real Smurf Cat_ (`SMURFCAT-USD`) + +### Changed + +- Upgraded `@simplewebauthn/browser` and `@simplewebauthn/server` from version `8.3` to `9.0` +- Upgraded `countries-list` from version `2.6.1` to `3.1.0` +- Upgraded `yahoo-finance2` from version `2.9.1` to `2.10.0` + +### Fixed + +- Fixed an issue in the performance calculation caused by multiple `SELL` activities on the same day +- Fixed an issue in the calculation on the allocations page caused by liabilities +- Fixed an issue with the currency in the request to get quotes from _EOD Historical Data_ + +## 2.62.0 - 2024-03-09 + +### Changed + +- Optimized the calculation of the accounts table +- Optimized the calculation of the portfolio holdings +- Integrated dividend into the transaction point concept in the portfolio service +- Removed the environment variable `WEB_AUTH_RP_ID` + +### Fixed + +- Fixed an issue in the calculation of the portfolio summary caused by future liabilities +- Fixed an issue with removing a linked account from a (wealth) item activity + +## 2.61.1 - 2024-03-06 + +### Fixed + +- Fixed an issue in the account value calculation caused by liabilities + +## 2.61.0 - 2024-03-04 + +### Changed + +- Optimized the calculation of the portfolio summary + +### Fixed + +- Fixed the activities import (query parameter handling) + +## 2.60.0 - 2024-03-02 + +### Added + +- Added support for the cryptocurrency _Uniswap_ (`UNI7083-USD`) + +### Changed + +- Improved the usability of the benchmarks in the markets overview +- Integrated (wealth) items into the transaction point concept in the portfolio service +- Refreshed the cryptocurrencies list + +### Fixed + +- Fixed a missing value in the activities table on mobile +- Fixed a missing value on the public page +- Displayed the button to fetch the current market price only if the activity is from today + +## 2.59.0 - 2024-02-29 + +### Added + +- Added an index for `isExcluded` to the account database table +- Extended the content of the _Self-Hosting_ section on the Frequently Asked Questions (FAQ) page + +### Changed + +- Improved the activities import by `isin` in the _Yahoo Finance_ service + +### Fixed + +- Fixed an issue with the exchange rate calculation of (wealth) items in accounts + +## 2.58.0 - 2024-02-27 + +### Changed + +- Improved the handling of activities without account + +### Fixed + +- Fixed the query to filter activities of excluded accounts +- Improved the asset profile validation in the activities import + +## 2.57.0 - 2024-02-25 + +### Changed + +- Moved the break down of the performance into asset and currency on the analysis page from experimental to general availability +- Restructured the `copy-assets` `Nx` target + +### Fixed + +- Changed the performances of the _Top 3_ and _Bottom 3_ performers on the analysis page to take the currency effects into account + +## 2.56.0 - 2024-02-24 + +### Changed + +- Switched the performance calculations to take the currency effects into account +- Removed the `isDefault` flag from the `Account` database schema +- Exposed the database index of _Redis_ as an environment variable (`REDIS_DB`) +- Improved the language localization for German (`de`) +- Upgraded `prisma` from version `5.9.1` to `5.10.2` + +### Fixed + +- Added the missing default currency to the prepare currencies function in the exchange rate data service + +## 2.55.0 - 2024-02-22 + +### Added + +- Added indexes for `alias`, `granteeUserId` and `userId` to the access database table +- Added indexes for `currency`, `name` and `userId` to the account database table +- Added indexes for `accountId`, `date` and `updatedAt` to the account balance database table +- Added an index for `userId` to the auth device database table +- Added indexes for `marketPrice` and `state` to the market data database table +- Added indexes for `date`, `isDraft` and `userId` to the order database table +- Added an index for `name` to the platform database table +- Added indexes for `assetClass`, `currency`, `dataSource`, `isin`, `name` and `symbol` to the symbol profile database table +- Added an index for `userId` to the subscription database table +- Added an index for `name` to the tag database table +- Added indexes for `accessToken`, `createdAt`, `provider`, `role` and `thirdPartyId` to the user database table + +### Changed + +- Improved the validation for `currency` in various endpoints +- Harmonized the setting of a default locale in various components +- Set the parser to `angular` in the `prettier` options + +## 2.54.0 - 2024-02-19 + +### Added + +- Added an index for `id` to the account database table +- Added indexes for `dataSource` and `date` to the market data database table +- Added an index for `accountId` to the order database table + +## 2.53.1 - 2024-02-18 + +### Added + +- Added an accounts tab to the position detail dialog +- Added `INACTIVE` as a new user role + +### Changed + +- Improved the usability of the holdings table +- Refactored the query to filter activities of excluded accounts +- Eliminated the search request to get quotes in the _EOD Historical Data_ service +- Improved the language localization for German (`de`) +- Upgraded `ng-extract-i18n-merge` from version `2.9.1` to `2.10.0` + +## 2.52.0 - 2024-02-16 + +### Added + +- Added a loading indicator to the dividend timeline on the analysis page +- Added a loading indicator to the investment timeline on the analysis page +- Added support for the cryptocurrency _Jupiter_ (`JUP29210-USD`) + +### Changed + +- Divided the content of the Frequently Asked Questions (FAQ) page into three sections: _General_, _Cloud (SaaS)_ and _Self-Hosting_ + +### Fixed + +- Fixed an issue with the X-axis scale of the dividend timeline on the analysis page +- Fixed an issue with the X-axis scale of the investment timeline on the analysis page + +## 2.51.0 - 2024-02-12 + +### Changed + +- Improved the ordered list of the _Top 3_ and _Bottom 3_ performers on the analysis page in Safari +- Replaced `import-sort` with `prettier-plugin-sort-imports` +- Upgraded `eslint` dependencies +- Upgraded `Nx` from version `17.2.8` to `18.0.4` + +### Fixed + +- Fixed the date conversion of the import of historical market data in the admin control panel + +## 2.50.0 - 2024-02-11 + +### Added + +- Introduced a setting to disable the data gathering in the admin control + +### Changed + +- Harmonized the environment variables of various API keys +- Upgraded `prisma` from version `5.8.1` to `5.9.1` + +### Todo + +- Rename the environment variable from `ALPHA_VANTAGE_API_KEY` to `API_KEY_ALPHA_VANTAGE` +- Rename the environment variable from `BETTER_UPTIME_API_KEY` to `API_KEY_BETTER_UPTIME` +- Rename the environment variable from `EOD_HISTORICAL_DATA_API_KEY` to `API_KEY_EOD_HISTORICAL_DATA` +- Rename the environment variable from `FINANCIAL_MODELING_PREP_API_KEY` to `API_KEY_FINANCIAL_MODELING_PREP` +- Rename the environment variable from `OPEN_FIGI_API_KEY` to `API_KEY_OPEN_FIGI` +- Rename the environment variable from `RAPID_API_API_KEY` to `API_KEY_RAPID_API` + +## 2.49.0 - 2024-02-09 + +### Added + +- Added a button to apply the active filters in the assistant + +### Changed + +- Moved the assistant from experimental to general availability +- Improved the usability by reloading the content with a logo click on the home page +- Upgraded `yahoo-finance2` from version `2.9.0` to `2.9.1` + +## 2.48.1 - 2024-02-06 + +### Fixed + +- Added the missing data provider information to the _CoinGecko_ service + ## 2.48.0 - 2024-02-05 ### Added diff --git a/README.md b/README.md index dd580dfc9..9602d88c9 100644 --- a/README.md +++ b/README.md @@ -99,6 +99,7 @@ We provide official container images hosted on [Docker Hub](https://hub.docker.c | `POSTGRES_DB` | | The name of the _PostgreSQL_ database | | `POSTGRES_PASSWORD` | | The password of the _PostgreSQL_ database | | `POSTGRES_USER` | | The user of the _PostgreSQL_ database | +| `REDIS_DB` | `0` | The database index of _Redis_ | | `REDIS_HOST` | | The host where _Redis_ is running | | `REDIS_PASSWORD` | | The password of _Redis_ | | `REDIS_PORT` | | The port where _Redis_ is running | @@ -143,7 +144,7 @@ docker compose --env-file ./.env -f docker/docker-compose.build.yml up -d ### Home Server Systems (Community) -Ghostfolio is available for various home server systems, including [Runtipi](https://www.runtipi.io/docs/apps-available), [TrueCharts](https://truecharts.org/charts/stable/ghostfolio), [Umbrel](https://apps.umbrel.com/app/ghostfolio), and [Unraid](https://unraid.net/community/apps?q=ghostfolio). +Ghostfolio is available for various home server systems, including [CasaOS](https://github.com/bigbeartechworld/big-bear-casaos), [Runtipi](https://www.runtipi.io/docs/apps-available), [TrueCharts](https://truecharts.org/charts/stable/ghostfolio), [Umbrel](https://apps.umbrel.com/app/ghostfolio), and [Unraid](https://unraid.net/community/apps?q=ghostfolio). ## Development @@ -153,7 +154,7 @@ Ghostfolio is available for various home server systems, including [Runtipi](htt - [Node.js](https://nodejs.org/en/download) (version 18+) - [Yarn](https://yarnpkg.com/en/docs/install) - Create a local copy of this Git repository (clone) -- Copy the file `.env.example` to `.env` and populate it with your data (`cp .env.example .env`) +- Copy the file `.env.dev` to `.env` and populate it with your data (`cp .env.dev .env`) ### Setup @@ -280,6 +281,10 @@ Not sure what to work on? We have got some ideas. Please join the Ghostfolio [Sl If you like to support this project, get [**Ghostfolio Premium**](https://ghostfol.io/en/pricing) or [**Buy me a coffee**](https://www.buymeacoffee.com/ghostfolio). +## Analytics + +![Alt](https://repobeats.axiom.co/api/embed/281a80b2d0c4af1162866c24c803f1f18e5ed60e.svg 'Repobeats analytics image') + ## License © 2021 - 2024 [Ghostfolio](https://ghostfol.io) diff --git a/apps/api/jest.config.ts b/apps/api/jest.config.ts index 8152c3f2a..b87f91a79 100644 --- a/apps/api/jest.config.ts +++ b/apps/api/jest.config.ts @@ -13,7 +13,6 @@ export default { }, moduleFileExtensions: ['ts', 'js', 'html'], coverageDirectory: '../../coverage/apps/api', - testTimeout: 10000, testEnvironment: 'node', preset: '../../jest.preset.js' }; diff --git a/apps/api/project.json b/apps/api/project.json index f3c8bd1e0..4e1affb13 100644 --- a/apps/api/project.json +++ b/apps/api/project.json @@ -9,12 +9,13 @@ "build": { "executor": "@nx/webpack:webpack", "options": { - "outputPath": "dist/apps/api", + "compiler": "tsc", + "deleteOutputPath": false, "main": "apps/api/src/main.ts", - "tsConfig": "apps/api/tsconfig.app.json", - "assets": ["apps/api/src/assets"], + "outputPath": "dist/apps/api", + "sourceMap": true, "target": "node", - "compiler": "tsc", + "tsConfig": "apps/api/tsconfig.app.json", "webpackConfig": "apps/api/webpack.config.js" }, "configurations": { @@ -33,6 +34,26 @@ }, "outputs": ["{options.outputPath}"] }, + "copy-assets": { + "executor": "nx:run-commands", + "options": { + "commands": [ + { + "command": "shx rm -rf dist/apps/api" + }, + { + "command": "shx mkdir -p dist/apps/api/assets/locales" + }, + { + "command": "shx cp -r apps/api/src/assets/* dist/apps/api/assets" + }, + { + "command": "shx cp -r apps/client/src/locales/* dist/apps/api/assets/locales" + } + ], + "parallel": false + } + }, "serve": { "executor": "@nx/js:node", "options": { diff --git a/apps/api/src/app/access/access.controller.ts b/apps/api/src/app/access/access.controller.ts index 9aca159d8..8444a88d1 100644 --- a/apps/api/src/app/access/access.controller.ts +++ b/apps/api/src/app/access/access.controller.ts @@ -4,6 +4,7 @@ import { ConfigurationService } from '@ghostfolio/api/services/configuration/con import { Access } from '@ghostfolio/common/interfaces'; import { permissions } from '@ghostfolio/common/permissions'; import type { RequestWithUser } from '@ghostfolio/common/types'; + import { Body, Controller, @@ -82,7 +83,7 @@ export class AccessController { } try { - return await this.accessService.createAccess({ + return this.accessService.createAccess({ alias: data.alias || undefined, GranteeUser: data.granteeUserId ? { connect: { id: data.granteeUserId } } diff --git a/apps/api/src/app/access/access.module.ts b/apps/api/src/app/access/access.module.ts index 7f466d35c..44d28a230 100644 --- a/apps/api/src/app/access/access.module.ts +++ b/apps/api/src/app/access/access.module.ts @@ -1,5 +1,6 @@ import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; + import { Module } from '@nestjs/common'; import { AccessController } from './access.controller'; diff --git a/apps/api/src/app/access/access.service.ts b/apps/api/src/app/access/access.service.ts index bbaef5f73..ccba595e3 100644 --- a/apps/api/src/app/access/access.service.ts +++ b/apps/api/src/app/access/access.service.ts @@ -1,5 +1,6 @@ import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { AccessWithGranteeUser } from '@ghostfolio/common/types'; + import { Injectable } from '@nestjs/common'; import { Access, Prisma } from '@prisma/client'; diff --git a/apps/api/src/app/account-balance/account-balance.controller.ts b/apps/api/src/app/account-balance/account-balance.controller.ts index aca528c5f..943d0aeb5 100644 --- a/apps/api/src/app/account-balance/account-balance.controller.ts +++ b/apps/api/src/app/account-balance/account-balance.controller.ts @@ -2,6 +2,7 @@ import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorat import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; import { permissions } from '@ghostfolio/common/permissions'; import type { RequestWithUser } from '@ghostfolio/common/types'; + import { Controller, Delete, diff --git a/apps/api/src/app/account-balance/account-balance.module.ts b/apps/api/src/app/account-balance/account-balance.module.ts index d78d9792e..1fba60fce 100644 --- a/apps/api/src/app/account-balance/account-balance.module.ts +++ b/apps/api/src/app/account-balance/account-balance.module.ts @@ -1,5 +1,6 @@ import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module'; import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; + import { Module } from '@nestjs/common'; import { AccountBalanceController } from './account-balance.controller'; 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 0845eda5a..8a9d7b83e 100644 --- a/apps/api/src/app/account-balance/account-balance.service.ts +++ b/apps/api/src/app/account-balance/account-balance.service.ts @@ -2,6 +2,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate- import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { AccountBalancesResponse, Filter } from '@ghostfolio/common/interfaces'; import { UserWithSettings } from '@ghostfolio/common/types'; + import { Injectable } from '@nestjs/common'; import { AccountBalance, Prisma } from '@prisma/client'; diff --git a/apps/api/src/app/account/account.controller.ts b/apps/api/src/app/account/account.controller.ts index ddbe02fcc..31c2ee76f 100644 --- a/apps/api/src/app/account/account.controller.ts +++ b/apps/api/src/app/account/account.controller.ts @@ -14,6 +14,7 @@ import type { AccountWithValue, RequestWithUser } from '@ghostfolio/common/types'; + import { Body, Controller, @@ -62,7 +63,7 @@ export class AccountController { { Order: true } ); - if (account?.isDefault || account?.Order.length > 0) { + if (!account || account?.Order.length > 0) { throw new HttpException( getReasonPhrase(StatusCodes.FORBIDDEN), StatusCodes.FORBIDDEN diff --git a/apps/api/src/app/account/account.module.ts b/apps/api/src/app/account/account.module.ts index a8fb7e848..75be85f5c 100644 --- a/apps/api/src/app/account/account.module.ts +++ b/apps/api/src/app/account/account.module.ts @@ -7,6 +7,7 @@ import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data- import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module'; import { ImpersonationModule } from '@ghostfolio/api/services/impersonation/impersonation.module'; import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; + import { Module } from '@nestjs/common'; import { AccountController } from './account.controller'; diff --git a/apps/api/src/app/account/account.service.ts b/apps/api/src/app/account/account.service.ts index 366d0b1a0..cb8467c18 100644 --- a/apps/api/src/app/account/account.service.ts +++ b/apps/api/src/app/account/account.service.ts @@ -2,6 +2,7 @@ import { AccountBalanceService } from '@ghostfolio/api/app/account-balance/accou import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { Filter } from '@ghostfolio/common/interfaces'; + import { Injectable } from '@nestjs/common'; import { Account, Order, Platform, Prisma } from '@prisma/client'; import Big from 'big.js'; @@ -20,10 +21,8 @@ export class AccountService { public async account({ id_userId }: Prisma.AccountWhereUniqueInput): Promise { - const { id, userId } = id_userId; - const [account] = await this.accounts({ - where: { id, userId } + where: id_userId }); return account; diff --git a/apps/api/src/app/account/create-account.dto.ts b/apps/api/src/app/account/create-account.dto.ts index a6e07ad82..b719c2619 100644 --- a/apps/api/src/app/account/create-account.dto.ts +++ b/apps/api/src/app/account/create-account.dto.ts @@ -1,6 +1,7 @@ import { Transform, TransformFnParams } from 'class-transformer'; import { IsBoolean, + IsISO4217CurrencyCode, IsNumber, IsOptional, IsString, @@ -19,7 +20,7 @@ export class CreateAccountDto { ) comment?: string; - @IsString() + @IsISO4217CurrencyCode() currency: string; @IsOptional() diff --git a/apps/api/src/app/account/update-account.dto.ts b/apps/api/src/app/account/update-account.dto.ts index 16d55386d..1b84a9bf6 100644 --- a/apps/api/src/app/account/update-account.dto.ts +++ b/apps/api/src/app/account/update-account.dto.ts @@ -1,6 +1,7 @@ import { Transform, TransformFnParams } from 'class-transformer'; import { IsBoolean, + IsISO4217CurrencyCode, IsNumber, IsOptional, IsString, @@ -19,7 +20,7 @@ export class UpdateAccountDto { ) comment?: string; - @IsString() + @IsISO4217CurrencyCode() currency: string; @IsString() diff --git a/apps/api/src/app/admin/admin.controller.ts b/apps/api/src/app/admin/admin.controller.ts index 456550110..dab8fb8b2 100644 --- a/apps/api/src/app/admin/admin.controller.ts +++ b/apps/api/src/app/admin/admin.controller.ts @@ -25,6 +25,7 @@ import type { MarketDataPreset, RequestWithUser } from '@ghostfolio/common/types'; + import { Body, Controller, @@ -255,7 +256,7 @@ export class AdminController { dataSource, marketPrice, symbol, - date: resetHours(parseISO(date)), + date: parseISO(date), state: 'CLOSE' }) ); @@ -338,6 +339,6 @@ export class AdminController { @Param('key') key: string, @Body() data: PropertyDto ) { - return await this.adminService.putSetting(key, data.value); + return this.adminService.putSetting(key, data.value); } } diff --git a/apps/api/src/app/admin/admin.module.ts b/apps/api/src/app/admin/admin.module.ts index 079af87fa..d0557156a 100644 --- a/apps/api/src/app/admin/admin.module.ts +++ b/apps/api/src/app/admin/admin.module.ts @@ -8,6 +8,7 @@ import { MarketDataModule } from '@ghostfolio/api/services/market-data/market-da import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; import { PropertyModule } from '@ghostfolio/api/services/property/property.module'; import { SymbolProfileModule } from '@ghostfolio/api/services/symbol-profile/symbol-profile.module'; + import { Module } from '@nestjs/common'; import { AdminController } from './admin.controller'; diff --git a/apps/api/src/app/admin/admin.service.ts b/apps/api/src/app/admin/admin.service.ts index b77d77355..06ccdf379 100644 --- a/apps/api/src/app/admin/admin.service.ts +++ b/apps/api/src/app/admin/admin.service.ts @@ -22,6 +22,7 @@ import { UniqueAsset } from '@ghostfolio/common/interfaces'; import { MarketDataPreset } from '@ghostfolio/common/types'; + import { BadRequestException, Injectable } from '@nestjs/common'; import { AssetSubClass, @@ -70,7 +71,7 @@ export class AdminService { ); } - return await this.symbolProfileService.add( + return this.symbolProfileService.add( assetProfiles[symbol] as Prisma.SymbolProfileCreateInput ); } catch (error) { @@ -225,7 +226,7 @@ export class AdminService { this.prismaService.symbolProfile.count({ where }) ]); - let marketData = assetProfiles.map( + let marketData: AdminMarketDataItem[] = assetProfiles.map( ({ _count, assetClass, @@ -439,13 +440,14 @@ export class AdminService { }, createdAt: true, id: true, + role: true, Subscription: true }, take: 30 }); return usersWithAnalytics.map( - ({ _count, Analytics, createdAt, id, Subscription }) => { + ({ _count, Analytics, createdAt, id, role, Subscription }) => { const daysSinceRegistration = differenceInDays(new Date(), createdAt) + 1; const engagement = Analytics @@ -455,13 +457,17 @@ export class AdminService { const subscription = this.configurationService.get( 'ENABLE_FEATURE_SUBSCRIPTION' ) - ? this.subscriptionService.getSubscription(Subscription) + ? this.subscriptionService.getSubscription({ + createdAt, + subscriptions: Subscription + }) : undefined; return { createdAt, engagement, id, + role, subscription, accountCount: _count.Account || 0, country: Analytics?.country, diff --git a/apps/api/src/app/admin/queue/queue.controller.ts b/apps/api/src/app/admin/queue/queue.controller.ts index e146804ef..89bd851bc 100644 --- a/apps/api/src/app/admin/queue/queue.controller.ts +++ b/apps/api/src/app/admin/queue/queue.controller.ts @@ -2,6 +2,7 @@ import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorat import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; import { AdminJobs } from '@ghostfolio/common/interfaces'; import { permissions } from '@ghostfolio/common/permissions'; + import { Controller, Delete, diff --git a/apps/api/src/app/admin/queue/queue.module.ts b/apps/api/src/app/admin/queue/queue.module.ts index 3c1be5128..46ae3b8a5 100644 --- a/apps/api/src/app/admin/queue/queue.module.ts +++ b/apps/api/src/app/admin/queue/queue.module.ts @@ -1,4 +1,5 @@ import { DataGatheringModule } from '@ghostfolio/api/services/data-gathering/data-gathering.module'; + import { Module } from '@nestjs/common'; import { QueueController } from './queue.controller'; diff --git a/apps/api/src/app/admin/queue/queue.service.ts b/apps/api/src/app/admin/queue/queue.service.ts index 81b32ddbb..c5143e870 100644 --- a/apps/api/src/app/admin/queue/queue.service.ts +++ b/apps/api/src/app/admin/queue/queue.service.ts @@ -3,6 +3,7 @@ import { QUEUE_JOB_STATUS_LIST } from '@ghostfolio/common/config'; import { AdminJobs } from '@ghostfolio/common/interfaces'; + import { InjectQueue } from '@nestjs/bull'; import { Injectable } from '@nestjs/common'; import { JobStatus, Queue } from 'bull'; diff --git a/apps/api/src/app/admin/update-asset-profile.dto.ts b/apps/api/src/app/admin/update-asset-profile.dto.ts index 624acff9f..4a0457194 100644 --- a/apps/api/src/app/admin/update-asset-profile.dto.ts +++ b/apps/api/src/app/admin/update-asset-profile.dto.ts @@ -2,6 +2,7 @@ import { AssetClass, AssetSubClass, Prisma } from '@prisma/client'; import { IsArray, IsEnum, + IsISO4217CurrencyCode, IsObject, IsOptional, IsString @@ -24,7 +25,7 @@ export class UpdateAssetProfileDto { @IsOptional() countries?: Prisma.InputJsonArray; - @IsString() + @IsISO4217CurrencyCode() @IsOptional() currency?: string; diff --git a/apps/api/src/app/app.controller.ts b/apps/api/src/app/app.controller.ts index 33e9ae56a..28437391f 100644 --- a/apps/api/src/app/app.controller.ts +++ b/apps/api/src/app/app.controller.ts @@ -1,4 +1,5 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; + import { Controller } from '@nestjs/common'; @Controller() diff --git a/apps/api/src/app/app.module.ts b/apps/api/src/app/app.module.ts index 03c6a4aaa..5f2be5c8e 100644 --- a/apps/api/src/app/app.module.ts +++ b/apps/api/src/app/app.module.ts @@ -1,22 +1,23 @@ -import { join } from 'path'; - import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; import { CronService } from '@ghostfolio/api/services/cron.service'; import { DataGatheringModule } from '@ghostfolio/api/services/data-gathering/data-gathering.module'; import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module'; import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module'; import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; +import { PropertyModule } from '@ghostfolio/api/services/property/property.module'; import { TwitterBotModule } from '@ghostfolio/api/services/twitter-bot/twitter-bot.module'; import { DEFAULT_LANGUAGE_CODE, SUPPORTED_LANGUAGE_CODES } from '@ghostfolio/common/config'; + import { BullModule } from '@nestjs/bull'; import { Module } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; import { ScheduleModule } from '@nestjs/schedule'; import { ServeStaticModule } from '@nestjs/serve-static'; import { StatusCodes } from 'http-status-codes'; +import { join } from 'path'; import { AccessModule } from './access/access.module'; import { AccountModule } from './account/account.module'; @@ -52,6 +53,7 @@ import { UserModule } from './user/user.module'; BenchmarkModule, BullModule.forRoot({ redis: { + db: parseInt(process.env.REDIS_DB ?? '0', 10), host: process.env.REDIS_HOST, port: parseInt(process.env.REDIS_PORT ?? '6379', 10), password: process.env.REDIS_PASSWORD @@ -73,6 +75,7 @@ import { UserModule } from './user/user.module'; PlatformModule, PortfolioModule, PrismaModule, + PropertyModule, RedisCacheModule, ScheduleModule.forRoot(), ServeStaticModule.forRoot({ diff --git a/apps/api/src/app/auth-device/auth-device.controller.ts b/apps/api/src/app/auth-device/auth-device.controller.ts index ed936c88d..15e853465 100644 --- a/apps/api/src/app/auth-device/auth-device.controller.ts +++ b/apps/api/src/app/auth-device/auth-device.controller.ts @@ -2,6 +2,7 @@ import { AuthDeviceService } from '@ghostfolio/api/app/auth-device/auth-device.s import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator'; import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; import { permissions } from '@ghostfolio/common/permissions'; + import { Controller, Delete, Param, UseGuards } from '@nestjs/common'; import { AuthGuard } from '@nestjs/passport'; diff --git a/apps/api/src/app/auth-device/auth-device.module.ts b/apps/api/src/app/auth-device/auth-device.module.ts index 11ddd58ec..89689e5d2 100644 --- a/apps/api/src/app/auth-device/auth-device.module.ts +++ b/apps/api/src/app/auth-device/auth-device.module.ts @@ -2,6 +2,7 @@ import { AuthDeviceController } from '@ghostfolio/api/app/auth-device/auth-devic import { AuthDeviceService } from '@ghostfolio/api/app/auth-device/auth-device.service'; import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; + import { Module } from '@nestjs/common'; import { JwtModule } from '@nestjs/jwt'; diff --git a/apps/api/src/app/auth-device/auth-device.service.ts b/apps/api/src/app/auth-device/auth-device.service.ts index 19dad8876..b24df0ae6 100644 --- a/apps/api/src/app/auth-device/auth-device.service.ts +++ b/apps/api/src/app/auth-device/auth-device.service.ts @@ -1,5 +1,6 @@ import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; + import { Injectable } from '@nestjs/common'; import { AuthDevice, Prisma } from '@prisma/client'; diff --git a/apps/api/src/app/auth/auth.controller.ts b/apps/api/src/app/auth/auth.controller.ts index 5c4131a56..c81c7e224 100644 --- a/apps/api/src/app/auth/auth.controller.ts +++ b/apps/api/src/app/auth/auth.controller.ts @@ -3,6 +3,7 @@ import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard' import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { DEFAULT_LANGUAGE_CODE } from '@ghostfolio/common/config'; import { OAuthResponse } from '@ghostfolio/common/interfaces'; + import { Body, Controller, diff --git a/apps/api/src/app/auth/auth.module.ts b/apps/api/src/app/auth/auth.module.ts index 458493051..67b078c9b 100644 --- a/apps/api/src/app/auth/auth.module.ts +++ b/apps/api/src/app/auth/auth.module.ts @@ -5,6 +5,7 @@ import { UserModule } from '@ghostfolio/api/app/user/user.module'; import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; import { PropertyModule } from '@ghostfolio/api/services/property/property.module'; + import { Module } from '@nestjs/common'; import { JwtModule } from '@nestjs/jwt'; diff --git a/apps/api/src/app/auth/auth.service.ts b/apps/api/src/app/auth/auth.service.ts index c7270f8c3..edfb22b6f 100644 --- a/apps/api/src/app/auth/auth.service.ts +++ b/apps/api/src/app/auth/auth.service.ts @@ -1,6 +1,7 @@ import { UserService } from '@ghostfolio/api/app/user/user.service'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { PropertyService } from '@ghostfolio/api/services/property/property.service'; + import { Injectable, InternalServerErrorException } from '@nestjs/common'; import { JwtService } from '@nestjs/jwt'; import { Provider } from '@prisma/client'; diff --git a/apps/api/src/app/auth/google.strategy.ts b/apps/api/src/app/auth/google.strategy.ts index 7e43f5817..4abc1105a 100644 --- a/apps/api/src/app/auth/google.strategy.ts +++ b/apps/api/src/app/auth/google.strategy.ts @@ -1,4 +1,5 @@ import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; + import { Injectable, Logger } from '@nestjs/common'; import { PassportStrategy } from '@nestjs/passport'; import { Provider } from '@prisma/client'; diff --git a/apps/api/src/app/auth/interfaces/interfaces.ts b/apps/api/src/app/auth/interfaces/interfaces.ts index c3fbc9236..45415355e 100644 --- a/apps/api/src/app/auth/interfaces/interfaces.ts +++ b/apps/api/src/app/auth/interfaces/interfaces.ts @@ -1,4 +1,5 @@ import { AuthDeviceDto } from '@ghostfolio/api/app/auth-device/auth-device.dto'; + import { Provider } from '@prisma/client'; export interface AuthDeviceDialogParams { diff --git a/apps/api/src/app/auth/jwt.strategy.ts b/apps/api/src/app/auth/jwt.strategy.ts index 6d7e2ecdc..c7ce38986 100644 --- a/apps/api/src/app/auth/jwt.strategy.ts +++ b/apps/api/src/app/auth/jwt.strategy.ts @@ -2,6 +2,7 @@ import { UserService } from '@ghostfolio/api/app/user/user.service'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { HEADER_KEY_TIMEZONE } from '@ghostfolio/common/config'; + import { Injectable, UnauthorizedException } from '@nestjs/common'; import { PassportStrategy } from '@nestjs/passport'; import * as countriesAndTimezones from 'countries-and-timezones'; diff --git a/apps/api/src/app/auth/web-auth.service.ts b/apps/api/src/app/auth/web-auth.service.ts index 8d5c91a74..961bbe9a7 100644 --- a/apps/api/src/app/auth/web-auth.service.ts +++ b/apps/api/src/app/auth/web-auth.service.ts @@ -3,6 +3,7 @@ import { AuthDeviceService } from '@ghostfolio/api/app/auth-device/auth-device.s import { UserService } from '@ghostfolio/api/app/user/user.service'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import type { RequestWithUser } from '@ghostfolio/common/types'; + import { Inject, Injectable, @@ -40,7 +41,7 @@ export class WebAuthService { ) {} get rpID() { - return this.configurationService.get('WEB_AUTH_RP_ID'); + return new URL(this.configurationService.get('ROOT_URL')).hostname; } get expectedOrigin() { diff --git a/apps/api/src/app/benchmark/benchmark.controller.ts b/apps/api/src/app/benchmark/benchmark.controller.ts index ebee6ab8e..d3b91c6df 100644 --- a/apps/api/src/app/benchmark/benchmark.controller.ts +++ b/apps/api/src/app/benchmark/benchmark.controller.ts @@ -9,6 +9,7 @@ import type { } from '@ghostfolio/common/interfaces'; import { permissions } from '@ghostfolio/common/permissions'; import type { RequestWithUser } from '@ghostfolio/common/types'; + import { Body, Controller, diff --git a/apps/api/src/app/benchmark/benchmark.module.ts b/apps/api/src/app/benchmark/benchmark.module.ts index b3a4d8f2e..7371588d1 100644 --- a/apps/api/src/app/benchmark/benchmark.module.ts +++ b/apps/api/src/app/benchmark/benchmark.module.ts @@ -7,6 +7,7 @@ import { MarketDataModule } from '@ghostfolio/api/services/market-data/market-da import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; import { PropertyModule } from '@ghostfolio/api/services/property/property.module'; import { SymbolProfileModule } from '@ghostfolio/api/services/symbol-profile/symbol-profile.module'; + import { Module } from '@nestjs/common'; import { BenchmarkController } from './benchmark.controller'; diff --git a/apps/api/src/app/benchmark/benchmark.service.ts b/apps/api/src/app/benchmark/benchmark.service.ts index 8430b4aa3..5a8c1cc2d 100644 --- a/apps/api/src/app/benchmark/benchmark.service.ts +++ b/apps/api/src/app/benchmark/benchmark.service.ts @@ -23,6 +23,7 @@ import { UniqueAsset } from '@ghostfolio/common/interfaces'; import { BenchmarkTrend } from '@ghostfolio/common/types'; + import { Injectable, Logger } from '@nestjs/common'; import { SymbolProfile } from '@prisma/client'; import Big from 'big.js'; @@ -109,7 +110,9 @@ export class BenchmarkService { const quotes = await this.dataProviderService.getQuotes({ items: benchmarkAssetProfiles.map(({ dataSource, symbol }) => { return { dataSource, symbol }; - }) + }), + requestTimeout: ms('30 seconds'), + useCache: false }); for (const { dataSource, symbol } of benchmarkAssetProfiles) { @@ -162,7 +165,7 @@ export class BenchmarkService { await this.redisCacheService.set( this.CACHE_KEY_BENCHMARKS, JSON.stringify(benchmarks), - ms('4 hours') / 1000 + ms('2 hours') / 1000 ); } diff --git a/apps/api/src/app/cache/cache.controller.ts b/apps/api/src/app/cache/cache.controller.ts index de46c4551..edfd16c49 100644 --- a/apps/api/src/app/cache/cache.controller.ts +++ b/apps/api/src/app/cache/cache.controller.ts @@ -2,6 +2,7 @@ import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.s import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator'; import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; import { permissions } from '@ghostfolio/common/permissions'; + import { Controller, Post, UseGuards } from '@nestjs/common'; import { AuthGuard } from '@nestjs/passport'; diff --git a/apps/api/src/app/cache/cache.module.ts b/apps/api/src/app/cache/cache.module.ts index 23b3ea2bb..7a82e4366 100644 --- a/apps/api/src/app/cache/cache.module.ts +++ b/apps/api/src/app/cache/cache.module.ts @@ -5,6 +5,7 @@ import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data- import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module'; import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; import { SymbolProfileModule } from '@ghostfolio/api/services/symbol-profile/symbol-profile.module'; + import { Module } from '@nestjs/common'; import { CacheController } from './cache.controller'; diff --git a/apps/api/src/app/exchange-rate/exchange-rate.controller.ts b/apps/api/src/app/exchange-rate/exchange-rate.controller.ts index c66dd08e6..a5b2823d5 100644 --- a/apps/api/src/app/exchange-rate/exchange-rate.controller.ts +++ b/apps/api/src/app/exchange-rate/exchange-rate.controller.ts @@ -1,5 +1,6 @@ import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; import { IDataProviderHistoricalResponse } from '@ghostfolio/api/services/interfaces/interfaces'; + import { Controller, Get, diff --git a/apps/api/src/app/exchange-rate/exchange-rate.module.ts b/apps/api/src/app/exchange-rate/exchange-rate.module.ts index d94f047f3..e1d9d1891 100644 --- a/apps/api/src/app/exchange-rate/exchange-rate.module.ts +++ b/apps/api/src/app/exchange-rate/exchange-rate.module.ts @@ -1,4 +1,5 @@ import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module'; + import { Module } from '@nestjs/common'; import { ExchangeRateController } from './exchange-rate.controller'; diff --git a/apps/api/src/app/exchange-rate/exchange-rate.service.ts b/apps/api/src/app/exchange-rate/exchange-rate.service.ts index 44a8d0568..d70fd534c 100644 --- a/apps/api/src/app/exchange-rate/exchange-rate.service.ts +++ b/apps/api/src/app/exchange-rate/exchange-rate.service.ts @@ -1,4 +1,5 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; + import { Injectable } from '@nestjs/common'; @Injectable() diff --git a/apps/api/src/app/export/export.controller.ts b/apps/api/src/app/export/export.controller.ts index baa0179bb..551b3e489 100644 --- a/apps/api/src/app/export/export.controller.ts +++ b/apps/api/src/app/export/export.controller.ts @@ -2,6 +2,7 @@ import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard' import { ApiService } from '@ghostfolio/api/services/api/api.service'; import { Export } from '@ghostfolio/common/interfaces'; import type { RequestWithUser } from '@ghostfolio/common/types'; + import { Controller, Get, Inject, Query, UseGuards } from '@nestjs/common'; import { REQUEST } from '@nestjs/core'; import { AuthGuard } from '@nestjs/passport'; diff --git a/apps/api/src/app/export/export.module.ts b/apps/api/src/app/export/export.module.ts index 847695d17..9bc5722a7 100644 --- a/apps/api/src/app/export/export.module.ts +++ b/apps/api/src/app/export/export.module.ts @@ -5,6 +5,7 @@ import { ApiModule } from '@ghostfolio/api/services/api/api.module'; import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; import { DataGatheringModule } from '@ghostfolio/api/services/data-gathering/data-gathering.module'; import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module'; + import { Module } from '@nestjs/common'; import { ExportController } from './export.controller'; diff --git a/apps/api/src/app/export/export.service.ts b/apps/api/src/app/export/export.service.ts index 64cd13929..90090119e 100644 --- a/apps/api/src/app/export/export.service.ts +++ b/apps/api/src/app/export/export.service.ts @@ -2,6 +2,7 @@ import { AccountService } from '@ghostfolio/api/app/account/account.service'; import { OrderService } from '@ghostfolio/api/app/order/order.service'; import { environment } from '@ghostfolio/api/environments/environment'; import { Filter, Export } from '@ghostfolio/common/interfaces'; + import { Injectable } from '@nestjs/common'; @Injectable() diff --git a/apps/api/src/app/health/health.controller.ts b/apps/api/src/app/health/health.controller.ts index cc430c0dc..d899df410 100644 --- a/apps/api/src/app/health/health.controller.ts +++ b/apps/api/src/app/health/health.controller.ts @@ -1,4 +1,5 @@ import { TransformDataSourceInRequestInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-request.interceptor'; + import { Controller, Get, diff --git a/apps/api/src/app/health/health.module.ts b/apps/api/src/app/health/health.module.ts index b6952c3b5..bce798d16 100644 --- a/apps/api/src/app/health/health.module.ts +++ b/apps/api/src/app/health/health.module.ts @@ -1,6 +1,7 @@ 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 { Module } from '@nestjs/common'; import { HealthController } from './health.controller'; diff --git a/apps/api/src/app/health/health.service.ts b/apps/api/src/app/health/health.service.ts index 8fac2dde9..b0c811392 100644 --- a/apps/api/src/app/health/health.service.ts +++ b/apps/api/src/app/health/health.service.ts @@ -1,5 +1,6 @@ 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 { Injectable } from '@nestjs/common'; import { DataSource } from '@prisma/client'; diff --git a/apps/api/src/app/import/import-data.dto.ts b/apps/api/src/app/import/import-data.dto.ts index fa954a2c9..715766821 100644 --- a/apps/api/src/app/import/import-data.dto.ts +++ b/apps/api/src/app/import/import-data.dto.ts @@ -1,5 +1,6 @@ import { CreateAccountDto } from '@ghostfolio/api/app/account/create-account.dto'; import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto'; + import { Type } from 'class-transformer'; import { IsArray, IsOptional, ValidateNested } from 'class-validator'; diff --git a/apps/api/src/app/import/import.controller.ts b/apps/api/src/app/import/import.controller.ts index d04607de4..29a06fc9f 100644 --- a/apps/api/src/app/import/import.controller.ts +++ b/apps/api/src/app/import/import.controller.ts @@ -6,6 +6,7 @@ import { ConfigurationService } from '@ghostfolio/api/services/configuration/con import { ImportResponse } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import type { RequestWithUser } from '@ghostfolio/common/types'; + import { Body, Controller, @@ -42,8 +43,10 @@ export class ImportController { @UseInterceptors(TransformDataSourceInResponseInterceptor) public async import( @Body() importData: ImportDataDto, - @Query('dryRun') isDryRun?: boolean + @Query('dryRun') isDryRunParam = 'false' ): Promise { + const isDryRun = isDryRunParam === 'true'; + if ( !hasPermission(this.request.user.permissions, permissions.createAccount) ) { diff --git a/apps/api/src/app/import/import.module.ts b/apps/api/src/app/import/import.module.ts index 8b5668860..ae8318044 100644 --- a/apps/api/src/app/import/import.module.ts +++ b/apps/api/src/app/import/import.module.ts @@ -10,6 +10,7 @@ import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data- import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module'; import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; import { SymbolProfileModule } from '@ghostfolio/api/services/symbol-profile/symbol-profile.module'; + import { Module } from '@nestjs/common'; import { ImportController } from './import.controller'; diff --git a/apps/api/src/app/import/import.service.ts b/apps/api/src/app/import/import.service.ts index 5416bffbd..a4895cf73 100644 --- a/apps/api/src/app/import/import.service.ts +++ b/apps/api/src/app/import/import.service.ts @@ -24,6 +24,7 @@ import { OrderWithAccount, UserWithSettings } from '@ghostfolio/common/types'; + import { Injectable } from '@nestjs/common'; import { DataSource, Prisma, SymbolProfile } from '@prisma/client'; import Big from 'big.js'; @@ -569,17 +570,10 @@ export class ImportService { [assetProfileIdentifier: string]: Partial; } = {}; - const uniqueActivitiesDto = uniqBy( - activitiesDto, - ({ dataSource, symbol }) => { - return getAssetProfileIdentifier({ dataSource, symbol }); - } - ); - for (const [ index, { currency, dataSource, symbol, type } - ] of uniqueActivitiesDto.entries()) { + ] of activitiesDto.entries()) { if (!this.configurationService.get('DATA_SOURCES').includes(dataSource)) { throw new Error( `activities.${index}.dataSource ("${dataSource}") is not valid` @@ -601,37 +595,33 @@ export class ImportService { } } - const assetProfile = { - currency, - ...( - await this.dataProviderService.getAssetProfiles([ - { dataSource, symbol } - ]) - )?.[symbol] - }; + if (!assetProfiles[getAssetProfileIdentifier({ dataSource, symbol })]) { + const assetProfile = { + currency, + ...( + await this.dataProviderService.getAssetProfiles([ + { dataSource, symbol } + ]) + )?.[symbol] + }; - if (type === 'BUY' || type === 'DIVIDEND' || type === 'SELL') { - if (!assetProfile?.name) { - throw new Error( - `activities.${index}.symbol ("${symbol}") is not valid for the specified data source ("${dataSource}")` - ); - } + if (type === 'BUY' || type === 'DIVIDEND' || type === 'SELL') { + if (!assetProfile?.name) { + throw new Error( + `activities.${index}.symbol ("${symbol}") is not valid for the specified data source ("${dataSource}")` + ); + } - if ( - assetProfile.currency !== currency && - !this.exchangeRateDataService.hasCurrencyPair( - currency, - assetProfile.currency - ) - ) { - throw new Error( - `activities.${index}.currency ("${currency}") does not match with "${assetProfile.currency}" and no exchange rate is available from "${currency}" to "${assetProfile.currency}"` - ); + if (assetProfile.currency !== currency) { + throw new Error( + `activities.${index}.currency ("${currency}") does not match with currency of ${assetProfile.symbol} ("${assetProfile.currency}")` + ); + } } - } - assetProfiles[getAssetProfileIdentifier({ dataSource, symbol })] = - assetProfile; + assetProfiles[getAssetProfileIdentifier({ dataSource, symbol })] = + assetProfile; + } } return assetProfiles; diff --git a/apps/api/src/app/info/info.controller.ts b/apps/api/src/app/info/info.controller.ts index 67333904e..4890a444e 100644 --- a/apps/api/src/app/info/info.controller.ts +++ b/apps/api/src/app/info/info.controller.ts @@ -1,5 +1,6 @@ import { TransformDataSourceInResponseInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-response.interceptor'; import { InfoItem } from '@ghostfolio/common/interfaces'; + import { Controller, Get, UseInterceptors } from '@nestjs/common'; import { InfoService } from './info.service'; diff --git a/apps/api/src/app/info/info.module.ts b/apps/api/src/app/info/info.module.ts index a6b5b5b0b..c28ef5869 100644 --- a/apps/api/src/app/info/info.module.ts +++ b/apps/api/src/app/info/info.module.ts @@ -10,6 +10,7 @@ import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; import { PropertyModule } from '@ghostfolio/api/services/property/property.module'; import { SymbolProfileModule } from '@ghostfolio/api/services/symbol-profile/symbol-profile.module'; import { TagModule } from '@ghostfolio/api/services/tag/tag.module'; + import { Module } from '@nestjs/common'; import { JwtModule } from '@nestjs/jwt'; diff --git a/apps/api/src/app/info/info.service.ts b/apps/api/src/app/info/info.service.ts index cf28d9d54..de4a870d2 100644 --- a/apps/api/src/app/info/info.service.ts +++ b/apps/api/src/app/info/info.service.ts @@ -28,6 +28,7 @@ import { } from '@ghostfolio/common/interfaces'; import { permissions } from '@ghostfolio/common/permissions'; import { SubscriptionOffer } from '@ghostfolio/common/types'; + import { Injectable, Logger } from '@nestjs/common'; import { JwtService } from '@nestjs/jwt'; import * as cheerio from 'cheerio'; @@ -59,10 +60,6 @@ export class InfoService { const globalPermissions: string[] = []; - if (this.configurationService.get('ENABLE_FEATURE_BLOG')) { - globalPermissions.push(permissions.enableBlog); - } - if (this.configurationService.get('ENABLE_FEATURE_FEAR_AND_GREED_INDEX')) { if (this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) { info.fearAndGreedDataSource = encodeDataSource( @@ -351,7 +348,7 @@ export class InfoService { { headers: { Authorization: `Bearer ${this.configurationService.get( - 'BETTER_UPTIME_API_KEY' + 'API_KEY_BETTER_UPTIME' )}` }, // @ts-ignore diff --git a/apps/api/src/app/logo/logo.controller.ts b/apps/api/src/app/logo/logo.controller.ts index 22bafc061..2ef65936e 100644 --- a/apps/api/src/app/logo/logo.controller.ts +++ b/apps/api/src/app/logo/logo.controller.ts @@ -1,4 +1,5 @@ import { TransformDataSourceInRequestInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-request.interceptor'; + import { Controller, Get, diff --git a/apps/api/src/app/logo/logo.module.ts b/apps/api/src/app/logo/logo.module.ts index 43052a14f..fe1a46ef6 100644 --- a/apps/api/src/app/logo/logo.module.ts +++ b/apps/api/src/app/logo/logo.module.ts @@ -1,5 +1,6 @@ import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; import { SymbolProfileModule } from '@ghostfolio/api/services/symbol-profile/symbol-profile.module'; + import { Module } from '@nestjs/common'; import { LogoController } from './logo.controller'; diff --git a/apps/api/src/app/logo/logo.service.ts b/apps/api/src/app/logo/logo.service.ts index 91aaa2cbc..a944900a0 100644 --- a/apps/api/src/app/logo/logo.service.ts +++ b/apps/api/src/app/logo/logo.service.ts @@ -1,6 +1,7 @@ import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; import { UniqueAsset } from '@ghostfolio/common/interfaces'; + import { HttpException, Injectable } from '@nestjs/common'; import { DataSource } from '@prisma/client'; import got from 'got'; diff --git a/apps/api/src/app/order/create-order.dto.ts b/apps/api/src/app/order/create-order.dto.ts index f25a7ee12..aecec842a 100644 --- a/apps/api/src/app/order/create-order.dto.ts +++ b/apps/api/src/app/order/create-order.dto.ts @@ -10,6 +10,7 @@ import { IsArray, IsBoolean, IsEnum, + IsISO4217CurrencyCode, IsISO8601, IsNumber, IsOptional, @@ -38,7 +39,7 @@ export class CreateOrderDto { ) comment?: string; - @IsString() + @IsISO4217CurrencyCode() currency: string; @IsOptional() diff --git a/apps/api/src/app/order/order.controller.ts b/apps/api/src/app/order/order.controller.ts index d1e4eadeb..dbcf6dedb 100644 --- a/apps/api/src/app/order/order.controller.ts +++ b/apps/api/src/app/order/order.controller.ts @@ -9,6 +9,7 @@ import { ImpersonationService } from '@ghostfolio/api/services/impersonation/imp import { HEADER_KEY_IMPERSONATION } from '@ghostfolio/common/config'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import type { RequestWithUser } from '@ghostfolio/common/types'; + import { Body, Controller, diff --git a/apps/api/src/app/order/order.module.ts b/apps/api/src/app/order/order.module.ts index 53d69c0f9..d125bb62b 100644 --- a/apps/api/src/app/order/order.module.ts +++ b/apps/api/src/app/order/order.module.ts @@ -11,6 +11,7 @@ import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-d import { ImpersonationModule } from '@ghostfolio/api/services/impersonation/impersonation.module'; import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; import { SymbolProfileModule } from '@ghostfolio/api/services/symbol-profile/symbol-profile.module'; + import { Module } from '@nestjs/common'; import { OrderController } from './order.controller'; diff --git a/apps/api/src/app/order/order.service.ts b/apps/api/src/app/order/order.service.ts index 096aba6f5..3efb5fe95 100644 --- a/apps/api/src/app/order/order.service.ts +++ b/apps/api/src/app/order/order.service.ts @@ -8,8 +8,9 @@ import { GATHER_ASSET_PROFILE_PROCESS_OPTIONS } from '@ghostfolio/common/config'; import { getAssetProfileIdentifier } from '@ghostfolio/common/helper'; -import { Filter } from '@ghostfolio/common/interfaces'; +import { Filter, UniqueAsset } from '@ghostfolio/common/interfaces'; import { OrderWithAccount } from '@ghostfolio/common/types'; + import { Injectable } from '@nestjs/common'; import { AssetClass, @@ -18,7 +19,7 @@ import { Order, Prisma, Tag, - Type as TypeOfOrder + Type as ActivityType } from '@prisma/client'; import Big from 'big.js'; import { endOfToday, isAfter } from 'date-fns'; @@ -69,12 +70,7 @@ export class OrderService { const updateAccountBalance = data.updateAccountBalance ?? false; const userId = data.userId; - if ( - data.type === 'FEE' || - data.type === 'INTEREST' || - data.type === 'ITEM' || - data.type === 'LIABILITY' - ) { + if (['FEE', 'INTEREST', 'ITEM', 'LIABILITY'].includes(data.type)) { const assetClass = data.assetClass; const assetSubClass = data.assetSubClass; currency = data.SymbolProfile.connectOrCreate.create.currency; @@ -129,13 +125,9 @@ export class OrderService { const orderData: Prisma.OrderCreateInput = data; - const isDraft = - data.type === 'FEE' || - data.type === 'INTEREST' || - data.type === 'ITEM' || - data.type === 'LIABILITY' - ? false - : isAfter(data.date as Date, endOfToday()); + const isDraft = ['FEE', 'INTEREST', 'ITEM', 'LIABILITY'].includes(data.type) + ? false + : isAfter(data.date as Date, endOfToday()); const order = await this.prismaService.order.create({ data: { @@ -156,7 +148,7 @@ export class OrderService { .plus(data.fee) .toNumber(); - if (data.type === 'BUY') { + if (['BUY', 'FEE'].includes(data.type)) { amount = new Big(amount).mul(-1).toNumber(); } @@ -179,12 +171,7 @@ export class OrderService { where }); - if ( - order.type === 'FEE' || - order.type === 'INTEREST' || - order.type === 'ITEM' || - order.type === 'LIABILITY' - ) { + if (['FEE', 'INTEREST', 'ITEM', 'LIABILITY'].includes(order.type)) { await this.symbolProfileService.deleteById(order.symbolProfileId); } @@ -199,6 +186,17 @@ export class OrderService { return count; } + public async getLatestOrder({ dataSource, symbol }: UniqueAsset) { + return this.prismaService.order.findFirst({ + orderBy: { + date: 'desc' + }, + where: { + SymbolProfile: { dataSource, symbol } + } + }); + } + public async getOrders({ filters, includeDrafts = false, @@ -217,7 +215,7 @@ export class OrderService { sortColumn?: string; sortDirection?: Prisma.SortOrder; take?: number; - types?: TypeOfOrder[]; + types?: ActivityType[]; userCurrency: string; userId: string; withExcludedAccounts?: boolean; @@ -291,13 +289,14 @@ export class OrderService { } if (types) { - where.OR = types.map((type) => { - return { - type: { - equals: type - } - }; - }); + where.type = { in: types }; + } + + if (withExcludedAccounts === false) { + where.OR = [ + { Account: null }, + { Account: { NOT: { isExcluded: true } } } + ]; } const [orders, count] = await Promise.all([ @@ -321,32 +320,26 @@ export class OrderService { this.prismaService.order.count({ where }) ]); - const activities = orders - .filter((order) => { - return ( - withExcludedAccounts || - !order.Account || - order.Account?.isExcluded === false - ); - }) - .map((order) => { - const value = new Big(order.quantity).mul(order.unitPrice).toNumber(); - - return { - ...order, + const activities = orders.map((order) => { + const value = new Big(order.quantity).mul(order.unitPrice).toNumber(); + + return { + ...order, + value, + // TODO: Use exchange rate of date + feeInBaseCurrency: this.exchangeRateDataService.toCurrency( + order.fee, + order.SymbolProfile.currency, + userCurrency + ), + // TODO: Use exchange rate of date + valueInBaseCurrency: this.exchangeRateDataService.toCurrency( value, - feeInBaseCurrency: this.exchangeRateDataService.toCurrency( - order.fee, - order.SymbolProfile.currency, - userCurrency - ), - valueInBaseCurrency: this.exchangeRateDataService.toCurrency( - value, - order.SymbolProfile.currency, - userCurrency - ) - }; - }); + order.SymbolProfile.currency, + userCurrency + ) + }; + }); return { activities, count }; } @@ -370,13 +363,10 @@ export class OrderService { dataSource?: DataSource; symbol?: string; tags?: Tag[]; + type?: ActivityType; }; where: Prisma.OrderWhereUniqueInput; }): Promise { - if (data.Account.connect.id_userId.id === null) { - delete data.Account; - } - if (!data.comment) { data.comment = null; } @@ -385,13 +375,12 @@ export class OrderService { let isDraft = false; - if ( - data.type === 'FEE' || - data.type === 'INTEREST' || - data.type === 'ITEM' || - data.type === 'LIABILITY' - ) { + if (['FEE', 'INTEREST', 'ITEM', 'LIABILITY'].includes(data.type)) { delete data.SymbolProfile.connect; + + if (data.Account?.connect?.id_userId?.id === null) { + data.Account = { disconnect: true }; + } } else { delete data.SymbolProfile.update; diff --git a/apps/api/src/app/order/update-order.dto.ts b/apps/api/src/app/order/update-order.dto.ts index 3123d5665..c0a400c57 100644 --- a/apps/api/src/app/order/update-order.dto.ts +++ b/apps/api/src/app/order/update-order.dto.ts @@ -9,6 +9,7 @@ import { Transform, TransformFnParams } from 'class-transformer'; import { IsArray, IsEnum, + IsISO4217CurrencyCode, IsISO8601, IsNumber, IsOptional, @@ -37,7 +38,7 @@ export class UpdateOrderDto { ) comment?: string; - @IsString() + @IsISO4217CurrencyCode() currency: string; @IsString() diff --git a/apps/api/src/app/platform/platform.controller.ts b/apps/api/src/app/platform/platform.controller.ts index 3bdebd94c..4512e7df0 100644 --- a/apps/api/src/app/platform/platform.controller.ts +++ b/apps/api/src/app/platform/platform.controller.ts @@ -1,6 +1,7 @@ import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator'; import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; import { permissions } from '@ghostfolio/common/permissions'; + import { Body, Controller, diff --git a/apps/api/src/app/platform/platform.module.ts b/apps/api/src/app/platform/platform.module.ts index 04ccdf4d6..42ae9d193 100644 --- a/apps/api/src/app/platform/platform.module.ts +++ b/apps/api/src/app/platform/platform.module.ts @@ -1,4 +1,5 @@ import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; + import { Module } from '@nestjs/common'; import { PlatformController } from './platform.controller'; diff --git a/apps/api/src/app/platform/platform.service.ts b/apps/api/src/app/platform/platform.service.ts index 35730d041..db827569d 100644 --- a/apps/api/src/app/platform/platform.service.ts +++ b/apps/api/src/app/platform/platform.service.ts @@ -1,4 +1,5 @@ import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; + import { Injectable } from '@nestjs/common'; import { Platform, Prisma } from '@prisma/client'; diff --git a/apps/api/src/app/portfolio/current-rate.service.mock.ts b/apps/api/src/app/portfolio/current-rate.service.mock.ts index 7b251551c..ed9229691 100644 --- a/apps/api/src/app/portfolio/current-rate.service.mock.ts +++ b/apps/api/src/app/portfolio/current-rate.service.mock.ts @@ -1,4 +1,5 @@ import { parseDate, resetHours } from '@ghostfolio/common/helper'; + import { addDays, endOfDay, isBefore, isSameDay } from 'date-fns'; import { GetValueObject } from './interfaces/get-value-object.interface'; @@ -42,6 +43,17 @@ function mockGetValue(symbol: string, date: Date) { return { marketPrice: 0 }; + case 'MSFT': + if (isSameDay(parseDate('2021-09-16'), date)) { + return { marketPrice: 89.12 }; + } else if (isSameDay(parseDate('2021-11-16'), date)) { + return { marketPrice: 339.51 }; + } else if (isSameDay(parseDate('2023-07-10'), date)) { + return { marketPrice: 331.83 }; + } + + return { marketPrice: 0 }; + case 'NOVN.SW': if (isSameDay(parseDate('2022-04-11'), date)) { return { marketPrice: 87.8 }; diff --git a/apps/api/src/app/portfolio/current-rate.service.spec.ts b/apps/api/src/app/portfolio/current-rate.service.spec.ts index 955e82b37..9b0548522 100644 --- a/apps/api/src/app/portfolio/current-rate.service.spec.ts +++ b/apps/api/src/app/portfolio/current-rate.service.spec.ts @@ -2,6 +2,7 @@ import { DataProviderService } from '@ghostfolio/api/services/data-provider/data import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; import { PropertyService } from '@ghostfolio/api/services/property/property.service'; import { UniqueAsset } from '@ghostfolio/common/interfaces'; + import { DataSource, MarketData } from '@prisma/client'; import { CurrentRateService } from './current-rate.service'; @@ -106,7 +107,9 @@ describe('CurrentRateService', () => { currentRateService = new CurrentRateService( dataProviderService, - marketDataService + marketDataService, + null, + null ); }); diff --git a/apps/api/src/app/portfolio/current-rate.service.ts b/apps/api/src/app/portfolio/current-rate.service.ts index 75abc0acd..f4855329e 100644 --- a/apps/api/src/app/portfolio/current-rate.service.ts +++ b/apps/api/src/app/portfolio/current-rate.service.ts @@ -1,3 +1,4 @@ +import { OrderService } from '@ghostfolio/api/app/order/order.service'; import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; import { resetHours } from '@ghostfolio/common/helper'; @@ -6,7 +7,10 @@ import { ResponseError, UniqueAsset } from '@ghostfolio/common/interfaces'; -import { Injectable } from '@nestjs/common'; +import type { RequestWithUser } from '@ghostfolio/common/types'; + +import { Inject, Injectable } from '@nestjs/common'; +import { REQUEST } from '@nestjs/core'; import { isBefore, isToday } from 'date-fns'; import { flatten, isEmpty, uniqBy } from 'lodash'; @@ -18,9 +22,12 @@ import { GetValuesParams } from './interfaces/get-values-params.interface'; export class CurrentRateService { public constructor( private readonly dataProviderService: DataProviderService, - private readonly marketDataService: MarketDataService + private readonly marketDataService: MarketDataService, + private readonly orderService: OrderService, + @Inject(REQUEST) private readonly request: RequestWithUser ) {} + // TODO: Pass user instead of using this.request.user public async getValues({ dataGatheringItems, dateQuery @@ -39,7 +46,7 @@ export class CurrentRateService { if (includeToday) { promises.push( this.dataProviderService - .getQuotes({ items: dataGatheringItems }) + .getQuotes({ items: dataGatheringItems, user: this.request?.user }) .then((dataResultProvider) => { const result: GetValueObject[] = []; @@ -116,11 +123,17 @@ export class CurrentRateService { }); if (!value) { + // Fallback to unit price of latest activity + const latestActivity = await this.orderService.getLatestOrder({ + dataSource, + symbol + }); + value = { dataSource, symbol, date: today, - marketPrice: 0 + marketPrice: latestActivity?.unitPrice ?? 0 }; response.values.push(value); diff --git a/apps/api/src/app/portfolio/interfaces/current-positions.interface.ts b/apps/api/src/app/portfolio/interfaces/current-positions.interface.ts index b1e6a3154..9ad9ee822 100644 --- a/apps/api/src/app/portfolio/interfaces/current-positions.interface.ts +++ b/apps/api/src/app/portfolio/interfaces/current-positions.interface.ts @@ -1,8 +1,9 @@ import { ResponseError, TimelinePosition } from '@ghostfolio/common/interfaces'; + import Big from 'big.js'; export interface CurrentPositions extends ResponseError { - positions: TimelinePosition[]; + currentValueInBaseCurrency: Big; grossPerformance: Big; grossPerformanceWithCurrencyEffect: Big; grossPerformancePercentage: Big; @@ -13,6 +14,6 @@ export interface CurrentPositions extends ResponseError { netPerformanceWithCurrencyEffect: Big; netPerformancePercentage: Big; netPerformancePercentageWithCurrencyEffect: Big; - currentValue: Big; + positions: TimelinePosition[]; totalInvestment: Big; } diff --git a/apps/api/src/app/portfolio/interfaces/portfolio-calculator.interface.ts b/apps/api/src/app/portfolio/interfaces/portfolio-calculator.interface.ts index 357b454fd..c5266fb33 100644 --- a/apps/api/src/app/portfolio/interfaces/portfolio-calculator.interface.ts +++ b/apps/api/src/app/portfolio/interfaces/portfolio-calculator.interface.ts @@ -5,7 +5,7 @@ import { PortfolioOrder } from './portfolio-order.interface'; export interface PortfolioOrderItem extends PortfolioOrder { feeInBaseCurrency?: Big; feeInBaseCurrencyWithCurrencyEffect?: Big; - itemType?: '' | 'start' | 'end'; + itemType?: 'end' | 'start'; unitPriceInBaseCurrency?: Big; unitPriceInBaseCurrencyWithCurrencyEffect?: Big; } diff --git a/apps/api/src/app/portfolio/interfaces/portfolio-order.interface.ts b/apps/api/src/app/portfolio/interfaces/portfolio-order.interface.ts index cc3a97752..161fbbecb 100644 --- a/apps/api/src/app/portfolio/interfaces/portfolio-order.interface.ts +++ b/apps/api/src/app/portfolio/interfaces/portfolio-order.interface.ts @@ -1,4 +1,4 @@ -import { DataSource, Tag, Type as TypeOfOrder } from '@prisma/client'; +import { DataSource, Tag, Type as ActivityType } from '@prisma/client'; import Big from 'big.js'; export interface PortfolioOrder { @@ -10,6 +10,6 @@ export interface PortfolioOrder { quantity: Big; symbol: string; tags?: Tag[]; - type: TypeOfOrder; + type: ActivityType; unitPrice: Big; } diff --git a/apps/api/src/app/portfolio/interfaces/portfolio-position-detail.interface.ts b/apps/api/src/app/portfolio/interfaces/portfolio-position-detail.interface.ts index 07b658666..6955785f2 100644 --- a/apps/api/src/app/portfolio/interfaces/portfolio-position-detail.interface.ts +++ b/apps/api/src/app/portfolio/interfaces/portfolio-position-detail.interface.ts @@ -4,9 +4,11 @@ import { HistoricalDataItem } from '@ghostfolio/common/interfaces'; import { OrderWithAccount } from '@ghostfolio/common/types'; -import { Tag } from '@prisma/client'; + +import { Account, Tag } from '@prisma/client'; export interface PortfolioPositionDetail { + accounts: Account[]; averagePrice: number; dataProviderInfo: DataProviderInfo; dividendInBaseCurrency: number; diff --git a/apps/api/src/app/portfolio/interfaces/transaction-point-symbol.interface.ts b/apps/api/src/app/portfolio/interfaces/transaction-point-symbol.interface.ts index 5350adccc..fb2f0a389 100644 --- a/apps/api/src/app/portfolio/interfaces/transaction-point-symbol.interface.ts +++ b/apps/api/src/app/portfolio/interfaces/transaction-point-symbol.interface.ts @@ -2,8 +2,10 @@ import { DataSource, Tag } from '@prisma/client'; import Big from 'big.js'; export interface TransactionPointSymbol { + averagePrice: Big; currency: string; dataSource: DataSource; + dividend: Big; fee: Big; firstBuyDate: string; investment: Big; diff --git a/apps/api/src/app/portfolio/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts b/apps/api/src/app/portfolio/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts new file mode 100644 index 000000000..703931846 --- /dev/null +++ b/apps/api/src/app/portfolio/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts @@ -0,0 +1,166 @@ +import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service'; +import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; +import { parseDate } from '@ghostfolio/common/helper'; + +import Big from 'big.js'; + +import { CurrentRateServiceMock } from './current-rate.service.mock'; +import { PortfolioCalculator } from './portfolio-calculator'; + +jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { + return { + // eslint-disable-next-line @typescript-eslint/naming-convention + CurrentRateService: jest.fn().mockImplementation(() => { + return CurrentRateServiceMock; + }) + }; +}); + +describe('PortfolioCalculator', () => { + let currentRateService: CurrentRateService; + let exchangeRateDataService: ExchangeRateDataService; + + beforeEach(() => { + currentRateService = new CurrentRateService(null, null, null, null); + + exchangeRateDataService = new ExchangeRateDataService( + null, + null, + null, + null + ); + }); + + describe('get current positions', () => { + it.only('with BALN.SW buy and sell in two activities', async () => { + const portfolioCalculator = new PortfolioCalculator({ + currentRateService, + exchangeRateDataService, + currency: 'CHF', + orders: [ + { + currency: 'CHF', + date: '2021-11-22', + dataSource: 'YAHOO', + fee: new Big(1.55), + name: 'Bâloise Holding AG', + quantity: new Big(2), + symbol: 'BALN.SW', + type: 'BUY', + unitPrice: new Big(142.9) + }, + { + currency: 'CHF', + date: '2021-11-30', + dataSource: 'YAHOO', + fee: new Big(1.65), + name: 'Bâloise Holding AG', + quantity: new Big(1), + symbol: 'BALN.SW', + type: 'SELL', + unitPrice: new Big(136.6) + }, + { + currency: 'CHF', + date: '2021-11-30', + dataSource: 'YAHOO', + fee: new Big(0), + name: 'Bâloise Holding AG', + quantity: new Big(1), + symbol: 'BALN.SW', + type: 'SELL', + unitPrice: new Big(136.6) + } + ] + }); + + portfolioCalculator.computeTransactionPoints(); + + const spy = jest + .spyOn(Date, 'now') + .mockImplementation(() => parseDate('2021-12-18').getTime()); + + const chartData = await portfolioCalculator.getChartData({ + start: parseDate('2021-11-22') + }); + + const currentPositions = await portfolioCalculator.getCurrentPositions( + parseDate('2021-11-22') + ); + + const investments = portfolioCalculator.getInvestments(); + + const investmentsByMonth = portfolioCalculator.getInvestmentsByGroup({ + data: chartData, + groupBy: 'month' + }); + + spy.mockRestore(); + + expect(currentPositions).toEqual({ + currentValueInBaseCurrency: new Big('0'), + errors: [], + grossPerformance: new Big('-12.6'), + grossPerformancePercentage: new Big('-0.04408677396780965649'), + grossPerformancePercentageWithCurrencyEffect: new Big( + '-0.04408677396780965649' + ), + grossPerformanceWithCurrencyEffect: new Big('-12.6'), + hasErrors: false, + netPerformance: new Big('-15.8'), + netPerformancePercentage: new Big('-0.05528341497550734703'), + netPerformancePercentageWithCurrencyEffect: new Big( + '-0.05528341497550734703' + ), + netPerformanceWithCurrencyEffect: new Big('-15.8'), + positions: [ + { + averagePrice: new Big('0'), + currency: 'CHF', + dataSource: 'YAHOO', + dividend: new Big('0'), + dividendInBaseCurrency: new Big('0'), + fee: new Big('3.2'), + firstBuyDate: '2021-11-22', + grossPerformance: new Big('-12.6'), + grossPerformancePercentage: new Big('-0.04408677396780965649'), + grossPerformancePercentageWithCurrencyEffect: new Big( + '-0.04408677396780965649' + ), + grossPerformanceWithCurrencyEffect: new Big('-12.6'), + investment: new Big('0'), + investmentWithCurrencyEffect: new Big('0'), + netPerformance: new Big('-15.8'), + netPerformancePercentage: new Big('-0.05528341497550734703'), + netPerformancePercentageWithCurrencyEffect: new Big( + '-0.05528341497550734703' + ), + netPerformanceWithCurrencyEffect: new Big('-15.8'), + marketPrice: 148.9, + marketPriceInBaseCurrency: 148.9, + quantity: new Big('0'), + symbol: 'BALN.SW', + timeWeightedInvestment: new Big('285.80000000000000396627'), + timeWeightedInvestmentWithCurrencyEffect: new Big( + '285.80000000000000396627' + ), + transactionCount: 3, + valueInBaseCurrency: new Big('0') + } + ], + totalInvestment: new Big('0'), + totalInvestmentWithCurrencyEffect: new Big('0') + }); + + expect(investments).toEqual([ + { date: '2021-11-22', investment: new Big('285.8') }, + { date: '2021-11-30', investment: new Big('0') } + ]); + + expect(investmentsByMonth).toEqual([ + { date: '2021-11-01', investment: 0 }, + { date: '2021-12-01', investment: 0 } + ]); + }); + }); +}); diff --git a/apps/api/src/app/portfolio/portfolio-calculator-baln-buy-and-sell.spec.ts b/apps/api/src/app/portfolio/portfolio-calculator-baln-buy-and-sell.spec.ts index 110e8e30d..32320dce6 100644 --- a/apps/api/src/app/portfolio/portfolio-calculator-baln-buy-and-sell.spec.ts +++ b/apps/api/src/app/portfolio/portfolio-calculator-baln-buy-and-sell.spec.ts @@ -1,6 +1,7 @@ import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { parseDate } from '@ghostfolio/common/helper'; + import Big from 'big.js'; import { CurrentRateServiceMock } from './current-rate.service.mock'; @@ -20,7 +21,7 @@ describe('PortfolioCalculator', () => { let exchangeRateDataService: ExchangeRateDataService; beforeEach(() => { - currentRateService = new CurrentRateService(null, null); + currentRateService = new CurrentRateService(null, null, null, null); exchangeRateDataService = new ExchangeRateDataService( null, @@ -86,7 +87,7 @@ describe('PortfolioCalculator', () => { spy.mockRestore(); expect(currentPositions).toEqual({ - currentValue: new Big('0'), + currentValueInBaseCurrency: new Big('0'), errors: [], grossPerformance: new Big('-12.6'), grossPerformancePercentage: new Big('-0.0440867739678096571'), @@ -106,6 +107,8 @@ describe('PortfolioCalculator', () => { averagePrice: new Big('0'), currency: 'CHF', dataSource: 'YAHOO', + dividend: new Big('0'), + dividendInBaseCurrency: new Big('0'), fee: new Big('3.2'), firstBuyDate: '2021-11-22', grossPerformance: new Big('-12.6'), @@ -128,7 +131,8 @@ describe('PortfolioCalculator', () => { symbol: 'BALN.SW', timeWeightedInvestment: new Big('285.8'), timeWeightedInvestmentWithCurrencyEffect: new Big('285.8'), - transactionCount: 2 + transactionCount: 2, + valueInBaseCurrency: new Big('0') } ], totalInvestment: new Big('0'), diff --git a/apps/api/src/app/portfolio/portfolio-calculator-baln-buy.spec.ts b/apps/api/src/app/portfolio/portfolio-calculator-baln-buy.spec.ts index 6a28cf065..f0aae5536 100644 --- a/apps/api/src/app/portfolio/portfolio-calculator-baln-buy.spec.ts +++ b/apps/api/src/app/portfolio/portfolio-calculator-baln-buy.spec.ts @@ -1,6 +1,7 @@ import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { parseDate } from '@ghostfolio/common/helper'; + import Big from 'big.js'; import { CurrentRateServiceMock } from './current-rate.service.mock'; @@ -20,7 +21,7 @@ describe('PortfolioCalculator', () => { let exchangeRateDataService: ExchangeRateDataService; beforeEach(() => { - currentRateService = new CurrentRateService(null, null); + currentRateService = new CurrentRateService(null, null, null, null); exchangeRateDataService = new ExchangeRateDataService( null, @@ -75,7 +76,7 @@ describe('PortfolioCalculator', () => { spy.mockRestore(); expect(currentPositions).toEqual({ - currentValue: new Big('297.8'), + currentValueInBaseCurrency: new Big('297.8'), errors: [], grossPerformance: new Big('24.6'), grossPerformancePercentage: new Big('0.09004392386530014641'), @@ -95,6 +96,8 @@ describe('PortfolioCalculator', () => { averagePrice: new Big('136.6'), currency: 'CHF', dataSource: 'YAHOO', + dividend: new Big('0'), + dividendInBaseCurrency: new Big('0'), fee: new Big('1.55'), firstBuyDate: '2021-11-30', grossPerformance: new Big('24.6'), @@ -117,7 +120,8 @@ describe('PortfolioCalculator', () => { symbol: 'BALN.SW', timeWeightedInvestment: new Big('273.2'), timeWeightedInvestmentWithCurrencyEffect: new Big('273.2'), - transactionCount: 1 + transactionCount: 1, + valueInBaseCurrency: new Big('297.8') } ], totalInvestment: new Big('273.2'), diff --git a/apps/api/src/app/portfolio/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts b/apps/api/src/app/portfolio/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts index 767b3e809..d0a8aafc0 100644 --- a/apps/api/src/app/portfolio/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts +++ b/apps/api/src/app/portfolio/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts @@ -2,6 +2,7 @@ import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.s import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { ExchangeRateDataServiceMock } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; + import Big from 'big.js'; import { CurrentRateServiceMock } from './current-rate.service.mock'; @@ -33,7 +34,7 @@ describe('PortfolioCalculator', () => { let exchangeRateDataService: ExchangeRateDataService; beforeEach(() => { - currentRateService = new CurrentRateService(null, null); + currentRateService = new CurrentRateService(null, null, null, null); exchangeRateDataService = new ExchangeRateDataService( null, @@ -99,7 +100,7 @@ describe('PortfolioCalculator', () => { spy.mockRestore(); expect(currentPositions).toEqual({ - currentValue: new Big('13298.425356'), + currentValueInBaseCurrency: new Big('13298.425356'), errors: [], grossPerformance: new Big('27172.74'), grossPerformancePercentage: new Big('42.41978276196153750666'), @@ -119,6 +120,8 @@ describe('PortfolioCalculator', () => { averagePrice: new Big('320.43'), currency: 'USD', dataSource: 'YAHOO', + dividend: new Big('0'), + dividendInBaseCurrency: new Big('0'), fee: new Big('0'), firstBuyDate: '2015-01-01', grossPerformance: new Big('27172.74'), @@ -148,7 +151,8 @@ describe('PortfolioCalculator', () => { timeWeightedInvestmentWithCurrencyEffect: new Big( '636.79469348020066587024' ), - transactionCount: 2 + transactionCount: 2, + valueInBaseCurrency: new Big('13298.425356') } ], totalInvestment: new Big('320.43'), diff --git a/apps/api/src/app/portfolio/portfolio-calculator-googl-buy.spec.ts b/apps/api/src/app/portfolio/portfolio-calculator-googl-buy.spec.ts index 54774dbcf..c3d2eabff 100644 --- a/apps/api/src/app/portfolio/portfolio-calculator-googl-buy.spec.ts +++ b/apps/api/src/app/portfolio/portfolio-calculator-googl-buy.spec.ts @@ -2,6 +2,7 @@ import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.s import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { ExchangeRateDataServiceMock } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; + import Big from 'big.js'; import { CurrentRateServiceMock } from './current-rate.service.mock'; @@ -33,7 +34,7 @@ describe('PortfolioCalculator', () => { let exchangeRateDataService: ExchangeRateDataService; beforeEach(() => { - currentRateService = new CurrentRateService(null, null); + currentRateService = new CurrentRateService(null, null, null, null); exchangeRateDataService = new ExchangeRateDataService( null, @@ -88,7 +89,7 @@ describe('PortfolioCalculator', () => { spy.mockRestore(); expect(currentPositions).toEqual({ - currentValue: new Big('103.10483'), + currentValueInBaseCurrency: new Big('103.10483'), errors: [], grossPerformance: new Big('27.33'), grossPerformancePercentage: new Big('0.3066651705565529623'), @@ -108,6 +109,8 @@ describe('PortfolioCalculator', () => { averagePrice: new Big('89.12'), currency: 'USD', dataSource: 'YAHOO', + dividend: new Big('0'), + dividendInBaseCurrency: new Big('0'), fee: new Big('1'), firstBuyDate: '2023-01-03', grossPerformance: new Big('27.33'), @@ -131,7 +134,8 @@ describe('PortfolioCalculator', () => { tags: undefined, timeWeightedInvestment: new Big('89.12'), timeWeightedInvestmentWithCurrencyEffect: new Big('82.329056'), - transactionCount: 1 + transactionCount: 1, + valueInBaseCurrency: new Big('103.10483') } ], totalInvestment: new Big('89.12'), diff --git a/apps/api/src/app/portfolio/portfolio-calculator-msft-buy-with-dividend.spec.ts b/apps/api/src/app/portfolio/portfolio-calculator-msft-buy-with-dividend.spec.ts new file mode 100644 index 000000000..de63bced1 --- /dev/null +++ b/apps/api/src/app/portfolio/portfolio-calculator-msft-buy-with-dividend.spec.ts @@ -0,0 +1,118 @@ +import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service'; +import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; +import { ExchangeRateDataServiceMock } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service.mock'; +import { parseDate } from '@ghostfolio/common/helper'; + +import Big from 'big.js'; + +import { CurrentRateServiceMock } from './current-rate.service.mock'; +import { PortfolioCalculator } from './portfolio-calculator'; + +jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { + return { + // eslint-disable-next-line @typescript-eslint/naming-convention + CurrentRateService: jest.fn().mockImplementation(() => { + return CurrentRateServiceMock; + }) + }; +}); + +jest.mock( + '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service', + () => { + return { + // eslint-disable-next-line @typescript-eslint/naming-convention + ExchangeRateDataService: jest.fn().mockImplementation(() => { + return ExchangeRateDataServiceMock; + }) + }; + } +); + +describe('PortfolioCalculator', () => { + let currentRateService: CurrentRateService; + let exchangeRateDataService: ExchangeRateDataService; + + beforeEach(() => { + currentRateService = new CurrentRateService(null, null, null, null); + + exchangeRateDataService = new ExchangeRateDataService( + null, + null, + null, + null + ); + }); + + describe('get current positions', () => { + it.only('with MSFT buy', async () => { + const portfolioCalculator = new PortfolioCalculator({ + currentRateService, + exchangeRateDataService, + currency: 'USD', + orders: [ + { + currency: 'USD', + date: '2021-09-16', + dataSource: 'YAHOO', + fee: new Big(19), + name: 'Microsoft Inc.', + quantity: new Big(1), + symbol: 'MSFT', + type: 'BUY', + unitPrice: new Big(298.58) + }, + { + currency: 'USD', + date: '2021-11-16', + dataSource: 'YAHOO', + fee: new Big(0), + name: 'Microsoft Inc.', + quantity: new Big(1), + symbol: 'MSFT', + type: 'DIVIDEND', + unitPrice: new Big(0.62) + } + ] + }); + + portfolioCalculator.computeTransactionPoints(); + + const spy = jest + .spyOn(Date, 'now') + .mockImplementation(() => parseDate('2023-07-10').getTime()); + + const currentPositions = await portfolioCalculator.getCurrentPositions( + parseDate('2023-07-10') + ); + + spy.mockRestore(); + + expect(currentPositions).toMatchObject({ + errors: [], + hasErrors: false, + positions: [ + { + averagePrice: new Big('298.58'), + currency: 'USD', + dataSource: 'YAHOO', + dividend: new Big('0.62'), + dividendInBaseCurrency: new Big('0.62'), + fee: new Big('19'), + firstBuyDate: '2021-09-16', + investment: new Big('298.58'), + investmentWithCurrencyEffect: new Big('298.58'), + marketPrice: 331.83, + marketPriceInBaseCurrency: 331.83, + quantity: new Big('1'), + symbol: 'MSFT', + tags: undefined, + transactionCount: 2 + } + ], + totalInvestment: new Big('298.58'), + totalInvestmentWithCurrencyEffect: new Big('298.58') + }); + }); + }); +}); diff --git a/apps/api/src/app/portfolio/portfolio-calculator-no-orders.spec.ts b/apps/api/src/app/portfolio/portfolio-calculator-no-orders.spec.ts index 8e3add9ff..f87075c1f 100644 --- a/apps/api/src/app/portfolio/portfolio-calculator-no-orders.spec.ts +++ b/apps/api/src/app/portfolio/portfolio-calculator-no-orders.spec.ts @@ -1,6 +1,7 @@ import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { parseDate } from '@ghostfolio/common/helper'; + import Big from 'big.js'; import { CurrentRateServiceMock } from './current-rate.service.mock'; @@ -20,7 +21,7 @@ describe('PortfolioCalculator', () => { let exchangeRateDataService: ExchangeRateDataService; beforeEach(() => { - currentRateService = new CurrentRateService(null, null); + currentRateService = new CurrentRateService(null, null, null, null); exchangeRateDataService = new ExchangeRateDataService( null, @@ -63,7 +64,7 @@ describe('PortfolioCalculator', () => { spy.mockRestore(); expect(currentPositions).toEqual({ - currentValue: new Big(0), + currentValueInBaseCurrency: new Big(0), grossPerformance: new Big(0), grossPerformancePercentage: new Big(0), grossPerformancePercentageWithCurrencyEffect: new Big(0), diff --git a/apps/api/src/app/portfolio/portfolio-calculator-novn-buy-and-sell-partially.spec.ts b/apps/api/src/app/portfolio/portfolio-calculator-novn-buy-and-sell-partially.spec.ts index f891122e4..8aa5cf0cb 100644 --- a/apps/api/src/app/portfolio/portfolio-calculator-novn-buy-and-sell-partially.spec.ts +++ b/apps/api/src/app/portfolio/portfolio-calculator-novn-buy-and-sell-partially.spec.ts @@ -1,6 +1,7 @@ import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { parseDate } from '@ghostfolio/common/helper'; + import Big from 'big.js'; import { CurrentRateServiceMock } from './current-rate.service.mock'; @@ -20,7 +21,7 @@ describe('PortfolioCalculator', () => { let exchangeRateDataService: ExchangeRateDataService; beforeEach(() => { - currentRateService = new CurrentRateService(null, null); + currentRateService = new CurrentRateService(null, null, null, null); exchangeRateDataService = new ExchangeRateDataService( null, @@ -86,7 +87,7 @@ describe('PortfolioCalculator', () => { spy.mockRestore(); expect(currentPositions).toEqual({ - currentValue: new Big('87.8'), + currentValueInBaseCurrency: new Big('87.8'), errors: [], grossPerformance: new Big('21.93'), grossPerformancePercentage: new Big('0.15113417083448194384'), @@ -106,6 +107,8 @@ describe('PortfolioCalculator', () => { averagePrice: new Big('75.80'), currency: 'CHF', dataSource: 'YAHOO', + dividend: new Big('0'), + dividendInBaseCurrency: new Big('0'), fee: new Big('4.25'), firstBuyDate: '2022-03-07', grossPerformance: new Big('21.93'), @@ -130,7 +133,8 @@ describe('PortfolioCalculator', () => { timeWeightedInvestmentWithCurrencyEffect: new Big( '145.10285714285714285714' ), - transactionCount: 2 + transactionCount: 2, + valueInBaseCurrency: new Big('87.8') } ], totalInvestment: new Big('75.80'), diff --git a/apps/api/src/app/portfolio/portfolio-calculator-novn-buy-and-sell.spec.ts b/apps/api/src/app/portfolio/portfolio-calculator-novn-buy-and-sell.spec.ts index 1a13ba7e5..669013858 100644 --- a/apps/api/src/app/portfolio/portfolio-calculator-novn-buy-and-sell.spec.ts +++ b/apps/api/src/app/portfolio/portfolio-calculator-novn-buy-and-sell.spec.ts @@ -1,6 +1,7 @@ import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { parseDate } from '@ghostfolio/common/helper'; + import Big from 'big.js'; import { CurrentRateServiceMock } from './current-rate.service.mock'; @@ -20,7 +21,7 @@ describe('PortfolioCalculator', () => { let exchangeRateDataService: ExchangeRateDataService; beforeEach(() => { - currentRateService = new CurrentRateService(null, null); + currentRateService = new CurrentRateService(null, null, null, null); exchangeRateDataService = new ExchangeRateDataService( null, @@ -112,7 +113,7 @@ describe('PortfolioCalculator', () => { }); expect(currentPositions).toEqual({ - currentValue: new Big('0'), + currentValueInBaseCurrency: new Big('0'), errors: [], grossPerformance: new Big('19.86'), grossPerformancePercentage: new Big('0.13100263852242744063'), @@ -132,6 +133,8 @@ describe('PortfolioCalculator', () => { averagePrice: new Big('0'), currency: 'CHF', dataSource: 'YAHOO', + dividend: new Big('0'), + dividendInBaseCurrency: new Big('0'), fee: new Big('0'), firstBuyDate: '2022-03-07', grossPerformance: new Big('19.86'), @@ -154,7 +157,8 @@ describe('PortfolioCalculator', () => { symbol: 'NOVN.SW', timeWeightedInvestment: new Big('151.6'), timeWeightedInvestmentWithCurrencyEffect: new Big('151.6'), - transactionCount: 2 + transactionCount: 2, + valueInBaseCurrency: new Big('0') } ], totalInvestment: new Big('0'), diff --git a/apps/api/src/app/portfolio/portfolio-calculator.spec.ts b/apps/api/src/app/portfolio/portfolio-calculator.spec.ts index d45ce0383..a59b877ab 100644 --- a/apps/api/src/app/portfolio/portfolio-calculator.spec.ts +++ b/apps/api/src/app/portfolio/portfolio-calculator.spec.ts @@ -1,4 +1,5 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; + import Big from 'big.js'; import { CurrentRateService } from './current-rate.service'; @@ -9,7 +10,7 @@ describe('PortfolioCalculator', () => { let exchangeRateDataService: ExchangeRateDataService; beforeEach(() => { - currentRateService = new CurrentRateService(null, null); + currentRateService = new CurrentRateService(null, null, null, null); exchangeRateDataService = new ExchangeRateDataService( null, diff --git a/apps/api/src/app/portfolio/portfolio-calculator.ts b/apps/api/src/app/portfolio/portfolio-calculator.ts index 0813a041e..91d91309f 100644 --- a/apps/api/src/app/portfolio/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/portfolio-calculator.ts @@ -1,3 +1,4 @@ +import { getFactor } from '@ghostfolio/api/helper/portfolio.helper'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { IDataGatheringItem } from '@ghostfolio/api/services/interfaces/interfaces'; import { DATE_FORMAT, parseDate, resetHours } from '@ghostfolio/common/helper'; @@ -10,8 +11,8 @@ import { TimelinePosition } from '@ghostfolio/common/interfaces'; import { GroupBy } from '@ghostfolio/common/types'; + import { Logger } from '@nestjs/common'; -import { Type as TypeOfOrder } from '@prisma/client'; import Big from 'big.js'; import { addDays, @@ -21,6 +22,7 @@ import { format, isBefore, isSameDay, + max, subDays } from 'date-fns'; import { cloneDeep, first, isNumber, last, sortBy, uniq } from 'lodash'; @@ -69,40 +71,40 @@ export class PortfolioCalculator { let lastDate: string = null; let lastTransactionPoint: TransactionPoint = null; + for (const order of this.orders) { const currentDate = order.date; let currentTransactionPointItem: TransactionPointSymbol; const oldAccumulatedSymbol = symbols[order.symbol]; - const factor = this.getFactor(order.type); - const unitPrice = new Big(order.unitPrice); + const factor = getFactor(order.type); + if (oldAccumulatedSymbol) { + let investment = oldAccumulatedSymbol.investment; + const newQuantity = order.quantity .mul(factor) .plus(oldAccumulatedSymbol.quantity); - let investment = new Big(0); - - if (newQuantity.gt(0)) { - if (order.type === 'BUY') { - investment = oldAccumulatedSymbol.investment.plus( - order.quantity.mul(unitPrice) - ); - } else if (order.type === 'SELL') { - const averagePrice = oldAccumulatedSymbol.investment.div( - oldAccumulatedSymbol.quantity - ); - investment = oldAccumulatedSymbol.investment.minus( - order.quantity.mul(averagePrice) - ); - } + if (order.type === 'BUY') { + investment = oldAccumulatedSymbol.investment.plus( + order.quantity.mul(order.unitPrice) + ); + } else if (order.type === 'SELL') { + investment = oldAccumulatedSymbol.investment.minus( + order.quantity.mul(oldAccumulatedSymbol.averagePrice) + ); } currentTransactionPointItem = { investment, + averagePrice: newQuantity.gt(0) + ? investment.div(newQuantity) + : new Big(0), currency: order.currency, dataSource: order.dataSource, + dividend: new Big(0), fee: order.fee.plus(oldAccumulatedSymbol.fee), firstBuyDate: oldAccumulatedSymbol.firstBuyDate, quantity: newQuantity, @@ -112,11 +114,13 @@ export class PortfolioCalculator { }; } else { currentTransactionPointItem = { + averagePrice: order.unitPrice, currency: order.currency, dataSource: order.dataSource, + dividend: new Big(0), fee: order.fee, firstBuyDate: order.date, - investment: unitPrice.mul(order.quantity).mul(factor), + investment: order.unitPrice.mul(order.quantity).mul(factor), quantity: order.quantity.mul(factor), symbol: order.symbol, tags: order.tags, @@ -127,22 +131,28 @@ export class PortfolioCalculator { symbols[order.symbol] = currentTransactionPointItem; const items = lastTransactionPoint?.items ?? []; + const newItems = items.filter( (transactionPointItem) => transactionPointItem.symbol !== order.symbol ); + newItems.push(currentTransactionPointItem); + newItems.sort((a, b) => { return a.symbol?.localeCompare(b.symbol); }); + if (lastDate !== currentDate || lastTransactionPoint === null) { lastTransactionPoint = { date: currentDate, items: newItems }; + this.transactionPoints.push(lastTransactionPoint); } else { lastTransactionPoint.items = newItems; } + lastDate = currentDate; } } @@ -440,16 +450,27 @@ export class PortfolioCalculator { public async getCurrentPositions( start: Date, - end = new Date(Date.now()) + end?: Date ): Promise { - const transactionPointsBeforeEndDate = - this.transactionPoints?.filter((transactionPoint) => { - return isBefore(parseDate(transactionPoint.date), end); - }) ?? []; + const lastTransactionPoint = last(this.transactionPoints); - if (!transactionPointsBeforeEndDate.length) { + let endDate = end; + + if (!endDate) { + endDate = new Date(Date.now()); + + if (lastTransactionPoint) { + endDate = max([endDate, parseDate(lastTransactionPoint.date)]); + } + } + + const transactionPoints = this.transactionPoints?.filter(({ date }) => { + return isBefore(parseDate(date), endDate); + }); + + if (!transactionPoints.length) { return { - currentValue: new Big(0), + currentValueInBaseCurrency: new Big(0), grossPerformance: new Big(0), grossPerformancePercentage: new Big(0), grossPerformancePercentageWithCurrencyEffect: new Big(0), @@ -464,41 +485,40 @@ export class PortfolioCalculator { }; } - const lastTransactionPoint = - transactionPointsBeforeEndDate[transactionPointsBeforeEndDate.length - 1]; - const currencies: { [symbol: string]: string } = {}; const dataGatheringItems: IDataGatheringItem[] = []; let dates: Date[] = []; - let firstIndex = transactionPointsBeforeEndDate.length; + let firstIndex = transactionPoints.length; let firstTransactionPoint: TransactionPoint = null; dates.push(resetHours(start)); - for (const item of transactionPointsBeforeEndDate[firstIndex - 1].items) { + + for (const { currency, dataSource, symbol } of transactionPoints[ + firstIndex - 1 + ].items) { dataGatheringItems.push({ - dataSource: item.dataSource, - symbol: item.symbol + dataSource, + symbol }); - currencies[item.symbol] = item.currency; + currencies[symbol] = currency; } - for (let i = 0; i < transactionPointsBeforeEndDate.length; i++) { + for (let i = 0; i < transactionPoints.length; i++) { if ( - !isBefore(parseDate(transactionPointsBeforeEndDate[i].date), start) && + !isBefore(parseDate(transactionPoints[i].date), start) && firstTransactionPoint === null ) { - firstTransactionPoint = transactionPointsBeforeEndDate[i]; + firstTransactionPoint = transactionPoints[i]; firstIndex = i; } + if (firstTransactionPoint !== null) { - dates.push( - resetHours(parseDate(transactionPointsBeforeEndDate[i].date)) - ); + dates.push(resetHours(parseDate(transactionPoints[i].date))); } } - dates.push(resetHours(end)); + dates.push(resetHours(endDate)); // Add dates of last week for fallback dates.push(subDays(resetHours(new Date()), 7)); @@ -525,7 +545,7 @@ export class PortfolioCalculator { let exchangeRatesByCurrency = await this.exchangeRateDataService.getExchangeRatesByCurrency({ currencies: uniq(Object.values(currencies)), - endDate: endOfDay(end), + endDate: endOfDay(endDate), startDate: parseDate(this.transactionPoints?.[0]?.date), targetCurrency: this.currency }); @@ -561,7 +581,7 @@ export class PortfolioCalculator { } } - const endDateString = format(end, DATE_FORMAT); + const endDateString = format(endDate, DATE_FORMAT); if (firstIndex > 0) { firstIndex--; @@ -573,9 +593,9 @@ export class PortfolioCalculator { const errors: ResponseError['errors'] = []; for (const item of lastTransactionPoint.items) { - const marketPriceInBaseCurrency = marketSymbolMap[endDateString]?.[ - item.symbol - ]?.mul( + const marketPriceInBaseCurrency = ( + marketSymbolMap[endDateString]?.[item.symbol] ?? item.averagePrice + ).mul( exchangeRatesByCurrency[`${item.currency}${this.currency}`]?.[ endDateString ] @@ -593,12 +613,14 @@ export class PortfolioCalculator { netPerformanceWithCurrencyEffect, timeWeightedInvestment, timeWeightedInvestmentWithCurrencyEffect, + totalDividend, + totalDividendInBaseCurrency, totalInvestment, totalInvestmentWithCurrencyEffect } = this.getSymbolMetrics({ - end, marketSymbolMap, start, + end: endDate, exchangeRates: exchangeRatesByCurrency[`${item.currency}${this.currency}`], symbol: item.symbol @@ -607,11 +629,11 @@ export class PortfolioCalculator { hasAnySymbolMetricsErrors = hasAnySymbolMetricsErrors || hasErrors; positions.push({ + dividend: totalDividend, + dividendInBaseCurrency: totalDividendInBaseCurrency, timeWeightedInvestment, timeWeightedInvestmentWithCurrencyEffect, - averagePrice: item.quantity.eq(0) - ? new Big(0) - : item.investment.div(item.quantity), + averagePrice: item.averagePrice, currency: item.currency, dataSource: item.dataSource, fee: item.fee, @@ -645,7 +667,10 @@ export class PortfolioCalculator { quantity: item.quantity, symbol: item.symbol, tags: item.tags, - transactionCount: item.transactionCount + transactionCount: item.transactionCount, + valueInBaseCurrency: new Big(marketPriceInBaseCurrency).mul( + item.quantity + ) }); if ( @@ -714,7 +739,7 @@ export class PortfolioCalculator { } private calculateOverallPerformance(positions: TimelinePosition[]) { - let currentValue = new Big(0); + let currentValueInBaseCurrency = new Big(0); let grossPerformance = new Big(0); let grossPerformanceWithCurrencyEffect = new Big(0); let hasErrors = false; @@ -726,14 +751,9 @@ export class PortfolioCalculator { let totalTimeWeightedInvestmentWithCurrencyEffect = new Big(0); for (const currentPosition of positions) { - if ( - currentPosition.investment && - currentPosition.marketPriceInBaseCurrency - ) { - currentValue = currentValue.plus( - new Big(currentPosition.marketPriceInBaseCurrency).mul( - currentPosition.quantity - ) + if (currentPosition.valueInBaseCurrency) { + currentValueInBaseCurrency = currentValueInBaseCurrency.plus( + currentPosition.valueInBaseCurrency ); } else { hasErrors = true; @@ -790,7 +810,7 @@ export class PortfolioCalculator { } return { - currentValue, + currentValueInBaseCurrency, grossPerformance, grossPerformanceWithCurrencyEffect, hasErrors, @@ -819,24 +839,6 @@ export class PortfolioCalculator { }; } - private getFactor(type: TypeOfOrder) { - let factor: number; - - switch (type) { - case 'BUY': - factor = 1; - break; - case 'SELL': - factor = -1; - break; - default: - factor = 0; - break; - } - - return factor; - } - private getSymbolMetrics({ end, exchangeRates, @@ -888,14 +890,13 @@ export class PortfolioCalculator { [date: string]: Big; } = {}; + let totalDividend = new Big(0); + let totalDividendInBaseCurrency = new Big(0); let totalInvestment = new Big(0); + let totalInvestmentFromBuyTransactions = new Big(0); + let totalInvestmentFromBuyTransactionsWithCurrencyEffect = new Big(0); let totalInvestmentWithCurrencyEffect = new Big(0); - let totalInvestmentWithGrossPerformanceFromSell = new Big(0); - - let totalInvestmentWithGrossPerformanceFromSellWithCurrencyEffect = new Big( - 0 - ); - + let totalQuantityFromBuyTransactions = new Big(0); let totalUnits = new Big(0); let valueAtStartDate: Big; let valueAtStartDateWithCurrencyEffect: Big; @@ -931,6 +932,8 @@ export class PortfolioCalculator { timeWeightedInvestmentValues: {}, timeWeightedInvestmentValuesWithCurrencyEffect: {}, timeWeightedInvestmentWithCurrencyEffect: new Big(0), + totalDividend: new Big(0), + totalDividendInBaseCurrency: new Big(0), totalInvestment: new Big(0), totalInvestmentWithCurrencyEffect: new Big(0) }; @@ -971,6 +974,8 @@ export class PortfolioCalculator { timeWeightedInvestmentValues: {}, timeWeightedInvestmentValuesWithCurrencyEffect: {}, timeWeightedInvestmentWithCurrencyEffect: new Big(0), + totalDividend: new Big(0), + totalDividendInBaseCurrency: new Big(0), totalInvestment: new Big(0), totalInvestmentWithCurrencyEffect: new Big(0) }; @@ -987,7 +992,7 @@ export class PortfolioCalculator { itemType: 'start', name: '', quantity: new Big(0), - type: TypeOfOrder.BUY, + type: 'BUY', unitPrice: unitPriceAtStartDate }); @@ -1001,7 +1006,7 @@ export class PortfolioCalculator { itemType: 'end', name: '', quantity: new Big(0), - type: TypeOfOrder.BUY, + type: 'BUY', unitPrice: unitPriceAtEndDate }); @@ -1028,7 +1033,7 @@ export class PortfolioCalculator { feeInBaseCurrency: new Big(0), name: '', quantity: new Big(0), - type: TypeOfOrder.BUY, + type: 'BUY', unitPrice: marketSymbolMap[format(day, DATE_FORMAT)]?.[symbol] ?? lastUnitPrice @@ -1041,28 +1046,26 @@ export class PortfolioCalculator { } } - // Sort orders so that the start and end placeholder order are at the right + // Sort orders so that the start and end placeholder order are at the correct // position - orders = sortBy(orders, (order) => { - let sortIndex = new Date(order.date); - - if (order.itemType === 'start') { - sortIndex = addMilliseconds(sortIndex, -1); - } + orders = sortBy(orders, ({ date, itemType }) => { + let sortIndex = new Date(date); - if (order.itemType === 'end') { + if (itemType === 'end') { sortIndex = addMilliseconds(sortIndex, 1); + } else if (itemType === 'start') { + sortIndex = addMilliseconds(sortIndex, -1); } return sortIndex.getTime(); }); - const indexOfStartOrder = orders.findIndex((order) => { - return order.itemType === 'start'; + const indexOfStartOrder = orders.findIndex(({ itemType }) => { + return itemType === 'start'; }); - const indexOfEndOrder = orders.findIndex((order) => { - return order.itemType === 'end'; + const indexOfEndOrder = orders.findIndex(({ itemType }) => { + return itemType === 'end'; }); let totalInvestmentDays = 0; @@ -1125,29 +1128,41 @@ export class PortfolioCalculator { valueOfInvestmentBeforeTransactionWithCurrencyEffect; } - const transactionInvestment = - order.type === 'BUY' - ? order.quantity - .mul(order.unitPriceInBaseCurrency) - .mul(this.getFactor(order.type)) - : totalUnits.gt(0) - ? totalInvestment - .div(totalUnits) - .mul(order.quantity) - .mul(this.getFactor(order.type)) - : new Big(0); - - const transactionInvestmentWithCurrencyEffect = - order.type === 'BUY' - ? order.quantity - .mul(order.unitPriceInBaseCurrencyWithCurrencyEffect) - .mul(this.getFactor(order.type)) - : totalUnits.gt(0) - ? totalInvestmentWithCurrencyEffect - .div(totalUnits) - .mul(order.quantity) - .mul(this.getFactor(order.type)) - : new Big(0); + let transactionInvestment = new Big(0); + let transactionInvestmentWithCurrencyEffect = new Big(0); + + if (order.type === 'BUY') { + transactionInvestment = order.quantity + .mul(order.unitPriceInBaseCurrency) + .mul(getFactor(order.type)); + + transactionInvestmentWithCurrencyEffect = order.quantity + .mul(order.unitPriceInBaseCurrencyWithCurrencyEffect) + .mul(getFactor(order.type)); + + totalQuantityFromBuyTransactions = + totalQuantityFromBuyTransactions.plus(order.quantity); + + totalInvestmentFromBuyTransactions = + totalInvestmentFromBuyTransactions.plus(transactionInvestment); + + totalInvestmentFromBuyTransactionsWithCurrencyEffect = + totalInvestmentFromBuyTransactionsWithCurrencyEffect.plus( + transactionInvestmentWithCurrencyEffect + ); + } else if (order.type === 'SELL') { + if (totalUnits.gt(0)) { + transactionInvestment = totalInvestment + .div(totalUnits) + .mul(order.quantity) + .mul(getFactor(order.type)); + transactionInvestmentWithCurrencyEffect = + totalInvestmentWithCurrencyEffect + .div(totalUnits) + .mul(order.quantity) + .mul(getFactor(order.type)); + } + } if (PortfolioCalculator.ENABLE_LOGGING) { console.log('totalInvestment', totalInvestment.toNumber()); @@ -1201,9 +1216,16 @@ export class PortfolioCalculator { order.feeInBaseCurrencyWithCurrencyEffect ?? 0 ); - totalUnits = totalUnits.plus( - order.quantity.mul(this.getFactor(order.type)) - ); + totalUnits = totalUnits.plus(order.quantity.mul(getFactor(order.type))); + + if (order.type === 'DIVIDEND') { + const dividend = order.quantity.mul(order.unitPrice); + + totalDividend = totalDividend.plus(dividend); + totalDividendInBaseCurrency = totalDividendInBaseCurrency.plus( + dividend.mul(exchangeRateAtOrderDate ?? 1) + ); + } const valueOfInvestment = totalUnits.mul(order.unitPriceInBaseCurrency); @@ -1212,14 +1234,14 @@ export class PortfolioCalculator { ); const grossPerformanceFromSell = - order.type === TypeOfOrder.SELL + order.type === 'SELL' ? order.unitPriceInBaseCurrency .minus(lastAveragePrice) .mul(order.quantity) : new Big(0); const grossPerformanceFromSellWithCurrencyEffect = - order.type === TypeOfOrder.SELL + order.type === 'SELL' ? order.unitPriceInBaseCurrencyWithCurrencyEffect .minus(lastAveragePriceWithCurrencyEffect) .mul(order.quantity) @@ -1234,35 +1256,21 @@ export class PortfolioCalculator { grossPerformanceFromSellWithCurrencyEffect ); - totalInvestmentWithGrossPerformanceFromSell = - totalInvestmentWithGrossPerformanceFromSell - .plus(transactionInvestment) - .plus(grossPerformanceFromSell); - - totalInvestmentWithGrossPerformanceFromSellWithCurrencyEffect = - totalInvestmentWithGrossPerformanceFromSellWithCurrencyEffect - .plus(transactionInvestmentWithCurrencyEffect) - .plus(grossPerformanceFromSellWithCurrencyEffect); - - lastAveragePrice = totalUnits.eq(0) + lastAveragePrice = totalQuantityFromBuyTransactions.eq(0) ? new Big(0) - : totalInvestmentWithGrossPerformanceFromSell.div(totalUnits); + : totalInvestmentFromBuyTransactions.div( + totalQuantityFromBuyTransactions + ); - lastAveragePriceWithCurrencyEffect = totalUnits.eq(0) + lastAveragePriceWithCurrencyEffect = totalQuantityFromBuyTransactions.eq( + 0 + ) ? new Big(0) - : totalInvestmentWithGrossPerformanceFromSellWithCurrencyEffect.div( - totalUnits + : totalInvestmentFromBuyTransactionsWithCurrencyEffect.div( + totalQuantityFromBuyTransactions ); if (PortfolioCalculator.ENABLE_LOGGING) { - console.log( - 'totalInvestmentWithGrossPerformanceFromSell', - totalInvestmentWithGrossPerformanceFromSell.toNumber() - ); - console.log( - 'totalInvestmentWithGrossPerformanceFromSellWithCurrencyEffect', - totalInvestmentWithGrossPerformanceFromSellWithCurrencyEffect.toNumber() - ); console.log( 'grossPerformanceFromSells', grossPerformanceFromSells.toNumber() @@ -1296,7 +1304,7 @@ export class PortfolioCalculator { grossPerformanceWithCurrencyEffect; } - if (i > indexOfStartOrder) { + if (i > indexOfStartOrder && ['BUY', 'SELL'].includes(order.type)) { // Only consider periods with an investment for the calculation of // the time weighted investment if (valueOfInvestmentBeforeTransaction.gt(0)) { @@ -1308,11 +1316,10 @@ export class PortfolioCalculator { orderDate, previousOrderDate ); - - // Set to at least 1 day, otherwise the transactions on the same day - // would not be considered in the time weighted calculation if (daysSinceLastOrder <= 0) { - daysSinceLastOrder = 1; + // The time between two activities on the same day is unknown + // -> Set it to the smallest floating point number greater than 0 + daysSinceLastOrder = Number.EPSILON; } // Sum up the total investment days since the start date to calculate @@ -1490,6 +1497,7 @@ export class PortfolioCalculator { Time weighted investment with currency effect: ${timeWeightedAverageInvestmentBetweenStartAndEndDateWithCurrencyEffect.toFixed( 2 )} + Total dividend: ${totalDividend.toFixed(2)} Gross performance: ${totalGrossPerformance.toFixed( 2 )} / ${grossPerformancePercentage.mul(100).toFixed(2)}% @@ -1527,6 +1535,8 @@ export class PortfolioCalculator { netPerformanceValuesWithCurrencyEffect, timeWeightedInvestmentValues, timeWeightedInvestmentValuesWithCurrencyEffect, + totalDividend, + totalDividendInBaseCurrency, totalInvestment, totalInvestmentWithCurrencyEffect, grossPerformance: totalGrossPerformance, diff --git a/apps/api/src/app/portfolio/portfolio.controller.ts b/apps/api/src/app/portfolio/portfolio.controller.ts index b9932fb4f..80ea08fce 100644 --- a/apps/api/src/app/portfolio/portfolio.controller.ts +++ b/apps/api/src/app/portfolio/portfolio.controller.ts @@ -1,4 +1,5 @@ import { AccessService } from '@ghostfolio/api/app/access/access.service'; +import { OrderService } from '@ghostfolio/api/app/order/order.service'; import { UserService } from '@ghostfolio/api/app/user/user.service'; import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; import { @@ -11,6 +12,7 @@ import { TransformDataSourceInResponseInterceptor } from '@ghostfolio/api/interc import { ApiService } from '@ghostfolio/api/services/api/api.service'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; +import { ImpersonationService } from '@ghostfolio/api/services/impersonation/impersonation.service'; import { DEFAULT_CURRENCY, HEADER_KEY_IMPERSONATION @@ -18,6 +20,7 @@ import { import { PortfolioDetails, PortfolioDividends, + PortfolioHoldingsResponse, PortfolioInvestments, PortfolioPerformanceResponse, PortfolioPublicDetails, @@ -28,6 +31,7 @@ import type { GroupBy, RequestWithUser } from '@ghostfolio/common/types'; + import { Controller, Get, @@ -56,6 +60,8 @@ export class PortfolioController { private readonly apiService: ApiService, private readonly configurationService: ConfigurationService, private readonly exchangeRateDataService: ExchangeRateDataService, + private readonly impersonationService: ImpersonationService, + private readonly orderService: OrderService, private readonly portfolioService: PortfolioService, @Inject(REQUEST) private readonly request: RequestWithUser, private readonly userService: UserService @@ -70,8 +76,11 @@ export class PortfolioController { @Query('accounts') filterByAccounts?: string, @Query('assetClasses') filterByAssetClasses?: string, @Query('range') dateRange: DateRange = 'max', - @Query('tags') filterByTags?: string + @Query('tags') filterByTags?: string, + @Query('withLiabilities') withLiabilitiesParam = 'false' ): Promise { + const withLiabilities = withLiabilitiesParam === 'true'; + let hasDetails = true; let hasError = false; const hasReadRestrictedAccessPermission = @@ -90,21 +99,15 @@ export class PortfolioController { filterByTags }); - const { - accounts, - filteredValueInBaseCurrency, - filteredValueInPercentage, - hasErrors, - holdings, - platforms, - summary, - totalValueInBaseCurrency - } = await this.portfolioService.getDetails({ - dateRange, - filters, - impersonationId, - userId: this.request.user.id - }); + const { accounts, hasErrors, holdings, platforms, summary } = + await this.portfolioService.getDetails({ + dateRange, + filters, + impersonationId, + withLiabilities, + userId: this.request.user.id, + withSummary: true + }); if (hasErrors || hasNotDefinedValuesInObject(holdings)) { hasError = true; @@ -117,27 +120,23 @@ export class PortfolioController { this.userService.isRestrictedView(this.request.user) ) { const totalInvestment = Object.values(holdings) - .map((portfolioPosition) => { - return portfolioPosition.investment; + .map(({ investment }) => { + return investment; }) .reduce((a, b) => a + b, 0); const totalValue = Object.values(holdings) - .map((portfolioPosition) => { - return this.exchangeRateDataService.toCurrency( - portfolioPosition.quantity * portfolioPosition.marketPrice, - portfolioPosition.currency, - this.request.user.Settings.settings.baseCurrency - ); + .filter(({ assetClass, assetSubClass }) => { + return assetClass !== 'CASH' && assetSubClass !== 'CASH'; + }) + .map(({ valueInBaseCurrency }) => { + return valueInBaseCurrency; }) .reduce((a, b) => a + b, 0); for (const [symbol, portfolioPosition] of Object.entries(holdings)) { - portfolioPosition.grossPerformance = null; portfolioPosition.investment = portfolioPosition.investment / totalInvestment; - portfolioPosition.netPerformance = null; - portfolioPosition.quantity = null; portfolioPosition.valueInPercentage = portfolioPosition.valueInBaseCurrency / totalValue; } @@ -163,19 +162,21 @@ export class PortfolioController { 'currentGrossPerformanceWithCurrencyEffect', 'currentNetPerformance', 'currentNetPerformanceWithCurrencyEffect', + 'currentNetWorth', 'currentValue', - 'dividend', + 'dividendInBaseCurrency', 'emergencyFund', 'excludedAccountsAndActivities', 'fees', + 'filteredValueInBaseCurrency', 'fireWealth', 'interest', 'items', 'liabilities', - 'netWorth', 'totalBuy', 'totalInvestment', - 'totalSell' + 'totalSell', + 'totalValueInBaseCurrency' ]); } @@ -202,12 +203,9 @@ export class PortfolioController { return { accounts, - filteredValueInBaseCurrency, - filteredValueInPercentage, hasError, holdings, platforms, - totalValueInBaseCurrency, summary: portfolioSummary }; } @@ -234,11 +232,21 @@ export class PortfolioController { filterByTags }); + const impersonationUserId = + await this.impersonationService.validateImpersonationId(impersonationId); + const userCurrency = this.request.user.Settings.settings.baseCurrency; + + const { activities } = await this.orderService.getOrders({ + filters, + userCurrency, + userId: impersonationUserId || this.request.user.id, + types: ['DIVIDEND'] + }); + let dividends = await this.portfolioService.getDividends({ + activities, dateRange, - filters, - groupBy, - impersonationId + groupBy }); if ( @@ -268,6 +276,35 @@ export class PortfolioController { return { dividends }; } + @Get('holdings') + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) + @UseInterceptors(RedactValuesInResponseInterceptor) + @UseInterceptors(TransformDataSourceInResponseInterceptor) + public async getHoldings( + @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string, + @Query('accounts') filterByAccounts?: string, + @Query('assetClasses') filterByAssetClasses?: string, + @Query('holdingType') filterByHoldingType?: string, + @Query('query') filterBySearchQuery?: string, + @Query('tags') filterByTags?: string + ): Promise { + const filters = this.apiService.buildFiltersFromQueryParams({ + filterByAccounts, + filterByAssetClasses, + filterByHoldingType, + filterBySearchQuery, + filterByTags + }); + + const { holdings } = await this.portfolioService.getDetails({ + filters, + impersonationId, + userId: this.request.user.id + }); + + return { holdings: Object.values(holdings) }; + } + @Get('investments') @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async getInvestments( @@ -345,8 +382,12 @@ export class PortfolioController { @Query('assetClasses') filterByAssetClasses?: string, @Query('range') dateRange: DateRange = 'max', @Query('tags') filterByTags?: string, - @Query('withExcludedAccounts') withExcludedAccounts = false + @Query('withExcludedAccounts') withExcludedAccountsParam = 'false', + @Query('withItems') withItemsParam = 'false' ): Promise { + const withExcludedAccounts = withExcludedAccountsParam === 'true'; + const withItems = withItemsParam === 'true'; + const hasReadRestrictedAccessPermission = this.userService.hasReadRestrictedAccessPermission({ impersonationId, @@ -364,6 +405,7 @@ export class PortfolioController { filters, impersonationId, withExcludedAccounts, + withItems, userId: this.request.user.id }); @@ -428,6 +470,10 @@ export class PortfolioController { return nullifyValuesInObject(item, ['totalInvestment', 'value']); } ); + performanceInformation.performance = nullifyValuesInObject( + performanceInformation.performance, + ['currentNetPerformance', 'currentNetPerformancePercent'] + ); } return performanceInformation; @@ -482,7 +528,6 @@ export class PortfolioController { } const { holdings } = await this.portfolioService.getDetails({ - dateRange: 'max', filters: [{ id: 'EQUITY', type: 'ASSET_CLASS' }], impersonationId: access.userId, userId: user.id @@ -514,7 +559,8 @@ export class PortfolioController { dateOfFirstActivity: portfolioPosition.dateOfFirstActivity, markets: hasDetails ? portfolioPosition.markets : undefined, name: portfolioPosition.name, - netPerformancePercent: portfolioPosition.netPerformancePercent, + netPerformancePercentWithCurrencyEffect: + portfolioPosition.netPerformancePercentWithCurrencyEffect, sectors: hasDetails ? portfolioPosition.sectors : [], symbol: portfolioPosition.symbol, url: portfolioPosition.url, diff --git a/apps/api/src/app/portfolio/portfolio.module.ts b/apps/api/src/app/portfolio/portfolio.module.ts index cf3dd2490..4b5034979 100644 --- a/apps/api/src/app/portfolio/portfolio.module.ts +++ b/apps/api/src/app/portfolio/portfolio.module.ts @@ -12,6 +12,7 @@ import { ImpersonationModule } from '@ghostfolio/api/services/impersonation/impe import { MarketDataModule } from '@ghostfolio/api/services/market-data/market-data.module'; import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; import { SymbolProfileModule } from '@ghostfolio/api/services/symbol-profile/symbol-profile.module'; + import { Module } from '@nestjs/common'; import { CurrentRateService } from './current-rate.service'; diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index e00eca175..5b36f91fa 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -7,6 +7,7 @@ import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.s import { PortfolioOrder } from '@ghostfolio/api/app/portfolio/interfaces/portfolio-order.interface'; import { TransactionPoint } from '@ghostfolio/api/app/portfolio/interfaces/transaction-point.interface'; import { UserService } from '@ghostfolio/api/app/user/user.service'; +import { getFactor } from '@ghostfolio/api/helper/portfolio.helper'; import { AccountClusterRiskCurrentInvestment } from '@ghostfolio/api/models/rules/account-cluster-risk/current-investment'; import { AccountClusterRiskSingleAccount } from '@ghostfolio/api/models/rules/account-cluster-risk/single-account'; import { CurrencyClusterRiskBaseCurrencyCurrentInvestment } from '@ghostfolio/api/models/rules/currency-cluster-risk/base-currency-current-investment'; @@ -23,7 +24,12 @@ import { MAX_CHART_ITEMS, UNKNOWN_KEY } from '@ghostfolio/common/config'; -import { DATE_FORMAT, getSum, parseDate } from '@ghostfolio/common/helper'; +import { + DATE_FORMAT, + getAllActivityTypes, + getSum, + parseDate +} from '@ghostfolio/common/helper'; import { Accounts, EnhancedSymbolProfile, @@ -48,6 +54,7 @@ import type { RequestWithUser, UserWithSettings } from '@ghostfolio/common/types'; + import { Inject, Injectable } from '@nestjs/common'; import { REQUEST } from '@nestjs/core'; import { @@ -61,6 +68,7 @@ import { Tag } from '@prisma/client'; import Big from 'big.js'; +import { isUUID } from 'class-validator'; import { differenceInDays, format, @@ -118,7 +126,7 @@ export class PortfolioService { userId: string; withExcludedAccounts?: boolean; }): Promise { - const where: Prisma.AccountWhereInput = { userId: userId }; + const where: Prisma.AccountWhereInput = { userId }; const accountFilter = filters?.find(({ type }) => { return type === 'ACCOUNT'; @@ -215,29 +223,18 @@ export class PortfolioService { } public async getDividends({ - dateRange, - filters, - groupBy, - impersonationId + activities, + dateRange = 'max', + groupBy }: { - dateRange: DateRange; - filters?: Filter[]; + activities: Activity[]; + dateRange?: DateRange; groupBy?: GroupBy; - impersonationId: string; }): Promise { - const userId = await this.getUserId(impersonationId, this.request.user.id); - - const { activities } = await this.orderService.getOrders({ - filters, - userId, - types: ['DIVIDEND'], - userCurrency: this.request.user.Settings.settings.baseCurrency - }); - - let dividends = activities.map((dividend) => { + let dividends = activities.map(({ date, valueInBaseCurrency }) => { return { - date: format(dividend.date, DATE_FORMAT), - investment: dividend.valueInBaseCurrency + date: format(date, DATE_FORMAT), + investment: valueInBaseCurrency }; }); @@ -274,7 +271,8 @@ export class PortfolioService { await this.getTransactionPoints({ filters, userId, - includeDrafts: true + includeDrafts: true, + types: ['BUY', 'SELL'] }); if (transactionPoints.length === 0) { @@ -296,10 +294,9 @@ export class PortfolioService { const { items } = await this.getChart({ dateRange, impersonationId, - portfolioOrders, + portfolioCalculator, transactionPoints, userId, - userCurrency: this.request.user.Settings.settings.baseCurrency, withDataDecimation: false }); @@ -339,13 +336,17 @@ export class PortfolioService { filters, impersonationId, userId, - withExcludedAccounts = false + withExcludedAccounts = false, + withLiabilities = false, + withSummary = false }: { dateRange?: DateRange; filters?: Filter[]; impersonationId: string; userId: string; withExcludedAccounts?: boolean; + withLiabilities?: boolean; + withSummary?: boolean; }): Promise { userId = await this.getUserId(impersonationId, userId); const user = await this.userService.user({ id: userId }); @@ -355,9 +356,20 @@ export class PortfolioService { (user.Settings?.settings as UserSettings)?.emergencyFund ?? 0 ); - const { orders, portfolioOrders, transactionPoints } = + let types = getAllActivityTypes().filter((activityType) => { + return activityType !== 'FEE'; + }); + + if (withLiabilities === false) { + types = types.filter((activityType) => { + return activityType !== 'LIABILITY'; + }); + } + + const { activities, portfolioOrders, transactionPoints } = await this.getTransactionPoints({ filters, + types, userId, withExcludedAccounts }); @@ -385,18 +397,29 @@ export class PortfolioService { }); const holdings: PortfolioDetails['holdings'] = {}; - const totalValueInBaseCurrency = currentPositions.currentValue.plus( - cashDetails.balanceInBaseCurrency - ); + + const totalValueInBaseCurrency = + currentPositions.currentValueInBaseCurrency.plus( + cashDetails.balanceInBaseCurrency + ); const isFilteredByAccount = - filters?.some((filter) => { - return filter.type === 'ACCOUNT'; + filters?.some(({ type }) => { + return type === 'ACCOUNT'; + }) ?? false; + + const isFilteredByCash = filters?.some(({ id, type }) => { + return id === 'CASH' && type === 'ASSET_CLASS'; + }); + + const isFilteredByClosedHoldings = + filters?.some(({ id, type }) => { + return id === 'CLOSED' && type === 'HOLDING_TYPE'; }) ?? false; let filteredValueInBaseCurrency = isFilteredByAccount ? totalValueInBaseCurrency - : currentPositions.currentValue; + : currentPositions.currentValueInBaseCurrency; if ( filters?.length === 0 || @@ -419,7 +442,7 @@ export class PortfolioService { ); const [dataProviderResponses, symbolProfiles] = await Promise.all([ - this.dataProviderService.getQuotes({ items: dataGatheringItems }), + this.dataProviderService.getQuotes({ user, items: dataGatheringItems }), this.symbolProfileService.getSymbolProfiles(dataGatheringItems) ]); @@ -433,15 +456,40 @@ export class PortfolioService { portfolioItemsNow[position.symbol] = position; } - for (const item of currentPositions.positions) { - if (item.quantity.lte(0)) { - // Ignore positions without any quantity - continue; + for (const { + currency, + dividend, + firstBuyDate, + grossPerformance, + grossPerformanceWithCurrencyEffect, + grossPerformancePercentage, + grossPerformancePercentageWithCurrencyEffect, + investment, + marketPrice, + netPerformance, + netPerformancePercentage, + netPerformancePercentageWithCurrencyEffect, + netPerformanceWithCurrencyEffect, + quantity, + symbol, + tags, + transactionCount, + valueInBaseCurrency + } of currentPositions.positions) { + if (isFilteredByClosedHoldings === true) { + if (!quantity.eq(0)) { + // Ignore positions with a quantity + continue; + } + } else { + if (quantity.eq(0)) { + // Ignore positions without any quantity + continue; + } } - const value = item.quantity.mul(item.marketPriceInBaseCurrency ?? 0); - const symbolProfile = symbolProfileMap[item.symbol]; - const dataProviderResponse = dataProviderResponses[item.symbol]; + const symbolProfile = symbolProfileMap[symbol]; + const dataProviderResponse = dataProviderResponses[symbol]; const markets: PortfolioPosition['markets'] = { [UNKNOWN_KEY]: 0, @@ -505,49 +553,53 @@ export class PortfolioService { } } else { markets[UNKNOWN_KEY] = new Big(markets[UNKNOWN_KEY]) - .plus(value) + .plus(valueInBaseCurrency) .toNumber(); marketsAdvanced[UNKNOWN_KEY] = new Big(marketsAdvanced[UNKNOWN_KEY]) - .plus(value) + .plus(valueInBaseCurrency) .toNumber(); } - holdings[item.symbol] = { + holdings[symbol] = { + currency, markets, marketsAdvanced, + marketPrice, + symbol, + tags, + transactionCount, allocationInPercentage: filteredValueInBaseCurrency.eq(0) ? 0 - : value.div(filteredValueInBaseCurrency).toNumber(), + : valueInBaseCurrency.div(filteredValueInBaseCurrency).toNumber(), assetClass: symbolProfile.assetClass, assetSubClass: symbolProfile.assetSubClass, countries: symbolProfile.countries, - currency: item.currency, dataSource: symbolProfile.dataSource, - dateOfFirstActivity: parseDate(item.firstBuyDate), - grossPerformance: item.grossPerformance?.toNumber() ?? 0, - grossPerformancePercent: - item.grossPerformancePercentage?.toNumber() ?? 0, - investment: item.investment.toNumber(), - marketPrice: item.marketPrice, + dateOfFirstActivity: parseDate(firstBuyDate), + dividend: dividend?.toNumber() ?? 0, + grossPerformance: grossPerformance?.toNumber() ?? 0, + grossPerformancePercent: grossPerformancePercentage?.toNumber() ?? 0, + grossPerformancePercentWithCurrencyEffect: + grossPerformancePercentageWithCurrencyEffect?.toNumber() ?? 0, + grossPerformanceWithCurrencyEffect: + grossPerformanceWithCurrencyEffect?.toNumber() ?? 0, + investment: investment.toNumber(), marketState: dataProviderResponse?.marketState ?? 'delayed', name: symbolProfile.name, - netPerformance: item.netPerformance?.toNumber() ?? 0, - netPerformancePercent: item.netPerformancePercentage?.toNumber() ?? 0, - quantity: item.quantity.toNumber(), + netPerformance: netPerformance?.toNumber() ?? 0, + netPerformancePercent: netPerformancePercentage?.toNumber() ?? 0, + netPerformancePercentWithCurrencyEffect: + netPerformancePercentageWithCurrencyEffect?.toNumber() ?? 0, + netPerformanceWithCurrencyEffect: + netPerformanceWithCurrencyEffect?.toNumber() ?? 0, + quantity: quantity.toNumber(), sectors: symbolProfile.sectors, - symbol: item.symbol, - tags: item.tags, - transactionCount: item.transactionCount, url: symbolProfile.url, - valueInBaseCurrency: value.toNumber() + valueInBaseCurrency: valueInBaseCurrency.toNumber() }; } - const isFilteredByCash = filters?.some((filter) => { - return filter.type === 'ASSET_CLASS' && filter.id === 'CASH'; - }); - if (filters?.length === 0 || isFilteredByAccount || isFilteredByCash) { const cashPositions = await this.getCashPositions({ cashDetails, @@ -561,8 +613,8 @@ export class PortfolioService { } const { accounts, platforms } = await this.getValueOfAccountsAndPlatforms({ + activities, filters, - orders, portfolioItemsNow, userCurrency, userId, @@ -604,28 +656,29 @@ export class PortfolioService { }; } - const summary = await this.getSummary({ - impersonationId, - userCurrency, - userId, - balanceInBaseCurrency: cashDetails.balanceInBaseCurrency, - emergencyFundPositionsValueInBaseCurrency: - this.getEmergencyFundPositionsValueInBaseCurrency({ - holdings - }) - }); + let summary: PortfolioSummary; + + if (withSummary) { + summary = await this.getSummary({ + filteredValueInBaseCurrency, + holdings, + impersonationId, + userCurrency, + userId, + balanceInBaseCurrency: cashDetails.balanceInBaseCurrency, + emergencyFundPositionsValueInBaseCurrency: + this.getEmergencyFundPositionsValueInBaseCurrency({ + holdings + }) + }); + } return { accounts, holdings, platforms, summary, - filteredValueInBaseCurrency: filteredValueInBaseCurrency.toNumber(), - filteredValueInPercentage: summary.netWorth - ? filteredValueInBaseCurrency.div(summary.netWorth).toNumber() - : 0, - hasErrors: currentPositions.hasErrors, - totalValueInBaseCurrency: summary.netWorth + hasErrors: currentPositions.hasErrors }; } @@ -656,6 +709,7 @@ export class PortfolioService { if (orders.length <= 0) { return { tags, + accounts: [], averagePrice: undefined, dataProviderInfo: undefined, dividendInBaseCurrency: undefined, @@ -690,7 +744,7 @@ export class PortfolioService { .filter((order) => { tags = tags.concat(order.tags); - return order.type === 'BUY' || order.type === 'SELL'; + return ['BUY', 'DIVIDEND', 'ITEM', 'SELL'].includes(order.type); }) .map((order) => ({ currency: order.SymbolProfile.currency, @@ -731,6 +785,7 @@ export class PortfolioService { averagePrice, currency, dataSource, + dividendInBaseCurrency, fee, firstBuyDate, marketPrice, @@ -738,15 +793,14 @@ export class PortfolioService { transactionCount } = position; - const dividendInBaseCurrency = getSum( - orders - .filter(({ type }) => { - return type === 'DIVIDEND'; - }) - .map(({ valueInBaseCurrency }) => { - return new Big(valueInBaseCurrency); - }) - ); + const accounts: PortfolioPositionDetail['accounts'] = uniqBy( + orders.filter(({ Account }) => { + return Account; + }), + 'Account.id' + ).map(({ Account }) => { + return Account; + }); const historicalData = await this.dataProviderService.getHistorical( [{ dataSource, symbol: aSymbol }], @@ -781,9 +835,7 @@ export class PortfolioService { ); if (currentSymbol) { - currentAveragePrice = currentSymbol.quantity.eq(0) - ? 0 - : currentSymbol.investment.div(currentSymbol.quantity).toNumber(); + currentAveragePrice = currentSymbol.averagePrice.toNumber(); currentQuantity = currentSymbol.quantity.toNumber(); } @@ -811,6 +863,7 @@ export class PortfolioService { } return { + accounts, firstBuyDate, marketPrice, maxPrice, @@ -851,6 +904,7 @@ export class PortfolioService { }; } else { const currentData = await this.dataProviderService.getQuotes({ + user, items: [{ dataSource: DataSource.YAHOO, symbol: aSymbol }] }); const marketPrice = currentData[aSymbol]?.marketPrice; @@ -893,6 +947,7 @@ export class PortfolioService { orders, SymbolProfile, tags, + accounts: [], averagePrice: 0, dataProviderInfo: undefined, dividendInBaseCurrency: 0, @@ -928,11 +983,13 @@ export class PortfolioService { return type === 'SEARCH_QUERY'; })?.id; const userId = await this.getUserId(impersonationId, this.request.user.id); + const user = await this.userService.user({ id: userId }); const { portfolioOrders, transactionPoints } = await this.getTransactionPoints({ filters, - userId + userId, + types: ['BUY', 'SELL'] }); if (transactionPoints?.length <= 0) { @@ -968,7 +1025,7 @@ export class PortfolioService { }); const [dataProviderResponses, symbolProfiles] = await Promise.all([ - this.dataProviderService.getQuotes({ items: dataGatheringItems }), + this.dataProviderService.getQuotes({ user, items: dataGatheringItems }), this.symbolProfileService.getSymbolProfiles( positions.map(({ dataSource, symbol }) => { return { dataSource, symbol }; @@ -1062,13 +1119,15 @@ export class PortfolioService { filters, impersonationId, userId, - withExcludedAccounts = false + withExcludedAccounts = false, + withItems = false }: { dateRange?: DateRange; filters?: Filter[]; impersonationId: string; userId: string; withExcludedAccounts?: boolean; + withItems?: boolean; }): Promise { userId = await this.getUserId(impersonationId, userId); const user = await this.userService.user({ id: userId }); @@ -1103,7 +1162,8 @@ export class PortfolioService { await this.getTransactionPoints({ filters, userId, - withExcludedAccounts + withExcludedAccounts, + types: withItems ? ['BUY', 'ITEM', 'SELL'] : ['BUY', 'SELL'] }); const portfolioCalculator = new PortfolioCalculator({ @@ -1147,7 +1207,7 @@ export class PortfolioService { const startDate = this.getStartDate(dateRange, portfolioStart); const { - currentValue, + currentValueInBaseCurrency, errors, grossPerformance, grossPerformancePercentage, @@ -1174,9 +1234,8 @@ export class PortfolioService { const { items } = await this.getChart({ dateRange, impersonationId, - portfolioOrders, + portfolioCalculator, transactionPoints, - userCurrency, userId }); @@ -1242,7 +1301,7 @@ export class PortfolioService { currentNetPerformancePercentWithCurrencyEffect.toNumber(), currentNetPerformanceWithCurrencyEffect: currentNetPerformanceWithCurrencyEffect.toNumber(), - currentValue: currentValue.toNumber(), + currentValue: currentValueInBaseCurrency.toNumber(), totalInvestment: totalInvestment.toNumber() } }; @@ -1253,9 +1312,10 @@ export class PortfolioService { const user = await this.userService.user({ id: userId }); const userCurrency = this.getUserCurrency(user); - const { orders, portfolioOrders, transactionPoints } = + const { activities, portfolioOrders, transactionPoints } = await this.getTransactionPoints({ - userId + userId, + types: ['BUY', 'SELL'] }); const portfolioCalculator = new PortfolioCalculator({ @@ -1284,7 +1344,7 @@ export class PortfolioService { } const { accounts } = await this.getValueOfAccountsAndPlatforms({ - orders, + activities, portfolioItemsNow, userCurrency, userId @@ -1294,7 +1354,7 @@ export class PortfolioService { return { rules: { - accountClusterRisk: isEmpty(orders) + accountClusterRisk: isEmpty(activities) ? undefined : await this.rulesService.evaluate( [ @@ -1309,7 +1369,7 @@ export class PortfolioService { ], userSettings ), - currencyClusterRisk: isEmpty(orders) + currencyClusterRisk: isEmpty(activities) ? undefined : await this.rulesService.evaluate( [ @@ -1338,7 +1398,7 @@ export class PortfolioService { new FeeRatioInitialInvestment( this.exchangeRateDataService, currentPositions.totalInvestment.toNumber(), - this.getFees({ userCurrency, activities: orders }).toNumber() + this.getFees({ activities, userCurrency }).toNumber() ) ], userSettings @@ -1400,17 +1460,15 @@ export class PortfolioService { private async getChart({ dateRange = 'max', impersonationId, - portfolioOrders, + portfolioCalculator, transactionPoints, - userCurrency, userId, withDataDecimation = true }: { dateRange?: DateRange; impersonationId: string; - portfolioOrders: PortfolioOrder[]; + portfolioCalculator: PortfolioCalculator; transactionPoints: TransactionPoint[]; - userCurrency: string; userId: string; withDataDecimation?: boolean; }): Promise { @@ -1424,15 +1482,6 @@ export class PortfolioService { userId = await this.getUserId(impersonationId, userId); - const portfolioCalculator = new PortfolioCalculator({ - currency: userCurrency, - currentRateService: this.currentRateService, - exchangeRateDataService: this.exchangeRateDataService, - orders: portfolioOrders - }); - - portfolioCalculator.setTransactionPoints(transactionPoints); - const endDate = new Date(); const portfolioStart = parseDate(transactionPoints[0].date); @@ -1545,29 +1594,26 @@ export class PortfolioService { private getFees({ activities, - date = new Date(0), userCurrency }: { activities: OrderWithAccount[]; - date?: Date; userCurrency: string; }) { - return activities - .filter((activity) => { - // Filter out all activities before given date (drafts) - return isBefore(date, new Date(activity.date)); - }) - .map(({ fee, SymbolProfile }) => { - return this.exchangeRateDataService.toCurrency( - fee, - SymbolProfile.currency, - userCurrency - ); - }) - .reduce( - (previous, current) => new Big(previous).plus(current), - new Big(0) - ); + return getSum( + activities + .filter(({ isDraft }) => { + return isDraft === false; + }) + .map(({ fee, SymbolProfile }) => { + return new Big( + this.exchangeRateDataService.toCurrency( + fee, + SymbolProfile.currency, + userCurrency + ) + ); + }) + ); } private getInitialCashPosition({ @@ -1585,14 +1631,19 @@ export class PortfolioService { countries: [], dataSource: undefined, dateOfFirstActivity: undefined, + dividend: 0, grossPerformance: 0, grossPerformancePercent: 0, + grossPerformancePercentWithCurrencyEffect: 0, + grossPerformanceWithCurrencyEffect: 0, investment: balance, marketPrice: 0, marketState: 'open', name: currency, netPerformance: 0, netPerformancePercent: 0, + netPerformancePercentWithCurrencyEffect: 0, + netPerformanceWithCurrencyEffect: 0, quantity: 0, sectors: [], symbol: currency, @@ -1673,12 +1724,16 @@ export class PortfolioService { private async getSummary({ balanceInBaseCurrency, emergencyFundPositionsValueInBaseCurrency, + filteredValueInBaseCurrency, + holdings, impersonationId, userCurrency, userId }: { balanceInBaseCurrency: number; emergencyFundPositionsValueInBaseCurrency: number; + filteredValueInBaseCurrency: Big; + holdings: PortfolioDetails['holdings']; impersonationId: string; userCurrency: string; userId: string; @@ -1692,57 +1747,87 @@ export class PortfolioService { }); const { activities } = await this.orderService.getOrders({ - userCurrency, - userId - }); - - let { activities: excludedActivities } = await this.orderService.getOrders({ userCurrency, userId, withExcludedAccounts: true }); - excludedActivities = excludedActivities.filter(({ Account: account }) => { - return account?.isExcluded ?? false; - }); + const excludedActivities: Activity[] = []; + const nonExcludedActivities: Activity[] = []; + + for (const activity of activities) { + if (activity.Account?.isExcluded) { + excludedActivities.push(activity); + } else { + nonExcludedActivities.push(activity); + } + } + + const dividendInBaseCurrency = getSum( + ( + await this.getDividends({ + activities: activities.filter(({ type }) => { + return type === 'DIVIDEND'; + }) + }) + ).map(({ investment }) => { + return new Big(investment); + }) + ); - const dividend = this.getSumOfActivityType({ - activities, - userCurrency, - activityType: 'DIVIDEND' - }).toNumber(); const emergencyFund = new Big( Math.max( emergencyFundPositionsValueInBaseCurrency, (user.Settings?.settings as UserSettings)?.emergencyFund ?? 0 ) ); + const fees = this.getFees({ activities, userCurrency }).toNumber(); const firstOrderDate = activities[0]?.date; + const interest = this.getSumOfActivityType({ activities, userCurrency, activityType: 'INTEREST' }).toNumber(); - const items = this.getSumOfActivityType({ - activities, - userCurrency, - activityType: 'ITEM' - }).toNumber(); - const liabilities = this.getSumOfActivityType({ - activities, - userCurrency, - activityType: 'LIABILITY' - }).toNumber(); + + const items = getSum( + Object.keys(holdings) + .filter((symbol) => { + return ( + isUUID(symbol) && + holdings[symbol].dataSource === 'MANUAL' && + holdings[symbol].valueInBaseCurrency > 0 + ); + }) + .map((symbol) => { + return new Big(holdings[symbol].valueInBaseCurrency).abs(); + }) + ).toNumber(); + + const liabilities = getSum( + Object.keys(holdings) + .filter((symbol) => { + return ( + isUUID(symbol) && + holdings[symbol].dataSource === 'MANUAL' && + holdings[symbol].valueInBaseCurrency < 0 + ); + }) + .map((symbol) => { + return new Big(holdings[symbol].valueInBaseCurrency).abs(); + }) + ).toNumber(); const totalBuy = this.getSumOfActivityType({ - activities, userCurrency, + activities: nonExcludedActivities, activityType: 'BUY' }).toNumber(); + const totalSell = this.getSumOfActivityType({ - activities, userCurrency, + activities: nonExcludedActivities, activityType: 'SELL' }).toNumber(); @@ -1750,7 +1835,9 @@ export class PortfolioService { .minus(emergencyFund) .plus(emergencyFundPositionsValueInBaseCurrency) .toNumber(); + const committedFunds = new Big(totalBuy).minus(totalSell); + const totalOfExcludedActivities = this.getSumOfActivityType({ userCurrency, activities: excludedActivities, @@ -1801,21 +1888,36 @@ export class PortfolioService { }) ?.toNumber(); + const annualizedPerformancePercentWithCurrencyEffect = + new PortfolioCalculator({ + currency: userCurrency, + currentRateService: this.currentRateService, + exchangeRateDataService: this.exchangeRateDataService, + orders: [] + }) + .getAnnualizedPerformancePercent({ + daysInMarket, + netPerformancePercent: new Big( + performanceInformation.performance.currentNetPerformancePercentWithCurrencyEffect + ) + }) + ?.toNumber(); + return { ...performanceInformation.performance, annualizedPerformancePercent, + annualizedPerformancePercentWithCurrencyEffect, cash, - dividend, excludedAccountsAndActivities, fees, firstOrderDate, interest, items, liabilities, - netWorth, totalBuy, totalSell, committedFunds: committedFunds.toNumber(), + dividendInBaseCurrency: dividendInBaseCurrency.toNumber(), emergencyFund: { assets: emergencyFundPositionsValueInBaseCurrency, cash: emergencyFund @@ -1823,61 +1925,61 @@ export class PortfolioService { .toNumber(), total: emergencyFund.toNumber() }, + filteredValueInBaseCurrency: filteredValueInBaseCurrency.toNumber(), + filteredValueInPercentage: netWorth + ? filteredValueInBaseCurrency.div(netWorth).toNumber() + : undefined, fireWealth: new Big(performanceInformation.performance.currentValue) .minus(emergencyFundPositionsValueInBaseCurrency) .toNumber(), ordersCount: activities.filter(({ type }) => { return type === 'BUY' || type === 'SELL'; - }).length + }).length, + totalValueInBaseCurrency: netWorth }; } private getSumOfActivityType({ activities, activityType, - date = new Date(0), userCurrency }: { activities: OrderWithAccount[]; activityType: ActivityType; - date?: Date; userCurrency: string; }) { - return activities - .filter((activity) => { - // Filter out all activities before given date (drafts) and - // activity type - return ( - isBefore(date, new Date(activity.date)) && - activity.type === activityType - ); - }) - .map(({ quantity, SymbolProfile, unitPrice }) => { - return this.exchangeRateDataService.toCurrency( - new Big(quantity).mul(unitPrice).toNumber(), - SymbolProfile.currency, - userCurrency - ); - }) - .reduce( - (previous, current) => new Big(previous).plus(current), - new Big(0) - ); + return getSum( + activities + .filter(({ isDraft, type }) => { + return isDraft === false && type === activityType; + }) + .map(({ quantity, SymbolProfile, unitPrice }) => { + return new Big( + this.exchangeRateDataService.toCurrency( + new Big(quantity).mul(unitPrice).toNumber(), + SymbolProfile.currency, + userCurrency + ) + ); + }) + ); } private async getTransactionPoints({ filters, includeDrafts = false, + types = getAllActivityTypes(), userId, withExcludedAccounts = false }: { filters?: Filter[]; includeDrafts?: boolean; + types?: ActivityType[]; userId: string; withExcludedAccounts?: boolean; }): Promise<{ + activities: Activity[]; transactionPoints: TransactionPoint[]; - orders: Activity[]; portfolioOrders: PortfolioOrder[]; }> { const userCurrency = @@ -1886,14 +1988,14 @@ export class PortfolioService { const { activities, count } = await this.orderService.getOrders({ filters, includeDrafts, + types, userCurrency, userId, - withExcludedAccounts, - types: ['BUY', 'SELL'] + withExcludedAccounts }); if (count <= 0) { - return { transactionPoints: [], orders: [], portfolioOrders: [] }; + return { activities: [], transactionPoints: [], portfolioOrders: [] }; } const portfolioOrders: PortfolioOrder[] = activities.map((order) => ({ @@ -1919,8 +2021,8 @@ export class PortfolioService { portfolioCalculator.computeTransactionPoints(); return { + activities, portfolioOrders, - orders: activities, transactionPoints: portfolioCalculator.getTransactionPoints() }; } @@ -1941,29 +2043,20 @@ export class PortfolioService { } private async getValueOfAccountsAndPlatforms({ + activities, filters = [], - orders, portfolioItemsNow, userCurrency, userId, withExcludedAccounts = false }: { + activities: Activity[]; filters?: Filter[]; - orders: OrderWithAccount[]; portfolioItemsNow: { [p: string]: TimelinePosition }; userCurrency: string; userId: string; withExcludedAccounts?: boolean; }) { - const { activities: ordersOfTypeItemOrLiability } = - await this.orderService.getOrders({ - filters, - userCurrency, - userId, - withExcludedAccounts, - types: ['ITEM', 'LIABILITY'] - }); - const accounts: PortfolioDetails['accounts'] = {}; const platforms: PortfolioDetails['platforms'] = {}; @@ -1981,7 +2074,7 @@ export class PortfolioService { }); } else { const accountIds = uniq( - orders + activities .filter(({ accountId }) => { return accountId; }) @@ -2001,19 +2094,10 @@ export class PortfolioService { }); for (const account of currentAccounts) { - let ordersByAccount = orders.filter(({ accountId }) => { + const ordersByAccount = activities.filter(({ accountId }) => { return accountId === account.id; }); - const ordersOfTypeItemOrLiabilityByAccount = - ordersOfTypeItemOrLiability.filter(({ accountId }) => { - return accountId === account.id; - }); - - ordersByAccount = ordersByAccount.concat( - ordersOfTypeItemOrLiabilityByAccount - ); - accounts[account.id] = { balance: account.balance, currency: account.currency, @@ -2045,41 +2129,39 @@ export class PortfolioService { }; } - for (const order of ordersByAccount) { + for (const { + Account, + quantity, + SymbolProfile, + type + } of ordersByAccount) { let currentValueOfSymbolInBaseCurrency = - order.quantity * - (portfolioItemsNow[order.SymbolProfile.symbol] - ?.marketPriceInBaseCurrency ?? - order.unitPrice ?? + getFactor(type) * + quantity * + (portfolioItemsNow[SymbolProfile.symbol]?.marketPriceInBaseCurrency ?? 0); - if (order.type === 'LIABILITY' || order.type === 'SELL') { - currentValueOfSymbolInBaseCurrency *= -1; - } - - if (accounts[order.Account?.id || UNKNOWN_KEY]?.valueInBaseCurrency) { - accounts[order.Account?.id || UNKNOWN_KEY].valueInBaseCurrency += + if (accounts[Account?.id || UNKNOWN_KEY]?.valueInBaseCurrency) { + accounts[Account?.id || UNKNOWN_KEY].valueInBaseCurrency += currentValueOfSymbolInBaseCurrency; } else { - accounts[order.Account?.id || UNKNOWN_KEY] = { + accounts[Account?.id || UNKNOWN_KEY] = { balance: 0, - currency: order.Account?.currency, + currency: Account?.currency, name: account.name, valueInBaseCurrency: currentValueOfSymbolInBaseCurrency }; } if ( - platforms[order.Account?.Platform?.id || UNKNOWN_KEY] - ?.valueInBaseCurrency + platforms[Account?.Platform?.id || UNKNOWN_KEY]?.valueInBaseCurrency ) { - platforms[ - order.Account?.Platform?.id || UNKNOWN_KEY - ].valueInBaseCurrency += currentValueOfSymbolInBaseCurrency; + platforms[Account?.Platform?.id || UNKNOWN_KEY].valueInBaseCurrency += + currentValueOfSymbolInBaseCurrency; } else { - platforms[order.Account?.Platform?.id || UNKNOWN_KEY] = { + platforms[Account?.Platform?.id || UNKNOWN_KEY] = { balance: 0, - currency: order.Account?.currency, + currency: Account?.currency, name: account.Platform?.name, valueInBaseCurrency: currentValueOfSymbolInBaseCurrency }; diff --git a/apps/api/src/app/portfolio/rules.service.ts b/apps/api/src/app/portfolio/rules.service.ts index 8d46b3708..7dfcee56a 100644 --- a/apps/api/src/app/portfolio/rules.service.ts +++ b/apps/api/src/app/portfolio/rules.service.ts @@ -1,6 +1,7 @@ import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface'; import { Rule } from '@ghostfolio/api/models/rule'; import { UserSettings } from '@ghostfolio/common/interfaces'; + import { Injectable } from '@nestjs/common'; @Injectable() 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 46ed6dc50..4b4168168 100644 --- a/apps/api/src/app/redis-cache/redis-cache.module.ts +++ b/apps/api/src/app/redis-cache/redis-cache.module.ts @@ -1,5 +1,6 @@ import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; + import { CacheModule } from '@nestjs/cache-manager'; import { Module } from '@nestjs/common'; import * as redisStore from 'cache-manager-redis-store'; @@ -14,6 +15,7 @@ import { RedisCacheService } from './redis-cache.service'; inject: [ConfigurationService], useFactory: async (configurationService: ConfigurationService) => { return { + db: configurationService.get('REDIS_DB'), host: configurationService.get('REDIS_HOST'), max: configurationService.get('MAX_ITEM_IN_CACHE'), password: configurationService.get('REDIS_PASSWORD'), diff --git a/apps/api/src/app/redis-cache/redis-cache.service.ts b/apps/api/src/app/redis-cache/redis-cache.service.ts index 1e8243144..3891cc5ab 100644 --- a/apps/api/src/app/redis-cache/redis-cache.service.ts +++ b/apps/api/src/app/redis-cache/redis-cache.service.ts @@ -1,6 +1,7 @@ import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { getAssetProfileIdentifier } from '@ghostfolio/common/helper'; import { UniqueAsset } from '@ghostfolio/common/interfaces'; + import { CACHE_MANAGER } from '@nestjs/cache-manager'; import { Inject, Injectable, Logger } from '@nestjs/common'; @@ -20,7 +21,7 @@ export class RedisCacheService { } public async get(key: string): Promise { - return await this.cache.get(key); + return this.cache.get(key); } public getQuoteKey({ dataSource, symbol }: UniqueAsset) { @@ -28,15 +29,15 @@ export class RedisCacheService { } public async remove(key: string) { - await this.cache.del(key); + return this.cache.del(key); } public async reset() { - await this.cache.reset(); + return this.cache.reset(); } public async set(key: string, value: string, ttlInSeconds?: number) { - await this.cache.set( + return this.cache.set( key, value, ttlInSeconds ?? this.configurationService.get('CACHE_TTL') diff --git a/apps/api/src/app/sitemap/sitemap.controller.ts b/apps/api/src/app/sitemap/sitemap.controller.ts index cd28c06db..7975573d1 100644 --- a/apps/api/src/app/sitemap/sitemap.controller.ts +++ b/apps/api/src/app/sitemap/sitemap.controller.ts @@ -1,14 +1,14 @@ -import * as fs from 'fs'; -import * as path from 'path'; - import { DATE_FORMAT, getYesterday, interpolate } from '@ghostfolio/common/helper'; + import { Controller, Get, Res, VERSION_NEUTRAL, Version } from '@nestjs/common'; import { format } from 'date-fns'; import { Response } from 'express'; +import * as fs from 'fs'; +import * as path from 'path'; @Controller('sitemap.xml') export class SitemapController { diff --git a/apps/api/src/app/sitemap/sitemap.module.ts b/apps/api/src/app/sitemap/sitemap.module.ts index 2fe7358d4..ba60d43f6 100644 --- a/apps/api/src/app/sitemap/sitemap.module.ts +++ b/apps/api/src/app/sitemap/sitemap.module.ts @@ -5,6 +5,7 @@ import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data- import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module'; import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; import { SymbolProfileModule } from '@ghostfolio/api/services/symbol-profile/symbol-profile.module'; + import { Module } from '@nestjs/common'; import { SitemapController } from './sitemap.controller'; diff --git a/apps/api/src/app/subscription/subscription.controller.ts b/apps/api/src/app/subscription/subscription.controller.ts index 89a675b99..f4ca6d427 100644 --- a/apps/api/src/app/subscription/subscription.controller.ts +++ b/apps/api/src/app/subscription/subscription.controller.ts @@ -7,6 +7,7 @@ import { } from '@ghostfolio/common/config'; import { Coupon } from '@ghostfolio/common/interfaces'; import type { RequestWithUser } from '@ghostfolio/common/types'; + import { Body, Controller, @@ -115,7 +116,7 @@ export class SubscriptionController { @Body() { couponId, priceId }: { couponId: string; priceId: string } ) { try { - return await this.subscriptionService.createCheckoutSession({ + return this.subscriptionService.createCheckoutSession({ couponId, priceId, user: this.request.user diff --git a/apps/api/src/app/subscription/subscription.module.ts b/apps/api/src/app/subscription/subscription.module.ts index c2c80c135..bf4bba7b7 100644 --- a/apps/api/src/app/subscription/subscription.module.ts +++ b/apps/api/src/app/subscription/subscription.module.ts @@ -1,6 +1,7 @@ import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; import { PropertyModule } from '@ghostfolio/api/services/property/property.module'; + import { Module } from '@nestjs/common'; import { SubscriptionController } from './subscription.controller'; diff --git a/apps/api/src/app/subscription/subscription.service.ts b/apps/api/src/app/subscription/subscription.service.ts index 2e7c16a39..d53944787 100644 --- a/apps/api/src/app/subscription/subscription.service.ts +++ b/apps/api/src/app/subscription/subscription.service.ts @@ -1,8 +1,10 @@ import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { DEFAULT_LANGUAGE_CODE } from '@ghostfolio/common/config'; -import { UserWithSettings } from '@ghostfolio/common/types'; +import { parseDate } from '@ghostfolio/common/helper'; +import { SubscriptionOffer, UserWithSettings } from '@ghostfolio/common/types'; import { SubscriptionType } from '@ghostfolio/common/types/subscription-type.type'; + import { Injectable, Logger } from '@nestjs/common'; import { Subscription } from '@prisma/client'; import { addMilliseconds, isBefore } from 'date-fns'; @@ -107,17 +109,27 @@ export class SubscriptionService { } } - public getSubscription( - aSubscriptions: Subscription[] - ): UserWithSettings['subscription'] { - if (aSubscriptions.length > 0) { - const { expiresAt, price } = aSubscriptions.reduce((a, b) => { + public getSubscription({ + createdAt, + subscriptions + }: { + createdAt: UserWithSettings['createdAt']; + subscriptions: Subscription[]; + }): UserWithSettings['subscription'] { + if (subscriptions.length > 0) { + const { expiresAt, price } = subscriptions.reduce((a, b) => { return new Date(a.expiresAt) > new Date(b.expiresAt) ? a : b; }); + let offer: SubscriptionOffer = price ? 'renewal' : 'default'; + + if (isBefore(createdAt, parseDate('2023-01-01'))) { + offer = 'renewal-early-bird'; + } + return { expiresAt, - offer: price ? 'renewal' : 'default', + offer, type: isBefore(new Date(), expiresAt) ? SubscriptionType.Premium : SubscriptionType.Basic diff --git a/apps/api/src/app/symbol/interfaces/lookup-item.interface.ts b/apps/api/src/app/symbol/interfaces/lookup-item.interface.ts index 1931d1bfe..89b476397 100644 --- a/apps/api/src/app/symbol/interfaces/lookup-item.interface.ts +++ b/apps/api/src/app/symbol/interfaces/lookup-item.interface.ts @@ -1,4 +1,5 @@ import { DataProviderInfo } from '@ghostfolio/common/interfaces'; + import { AssetClass, AssetSubClass, DataSource } from '@prisma/client'; export interface LookupItem { diff --git a/apps/api/src/app/symbol/symbol.controller.ts b/apps/api/src/app/symbol/symbol.controller.ts index 2aa2f61df..17e0056d6 100644 --- a/apps/api/src/app/symbol/symbol.controller.ts +++ b/apps/api/src/app/symbol/symbol.controller.ts @@ -3,6 +3,7 @@ import { TransformDataSourceInRequestInterceptor } from '@ghostfolio/api/interce import { TransformDataSourceInResponseInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-response.interceptor'; import { IDataProviderHistoricalResponse } from '@ghostfolio/api/services/interfaces/interfaces'; import type { RequestWithUser } from '@ghostfolio/common/types'; + import { Controller, Get, @@ -38,9 +39,11 @@ export class SymbolController { @UseGuards(AuthGuard('jwt'), HasPermissionGuard) @UseInterceptors(TransformDataSourceInResponseInterceptor) public async lookupSymbol( - @Query('includeIndices') includeIndices: boolean = false, + @Query('includeIndices') includeIndicesParam = 'false', @Query('query') query = '' ): Promise<{ items: LookupItem[] }> { + const includeIndices = includeIndicesParam === 'true'; + try { return this.symbolService.lookup({ includeIndices, diff --git a/apps/api/src/app/symbol/symbol.module.ts b/apps/api/src/app/symbol/symbol.module.ts index 4d9f2d5eb..3b5379a62 100644 --- a/apps/api/src/app/symbol/symbol.module.ts +++ b/apps/api/src/app/symbol/symbol.module.ts @@ -2,6 +2,7 @@ import { ConfigurationModule } from '@ghostfolio/api/services/configuration/conf import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module'; import { MarketDataModule } from '@ghostfolio/api/services/market-data/market-data.module'; import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; + import { Module } from '@nestjs/common'; import { SymbolController } from './symbol.controller'; diff --git a/apps/api/src/app/symbol/symbol.service.ts b/apps/api/src/app/symbol/symbol.service.ts index 32285f422..9a3f7a3a0 100644 --- a/apps/api/src/app/symbol/symbol.service.ts +++ b/apps/api/src/app/symbol/symbol.service.ts @@ -7,6 +7,7 @@ import { MarketDataService } from '@ghostfolio/api/services/market-data/market-d import { DATE_FORMAT } from '@ghostfolio/common/helper'; import { HistoricalDataItem } from '@ghostfolio/common/interfaces'; import { UserWithSettings } from '@ghostfolio/common/types'; + import { Injectable, Logger } from '@nestjs/common'; import { format, subDays } from 'date-fns'; diff --git a/apps/api/src/app/tag/tag.controller.ts b/apps/api/src/app/tag/tag.controller.ts index 36fb3be20..4c37b9dfe 100644 --- a/apps/api/src/app/tag/tag.controller.ts +++ b/apps/api/src/app/tag/tag.controller.ts @@ -1,6 +1,7 @@ import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator'; import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; import { permissions } from '@ghostfolio/common/permissions'; + import { Body, Controller, diff --git a/apps/api/src/app/tag/tag.module.ts b/apps/api/src/app/tag/tag.module.ts index 810105c51..48587c54e 100644 --- a/apps/api/src/app/tag/tag.module.ts +++ b/apps/api/src/app/tag/tag.module.ts @@ -1,4 +1,5 @@ import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; + import { Module } from '@nestjs/common'; import { TagController } from './tag.controller'; diff --git a/apps/api/src/app/tag/tag.service.ts b/apps/api/src/app/tag/tag.service.ts index 9da7cc475..b077cbe1c 100644 --- a/apps/api/src/app/tag/tag.service.ts +++ b/apps/api/src/app/tag/tag.service.ts @@ -1,4 +1,5 @@ import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; + import { Injectable } from '@nestjs/common'; import { Prisma, Tag } from '@prisma/client'; 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 1700180dd..7b09ced10 100644 --- a/apps/api/src/app/user/update-user-setting.dto.ts +++ b/apps/api/src/app/user/update-user-setting.dto.ts @@ -3,9 +3,11 @@ import type { DateRange, ViewMode } from '@ghostfolio/common/types'; + import { IsArray, IsBoolean, + IsISO4217CurrencyCode, IsISO8601, IsIn, IsNumber, @@ -18,8 +20,8 @@ export class UpdateUserSettingDto { @IsOptional() annualInterestRate?: number; + @IsISO4217CurrencyCode() @IsOptional() - @IsString() baseCurrency?: string; @IsString() diff --git a/apps/api/src/app/user/user.controller.ts b/apps/api/src/app/user/user.controller.ts index 97d5aa195..14c545192 100644 --- a/apps/api/src/app/user/user.controller.ts +++ b/apps/api/src/app/user/user.controller.ts @@ -2,8 +2,13 @@ import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorat import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; import { PropertyService } from '@ghostfolio/api/services/property/property.service'; import { User, UserSettings } from '@ghostfolio/common/interfaces'; -import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { + hasPermission, + hasRole, + permissions +} from '@ghostfolio/common/permissions'; import type { RequestWithUser } from '@ghostfolio/common/types'; + import { Body, Controller, @@ -58,6 +63,13 @@ export class UserController { public async getUser( @Headers('accept-language') acceptLanguage: string ): Promise { + if (hasRole(this.request.user, 'INACTIVE')) { + throw new HttpException( + getReasonPhrase(StatusCodes.TOO_MANY_REQUESTS), + StatusCodes.TOO_MANY_REQUESTS + ); + } + return this.userService.getUser( this.request.user, acceptLanguage?.split(',')?.[0] @@ -123,7 +135,7 @@ export class UserController { } } - return await this.userService.updateUserSetting({ + return this.userService.updateUserSetting({ userSettings, userId: this.request.user.id }); diff --git a/apps/api/src/app/user/user.module.ts b/apps/api/src/app/user/user.module.ts index 3df366bc1..35f78dc5f 100644 --- a/apps/api/src/app/user/user.module.ts +++ b/apps/api/src/app/user/user.module.ts @@ -3,6 +3,7 @@ import { ConfigurationModule } from '@ghostfolio/api/services/configuration/conf import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; import { PropertyModule } from '@ghostfolio/api/services/property/property.module'; import { TagModule } from '@ghostfolio/api/services/tag/tag.module'; + import { Module } from '@nestjs/common'; import { JwtModule } from '@nestjs/jwt'; diff --git a/apps/api/src/app/user/user.service.ts b/apps/api/src/app/user/user.service.ts index 734495474..e20dea4af 100644 --- a/apps/api/src/app/user/user.service.ts +++ b/apps/api/src/app/user/user.service.ts @@ -1,11 +1,13 @@ import { SubscriptionService } from '@ghostfolio/api/app/subscription/subscription.service'; import { environment } from '@ghostfolio/api/environments/environment'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; +import { I18nService } from '@ghostfolio/api/services/i18n/i18n.service'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { PropertyService } from '@ghostfolio/api/services/property/property.service'; import { TagService } from '@ghostfolio/api/services/tag/tag.service'; import { DEFAULT_CURRENCY, + DEFAULT_LANGUAGE_CODE, PROPERTY_IS_READ_ONLY_MODE, PROPERTY_SYSTEM_MESSAGE, locale @@ -21,6 +23,7 @@ import { permissions } from '@ghostfolio/common/permissions'; import { UserWithSettings } from '@ghostfolio/common/types'; + import { Injectable } from '@nestjs/common'; import { Prisma, Role, User } from '@prisma/client'; import { differenceInDays } from 'date-fns'; @@ -30,6 +33,8 @@ const crypto = require('crypto'); @Injectable() export class UserService { + private i18nService = new I18nService(); + public constructor( private readonly configurationService: ConfigurationService, private readonly prismaService: PrismaService, @@ -211,8 +216,10 @@ export class UserService { } if (this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) { - user.subscription = - this.subscriptionService.getSubscription(Subscription); + user.subscription = this.subscriptionService.getSubscription({ + createdAt: user.createdAt, + subscriptions: Subscription + }); if (user.subscription?.type === 'Basic') { const daysSinceRegistration = differenceInDays( @@ -322,8 +329,10 @@ export class UserService { Account: { create: { currency: DEFAULT_CURRENCY, - isDefault: true, - name: 'Default Account' + name: this.i18nService.getTranslation({ + id: 'myAccount', + languageCode: DEFAULT_LANGUAGE_CODE // TODO + }) } }, Settings: { @@ -435,7 +444,7 @@ export class UserService { settings }, where: { - userId: userId + userId } }); diff --git a/apps/api/src/assets/cryptocurrencies/cryptocurrencies.json b/apps/api/src/assets/cryptocurrencies/cryptocurrencies.json index c3e595fc6..4026bd896 100644 --- a/apps/api/src/assets/cryptocurrencies/cryptocurrencies.json +++ b/apps/api/src/assets/cryptocurrencies/cryptocurrencies.json @@ -17,8 +17,11 @@ "$TREAM": "World Stream Finance", "00": "ZER0ZER0", "007": "007 coin", + "0KN": "0 Knowledge Network", "0X1": "0x1.tools: AI Multi-tool Plaform", "0XBTC": "0xBitcoin", + "0XDEV": "DEVAI", + "0XOS": "0xOS AI", "0x0": "0x0.ai", "0xDIARY": "The 0xDiary Token", "1-UP": "1-UP", @@ -43,24 +46,33 @@ "2BACCO": "2BACCO Coin", "2BASED": "2Based Finance", "2CRZ": "2crazyNFT", + "2DAI": "2DAI.io", "2GCC": "2G Carbon Coin", "2GIVE": "2GiveCoin", "2GT": "2GETHER", "2KEY": "2key.network", "2LC": "2local", + "2OMB": "2omb Finance", + "2SHARES": "2SHARE", "2TF": "2TF", "300F": "300FIT", "32BIT": "32Bitcoin", "37C": "37Protocol", + "3AIR": "3air", "3D3D": "3d3d", "3DES": "3DES", "3FT": "ThreeFold Token", + "3P": "Web3Camp", "3ULL": "3ULL Coin", "3XD": "3DChain", + "404A": "404Aliens", + "404BLOCKS": "404Blocks", "420CHAN": "420chan", "4ART": "4ART Coin", "4CHAN": "4Chan", "4JNET": "4JNET", + "50X": "50x.com", + "5IRE": "5ire", "77G": "GraphenTech", "7E": "7ELEVEN", "88MPH": "88mph", @@ -70,6 +82,8 @@ "8X8": "8X8 Protocol", "9GAG": "9GAG", "A": "Alpha Token", + "A4M": "AlienForm", + "A51": "A51 Finance", "A5T": "Alpha5", "AA": "Alva", "AAA": "Moon Rabbit", @@ -97,6 +111,7 @@ "AC": "Asia Coin", "AC3": "AC3", "ACA": "Acala", + "ACALAUSD": "Acala Dollar (Acala)", "ACAT": "Alphacat", "ACATO": "ACA Token", "ACCEL": "Accel Defi", @@ -117,8 +132,10 @@ "ACOIN": "ACoin", "ACP": "Anarchists Prime", "ACQ": "Acquire.Fi", + "ACRIA": "Acria.AI", "ACS": "Access Protocol", "ACT": "Achain", + "ACTA": "Acta Finance", "ACTIN": "Actinium", "ACTN": "Action Coin", "ACU": "ACU Platform", @@ -136,6 +153,7 @@ "ADB": "Adbank", "ADC": "AudioCoin", "ADD": "ADD.xyz", + "ADDAMS": "ADDAMS AI", "ADEL": "Akropolis Delphi", "ADF": "Art de Finance", "ADH": "Adhive", @@ -145,6 +163,7 @@ "ADM": "ADAMANT Messenger", "ADN": "Aladdin", "ADNT": "Aiden", + "ADO": "ADO Protocol", "ADP": "Adappter Token", "ADRX": "Adrenaline Chain", "ADS": "Adshares", @@ -155,7 +174,9 @@ "ADZ": "Adzcoin", "AE": "Aeternity", "AEC": "AcesCoin", + "AEGGS": "aEGGS", "AEGIS": "Aegis", + "AELIN": "Aelin", "AEN": "Aenco", "AENS": "AEN Smart", "AENT": "AEN", @@ -176,23 +197,30 @@ "AFCT": "Allforcrypto", "AFEN": "AFEN Blockchain", "AFFC": "Affil Coin", + "AFG": "Army of Fortune Gem", "AFIN": "Asian Fintech", "AFIT": "Actifit", "AFK": "AFKDAO", "AFO": "AllForOneBusiness", + "AFP": "Animal Farm Pigs", "AFTT": "Africa Trading Chain", "AFX": "Afrix", + "AFYON": "Afyonspor Fan Token", "AG8": "ATROMG8", "AGA": "AGA Token", "AGATA": "Agatech", + "AGB": "Apes Go Bananas", "AGET": "Agetron", "AGEUR": "agEUR", "AGF": "Augmented Finance", "AGI": "Delysium", + "AGIV1": "SingularityNET v1", "AGIX": "SingularityNET", "AGLA": "Angola", "AGLD": "Adventure Gold", "AGM": "Argoneum", + "AGN": "Agnus Ai", + "AGOV": "Answer Governance", "AGPC": "AGPC", "AGRO": "Bit Agro", "AGRS": "Agoras Token", @@ -204,11 +232,14 @@ "AHOO": "Ahoolee", "AHT": "AhaToken", "AI": "Sleepless", + "AIAKITA": "AiAkita", "AIB": "AdvancedInternetBlock", + "AIBABYDOGE": "AIBabyDoge", "AIBB": "AiBB", "AIBK": "AIB Utility Token", "AIC": "AI Crypto", "AICO": "AICON", + "AICODE": "AI CODE", "AID": "AidCoin", "AIDI": "Aidi Inu", "AIDOC": "AI Doctor", @@ -216,30 +247,43 @@ "AIDOGE": "ArbDoge AI", "AIDT": "AIDUS TOKEN", "AIDUS": "AIDUS Token", + "AIE": "A.I.Earn", + "AIEN": "AIENGLISH", + "AIFLOKI": "AI Floki", + "AIG": "A.I Genesis", "AILINK": "AiLink Token", "AIM": "ModiHost", + "AIMBOT": "AimBot AI", "AIMS": "HighCastle Token", "AIMX": "Aimedis", "AIN": "AI Network", + "AINN": "AINN", + "AINU": "Ainu Token", "AION": "Aion", "AIONE": "AiONE", "AIOT": "AIOT Token", "AIOZ": "AIOZ Network", "AIPE": "AI Prediction Ecosystem", + "AIPEPE": "AI PEPE KING", "AIPIN": "AI PIN", "AIR": "Altair", "AIRE": "Tokenaire", "AIRT": "Aircraft", "AIRTOKEN": "AirToken", "AIRX": "Aircoins", + "AISHIB": "ARBSHIB", "AIT": "AIChain Token", "AITECH": "Artificial Intelligence Utility Token", + "AITEK": "AI Technology", "AITHEON": "Aitheon", "AITRA": "Aitra", "AITT": "AITrading", + "AIUS": "Arbius", + "AIWALLET": "AiWallet Token", "AIX": "Aigang", "AKA": "Akroma", "AKITA": "Akita Inu", + "AKITAX": "Akitavax", "AKN": "Akoin", "AKNC": "Aave KNC v1", "AKRO": "Akropolis", @@ -268,6 +312,7 @@ "ALIC": "AliCoin", "ALICE": "My Neighbor Alice", "ALIEN": "AlienCoin", + "ALIF": " ALIF COIN", "ALINK": "Aave LINK v1", "ALIS": "ALISmedia", "ALIT": "Alitas", @@ -277,8 +322,10 @@ "ALLBI": "ALL BEST ICO", "ALLEY": "NFT Alley", "ALLIN": "All in", + "ALM": "Alium Finance", "ALN": "Aluna", "ALOHA": "Aloha", + "ALOT": "Dexalot", "ALP": "Alphacon", "ALPA": "Alpaca", "ALPACA": "Alpaca Finance", @@ -293,6 +340,7 @@ "ALTB": "Altbase", "ALTCOIN": "ALTcoin", "ALTCOM": "AltCommunity Coin", + "ALTD": "Altitude", "ALTOCAR": "AltoCar", "ALU": "Altura", "ALUSD": "Alchemix USD", @@ -303,7 +351,9 @@ "AM": "AeroMe", "AMA": "MrWeb", "AMAL": "AMAL", + "AMAPT": "Amnis Finance", "AMATEN": "Amaten", + "AMAZINGTEAM": "AmazingTeamDAO", "AMB": "AirDAO", "AMBER": "AmberCoin", "AMBT": "AMBT Token", @@ -326,6 +376,8 @@ "AMPLIFI": "AmpliFi", "AMS": "Amsterdam Coin", "AMT": "Acumen", + "AMU": "Amulet", + "AMV": "Avatar Musk Verse", "AMX": "Amero", "AMY": "Amygws", "AMZE": "The Amaze World", @@ -343,14 +395,18 @@ "ANGEL": "Crypto Angel", "ANGL": "Angel Token", "ANGLE": "ANGLE", + "ANGO": "Aureus Nummus Gold", "ANI": "Animecoin", + "ANIM": "Animalia", "ANJ": "Aragon Court", "ANJI": "Anji", "ANK": "AlphaLink", "ANKA.BITCI": "Ankaragücü Fan Token", "ANKORUS": "Ankorus Token", "ANKR": "Ankr Network", + "ANKRBNB": "Ankr Staked BNB", "ANKRETH": "Ankr Staked ETH", + "ANKRMATIC": "Ankr Staked MATIC", "ANML": "Animal Concerts", "ANN": "Annex Finance", "ANON": "ANON", @@ -365,6 +421,7 @@ "ANTI": "Anti Bitcoin", "ANTIS": "Antis Inu", "ANTS": "ANTS Reloaded", + "ANUS": "URANUS", "ANV": "Aniverse", "ANW": "Anchor Neural World", "ANY": "Anyswap", @@ -379,6 +436,7 @@ "APED": "Baddest Alpha Ape Bundle", "APEX": "ApeX Protocol", "APEXCOIN": "ApexCoin", + "APFC": "APF coin", "APH": "Aphelion", "API": "Application Programming Interface", "API3": "API3", @@ -419,6 +477,7 @@ "ARB": "Arbitrum", "ARBI": "Arbi", "ARBIT": "Arbit Coin", + "ARBS": "Arbswap", "ARBT": "ARBITRAGE", "ARC": "ArcticCoin", "ARCA": "Arca", @@ -444,6 +503,7 @@ "ARGON": "Argon", "ARGUS": "ArgusCoin", "ARI": "AriCoin", + "ARI10": "Ari10", "ARIA": "Legends of Aria", "ARIA20": "Arianee", "ARIX": "Arix", @@ -467,6 +527,7 @@ "ARQ": "ArQmA", "ARR": "ARROUND", "ARRR": "Pirate Chain", + "ARSL": "Aquarius Loan", "ART": "Maecenas", "ARTC": "Artcoin", "ARTDECO": "ARTDECO", @@ -483,6 +544,8 @@ "ARTL": "ARTL", "ARTM": "ARTM", "ARTP": "ArtPro", + "ARTR": "Artery Network", + "ARTT": "ARTT Network", "ARTY": "Artyfact", "ARV": "Ariva", "ARW": "Arowana Token", @@ -492,7 +555,9 @@ "ASA": "ASA Coin", "ASAFE2": "Allsafe", "ASAP": "Asap Sniper Bot", + "ASC": "Ascend", "ASD": "AscendEX Token", + "ASEED": "aUSD SEED (Acala)", "ASG": "Asgard", "ASGC": "ASG", "ASH": "ASH", @@ -502,7 +567,9 @@ "ASKO": "Asko", "ASM": "Assemble Protocol", "ASN": "Ascension Coin", + "ASNT": "Assent Protocol", "ASP": "Aspire", + "ASPC": "Astropup Coin", "ASPO": "ASPO Shards", "ASQT": "ASQ Protocol", "ASR": "AS Roma Fan Token", @@ -515,6 +582,7 @@ "ASTO": "Altered State Token", "ASTON": "Aston", "ASTR": "Astar", + "ASTRADAO": "Astra DAO", "ASTRAFER": "Astrafer", "ASTRAL": "Astral", "ASTRO": "AstroSwap", @@ -538,12 +606,14 @@ "ATKN": "A-Token", "ATL": "ATLANT", "ATLAS": "Star Atlas", + "ATLX": "Atlantis Loans Polygon", "ATM": "Atletico de Madrid Fan Token", "ATMC": "Autumncoin", "ATMCHAIN": "ATMChain", "ATMI": "Atonomi", "ATMOS": "Novusphere", "ATN": "ATN", + "ATNT": "Artizen", "ATOLO": "RIZON", "ATOM": "Cosmos", "ATON": "Further Network", @@ -552,6 +622,7 @@ "ATP": "Atlas Protocol", "ATR": "Ather", "ATRI": "Atari Token", + "ATRNO": "AETERNUS", "ATS": "Atlas DEX", "ATT": "Attila", "ATTR": "Attrace", @@ -562,6 +633,7 @@ "AUCO": "Advanced United Continent", "AUCTION": "Bounce", "AUDC": "Aussie Digital", + "AUDF": "Forte AUD", "AUDIO": "Audius", "AUDX": "eToro Australian Dollar", "AUK": "Aukcecoin", @@ -569,6 +641,7 @@ "AUNIT": "Aunit", "AUPC": "Authpaper", "AUR": "AUREO", + "AURA": "Aura Finance", "AURO": "Aurora", "AURORA": "Aurora", "AURORAC": "Auroracoin", @@ -589,18 +662,25 @@ "AVAL": "Avaluse", "AVALON": "Avalon", "AVAT": "AVATA Network", + "AVATAR": "Avatar", "AVATLY": "Avatly", + "AVAV": "AVAV", "AVAX": "Avalanche", "AVAXIOU": "Avalanche IOU", "AVDO": "AvocadoCoin", "AVE": "Avesta", "AVG": "Avocado DAO", "AVH": "Animation Vision Cash", + "AVI": "Aviator", "AVINOC": "AVINOC", + "AVIVE": "Avive World", "AVL": "Aston Villa Fan Token", "AVN": "AVNRich", "AVO": "Avoteo", + "AVR": "Avrora Metaverse", + "AVS": "Aves", "AVT": "Aventus", + "AVTM": "Aventis Metaverse", "AVXL": "Avaxlauncher", "AWAX": "AWAX", "AWC": "Atomic Wallet Coin", @@ -627,6 +707,7 @@ "AXPR": "aXpire", "AXR": "AXRON", "AXS": "Axie Infinity Shards", + "AXSV1": "Axie Infinity Shards v1", "AXT": "AIX", "AXYS": "Axys", "AYA": "Aryacoin", @@ -649,35 +730,53 @@ "B3": "B3 Coin", "B91": "B91", "BAAS": "BaaSid", + "BABI": "Babylons", "BABL": "Babylon Finance", "BABY": "BabySwap", + "BABYBINANCE": "BABYBINANCE", + "BABYBNB": "BabyBNB", "BABYBOB": "Baby Bob", "BABYBONK": "Baby Bonk", + "BABYCATS": "Baby Cat Coin", + "BABYCEO": "Baby Doge CEO", + "BABYCRAZYT": "BABY CRAZY TIGER", "BABYCUBAN": "Baby Cuban", "BABYDOGE": "BabyDoge", + "BABYDRAGON": "Baby Dragon", "BABYELON": "BabyElon", "BABYFB": "Baby Floki Billionaire", "BABYFLOKI": "BabyFloki", "BABYGROK": "Baby Grok", "BABYHKTIGER": "BabyHkTiger", + "BABYHONK": "Baby Honk", + "BABYJESUS": "BabyJesusCoin", + "BABYLONG": "Baby Long", "BABYMEME": "Baby Memecoin", + "BABYMYRO": "Babymyro", "BABYPEPE": "Babypepe (BSC)", "BABYSAITAMA": "Baby Saitama", + "BABYSHARK": "Baby Shark", + "BABYSHIB": "Baby Shiba Inu", + "BABYSWEEP": "BabySweep", "BABYTK": "Baby Tiger King", + "BABYTRUMP": "BABYTRUMP", "BAC": "Basis Cash", "BACK": "DollarBack", "BACOIN": "BACoin", "BACON": "BaconDAO (BACON)", "BAD": "Bad Idea AI", "BADGER": "Badger DAO", + "BAFC": "BabyApeFunClub", "BAG": "BondAppetit", "BAGS": "Basis Gold Share", + "BAI": "BearAI", "BAK": "BaconCoin", "BAKAC": "Baka Casino", "BAKE": "BakeryToken", "BAKED": "Baked", "BAKT": "Backed Protocol", "BAL": "Balancer", + "BALA": "Shambala", "BALPHA": "bAlpha", "BAMA": "BabyAMA", "BAMBOO": "BambooDeFi", @@ -691,6 +790,7 @@ "BANK": "Float Protocol", "BANKETH": "BankEth", "BANNER": "BannerCoin", + "BANUS": "Banus.Finance", "BAO": "Bao Finance", "BAOE": "Business Age of Empires", "BAR": "FC Barcelona Fan Token", @@ -714,13 +814,15 @@ "BAX": "BABB", "BAXS": "BoxAxis", "BAY": "BitBay", + "BAZED": "Bazed Games", "BB": "Baby Bali", "BB1": "Bitbond", "BBADGER": "Badger Sett Badger", "BBANK": "BlockBank", "BBB": "BitBullBot", - "BBC": "BigBang Core", + "BBC": "Bull BTC Club", "BBCC": "BaseballCardCoin", + "BBCG": "BBC Gold Coin", "BBCT": "TraDove B2BCoin", "BBDC": "Block Beats Network", "BBDT": "BBD Token", @@ -730,6 +832,7 @@ "BBGC": "BigBang Game", "BBI": "BelugaPay", "BBK": "BitBlocks", + "BBL": "beoble", "BBN": "BBNCOIN", "BBO": "Bigbom", "BBOS": "Blackbox Foundation", @@ -750,6 +853,7 @@ "BCDT": "EvidenZ", "BCEO": "bitCEO", "BCF": "BitcoinFast", + "BCG": "BlockChainGames", "BCH": "Bitcoin Cash", "BCHA": "Bitcoin Cash ABC", "BCHC": "BitCherry", @@ -789,33 +893,44 @@ "BDR": "BlueDragon", "BDX": "Beldex", "BDY": "Buddy DAO", + "BEA": "Beagle Inu", "BEACH": "BeachCoin", "BEAI": "BeNFT Solutions", "BEAM": "Beam", "BEAMMW": "Beam", "BEAN": "AzukiDAO", + "BEANS": "Moonbeans", "BEAST": "CryptoBeast", "BEAT": "BEAT Token", + "BEATLES": "JohnLennonC0IN", + "BEBE": "BEBE", "BEC": "Betherchip", "BECH": "Beauty Chain", + "BECO": "BecoSwap Token", "BED": "Bankless BED Index", "BEE": "Herbee", + "BEEP": "BEEP", "BEER": "BEER Coin", + "BEET": "BEETroot", "BEETLE": "Beetle Coin", "BEETOKEN": "Bee Token", "BEETS": "Beethoven X", + "BEFTM": "Beefy Escrowed Fantom", "BEFX": "Belifex", + "BEFY": "Befy Protocol", "BEG": "BEG", "BEL": "Bella Protocol", "BELA": "Bela", "BELR": "Belrium", "BELT": "Belt", "BEM": "BEMIL Coin", + "BEMD": "Betterment Digital", "BEN": "Ben", "BEND": "BendDao", "BENJACOIN": "Benjacoin", "BENJI": "BenjiRolls", "BENT": "Bent Finance", + "BENV1": "Ben v1", "BENX": "BlueBenx", "BENZI": "Ben Zi Token", "BEP": "Blucon", @@ -823,6 +938,7 @@ "BEPRO": "BEPRO Network", "BERN": "BERNcash", "BERRY": "Berry", + "BES": "battle esports coin", "BEST": "Bitpanda Ecosystem Token", "BESTC": "BestChain", "BETA": "Beta Finance", @@ -836,7 +952,7 @@ "BETT": "Bettium", "BETU": "Betu", "BEX": "BEX token", - "BEY": "Beyond Finance", + "BEY": "NBX", "BEYOND": "Beyond Protocol", "BEZ": "Bezop", "BEZOGE": "Bezoge Earth", @@ -848,10 +964,12 @@ "BFHT": "BeFaster Holder Token", "BFI": "BitDefi", "BFIC": "Bficoin", + "BFK WARZONE": "BFK Warzone", "BFLOKI": "BurnFloki", "BFLY": "Butterfly Protocol", "BFT": "BF Token", "BFT.BITCI": "Brazil Fan Token", + "BFTC": "BITS FACTOR", "BFX": "BitFinex Tokens", "BGB": "Bitget token", "BGBP": "Binance GBP Stable Coin", @@ -859,28 +977,35 @@ "BGG": "BGG Token", "BGLD": "Based Gold", "BGONE": "BigONE Token", + "BGPT": "BlockGPT", "BGS": "Battle of Guardians Share", "BHAO": "Bithao", + "BHAT": "BH Network", "BHAX": "Bithashex", "BHC": "BillionHappiness", "BHEROES": "BombHeroes coin", + "BHIG": "BuckHathCoin", "BHIRE": "BitHIRE", "BHIVE": "Hive", "BHO": "Bholdus Token", "BHP": "Blockchain of Hash Power", "BHPC": "BHPCash", + "BIAO": "Biaocoin", + "BIBI": "BIBI", "BIBL": "Biblecoin", "BIC": "Bikercoins", "BICO": "Biconomy", "BID": "TopBidder", "BIDAO": "Bidao", "BIDCOM": "Bidcommerce", + "BIDEN": "Dark Brandon", "BIDI": "Bidipass", "BIDP": "BID Protocol", "BIDR": "Binance IDR Stable Coin", "BIFI": "Beefy.Finance", "BIFIF": "BiFi", "BIG": "Big Eyes", + "BIGBANGCORE": "BigBang Core", "BIGHAN": "BighanCoin", "BIGSB": "BigShortBets", "BIGTIME": "Big Time", @@ -905,6 +1030,7 @@ "BIP": "Minter", "BIPC": "BipCoin", "BIPX": "Bispex", + "BIRB": "Birb", "BIRD": "Bird.Money", "BIRDCHAIN": "Birdchain", "BIS": "Bismuth", @@ -934,6 +1060,7 @@ "BITM": "BitMoney", "BITN": "Bitnet", "BITNEW": "BitNewChain", + "BITO": "BitoPro Exchange Token", "BITOK": "BitOKX", "BITREWARDS": "BitRewards", "BITROLIUM": "Bitrolium", @@ -979,6 +1106,7 @@ "BLD": "Agoric", "BLES": "Blind Boxes", "BLHC": "BlackholeCoin", + "BLID": "Bolide", "BLIN": "Blin Metaverse", "BLINK": "BlockMason Link", "BLINU": "Baby Lambo Inu", @@ -998,9 +1126,11 @@ "BLOCKS": "BLOCKS", "BLOCKSTAMP": "BlockStamp", "BLOCM": "BLOC.MONEY", + "BLOCX": "BLOCX.", "BLOK": "Bloktopia", "BLOODY": "Bloody Token", "BLOOMT": "Bloom Token", + "BLOVELY": "Baby Lovely Inu", "BLOX": "BLOX", "BLP": "BullPerks", "BLRY": "BillaryCoin", @@ -1013,6 +1143,7 @@ "BLU": "BlueCoin", "BLUE": "Ethereum Blue", "BLUEM": "BlueMove", + "BLUES": "Blueshift", "BLUESPARROW": "BlueSparrow Token", "BLUESPARROWOLD": "BlueSparrowToken", "BLUI": "Blui", @@ -1027,11 +1158,14 @@ "BLY": "Blocery", "BLZ": "Bluzelle", "BLZD": "Blizzard.money", + "BLZE": "BLAZE TOKEN", "BM": "BitMoon", "BMARS": "Binamars", + "BMBO": "Bamboo Coin", "BMC": "Blackmoon Crypto", "BME": "BitcoMine", "BMEX": "BitMEX", + "BMF": "MetaFame", "BMG": "Borneo", "BMH": "BlockMesh", "BMI": "Bridge Mutual", @@ -1040,6 +1174,7 @@ "BMON": "Binamon", "BMP": "Brother Music Platform", "BMT": "BMChain", + "BMW": "BMW", "BMX": "BitMart Token", "BMXT": "Bitmxittz", "BMXX": "Multiplier", @@ -1047,7 +1182,11 @@ "BNANA": "Chimpion", "BNB": "Binance Coin", "BNBCH": "BNB Cash", + "BNBDOG": "BNB DOG INU", "BNBH": "BnbHeroes Token", + "BNBLION": "BNB LION", + "BNBP": "BNBPot", + "BNBX": "Stader BNBx", "BNC": "Bifrost Native Coin", "BND": "Bened", "BNF": "BonFi", @@ -1069,12 +1208,15 @@ "BNU": "ByteNext", "BNX": "BinaryX", "BOA": "BOSAGORA", + "BOARD": "SurfBoard Finance", "BOAT": "Doubloon", "BOBA": "Boba Network", "BOBAI": "Bob AI", "BOBC": "Bobcoin", + "BOBO": "BOBO", "BOBS": "Bob's Repair", "BOBT": "BOB Token", + "BOC": "BOCOIN", "BODHI": "Bodhi Network", "BODYP": "Body Profile", "BOE": "Bodhi", @@ -1083,6 +1225,7 @@ "BOGEY": "Bogey", "BOJI": "BOJI Token", "BOK": "Blockium", + "BOKU": "Boryoku Dragonz", "BOLD": "Bold", "BOLI": "BolivarCoin", "BOLT": "Bolt", @@ -1114,6 +1257,7 @@ "BORED": "Bored Museum", "BORG": "SwissBorg", "BORING": "BoringDAO", + "BORK": "Bork", "BORUTO": "Boruto Inu", "BOS": "BOScoin", "BOSE": "Bitbose", @@ -1133,13 +1277,17 @@ "BOUTS": "BoutsPro", "BOW": "Archer Swap", "BOX": "ContentBox", + "BOXETH": "Cat-in-a-Box Ether", "BOXT": "BOX Token", "BOXX": "Blockparty", "BOXY": "BoxyCoin", + "BOZO": "BOZO", "BP": "BunnyPark", "BPAD": "BlokPad", "BPAY": "BNBPay", "BPD": "Beautiful Princess Disorder", + "BPEPEF": "Baby Pepe Floki", + "BPET": "BPET", "BPL": "BlockPool", "BPLC": "BlackPearl Token", "BPN": "beepnow", @@ -1154,12 +1302,17 @@ "BQQQ": "Bitsdaq Token", "BQT": "Blockchain Quotations Index Token", "BQTX": "BQT", + "BR": "BOHR", + "BR34P": "BR34P", + "BRACE": "Bitci Racing Token", "BRAIN": "BrainCoin", + "BRANA": "Branaverse", "BRAND": "BrandProtect", "BRAT": "BROTHER", "BRAZ": "Brazio", "BRC": "Baer Chain", "BRCP": "BRCP Token", + "BRCT": "BRC App", "BRD": "Bread token", "BRDD": "BeardDollars", "BRDG": "Bridge Protocol", @@ -1167,6 +1320,7 @@ "BREED": "BreederDAO", "BREPE": "BREPE", "BREW": "CafeSwap Token", + "BREWLABS": "Brewlabs", "BRG": "Bridge Oracle", "BRGX": "Bridge$", "BRI": "Baroin", @@ -1180,6 +1334,7 @@ "BRISE": "Bitgert", "BRIT": "BritCoin", "BRITTO": "Britto", + "BRIUM": "Bearium", "BRIX": "OpenBrix", "BRK": "BreakoutCoin", "BRKL": "Brokoli Token", @@ -1190,9 +1345,11 @@ "BRO": "Bitradio", "BROCK": "Bitrock", "BRONZ": "BitBronze", + "BRRR": "Burrow", "BRT": "Bikerush", "BRTR": "Barter", "BRTX": "Bertinity", + "BRUV": "Bruv", "BRWL": "Blockchain Brawlers", "BRX": "Breakout Stake", "BRY": "Berry Data", @@ -1202,6 +1359,7 @@ "BRZN": "Brayzin", "BS": "BlackShadowCoin", "BSAFE": "BlockSafe", + "BSAFU": "BlockSAFU", "BSATOSHI": "BabySatoshi", "BSC": "BowsCoin", "BSCBURN": "BSCBURN", @@ -1213,6 +1371,7 @@ "BSCV": "Bscview", "BSE": "BitSerial", "BSEND": "BitSend", + "BSG": "Baby Squid Game", "BSGG": "Betswap.gg", "BSGS": "Basis Gold Share", "BSI": "Bali Social Integrated", @@ -1221,6 +1380,7 @@ "BSOV": "BitcoinSoV", "BSP": "BallSwap", "BSPM": "Bitcoin Supreme", + "BSPT": "Blocksport", "BSR": "BitSoar Coin", "BSSB": "BitStable Finance", "BST": "Beshare Token", @@ -1231,11 +1391,13 @@ "BSV": "Bitcoin SV", "BSW": "Biswap", "BSX": "Basilisk", + "BSY": "Bestay", "BSYS": "BSYS", "BT": "BT.Finance", "BT1": "Bitfinex Bitcoin Future", "BT2": "Bitcoin SegWit2X", "BTA": "Bata", + "BTAD": "Bitcoin Adult", "BTB": "BitBar", "BTBL": "Bitball", "BTBS": "BitBase Token", @@ -1253,9 +1415,12 @@ "BTCGO": "BitcoinGo", "BTCH": "Bitcoin Hush", "BTCHD": "Bitcoin HD", + "BTCINU": "Bitcoin Inu", + "BTCIX": "BITCOLOJIX", "BTCK": "Bitcoin Turbo Koin", "BTCL": "BTC Lite", "BTCM": "BTCMoon", + "BTCMT": "Minto", "BTCN": "BitcoiNote", "BTCP": "Bitcoin Palladium", "BTCPAY": "Bitcoin Pay", @@ -1268,6 +1433,7 @@ "BTCT": "Bitcoin Token", "BTCUS": "Bitcoinus", "BTCV": "Bitcoin Vault", + "BTCVB": "BitcoinVB", "BTCZ": "BitcoinZ", "BTD": "Bitcloud", "BTDX": "Bitcloud 2.0", @@ -1317,6 +1483,7 @@ "BUBO": "Budbo", "BUBU": "BUBU", "BUC": "Beau Cat", + "BUCK": "Coinbuck", "BUCKS": "SwagBucks", "BUD": "Buddy", "BUFF": "Buffalo Swap", @@ -1328,8 +1495,10 @@ "BUK": "CryptoBuk", "BULL": "Bullieverse", "BULLC": "BuySell", + "BULLINU": "Bull inu", "BULLION": "BullionFX", "BULLMOON": "Bull Moon", + "BULLPEPE": "Bullpepe", "BULLS": "Bull Coin", "BULLSH": "Bullshit Inu", "BUMN": "BUMooN", @@ -1342,6 +1511,7 @@ "BURGER": "Burger Swap", "BURN": "Bitburn", "BURNDOGE": "BurnDoge", + "BURNIFYAI": "BurnifyAI", "BURP": "CoinBurp", "BUSD": "Binance USD", "BUSDC": "BUSD", @@ -1352,6 +1522,7 @@ "BUY": "Burency", "BUYI": "Buying.com", "BUZZ": "BuzzCoin", + "BV3A": "Buccaneer V3 Arbitrum", "BVC": "BeaverCoin", "BVND": "Binance VND", "BVO": "BRAVO Pay", @@ -1366,15 +1537,18 @@ "BWX": "Blue Whale", "BX": "BlockXpress", "BXA": "Blockchain Exchange Alliance", + "BXBT": "BoxBet", "BXC": "BonusCloud", "BXF": "BlackFort Token", "BXH": "BXH", "BXK": "Bitbook Gambling", + "BXR": "Blockster", "BXT": "BitTokens", "BXTB": "BXTB Foundation", "BXX": "Baanx", "BXY": "Beaxy", "BYC": "ByteCent", + "BYTES": "Neo Tokyo", "BYTHER": "Bytether ", "BYTS": "Bytus", "BYTZ": "BYTZ", @@ -1402,8 +1576,10 @@ "CACH": "Cachecoin", "CACHE": "Cache", "CACHEGOLD": "CACHE Gold", + "CADINU": "Canadian Inuit Dog", "CADN": "Content and AD Network", "CADX": "eToro Canadian Dollar", + "CAF": "Childrens Aid Foundation", "CAG": "Change", "CAGA": "Crypto Asset Governance Alliance", "CAH": "Moon Tropica", @@ -1422,6 +1598,7 @@ "CAM": "Consumption Avatar Matrix", "CAMC": "Camcoin", "CAMEL": "The Camel", + "CAMLY": "Camly Coin", "CAMP": "Camp", "CAN": "Channels", "CAND": "Canary Dollar", @@ -1431,14 +1608,17 @@ "CANYA": "CanYaCoin", "CAP": "Capverto", "CAPD": "Capdax", + "CAPO": "IL CAPO OF CRYPTO", "CAPP": "Cappasity", "CAPRICOIN": "CapriCoin", "CAPS": "Ternoa", "CAPT": "Bitcoin Captain", "CAPTAINPLANET": "Captain Planet", + "CAPY": "Capybara", "CAR": "CarBlock", "CARAT": "Carats Token", "CARBON": "Carboncoin", + "CARBONGEMS": "Carbon GEMS", "CARD": "Cardstack", "CARDS": "Cardstarter", "CARE": "Carebit", @@ -1453,6 +1633,7 @@ "CAS": "Cashaa", "CASH": "CashCoin", "CASHT": "Cash Tech", + "CASINU": "Casinu Inu", "CASIO": "CasinoXMetaverse", "CASPER": "Casper DeFi", "CAST": "Castello Coin", @@ -1460,6 +1641,7 @@ "CAT": "Cat Token", "CATBOY": "Catboy", "CATC": "Catcoin", + "CATCEO": "CATCEO", "CATCOIN": "CatCoin Cash", "CATCOINETH": "Catcoin", "CATE": "CateCoin", @@ -1473,6 +1655,7 @@ "CAVE": "Deepcave", "CAVO": "Excavo Finance", "CAW": "A Hunters Dream", + "CAWCEO": "CAW CEO", "CB": "COINBIG", "CBANK": "Crypto Bank", "CBAT": "Compound Basic Attention Token", @@ -1491,21 +1674,26 @@ "CBRL": "Crypto BRL", "CBRT": "Cybereits Token", "CBS": "Cerberus", + "CBSL": "CeBioLabs", "CBSN": "BlockSwap Network", "CBT": "CommerceBlock Token", "CBUCKS": "CRYPTOBUCKS", "CBUK": "CurveBlock", "CBX": "CropBytes", + "CBY": "Carbify", "CC": "CloudChat", "CC10": "Cryptocurrency Top 10 Tokens Index", "CCA": "CCA", "CCAKE": "CheeseCake Swap", "CCAR": "CryptoCars", + "CCASH": "C-cash", "CCC": "CCCoin", "CCCX": "Clipper Coin Capital", "CCD": "Concordium", "CCE": "CloudCoin", + "CCGDS": "CCGDS", "CCH": "Coinchase", + "CCHG": "C+Charge", "CCI": "Cyber Capital Invest", "CCIN": "Cryptocoin Insurance", "CCL": "CyClean", @@ -1519,6 +1707,7 @@ "CCRB": "CryptoCarbon", "CCT": "Carbon Credit", "CCTN": "Connectchain", + "CCV2": "CelebrityCoinV2", "CCX": "Conceal", "CCXC": "CoolinDarkCoin", "CCXX": "CounosX", @@ -1526,6 +1715,7 @@ "CDEX": "Cryptodex", "CDL": "CoinDeal Token", "CDN": "Canada eCoin", + "CDOGE": "cyberdoge", "CDPT": "Creditor Data Platform", "CDRX": "CDRX", "CDT": "CheckDot", @@ -1548,13 +1738,16 @@ "CENT": "CENTERCOIN", "CENTRA": "Centra", "CENX": "Centcex", + "CEODOGE": "CEO DOGE", "CERE": "Cere Network", + "CERES": "Ceres", "CESC": "Crypto Escudo", "CET": "CoinEx Token", "CETH": "Compound Ethereum", "CETI": "CETUS Coin", "CETUS": "Cetus Protocol", "CEUR": "Celo Euro", + "CEX": "Catena X", "CF": "Californium", "CFC": "CoinField Coin", "CFD": "Confido", @@ -1585,8 +1778,11 @@ "CHAL": "Chalice Finance", "CHAMP": "NFT Champions", "CHAN": "ChanCoin", + "CHANCE": "Ante Casino", "CHANGE": "ChangeX", "CHAO": "23 Skidoo", + "CHAPZ": "Chappyz", + "CHARGED": "GoCharge Tech", "CHARIZARD": "Charizard Inu", "CHARM": "Charm Coin", "CHARS": "CHARS", @@ -1613,16 +1809,20 @@ "CHFN": "NOKU CHF", "CHFT": "Crypto Holding", "CHFX": "eToro Swiss Franc", + "CHH": "Chihuahua Token", "CHI": "Chi Gastoken", + "CHICA": "CHICA", "CHICKS": "SolChicks", "CHIEF": "TheChiefCoin", "CHIHUA": "Chihua Token", "CHII": "Chiiper Chain", "CHILD": "ChildCoin", + "CHILI": "CHILI", "CHINU": "Chubby Inu", "CHIP": "Chip", "CHIPS": "CHIPS", "CHIRP": "Chirp", + "CHITCAT": "ChitCAT", "CHIWAWA": "Chiwawa", "CHK": "Chek", "CHLT": "Chellitcoin", @@ -1630,7 +1830,9 @@ "CHN": "Chain", "CHNG": "Chainge Finance", "CHO": "Choise", + "CHOKE": "Artichoke Protocol", "CHONK": "Chonk", + "CHONKY": "CHONKY", "CHOOF": "ChoofCoin", "CHOPPER": "Chopper Inu", "CHORIZO": "Chorizo", @@ -1641,6 +1843,7 @@ "CHS": "Chainsquare", "CHSB": "SwissBorg", "CHT": "Countinghouse Fund", + "CHUB": "CallHub", "CHVF": "Chives Finance", "CHW": "Chrysalis Coin", "CHX": "Own", @@ -1658,6 +1861,7 @@ "CIPHC": "Cipher Core Token", "CIR": "CircuitCoin", "CIRC": "CryptoCircuits", + "CIRCLE": "You Looked", "CIRUS": "Cirus", "CITY": "Manchester City Fan Token", "CIV": "Civilization", @@ -1669,11 +1873,15 @@ "CJR": "Conjure", "CJT": "ConnectJob Token", "CKB": "Nervos Network", + "CKBTC": "Chain-key Bitcoin", "CKC": "Clockcoin", "CKEK": "CryptoKek", + "CKETH": "Chain-key Ethereum", + "CKP": "Cakepie", "CKT": "Caketools", "CKUSD": "CKUSD", "CL": "CoinLancer", + "CLA": "ClaimSwap", "CLAM": "CLAMS", "CLB": "Cloudbric", "CLD": "Cloud", @@ -1682,6 +1890,7 @@ "CLEG": "Chain of Legends", "CLEO": "Cleo Tech", "CLEVERCOIN": "CleverCoin", + "CLFI": "cLFi", "CLH": "ClearDAO", "CLICK": "Clickcoin", "CLIFF": "Clifford Inu", @@ -1717,7 +1926,9 @@ "CMCC": "CMC Coin", "CMCT": "Crowd Machine", "CMCX": "CORE MultiChain", + "CMDX": "Comdex", "CMERGE": "CoinMerge", + "CMIT": "CMITCOIN", "CMK": "Credmark", "CMKR": "cMKR", "CML": "Camelcoin", @@ -1733,12 +1944,14 @@ "CMTC": "CometCoin", "CMZ": "CRYPTOMAGZ", "CNAB": "Cannabium", + "CNAME": "Cloudname", "CNB": "Coinsbit Token", "CNBC": "Cash & Back Coin", "CNC": "ChinaCoin", "CNCT": "CONNECT", "CND": "Cindicator", "CNDL": "Candle", + "CNETA": "AnetaBTC", "CNF": "CryptoNeur Network foundation", "CNFI": "Connect Financial", "CNG": "Changer", @@ -1763,6 +1976,7 @@ "COB": "Cobinhood", "COC": "Coin of the champions", "COCK": "Shibacock", + "COCO": "0xCoco", "CODEO": "Codeo Token", "CODEX": "CODEX Finance", "CODI": "Codi Finance", @@ -1788,9 +2002,11 @@ "COL": "Clash of Lilliput", "COLA": "Cola", "COLL": "Collateral Pay", + "COLLAR": "PolyPup Finance", "COLLE": "Collective Care", "COLLG": "Collateral Pay Governance", "COLR": "colR Coin", + "COLT": "Collateral Network", "COLX": "ColossusCoinXT", "COM": "Coliseum", "COMB": "Combo", @@ -1806,6 +2022,7 @@ "CONE": "BitCone", "CONG": "The Conglomerate Capital", "CONI": "CoinBene", + "CONK": "ShibaPoconk", "CONS": "ConSpiracy Coin", "CONSENTIUM": "Consentium", "CONV": "Convergence", @@ -1849,6 +2066,7 @@ "COVIR": "COVIR", "COVN": "Covenant", "COW": "CoW Protocol", + "COWRIE": "MYCOWRIE", "COX": "CobraCoin", "COY": "Coin Analyst", "COZP": "COZPlus", @@ -1881,6 +2099,7 @@ "CR8": "Crazy8Token", "CRA": "Crabada", "CRAB": "CrabCoin", + "CRACER": "Coinracer Reloaded", "CRACK": "CrackCoin", "CRADLE": "Cradle of Sins", "CRAFT": "TaleCraft", @@ -1889,6 +2108,8 @@ "CRAMER": "Cramer Coin", "CRANEPAY": "Cranepay", "CRAVE": "CraveCoin", + "CRAYRABBIT": "CrazyRabbit", + "CRAZYTIGER": "CRAZY TIGER", "CRB": "Creditbit", "CRBN": "Carbon", "CRC": "CryCash", @@ -1909,6 +2130,7 @@ "CREDITS": "Credits", "CREDO": "Credo", "CREED": "Thecreed", + "CREMAT": "Cremation Coin", "CREO": "Creo Engine", "CREP": "Compound Augur", "CRES": "Cresio", @@ -1917,6 +2139,7 @@ "CRF": "Crafting Finance", "CRFI": "CrossFi", "CRGO": "CargoCoin", + "CRI3X": "CRI3X", "CRIME": "Crime Gold", "CRL": "Cryptelo Coin", "CRM": "Cream", @@ -1934,9 +2157,11 @@ "CRS": "CRYSTALS", "CRSP": "CryptoSpots", "CRT": "Carr.Finance", + "CRTB": "Coritiba F.C. Fan Token", "CRTM": "Cryptum", "CRTS": "Cratos", "CRU": "Crust Network", + "CRUX": "CryptoMines Reborn", "CRV": "Curve DAO Token", "CRVUSD": "crvUSD", "CRVY": "Curve Inu", @@ -1944,6 +2169,7 @@ "CRWD": "CRWD Network", "CRWNY": "Crowny Token", "CRX": "ChronosCoin", + "CRYN": "CRYN", "CRYP": "CrypticCoin", "CRYPT": "CryptCoin", "CRYPTOBULLION": "CryptoBullion", @@ -1951,7 +2177,10 @@ "CRYPTONITE": "Cryptonite", "CRYPTOPRO": "CryptoProfile", "CRYPTOSDG": "Crypto SDG", + "CRYPTOU": "CryptoUnity", + "CRYSTAL": "Crystal", "CRYSTALCLEAR": "Crystal Clear Token", + "CRYSTL": "Crystl Finance", "CSAC": "Credit Safe Application Chain", "CSAI": "Compound SAI", "CSC": "CasinoCoin", @@ -1974,6 +2203,7 @@ "CSUSHI": "cSUSHI", "CSWAP": "CardSwap", "CSX": "Coinstox", + "CT": "CryptoTwitter", "CTAG": "CTAGtoken", "CTASK": "CryptoTask", "CTC": "Creditcoin", @@ -1993,6 +2223,8 @@ "CTPL": "Cultiplan", "CTPT": "Contents Protocol", "CTR": "Creator Platform", + "CTRL2XY": "Control2XY", + "CTRT": "Cryptrust", "CTS": "Citrus", "CTSI": "Cartesi", "CTT": "Castweet", @@ -2002,11 +2234,14 @@ "CTY": "Connecty", "CUBE": "Cube Network", "CUBEAUTO": "Cube", + "CUBEB": "CubeBase", "CUCK": "Cuckadoodledoo", "CUDOS": "Cudos", "CUE": "CUE Protocol", "CUEX": "Cuex", + "CULO": "CULO", "CULT": "Cult DAO", + "CUMINU": "CumInu", "CUMMIES": "CumRocket", "CUNI": "Compound Uni", "CURA": "Cura Network", @@ -2029,6 +2264,7 @@ "CVC": "Civic", "CVCC": "CryptoVerificationCoin", "CVCOIN": "Crypviser", + "CVIP": "CVIP", "CVNC": "CovenCoin", "CVNG": "Crave-NG", "CVNT": "Conscious Value Network", @@ -2063,6 +2299,7 @@ "CXP": "Caixa Pay", "CXPAD": "CoinxPad", "CXT": "Coinonat", + "CYBA": "CYBRIA", "CYBER": "CyberConnect", "CYBERC": "CyberCoin", "CYBERD": "Cyber Doge", @@ -2084,22 +2321,29 @@ "CYS": "BlooCYS", "CYT": "Cryptokenz", "CZC": "Crazy Coin", + "CZF": "CZodiac Farming Token", "CZGOAT": "CZ THE GOAT", + "CZOL": "Czolana", "CZR": "CanonChain", "CZRX": "Compound 0x", + "CZSHARES": "CZshares", "CZZ": "ClassZZ", "D": "Denarius", "D11": "DeFi11", + "D2T": "Dash 2 Trade", "D4RK": "DarkPayCoin", "DAB": "DABANKING", "DAC": "Davinci Coin", "DACASH": "DACash", + "DACAT": "daCat", "DACC": "Decentralized Accessible Content Chain", "DACC2": "DACC2", "DACH": "DACH Coin", + "DACKIE": "DackieSwap", "DACS": "Dacsee", "DACXI": "Dacxi", "DAD": "DAD", + "DADA": "DADA", "DADDYDOGE": "Daddy Doge", "DADI": "Edge", "DAF": "DaFIN", @@ -2124,6 +2368,7 @@ "DAO": "DAO Maker", "DAOACT": "ACT", "DAOB": "DAOBet", + "DAOP": "Dao Space", "DAOVC": "DAO.VC", "DAOX": "Daox", "DAPP": "LiquidApps", @@ -2144,13 +2389,17 @@ "DASC": "DasCoin", "DASH": "Dash", "DASHD": "Dash Diamond", + "DASHG": "Dash Green", "DAT": "Datum", "DATA": "Streamr", "DATAWALLET": "DataWallet", + "DATP": "Decentralized Asset Trading Platform", "DATX": "DATx", "DAV": "DAV", + "DAVE": "DAVE", "DAVIS": "Davis Cup Fan Token", "DAVP": "Davion", + "DAWG": "Dawg Coin", "DAWGS": "SpaceDawgs", "DAWN": "Dawn Protocol", "DAX": "DAEX", @@ -2177,6 +2426,7 @@ "DBY": "Dobuy", "DBZ": "Diamond Boyz Coin", "DC": "Dogechain", + "DCAR": "Dragon Crypto Argenti", "DCASH": "Diabolo", "DCB": "Decubate", "DCC": "Distributed Credit Chain", @@ -2188,10 +2438,13 @@ "DCNTR": "Decentrahub Coin", "DCR": "Decred", "DCRE": "DeltaCredits", + "DCRN": "Decred-Next", "DCS.": "deCLOUDs", "DCT": "Decent", + "DCTO": "Decentralized Crypto Token", "DCX": "DeCEX", "DCY": "Dinastycoin", + "DD": "DuckDAO", "DDAM": "DDAM", "DDD": "Scry.info", "DDDD": "People's Punk", @@ -2212,6 +2465,7 @@ "DEBASE": "Debase", "DEBT": "The Debt Box", "DEC": "Decentr", + "DECODE": "Decode Coin", "DEDE": "Dede", "DEEP": "DeepCloud AI", "DEEPG": "Deep Gold", @@ -2220,17 +2474,21 @@ "DEFI": "Defi", "DEFI5": "DEFI Top 5 Tokens Index", "DEFIL": "DeFIL", + "DEFISCALE": "DeFiScale", "DEFIT": "Digital Fitness", "DEFLA": "Defla", "DEFLCT": "Deflect", "DEFLECT": "Deflect Harbor AI", "DEFLY": "Deflyball", "DEFT": "DeFi Factory Token", + "DEFX": "DeFinity", "DEFY": "DEFY", "DEG": "Degis", + "DEGA": "Dega", "DEGEN": "DegenReborn", "DEGO": "Dego Finance", "DEGOV": "Degov", + "DEGOV1": "Dego Finance v1", "DEHUB": "DeHub", "DEI": "Deimos", "DEK": "DekBox", @@ -2240,8 +2498,10 @@ "DELTA": "Delta Financial", "DELTAC": "DeltaChain", "DEM": "eMark", + "DEMIR": "Adana Demirspor Token", "DEMOS": "DEMOS", "DENT": "Dent", + "DEOD": "Decentrawood", "DEOR": "Decentralized Oracle", "DEP": "DEAPCOIN", "DEPO": "Depo", @@ -2250,6 +2510,7 @@ "DERC": "DeRace", "DERI": "Deri Protocol", "DERO": "Dero", + "DERP": "Derp", "DES": "DeSpace Protocol", "DESI": "Desico", "DESO": "Decentralized Social", @@ -2267,13 +2528,17 @@ "DEXA": "DEXA COIN", "DEXE": "DeXe", "DEXG": "Dextoken Governance", + "DEXIO": "Dexioprotocol", "DEXM": "Dexmex", + "DEXNET": "DexNet", "DEXT": "DEXTools", "DEXTF": "DEXTF", + "DEXTV1": "DEXTools V1", "DF": "dForce", "DFA": "DeFine", + "DFB": "Facebook Tokenized Stock Defichain", "DFBT": "DentalFix", - "DFC": "DeFiScale", + "DFC": "DeFinder Capital", "DFD": "DefiDollar DAO", "DFG": "Defigram", "DFGL": "DeFi Gold", @@ -2297,16 +2562,22 @@ "DGCL": "DigiCol Token", "DGD": "Digix DAO", "DGDC": "DarkGold", + "DGH": "Digihealth", + "DGI": "DGI Game", "DGLD": "Digital Gold", "DGM": "DigiMoney", + "DGME": "GameStop Tokenized Stock Defichain", "DGMS": "Digigems", "DGN": "Diagon", + "DGNX": "DegenX", "DGORE": "DogeGoreCoin", "DGP": "DGPayment", "DGPT": "DigiPulse", "DGTX": "Digitex Token", "DGVC": "DegenVC", "DGX": "Digix Gold token", + "DHN": "Dohrnii", + "DHP": "dHealth", "DHR": "DeHR Network", "DHS": "Dirham Crypto", "DHT": "dHedge DAO", @@ -2326,6 +2597,7 @@ "DIFX": "Digital Financial Exchange", "DIG": "DIEGO", "DIGG": "DIGG", + "DIGI": "Digiverse", "DIGIC": "DigiCube", "DIGIF": "DigiFel", "DIGITAL": "Digital Reserve Currency", @@ -2341,9 +2613,11 @@ "DINGO": "Dingocoin", "DINO": "DinoSwap", "DINU": "Dogey-Inu", + "DINW": "Dinowars", "DIO": "Decimated", "DIONE": "Dione", "DIP": "Etherisc", + "DIPA": "Doge Ipa", "DIS": "TosDis", "DISCOVERY": "DiscoveryIoT", "DISK": "Dark Lisk", @@ -2355,6 +2629,7 @@ "DIVO": "DIVO Token", "DIVX": "Divi Exchange Token", "DIW": "DIWtoken", + "DIYAR": "Diyarbekirspor Token", "DJED": "Djed", "DK": "Dominant Kong", "DKA": "dKargo", @@ -2363,7 +2638,9 @@ "DKEY": "DKEY Bank", "DKKT": "DKK Token", "DKS": "DarkShield", + "DKUMA": "KumaDex Token", "DLA": "Dolla", + "DLANCE": "DeeLance", "DLC": "Diamond Launch", "DLISK": "Dlisk", "DLO": "Delio", @@ -2371,8 +2648,11 @@ "DLPT": "Deliverers Power Token", "DLR": "DollarOnline", "DLT": "Agrello Delta", + "DLTA": "delta.theta", "DLX": "DAppLinks", "DLXV": "Delta-X", + "DLYCOP": "Daily COP", + "DMAIL": "DMAIL Network", "DMC": "Dream21", "DMCH": "DARMA Cash", "DMD": "DMD", @@ -2381,6 +2661,7 @@ "DML": "Decentralized Machine Learning", "DMLG": "Demole", "DMOD": "Demodyfi Token", + "DMOON": "Dollarmoon", "DMS": "Documentchain", "DMT": "DMarket", "DMTC": "Demeter Chain", @@ -2390,6 +2671,7 @@ "DNA": "Metaverse", "DNET": "DeNet", "DNF": "DNFT Protocol", + "DNFLX": "Netflix Tokenized Stock Defichain", "DNFT": "DareNFT", "DNN": "DNN Token", "DNO": "Denaro", @@ -2397,14 +2679,18 @@ "DNS": "BitDNS", "DNT": "district0x", "DNTX": "DNAtix", + "DNVDA": "Nvidia Tokenized Stock Defichain", "DNX": "Dynex", "DNXC": "DinoX", + "DNY": "Dynasty Coin", "DNZ.BITCI": "Denizlispor Fan Token", "DOBO": "DogeBonk", "DOC": "Dochain", "DOCC": "Doc Coin", "DOCK": "Dock.io", "DOCT": "DocTailor", + "DOD": "Day Of Defeat 2.0", + "DOD100": "Day of Defeat Mini 100x", "DODI": "DoubleDice", "DODO": "DODO", "DOE": "Dogs Of Elon", @@ -2413,8 +2699,10 @@ "DOGACOIN": "DogaCoin", "DOGB": "DogeBoy", "DOGBOSS": "Dog Boss", + "DOGC": "Dogeclub", "DOGDEFI": "DogDeFiCoin", "DOGE": "Dogecoin", + "DOGE1SAT": "DOGE-1SATELLITE", "DOGE20": "Doge 2.0", "DOGEBNB": "DogeBNB", "DOGEC": "DogeCash", @@ -2427,14 +2715,20 @@ "DOGEDASH": "Doge Dash", "DOGEGF": "DogeGF", "DOGEMETA": "Dogemetaverse", + "DOGEPAY": "Doge Payment", "DOGESWAP": "Dogeswap Token (HECO)", "DOGETH": "EtherDoge", + "DOGEWHALE": "Dogewhale", "DOGEX": "DogeHouse Capital", "DOGEZILLA": "DogeZilla", "DOGGY": "Doggy", "DOGIRA": "Dogira", + "DOGMI": "DOGMI", "DOGO": "DogemonGo", "DOGPAD": "DogPad Finance", + "DOGRMY": "DogeArmy", + "DOGSROCK": "Dogs Rock", + "DOGWIFHAT": "dogwifhat", "DOGY": "DogeYield", "DOGZ": "Dogz", "DOJO": "ProjectDojo", @@ -2447,8 +2741,10 @@ "DON": "Donnie Finance", "DONA": "DONASWAP", "DONATION": "DonationCoin", + "DONG": "DongCoin", "DONK": "Don-key", "DONS": "The Dons", + "DONU": "Donu", "DONUT": "Donut", "DOOH": "Bidooh", "DOOR": "DOOR", @@ -2463,12 +2759,14 @@ "DOTR": "Cydotori", "DOUGH": "PieDAO v2 (DOUGH)", "DOV": "DOVU", + "DOVI": "Dovi(Ordinals)", "DOWS": "Shadows", "DP": "DigitalPrice", "DPAY": "DelightPay", "DPET": "My DeFi Pet", "DPI": "DeFiPulse Index", "DPIE": "DeFiPie", + "DPLTR": "Palantir Tokenized Stock Defichain", "DPN": "DIPNET", "DPP": "Digital Assets Power Play", "DPR": "Deeper Network", @@ -2476,12 +2774,15 @@ "DPT": "Diamond Platform Token", "DPX": "Dopex", "DPY": "Delphy", + "DQQQ": "Invesco QQQ Trust Defichain", "DRA": "DraculaCoin", "DRACO": "DT Token", "DRACOO": "DracooMaster", "DRAFTC": "Draftcoin", "DRAGON": "Dragon", + "DRAGONGROK": "DragonGROK", "DRAGONMA": "Dragon Mainland Shards", + "DRAGY": "Dragy", "DRAW": "Drawshop Kingdom Reverse", "DRC": "DRC Mobility", "DRCT": "Ally Direct", @@ -2500,6 +2801,7 @@ "DRKT": "DarkTron", "DRM": "DoDreamChain", "DRM8": "Dream8Coin", + "DROGGY": "Droggy", "DRONE": "Drone Coin", "DROP": "Dropil", "DROPS": "Drops", @@ -2515,11 +2817,15 @@ "DSCP": "Dreamscape", "DSCVR": "DSCVR.Finance", "DSD": "Dynamic Set Dollar", + "DSFR": "Digital Swiss Franc", "DSG": "Dinosaureggs", "DSH": "Dashcoin", + "DSHARE": "Dibs Share", "DSLA": "DSLA Protocol", "DSR": "Desire", + "DST": "Double Swap Token", "DSTR": "Dynamic Supply Tracker", + "DSUN": "DsunDAO", "DT": "DarkToken", "DT1": "Dollar Token 1", "DTA": "Data", @@ -2528,6 +2834,7 @@ "DTCT": "DetectorToken", "DTEM": "Dystem", "DTEP": "DECOIN", + "DTG": "Defi Tiger", "DTH": "Dether", "DTN": "Datareum", "DTO": "DotOracle", @@ -2535,8 +2842,11 @@ "DTR": "Dotori", "DTRC": "Datarius", "DTX": "DataBroker DAO", + "DUA": "Brillion", + "DUAL": "Dual Finance", "DUB": "DubCoin", "DUBAICAT": "Dubai Cat", + "DUBBZ": "Dubbz", "DUBI": "Decentralized Universal Basic Income", "DUC": "DucatusCoin", "DUCATO": "Ducato Protocol Token", @@ -2546,12 +2856,14 @@ "DUEL": "Duel Network", "DUELERS": "Block Duelers", "DUET": "Duet Protocol", + "DUG": "DUG", "DUK+": "Dukascoin", "DUKE": "Duke Inu", "DUMMY": "Dummy", "DUN": "Dune", "DUO": "ParallelCoin", "DUOT": "DUO Network", + "DUSD": "Decentralized USD", "DUSK": "Dusk Network", "DUST": "DUST Protocol", "DUX": "DuxCoin", @@ -2587,6 +2899,7 @@ "DXT": "Dexit Finance", "DYC": "Dycoin", "DYDX": "dYdX", + "DYM": "Dymension", "DYN": "Dynamic", "DYNA": "Dynamix", "DYNAMICTRADING": "Dynamic Trading Rights", @@ -2594,7 +2907,9 @@ "DYNMT": "Dynamite", "DYNO": "DYNO", "DYP": "Dypius", + "DYST": "Dystopia", "DYT": "DoYourTip", + "DYZILLA": "DYZilla", "DZAR": "Digital Rand", "DZCC": "DZCC", "DZDD": "DZD", @@ -2638,6 +2953,7 @@ "ECH": "EthereCash", "ECHO": "ECHO BOT", "ECHT": "e-Chat", + "ECLD": "Ethernity Cloud", "ECLIP": "Eclipse", "ECO": "Ormeus Ecosystem", "ECOB": "EcoBit", @@ -2647,12 +2963,14 @@ "ECOIN": "Ecoin", "ECOM": "Omnitude", "ECOREAL": "Ecoreal Estate", + "ECOTERRA": "ecoterra", "ECOX": "ECOx", "ECP": "ECP+ Technology", "ECR": "EcoVerse", "ECT": "SuperEdge", "ECTE": "EurocoinToken", "ECU": "ECOSC", + "EDAT": "EnviDa", "EDC": "EDC Blockchain", "EDDA": "EDDASwap", "EDDIE": "Eddie coin", @@ -2673,7 +2991,10 @@ "EDU": "Open Campus", "EDUC": "EducoinV", "EDUCOIN": "EduCoin", + "EDUM": "EDUM", + "EDX": "Equilibrium", "EER": "Ethereum eRush", + "EFBAI": "EuroFootball AI", "EFC": "Everton Fan Token", "EFFT": "Effort Economy ", "EFI": "Efinity", @@ -2690,11 +3011,13 @@ "EGEM": "EtherGem", "EGG": "Goose Finance", "EGGC": "EggCoin", + "EGGMAN": "Eggman Inu", "EGGP": "Eggplant Finance", "EGI": "eGame", "EGLD": "eGold", "EGO": "EGOcoin", "EGR": "Egoras Rights", + "EGRN": "Energreen", "EGS": "EdgeSwap", "EGT": "Egretia", "EGX": "Enegra", @@ -2738,11 +3061,15 @@ "ELMON": "Elemon", "ELMT": "Element", "ELON": "Dogelon Mars", + "ELON2024": "ELON 2024(BSC)", "ELONCAT": "ELON CAT COIN", + "ELONDRAGON": "ELON DRAGON", "ELONGD": "Elongate Deluxe", "ELONGT": "Elon GOAT", "ELONIUM": "Elonium", + "ELONMARS": "ELON MARS", "ELONONE": "AstroElon", + "ELONPEPE": "Elon Pepe Robot", "ELP": "Ellerium", "ELS": "Ethlas", "ELT": "Element Black", @@ -2767,9 +3094,11 @@ "EMIGR": "EmiratesGoldCoin", "EML": "EML Protocol", "EMN.CUR": "Eastman Chemical", + "EMOJI": "MOMOJI", "EMON": "Ethermon", "EMOT": "Sentigraph.io", "EMOTI": "EmotiCoin", + "EMP": "Emp Money", "EMPC": "EmporiumCoin", "EMPH": "Emphy", "EMPIRE": "Empire Token", @@ -2796,7 +3125,9 @@ "ENNO": "ENNO Cash", "ENO": "Enotoken", "ENQ": "Enecuum", + "ENQAI": "enqAI", "ENRG": "EnergyCoin", + "ENRX": "Enrex", "ENS": "Ethereum Name Service", "ENT": "Eternity", "ENTC": "EnterButton", @@ -2822,22 +3153,28 @@ "EOX": "EXTRA ORDINARY", "EPAN": "Paypolitan Token", "EPANUS": "Epanus", + "EPETS": "Etherpets", "EPIC": "Epic Cash", "EPIK": "EPIK Token", + "EPIKO": "Epiko", + "EPIX": "Byepix", "EPK": "EpiK Protocol", "EPS": "Ellipsis (OLD)", "EPTT": "Evident Proof Transaction Token", "EPX": "Ellipsis X", "EPY": "Empyrean", - "EQ": "Equilibrium", + "EQ": "Equilibrium Games", "EQC": "Ethereum Qchain Token", "EQL": "EQUAL", "EQM": "Equilibrium Coin", "EQO": "EQO", + "EQPAY": "EquityPay", "EQT": "EquiTrader", + "EQU": "Equation", "EQUAD": "Quadrant Protocol", "EQUAL": "EqualCoin", "EQUI": "EQUI", + "EQUIL": "Equilibrium", "EQUITOKEN": "EQUI Token", "EQX": "EQIFi", "EQZ": "Equalizer", @@ -2866,14 +3203,17 @@ "ERY": "Eryllium", "ES": "Era Swap Token", "ESBC": "ESBC", + "ESCE": "Escroco Emerald", "ESD": "Empty Set Dollar", "ESES.BITCI": "Eskişehir Fan Tokens", "ESG": "ESG", "ESGC": "ESG Chain", "ESH": "Switch", + "ESHIB": "Euro Shiba Inu", "ESN": "Ethersocial", "ESNC": "Galaxy Arena Metaverse", "ESP": "Espers", + "ESPR": "Espresso Bot", "ESS": "Essentia", "EST": "ESports Chain", "ESTATE": "AgentMile", @@ -2933,7 +3273,6 @@ "ETM": "En-Tan-Mo", "ETN": "Electroneum", "ETNA": "ETNA Network", - "ETNY": "Ethernity Cloud", "ETP": "Metaverse", "ETPOS": "EtherPOS", "ETR": "Electric Token", @@ -2950,6 +3289,7 @@ "EUM": "Elitium", "EUNO": "EUNO", "EURC": "Euro Coin", + "EURE": "Monerium EUR emoney", "EURN": "NOKU EUR", "EUROE": "EUROe Stablecoin", "EURS": "STASIS EURS", @@ -2963,6 +3303,7 @@ "EVC": "Eventchain", "EVCC": "Eco Value Coin", "EVCOIN": "EverestCoin", + "EVDC": "Electric Vehicle Direct Currency", "EVE": "Devery", "EVED": "Evedo", "EVENC": "EvenCoin", @@ -2971,6 +3312,7 @@ "EVEREST": "Everest", "EVERGREEN": "EverGreenCoin", "EVERLIFE": "EverLife.AI", + "EVERMOON": "EverMoon", "EVIL": "EvilCoin", "EVILPEPE": "Evil Pepe", "EVMOS": "Evmos", @@ -2989,12 +3331,14 @@ "EWC": "Erugo World Coin", "EWT": "Energy Web Token", "EWTT": "Ecowatt", + "EXA": "Exactly Protocol", "EXB": "ExaByte (EXB)", "EXC": "Eximchain", "EXCC": "ExchangeCoin", "EXCHANGEN": "ExchangeN", "EXCL": "Exclusive Coin", "EXE": "ExeCoin", + "EXEN": "Exen Coin", "EXFI": "Flare Finance", "EXIP": "EXIP", "EXIT": "ExitCoin", @@ -3018,10 +3362,12 @@ "EZC": "EZCoin", "EZM": "EZMarket", "EZT": "EZToken", + "EZY": "EzyStayz", "ElvishMagic": "EMAGIC", "F16": "F16Coin", "F2C": "Ftribe Fighters", "F2K": "Farm2Kitchen", + "F3": "Friend3", "F7": "Five7", "F9": "Falcon Nine", "FAB": "FABRK Token", @@ -3029,7 +3375,9 @@ "FABRIC": "MetaFabric", "FACE": "FaceDAO", "FACETER": "Faceter", + "FACT": "Orcfax", "FACTOM": "Factom", + "FACTR": "Defactor", "FADO": "FADO Go", "FAG": "PoorFag", "FAI": "Fairum", @@ -3049,17 +3397,23 @@ "FANZ": "FanChain", "FAR": "Farmland Protocol", "FARA": "FaraLand", + "FARCA": "Farcana", "FARM": "Harvest Finance", "FARMA": "FarmaTrust", "FARMC": "FARM Coin", + "FARMING": "Farming Bad", + "FARMS": "Farmsent", "FAST": "PodFast", "FASTMOON": "FastMoon", "FASTSWAP": "Fastswap", "FAT": "Fatcoin", "FATCAKE": "FatCake", + "FAV": "Football At AlphaVerse", + "FAVR": "FAVOR", "FAYRE": "Fayre", "FAZZ": "FazzCoin", "FB": "Fenerbahçe Token", + "FBA": "Firebird Aggregator", "FBB": "FilmBusinessBuster", "FBN": "Five balance", "FBNB": "ForeverBNB", @@ -3069,6 +3423,7 @@ "FCD": "FreshCut Diamond", "FCF": "French Connection Finance", "FCH": "Freecash", + "FCK": "Find & Check", "FCL": "Fractal", "FCN": "FantomCoin", "FCOIN": "FCoin", @@ -3091,15 +3446,18 @@ "FEENIXV2": "ProjectFeenixv2", "FEG": "FEG Token", "FEI": "Fei Protocol", - "FELIX": "Felix 2.0 ETH", + "FELIX": "FelixCoin", + "FELIX2": "Felix 2.0 ETH", "FEN": "First Ever NFT", "FENOMY": "Fenomy", + "FENTANYL": "Chinese Communist Dragon", "FER": "Ferro", "FERC": "FairERC20", "FERMA": "Ferma", "FERZAN": "Ferzan", "FESS": "Fesschain", "FET": "Fetch.AI", + "FETCH": "Fetch", "FEVR": "RealFevr", "FEX": "FEX Token", "FEY": "Feyorra", @@ -3114,8 +3472,12 @@ "FFYI": "Fiscus FYI", "FGD": "Freedom God DAO", "FGZ": "Free Game Zone", + "FHM": "FantOHM", + "FI": "Fideum", + "FIBO": "FibSWAP DEx", "FIBRE": "FIBRE", "FIC": "Filecash", + "FID": "Fidira", "FIDA": "Bonfida", "FIDLE": "Fidlecoin", "FIELD": "Fieldcoin", @@ -3130,6 +3492,7 @@ "FILST": "Filecoin Standard Hashrate Token", "FIN": "DeFiner", "FINA": "Defina Finance", + "FINC": "Finceptor", "FIND": "FindCoin", "FINE": "Refinable", "FINOM": "Finom FIN Token", @@ -3137,18 +3500,22 @@ "FIO": "FIO Protocol", "FIRE": "FireCoin", "FIRO": "Firo", + "FIRSTHARE": "FirstHare", "FIRU": "Firulais Finance", "FIS": "Stafi", "FIST": "FistBump", "FIT": "Financial Investment Token", "FITC": "Fitcoin", "FITFI": "Step App", + "FITT": "Fitmint", "FIU": "beFITTER", "FIWA": "Defi Warrior", + "FIX00": "FIX00", "FJB": "Freedom. Jobs. Business.", "FJC": "FujiCoin", "FJT": "Fuji FJT", "FK": "FK Coin", + "FKGARY": "Fuck Gary Gensler", "FKX": "FortKnoxster", "FL": "Freeliquid", "FLAG": "Flag Network", @@ -3164,6 +3531,7 @@ "FLETA": "FLETA", "FLEX": "FLEX Coin", "FLG": "Folgory Coin", + "FLIBERO": "Fantom Libero Financial", "FLIC": "Skaflic", "FLIK": "FLiK", "FLIP": "Chainflip", @@ -3176,19 +3544,25 @@ "FLO": "Flo", "FLOAT": "Float Protocol", "FLOKI": "Floki Inu", + "FLOKINY": "Floki New Year", + "FLOKIPEPE": "FlokiPepe", "FLOOR": "FloorDAO", "FLORKY": "Florky", + "FLOSHIDO": "FLOSHIDO INU", "FLOT": "FireLotto", "FLOVM": "FLOV MARKET", "FLOW": "Flow", "FLOWP": "Flow Protocol", + "FLOYX": "Floyx", "FLP": "Gameflip", "FLR": "Flare", "FLRS": "Flourish Coin", "FLS": "Flits", "FLT": "FlutterCoin", + "FLUID": "Fluid", "FLURRY": "Flurry Finance", "FLUX": "Flux", + "FLUXB": "Fluxbot", "FLUXT": "Flux Token", "FLUZ": "FluzFluz", "FLVR": "FlavorCoin", @@ -3196,6 +3570,7 @@ "FLY": "Franklin", "FLYCOIN": "FlyCoin", "FLZ": "Fellaz", + "FMC": "Fimarkcoin", "FME": "FME", "FMEX": "FMex", "FMG": "FM Gallery", @@ -3204,6 +3579,7 @@ "FN": "Filenet", "FNB": "FNB protocol", "FNC": "Fancy Games", + "FNCT": "Financie Token", "FNCY": "Fancy That", "FND": "Rare FND", "FNDZ": "FNDZ Token", @@ -3233,10 +3609,14 @@ "FONZ": "FonzieCoin", "FOOD": "FoodCoin", "FOODC": "Food Club", + "FOOM": "FOOM", + "FOOX": "Foox", "FOPA": "Fopacoin", "FOR": "ForTube", + "FORA": "UFORIKA", "FORCE": "TriForce Tokens", "FORCEC": "Force Coin", + "FORE": "FORE Protocol", "FORESTPLUS": "The Forbidden Forest", "FOREVER": "Forever Coin", "FOREVERFOMO": "ForeverFOMO", @@ -3251,11 +3631,13 @@ "FORTHB": "ForthBox", "FORTUNA": "Fortuna", "FORTUNE": "Fortune", + "FORWARD": "Forward Protocol", "FOTA": "Fight Of The Ages", "FOTO": "Unique Photo", "FOUNTAIN": "Fountain", "FOUR": "4THPILLAR TECHNOLOGIES", "FOX": "ShapeShift FOX Token", + "FOXAI": "FOXAI", "FOXD": "Foxdcoin", "FOXF": "Fox Finance", "FOXT": "Fox Trading", @@ -3280,6 +3662,9 @@ "FREEROSS": "FreeRossDAO", "FREL": "Freela", "FREN": "FREN", + "FRENS": "Farmer Friends", + "FRGX": "FRGX", + "FRIC": "Frictionless", "FRIN": "Fringe Finance", "FRK": "Franko", "FRKT": "FRAKT Token", @@ -3288,13 +3673,16 @@ "FRN": "Francs", "FRNT": "Final Frontier", "FROG": "FrogSwap", + "FROGCEO": "Frog Ceo", "FROGE": "Froge Finance", + "FRONK": "Fronk", "FRONT": "Frontier", "FROYO": "Froyo Games", "FRP": "Fame Reward Plus", "FRR": "Frontrow", "FRSP": "Forkspot", "FRST": "FirstCoin", + "FRTC": "FART COIN", "FRTS": "Fruits", "FRV": "Fitrova", "FRWC": "Frankywillcoin", @@ -3330,12 +3718,14 @@ "FUCK": "Fuck Token", "FUD": "FUD.finance", "FUEL": "Jetfuel Finance", + "FUFU": "Fufu Token", "FUJIN": "Fujinto", "FUKU": "Furukuru", "FUL": "Fulcrom Finance", "FUMO": "Alien Milady Fumo", "FUN": "FUN Token", "FUNC": "FunCoin", + "FUNCH": "FUNCH", "FUND": "Unification", "FUNDC": "FUNDChains", "FUNDP": "Fund Platform", @@ -3346,12 +3736,14 @@ "FUR": "Furio", "FURU": "Furucombo", "FURY": "Engines of Fury", + "FURYX": "Metafury", "FUS": "Fus", "FUSE": "Fuse Network Token", "FUSION": "FusionBot", "FUSO": "Fusotao", "FUTC": "FutCoin", "FUTURE": "FutureCoin", + "FUZE": "FUZE Token", "FUZN": "Fuzion", "FUZZ": "Fuzzballs", "FVT": "Finance Vote", @@ -3360,9 +3752,11 @@ "FWT": "Freeway Token", "FWW": "Farmers World Wood", "FX": "Function X", + "FXB": "FxBox", "FXC": "Flexacoin", "FXDX": "FXDX", "FXF": "Finxflo", + "FXI": "FX1 Sports", "FXP": "FXPay", "FXS": "Frax Share", "FXT": "FuzeX", @@ -3378,6 +3772,7 @@ "G999": "G999", "GAC": "Green Art Coin", "GAD": "Green App Development", + "GAFA": "Gafa", "GAFI": "GameFi", "GAI": "GraphGrail AI", "GAIA": "Gaia Everworld", @@ -3389,6 +3784,7 @@ "GAL": "Galxe", "GALA": "Gala", "GALATA": "Galatasaray Fan Token", + "GALAV1": "Gala v1", "GALAX": "Galaxy Finance", "GALAXY": "GalaxyCoin", "GALEON": "Galeon", @@ -3402,9 +3798,11 @@ "GAMECRED": "GameCredits", "GAMEFI": "GameFi Token", "GAMEIN": "Game Infinity", + "GAMER": "GameStation", "GAMESTARS": "Game Stars", "GAMEX": "GameX", "GAMI": "GAMI World", + "GAMINGDOGE": "GAMINGDOGE", "GAMINGSHIBA": "GamingShiba", "GAMMA": "Gamma Strategies", "GAN": "Galactic Arena: The NFTverse", @@ -3418,6 +3816,7 @@ "GARTS": "Glink Arts Share", "GARU": "Garuda Coin", "GARUDA": "GarudaSwap", + "GARY": "Gary", "GAS": "Gas", "GASDAO": "Gas DAO", "GASG": "Gasgains", @@ -3427,6 +3826,7 @@ "GATE": "GATENet", "GATEWAY": "Gateway Protocol", "GATSBY": "Gatsby Inu", + "GAU": "Gamer Arena", "GAYPEPE": "Gay Pepe", "GAZE": "GazeTV", "GB": "GoldBlocks", @@ -3438,12 +3838,14 @@ "GBG": "Golos Gold", "GBIT": "GravityBit", "GBK": "Goldblock", + "GBL": "Global Token", "GBO": "Gabro.io", "GBOT": "GBOT", "GBPT": "poundtoken", "GBRC": "GBR Coin", "GBT": "GameBetCoin", "GBTC": "GigTricks", + "GBURN": "GBURN", "GBX": "GoByte", "GBXT": "Globitex Token", "GBYTE": "Obyte", @@ -3456,12 +3858,14 @@ "GCW": "GCWine", "GDAO": "Governor DAO", "GDC": "Global Digital Content", + "GDCC": "GLOBAL DIGITAL CLUSTER COIN", "GDDY": "Giddy", "GDE": "Golden Eagle", "GDL": "GodlyCoin", "GDO": "GroupDao", "GDOGE": "Golden Doge", "GDR": "Guider.Travel", + "GDRT": "Good Driver Reward Token", "GDS": "Grat Deal Coin", "GDSC": "Golden Safety Coin", "GDT": "Globe Derivative Exchange", @@ -3470,15 +3874,18 @@ "GEA": "Goldea", "GEAR": "MetaGear", "GEC": "Geco.one", + "GECKO": "Gecko Coin", "GEEQ": "Geeq", "GEIST": "Geist Finance", + "GEKKO": "Gekko HQ", "GELATO": "Gelato", - "GEM": "Gems", + "GELO": "Grok Elo", + "GEM": "Gemie", "GEMA": "Gemera", "GEMG": "GemGuardian", "GEMINI": "Gemini Ai", "GEMINIT": "Gemini", - "GEMS": "Carbon GEMS", + "GEMS": "Gems", "GEMZ": "Gemz Social", "GEN": "DAOstack", "GENE": "Genopets", @@ -3486,6 +3893,7 @@ "GENIE": "The Genie", "GENIX": "Genix", "GENS": "Genshiro", + "GENSLR": "Good Gensler", "GENSTAKE": "Genstake", "GENX": "Genx Token", "GENXNET": "Genesis Network", @@ -3502,6 +3910,7 @@ "GES": "Galaxy eSolutions", "GESE": "Gese", "GET": "Guaranteed Entrance Token", + "GETA": "Getaverse", "GETH": "Guarded Ether", "GETX": "Guaranteed Ethurance Token Extra", "GEX": "Gexan", @@ -3511,6 +3920,7 @@ "GFCE": "GFORCE", "GFCS": "Global Funeral Care", "GFI": "Goldfinch", + "GFLY": "BattleFly", "GFN": "Graphene", "GFT": "Gifto", "GFUN": "GoldFund", @@ -3523,8 +3933,11 @@ "GGM": "Monster Galaxy", "GGOLD": "GramGold Coin", "GGP": "GGPro", + "GGPT": "Generative GPT", "GGR": "GGRocket", "GGS": "Gilgam", + "GGTK": "GGDApp", + "GHA": "Ghast", "GHC": "Galaxy Heroes Coin", "GHCOLD": "Galaxy Heroes Coin", "GHD": "Giftedhands", @@ -3536,6 +3949,7 @@ "GHOUL": "Ghoul Coin", "GHST": "Aavegotchi", "GHT": "Global Human Trust", + "GHUB": "GemHUB", "GHX": "GamerCoin", "GIB": "Bible Coin", "GIC": "Giant", @@ -3555,6 +3969,7 @@ "GJC": "Global Jobcoin", "GKI": "GKi", "GLA": "Gladius", + "GLAX": "BLOCK GALAXY NETWORK", "GLC": "GoldCoin", "GLCH": "Glitch", "GLD": "Goldario", @@ -3564,6 +3979,7 @@ "GLDY": "Buzzshow", "GLEEC": "Gleec Coin", "GLFT": "Global Fan Token", + "GLIDE": "Glide Finance", "GLINT": "BeamSwap", "GLM": "Golem Network Token", "GLMR": "Moonbeam", @@ -3573,6 +3989,7 @@ "GLOS": "GLOS", "GLOWSHA": "GlowShares", "GLQ": "GraphLinq Protocol", + "GLR": "Glory Finance", "GLS": "Glass Chain", "GLT": "GlobalToken", "GLX": "GalaxyCoin", @@ -3581,6 +3998,7 @@ "GMA": "Goldchip Mining Asset", "GMAT": "GoWithMi", "GMB": "GMB", + "GMBL": "GMBL Computer", "GMC": "Gridmaster", "GMCN": "GambleCoin", "GMCOIN": "GMCoin", @@ -3590,11 +4008,14 @@ "GML": "GameLeagueCoin", "GMM": "Gamium", "GMMT": "Green Mining Movement Token", + "GMNG": "Global Gaming", "GMPD": "GamesPad", "GMR": "GAMER", "GMS": "Gemstra", "GMT": "STEPN", + "GMTO": "Game Meteor Coin", "GMTT": "GMT Token", + "GMUSD": "GND Protocol", "GMX": "GMX", "GN": "GN", "GNBT": "Genebank Token", @@ -3602,6 +4023,7 @@ "GNJ": "GanjaCoin V2", "GNNX": "Gennix", "GNO": "Gnosis", + "GNOME": "GNOME", "GNR": "Gainer", "GNS": "Gains Network", "GNT": "GreenTrust", @@ -3621,6 +4043,7 @@ "GODL": "GODL", "GODS": "Gods Unchained", "GODZ": "Cryptogodz", + "GOETH": "Algomint", "GOF": "Golff", "GOFF": "Gift Off Token", "GOFX": "GooseFX", @@ -3632,6 +4055,7 @@ "GOL": "GogolCoin", "GOLC": "GOLCOIN", "GOLD": "CyberDragon Gold", + "GOLDEN": "Golden Inu", "GOLDENG": "Golden Goose", "GOLDMIN": "GoldMiner", "GOLDPIECES": "GoldPieces", @@ -3643,6 +4067,8 @@ "GOM2": "GoMoney2", "GOMA": "GOMA Finance", "GOMT": "GoMeat", + "GOO": "Gooeys", + "GOOCH": "Gooch", "GOOD": "Goodomy", "GOON": "Goonies", "GOPX": "GOPX Token", @@ -3657,6 +4083,7 @@ "GOTEM": "gotEM", "GOTG": "Got Guaranteed", "GOTX": "GothicCoin", + "GOV": "SubDAO", "GOVI": "Govi", "GOVT": "The Government Network", "GOW39": "God Of Wealth", @@ -3666,8 +4093,10 @@ "GPBP": "Genius Playboy Billionaire Philanthropist", "GPKR": "Gold Poker", "GPL": "Gold Pressed Latinum", + "GPN": "Gamepass Network", "GPPT": "Pluto Project Coin", "GPS": "Triffic", + "GPTG": "GPT Guru", "GPU": "GPU Coin", "GPX": "GPEX", "GQ": "Galactic Quadrant", @@ -3675,6 +4104,7 @@ "GRACY": "Gracy", "GRAIL": "Camelot Token", "GRANDCOIN": "GrandCoin", + "GRAPE": "GrapeCoin", "GRAV": "Graviton", "GRAVITAS": "Gravitas", "GRAVITYF": "Gravity Finance", @@ -3686,6 +4116,7 @@ "GREARN": "GrEarn", "GREEN": "GreenX", "GREENT": "Greentoken", + "GRELF": "GRELF", "GREXIT": "GrexitCoin", "GREY": "Grey Token", "GRFT": "Graft Blockchain", @@ -3696,6 +4127,7 @@ "GRIMACE": "Grimace", "GRIMEX": "SpaceGrime", "GRIN": "Grin", + "GRL": "Greelance", "GRLC": "Garlicoin", "GRM": "GridMaster", "GRMD": "GreenMed", @@ -3703,20 +4135,26 @@ "GRND": "SuperWalk", "GRO": "Gro DAO Token", "GROK": "Grok", + "GROKCEO": "GROK CEO", "GROKFATHER": "Grok Father", "GROKGROW": "GrokGrow", + "GROKHEROES": "GROK heroes", "GROKKING": "GrokKing", "GROKKY": "GroKKy", + "GROKMOON": "Grok Moon", "GROKOLAUS": "GROKolaus", "GROKQUEEN": "Grok Queen", "GROKX": "GROKX", + "GROKXAI": "Grok X Ai", "GRON": "Gron Digital", + "GROOOOOK": "Groooook", "GROW": "GrownCoin", "GROWTH": "GROWTH DeFi", "GRP": "Grape", "GRPL": "Golden Ratio Per Liquidity", "GRS": "Groestlcoin", "GRT": "The Graph", + "GRUM": "Grumpy (Ordinals)", "GRUMPY": "Grumpy Finance", "GRV": "GroveCoin", "GRVE": "Grave", @@ -3743,8 +4181,10 @@ "GSY": "GenesysCoin", "GT": "Gatechain Token", "GTA6": "GTA VI", + "GTAI": "GT Protocol", "GTC": "Gitcoin", "GTCOIN": "Game Tree", + "GTE": "GreenTek", "GTFO": "DumpBuster", "GTH": "Gath3r", "GTIB": "Global Trust Coin", @@ -3756,6 +4196,7 @@ "GTX": "GALLACTIC", "GUAC": "Guacamole", "GUAR": "Guarium", + "GUC": "Green Universe Coin", "GUCCI": "GUCCI", "GUE": "GuerillaCoin", "GUESS": "Peerguess", @@ -3767,9 +4208,13 @@ "GUP": "Guppy", "GUSD": "Gemini Dollar", "GUSDT": "Global Utility Smart Digital Token", + "GUT": "Genesis Universe", "GVE": "Globalvillage Ecosystem", "GVR": "Grove [OLD]", "GVT": "Genesis Vision", + "GW": "Gyrowin", + "GWD": "GreenWorld", + "GWGW": "GoWrap", "GWT": "Galaxy War", "GX": "GameX", "GXA": "Galaxia", @@ -3779,6 +4224,7 @@ "GYM": "GYM Token", "GYMNET": "Gym Network", "GYMREW": "Gym Rewards", + "GYRO": "Gyro", "GZB": "Gigzi", "GZE": "GazeCoin", "GZIL": "governance ZIL", @@ -3790,7 +4236,9 @@ "H2O": "H2O Dao", "H2ON": "H2O Securities", "H3O": "Hydrominer", + "H4TOKEN": "Hold Ignore Fud", "HAC": "Hackspace Capital", + "HACHI": "Hachi", "HACHIKO": "Hachiko Inu Token", "HAI": "Hacken Token", "HAIR": " HairDAO", @@ -3804,6 +4252,7 @@ "HALOPLATFORM": "Halo Platform", "HAM": "Hamster", "HAMS": "HamsterCoin", + "HAMSTR": "Hamster Coin", "HANA": "Hanacoin", "HAND": "ShowHand", "HANDY": "Handy", @@ -3813,14 +4262,19 @@ "HARAM": "HARAM", "HARAMBE": "Harambe", "HARD": "Kava Lend", + "HARE": "Hare Token", "HARRYP": "HarryPotterObamaSonic10Inu (ERC20)", "HART": "HARA", "HASH": "Provenance Blockchain", "HASHT": "HASH Token", + "HASUI": "Haedal", "HAT": "Hawala.Exchange", + "HATAY": "Hatayspor Token", "HATI": "Hati", "HAUS": "DAOhaus", + "HAVOC": "Havoc", "HAWK": "Hawksight", + "HAYYA": "GO HAYYA", "HAZ": "Hazza", "HAZE": "HazeCoin", "HB": "HeartBout", @@ -3854,21 +4308,25 @@ "HEARTBOUT": "HeartBout Pay", "HEARTR": "Heart Rate", "HEAT": "Heat Ledger", + "HEAVEN": "Heaven Token", "HEC": "Hector Finance", "HECTA": "Hectagon", "HEDG": "HedgeTrade", "HEDGE": "Hedgecoin", "HEEL": "HeelCoin", + "HEFI": "HeFi", "HEGIC": "Hegic", "HELIOS": "Mission Helios", "HELL": "HELL COIN", "HELLO": "HELLO", "HELMET": "Helmet Insure", "HELPS": "HelpSeed", + "HEMULE": "Hemule", "HEP": "Health Potion", "HER": "Hero Node", "HERA": "Hero Arena", "HERB": "HerbCoin", + "HERMES": "Hermes Protocol", "HERO": "Metahero", "HEROES": "Dehero Community Token", "HEROESC": "HeroesChained", @@ -3878,16 +4336,19 @@ "HEX": "HEX", "HEXC": "HexCoin", "HEZ": "Hermez Network Token", + "HF": "Have Fun", "HFI": "Holder Finance", "HFIL": "Huobi Fil", "HFT": "Hashflow", "HGET": "Hedget", "HGO": "HireGo", "HGOLD": "HollyGold", + "HGPT": "HyperGPT", "HGS": "HashGains", "HGT": "Hello Gold", "HH": "Holyheld", "HHEM": "Healthureum", + "HHGTTG": "Douglas Adams", "HI": "hi Dollar", "HIAZUKI": "hiAZUKI", "HIBAKC": "hiBAKC", @@ -3898,6 +4359,7 @@ "HICLONEX": "hiCLONEX", "HICOOLCATS": "hiCOOLCATS", "HID": "Hypersign Identity", + "HIDOODLES": "hiDOODLES", "HIDU": "H-Education World", "HIENS4": "hiENS4", "HIFI": "Hifi Finance", @@ -3908,6 +4370,7 @@ "HIH": "HiHealth", "HILL": "President Clinton", "HIMAYC": "hiMAYC", + "HIME": "Phantom of the Kill", "HIMEEBITS": "hiMEEBITS", "HIMFERS": "hiMFERS", "HIMOONBIRDS": "hiMOONBIRDS", @@ -3927,18 +4390,24 @@ "HITOP": "Hitop", "HIUNDEAD": "hiUNDEAD", "HIVE": "Hive", - "HIVEM": "Hivemapper", "HIX": "HELIX Orange", + "HK": "Hongkong", + "HKB": "HongKong BTC bank", "HKC": "HK Coin", + "HKDOGE": "HongKong Doge", "HKDX": "eToro Hong Kong Dollar", + "HKFLOKI": "hong kong floki", "HKG": "Hacker Gold", "HKN": "Hacken", "HLC": "HalalChain", "HLD": "HyperLending", "HLDY": "HOLIDAY", "HLM": "Helium", + "HLN": "Holonus", "HLP": "Purpose Coin", + "HLPR": "HELPER COIN", "HLPT": "HLP Token", + "HLS": "Halis", "HLT": "HyperLoot", "HLX": "Helex", "HMC": "Hi Mutual Society", @@ -3951,6 +4420,8 @@ "HMRN": "Homerun", "HMST": "Hamster Marketplace Token", "HMT": "HUMAN Token", + "HMTT": "Hype Meme Token", + "HMX": "HMX", "HNB": "HashNet BitEco", "HNC": "Hellenic Coin", "HNCN": "Huncoin", @@ -3960,30 +4431,41 @@ "HNTR": "Hunter", "HNY": "Honey", "HNZO": "Hanzo Inu", + "HO": "HALO network", + "HOA": "Hex Orange Address", + "HOBBES": "Hobbes", "HOBO": "HOBO THE BEAR", "HOD": "HoDooi.com", "HODL": "HOdlcoin", "HOGE": "Hoge Finance", + "HOKA": "Hokkaido Inu", "HOKK": "Hokkaidu Inu", "HOLA": "Hola Token", "HOLD": "HOLD", "HOLY": "Holy Trinity", + "HOME": "OtterHome", "HOMI": "HOMIHELP", + "HOMMIES": "HOMMIES", "HON": "SoulSociety", + "HONEY": "Hivemapper", "HONEYCOIN": "Honey", + "HONK": "Honk", "HONOR": "HonorLand", "HOOK": "Hooked Protocol", "HOP": "Hop Protocol", + "HOPPY": "Hoppy", "HOPR": "HOPR", "HORD": "Hord", "HORSE": "Ethorse", "HORUS": "HorusPay", "HOS": "Hotel of Secrets", + "HOSHI": "Dejitaru Hoshi", "HOSKY": "Hosky", "HOT": "Holo", "HOTCROSS": "Hot Cross", "HOTN": "HotNow", "HOTT": "HOT Token", + "HOW": "HowInu", "HOWL": "Coyote", "HP": "HeroPark", "HPAD": "HarmonyPad", @@ -3995,10 +4477,12 @@ "HPO": "Hippocrat", "HPT": "Huobi Pool Token", "HPX": "HUPAYX", + "HQR": "Hayya Qatar", "HQT": "HyperQuant", "HQX": "HOQU", "HRB": "Harbour DAO", "HRBE": "Harambee Token", + "HRCC": "HRC Crypto", "HRD": "Hoard", "HRDG": "HRDGCOIN", "HRO": "HEROIC.com", @@ -4009,6 +4493,8 @@ "HSP": "Horse Power", "HSS": "Hashshare", "HST": "Decision Token", + "HSUI": "Suicune", + "HSUITE": "HbarSuite", "HT": "Huobi Token", "HTA": "Historia", "HTB": "Hotbit", @@ -4018,6 +4504,7 @@ "HTER": "Biogen", "HTM": "Hatom", "HTML": "HTML Coin", + "HTMOON": "HTMOON", "HTN": "Heart Number", "HTO": "Heavenland HTO", "HTR": "Hathor", @@ -4028,7 +4515,9 @@ "HUB": "Hub Token", "HUBII": "Hubii Network", "HUC": "HunterCoin", + "HUDI": "Hudi", "HUGE": "BigCoin", + "HUGO": "Hugo Inu", "HUM": "Humanscape", "HUNNY": "Pancake Hunny", "HUNT": "HUNT", @@ -4038,6 +4527,7 @@ "HUSH": "Hush", "HUSKY": "Husky", "HUSL": "Hustle Token", + "HUT": "Hibiki Run", "HVC": "HeavyCoin", "HVCO": "High Voltage Coin", "HVE": "UHIVE", @@ -4049,9 +4539,11 @@ "HWC": "HollyWoodCoin", "HXA": "HXAcoin", "HXC": "HexanCoin", + "HXD": "Honeyland", "HXRO": "Hxro", "HXT": "HextraCoin", "HXX": "HexxCoin", + "HXXH": "Pioneering D. UTXO-Based NFT Social Protocol", "HYBN": "Hey Bitcoin", "HYBRID": "Hybrid Bank Cash", "HYC": "HYCON", @@ -4079,6 +4571,7 @@ "I7": "ImpulseVen", "I9C": "i9 Coin", "IAG": "IAGON", + "IAI": "inheritance Art", "IAM": "IAME Identity", "IB": "Iron Bank", "IBANK": "iBankCoin", @@ -4103,6 +4596,7 @@ "ICHI": "ICHI", "ICHN": "i-chain", "ICHX": "IceChain", + "ICLICK": "Iclick inu", "ICN": "Iconomi", "ICOB": "Icobid", "ICOM": "iCommunity", @@ -4133,12 +4627,14 @@ "IDO": "Idexo", "IDORU": "Vip2Fan", "IDRT": "Rupiah Token", + "IDRX": "IDRX", "IDT": "InvestDigital", "IDTT": "Identity", "IDV": "Idavoll DAO", "IDX": "Index Chain", "IDXM": "IDEX Membership", "IDXS": "In-Dex Sale", + "IDYP": "iDypius", "IEC": "IvugeoEvolutionCoin", "IETH": "iEthereum", "IF": "Impossible Finance", @@ -4171,9 +4667,11 @@ "IMC": "i Money Crypto", "IME": "Imperium Empires", "IMG": "ImageCoin", + "IMGNAI": "Image Generation AI", "IMGZ": "Imigize", "IMI": "Influencer", "IML": "IMMLA", + "IMO": "IMO", "IMP": "CoinIMP", "IMPACT": "Impact", "IMPACTXP": "ImpactXP", @@ -4204,6 +4702,7 @@ "INDICOIN": "IndiCoin", "INDY": "Indigo Protocol", "INE": "IntelliShare", + "INEDIBLE": "INEDIBLE", "INERY": "Inery", "INES": "Inescoin", "INET": "Insure Network", @@ -4229,19 +4728,24 @@ "INS": "Insolar (Old Chain)", "INSANE": "InsaneCoin", "INSANITY": "Insanity Coin", + "INSC": "INSC (Ordinals)", "INSN": "Insane Coin", "INSP": "Inspect", + "INSR": "Insurabler", "INST": "Instadapp", "INSTAMINE": "Instamine Nuggets", "INSTAR": "Insights Network", "INSUR": "InsurAce", "INSURC": "InsurChain Coin", "INT": "Internet Node token", + "INTD": "INTDESTCOIN", "INTER": "Inter Milan Fan Token", "INTO": "Influ Token", "INTR": "Interlay", "INU": "INU Token", + "INUINU": "Inu Inu", "INUKO": "Inuko Finance", + "INUS": "MultiPlanetary Inus", "INUYASHA": "Inuyasha", "INV": "Inverse Finance", "INVC": "Invacio", @@ -4278,6 +4782,8 @@ "IPC": "IPChain", "IPDN": "IPDnetwork", "IPL": "VouchForMe", + "IPMB": "IPMB", + "IPOR": "IPOR", "IPSX": "IP Exchange", "IPT": "Crypt-ON", "IPUX": "IPUX", @@ -4310,6 +4816,7 @@ "ISR": "Insureum", "ISRG.CUR": "Intuitive Surgical, Inc.", "ISSP": "ISSP", + "IST": "Inter Stable Token", "ISTEP": "iSTEP", "ITA": "Italian National Football Team Fan Token", "ITALOCOIN": "Italocoin", @@ -4320,16 +4827,21 @@ "ITF": "Intelligent Trading", "ITG": "iTrust Governance", "ITGR": "Integral", + "ITHEUM": "Itheum", "ITL": "Italian Lira", + "ITLR": "MiTellor", "ITM": "intimate.io", "ITOC": "ITOChain", "ITR": "INTRO", "ITU": "iTrue", + "ITX": "Intellix", "ITZ": "Interzone", "IUNGO": "Iungo", + "IUS": "Iustitia Coin", "IUX": "GeniuX", "IVAR": "Ivar Coin", "IVC": "Investy Coin", + "IVI": "IVIRSE", "IVN": "IVN Security", "IVY": "IvyKoin", "IVZ": "InvisibleCoin", @@ -4340,6 +4852,7 @@ "IXP": "IMPACTXPRIME", "IXS": "IX Swap", "IXT": "iXledger", + "IYKYK": "IYKYK", "IZA": "Inzura", "IZE": "IZE", "IZER": "IZEROIUM", @@ -4359,6 +4872,7 @@ "JANE": "JaneCoin", "JAR": "Jarvis+", "JARED": "Jared From Subway", + "JARY": "JeromeAndGary", "JASMY": "JasmyCoin", "JBS": "JumBucks Coin", "JBX": "Juicebox", @@ -4366,13 +4880,18 @@ "JCB": "Wine Chain", "JCC": "Junca Cash", "JCG": "JustCarbon Governance", + "JCO": "JennyCo", "JCR": "JustCarbon Removal", "JCT": "Japan Content Token", "JDC": "JustDatingSite", "JED": "JEDSTAR", + "JEFE": "JEFE TOKEN", "JEFF": "Jeff in Space", "JEJUDOGE": "Jejudoge", + "JELLY": "Jelly eSports", "JEM": "Jem", + "JEN": "JEN COIN", + "JERRYINU": "JERRYINU", "JESUS": "Jesus Coin", "JET": "Jet Protocol", "JETCOIN": "Jetcoin", @@ -4385,21 +4904,32 @@ "JIAOZI": "Jiaozi", "JIB": "Jibbit", "JIF": "JiffyCoin", + "JIM": "Jim", "JINDOGE": "Jindoge", "JIO": "JIO Token", "JKC": "JunkCoin", + "JKL": "Jackal Protocol", + "JLP": "Jupiter Perps LP", "JM": "JustMoney", "JMC": "Junson Ming Chan Coin", "JMPT": "JumpToken", "JMT": "JMTIME", + "JMZ": "Jimizz", + "JNB": "Jinbi Token", + "JNGL": "Jungle Labz", "JNS": "Janus", "JNT": "Jibrel Network Token", + "JNX": "Janex", "JNY": "JNY", "JOB": "Jobchain", "JOBS": "JobsCoin", "JOE": "JOE", + "JOEBIDEN2024 ": "JOEBIDEN2024", "JOINT": "Joint Ventures", + "JOJO": "JOJO", "JOK": "JokerCoin", + "JOKER": "JOKER", + "JOLT": "Joltify", "JONES": "Jones DAO", "JOTCHUA": "Perro Dinero", "JOY": "Joystream", @@ -4409,13 +4939,17 @@ "JP": "JP", "JPAW": "Jpaw Inu", "JPEG": "JPEG'd", + "JPGC": "JPGold Coin", "JPYC": "JPYC", "JPYX": "eToro Japanese Yen", "JRIT": "JERITEX", "JRT": "Jarvis Reward Token", "JSE": "JSEcoin", + "JSM": "Joseon Mun", + "JSOL": "JPool Staked SOL", "JST": "JUST", "JT": "Jubi Token", + "JTC": "Jurat", "JTO": "Jito", "JTS": "Jetset", "JTX": "Project J", @@ -4429,7 +4963,9 @@ "JUN": "Jun \"M\" Coin", "JUNO": "JUNO", "JUP": "Jupiter", + "JUPI": "Jupiter", "JUR": "Jur", + "JUSDT": "TON Bridged USDT", "JUSTICE": "AssangeDAO", "JUV": "Juventus Fan Token", "JVL": "Javelin", @@ -4441,13 +4977,16 @@ "KAAS": "KAASY.AI", "KABY": "Kaby Arena", "KAC": "KACO Finance", + "KACY": "Kassandra", "KAG": "Silver", "KAI": "KardiaChain", "KAIKEN": "Kaiken Shiba", "KAINET": "KAINET", + "KAKA": "KAKA NFT World", "KAL": "Kaleido", "KALA": "Kalata Protocol", "KALAM": "Kalamint", + "KALDI": "Kaldicoin", "KALI": "Kalissa", "KALLY": "Polkally", "KALM": "KALM", @@ -4455,7 +4994,9 @@ "KAM": "BitKAM", "KAMPAY": "KamPay", "KAN": "Bitkan", + "KANG3N": "Kang3n", "KANGAL": "Kangal", + "KAP": "KAP Games", "KAPU": "Kapu", "KAR": "Karura", "KARATE": "Karate Combat", @@ -4485,6 +5026,7 @@ "KBTC": "Klondike BTC", "KBX": "KuBitX", "KC": "Kernalcoin", + "KCAKE": "KittyCake", "KCAL": "Phantasma Energy", "KCASH": "Kcash", "KCCM": "KCC MemePad", @@ -4498,6 +5040,7 @@ "KDG": "Kingdom Game 4.0", "KDIA": "KDIA COIN", "KDOGE": "KingDoge", + "KDX": "eckoDAO", "KEANU": "Keanu Inu", "KEC": "KEYCO", "KED": "Klingon Empire Darsek", @@ -4506,6 +5049,7 @@ "KEI": "Keisuke Inu", "KEK": "KekCoin", "KEKE": "KEK", + "KEKEC": "THE BALKAN DWARF", "KEL": "KelVPN", "KELPIE": "Kelpie Inu", "KEMA": "Kemacoin", @@ -4525,6 +5069,7 @@ "KGC": "Krypton Galaxy Coin", "KGO": "Kiwigo", "KHM": "Kohima", + "KI": "Genopets KI", "KIAN": "Porta", "KIBA": "Kiba Inu", "KICK": "Kick", @@ -4533,6 +5078,7 @@ "KILLER": "Fat Cat Killer", "KILT": "KILT Protocol", "KIM": "King Money", + "KIMBO": "Kimbo", "KIMCHI": "KIMCHI.finance", "KIN": "Kin", "KIND": "Kind Ads", @@ -4540,6 +5086,8 @@ "KING": "KING", "KING93": "King93", "KINGB": "King Bean", + "KINGBONK": "King Bonk", + "KINGCAT": "King Cat", "KINGDOMQUEST": "Kingdom Quest", "KINGF": "King Finance", "KINGGROK": "King Grok", @@ -4547,6 +5095,7 @@ "KINGSWAP": "KingSwap", "KINGU": "KINGU", "KINT": "Kintsugi", + "KIRA": "Kira the Injective Cat", "KIRBY": "Kirby Inu", "KIRBYRELOADED": "Kirby Reloaded", "KIRO": "Kirobo", @@ -4555,8 +5104,10 @@ "KISHU": "Kishu Inu", "KITA": "KITA INU", "KITSU": "Kitsune Inu", + "KITTENS": "Kitten Coin", "KITTY": "Kitty Inu", "KIWI": "kiwi", + "KIZUNA": "KIZUNA", "KKO": "Kineko", "KKT": "Kingdom Karnage", "KLAP": "Klap Finance", @@ -4565,12 +5116,14 @@ "KLD": "Koduck", "KLEE": "KleeKai", "KLEVA": "KLEVA Protocol", + "KLIMA": "KlimaDAO", "KLK": "Klickzie", "KLKS": "Kalkulus", "KLO": "Kalao", "KLON": "Klondike Finance", "KLP": "Kulupu", "KLT": "Kamaleont", + "KLUB": "KlubCoin", "KLV": "Klever", "KMA": "Calamari Network", "KMD": "Komodo", @@ -4579,9 +5132,11 @@ "KMX": "KiMex", "KNC": "Kyber Network Crystal v2", "KNCL": "Kyber Network Crystal Legacy", + "KNDX": "Kondux", "KNG": "BetKings", "KNGN": "KingN Coin", "KNIGHT": "Forest Knight", + "KNJ": "Kunji Finance", "KNOT": "Karmaverse", "KNOW": "KNOW", "KNT": "Knekted", @@ -4590,6 +5145,7 @@ "KOBE": "Shabu Shabu", "KOBO": "KoboCoin", "KODACHI": "Kodachi Token", + "KOGECOIN": "KogeCoin.io", "KOI": "Koi Network", "KOIN": "Koinos", "KOIP": "KoiPond", @@ -4605,10 +5161,12 @@ "KORE": "KORE Vault", "KOREC": "Kore", "KOTO": "Koto", + "KOY": "Koyo", "KOZ": "Kozjin", "KP3R": "Keep3rV1", "KP4R": "Keep4r", "KPAD": "KickPad", + "KPAPA": "KPAPA", "KPC": "KEEPs Coin", "KPL": "Kepple", "KPOP": "KPOP Coin", @@ -4618,6 +5176,8 @@ "KRC": "KRCoin", "KRD": "Krypton DAO", "KREDS": "KREDS", + "KREST": "krest Network", + "KRIDA": "KridaFans", "KRIPTO": "Kripto", "KRL": "Kryll", "KRM": "Karma", @@ -4659,8 +5219,10 @@ "KUJI": "Kujira", "KUKU": "KuKu", "KUMA": "Kuma Inu", + "KUMU": "Kumu Finance", "KUNCI": "Kunci Coin", "KUR": "Kuro", + "KURO": "Kurobi", "KURT": "Kurrent", "KUSA": "Kusa Inu", "KUSD": "Kowala", @@ -4701,6 +5263,7 @@ "LAELAPS": "Laelaps", "LAI": "LayerAI", "LAIKA": "Laika Protocol", + "LAKE": "Data Lake", "LALA": "LaLa World", "LAMB": "Lambda", "LANA": "LanaCoin", @@ -4719,6 +5282,8 @@ "LAUNCH": "Launchblock.com", "LAVA": "Lavaswap", "LAVAX": "LavaX Labs", + "LAVE": "Lavandos", + "LAVITA": "Lavita AI", "LAW": "Law Token", "LAX": "LAPO", "LAYER": "UniLayer", @@ -4730,6 +5295,7 @@ "LBL": "LABEL Foundation", "LBLOCK": "Lucky Block", "LBR": "LaborCrypto", + "LBT": "Law Blocks", "LBTC": "LiteBitcoin", "LBXC": "LUX BIO EXCHANGE COIN", "LC": "Lotus Capital", @@ -4742,7 +5308,9 @@ "LCMS": "LCMS", "LCP": "Litecoin Plus", "LCR": "Lucre", + "LCRO": "Liquid CRO", "LCS": "LocalCoinSwap", + "LCSN": "Lacostoken", "LCT": "LendConnect", "LCWP": "LiteCoinW Plus", "LCX": "LCX", @@ -4753,6 +5321,7 @@ "LDO": "Lido DAO", "LDOGE": "LiteDoge", "LDX": "Litedex", + "LDZ": "Voodoo Token", "LEA": "LeaCoin", "LEAD": "Lead Wallet", "LEAF": "LeafCoin", @@ -4761,17 +5330,20 @@ "LEASH": "Doge Killer", "LED": "LEDGIS", "LEDU": "Education Ecosystem", + "LEE": "Love Earn Enjoy", "LEET": "LeetSwap", "LEG": "Legia Warsaw Fan Token", "LEGO": "Lego Coin", "LELE": "Lelecoin", "LEMC": "LemonChain", "LEMD": "Lemond", + "LEMN": "LEMON", "LEMO": "LemoChain", "LEMON": "LemonCoin", "LEN": "Liqnet", "LEND": "Aave", "LENDA": "Lenda", + "LENFI": "Lenfi", "LENIN": "LeninCoin", "LEO": "LEO Token", "LEOPARD": "Leopard", @@ -4793,8 +5365,10 @@ "LF": "Linkflow", "LFC": "BigLifeCoin", "LFG": "Gamerse", + "LFI": "LunaFi", "LFT": "Lend Flare Dao", "LFW": "Linked Finance World", + "LGBT": "Let's Go Brandon Token", "LGBTQ": "LGBTQoin", "LGCY": "LGCY Network", "LGD": "Legends Cryptocurrency", @@ -4805,6 +5379,7 @@ "LHB": "Lendhub", "LHC": "LHCoin", "LHD": "LitecoinHD", + "LHINU": "Love Hate Inu", "LHT": "LHT Coin", "LIB": "Libellum", "LIBERA": "Libera Financial", @@ -4812,19 +5387,25 @@ "LIBFX": "Libfx", "LIBRE": "Libre", "LIC": "Ligercoin", + "LICK": "PetLFG", + "LICO": "Liquid Collectibles", "LID": "Liquidity Dividends Protocol", "LIDER": "Lider Token", "LIEN": "Lien", "LIF": "Winding Tree", "LIFE": "Life Crypto", "LIFETOKEN": "LIFE", + "LIFT": "Uplift", "LIGER": "Ligercoin", "LIGHT": "LightChain", "LIGO": "Ligo", "LIKE": "Only1", "LIKEC": "LikeCoin", + "LILA": "LiquidLayer", "LILFLOKI": "Lil Floki", "LIME": "iMe Lab", + "LIMEX": "Limestone Network", + "LIMO": "Limoverse", "LIMX": "LimeCoinX", "LINA": "Linear", "LINANET": "Lina", @@ -4840,8 +5421,11 @@ "LIPC": "LIpcoin", "LIPS": "LipChain", "LIQ": "LIQ Protocol", + "LIQD": "Liquid Finance", "LIQUI": "Liquidus", "LIR": "Let it Ride", + "LIS": "Realis Network", + "LISA": "Lisa Simpson", "LIST": "KList Protocol", "LIT": "Litentry", "LITENETT": "Litenett", @@ -4855,12 +5439,16 @@ "LIVESTARS": "Live Stars", "LIXX": "Libra Incentix", "LIZ": "Lizus Payment", + "LIZA": "Liza", + "LIZARD": "LIZARD", + "LIZD": "Dancing Lizard Coin", "LK": "Liker", "LK7": "Lucky7Coin", "LKC": "LuckyCoin", "LKD": "LinkDao", "LKK": "Lykke", "LKN": "LinkCoin Token", + "LKSM": "Liquid KSM", "LKT": "Locklet", "LKU": "Lukiu", "LKY": "LuckyCoin", @@ -4897,6 +5485,7 @@ "LOCK": "Contracto", "LOCO": "Loco", "LOCUS": "Locus Chain", + "LODE": "Lodestar", "LOF": "Land of Fantasy", "LOG": "Wood Coin", "LOIS": "Lois Token", @@ -4910,9 +5499,11 @@ "LOOKS": "LooksRare", "LOOM": "Loom Network", "LOON": "Loon Network", + "LOONG": "PlumpyDragons", "LOOP": "LOOP", "LOOT": "LootBot", "LOOTEX": "Lootex", + "LOPES": "Leandro Lopes", "LORD": "MEMELORD", "LORDS": "LORDS", "LORDZ": "Meme Lordz", @@ -4920,31 +5511,41 @@ "LOTES": "Loteo", "LOTEU": "Loteo", "LOTTO": "LottoCoin", + "LOTTY": "Lotty", + "LOTUS": "The White Lotus", "LOUD": "Loud Market", "LOV": "LoveChain", "LOVE": "Deesse", "LOVELY": "Lovely Inu finance", + "LOVESNOOPY": "I LOVE SNOOPY", "LOWB": "Loser Coin", "LOX": "Lox Network", + "LOYAL": "Loyalty Labs", "LP": "Liquid Protocol", "LPC": "Little Phil", "LPI": "LPI DAO", "LPK": "Kripton", + "LPL": "LinkPool", "LPNT": "Luxurious Pro Network Token", "LPOOL": "Launchpool", "LPT": "Livepeer", + "LPV": "Lego Pepe Vision", "LPY": "LeisurePay", + "LQ": "Liqwid Finance", "LQ8": "Liquid8", "LQBTC": "Liquid Bitcoin", "LQD": "Liquid", "LQDN": "Liquidity Network", "LQDR": "LiquidDriver", + "LQDX": "Liquid Crypto", "LQR": "Laqira Protocol", "LQTY": "Liquity", "LRC": "Loopring", "LRG": "Largo Coin", "LRN": "Loopring [NEO]", + "LSC": "LS Coin", "LSD": "LightSpeedCoin", + "LSDOGE": "LSDoge", "LSETH": "Liquid Staked ETH", "LSK": "Lisk", "LSP": "Lumenswap", @@ -4974,10 +5575,13 @@ "LTK": "LinkToken", "LTNM": "Bitcoin Latinum", "LTO": "LTO Network", + "LTOV1": "LTO Network v1", + "LTOV2": "LTO Network v2", "LTPC": "Lightpaycoin", "LTR": "LogiTron", "LTRBT": "Little Rabbit", "LTS": "Litestar Coin", + "LTT": "LocalTrade", "LTX": "Lattice Token", "LTZ": "Litecoinz", "LUA": "Lua Token", @@ -4986,12 +5590,15 @@ "LUCK": "Lucky Cat", "LUCKY": "Lucky Lion", "LUCKYB": "LuckyBlocks", + "LUCKYSLP": "LuckysLeprecoin", "LUCY": "Lucy", "LUDO": "Ludo", "LUFC": "Leeds United Fan Token", "LUFFY": "Luffy", "LUFFYG": "Luffy G5", "LUFFYOLD": "Luffy", + "LUIGI": "Luigi Inu", + "LULU": "LULU", "LUM": "Illuminates", "LUMA": "LUMA Token", "LUMI": "LUMI Credits", @@ -4999,6 +5606,7 @@ "LUNA": "Terra", "LUNAT": "Lunatics", "LUNC": "Terra Classic", + "LUNCARMY": "LUNCARMY", "LUNCH": "LunchDAO", "LUNE": "Luneko", "LUNES": "Lunes", @@ -5014,8 +5622,10 @@ "LUXY": "Luxy", "LVG": "Leverage Coin", "LVIP": "Limitless VIP", + "LVM": "LakeViewMeta", "LVN": "LivenPay", "LVX": "Level01", + "LWC": "Linework Coin", "LWF": "Local World Forwarders", "LX": "Moonlight", "LXC": "LibrexCoin", @@ -5024,6 +5634,7 @@ "LXTO": "LuxTTO", "LYB": "LyraBar", "LYC": "LycanCoin", + "LYF": "Lillian Token", "LYFE": "Lyfe", "LYK": "Loyakk Vega", "LYL": "LoyalCoin", @@ -5040,14 +5651,18 @@ "LZ": "LaunchZone", "M1": "SupplyShock", "M2O": "M2O Token", + "M87": "MESSIER", "MAC": "MachineCoin", "MADANA": "MADANA", "MADC": "MadCoin", "MADOG": "MarvelDoge", "MAEP": "Maester Protocol", "MAG": "Magnet", + "MAGA": "TRUMP", "MAGIC": "Magic", "MAGICF": "MagicFox", + "MAGICV": "Magicverse", + "MAGIK": "Magik Finance", "MAHA": "MahaDAO", "MAI": "Mindsync", "MAID": "MaidSafe Coin", @@ -5060,6 +5675,7 @@ "MANC": "Mancium", "MANDALA": "Mandala Exchange Token", "MANDOX": "MandoX", + "MANE": "MANE", "MANGA": "Manga Token", "MANNA": "Manna", "MANTA": "Manta Network", @@ -5069,6 +5685,8 @@ "MAPE": "Mecha Morphing", "MAPR": "Maya Preferred 223", "MAPS": "MAPS", + "MAR3": "Mar3 AI", + "MARE": "Mare Finance", "MARGINLESS": "Marginless", "MARI": "MarijuanaCoin", "MARK": "Benchmark Protocol", @@ -5082,7 +5700,9 @@ "MARSUPILAMI": "MARSUPILAMI INU", "MART": "Monart", "MARTK": "Martkist", + "MARU": "marumaruNFT", "MARV": "Marvelous", + "MARVIN": "Marvin", "MARX": "MarX", "MARXCOIN": "MarxCoin", "MARYJ": "MaryJane Coin", @@ -5094,19 +5714,27 @@ "MASTER": "Mastercoin", "MASTERCOIN": "MasterCoin", "MASTERMINT": "MasterMint", + "MASYA": "MASYA", "MAT": "MiniApps", + "MATCH": "Matching Game", "MATE": "Mate", "MATH": "MATH", "MATIC": "Polygon", + "MATICX": "Stader MaticX", "MATPAD": "MaticPad", "MATTER": "AntiMatter", + "MAU": "MAU", "MAV": "Maverick Protocol", + "MAVIA": "Heroes of Mavia", "MAW": "Mountain Sea World", "MAX": "MaxCoin", + "MAXI": "Maximus", "MAXR": "Max Revive", + "MAXX": "MAXX Finance", "MAY": "Theresa May Coin", "MAYACOIN": "MayaCoin", "MAZC": "MyMazzu", + "MAZI": "MaziMatic", "MB": "MineBee", "MB8": "MB8 Coin", "MBASE": "Minebase", @@ -5118,6 +5746,7 @@ "MBIT": "Mbitbooks", "MBL": "MovieBloc", "MBLC": "Mont Blanc", + "MBLK": "Magical Blocks", "MBM": "MobileBridge Momentum", "MBN": "Mobilian Coin", "MBONK": "megaBonk", @@ -5144,17 +5773,20 @@ "MCH": "Meconcash", "MCHC": "My Crypto Heroes", "MCI": "Musiconomi", + "MCLB": "Millennium Club Coin", "MCN": "mCoin", "MCO": "Crypto.com", "MCO2": "Moss Carbon Credit", "MCONTENT": "MContent", "MCP": "My Crypto Play", + "MCPC": "Mobile Crypto Pay Coin", "MCRC": "MyCreditChain", "MCRN": "MacronCoin", "MCRT": "MagicCraft", "MCS": "MCS Token", "MCT": "MyConstant", "MCU": "MediChain", + "MCUSD": "Moola Celo USD", "MCV": "MCV Token", "MDA": "Moeda", "MDAO": "MarsDAO", @@ -5163,6 +5795,7 @@ "MDCL": "Medicalchain", "MDF": "MatrixETF", "MDH": "Telemedicoin", + "MDI": "Medicle", "MDICE": "Multidice", "MDM": "Medium", "MDN": "Modicoin", @@ -5173,6 +5806,7 @@ "MDXH": "Mdex (HECO)", "ME": "All.me", "MEAN": "Meanfi", + "MEB": "Meblox Protocol", "MEC": "MegaCoin", "MED": "Medibloc", "MEDI": "MediBond", @@ -5184,6 +5818,7 @@ "MEED": "Meeds DAO", "MEET": "CoinMeet", "MEETONE": "MEET.ONE", + "MEF": "MEFLEX", "MEFA": "Metaverse Face", "MEGA": "MegaFlash", "MEGABOT": "Megabot", @@ -5192,12 +5827,16 @@ "MELD": "Melodity", "MELI": "Meli Games", "MELLO": "Mello Token", + "MELO": "Melo Token", "MELOS": "Melos Studio", "MELT": "Defrost Finance", "MEM": "Memecoin", "MEME": "Memecoin", "MEMEAI": "Meme Ai", + "MEMEETF": "Meme ETF", "MEMEINU": "Meme Inu", + "MEMEME": "MEMEME", + "MEMEMINT": "MEME MINT", "MEMET": "MEMETOON", "MEMETIC": "Memetic", "MEMORYCOIN": "MemoryCoin", @@ -5231,13 +5870,14 @@ "METAPK": "Metapocket", "METAS": "Metaseer", "METAT": "MetaTrace", + "METAUFO": "MetaUFO", "METAV": "MetaVPad", "METAVIE": "Metavie", "METAX": "MetaverseX", "METEOR": "Meteorite Network", "METER": "Meter Stable", "METFI": "MetFi", - "METH": "Farming Bad", + "METH": "Mantle Staked Ether", "METI": "Metis", "METIS": "Metis Token", "METM": "MetaMorph", @@ -5249,17 +5889,22 @@ "MEX": "MEX", "MEXC": "MEXC Token", "MEXP": "MOJI Experience Points", + "MEZZ": "MEZZ Token", "MF": "MetaFighter", "MF1": "Meta Finance", "MFC": "MFCoin", + "MFET": "MultiFunctional Environmental Token", "MFG": "SyncFab", "MFI": "Marginswap", + "MFO": "Moonfarm Finance", + "MFPS": "Meta FPS", "MFS": "Moonbase File System", "MFT": "Hifi Finance (Old)", "MFUND": "Memefund", "MFX": "MFChain", "MG": "MinerGate Token", "MGAMES": "Meme Games", + "MGAR": "Metagame Arena", "MGD": "MassGrid", "MGG": "MetaGaming Guild", "MGGT": "Maggie Token", @@ -5271,6 +5916,7 @@ "MGT": "Megatech", "MGUL": "Mogul Coin", "MGX": "MargiX", + "MHAM": "Metahamster", "MHC": "MetaHash", "MHLX": "HelixNetwork", "MHP": "MedicoHealth", @@ -5282,11 +5928,14 @@ "MIBO": "miBoodle", "MIBR": "MIBR Fan Token", "MIC": "Mithril Cash", + "MICE": "Mice", + "MICKEY": "Steamboat Willie", "MIDAS": "Midas", "MIDASDOLLAR": "Midas Dollar Share", "MIDN": "Midnight", "MIE": "MIE Network", "MIG": "Migranet", + "MIGMIG": "MigMig Swap", "MIININGNFT": "MiningNFT", "MIKS": "MIKS COIN", "MIL": "Milllionaire Coin", @@ -5296,26 +5945,30 @@ "MILKYWAY": "MilkyWayZone", "MILLI": "Million", "MILO": "Milo Inu", + "MILOCEO": "Milo CEO", "MILOCOIN": "MiloCoin", + "MILODOG": "MILO DOG", "MIM": "Magic Internet Money", "MIMATIC": "MAI", "MIMI": "MIMI Money", "MIMIR": "Mimir", "MIMO": "MIMO Parallel Governance Token", - "MIN": "MINDOL", "MINA": "Mina Protocol", "MINC": "MinCoin", + "MIND": "MINDOL", "MINDCOIN": "MindCoin", "MINDEX": "Mindexcoin", "MINDGENE": "Mind Gene", "MINDS": "Minds", "MINE": "SpaceMine", + "MINERALS": "Minerals Coin", "MINEX": "Minex", "MINI": "Mini", "MINIDOGE": "MiniDOGE", "MINIFOOTBALL": "Minifootball", + "MINIMYRO": "Mini Myro", "MINISHIB": "miniSHIB ETH", - "MINRL": "Minerals Coin", + "MINS": "Minswap", "MINT": "Mint Club", "MINTCOIN": "MintCoin", "MINTME": "MintMe.com Coin", @@ -5340,22 +5993,27 @@ "MITH": "Mithril", "MITX": "Morpheus Infrastructure Token", "MIV": "MakeItViral", + "MIVA": "Minerva Wallet", "MIVRS": "Minionverse", "MIX": "MIXMARVEL", "MIXCOIN": "Mixaverse", "MJT": "MojitoSwap", "MKEY": "MEDIKEY", "MKR": "Maker", + "MKT": "MikeToken", "MKUSD": "Prisma mkUSD", "ML": "Market Ledger", "MLA": "Moola", + "MLD": "MonoLend", "MLGC": "Marshal Lion Group Coin", "MLITE": "MeLite", "MLK": "MiL.k", "MLN": "Enzyme", + "MLNK": "Malinka", "MLS": "CPROP", "MLT": "MIcro Licensing Coin", "MLTC": "MultiWallet Coin", + "MLXC": "Marvellex Classic", "MM": "Millimeter", "MMAI": "MetamonkeyAi", "MMAPS": "MapMetrics", @@ -5367,10 +6025,13 @@ "MMO": "MMOCoin", "MMPRO": "Market Making Pro", "MMS": "Marsverse", + "MMSC": "MMSC PLATFORM", + "MMSS": "MMSS (Ordinals)", "MMT": "Master MIX Token", "MMTM": "Momentum", "MMUI": "MetaMUI", "MMVG": "MEMEVENGERS", + "MMX": "MMX", "MMXIV": "MaieutiCoin", "MMXVI": "MMXVI", "MN": "Cryptsy Mining Contract", @@ -5406,6 +6067,7 @@ "MOAT": "Mother Of All Tokens", "MOB": "MobileCoin", "MOBI": "Mobius", + "MOBIC": "Mobility Coin", "MOBIE": "MobieCoin", "MOBILE": "Helium Mobile", "MOBU": "MOBU", @@ -5414,9 +6076,13 @@ "MOCO": "MoCo", "MOD": "Modefi", "MODA": "MODA DAO", + "MODC": "Modclub", "MODEL": "Model Labs", - "MODEX": "MODEX Token", + "MODEX": "Modex", "MODUM": "Modum", + "MODX": "MODEL-X-coin", + "MOE": "Merchant Moe", + "MOETA": "Moeta", "MOF": "Molecular Future (TRC20)", "MOFI": "MobiFi", "MOFOLD": "Molecular Future (ERC20)", @@ -5444,7 +6110,9 @@ "MONF": "Monfter", "MONG": "MongCoin", "MONG20": "Mongoose 2.0", + "MONGBNB": "MongBNB", "MONI": "Monsta Infinite", + "MONIE": "Infiblue World", "MONK": "Monkey Project", "MONKEY": "Monkey", "MONKEYS": "Monkeys Token", @@ -5453,6 +6121,7 @@ "MONS": "Monsters Clan", "MONST": "Monstock", "MONT": "Monarch Token", + "MONTE": "Monte", "MOO": "MooMonster", "MOOI": "Moonai", "MOOLYA": "moolyacoin", @@ -5461,16 +6130,22 @@ "MOONC": "MoonCoin", "MOOND": "Dark Moon", "MOONDAY": "Moonday Finance", + "MOONED": "MoonEdge", "MOONER": "CoinMooner", "MOONEY": "Moon DAO", + "MOONION": "Moonions", "MOONLIGHT": "Moonlight Token", "MOONSHOT": "Moonshot", + "MOONSTAR": "MoonStar", "MOOO": "Hashtagger", "MOOV": "dotmoovs", "MOOX": "Moox Protocol", "MOPS": "Mops", "MORA": "Meliora", "MORE": "More Coin", + "MOROS": "MOROS NET", + "MORPH": "Morpheus Token", + "MORRA": "Morra", "MORSE": "Morse", "MOS": "MOS Coin", "MOT": "Olympus Labs", @@ -5515,9 +6190,11 @@ "MRN": "Mercoin", "MRNA": "Moderna", "MRP": "MorpheusCoin", + "MRPEPE": "Pepe Potato", "MRS": "Metars Genesis", "MRSA": "MrsaCoin", "MRT": "MinersReward", + "MRUN": "Metarun", "MRV": "Macroverse", "MRX": "Metrix Coin", "MRXB": "Wrapped Metrix", @@ -5526,6 +6203,8 @@ "MSB": "Misbloc", "MSC": "Miningwatchdog Smartchain", "MSD": "MSD", + "MSHD": "MASHIDA", + "MSHIB": "Magic Shiba Starter", "MSN": "Manson Coin", "MSOL": "Marinade Staked SOL", "MSOT": "BTour Chain", @@ -5548,6 +6227,7 @@ "MTG": "MagnetGold", "MTH": "Monetha", "MTHD": "Method Finance", + "MTHN": "MTH Network", "MTK": "Moya Token", "MTL": "Metal", "MTLM3": "Metal Music v3", @@ -5566,6 +6246,7 @@ "MTVT": "Metaverser", "MTX": "Matryx", "MTXLT": "Tixl", + "MTY": "Viddli", "MTZ": "Monetizr", "MU": "Miracle Universe", "MUBI": "Multibit", @@ -5575,9 +6256,12 @@ "MULTIBOT": "Multibot", "MULTIGAMES": "MultiGames", "MULTIV": "Multiverse", + "MUMU": "Mumu", "MUN": "MUNcoin", "MUNCH": "Munch Token", + "MUNITY": "Metahorse Unity", "MURA": "Murasaki", + "MURATIAI": "MuratiAI", "MUSD": "mStable USD", "MUSDCOIN": "MUSDcoin", "MUSE": "Muse DAO", @@ -5589,6 +6273,7 @@ "MUT": "Mutual Coin", "MUTE": "Mute", "MUU": "MilkCoin", + "MUZZ": "MuzzleToken", "MV": "GensoKishi Metaverse", "MVC": "MileVerse", "MVD": "Metavault", @@ -5603,13 +6288,17 @@ "MWAR": "MemeWars (MWAR)", "MWAT": "RED MegaWatt", "MWC": "MimbleWimbleCoin", + "MWCC": "Metaworld", "MX": "MX Token", "MXC": "Machine Xchange Coin", "MXM": "Maximine", + "MXNT": "Tether MXNt", + "MXRP": "Monsta XRP", "MXT": "MixTrust", "MXTC": "MartexCoin", "MXW": "Maxonrow", "MXX": "Multiplier", + "MXZ": "Maximus Coin", "MYB": "MyBit", "MYC": "Mycelium", "MYCE": "MY Ceremonial Event", @@ -5623,6 +6312,8 @@ "MYRA": "Mytheria", "MYRIA": "Myria", "MYRO": "Myro", + "MYRODRAGON": "MYRO DRAGON", + "MYROWIF": "MYROWIF", "MYST": "Mysterium", "MYT": "Mytrade", "MYTH": "Mythos", @@ -5631,6 +6322,8 @@ "MZC": "MazaCoin", "MZG": "Moozicore", "MZK": "Muzika Network", + "MZM": "MetaZooMee", + "MZR": "Mazuri GameFi", "MZX": "Mosaic Network", "N0031": "nYFI", "N1": "NFTify", @@ -5653,6 +6346,7 @@ "NANO": "Nano", "NAOS": "NAOS Finance", "NAP": "Napoli Fan Token", + "NARCO": "Mr. Narco", "NAS": "Nebulas", "NAS2": "Nas2Coin", "NASADOGE": "Nasa Doge", @@ -5669,6 +6363,7 @@ "NAVIB": "Navibration", "NAWA": "Narwhale.finance", "NAX": "NextDAO", + "NAZAR": "NAZAR PROTOCOL", "NBAI": "Nebula AI", "NBAR": "NOBAR", "NBC": "Niobium", @@ -5686,6 +6381,7 @@ "NCASH": "Nucleus Vision", "NCC": "NeuroChain", "NCDT": "Nuco.Cloud", + "NCOP": "NCOP", "NCOV": "CoronaCoin", "NCP": "Newton Coin", "NCR": "Neos Credits", @@ -5711,6 +6407,8 @@ "NEKI": "Neki Token", "NEKO": "The Neko", "NEKOIN": "Nekoin", + "NEMO": "NEMO", + "NEMS": "The Nemesis", "NEO": "NEO", "NEOG": "NEO Gold", "NEOM": "New Earth Order Money", @@ -5718,7 +6416,9 @@ "NEOS": "NeosCoin", "NEPT": "Metanept", "NERD": "Nerd Bot", + "NERO": "Nero Token", "NERVE": "NERVE", + "NESS": "Ness LAB", "NEST": "Nest Protocol", "NESTREE": "Nestree", "NET": "NetCoin", @@ -5729,11 +6429,15 @@ "NETZ1": "NETZERO", "NEU": "Neumark", "NEURALINK": "Neuralink", + "NEUROS": "Shockwaves", + "NEUTR": "Neutrinos", "NEUTRO": "Neutro Protocol", "NEUTRON": "Neutron", "NEVA": "NevaCoin", + "NEVER": "neversol", "NEW": "Newton", "NEWB": "Newbium", + "NEWM": "NEWM", "NEWO": "New Order", "NEWOS": "NewsToken", "NEWS": "NewsTokens", @@ -5779,15 +6483,21 @@ "NIF": "Unifty", "NIFT": "Niftify", "NIFTSY": "Envelop", + "NIHAO": "NiHao", "NII": "nahmii", "NIIFI": "NiiFi", "NIM": "Nimiq", "NIMFA": "Nimfamoney", "NIN": "Next Innovation", + "NINJA": "Dog Wif Nunchucks", + "NINJAZ": "Danketsu", "NINKY": "Ninky", "NINO": "Ninneko", + "NIOB": "Niob Finance", + "NIOCTIB": "nioctiB", "NIOX": "Autonio", "NIT": "Nesten", + "NITO": "Nitroken", "NITRO": "Nitro League", "NITROE": "NitroEX", "NITROG": "Nitro", @@ -5801,6 +6511,8 @@ "NLC": "NoLimitCoin", "NLC2": "NoLimitCoin", "NLG": "Gulden", + "NLINK": "Neuralink", + "NLS": "Nolus", "NLX": "Nullex", "NMB": "Nimbus Coin", "NMC": "Namecoin", @@ -5823,16 +6535,20 @@ "NODL": "Nodle Network", "NOIA": "Syntropy", "NOIZ": "NOIZ", + "NOKA": "Noka Solana AI", "NOKU": "NOKU Master token", + "NOLA": "Nola", "NOM": "Finom NOM Token", "NONE": "None Trading", "NOO": "Noocoin", + "NOOT": "NOOT (Ordinals)", "NOR": "Noir", "NORA": "SnowCrash Token", "NORD": "Nord Finance", "NOS": "Nosana", "NOSN": "nOS", "NOTE": "Notional Finance", + "NOTHING": "NOTHING", "NOV": "Novara Calcio Fan Token", "NOVA": "Nova Finance", "NOW": "NOW Token", @@ -5866,6 +6582,7 @@ "NSD": "Nasdacoin", "NSDX": "NASDEX", "NSFW": "xxxNifty", + "NSK": "NSKSwap", "NSP": "NOMAD.space", "NSR": "NuShares", "NSS": "NSS Coin", @@ -5877,6 +6594,7 @@ "NTBC": "Note Blockchain", "NTC": "NineElevenTruthCoin", "NTCC": "NeptuneClassic", + "NTG": "NEWTOWNGAMING", "NTK": "Neurotoken", "NTM": "NetM", "NTO": "Neton", @@ -5898,14 +6616,17 @@ "NUMI": "Numitor", "NUSD": "Nomin USD", "NUT": "Native Utility Token", + "NUTGV2": "NUTGAIN", "NUTS": "Squirrel Finance", "NUX": "Peanut", "NVA": "Neeva Defi", "NVC": "NovaCoin", "NVDX": "Nodvix", + "NVG": "NightVerse Game", "NVIR": "NvirWorld", "NVL": "Nevula", "NVOY": "Envoy", + "NVS": "Navis", "NVST": "NVO", "NVT": "NerveNetwork", "NVX": "Novax Coin", @@ -5918,6 +6639,7 @@ "NXE": "NXEcoin", "NXM": "Nexus Mutual", "NXMC": "NextMindCoin", + "NXN": "Naxion", "NXRA": "AllianceBlock Nexera", "NXS": "Nexus", "NXT": "Nxt", @@ -5945,14 +6667,18 @@ "OASC": "Oasis City", "OATH": "OATH Protocol", "OAX": "Oax", + "OBI": "Orbofi AI", "OBITS": "Obits Coin", "OBOT": "Obortech", "OBROK": "OBRok", "OBS": "One Basis Cash", "OBSCURE": "Obscurebay", "OBSR": "OBSERVER Coin", + "OBT": "Oobit", "OBX": "OpenBlox", "OC": "OrangeCoin", + "OCAI": "Onchain AI", + "OCAVU": "Ocavu Network Token", "OCB": "BLOCKMAX", "OCC": "OccamFi", "OCE": "OceanEX Token", @@ -5963,6 +6689,7 @@ "OCN": "Odyssey", "OCT": "Octopus Network", "OCTA": "OctaSpace", + "OCTAGON": "POLYDeFI", "OCTAX": "OctaX", "OCTI": "Oction", "OCTO": "OctoFi", @@ -5976,6 +6703,7 @@ "ODMC": "ODMCoin", "ODN": "Obsidian", "ODNT": "Old Dogs New Tricks", + "ODS": "Odesis", "ODX": "ODX Token", "OF": "OFCOIN", "OFBC": "OneFinBank Coin", @@ -5990,6 +6718,7 @@ "OGSP": "OriginSport", "OGT": "One Game", "OGV": "Origin Dollar Governance", + "OGZ": "OGzClub", "OH": "Oh! Finance", "OHM": "Olympus", "OHMV2": "Olympus v2", @@ -6003,11 +6732,14 @@ "OK": "OKCash", "OKB": "OKB", "OKG": "Ookeenga", + "OKINAMI": "Kanagawa Nami", + "OKLP": "OkLetsPlay", "OKOIN": "OKOIN", "OKS": "Oikos", "OKSE": "Okse", "OKT": "OKT Chain", "OLAND": "Oceanland", + "OLAS": "Autonolas", "OLDSF": "OldSafeCoin", "OLE": "OpenLeverage", "OLIVE": "Olive", @@ -6026,6 +6758,7 @@ "OMGC": "OmiseGO Classic", "OMI": "ECOMI", "OMIC": "Omicron", + "OMMI": "Ommniverse", "OMNI": "Omni", "OMNIA": "OmniaVerse", "OMNICRON": "OmniCron", @@ -6057,27 +6790,34 @@ "OOE": "OpenOcean", "OOGI": "OOGI", "OOKI": "Ooki", + "OORC": "Orbit Bridge Klaytn Orbit Chain", "OOT": "Utrum", "OOW": "OPP Open WiFi", "OP": "Optimism", "OPA": "Option Panda Platform", + "OPAIG": "OvalPixel", "OPC": "OP Coin", "OPCT": "Opacity", "OPEN": "Open Platform", "OPENDAO": "OpenDAO", "OPENGO": "OPEN Governance Token", "OPENRI": "Open Rights Exchange", + "OPENX": "OpenSwap Optimism Token", + "OPEPE": "Optimism PEPE", "OPES": "Opes", "OPET": "ÕpetFoundation", "OPEX": "Optherium Token", + "OPHX": "Operation Phoenix", "OPIUM": "Opium", "OPNN": "Opennity", "OPP": "Opporty", "OPS": "Octopus Protocol", "OPSC": "OpenSourceCoin", + "OPSEC": "OpSec", "OPT": "Opus", "OPTC": "Open Predict Token", "OPTCM": "Optimus", + "OPTI": "Optimus AI", "OPTIMOUSE": "Optimouse", "OPTION": "OptionCoin", "OPU": "Opu Coin", @@ -6096,7 +6836,9 @@ "ORCA": "Orca", "ORDI": "Ordinals ", "ORDIFI": "OrdinalsFi", + "ORDS": "Ordiswap", "ORE": "Galactrum", + "OREO": "OreoFi", "ORET": "ORET Token", "ORGA": "Organicco", "ORGT": "Organic Token", @@ -6107,6 +6849,7 @@ "ORM": "ORIUM", "ORME": "Ormeus Coin", "ORN": "Orion Protocol", + "ORNJ": "Orange", "ORO": "Operon Origins", "OROC": "Orocrypt", "OROCOIN": "OroCoin", @@ -6116,22 +6859,30 @@ "ORT": "Omni Real Estate Token", "ORV": "Orvium", "ORYX": "OryxCoin", + "OS": "Ethereans", "OS76": "OsmiumCoin", "OSA": "OSA Token", + "OSAK": "Osaka Protocol", "OSC": "iOscar", "OSF": "One Solution", + "OSHI": "Oshi Token", "OSMO": "Osmosis", "OSQTH": "Opyn Squeeth", + "OSS": "OSSChain", "OST": "OST", "OSWAP": "OpenSwap", + "OT": "Onchain Trade", "OTHR": "OtherDAO", "OTK": "Octokn", "OTN": "Open Trading Network", "OTO": "OTOCASH", + "OTSEA": "OTSea", "OTX": "Octanox", + "OUCHI": "OUCHI", "OUD": "OUD", "OUR": "Our Pay", "OUSD": "Origin Dollar", + "OUSDC": "Orbit Bridge Klaytn USDC", "OUT": "Netscouters", "OVC": "OVCODE", "OVERLORD": "Overlord", @@ -6147,6 +6898,7 @@ "OXBT": "OXBT (Ordinals)", "OXD": "0xDAO", "OXEN": "Oxen", + "OXM": "OXM Protocol", "OXS": "0xS", "OXT": "Orchid Protocol", "OXY": "Oxygen", @@ -6154,7 +6906,9 @@ "OXYC": "Oxycoin", "OYS": "Oyster Platform", "OZG": "Ozagold", + "OZK": "OrdiZK", "OZO": "Ozone Chain", + "OZONE": "Ozone metaverse", "OZP": "OZAPHYRE", "P202": "Project 202", "P2PS": "P2P Solutions Foundation", @@ -6163,6 +6917,7 @@ "PACE": "3space Art", "PACMAN": "Pac Man", "PACOCA": "Pacoca", + "PACT": "impactMarket", "PAD": "NearPad", "PAF": "Pacific", "PAI": "Project Pai", @@ -6173,12 +6928,14 @@ "PALET": "Palette", "PALLA": "Pallapay", "PALM": "PalmPay", + "PAM": "PAM", "PAMP": "PAMP Network", "PAN": "Pantos", "PAND": "Panda Finance", "PANDA": "PandaDAO", "PANDO": "Pando", "PANDOP": "PandoProject", + "PANDORA": "Pandora", "PANGEA": "PANGEA", "PAPADOGE": "Papa Doge", "PAPER": "Dope Wars Paper", @@ -6190,6 +6947,7 @@ "PARAL": "Parallel", "PARALL": "Parallel Finance", "PARANOIA": "ParanoiaCoin", + "PARAS": "Paras", "PARAW": "Para", "PARETO": "Pareto Network Token", "PARI": "Paribus", @@ -6209,12 +6967,16 @@ "PAWTH": "Pawthereum", "PAXEX": "PAXEX", "PAXG": "PAX Gold", + "PAXU": "Pax Unitas", "PAXW": "pax.world", "PAY": "TenX", "PAYB": "Paybswap", "PAYCON": "Paycon", + "PAYN": "PayNet Coin", "PAYP": "PayPeer", + "PAYS": "Payslink", "PAYT": "PayAccept", + "PAYU": "Platform of meme coins", "PAZZI": "Paparazzi", "PBASE": "Polkabase", "PBC": "PabyosiCoin", @@ -6223,9 +6985,11 @@ "PBLK": "PayBlock", "PBQ": "PUBLIQ", "PBR": "PolkaBridge", + "PBRV1": "PolkaBridge v1", "PBT": "Primalbase", "PBTC35A": "pBTC35A", "PBX": "Probinex", + "PBXV1": "Probinex v1", "PC": "Promotion Coin", "PCC": "PCORE", "PCCM": "Poseidon Chain", @@ -6241,7 +7005,9 @@ "PCOIN": "Pioneer Coin", "PCR": "Paycer Protocol", "PCS": "Pabyosi Coin", + "PCSP": "GenomicDao G-Stroke", "PCX": "ChainX", + "PD": "PUDEL", "PDATA": "PDATA", "PDC": "Project Decorum", "PDEX": "Polkadex", @@ -6252,17 +7018,22 @@ "PDT": "ParagonsDAO", "PDX": "PDX Coin", "PEA": "Pea Farm", + "PEACHY": "Peachy", "PEAK": "PEAKDEFI", "PEARL": "Pearl Finance", + "PEAS": "Peapods Finance", "PEC": "PeaceCoin", "PEEL": "Meta Apes", "PEEPA": "Peepa", + "PEEPO": "PEEPO", "PEEPS": "The People’s Coin", + "PEFI": "Penguin Finance", "PEG": "PegNet", "PEGS": "PegShares", "PEIPEI": "PEIPEI", "PEKC": "Peacock Coin", "PEL": "Propel Token", + "PEM": "Pembrock", "PENC": "PenCoin", "PENDLE": "Pendle", "PENG": "PENG", @@ -6270,21 +7041,34 @@ "PENTA": "Penta", "PEOPLE": "ConstitutionDAO", "PEOS": "pEOS", + "PEPC": "Pepe Classic", "PEPE": "Pepe", "PEPE20": "Pepe 2.0", "PEPEAI": "Pepe Analytics", + "PEPEARMY": "PEPEARMY", + "PEPEBRC": "PEPE (Ordinals)", + "PEPEBURN": "Pepeburn", "PEPECASH": "Pepe Cash", "PEPECEO": "REAL PEPE CEO", + "PEPED": "PepeDAO Coin", + "PEPEDAO": "PEPE DAO", "PEPEDERP": "PepeDerp", + "PEPEF": "PEPEFLOKI", + "PEPEGA": "Pepe GEM AI", "PEPEGAINS": "PepeGains", "PEPEGRINCH": "Pepe Grinch", "PEPEINU": "PEPE inu", "PEPEKING": "PEPEKING", + "PEPEMO": "PepeMo", "PEPEPI": "PEPEPi", + "PEPERA": "PEPERA", + "PEPEX": "pepeX", "PEPEZILLA": "PEPEZilla", + "PEPPA": "PEPPA", "PEPPER": "Pepper Token", "PEPS": "PEPS Coin", "PEPURAI": "PEPURAI", + "PEPVERS": "PepVerse", "PERA": "Pera Finance", "PERC": "Perion", "PERI": "PERI Finance", @@ -6308,6 +7092,7 @@ "PFR": "PayFair", "PFT": "Pitch Finance Token", "PFY": "Portify", + "PG": "Pepe Grow", "PGALA": "pGALA", "PGC": "Pegascoin", "PGF7T": "PGF500", @@ -6341,6 +7126,7 @@ "PHS": "PhilosophersStone", "PHT": "Photon Token", "PHTC": "Photochain", + "PHTR": "Phuture", "PHV": "PATHHIVE", "PHX": "Phoenix Finance", "PI": "Plian", @@ -6357,6 +7143,7 @@ "PIKACHU": "Pikachu Inu", "PILOT": "Unipilot", "PIN": "Pin", + "PINCHI": "Da Pinchi", "PING": "CryptoPing", "PINK": "PinkCoin", "PINKX": "PantherCoin", @@ -6370,6 +7157,7 @@ "PIPL": "PiplCoin", "PIPT": "Power Index Pool Token", "PIRATE": "PirateCash", + "PIRI": "Pirichain", "PIRL": "Pirl", "PIS": "Polkainsure Finance", "PIST": "Pist Trust", @@ -6377,7 +7165,8 @@ "PITCH": "PITCH", "PIVX": "Private Instant Verified Transaction", "PIX": "Lampix", - "PIXEL": "PixelVerse", + "PIXEL": "Pixels", + "PIXELV": "PixelVerse", "PIZA": "Half Pizza", "PIZZA": "PizzaSwap", "PIZZACOIN": "PizzaCoin", @@ -6425,8 +7214,10 @@ "PLQ": "Planq", "PLR": "Pillar", "PLS": "Pulsechain", + "PLSARB": "Plutus ARB", "PLSD": "PulseDogecoin", "PLSPAD": "PulsePad", + "PLSRDNT": "Plutus RDNT", "PLSX": "PulseX", "PLT": "Poollotto.finance", "PLTC": "PlatonCoin", @@ -6439,16 +7230,21 @@ "PLUS1": "PlusOneCoin", "PLUTUS": "PlutusDAO", "PLX": "PlexCoin", + "PLXY": "Plxyer", "PLY": "Aurigami", "PMA": "PumaPay", + "PME": "DogePome", "PMEER": "Qitmeer", "PMG": "Pomerium Ecosystem Token", "PMGT": "Perth Mint Gold Token", "PMNT": "Paymon", "PMON": "Polkamon", + "PMPY": "Prometheum Prodigy", "PMTN": "Peer Mountain", "PNC": "PlatiniumCoin", "PND": "PandaCoin", + "PNDC": "Pond Coin", + "PNDR": "Pandora Finance", "PNFT": "Pawn My NFT", "PNG": "Pangolin", "PNGN": "SpacePenguin", @@ -6467,6 +7263,7 @@ "PODIUM": "Smart League", "POE": "Po.et", "POG": "PolygonumOnline", + "POGAI": "POGAI", "POINTS": "Cryptsy Points", "POK": "Pokmonsters", "POKEM": "Pokemonio", @@ -6493,10 +7290,13 @@ "POLYX": "Polymesh", "PON": "Ponder", "POND": "Marlin", + "PONKE": "Ponke", "PONYO": "Ponyo Impact", "PONZU": "Ponzu Inu", "POO": "POOMOON", + "POOCOIN": "PooCoin", "POODL": "Poodl", + "POOH": "POOH", "POOL": "PoolTogether", "POOLX": "Poolz Finance", "POOLXT": "Pool-X", @@ -6505,7 +7305,9 @@ "POP!": "POP", "POPC": "PopChest", "POPCAT": "Popcat", + "POPE": "Popecoin", "POPK": "POPKON", + "POPO": "popo", "POPSICLE": "Popsicle Finance", "POR": "Portugal National Team Fan Token", "PORK": "PepeFork", @@ -6515,6 +7317,7 @@ "PORTAL": "Portal", "PORTO": "FC Porto", "PORTU": "Portuma", + "PORTX": "ChainPort", "POS": "PoSToken", "POSEX": "PosEx", "POSI": "Position Token", @@ -6524,6 +7327,7 @@ "POSTC": "PostCoin", "POT": "PotCoin", "POTS": "Moonpot", + "POTTER": "POTTER", "POWELL": "Jerome Powell", "POWER": "UniPower", "POWR": "Power Ledger", @@ -6534,6 +7338,8 @@ "PPBLZ": "Pepemon Pepeballs", "PPC": "PeerCoin", "PPI": "Primpy", + "PPIZZA": "P Pizza", + "PPL": "Pink Panther Lovers", "PPN": "Puppies Network", "PPOVR": "POVR", "PPP": "PayPie", @@ -6551,8 +7357,10 @@ "PRDX": "ParamountDax Token", "PRE": "Presearch", "PREM": "Premium", + "PREME": "PREME Token", "PREMIA": "Premia", "PRES": "President Trump", + "PRESALE": "Presale.World", "PRFT": "Proof Suite Token", "PRG": "Paragon", "PRI": "PRIVATEUM INITIATIVE", @@ -6565,6 +7373,7 @@ "PRINTERIUM": "Printerium", "PRINTS": "FingerprintsDAO", "PRISM": "Prism", + "PRISMA": "Prisma Finance", "PRIX": "Privatix", "PRL": "Oyster Pearl", "PRM": "PrismChain", @@ -6582,6 +7391,7 @@ "PROPS": "Props", "PROS": "Prosper", "PROT": "PROT", + "PROTEO": "Proteo DeFi", "PROTO": "Protocon", "PROTON": "Proton", "PROUD": "PROUD Money", @@ -6616,13 +7426,18 @@ "PST": "Primas", "PSTAKE": "pSTAKE Finance", "PSTN": "Piston", + "PSUB": "Payment Swap Utility Board", "PSWAP": "Polkaswap", "PSY": "PsyOptions", + "PSYOP": "PSYOP", + "PT": "Phemex", "PTA": "PentaCoin", + "PTAS": "La Peseta", "PTC": "PesetaCoin", "PTD": "Pilot", "PTERIA": "Pteria", "PTF": "PowerTrade Fuel", + "PTH": "PlasticHero", "PTI": "Paytomat", "PTN": "PalletOneToken", "PTO": "Patentico", @@ -6645,6 +7460,7 @@ "PURA": "Pura", "PURE": "Puriever", "PUREALT": "Pure", + "PURSE": "Pundi X PURSE", "PUSD": "PegsUSD", "PUSH": "Ethereum Push Notification Service", "PUSHI": "Pushi", @@ -6684,6 +7500,7 @@ "PYUSD": "PayPal USD", "PZM": "Prizm", "PZP": "PlayZap", + "PZT": "Pizon", "Q1S": "Quantum1Net", "Q2C": "QubitCoin", "QA": "Quantum Assets", @@ -6705,12 +7522,15 @@ "QCN": "Quazar Coin", "QCO": "Qravity", "QCX": "QuickX Protocol", + "QDC": "Quadrillion Coin", + "QDT": "QCHAIN", "QDX": "Quidax", "QFI": "QFinance", "QI": "BENQI", "QIE": "QI Blockchain", "QISWAP": "QiSwap", "QKC": "QuarkChain", + "QKNTL": "Quick Intel", "QLC": "Kepple [OLD]", "QLINDO": "QLINDO", "QMALL": "QMALL TOKEN", @@ -6725,6 +7545,7 @@ "QQBC": "QQBC IPFS BLOCKCHAIN", "QQQ": "Poseidon Network", "QQQF": "Standard Crypto Fund", + "QR": "Qrolli", "QRDO": "Qredo", "QRK": "QuarkCoin", "QRL": "Quantum Resistant Ledger", @@ -6737,6 +7558,7 @@ "QTCON": "Quiztok", "QTF": "Quantfury", "QTL": "Quatloo", + "QTO": "QToken", "QTUM": "QTUM", "QTZ": "Quartz", "QUA": "Quantum Tech", @@ -6752,6 +7574,7 @@ "QUICK": "Quickswap", "QUICKOLD": "Quickswap", "QUIDD": "Quidd", + "QUIN": "QUINADS", "QUINT": "Quint", "QUIZ": "Quizando", "QUROZ": "Qfora", @@ -6760,18 +7583,24 @@ "QWAN": "The QWAN", "QWARK": "Qwark", "QWC": "Qwertycoin", + "QXC": "QuantumXC", "R1": "Recast1", + "R2R": "CitiOs", "R34P": "R34P", "R3FI": "r3fi.finance", + "R3T": "Real Estate Token", + "RAB": "Rabbit", "RABBIT": "Rabbit Finance", "RAC": "RAcoin", "RACA": "Radio Caca", "RACEFI": "RaceFi", + "RACING": "Racing Club Fan Token", "RAD": "Radworks", "RADAR": "DappRadar", "RADI": "RadicalCoin", "RADIO": "RadioShack", "RADR": "CoinRadr", + "RAFT": "Raft", "RAGE": "Rage Fan", "RAI": "Rai Reflex Index", "RAIDER": "Crypto Raiders", @@ -6782,9 +7611,12 @@ "RAINC": "RainCheck", "RAINI": "Rainicorn", "RAISE": "Raise Token", + "RAIT": "Rabbitgame", "RAIZER": "RAIZER", + "RAKE": "Rake Coin", "RAKU": "RAKUN", "RAM": "Ramifi Protocol", + "RAMA": "Ramestta", "RAMP": "RAMP", "RANKER": "RankerDao", "RAP": "Philosoraptor", @@ -6829,6 +7661,7 @@ "RCCC": "RCCC", "RCG": "Recharge", "RCH": "Rich", + "RCM": "READ2N", "RCN": "Ripio", "RCOIN": "RCoin", "RCT": "RealChain", @@ -6836,6 +7669,9 @@ "RD": "Round Dollar", "RDC": "Ordocoin", "RDD": "Reddcoin", + "RDEX": "Orders.Exchange", + "RDF": "ReadFi", + "RDGX": "R-DEE Protocol", "RDN": "Raiden Network Token", "RDNT": "Radiant Capital", "RDPX": "Dopex Rebate Token", @@ -6844,6 +7680,7 @@ "RDT": "Ridotto", "RDX": "Redux Protocol", "REA": "Realisto", + "REACH": "/Reach", "REAL": "RealLink", "REALM": "Realm", "REALMS": "Realms of Ethernity", @@ -6851,6 +7688,7 @@ "REALY": "Realy Metaverse", "REAP": "ReapChain", "REBL": "REBL", + "REBUS": "Rebuschain", "REC": "Rec Token (REC)", "RECKOON": "Reckoon", "RECOM": "Recom", @@ -6861,7 +7699,9 @@ "REDI": "REDi", "REDLANG": "RED", "REDLC": "Redlight Chain", + "REDLUNA": "Redluna", "REDN": "Reden", + "REDPEPE": "Red Pepe", "REE": "ReeCoin", "REEF": "Reef", "REELT": "Reel Token", @@ -6890,6 +7730,7 @@ "RENC": "RENC", "RENDOGE": "renDOGE", "RENE": "Renewable Energy", + "RENQ": "Renq Finance", "RENS": "Rens", "RENTBE": "Rentberry", "REP": "Augur", @@ -6899,12 +7740,15 @@ "RES": "Resistance", "REST": "Restore", "RET": "RealTract", + "RETA": "Realital Metaverse", "RETAIL": "Retail.Global", "RETH": "Rocket Pool ETH", "RETH2": "rETH2", "RETIRE": "Retire Token", "REU": "REUCOIN", + "REUNI": "Reunit Wallet", "REV": "Revain", + "REV3L": "REV3AL", "REVA": "Revault Network", "REVE": "Revenu", "REVO": "Revomon", @@ -6916,6 +7760,8 @@ "REX": "Imbrex", "RF": "Raido Financial", "RFCTR": "Reflector.Finance", + "RFD": "RefundCoin", + "RFDB": "Refund", "RFG": "Refugees Token", "RFI": "reflect.finance", "RFL": "RAFL", @@ -6924,6 +7770,7 @@ "RFT": "Rangers Fan Token", "RFUEL": "Rio DeFi", "RGC": "RG Coin", + "RGOLD": "Royal Gold", "RGP": "Rigel Protocol", "RGT": "Rari Governance Token", "RHEA": "Rhea", @@ -6931,6 +7778,8 @@ "RHINOMARS": "RhinoMars", "RHOC": "RChain", "RHP": "Rhypton Club", + "RIA": "aRIA Currency", + "RIB": "Ribus", "RIC": "Riecoin", "RICE": "RiceFarm", "RICECOIN": "RiceCoin", @@ -6942,10 +7791,12 @@ "RIFI": "Rikkei Finance", "RIGEL": "Rigel Finance", "RIL": "Rilcoin", + "RIM": "MetaRim", "RIMBIT": "Rimbit", "RIN": "Aldrin", "RING": "Darwinia Network", "RINGX": "RING X PLATFORM", + "RINIA": "Rinia Inu", "RINU": "Raichu Inu", "RIO": "Realio Network", "RIP": "Fantom Doge", @@ -6959,6 +7810,7 @@ "RITE": "ritestream", "RITO": "Ritocoin", "RIYA": "Etheriya", + "RJV": "Rejuve.AI", "RKC": "Royal Kingdom Coin", "RKI": "RAKHI", "RKN": "RAKON", @@ -6977,46 +7829,57 @@ "RMRK": "RMRK.app", "RMS": "Resumeo Shares", "RMT": "SureRemit", + "RMV": "Reality Metaverse", "RNB": "Rentible", "RNBW": "Rainbow Token", "RNC": "ReturnCoin", "RND": "The RandomDAO", "RNDR": "Render Token", + "RNDX": "Round X", "RNS": "RenosCoin", "RNT": "OneRoot Network", "RNTB": "BitRent", "RNX": "ROONEX", "ROAD": "ROAD", "ROAR": "Alpha DEX", + "ROB": "ROB", "ROBET": "RoBet", "ROC": "Rasputin Online Coin", "ROCK": "Bedrock", "ROCK2": "Ice Rock Mining", + "ROCKET": "Team Rocket", "ROCKETCOIN": "RocketCoin", "ROCKI": "Rocki", + "ROCKY": "Rocky", "ROCO": "ROCO FINANCE", "ROE": "Rover Coin", "ROG": "ROGin AI", "ROI": "ROIcoin", "ROK": "Rockchain", + "ROKO": "Roko", "ROLS": "RollerSwap", "RONALDINHO": "Ronaldinho Soccer Coin", "RONCOIN": "RON", + "ROND": "ROND", "RONIN": "Ronin", + "ROO": "Lucky Roo", "ROOBEE": "ROOBEE", "ROOK": "KeeperDAO", "ROOM": "OptionRoom", - "ROOT": "RootCoin", + "ROOT": "The Root Network", + "ROOTCOIN": "RootCoin", "ROOTS": "RootProject", "ROS": "ROS Coin", "ROSE": "Oasis Labs", "ROSN": "Roseon Finance", + "ROSX": "Roseon", "ROT": "Rotten", "ROTTY": "ROTTYCOIN", "ROUND": "RoundCoin", "ROUP": "Roup (Ordinals)", "ROUSH": "Roush Fenway Racing Fan Token", "ROUTE": "Router Protocol", + "ROW": "Rage On Wheels", "ROWAN": "Sifchain", "ROX": "Robotina", "ROYA": "Royale", @@ -7037,6 +7900,7 @@ "RRC": "Recycling Regeneration Chain", "RRT": "Recovery Right Tokens", "RSC": "ResearchCoin", + "RSETH": "Kelp DAO Restaked ETH", "RSF": "Royal Sting", "RSIN": "Roketsin", "RSR": "Reserve Rights", @@ -7069,11 +7933,13 @@ "RUSH": "RUSH COIN", "RUST": "RustCoin", "RUSTBITS": "Rustbits", + "RUUF": "RuufCoin", "RUX": "Gacrux NFT", "RVC": "Revenue Coin", "RVF": "RocketX exchange", "RVLNG": "RevolutionGames", "RVLT": "Revolt 2 Earn", + "RVM": "Realvirm", "RVN": "Ravencoin", "RVO": "AhrvoDEEX", "RVP": "Revolution Populi", @@ -7086,17 +7952,21 @@ "RWN": "Rowan Token", "RWS": "Robonomics Web Services", "RXD": "Radiant", + "RXO": "RocketXRP Official", "RXT": "RIMAUNANGIS", "RYC": "RoyalCoin", "RYCN": "RoyalCoin 2.0", + "RYIU": "RYI Unity", "RYO": "Ryo", "RYOMA": "Ryoma", "RYOSHI": "Ryoshis Vision", "RYZ": "Anryze", "RZR": "RazorCoin", + "RedFlokiCEO": "Red Floki CEO", "S2K": "Sports 2K75", "S4F": "S4FE", "S8C": "S88 Coin", + "SABAI": "Sabai Ecoverse", "SABLE": "Sable Finance", "SABR": "SABR Coin", "SAC1": "Sable Coin", @@ -7113,11 +7983,13 @@ "SAFES": "SafeSwap", "SAFESTAR": "Safe Star", "SAFEX": "SafeExchangeCoin", + "SAFTP": "Simple Agreement for Future Tokens", "SAFUU": "SAFUU", "SAGA": "SagaCoin", "SAI": "SAI", "SAIL": "SAIL", "SAITA": "SaitaChain", + "SAITABIT": "SaitaBit", "SAITAMA": "Saitama Inu", "SAITAMAV1": "Saitama v1", "SAITANOBI": "Saitanobi", @@ -7145,9 +8017,11 @@ "SANTOS": "Santos FC Fan Token", "SAO": "Sator", "SAP": "SwapAll", + "SAPE": "SolanaApe", "SAPP": "Sapphire", "SAR": "Saren", "SARCO": "Sarcophagus", + "SAROS": "Saros", "SAS": "Stand Share", "SASHIMI": "Sashimi", "SAT": "Satisfaction Token", @@ -7159,15 +8033,21 @@ "SATX": "SatoExchange Token", "SAUBER": "Alfa Romeo Racing ORLEN Fan Token", "SAUCE": "SaucerSwap", + "SAUCEINU": "SAUCEINU", + "SAUDIBONK": "Saudi Bonk", + "SAUDIPEPE": "SAUDI PEPE", "SAUNA": "SaunaFinance Token", "SAV3": "SAV3", "SAVG": "SAVAGE", + "SAVM": "SatoshiVM", "SB": "DragonSB", "SBA": "simplyBrand", + "SBABE": "SNOOPYBABE", "SBC": "StableCoin", "SBCC": "Smart Block Chain City", "SBE": "Sombe", "SBGO": "Bingo Share", + "SBOX": "SUIBOXER", "SBR": "Saber", "SBRT": "SaveBritney", "SBSC": "Subscriptio", @@ -7187,9 +8067,11 @@ "SCHO": "Scholarship Coin", "SCIA": "Stem Cell", "SCIX": "Scientix", + "SCK": "Space Corsair Key", "SCL": "Sociall", "SCLP": "Scallop", "SCN": "Swiscoin", + "SCNR": "Swapscanner", "SCNSOL": "Socean Staked Sol", "SCO": "SCOPE", "SCOIN": "ShinCoin", @@ -7209,6 +8091,7 @@ "SCRPT": "ScryptCoin", "SCRT": "Secret", "SCRYPTA": "Scrypta", + "SCS": "Solcasino Token", "SCT": "ScryptToken", "SCTK": "SharesChain", "SCY": "Synchrony", @@ -7220,8 +8103,10 @@ "SDEX": "SmarDex", "SDL": "Saddle Finance", "SDN": "Shiden Network", + "SDO": "TheSolanDAO", "SDOG": "Small Doge", "SDOGE": "SpaceXDoge", + "SDOPE": "SHIBADOGEPEPE", "SDP": "SydPakCoin", "SDRN": "Senderon", "SDS": "Alchemint Standards", @@ -7236,16 +8121,20 @@ "SEC": "SecureCryptoPayments", "SECO": "Serum Ecosystem Token", "SECRT": "SecretCoin", + "SECT": "SECTBOT", "SEED": "Superbloom", "SEEDS": "SeedShares", "SEEDV": "Seed Venture", + "SEEDX": "SEEDx", "SEELE": "Seele", "SEEN": "SEEN", "SEER": "SEER", + "SEFA": "Mesefa", "SEI": "Sei", "SEILOR": "Kryptonite", "SEL": "SelenCoin", "SELF": "SELFCrypto", + "SELLC": "Sell Token", "SEM": "Semux", "SEN": "Sentaro", "SENATE": "SENATE", @@ -7260,18 +8149,26 @@ "SEOS": "Smart Eye Operating System", "SEPA": "Secure Pad", "SEQ": "Sequence", + "SER": "Secretum", "SERG": "Seiren Games Network", "SERO": "Super Zero", + "SERP": "Shibarium Perpetuals", + "SERSH": "Serenity Shield", "SERV": "Serve", "SESSIA": "SESSIA", "SETH": "sETH", "SETH2": "sETH2", "SETHER": "Sether", "SETS": "Sensitrust", + "SEX": "SEX Odyssey", + "SEXY": "EthXY", + "SFARM": "SolFarm", "SFC": "Solarflarecoin", + "SFCP": "SF Capital", "SFD": "SafeDeal", "SFG": "S.Finance", "SFI": "Saffron.finance", + "SFIT": "Sense4FIT", "SFL": "Sunflower Land", "SFLOKI": "SuiFloki-Inu", "SFM": "SafeMoon V2", @@ -7279,6 +8176,8 @@ "SFR": "SaffronCoin", "SFRC": "Safari Crush", "SFT": "SportsFix", + "SFTMX": "Stader sFTMX", + "SFTY": "Stella Fantasy", "SFU": "Saifu", "SFUEL": "SparkPoint Fuel", "SFUND": "Seedify.fund", @@ -7299,32 +8198,48 @@ "SHACK": "Shackleford", "SHACOIN": "Shacoin", "SHADE": "ShadeCoin", + "SHAK": "Shakita Inu", "SHAKE": "Spaceswap SHAKE", "SHAMAN": "Shaman King Inu", + "SHAN": "Shanum", + "SHANG": "Shanghai Inu", "SHARD": "ShardCoin", "SHARE": "Seigniorage Shares", "SHARECHAIN": "ShareChain", "SHARES": "shares.finance", "SHARPE": "Sharpe Capital", + "SHAUN": "SHAUN INU", "SHB4": "Super Heavy Booster 4", "SHD": "ShardingDAO", + "SHDW": "Shadow Token", "SHE": "Shine Chain", + "SHEB": "SHEBOSHIS", "SHEEESH": "Secret Gem", "SHEESH": "Sheesh it is bussin bussin", "SHEESHA": "Sheesha Finance", "SHEI": "SheikhSolana", "SHELL": "Shell Token", + "SHEN": "Shen", + "SHEPE": "Shiba V Pepe", "SHERA": "Shera Tokens", + "SHEZMU": "Shezmu", "SHFL": "SHUFFLE!", "SHFT": "Shyft Network", "SHI": "Shirtum", "SHIA": "Shiba Saga", "SHIB": "Shiba Inu", "SHIB05": "Half Shiba Inu", + "SHIB2": "SHIB2", "SHIBACASH": "ShibaCash", + "SHIBAI": "AiShiba", + "SHIBAKEN": "Shibaken Finance", "SHIBAMOM": "Shiba Mom", + "SHIBCEO": "ShibCEO", "SHIBDOGE": "ShibaDoge", "SHIBELON": "ShibElon", + "SHIBEMP": "Shiba Inu Empire", + "SHIBL": "ShibLa", + "SHIBLITE": "Shiba Lite", "SHIBMERICAN": "Shibmerican", "SHIBO": "ShiBonk", "SHIBTC": "Shibabitcoin", @@ -7335,16 +8250,20 @@ "SHIH": "Shih Tzu", "SHILL": "SHILL Token", "SHILLD": "SHILLD", + "SHINA": "Shina Inu", "SHINJA": "Shibnobi", + "SHINT": "Shiba Interstellar", "SHIP": "ShipChain", "SHIRYOINU": "Shiryo-Inu", "SHIT": "I will poop it NFT", + "SHK": "Shrike", "SHL": "Oyster Shell", "SHLD": "ShieldCoin", "SHND": "StrongHands", "SHO": "Showcase Token", "SHOE": "ShoeFy", "SHON": "ShonToken", + "SHOOTER": "Top Down Survival Shooter", "SHOP": "Shoppi Coin", "SHOPX": "Splyt", "SHORTY": "ShortyCoin", @@ -7357,6 +8276,8 @@ "SHROOM": "Shroom.Finance", "SHROOMFOX": "Magic Shroom", "SHS": "SHEESH", + "SHUB": "SimpleHub", + "SHVR": "Shivers", "SHX": "Stronghold Token", "SHYTCOIN": "ShytCoin", "SI": "Siren", @@ -7380,10 +8301,14 @@ "SILKT": "SilkChain", "SILLY": "Silly Dragon", "SILO": "Silo Finance", + "SILV2": "Escrowed Illuvium 2", "SILVA": "Silva Token", "SILVERWAY": "Silverway", + "SIMP": "SO-COL", "SIMPLE": "SimpleChain", + "SIMPSON": "Homer", "SIMPSON6900": "Simpson6900 ", + "SIMPSONSINU": "The Simpsons Inu", "SIN": "Sinverse", "SINE": "Sinelock", "SINGLE": "Single Finance", @@ -7391,19 +8316,26 @@ "SINX": "SINX Token", "SIP": "Space SIP", "SIPHER": "Sipher", + "SIPHON": "Siphon Life Spell", "SIS": "Symbiosis Finance", "SISA": "Strategic Investments in Significant Areas", "SISHI": "Sishi Finance", + "SIV": "Sivasspor Token", "SIX": "SIX Network", + "SIZ": "Sizlux", + "SIZE": "SIZE", "SJCX": "StorjCoin", "SKB": "SkullBuzz", "SKC": "Skeincoin", + "SKCS": "Staked KCS", "SKEB": "Skeb", "SKET": "Sketch coin", "SKEY": "SmartKey", "SKI": "Skillchain", + "SKIBIDI": "Skibidi Toilet", "SKILL": "CryptoBlades", "SKIN": "Skincoin", + "SKINS": "Coins & Skins", "SKL": "SKALE Network", "SKLAY": "sKLAY", "SKM": "Skrumble Network", @@ -7432,6 +8364,7 @@ "SLING": "Sling Coin", "SLINK": "Soft Link", "SLM": "SlimCoin", + "SLN": "Smart Layer Network", "SLND": "Solend", "SLNV2": "SLNV2", "SLOKI": "Super Floki", @@ -7450,6 +8383,7 @@ "SMARTB": "Smart Coin", "SMARTCREDIT": "SmartCredit Token", "SMARTLOX": "SmartLOX", + "SMARTMEME": "SmartMEME", "SMARTNFT": "SmartNFT", "SMARTO": "smARTOFGIVING", "SMARTSHARE": "Smartshare", @@ -7465,20 +8399,27 @@ "SMG": "Smaugs NFT", "SMI": "SafeMoon Inu", "SMILE": "Smile Token", + "SMILEY": "SMILEY", "SML": "Saltmarble", "SMLY": "SmileyCoin", + "SMOG": "Smog", "SMOKE": "Smoke", + "SMOL": "Smolcoin", "SMON": "StarMon", "SMOON": "SaylorMoon", "SMPF": "SMP Finance", "SMPL": "SMPL Foundation", "SMR": "Shimmer", "SMRAT": "Secured MoonRat", + "SMRT": "SmartMoney", "SMSR": "Samsara Coin", "SMT": "SmartMesh", "SMTF": "SmartFi", "SMTY": "Smoothy", + "SMU": "SafeMoneyUP", + "SMUDCAT": "Smudge Cat", "SNACK": "Crypto Snack", + "SNAIL": "SnailBrook", "SNAP": "SnapEx", "SNB": "SynchroBitcoin", "SNC": "SunContract", @@ -7493,6 +8434,7 @@ "SNK": "Snake Token", "SNL": "Sport and Leisure", "SNM": "SONM", + "SNN": "SeChain", "SNOB": "Snowball", "SNOOP": "SnoopDAO", "SNOV": "Snovio", @@ -7501,6 +8443,7 @@ "SNPS": "Snaps", "SNRG": "Synergy", "SNS": "Synesis One", + "SNST": "Smooth Network Solutions Token", "SNT": "Status Network Token", "SNTR": "Silent Notary", "SNTVT": "Sentivate", @@ -7509,19 +8452,26 @@ "SOAK": "Soak Token", "SOAR": "Soarcoin", "SOBA": "SOBA Token", + "SOBB": "SoBit", + "SOBER": "Solabrador", "SOC": "All Sports Coin", "SOCC": "SocialCoin", + "SOCCER": "SoccerInu", "SOCKS": "Unisocks", + "SOCOLA": "SOCOLA INU", "SODA": "SODA Coin", "SODO": "Scooby Doo", "SOFI": "RAI Finance", + "SOHOT": "SOHOTRN", "SOIL": "SoilCoin", "SOJ": "Sojourn Coin", "SOKU": "Soku Swap", "SOL": "Solana", "SOLA": "Sola", + "SOLAMA": "Solama", "SOLAR": "Solar", "SOLARDAO": "Solar DAO", + "SOLARE": "Solareum", "SOLARFARM": "SolarFarm", "SOLARIX": "SOLARIX", "SOLE": "SoleCoin", @@ -7537,11 +8487,14 @@ "SONAR": "SonarWatch", "SONG": "Song Coin", "SONIC": "Sonic", + "SONICO": "Sonic", "SOON": "Soonaverse", "SOONCOIN": "SoonCoin", "SOP": "SoPay", + "SOR": "Sorcery", "SORA": "Sora Validator Token", "SOSNOVKINO": "Sosnovkino", + "SOT": "Soccer Crypto", "SOTA": "SOTA Finance", "SOUL": "Phantasma", "SOULS": "Soulsaver", @@ -7556,6 +8509,7 @@ "SPACE": "Spacelens", "SPACECOIN": "SpaceCoin", "SPACEPI": "SpacePi", + "SPAI": "Starship AI", "SPAIN": "SpainCoin", "SPANK": "SpankChain", "SPARKO": "Sparko", @@ -7573,9 +8527,11 @@ "SPELLFIRE": "Spellfire", "SPEND": "Spend", "SPENDC": "SpendCoin", + "SPEX": "StepEx", "SPF": "SportyCo", "SPFC": "São Paulo FC Fan Token", "SPG": "Space Crypto", + "SPGBB": "SPGBB", "SPH": "Spheroid Universe", "SPHR": "Sphere Coin", "SPHRI": "Spherium", @@ -7584,9 +8540,11 @@ "SPI": "Shopping.io", "SPICE": "Spice", "SPIDER": "Spider Man", + "SPIDEY": "Spidey", "SPIKE": "Spiking", "SPIN": "SPIN Protocol", "SPIRIT": "SpiritSwap", + "SPIZ": "SPACE-iZ", "SPK": "SparksPay", "SPKL": "SpokLottery", "SPKTR": "Ghost Coin", @@ -7597,10 +8555,13 @@ "SPO": "Spores Network", "SPOK": "Spock", "SPOL": "Starterpool", + "SPONGE": "Sponge", + "SPOODY": "Spoody Man", "SPOOL": "Spool DAO Token", "SPORE": "Enoki Finance", "SPORT": "SportsCoin", "SPOTS": "Spots", + "SPOX": "Sports Future Exchange Token", "SPRKL": "Sparkle Loyalty", "SPRT": "Sportium", "SPRTS": "Sprouts", @@ -7608,6 +8569,7 @@ "SPS": "Splinterlands", "SPT": "SPECTRUM", "SPUME": "Spume", + "SPURDO": "spurdo", "SPURS": "Tottenham Hotspur Fan Token", "SPWN": "Bitspawn", "SPX": "SPX6900", @@ -7617,15 +8579,18 @@ "SQG": "Squid Token", "SQL": "Squall Coin", "SQR": "Magic Square", + "SQTS": "Sqts (Ordinals)", "SQUATCH": "SASQUATCH", "SQUAWK": "Squawk", "SQUEEZER": "Squeezer", "SQUID": "Squid Game", + "SQUID2": "Squid Game 2.0", "SQUIDGROW": "SquidGrow", "SRBP": "Super Rare Ball Potion", "SRC": "SecureCoin", "SRCOIN": "SRCoin", "SREUR": "SocialRemit", + "SRG": "Street Runner NFT", "SRK": "SparkPoint", "SRLTY": "SaitaRealty", "SRM": "Serum", @@ -7638,10 +8603,13 @@ "SS": "Sharder", "SSC": "SelfSell", "SSD": "Sonic Screw Driver Coin", + "SSE": "Soroosh Smart Ecosystem", "SSG": "Surviving Soldiers", "SSGT": "Safeswap", "SSH": "StreamSpace", + "SSHIB": "Solana Shib", "SSHIP": "SSHIP", + "SSLX": "StarSlax", "SSS": "StarSharks", "SST": "SIMBA Storage Token", "SSTC": "SunShotCoin", @@ -7653,6 +8621,7 @@ "STA": "Defi STOA", "STAC": "STAC", "STACK": "StackOS", + "STACKS": "STACKS", "STACS": "STACS Token", "STAK": "Jigstack", "STAKE": "xDai Chain", @@ -7664,6 +8633,7 @@ "STARAMBA": "Staramba", "STARBASE": "Starbase", "STARC": "StarChain", + "STARK": "Starknet", "STARL": "StarLink", "STARLAUNCH": "StarLaunch", "STARLY": "Starly", @@ -7674,14 +8644,18 @@ "STARSHIP": "STARSHIP", "START": "StartCoin", "STARTA": "Starta", + "STARWARS": "Star Wars", "STASH": "BitStash", "STAT": "STAT", + "STATE": "New World Order", "STATER": "Stater", "STATERA": "Statera", "STAX": "Staxcoin", "STBU": "Stobox Token", "STC": "Satoshi Island", "STCN": "Stakecoin", + "STD": "STEED", + "STEAK": "SteakHut Finance", "STEALTH": "StealthPad", "STEEM": "Steem", "STEEMD": "Steem Dollars", @@ -7702,11 +8676,13 @@ "STI": "Seek Tiger", "STIK": "Staika", "STING": "Sting", + "STJUNO": "Stride Staked JUNO", "STK": "STK Token", "STKAAVE": "Staked Aave", "STKATOM": "pSTAKE Staked ATOM", "STKK": "Streakk", "STKXPRT": "pSTAKE Staked XPRT", + "STLE": "Saint Ligne", "STMAN": "Stickman Battleground", "STMX": "StormX", "STND": "Standard Protocol", @@ -7715,6 +8691,7 @@ "STON": "Ston", "STONE": "Stone Token", "STONK": "STONK", + "STONKS": "HarryPotterObamaWallStreetBets10Inu", "STOP": "SatoPay", "STOR": "Self Storage Coin", "STORE": "Bit Store", @@ -7731,6 +8708,7 @@ "STRAX": "Stratis", "STRAY": "Stray Dog", "STRD": "Stride", + "STRDY": "Sturdy", "STREAM": "STREAMIT COIN", "STRIP": "Stripto", "STRK": "Strike", @@ -7744,6 +8722,8 @@ "STS": "SBank", "STSOL": "Lido Staked SOL", "STSR": "SatelStar", + "STSTARS": "Stride Staked Stars", + "STSW": "Stackswap", "STT": "Statter Network ", "STU": "BitJob", "STUART": "Stuart Inu", @@ -7752,15 +8732,20 @@ "STV": "Sativa Coin", "STWEMIX": "Staked WEMIX", "STX": "Stacks", + "STYL": "Stylike Governance", "STZ": "99Starz", "STZEN": "StakedZEN", - "SUB": "Substratum Network", + "SUBAWU": "Subawu Token", + "SUBS": "Substratum Network", "SUCR": "Sucre", "SUDO": "sudoswap", "SUGAR": "Sugar Exchange", "SUI": "Sui", + "SUIA": "SUIA", + "SUIP": "SuiPad", "SUKU": "SUKU", "SUM": "SumSwap", + "SUMMER": "Summer", "SUMO": "Sumokoin", "SUN": "Sun Token", "SUNC": "Sunrise", @@ -7769,6 +8754,7 @@ "SUNI": "SUNI", "SUNNY": "Sunny Aggregator", "SUNOLD": "Sun Token", + "SUNV1": "Sun Token v1", "SUP": "Supcoin", "SUP8EME": "SUP8EME Token", "SUPE": "Supe Infinity", @@ -7785,6 +8771,7 @@ "SUTER": "Suterusu", "SUZUME": "Shita-kiri Suzume", "SVD": "savedroid", + "SVN": "Savanna", "SVS": "GivingToServices SVS", "SVT": "Solvent", "SVX": "Savix", @@ -7799,27 +8786,36 @@ "SWASH": "Swash", "SWAY": "Sway Social", "SWC": "Scanetchain Token", + "SWCH": "SwissCheese", "SWD": "SW DAO", "SWDAO": "Super Whale DAO", "SWEAT": "Sweat Economy", "SWEET": "SweetStake", + "SWETH": "swETH", "SWFL": "Swapfolio", "SWFTC": "SWFTCoin", "SWIFT": "BitSwift", + "SWIFTIES": "Taylor Swift", + "SWIM": "SWIM - Spread Wisdom", + "SWIN": "SwinCoin", "SWING": "SwingCoin", "SWINGBY": "Swingby", "SWIRLX": "SwirlToken", "SWISE": "StakeWise", + "SWITCH": "Switch", "SWM": "Swarm Fund", "SWOP": "Swop", + "SWOT": "Swot AI", "SWP": "Kava Swap", "SWRV": "Swerve", "SWT": "Swarm City Token", "SWTH": "Carbon", + "SWU": "Smart World Union", "SWYFTT": "SWYFT", "SX": "SX Network", "SXC": "SexCoin", "SXDT": "SPECTRE Dividend Token", + "SXM": "saxumdao", "SXP": "SXP", "SXS": "Sphere", "SXUT": "SPECTRE Utility Token", @@ -7838,8 +8834,9 @@ "SYNR": "MOBLAND", "SYNX": "Syndicate", "SYPOOL": "Sypool", - "SYS": "SysCoin", + "SYS": "Syscoin", "T": "Threshold Network Token", + "T23": "T23", "T99": "Tethereum", "TAAS": "Token as a Service", "TAB": "MollyCoin", @@ -7850,22 +8847,28 @@ "TAF": "TAF", "TAGR": "Think And Get Rich Coin", "TAI": "tBridge Token", + "TAIKULA": "TAIKULA COIN", "TAIYO": "Taiyo", "TAJ": "TajCoin", "TAK": "TakCoin", "TAKI": "Taki", "TALAO": "Talao", + "TALIS": "Talis Protocol", "TALK": "Talken", "TAMA": "Tamadoge", "TAN": "Taklimakan", + "TANG": "Tangent", "TANGO": "keyTango", + "TANGYUAN": "TangYuan", "TANK": "CryptoTanks", "TAO": "Bittensor", + "TAONU": "TAO INU", "TAP": "TAP FANTASY", "TAPC": "Tap Coin", "TAPPINGCOIN": "TappingCoin", "TAPT": "Tortuga Staked Aptos", "TARA": "Taraxa", + "TARAL": "TARALITY", "TARI": "Tari World", "TAROT": "Tarot", "TARP": "Totally A Rug Pull", @@ -7873,6 +8876,7 @@ "TASH": "Smart Trip Platform", "TASTE": "TasteNFT", "TAT": "Tatcoin", + "TATE": "Tate", "TAU": "Lamden Tau", "TAUC": "Taurus Coin", "TAUM": "Orbitau Taureum", @@ -7917,8 +8921,10 @@ "TEA": "TeaDAO", "TEAM": "TeamUP", "TEC": "TeCoin", + "TECAR": "Tesla Cars", "TECH": "TechCoin", "TECRA": "TecraCoin", + "TED": "TED", "TEDDY": "Teddy Doge", "TEDDYV2": "Teddy Doge v2", "TEE": "Guarantee", @@ -7927,12 +8933,14 @@ "TEL": "Telcoin", "TELE": "Miracle Tele", "TELL": "Tellurion", + "TELLER": "Teller", "TELOS": "Teloscoin", "TEM": "Temtum", "TEMCO": "TEMCO", "TEN": "Tokenomy", "TEND": "Tendies", "TENDIE": "TendieSwap", + "TENET": "TENET", "TENFI": "TEN", "TENNET": "Tennet", "TENSHI": "Tenshi", @@ -7948,10 +8956,13 @@ "TERRA": "TERRABYTE AI", "TES": "TeslaCoin", "TESLA": "TeslaCoilCoin", + "TESLAI": "Tesla AI", + "TEST": "Test", "TESTA": "Testa", "TET": "Tectum", "TETHER": "Hermione", "TETRA": "Tetra", + "TETU": "TETU", "TFBX": "Truefeedback Token", "TFC": "The Freedom Coin", "TFI": "TrustFi Network Token", @@ -7973,11 +8984,13 @@ "THEDAO": "The DAO", "THEMIS": "Themis", "THEN": "THENA", + "THEO": "Theopetra", "THEOS": "Theos", "THETA": "Theta Network", "THETRIBE": "The Tribe ()", "THEX": "Thore Exchange", "THG": "Thetan Arena", + "THING": "Nothing", "THN": "Throne", "THNX": "ThankYou", "THO": "Athero", @@ -7995,11 +9008,13 @@ "TIANHE": "Tianhe", "TIC": "TrueInvestmentCoin", "TIDAL": "Tidal Finance", + "TIDE": "Tidalflats", "TIE": "Ties Network", "TIFI": "TiFi Token", "TIG": "Tigereum", "TIGER": "JungleKing TigerCoin", "TIGERC": "TigerCash", + "TIGERMOON": "TigerMoon", "TIIM": "TriipMiles", "TIK": "ChronoBase", "TIKI": "Tiki Token", @@ -8034,7 +9049,9 @@ "TKR": "CryptoInsight", "TKS": "Tokes", "TKT": "Crypto Tickets", + "TKX": "Tokenize Xchange", "TKY": "THEKEY Token", + "TLC": "Trillioner", "TLM": "Alien Worlds", "TLN": "Trustlines Network", "TLOS": "Telos", @@ -8048,6 +9065,7 @@ "TN": "TurtleNetwork", "TNB": "Time New Bank", "TNC": "TNC Coin", + "TNDC": "TendaCoin", "TNS": "Transcodium", "TNT": "Tierion", "TOA": "TOA Coin", @@ -8055,6 +9073,7 @@ "TOC": "TouchCon", "TODAY": "TodayCoin", "TOK": "Tokenplace", + "TOKA": "Tonka Finance", "TOKAU": "Tokyo AU", "TOKC": "Tokyo Coin", "TOKE": "Tokemak", @@ -8074,6 +9093,8 @@ "TONCOIN": "The Open Network", "TONE": "TE-FOOD", "TONIC": "Tectonic", + "TONNEL": "TONNEL Network", + "TONS": "TONSniper", "TONTOKEN": "TONToken", "TOOB": "Toobcoin", "TOOLS": "TOOLS", @@ -8084,7 +9105,9 @@ "TOPIA": "Hytopia", "TOPN": "TOP Network", "TOR": "TOR", + "TORE": "Toreus Finance", "TORG": "TORG", + "TORI": "Teritori", "TORII": "Torii Finance", "TORN": "Tornado Cash", "TOS": "ThingsOperatingSystem", @@ -8092,6 +9115,7 @@ "TOSC": "T.OS", "TOSHI": "Toshi", "TOT": "TotCoin", + "TOTEM": "DragonMaster", "TOTM": "Totem", "TOUCHFAN": "TouchFan", "TOWER": "Tower", @@ -8121,6 +9145,7 @@ "TRAXX": "Traxx", "TRB": "Tellor", "TRBT": "Tribute", + "TRBV1": "Tellor Tributes v1", "TRC": "TerraCoin", "TRCB": "TRCB Chain", "TRCL": "Treecle", @@ -8132,6 +9157,7 @@ "TRECENTO": "Trecento Blockchain Capital", "TREE": "HyperionX", "TREEB": "Retreeb", + "TRESTLE": "TRESTLE", "TRET": "Tourist Review", "TRGI": "The Real Golden Inu", "TRI": "Triangles Coin", @@ -8146,6 +9172,7 @@ "TRINI": "Trinity Network Credit", "TRIO": "Tripio", "TRIPAD": "TripAdvisor, Inc.", + "TRIVIA": "Trivians", "TRIX": "TriumphX", "TRK": "TruckCoin", "TRL": "Triall", @@ -8163,13 +9190,17 @@ "TRU": "TrueFi", "TRUE": "True Chain", "TRUEBIT": "Truebit Protocol", - "TRUMP": "TrumpCoin", + "TRUMP": "MAGA", + "TRUMP2024": "Donald Trump", + "TRUMPARMY": "Trump Army", + "TRUMPCOIN": "TrumpCoin", "TRUST": "TrustDAO", "TRUTH": "TruthGPT", "TRV": "TrustVerse", "TRVC": "Trivechain", "TRVL": "TRVL", "TRX": "TRON", + "TRXC": "TRONCLASSIC", "TRXDICE": "TRONdice", "TRXWIN": "TronWin", "TRYB": "BiLira", @@ -8197,15 +9228,20 @@ "TTU": "TaTaTu", "TTV": "TV-TWO", "TUBE": "BitTube", + "TUCKER": "TUCKER CARLSON", "TUDA": "Tutor's Diary", + "TUF": "TUF Token", "TULIP": "Tulip Protocol", "TUP": "Tenup", "TUR": "Turron", "TURBO": "Turbo Wallet", "TURBOS": "Turbos Finance", + "TURT": "TurtSat", + "TUS": "Treasure Under Sea", "TUSD": "True USD", "TUT": "Tutellus", "TVK": "Terra Virtua Kolect", + "TVNT": "TravelNote", "TWC": "Twilight", "TWD": "Terra World Token", "TWEE": "TWEEBAA", @@ -8213,15 +9249,19 @@ "TWIN": "Twinci", "TWIST": "TwisterCoin", "TWLV": "Twelve Coin", + "TWOGE": "Twoge Inu", "TWT": "Trust Wallet Token", "TXA": "TXA", + "TXBIT": "Txbit Token", "TXG": "TRUSTxGAMING", "TXL": "Tixl", "TXT": "TuneTrade", + "TYBG": "Base God", "TYC": "Tycoon", "TYCOON": "CryptoTycoon", "TYPE": "Typerium", "TYRANT": "Fable Of The Dragon", + "TYRION": "Tyrion", "TYT": "Tianya Token", "TZC": "TrezarCoin", "TZKI": "Tsuzuki Inu", @@ -8239,6 +9279,7 @@ "UBT": "UniBright", "UBTC": "UnitedBitcoin", "UBX": "UBIX Network", + "UBXN": "UpBots Token", "UBXS": "UBXS", "UBXT": "UpBots", "UC": "YouLive Coin", @@ -8272,6 +9313,7 @@ "UGC": "ugChain", "UGT": "Universal Games Token", "UHP": "Ulgen Hash Power", + "UIM": "UNIVERSE ISLAND", "UIN": "Alliance Chain", "UIP": "UnlimitedIP", "UIS": "Unitus", @@ -8291,8 +9333,11 @@ "UMC": "Umbrella Coin", "UMI": "Universal Money Instrument", "UMK": "UMKA", + "UMMA": "UMMA Token", "UMO": "Universal Molecule", + "UMT": "UnityMeta", "UMX": "UniMex Network", + "UMY": "KaraStar UMY", "UNAT": "Unattanium", "UNB": "Unbound Finance", "UNBNK": "Unbanked", @@ -8304,12 +9349,14 @@ "UNDB": "unibot.cash", "UNDEAD": "Undead Blocks", "UNDG": "UniDexGas", + "UNDX": "UNODEX", "UNF": "Unfed Coin", "UNFI": "Unifi Protocol DAO", "UNI": "Uniswap Protocol Token", "UNIBOT": "Unibot", "UNIC": "Unicly", "UNICORN": "UNICORN Token", + "UNIDEXAI": "UniDexAI", "UNIDX": "UniDex", "UNIFY": "Unify", "UNIM": "Unicorn Milk", @@ -8324,6 +9371,8 @@ "UNIVRS": "Universe", "UNIX": "UniX", "UNLEASH": "UnleashClub", + "UNM": "UNIUM", + "UNMD": "Utility Nexusmind", "UNN": "UNION Protocol Governance Token", "UNO": "UnoRe", "UNOB": "Unobtanium", @@ -8332,6 +9381,7 @@ "UNR": "Unirealchain", "UNRC": "UniversalRoyalCoin", "UNS": "UNS TOKEN", + "UNSHETH": "unshETH Ether", "UNW": "UniWorld", "UOP": "Utopia Genesis Foundation", "UOS": "UOS", @@ -8346,6 +9396,7 @@ "UPP": "Sentinel Protocol", "UPR": "Upfire", "UPRO": "ULTRAPRO", + "UPS": "UPFI Network", "UPUNK": "Unicly CryptoPunks Collection", "UPUSD": "Universal US Dollar", "UPX": "uPlexa", @@ -8355,6 +9406,7 @@ "URALS": "Urals Coin", "URO": "UroCoin", "URQA": "UREEQA", + "URS": "URUS", "URUS": "Urus Token", "URX": "URANIUMX", "USAT": "USAT", @@ -8367,6 +9419,7 @@ "USDCASH": "USDCASH", "USDD": "USDD", "USDE": "UnitaryStatus Dollar", + "USDEBT": "USDEBT", "USDEX": "eToro US Dollar", "USDFL": "USDFreeLiquidity", "USDG": "USDG", @@ -8375,21 +9428,30 @@ "USDJ": "USDJ", "USDK": "USDK", "USDN": "Neutrino USD", + "USDO": "USD Open Dollar", "USDP": "Pax Dollar", "USDQ": "USDQ", + "USDR": "Real USD", "USDS": "StableUSD", "USDSB": "USDSB", "USDT": "Tether", "USDU": "Upper Dollar", "USDV": "Verified USD", "USDX": "USDX Stablecoin", + "USDY": "Ondo US Dollar Yield", "USDZ": "Zedxion USDZ", "USE": "Usechain Token", "USEDCAR": "A Gently Used 2001 Honda", "USG": "USGold", + "USHARK": "uShark", + "USHI": "Ushi", "USHIBA": "American Shiba", + "USK": "USK", "USNBT": "NuBits", "USNOTA": "NOTA", + "USP": "USP Token", + "USPLUS": "Fluent Finance", + "UST": "Wrapped UST Token", "USTC": "TerraClassicUSD", "USX": "USX Quantum", "UT": "Ulord", @@ -8404,14 +9466,21 @@ "UTT": "United Traders Token", "UTU": "UTU Protocol", "UUU": "U Network", + "UVT": "UvToken", "UWU": "uwu", "UX": "Umee", + "UXP": "UXD Protocol", "UZUMAKI": "Uzumaki Inu", + "UZX": "UZX", + "VAAVE": "Venus AAVE", "VAB": "Vabble", + "VADA": "Venus Cardano", "VADER": "Vader Protocol", "VAI": "Vai", "VAIOT": "VAIOT", + "VAIOTV1": "VAIOT v1", "VAL": "Validity", + "VALI": "VALIMARKET", "VALID": "Validator Token", "VALOR": "Valor Token", "VALORBIT": "Valorbit", @@ -8419,11 +9488,14 @@ "VANRY": "Vanar Chain", "VANT": "Vanta Network", "VANY": "Vanywhere", + "VAPE": "VAPE", "VAPOR": "Vaporcoin", "VARA": "Vara Network", "VARIUS": "Varius", + "VATRENI": "Croatian FF Fan Token", "VAULTCOIN": "VaultCoin", "VBCH": "Venus BCH", + "VBETH": "Venus BETH", "VBG": "Vibing", "VBIT": "Valobit", "VBK": "VeriBlock", @@ -8432,6 +9504,7 @@ "VBT": "VB Token", "VBTC": "Venus BTC", "VC": "VinuChain", + "VCAKE": "Venus CAKE", "VCF": "Valencia CF Fan Token", "VCG": "VCGamers", "VCHF": "VNX Swiss Franc", @@ -8442,10 +9515,12 @@ "VDG": "VeriDocGlobal", "VDL": "Vidulum", "VDO": "VidioCoin", + "VDOGE": "Venus Dogecoin", "VDOT": "Venus DOT", "VDR": "Vodra", "VDV": "VDV Token", "VDX": "Vodi X", + "VEC": "VECTOR", "VEC2": "VectorCoin 2.0", "VEE": "BLOCKv", "VEED": "VEED", @@ -8477,9 +9552,12 @@ "VESTA": "Vestarin", "VET": "VeChain", "VETH": "Venus ETH", + "VETME": "VetMe", + "VETTER": "Vetter Token", "VEUR": "VNX Euro", "VEX": "Vexanium", "VEXT": "Veloce", + "VFIL": "Venus Filecoin", "VFOX": "VFOX", "VGO": "Vagabond", "VGX": "Voyager Token", @@ -8501,6 +9579,7 @@ "VIDZ": "PureVidz", "VIEW": "Viewly", "VIG": "TheVig", + "VIM": "VicMove", "VIN": "VinChain", "VINCI": "VINCI", "VINU": "Vita Inu", @@ -8518,6 +9597,7 @@ "VIU": "Viuly", "VIVID": "Vivid Coin", "VIVO": "VIVO Coin", + "VIZ": "Vision City", "VKNF": "VKENAF", "VLC": "Volcano Uni", "VLS": "Veles", @@ -8525,14 +9605,20 @@ "VLTC": "Venus LTC", "VLTX": "Volentix", "VLTY": "Vaulty", + "VLUNA": "Venus Luna", "VLX": "Velas", "VLXPAD": "VelasPad", + "VMATIC": "Venus MATIC", "VMC": "VirtualMining Coin", "VME": "TrueVett", "VMINT": "Volumint", + "VMPX": "VMPX (Ordinals)", + "VMT": "Vemate", "VNDC": "VNDC", "VNES": "Vanesse", + "VNLNK": "VINLINK", "VNM": "Venom", + "VNN": "VINU Network", "VNO": "Veno Finance", "VNT": "VNT Chain", "VNTW": "Value Network Token", @@ -8548,6 +9634,9 @@ "VOLR": "Volare Network", "VOLT": "Volt Inu", "VOLTOLD": "Volt Inu (Old)", + "VOLTV1": "Volt Inu v1", + "VOLTV2": "Volt Inu v2", + "VOLTZ": "Voltz", "VOOT": "VootCoin", "VOT": "Votecoin", "VOW": "Vow", @@ -8556,15 +9645,20 @@ "VOY": "enVoy DeFi", "VOYA": "Voyacoin", "VPAD": "VLaunch", + "VPK": "Vulture Peak", + "VPND": "VaporNodes", "VPP": "Virtue Poker Points", + "VPR": "VaporWallet", "VPRC": "VapersCoin", "VR": "Victoria", "VRA": "Verasity", "VRC": "Virtual Coin", "VRGW": "Virtual Reality Game World", + "VRL": "Virtual X", "VRM": "Verium", "VRN": "Varen", "VRO": "VeraOne", + "VROOM": "TurboPepe", "VRP": "Prosense.tv", "VRS": "Veros", "VRSC": "Verus Coin", @@ -8572,13 +9666,17 @@ "VRTX": "Vertex Protocol", "VRTY": "Verity", "VRX": "Verox", + "VSC": "Vyvo Coin", "VSD": "Value Set Dollar", + "VSG": "Vitalik Smart Gas", "VSL": "vSlice", "VSO": "Verso", "VSP": "Vesper Finance", "VST": "VentiSwap", + "VSUI": "Volo Staked SUI", "VSX": "Vsync", "VSYS": "V Systems", + "VT": "Virtual Tourist", "VTC": "Vertcoin", "VTG": "Victory Gem", "VTHO": "VeChainThor", @@ -8586,15 +9684,20 @@ "VTM": "Victorieum", "VTN": "Voltroon", "VTOS": "VTOS", + "VTRX": "Venus TRX", "VTS": "Veritise", + "VTUSD": "Venus TUSD", "VTX": "Vortex DeFi", "VTY": "Victoriouscoin", "VUC": "Virta Unique Coin", "VULC": "Vulcano", + "VUNI": "Venus UNI", "VV": "Virtual Versions", "VVI": "VV Coin", "VVS": "VVS Finance", + "VX": "ViteX Coin", "VXL": "Voxel X Network", + "VXRP": "Venus XRP", "VXV": "Vectorspace AI", "VYBE": "Vybe", "VYNC": "VYNK Chain", @@ -8602,12 +9705,15 @@ "W1": "W1", "W12": "W12 Protocol", "W3C": "W3Coin", + "W3W": "Web3 Whales", + "W8BIT": "8Bit Chain", "WAB": "WABnetwork", "WABI": "WABI", "WACO": "Waste Digital Coin", "WAG": "WagyuSwap", "WAGE": "Digiwage", "WAGG": "Waggle Network", + "WAGIEBOT": "Wagie Bot", "WAGMI": "Wagmi Coin", "WAGMIGAMES": "WAGMI Game", "WAGMIT": "Wagmi", @@ -8626,12 +9732,15 @@ "WANA": "Wanaka Farm", "WANATHA": "Wrapped ANATHA", "WAND": "WandX", + "WANUSDT": "wanUSDT", "WAR": "WeStarter", "WARP": "WarpCoin", "WARS": "MetaWars", "WAS": "Wasder", "WASABI": "WasabiX", "WASH": "WashingtonCoin", + "WASSIE": "WASSIE", + "WATER": "doginwotah", "WAVES": "Waves", "WAXE": "WAXE", "WAXL": "Wrapped Axelar", @@ -8644,10 +9753,12 @@ "WBIND": "Wrapped BIND", "WBN": "Wisdom Bank Network", "WBNB": "Wrapped BNB", + "WBS": "Websea", "WBT": "WhiteBIT Token", "WBTC": "Wrapped Bitcoin", "WBTCWXG": "WBTC-WXG", "WBX": "WiBX", + "WCA": "WCAPES", "WCC": "Wincash Coin", "WCCX": "Wrapped Conceal", "WCELO": "Wrapped Celo", @@ -8659,18 +9770,26 @@ "WCT": "Waves Community Token", "WCUSD": "Wrapped Celo Dollar", "WDC": "WorldCoin", + "WDOG": "Winterdog", + "WDOGE": "Wrapped Dogecoin", "WDR": "Wider Coin", "WDX": "WeiDex", "WE": "WeBuy", "WEALTH": "WealthCoin", + "WEAPON": "MEGAWEAPON", "WEAR": "MetaWear", "WEB": "Webcoin", "WEB3": "WEB3 Inu", + "WEB4": "WEB4 AI", + "WEB5": "WEB5 Inu", "WEBC": "Webchain", + "WEBD": "WebDollar", "WEC": "Whole Earth Coin", + "WED": "Wednesday Inu", "WEETH": "Wrapped eETH", "WEFI": "WeFi", "WEGEN": "WeGen Platform", + "WELA": "Wrapped Elastos", "WELD": "Weld", "WELL": "Moonwell", "WELLTOKEN": "Well", @@ -8683,6 +9802,7 @@ "WEST": "Waves Enterprise", "WET": "WeShow Token", "WETH": "WETH", + "WETHV1": "WETH v1", "WEVE": "veDAO", "WEWE": "WEWE", "WEX": "WaultSwap", @@ -8690,18 +9810,24 @@ "WFAI": "WaifuAI", "WFIL": "Wrapped Filecoin", "WFLOW": "Wrapped Flow", + "WFT": "Windfall Token", "WFX": "WebFlix", "WGC": "Green Climate World", + "WGHOST": "Wrapped GhostbyMcAfee", "WGL": "Wiggly Finance", "WGO": "WavesGO", "WGP": "W Green Pay", "WGR": "Wagerr", "WGRT": "WaykiChain Governance Coin", + "WGT": "Web3Games.com", "WHALE": "WHALE", + "WHALES": "Whales Market", "WHBAR": "Wrapped HBAR", "WHEAT": "Wheat Token", + "WHEE": "WHEE (Ordinals)", "WHEEL": "Wheelers", "WHEN": "WhenHub", + "WHEX": "Whale Exploder", "WHIRL": "Whirl Finance", "WHITE": "Whiteheart", "WHL": "WhaleCoin", @@ -8726,15 +9852,19 @@ "WINR": "JustBet", "WINRY": "Winry Inu", "WINT": "WinToken", + "WINTER": "Winter", + "WIOTX": "Wrapped IoTeX", "WIRTUAL": "Wirtual", "WIS": "Experty Wisdom Token", "WISC": "WisdomCoin", "WISE": "Wise Token", "WISH": "MyWish", + "WISTA": "Wistaverse", "WIT": "Witnet", "WITCH": "Witch", "WITCOIN": "Witcoin", "WIX": "Wixlar", + "WJEWEL": "WJEWEL", "WKAVA": "Wrapped Kava", "WKD": "Wakanda Inu", "WLD": "Worldcoin", @@ -8751,11 +9881,14 @@ "WMEMO": "Wonderful Memories", "WMF": "Whale Maker Fund", "WMINIMA": "Wrapped Minima", + "WMNT": "Wrapped Mantle", + "WMOXY": "Moxy", "WMT": "World Mobile Token", "WMX": "Wombex Finance", "WNCG": "Wrapped NCG", "WND": "WonderHero", "WNDR": "Wonderman Nation", + "WNEON": "Wrapped Neon EVM", "WNET": "Wavesnode.net", "WNK": "The Winkyverse", "WNRZ": "WinPlay", @@ -8767,7 +9900,9 @@ "WOD": "World of Defish", "WOID": "WORLD ID", "WOJ": "Wojak Finance", + "WOJAK": "Wojak", "WOJAK2": "Wojak 2.0 Coin", + "WOKT": "Wrapped OKT", "WOLF": "Landwolf", "WOLFILAND": "Wolfiland", "WOLFOF": "Wolf of Wall Street", @@ -8781,6 +9916,7 @@ "WON": "WeBlock", "WONDER": "Wonderland", "WOO": "WOO Network", + "WOOD": "Mindfolk Wood", "WOOF": "Shibance Token", "WOOFY": "Woofy", "WOOL": "Wolf Game Wool", @@ -8788,6 +9924,7 @@ "WOOO": "wooonen", "WOOP": "Woonkly Power", "WOP": "WorldPay", + "WORK": "Work X", "WORLD": "World Token", "WORM": "HealthyWorm", "WORX": "Worx", @@ -8796,6 +9933,7 @@ "WOZX": "Efforce", "WPC": "WePiggy Coin", "WPE": "OPES (Wrapped PE)", + "WPI": "Wrapped Pi", "WPLS": "Wrapped Pulse", "WPP": "Green Energy Token", "WPR": "WePower", @@ -8804,6 +9942,7 @@ "WRK": "BlockWRK", "WRLD": "NFT Worlds", "WRONG": "The Wrong Token", + "WROSE": "Wrapped Rose", "WRT": "WRTcoin", "WRX": "WazirX", "WRZ": "Weriz", @@ -8817,9 +9956,12 @@ "WSM": "Wall Street Memes", "WSPP": "Wolf Safe Poor People", "WSTETH": "Lido wstETH", + "WSTOR": "StorageChain", "WSTR": "Wrapped Star", + "WSTUSDT": "wstUSDT", "WSX": "WeAreSatoshi", "WT": "WeToken", + "WTAO": "Wrapped TAO", "WTC": "Waltonchain", "WTF": "Waterfall Governance", "WTFT": "WTF Token", @@ -8835,9 +9977,11 @@ "WXDAI": "Wrapped XDAI", "WXT": "WXT", "WXTZ": "Wrapped Tezos", + "WYNN": "Anita Max Wynn", "WYS": "Wysker", "WZEC": "Wrapped Zcash", "WZENIQ": "Wrapped Zeniq (ETH)", + "WZM": "Woozoo Music", "WZRD": "Wizardia", "X": "AI-X", "X2": "X2Coin", @@ -8848,6 +9992,7 @@ "X8X": "X8Currency", "XACT": "XactToken", "XAEAXII": "XAEA-Xii Token", + "XAH": "Xahau", "XAI": "Xai", "XAMP": "Antiample", "XANK": "Xank", @@ -8880,6 +10025,7 @@ "XCASH": "X-CASH", "XCE": "Cerium", "XCEL": "XcelTrip", + "XCEPT": "XCeption", "XCF": "Cenfura Token", "XCG": "Xchange", "XCH": "Chia", @@ -8895,6 +10041,7 @@ "XCPO": "Copico", "XCR": "Crypti", "XCRE": "Creatio", + "XCRX": "xCRX", "XCT": "C-Bits", "XCUR": "Curate", "XCV": "XCarnival", @@ -8902,6 +10049,7 @@ "XD": "Data Transaction Token", "XDAG": "Dagger", "XDAI": "XDAI", + "XDAO": "XDAO", "XDATA": "Streamr XDATA", "XDB": "DigitalBits", "XDC": "Xinfin Network", @@ -8909,6 +10057,7 @@ "XDEF2": "Xdef Finance", "XDEFI": "XDEFI", "XDEN": "Xiden", + "XDG": "Decentral Games Governance", "XDN": "DigitalNote", "XDNA": "XDNA", "XDOGE": "Xdoge", @@ -8932,12 +10081,14 @@ "XFC": "Football Coin", "XFI": "Xfinance", "XFIT": "Xfit", + "XFLOKI": "XFLOKI", "XFT": "Fantasy Cash", "XFTC": "Offshift", "XFUND": "xFund", "XFYI": "XCredit", "XG": "XG Sports", "XGB": "GoldenBird", + "XGEM": "Exchange Genesis Ethlas Medium", "XGLI": "Glitter Finance", "XGOX": "Go!", "XGPT": "XGPT", @@ -8969,6 +10120,7 @@ "XLR": "Solaris", "XLT": "Nexalt", "XMARK": "xMARK", + "XMAS": "Elon Xmas", "XMASGROK": "Xmas Grok", "XMC": "Monero Classic", "XMCC": "Monoeci", @@ -9000,17 +10152,20 @@ "XOR": "Sora", "XOT": "Okuru", "XOV": "XOVBank", + "XOX": "XOX Labs", "XP": "Experience Points", "XPAT": "Bitnation Pangea", "XPAY": "Wallet Pay", "XPB": "Pebble Coin", "XPC": "eXPerience Chain", "XPD": "PetroDollar", + "XPE": "Xpense", "XPET": "XPET token", "XPH": "PharmaCoin", "XPHX": "PhoenixCo Token", "XPL": "Exclusive Platform", "XPLA": "XPLA", + "XPLL": "ParallelChain", "XPM": "PrimeCoin", "XPN": "PANTHEON X", "XPNET": "XP Network", @@ -9024,6 +10179,7 @@ "XPS": "PoisonIvyCoin", "XPST": "PokerSports", "XPT": "Cryptobuyer", + "XPTP": "xPTP", "XPTX": "PlatinumBAR", "XPX": "ProximaX", "XPY": "PayCoin", @@ -9036,6 +10192,8 @@ "XRE": "RevolverCoin", "XRL": "Rialto.AI", "XRP": "XRP", + "XRP2": "XRP2.0", + "XRPC": "Xrp Classic", "XRPH": "XRP Healthcare", "XRT": "Robonomics Network", "XRUN": "XRun", @@ -9066,6 +10224,7 @@ "XTM": "TORUM", "XTO": "Tao", "XTP": "Tap", + "XTR": "Xtreme", "XTRA": "ExtraCredit", "XTREME": "ExtremeCoin", "XTUSD": "XT Stablecoin XTUSD", @@ -9080,6 +10239,7 @@ "XVE": "The Vegan Initiative", "XVG": "Verge", "XVP": "VirtacoinPlus", + "XVR": "Xover", "XVS": "Venus", "XWC": "WhiteCoin", "XWG": "X World Games", @@ -9096,6 +10256,7 @@ "YAC": "YAcCoin", "YAE": "Cryptonovae", "YAG": "Yaki Gold", + "YAKU": "Yaku", "YAM": "YAM", "YAMV1": "YAM v1", "YAMV2": "YAM v2", @@ -9111,6 +10272,7 @@ "YCO": "Y Coin", "YCT": "Youclout", "YDF": "Yieldification", + "YDOGE": "Yorkie Doge", "YDR": "YDragon", "YEC": "Ycash", "YEE": "Yeeco", @@ -9149,10 +10311,14 @@ "YLDY": "Yieldly", "YMC": "YamahaCoin", "YO": "Yobit Token", + "YOBASE": "All Your Base", "YOC": "YoCoin", "YOCO": "YocoinYOCO", + "YOD": "Year of the Dragon", + "YOLO": "YoloNolo", "YOOSHI": "YooShi", "YOP": "Yield Optimization Platform & Protocol", + "YOTO": "yotoshi", "YOU": "YOU Chain", "YOUC": "yOUcash", "YOVI": "YobitVirtualCoin", @@ -9169,14 +10335,17 @@ "YUDI": "Yudi", "YUKKY": "YUKKY", "YUM": "Yumerium", + "YUMMI": "Yummi Universe", "YUMMY": "Yummy", "YUP": "Crowdholding", + "YUSE": "Yuse Token", "YUSRA": "YUSRA", "YVBOOST": "Yearn Compounding veCRV yVault", "YVS": "YVS.Finance", "YYE": "YYE Energy", "YYFI": "YYFI.Protocol", "ZABAKU": "Zabaku Inu", + "ZAFI": "ZakumiFi", "ZAI": "Zero Collateral Dai", "ZAIF": "Zaif Token", "ZAM": "Zamio", @@ -9188,6 +10357,7 @@ "ZAT": "ZatGo", "ZB": "ZB", "ZBC": "Zebec Protocol", + "ZBIT": "zbit", "ZBU": "Zeebu", "ZCC": "ZCC Coin", "ZCC1": "ZeroCarbon", @@ -9208,11 +10378,13 @@ "ZEDTOKEN": "Zed Token", "ZEDXION": "Zedxion", "ZEE": "ZeroSwap", + "ZEFI": "ZCore Finance", "ZEFU": "Zenfuse", "ZEIT": "ZeitCoin", "ZEL": "Zelcash", "ZELIX ": "ZELIX", "ZEN": "Horizen", + "ZENF": "Zenland", "ZENI": "Zennies", "ZENIQ": "Zeniq Coin", "ZENITH": "Zenith Chain", @@ -9220,6 +10392,7 @@ "ZEP": "Zeppelin Dao", "ZEPH": "Zeph", "ZER": "Zero", + "ZERO": "Analysoor", "ZEROB": "ZeroBank", "ZEROEX": "0.exchange", "ZES": "Zetos", @@ -9227,7 +10400,10 @@ "ZET": "ZetaCoin", "ZET2": "Zeta2Coin", "ZETA": "ZetaChain", + "ZETRIX": "Zetrix", "ZEUM": "Colizeum", + "ZEXI": "ZEXICON", + "ZF": "zkSwap Finance ", "ZFL": "Zuflo Coin", "ZFM": "ZFMCOIN", "ZGD": "ZambesiGold", @@ -9241,13 +10417,20 @@ "ZIPT": "Zippie", "ZIRVE": "Zirve Coin", "ZIX": "ZIX Token", + "ZIZY": "ZIZY", "ZJLT": "ZJLT Distributed Factoring Network", "ZKBOB": "BOB", "ZKF": "ZKFair", + "ZKID": "zkSync id", + "ZKML": "zKML", "ZKP": "Panther Protocol", + "ZKPEPE": "ZKPEPEs", "ZKS": "ZKSpace", + "ZKSHIB": "zkShib", + "ZKSP": "zkSwap", "ZKT": "zkTube", "ZKVAULT": "zkVAULT", + "ZKZ": "Zkzone", "ZLA": "Zilla", "ZLDA": "Zelda Inu", "ZLK": "Zenlink Network", @@ -9275,6 +10458,7 @@ "ZOON": "CryptoZoon", "ZOOT": "Zoo Token", "ZORA": "Zoracles", + "ZORO": "Zoro Inu", "ZORT": "Zort", "ZP": "Zen Protocol", "ZPAE": "ZelaaPayAE", @@ -9283,11 +10467,13 @@ "ZPT": "Zeepin", "ZPTC": "Zeptacoin", "ZRC": "ZrCoin", + "ZRO": "Protocol Zero", "ZRX": "0x", "ZSC": "Zeusshield", "ZSE": "ZSEcoin", "ZT": "ZBG Token", "ZTC": "ZeTo", + "ZTG": "Zeitgeist", "ZTX": "ZTX", "ZUC": "Zeux", "ZUKI": "Zuki Moba", @@ -9297,6 +10483,7 @@ "ZURR": "ZURRENCY", "ZUSD": "ZUSD", "ZUT": "Zero Utility Token", + "ZUZALU": "Zuzalu Inu", "ZUZUAI": "ZUZUAI", "ZVC": "ZVCHAIN", "ZWAP": "ZilSwap", diff --git a/apps/api/src/assets/cryptocurrencies/custom.json b/apps/api/src/assets/cryptocurrencies/custom.json index 1215114bb..ef08ca449 100644 --- a/apps/api/src/assets/cryptocurrencies/custom.json +++ b/apps/api/src/assets/cryptocurrencies/custom.json @@ -1,8 +1,11 @@ { "CYBER24781": "CyberConnect", + "JUP29210": "Jupiter", "LUNA1": "Terra", "LUNA2": "Terra", "SGB1": "Songbird", + "SMURFCAT": "Real Smurf Cat", "UNI1": "Uniswap", + "UNI7083": "Uniswap", "UST": "TerraUSD" } diff --git a/apps/api/src/assets/sitemap.xml b/apps/api/src/assets/sitemap.xml index 11a1822b3..3aeadc035 100644 --- a/apps/api/src/assets/sitemap.xml +++ b/apps/api/src/assets/sitemap.xml @@ -370,6 +370,14 @@ https://ghostfol.io/en/faq ${currentDate}T00:00:00+00:00 + + https://ghostfol.io/en/saas + ${currentDate}T00:00:00+00:00 + + + https://ghostfol.io/en/self-hosting + ${currentDate}T00:00:00+00:00 + https://ghostfol.io/en/features ${currentDate}T00:00:00+00:00 diff --git a/apps/api/src/decorators/has-permission.decorator.ts b/apps/api/src/decorators/has-permission.decorator.ts index dc65cf82e..ab2a2a675 100644 --- a/apps/api/src/decorators/has-permission.decorator.ts +++ b/apps/api/src/decorators/has-permission.decorator.ts @@ -1,4 +1,5 @@ import { SetMetadata } from '@nestjs/common'; + export const HAS_PERMISSION_KEY = 'has_permission'; export function HasPermission(permission: string) { diff --git a/apps/api/src/environments/environment.prod.ts b/apps/api/src/environments/environment.prod.ts index bc8aa65a4..81b324963 100644 --- a/apps/api/src/environments/environment.prod.ts +++ b/apps/api/src/environments/environment.prod.ts @@ -1,4 +1,4 @@ export const environment = { production: true, - version: `v${require('../../../../package.json').version}` + version: `${require('../../../../package.json').version}` }; diff --git a/apps/api/src/guards/has-permission.guard.ts b/apps/api/src/guards/has-permission.guard.ts index 871b29f13..f9ab35efc 100644 --- a/apps/api/src/guards/has-permission.guard.ts +++ b/apps/api/src/guards/has-permission.guard.ts @@ -1,5 +1,6 @@ import { HAS_PERMISSION_KEY } from '@ghostfolio/api/decorators/has-permission.decorator'; import { hasPermission } from '@ghostfolio/common/permissions'; + import { CanActivate, ExecutionContext, diff --git a/apps/api/src/helper/portfolio.helper.ts b/apps/api/src/helper/portfolio.helper.ts new file mode 100644 index 000000000..01b532cbf --- /dev/null +++ b/apps/api/src/helper/portfolio.helper.ts @@ -0,0 +1,21 @@ +import { Type as ActivityType } from '@prisma/client'; + +export function getFactor(activityType: ActivityType) { + let factor: number; + + switch (activityType) { + case 'BUY': + case 'ITEM': + factor = 1; + break; + case 'LIABILITY': + case 'SELL': + factor = -1; + break; + default: + factor = 0; + break; + } + + return factor; +} diff --git a/apps/api/src/interceptors/redact-values-in-response.interceptor.ts b/apps/api/src/interceptors/redact-values-in-response.interceptor.ts index aca3bd5e4..78ae918d2 100644 --- a/apps/api/src/interceptors/redact-values-in-response.interceptor.ts +++ b/apps/api/src/interceptors/redact-values-in-response.interceptor.ts @@ -2,6 +2,7 @@ import { UserService } from '@ghostfolio/api/app/user/user.service'; import { redactAttributes } from '@ghostfolio/api/helper/object.helper'; import { HEADER_KEY_IMPERSONATION } from '@ghostfolio/common/config'; import { UserWithSettings } from '@ghostfolio/common/types'; + import { CallHandler, ExecutionContext, @@ -48,14 +49,14 @@ export class RedactValuesInResponseInterceptor 'dividendInBaseCurrency', 'fee', 'feeInBaseCurrency', - 'filteredValueInBaseCurrency', 'grossPerformance', + 'grossPerformanceWithCurrencyEffect', 'investment', 'netPerformance', + 'netPerformanceWithCurrencyEffect', 'quantity', 'symbolMapping', 'totalBalanceInBaseCurrency', - 'totalValueInBaseCurrency', 'unitPrice', 'value', 'valueInBaseCurrency' diff --git a/apps/api/src/interceptors/transform-data-source-in-request.interceptor.ts b/apps/api/src/interceptors/transform-data-source-in-request.interceptor.ts index ad2579638..df99c2da3 100644 --- a/apps/api/src/interceptors/transform-data-source-in-request.interceptor.ts +++ b/apps/api/src/interceptors/transform-data-source-in-request.interceptor.ts @@ -1,5 +1,6 @@ import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { decodeDataSource } from '@ghostfolio/common/helper'; + import { CallHandler, ExecutionContext, diff --git a/apps/api/src/interceptors/transform-data-source-in-response.interceptor.ts b/apps/api/src/interceptors/transform-data-source-in-response.interceptor.ts index 6968a0f0f..aff42f002 100644 --- a/apps/api/src/interceptors/transform-data-source-in-response.interceptor.ts +++ b/apps/api/src/interceptors/transform-data-source-in-response.interceptor.ts @@ -1,6 +1,7 @@ import { redactAttributes } from '@ghostfolio/api/helper/object.helper'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { encodeDataSource } from '@ghostfolio/common/helper'; + import { CallHandler, ExecutionContext, diff --git a/apps/api/src/middlewares/html-template.middleware.ts b/apps/api/src/middlewares/html-template.middleware.ts index ac2551a51..b38a90ef8 100644 --- a/apps/api/src/middlewares/html-template.middleware.ts +++ b/apps/api/src/middlewares/html-template.middleware.ts @@ -1,6 +1,3 @@ -import * as fs from 'fs'; -import { join } from 'path'; - import { environment } from '@ghostfolio/api/environments/environment'; import { I18nService } from '@ghostfolio/api/services/i18n/i18n.service'; import { @@ -9,8 +6,11 @@ import { SUPPORTED_LANGUAGE_CODES } from '@ghostfolio/common/config'; import { DATE_FORMAT, interpolate } from '@ghostfolio/common/helper'; + import { format } from 'date-fns'; import { NextFunction, Request, Response } from 'express'; +import * as fs from 'fs'; +import { join } from 'path'; const i18nService = new I18nService(); diff --git a/apps/api/src/models/order.ts b/apps/api/src/models/order.ts index f24f4455d..6e6762101 100644 --- a/apps/api/src/models/order.ts +++ b/apps/api/src/models/order.ts @@ -1,5 +1,6 @@ import { IOrder } from '@ghostfolio/api/services/interfaces/interfaces'; -import { Account, SymbolProfile, Type as TypeOfOrder } from '@prisma/client'; + +import { Account, SymbolProfile, Type as ActivityType } from '@prisma/client'; import { v4 as uuidv4 } from 'uuid'; export class Order { @@ -13,7 +14,7 @@ export class Order { private symbol: string; private symbolProfile: SymbolProfile; private total: number; - private type: TypeOfOrder; + private type: ActivityType; private unitPrice: number; public constructor(data: IOrder) { diff --git a/apps/api/src/models/rules/account-cluster-risk/current-investment.ts b/apps/api/src/models/rules/account-cluster-risk/current-investment.ts index 23d3307de..52f20a218 100644 --- a/apps/api/src/models/rules/account-cluster-risk/current-investment.ts +++ b/apps/api/src/models/rules/account-cluster-risk/current-investment.ts @@ -35,7 +35,7 @@ export class AccountClusterRiskCurrentInvestment extends Rule { }; } - let maxItem; + let maxItem: (typeof accounts)[0]; let totalInvestment = 0; for (const account of Object.values(accounts)) { @@ -52,7 +52,7 @@ export class AccountClusterRiskCurrentInvestment extends Rule { } } - const maxInvestmentRatio = maxItem.investment / totalInvestment; + const maxInvestmentRatio = maxItem?.investment / totalInvestment || 0; if (maxInvestmentRatio > ruleSettings.threshold) { return { diff --git a/apps/api/src/models/rules/currency-cluster-risk/base-currency-current-investment.ts b/apps/api/src/models/rules/currency-cluster-risk/base-currency-current-investment.ts index a23a208c3..a2bd44f44 100644 --- a/apps/api/src/models/rules/currency-cluster-risk/base-currency-current-investment.ts +++ b/apps/api/src/models/rules/currency-cluster-risk/base-currency-current-investment.ts @@ -43,7 +43,7 @@ export class CurrencyClusterRiskBaseCurrencyCurrentInvestment extends Rule { } }); - const maxValueRatio = maxItem.value / totalValue; + const maxValueRatio = maxItem?.value / totalValue || 0; if (maxValueRatio > ruleSettings.threshold) { return { @@ -52,7 +52,7 @@ export class CurrencyClusterRiskCurrentInvestment extends Rule { return { evaluation: `The major part of your current investment is in ${ - maxItem.groupKey + maxItem?.groupKey ?? ruleSettings.baseCurrency } (${(maxValueRatio * 100).toPrecision(3)}%) and does not exceed ${ ruleSettings.threshold * 100 }%`, diff --git a/apps/api/src/services/api/api.service.ts b/apps/api/src/services/api/api.service.ts index 541e35561..e961ec037 100644 --- a/apps/api/src/services/api/api.service.ts +++ b/apps/api/src/services/api/api.service.ts @@ -1,4 +1,5 @@ import { Filter } from '@ghostfolio/common/interfaces'; + import { Injectable } from '@nestjs/common'; @Injectable() @@ -9,18 +10,21 @@ export class ApiService { filterByAccounts, filterByAssetClasses, filterByAssetSubClasses, + filterByHoldingType, filterBySearchQuery, filterByTags }: { filterByAccounts?: string; filterByAssetClasses?: string; filterByAssetSubClasses?: string; + filterByHoldingType?: string; filterBySearchQuery?: string; filterByTags?: string; }): Filter[] { const accountIds = filterByAccounts?.split(',') ?? []; const assetClasses = filterByAssetClasses?.split(',') ?? []; const assetSubClasses = filterByAssetSubClasses?.split(',') ?? []; + const holdingType = filterByHoldingType; const searchQuery = filterBySearchQuery?.toLowerCase(); const tagIds = filterByTags?.split(',') ?? []; @@ -51,6 +55,13 @@ export class ApiService { }) ]; + if (holdingType) { + filters.push({ + id: holdingType, + type: 'HOLDING_TYPE' + }); + } + if (searchQuery) { filters.push({ id: searchQuery, diff --git a/apps/api/src/services/configuration/configuration.module.ts b/apps/api/src/services/configuration/configuration.module.ts index 61b8bb4af..2d3650a41 100644 --- a/apps/api/src/services/configuration/configuration.module.ts +++ b/apps/api/src/services/configuration/configuration.module.ts @@ -1,4 +1,5 @@ import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; + import { Module } from '@nestjs/common'; @Module({ diff --git a/apps/api/src/services/configuration/configuration.service.ts b/apps/api/src/services/configuration/configuration.service.ts index c9cf8625c..507e4a375 100644 --- a/apps/api/src/services/configuration/configuration.service.ts +++ b/apps/api/src/services/configuration/configuration.service.ts @@ -1,8 +1,9 @@ import { Environment } from '@ghostfolio/api/services/interfaces/environment.interface'; import { DEFAULT_ROOT_URL } from '@ghostfolio/common/config'; + import { Injectable } from '@nestjs/common'; import { DataSource } from '@prisma/client'; -import { bool, cleanEnv, host, json, num, port, str } from 'envalid'; +import { bool, cleanEnv, host, json, num, port, str, url } from 'envalid'; @Injectable() export class ConfigurationService { @@ -11,10 +12,14 @@ export class ConfigurationService { public constructor() { this.environmentConfiguration = cleanEnv(process.env, { ACCESS_TOKEN_SALT: str(), - ALPHA_VANTAGE_API_KEY: str({ default: '' }), + API_KEY_ALPHA_VANTAGE: str({ default: '' }), + API_KEY_BETTER_UPTIME: str({ default: '' }), API_KEY_COINGECKO_DEMO: str({ default: '' }), API_KEY_COINGECKO_PRO: str({ default: '' }), - BETTER_UPTIME_API_KEY: str({ default: '' }), + API_KEY_EOD_HISTORICAL_DATA: str({ default: '' }), + API_KEY_FINANCIAL_MODELING_PREP: str({ default: '' }), + API_KEY_OPEN_FIGI: str({ default: '' }), + API_KEY_RAPID_API: str({ default: '' }), CACHE_QUOTES_TTL: num({ default: 1 }), CACHE_TTL: num({ default: 1 }), DATA_SOURCE_EXCHANGE_RATES: str({ default: DataSource.YAHOO }), @@ -22,15 +27,12 @@ export class ConfigurationService { DATA_SOURCES: json({ default: [DataSource.COINGECKO, DataSource.MANUAL, DataSource.YAHOO] }), - ENABLE_FEATURE_BLOG: bool({ default: false }), ENABLE_FEATURE_FEAR_AND_GREED_INDEX: bool({ default: false }), ENABLE_FEATURE_READ_ONLY_MODE: bool({ default: false }), ENABLE_FEATURE_SOCIAL_LOGIN: bool({ default: false }), ENABLE_FEATURE_STATISTICS: bool({ default: false }), ENABLE_FEATURE_SUBSCRIPTION: bool({ default: false }), ENABLE_FEATURE_SYSTEM_MESSAGE: bool({ default: false }), - EOD_HISTORICAL_DATA_API_KEY: str({ default: '' }), - FINANCIAL_MODELING_PREP_API_KEY: str({ default: '' }), GOOGLE_CLIENT_ID: str({ default: 'dummyClientId' }), GOOGLE_SECRET: str({ default: 'dummySecret' }), GOOGLE_SHEETS_ACCOUNT: str({ default: '' }), @@ -40,21 +42,19 @@ export class ConfigurationService { JWT_SECRET_KEY: str({}), MAX_ACTIVITIES_TO_IMPORT: num({ default: Number.MAX_SAFE_INTEGER }), MAX_ITEM_IN_CACHE: num({ default: 9999 }), - OPEN_FIGI_API_KEY: str({ default: '' }), PORT: port({ default: 3333 }), - RAPID_API_API_KEY: str({ default: '' }), + REDIS_DB: num({ default: 0 }), REDIS_HOST: str({ default: 'localhost' }), REDIS_PASSWORD: str({ default: '' }), REDIS_PORT: port({ default: 6379 }), REQUEST_TIMEOUT: num({ default: 2000 }), - ROOT_URL: str({ default: DEFAULT_ROOT_URL }), + ROOT_URL: url({ default: DEFAULT_ROOT_URL }), STRIPE_PUBLIC_KEY: str({ default: '' }), STRIPE_SECRET_KEY: str({ default: '' }), TWITTER_ACCESS_TOKEN: str({ default: 'dummyAccessToken' }), TWITTER_ACCESS_TOKEN_SECRET: str({ default: 'dummyAccessTokenSecret' }), TWITTER_API_KEY: str({ default: 'dummyApiKey' }), - TWITTER_API_SECRET: str({ default: 'dummyApiSecret' }), - WEB_AUTH_RP_ID: host({ default: 'localhost' }) + TWITTER_API_SECRET: str({ default: 'dummyApiSecret' }) }); } diff --git a/apps/api/src/services/cron.service.ts b/apps/api/src/services/cron.service.ts index e3597f049..d74ad6a94 100644 --- a/apps/api/src/services/cron.service.ts +++ b/apps/api/src/services/cron.service.ts @@ -1,13 +1,16 @@ import { GATHER_ASSET_PROFILE_PROCESS, - GATHER_ASSET_PROFILE_PROCESS_OPTIONS + GATHER_ASSET_PROFILE_PROCESS_OPTIONS, + PROPERTY_IS_DATA_GATHERING_ENABLED } from '@ghostfolio/common/config'; import { getAssetProfileIdentifier } from '@ghostfolio/common/helper'; + import { Injectable } from '@nestjs/common'; import { Cron, CronExpression } from '@nestjs/schedule'; import { DataGatheringService } from './data-gathering/data-gathering.service'; import { ExchangeRateDataService } from './exchange-rate-data/exchange-rate-data.service'; +import { PropertyService } from './property/property.service'; import { TwitterBotService } from './twitter-bot/twitter-bot.service'; @Injectable() @@ -17,12 +20,15 @@ export class CronService { public constructor( private readonly dataGatheringService: DataGatheringService, private readonly exchangeRateDataService: ExchangeRateDataService, + private readonly propertyService: PropertyService, private readonly twitterBotService: TwitterBotService ) {} @Cron(CronExpression.EVERY_HOUR) public async runEveryHour() { - await this.dataGatheringService.gather7Days(); + if (await this.isDataGatheringEnabled()) { + await this.dataGatheringService.gather7Days(); + } } @Cron(CronExpression.EVERY_12_HOURS) @@ -37,22 +43,32 @@ export class CronService { @Cron(CronService.EVERY_SUNDAY_AT_LUNCH_TIME) public async runEverySundayAtTwelvePm() { - const uniqueAssets = await this.dataGatheringService.getUniqueAssets(); - - await this.dataGatheringService.addJobsToQueue( - uniqueAssets.map(({ dataSource, symbol }) => { - return { - data: { - dataSource, - symbol - }, - name: GATHER_ASSET_PROFILE_PROCESS, - opts: { - ...GATHER_ASSET_PROFILE_PROCESS_OPTIONS, - jobId: getAssetProfileIdentifier({ dataSource, symbol }) - } - }; - }) - ); + if (await this.isDataGatheringEnabled()) { + const uniqueAssets = await this.dataGatheringService.getUniqueAssets(); + + await this.dataGatheringService.addJobsToQueue( + uniqueAssets.map(({ dataSource, symbol }) => { + return { + data: { + dataSource, + symbol + }, + name: GATHER_ASSET_PROFILE_PROCESS, + opts: { + ...GATHER_ASSET_PROFILE_PROCESS_OPTIONS, + jobId: getAssetProfileIdentifier({ dataSource, symbol }) + } + }; + }) + ); + } + } + + private async isDataGatheringEnabled() { + return (await this.propertyService.getByKey( + PROPERTY_IS_DATA_GATHERING_ENABLED + )) === false + ? false + : true; } } diff --git a/apps/api/src/services/data-gathering/data-gathering.module.ts b/apps/api/src/services/data-gathering/data-gathering.module.ts index 673364f09..f3ab2fc9c 100644 --- a/apps/api/src/services/data-gathering/data-gathering.module.ts +++ b/apps/api/src/services/data-gathering/data-gathering.module.ts @@ -8,6 +8,7 @@ import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; import { PropertyModule } from '@ghostfolio/api/services/property/property.module'; import { SymbolProfileModule } from '@ghostfolio/api/services/symbol-profile/symbol-profile.module'; import { DATA_GATHERING_QUEUE } from '@ghostfolio/common/config'; + import { BullModule } from '@nestjs/bull'; import { Module } from '@nestjs/common'; import ms from 'ms'; diff --git a/apps/api/src/services/data-gathering/data-gathering.processor.ts b/apps/api/src/services/data-gathering/data-gathering.processor.ts index a3ab0e513..bf960048c 100644 --- a/apps/api/src/services/data-gathering/data-gathering.processor.ts +++ b/apps/api/src/services/data-gathering/data-gathering.processor.ts @@ -8,6 +8,7 @@ import { } from '@ghostfolio/common/config'; import { DATE_FORMAT, getStartOfUtcDate } from '@ghostfolio/common/helper'; import { UniqueAsset } from '@ghostfolio/common/interfaces'; + import { Process, Processor } from '@nestjs/bull'; import { Injectable, Logger } from '@nestjs/common'; import { Prisma } from '@prisma/client'; diff --git a/apps/api/src/services/data-gathering/data-gathering.service.ts b/apps/api/src/services/data-gathering/data-gathering.service.ts index 78531b745..6dccd645e 100644 --- a/apps/api/src/services/data-gathering/data-gathering.service.ts +++ b/apps/api/src/services/data-gathering/data-gathering.service.ts @@ -18,6 +18,7 @@ import { resetHours } from '@ghostfolio/common/helper'; import { BenchmarkProperty, UniqueAsset } from '@ghostfolio/common/interfaces'; + import { InjectQueue } from '@nestjs/bull'; import { Inject, Injectable, Logger } from '@nestjs/common'; import { DataSource } from '@prisma/client'; diff --git a/apps/api/src/services/data-provider/alpha-vantage/alpha-vantage.service.ts b/apps/api/src/services/data-provider/alpha-vantage/alpha-vantage.service.ts index 6ab790159..08dc48e57 100644 --- a/apps/api/src/services/data-provider/alpha-vantage/alpha-vantage.service.ts +++ b/apps/api/src/services/data-provider/alpha-vantage/alpha-vantage.service.ts @@ -13,6 +13,7 @@ import { } from '@ghostfolio/api/services/interfaces/interfaces'; import { DATE_FORMAT } from '@ghostfolio/common/helper'; import { DataProviderInfo } from '@ghostfolio/common/interfaces'; + import { Injectable } from '@nestjs/common'; import { DataSource, SymbolProfile } from '@prisma/client'; import * as Alphavantage from 'alphavantage'; @@ -28,20 +29,22 @@ export class AlphaVantageService implements DataProviderInterface { private readonly configurationService: ConfigurationService ) { this.alphaVantage = Alphavantage({ - key: this.configurationService.get('ALPHA_VANTAGE_API_KEY') + key: this.configurationService.get('API_KEY_ALPHA_VANTAGE') }); } public canHandle(symbol: string) { - return !!this.configurationService.get('ALPHA_VANTAGE_API_KEY'); + return !!this.configurationService.get('API_KEY_ALPHA_VANTAGE'); } - public async getAssetProfile( - aSymbol: string - ): Promise> { + public async getAssetProfile({ + symbol + }: { + symbol: string; + }): Promise> { return { - dataSource: this.getName(), - symbol: aSymbol + symbol, + dataSource: this.getName() }; } diff --git a/apps/api/src/services/data-provider/coingecko/coingecko.service.ts b/apps/api/src/services/data-provider/coingecko/coingecko.service.ts index c9fd47a1d..d17ba4b7e 100644 --- a/apps/api/src/services/data-provider/coingecko/coingecko.service.ts +++ b/apps/api/src/services/data-provider/coingecko/coingecko.service.ts @@ -14,6 +14,7 @@ import { import { DEFAULT_CURRENCY } from '@ghostfolio/common/config'; import { DATE_FORMAT } from '@ghostfolio/common/helper'; import { DataProviderInfo } from '@ghostfolio/common/interfaces'; + import { Injectable, Logger } from '@nestjs/common'; import { AssetClass, @@ -51,15 +52,17 @@ export class CoinGeckoService implements DataProviderInterface { return true; } - public async getAssetProfile( - aSymbol: string - ): Promise> { + public async getAssetProfile({ + symbol + }: { + symbol: string; + }): Promise> { const response: Partial = { + symbol, assetClass: AssetClass.CASH, assetSubClass: AssetSubClass.CRYPTOCURRENCY, currency: DEFAULT_CURRENCY, - dataSource: this.getName(), - symbol: aSymbol + dataSource: this.getName() }; try { @@ -69,7 +72,7 @@ export class CoinGeckoService implements DataProviderInterface { abortController.abort(); }, this.configurationService.get('REQUEST_TIMEOUT')); - const { name } = await got(`${this.apiUrl}/coins/${aSymbol}`, { + const { name } = await got(`${this.apiUrl}/coins/${symbol}`, { headers: this.headers, // @ts-ignore signal: abortController.signal @@ -80,7 +83,7 @@ export class CoinGeckoService implements DataProviderInterface { let message = error; if (error?.code === 'ABORT_ERR') { - message = `RequestError: The operation to get the asset profile for ${aSymbol} was aborted because the request to the data provider took more than ${this.configurationService.get( + message = `RequestError: The operation to get the asset profile for ${symbol} was aborted because the request to the data provider took more than ${this.configurationService.get( 'REQUEST_TIMEOUT' )}ms`; } @@ -243,6 +246,7 @@ export class CoinGeckoService implements DataProviderInterface { assetClass: AssetClass.CASH, assetSubClass: AssetSubClass.CRYPTOCURRENCY, currency: DEFAULT_CURRENCY, + dataProviderInfo: this.getDataProviderInfo(), dataSource: this.getName() }; }); diff --git a/apps/api/src/services/data-provider/data-enhancer/data-enhancer.module.ts b/apps/api/src/services/data-provider/data-enhancer/data-enhancer.module.ts index 23d64ac86..cadf8cf1d 100644 --- a/apps/api/src/services/data-provider/data-enhancer/data-enhancer.module.ts +++ b/apps/api/src/services/data-provider/data-enhancer/data-enhancer.module.ts @@ -3,6 +3,7 @@ import { CryptocurrencyModule } from '@ghostfolio/api/services/cryptocurrency/cr import { OpenFigiDataEnhancerService } from '@ghostfolio/api/services/data-provider/data-enhancer/openfigi/openfigi.service'; import { TrackinsightDataEnhancerService } from '@ghostfolio/api/services/data-provider/data-enhancer/trackinsight/trackinsight.service'; import { YahooFinanceDataEnhancerService } from '@ghostfolio/api/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service'; + import { Module } from '@nestjs/common'; import { DataEnhancerService } from './data-enhancer.service'; diff --git a/apps/api/src/services/data-provider/data-enhancer/data-enhancer.service.ts b/apps/api/src/services/data-provider/data-enhancer/data-enhancer.service.ts index d9b509f42..5d79ea90a 100644 --- a/apps/api/src/services/data-provider/data-enhancer/data-enhancer.service.ts +++ b/apps/api/src/services/data-provider/data-enhancer/data-enhancer.service.ts @@ -1,4 +1,5 @@ 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'; diff --git a/apps/api/src/services/data-provider/data-enhancer/openfigi/openfigi.service.ts b/apps/api/src/services/data-provider/data-enhancer/openfigi/openfigi.service.ts index 5e4f01c22..4d26b31fb 100644 --- a/apps/api/src/services/data-provider/data-enhancer/openfigi/openfigi.service.ts +++ b/apps/api/src/services/data-provider/data-enhancer/openfigi/openfigi.service.ts @@ -1,6 +1,7 @@ import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { DataEnhancerInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-enhancer.interface'; import { parseSymbol } from '@ghostfolio/common/helper'; + import { Injectable } from '@nestjs/common'; import { SymbolProfile } from '@prisma/client'; import got, { Headers } from 'got'; @@ -37,9 +38,9 @@ export class OpenFigiDataEnhancerService implements DataEnhancerInterface { dataSource: response.dataSource }); - if (this.configurationService.get('OPEN_FIGI_API_KEY')) { + if (this.configurationService.get('API_KEY_OPEN_FIGI')) { headers['X-OPENFIGI-APIKEY'] = - this.configurationService.get('OPEN_FIGI_API_KEY'); + this.configurationService.get('API_KEY_OPEN_FIGI'); } let abortController = new AbortController(); diff --git a/apps/api/src/services/data-provider/data-enhancer/trackinsight/trackinsight.service.ts b/apps/api/src/services/data-provider/data-enhancer/trackinsight/trackinsight.service.ts index 6d8995386..ddc3d79f8 100644 --- a/apps/api/src/services/data-provider/data-enhancer/trackinsight/trackinsight.service.ts +++ b/apps/api/src/services/data-provider/data-enhancer/trackinsight/trackinsight.service.ts @@ -2,14 +2,15 @@ import { ConfigurationService } from '@ghostfolio/api/services/configuration/con import { DataEnhancerInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-enhancer.interface'; import { Country } from '@ghostfolio/common/interfaces/country.interface'; import { Sector } from '@ghostfolio/common/interfaces/sector.interface'; + import { Injectable } from '@nestjs/common'; import { SymbolProfile } from '@prisma/client'; +import { countries } from 'countries-list'; import got from 'got'; @Injectable() export class TrackinsightDataEnhancerService implements DataEnhancerInterface { private static baseUrl = 'https://www.trackinsight.com/data-api'; - private static countries = require('countries-list/dist/countries.json'); private static countriesMapping = { 'Russian Federation': 'Russia' }; @@ -130,20 +131,19 @@ export class TrackinsightDataEnhancerService implements DataEnhancerInterface { (response.countries as unknown as Country[]).length === 0 ) { response.countries = []; + for (const [name, value] of Object.entries( holdings?.countries ?? {} )) { let countryCode: string; - for (const [key, country] of Object.entries( - TrackinsightDataEnhancerService.countries - )) { + for (const [code, country] of Object.entries(countries)) { if ( country.name === name || country.name === TrackinsightDataEnhancerService.countriesMapping[name] ) { - countryCode = key; + countryCode = code; break; } } 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 f2a136151..c6edef0ca 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 @@ -7,6 +7,7 @@ import { UNKNOWN_KEY } from '@ghostfolio/common/config'; import { isCurrency } from '@ghostfolio/common/helper'; + import { Injectable, Logger } from '@nestjs/common'; import { AssetClass, @@ -195,7 +196,9 @@ export class YahooFinanceDataEnhancerService implements DataEnhancerInterface { shortName: assetProfile.price.shortName, symbol: assetProfile.price.symbol }); - response.symbol = assetProfile.price.symbol; + response.symbol = this.convertFromYahooFinanceSymbol( + assetProfile.price.symbol + ); if (assetSubClass === AssetSubClass.MUTUALFUND) { response.sectors = []; diff --git a/apps/api/src/services/data-provider/data-provider.module.ts b/apps/api/src/services/data-provider/data-provider.module.ts index e63ec0807..dcfc756f2 100644 --- a/apps/api/src/services/data-provider/data-provider.module.ts +++ b/apps/api/src/services/data-provider/data-provider.module.ts @@ -13,6 +13,7 @@ import { MarketDataModule } from '@ghostfolio/api/services/market-data/market-da import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; import { PropertyModule } from '@ghostfolio/api/services/property/property.module'; import { SymbolProfileModule } from '@ghostfolio/api/services/symbol-profile/symbol-profile.module'; + import { Module } from '@nestjs/common'; import { DataEnhancerModule } from './data-enhancer/data-enhancer.module'; diff --git a/apps/api/src/services/data-provider/data-provider.service.ts b/apps/api/src/services/data-provider/data-provider.service.ts index 8868501d9..cd8542d79 100644 --- a/apps/api/src/services/data-provider/data-provider.service.ts +++ b/apps/api/src/services/data-provider/data-provider.service.ts @@ -17,6 +17,7 @@ import { import { DATE_FORMAT, getStartOfUtcDate } from '@ghostfolio/common/helper'; import { UniqueAsset } from '@ghostfolio/common/interfaces'; import type { Granularity, UserWithSettings } from '@ghostfolio/common/types'; + import { Inject, Injectable, Logger } from '@nestjs/common'; import { DataSource, MarketData, SymbolProfile } from '@prisma/client'; import Big from 'big.js'; @@ -91,7 +92,9 @@ export class DataProviderService { for (const symbol of symbols) { const promise = Promise.resolve( - this.getDataProvider(DataSource[dataSource]).getAssetProfile(symbol) + this.getDataProvider(DataSource[dataSource]).getAssetProfile({ + symbol + }) ); promises.push( @@ -201,13 +204,14 @@ export class DataProviderService { }); try { - const queryRaw = `SELECT * - FROM "MarketData" - WHERE "dataSource" IN ('${dataSources.join(`','`)}') - AND "symbol" IN ('${symbols.join( - `','` - )}') ${granularityQuery} ${rangeQuery} - ORDER BY date;`; + const queryRaw = ` + SELECT * + FROM "MarketData" + WHERE "dataSource" IN ('${dataSources.join(`','`)}') + AND "symbol" IN ('${symbols.join( + `','` + )}') ${granularityQuery} ${rangeQuery} + ORDER BY date;`; const marketDataByGranularity: MarketData[] = await this.prismaService.$queryRawUnsafe(queryRaw); @@ -334,11 +338,13 @@ export class DataProviderService { public async getQuotes({ items, requestTimeout, - useCache = true + useCache = true, + user }: { items: UniqueAsset[]; requestTimeout?: number; useCache?: boolean; + user?: UserWithSettings; }): Promise<{ [symbol: string]: IDataProviderResponse; }> { @@ -404,6 +410,14 @@ export class DataProviderService { )) { const dataProvider = this.getDataProvider(DataSource[dataSource]); + if ( + dataProvider.getDataProviderInfo().isPremium && + this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION') && + user?.subscription.type === 'Basic' + ) { + continue; + } + const symbols = dataGatheringItems.map((dataGatheringItem) => { return dataGatheringItem.symbol; }); diff --git a/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts b/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts index c46055999..99104a78d 100644 --- a/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts +++ b/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts @@ -11,12 +11,14 @@ import { IDataProviderHistoricalResponse, IDataProviderResponse } from '@ghostfolio/api/services/interfaces/interfaces'; +import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; import { DEFAULT_CURRENCY, REPLACE_NAME_PARTS } from '@ghostfolio/common/config'; import { DATE_FORMAT, isCurrency } from '@ghostfolio/common/helper'; import { DataProviderInfo } from '@ghostfolio/common/interfaces'; + import { Injectable, Logger } from '@nestjs/common'; import { AssetClass, @@ -34,28 +36,31 @@ export class EodHistoricalDataService implements DataProviderInterface { private readonly URL = 'https://eodhistoricaldata.com/api'; public constructor( - private readonly configurationService: ConfigurationService + private readonly configurationService: ConfigurationService, + private readonly symbolProfileService: SymbolProfileService ) { - this.apiKey = this.configurationService.get('EOD_HISTORICAL_DATA_API_KEY'); + this.apiKey = this.configurationService.get('API_KEY_EOD_HISTORICAL_DATA'); } public canHandle(symbol: string) { return true; } - public async getAssetProfile( - aSymbol: string - ): Promise> { - const [searchResult] = await this.getSearchResult(aSymbol); + public async getAssetProfile({ + symbol + }: { + symbol: string; + }): Promise> { + const [searchResult] = await this.getSearchResult(symbol); return { + symbol, assetClass: searchResult?.assetClass, assetSubClass: searchResult?.assetSubClass, currency: this.convertCurrency(searchResult?.currency), dataSource: this.getName(), isin: searchResult?.isin, - name: searchResult?.name, - symbol: aSymbol + name: searchResult?.name }; } @@ -227,51 +232,53 @@ export class EodHistoricalDataService implements DataProviderInterface { ? [realTimeResponse] : realTimeResponse; - const searchResponse = await Promise.all( - eodHistoricalDataSymbols - .filter((symbol) => { - return !symbol.endsWith('.FOREX'); - }) - .map((symbol) => { - return this.search({ query: symbol }); - }) + const symbolProfiles = await this.symbolProfileService.getSymbolProfiles( + symbols.map((symbol) => { + return { + symbol, + dataSource: this.getName() + }; + }) ); - const lookupItems = searchResponse.flat().map(({ items }) => { - return items[0]; - }); - - response = quotes.reduce( - ( - result: { [symbol: string]: IDataProviderResponse }, - { close, code, timestamp } - ) => { - const currency = lookupItems.find((lookupItem) => { - return lookupItem.symbol === code; + for (const { close, code, timestamp } of quotes) { + let currency: string; + + if (code.endsWith('.FOREX')) { + currency = this.convertFromEodSymbol(code)?.replace( + DEFAULT_CURRENCY, + '' + ); + } + + if (!currency) { + currency = symbolProfiles.find(({ symbol }) => { + return symbol === code; })?.currency; + } - if (isNumber(close)) { - result[this.convertFromEodSymbol(code)] = { - currency: - currency ?? - this.convertFromEodSymbol(code)?.replace(DEFAULT_CURRENCY, ''), - dataSource: this.getName(), - marketPrice: close, - marketState: isToday(new Date(timestamp * 1000)) - ? 'open' - : 'closed' - }; - } else { - Logger.error( - `Could not get quote for ${this.convertFromEodSymbol(code)} (${this.getName()})`, - 'EodHistoricalDataService' - ); + if (!currency) { + const { items } = await this.search({ query: code }); + + if (items.length === 1) { + currency = items[0].currency; } + } - return result; - }, - {} - ); + if (isNumber(close)) { + response[this.convertFromEodSymbol(code)] = { + currency, + dataSource: this.getName(), + marketPrice: close, + marketState: isToday(new Date(timestamp * 1000)) ? 'open' : 'closed' + }; + } else { + Logger.error( + `Could not get quote for ${this.convertFromEodSymbol(code)} (${this.getName()})`, + 'EodHistoricalDataService' + ); + } + } return response; } catch (error) { 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 fe1b18cc1..2faaf8db8 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 @@ -14,6 +14,7 @@ import { import { DEFAULT_CURRENCY } from '@ghostfolio/common/config'; import { DATE_FORMAT, parseDate } from '@ghostfolio/common/helper'; import { DataProviderInfo } from '@ghostfolio/common/interfaces'; + import { Injectable, Logger } from '@nestjs/common'; import { DataSource, SymbolProfile } from '@prisma/client'; import { format, isAfter, isBefore, isSameDay } from 'date-fns'; @@ -28,7 +29,7 @@ export class FinancialModelingPrepService implements DataProviderInterface { private readonly configurationService: ConfigurationService ) { this.apiKey = this.configurationService.get( - 'FINANCIAL_MODELING_PREP_API_KEY' + 'API_KEY_FINANCIAL_MODELING_PREP' ); } @@ -36,12 +37,14 @@ export class FinancialModelingPrepService implements DataProviderInterface { return true; } - public async getAssetProfile( - aSymbol: string - ): Promise> { + public async getAssetProfile({ + symbol + }: { + symbol: string; + }): Promise> { return { - dataSource: this.getName(), - symbol: aSymbol + symbol, + dataSource: this.getName() }; } diff --git a/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts b/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts index d9f4115e0..68e8bf732 100644 --- a/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts +++ b/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts @@ -15,6 +15,7 @@ import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; import { DATE_FORMAT, parseDate } from '@ghostfolio/common/helper'; import { DataProviderInfo } from '@ghostfolio/common/interfaces'; + import { Injectable, Logger } from '@nestjs/common'; import { DataSource, SymbolProfile } from '@prisma/client'; import { format } from 'date-fns'; @@ -32,12 +33,14 @@ export class GoogleSheetsService implements DataProviderInterface { return true; } - public async getAssetProfile( - aSymbol: string - ): Promise> { + public async getAssetProfile({ + symbol + }: { + symbol: string; + }): Promise> { return { - dataSource: this.getName(), - symbol: aSymbol + symbol, + dataSource: this.getName() }; } diff --git a/apps/api/src/services/data-provider/interfaces/data-provider.interface.ts b/apps/api/src/services/data-provider/interfaces/data-provider.interface.ts index 924605f09..3b3644473 100644 --- a/apps/api/src/services/data-provider/interfaces/data-provider.interface.ts +++ b/apps/api/src/services/data-provider/interfaces/data-provider.interface.ts @@ -5,12 +5,17 @@ import { } from '@ghostfolio/api/services/interfaces/interfaces'; import { DataProviderInfo } from '@ghostfolio/common/interfaces'; import { Granularity } from '@ghostfolio/common/types'; + import { DataSource, SymbolProfile } from '@prisma/client'; export interface DataProviderInterface { canHandle(symbol: string): boolean; - getAssetProfile(aSymbol: string): Promise>; + getAssetProfile({ + symbol + }: { + symbol: string; + }): Promise>; getDataProviderInfo(): DataProviderInfo; diff --git a/apps/api/src/services/data-provider/manual/manual.service.ts b/apps/api/src/services/data-provider/manual/manual.service.ts index 33d93bbe2..4ff3ba653 100644 --- a/apps/api/src/services/data-provider/manual/manual.service.ts +++ b/apps/api/src/services/data-provider/manual/manual.service.ts @@ -22,6 +22,7 @@ import { DataProviderInfo, ScraperConfiguration } from '@ghostfolio/common/interfaces'; + import { Injectable, Logger } from '@nestjs/common'; import { DataSource, SymbolProfile } from '@prisma/client'; import * as cheerio from 'cheerio'; @@ -42,16 +43,18 @@ export class ManualService implements DataProviderInterface { return true; } - public async getAssetProfile( - aSymbol: string - ): Promise> { + public async getAssetProfile({ + symbol + }: { + symbol: string; + }): Promise> { const assetProfile: Partial = { - dataSource: this.getName(), - symbol: aSymbol + symbol, + dataSource: this.getName() }; const [symbolProfile] = await this.symbolProfileService.getSymbolProfiles([ - { dataSource: this.getName(), symbol: aSymbol } + { symbol, dataSource: this.getName() } ]); if (symbolProfile) { @@ -163,13 +166,15 @@ export class ManualService implements DataProviderInterface { } }); - for (const symbolProfile of symbolProfiles) { - response[symbolProfile.symbol] = { - currency: symbolProfile.currency, + for (const { currency, symbol } of symbolProfiles) { + let marketPrice = marketData.find((marketDataItem) => { + return marketDataItem.symbol === symbol; + })?.marketPrice; + + response[symbol] = { + currency, + marketPrice, dataSource: this.getName(), - marketPrice: marketData.find((marketDataItem) => { - return marketDataItem.symbol === symbolProfile.symbol; - })?.marketPrice, marketState: 'delayed' }; } diff --git a/apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts b/apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts index 31c813180..e55fbd4e2 100644 --- a/apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts +++ b/apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts @@ -14,6 +14,7 @@ import { import { ghostfolioFearAndGreedIndexSymbol } from '@ghostfolio/common/config'; import { DATE_FORMAT, getYesterday } from '@ghostfolio/common/helper'; import { DataProviderInfo } from '@ghostfolio/common/interfaces'; + import { Injectable, Logger } from '@nestjs/common'; import { DataSource, SymbolProfile } from '@prisma/client'; import { format } from 'date-fns'; @@ -26,15 +27,17 @@ export class RapidApiService implements DataProviderInterface { ) {} public canHandle(symbol: string) { - return !!this.configurationService.get('RAPID_API_API_KEY'); + return !!this.configurationService.get('API_KEY_RAPID_API'); } - public async getAssetProfile( - aSymbol: string - ): Promise> { + public async getAssetProfile({ + symbol + }: { + symbol: string; + }): Promise> { return { - dataSource: this.getName(), - symbol: aSymbol + symbol, + dataSource: this.getName() }; } @@ -140,7 +143,7 @@ export class RapidApiService implements DataProviderInterface { headers: { useQueryString: 'true', 'x-rapidapi-host': 'fear-and-greed-index.p.rapidapi.com', - 'x-rapidapi-key': this.configurationService.get('RAPID_API_API_KEY') + 'x-rapidapi-key': this.configurationService.get('API_KEY_RAPID_API') }, // @ts-ignore signal: abortController.signal diff --git a/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts b/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts index 335162023..c55da2597 100644 --- a/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts +++ b/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts @@ -15,6 +15,7 @@ import { import { DEFAULT_CURRENCY } from '@ghostfolio/common/config'; import { DATE_FORMAT } from '@ghostfolio/common/helper'; import { DataProviderInfo } from '@ghostfolio/common/interfaces'; + import { Injectable, Logger } from '@nestjs/common'; import { DataSource, SymbolProfile } from '@prisma/client'; import { addDays, format, isSameDay } from 'date-fns'; @@ -32,20 +33,12 @@ export class YahooFinanceService implements DataProviderInterface { return true; } - public async getAssetProfile( - aSymbol: string - ): Promise> { - const { assetClass, assetSubClass, currency, name, symbol } = - await this.yahooFinanceDataEnhancerService.getAssetProfile(aSymbol); - - return { - assetClass, - assetSubClass, - currency, - name, - symbol, - dataSource: this.getName() - }; + public async getAssetProfile({ + symbol + }: { + symbol: string; + }): Promise> { + return this.yahooFinanceDataEnhancerService.getAssetProfile(symbol); } public getDataProviderInfo(): DataProviderInfo { diff --git a/apps/api/src/services/exchange-rate-data/exchange-rate-data.module.ts b/apps/api/src/services/exchange-rate-data/exchange-rate-data.module.ts index 89b0158db..3063ddaf5 100644 --- a/apps/api/src/services/exchange-rate-data/exchange-rate-data.module.ts +++ b/apps/api/src/services/exchange-rate-data/exchange-rate-data.module.ts @@ -4,6 +4,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate- import { MarketDataModule } from '@ghostfolio/api/services/market-data/market-data.module'; import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; import { PropertyModule } from '@ghostfolio/api/services/property/property.module'; + import { Module } from '@nestjs/common'; @Module({ diff --git a/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.mock.ts b/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.mock.ts index e32af51d3..59f5144d8 100644 --- a/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.mock.ts +++ b/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.mock.ts @@ -22,6 +22,14 @@ export const ExchangeRateDataServiceMock = { '2023-07-10': 0.8854 } }); + } else if (targetCurrency === 'USD') { + return Promise.resolve({ + USDUSD: { + '2018-01-01': 1, + '2021-11-16': 1, + '2023-07-10': 1 + } + }); } return Promise.resolve({}); diff --git a/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts b/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts index 3c3fc5573..a02ddb597 100644 --- a/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts +++ b/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts @@ -13,6 +13,7 @@ import { getYesterday, resetHours } from '@ghostfolio/common/helper'; + import { Injectable, Logger } from '@nestjs/common'; import { eachDayOfInterval, @@ -72,7 +73,17 @@ export class ExchangeRateDataService { currencyTo: targetCurrency }); - let previousExchangeRate = 1; + const dateStrings = Object.keys( + exchangeRatesByCurrency[`${currency}${targetCurrency}`] + ); + const lastDateString = dateStrings.reduce((a, b) => { + return a > b ? a : b; + }); + + let previousExchangeRate = + exchangeRatesByCurrency[`${currency}${targetCurrency}`]?.[ + lastDateString + ] ?? 1; // Start from the most recent date and fill in missing exchange rates // using the latest available rate @@ -93,7 +104,7 @@ export class ExchangeRateDataService { exchangeRatesByCurrency[`${currency}${targetCurrency}`][dateString] = previousExchangeRate; - if (currency === DEFAULT_CURRENCY) { + if (currency === DEFAULT_CURRENCY && isBefore(date, new Date())) { Logger.error( `No exchange rate has been found for ${currency}${targetCurrency} at ${dateString}`, 'ExchangeRateDataService' @@ -432,13 +443,17 @@ export class ExchangeRateDataService { ]) * marketPriceBaseCurrencyToCurrency[format(date, DATE_FORMAT)]; - factors[format(date, DATE_FORMAT)] = factor; + if (isNaN(factor)) { + throw new Error('Exchange rate is not a number'); + } else { + factors[format(date, DATE_FORMAT)] = factor; + } } catch { Logger.error( `No exchange rate has been found for ${currencyFrom}${currencyTo} at ${format( date, DATE_FORMAT - )}`, + )}. Please complement market data for ${DEFAULT_CURRENCY}${currencyFrom} and ${DEFAULT_CURRENCY}${currencyTo}.`, 'ExchangeRateDataService' ); } @@ -450,7 +465,7 @@ export class ExchangeRateDataService { } private async prepareCurrencies(): Promise { - let currencies: string[] = []; + let currencies: string[] = [DEFAULT_CURRENCY]; ( await this.prismaService.account.findMany({ diff --git a/apps/api/src/services/i18n/i18n.service.ts b/apps/api/src/services/i18n/i18n.service.ts index 39dab2d06..13193fc6a 100644 --- a/apps/api/src/services/i18n/i18n.service.ts +++ b/apps/api/src/services/i18n/i18n.service.ts @@ -1,9 +1,9 @@ -import { readFileSync, readdirSync } from 'fs'; -import { join } from 'path'; - import { DEFAULT_LANGUAGE_CODE } from '@ghostfolio/common/config'; + import { Logger } from '@nestjs/common'; import * as cheerio from 'cheerio'; +import { readFileSync, readdirSync } from 'fs'; +import { join } from 'path'; export class I18nService { private localesPath = join(__dirname, 'assets', 'locales'); diff --git a/apps/api/src/services/impersonation/impersonation.module.ts b/apps/api/src/services/impersonation/impersonation.module.ts index 506fb7f91..e4f503790 100644 --- a/apps/api/src/services/impersonation/impersonation.module.ts +++ b/apps/api/src/services/impersonation/impersonation.module.ts @@ -1,5 +1,6 @@ import { ImpersonationService } from '@ghostfolio/api/services/impersonation/impersonation.service'; import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; + import { Module } from '@nestjs/common'; @Module({ diff --git a/apps/api/src/services/impersonation/impersonation.service.ts b/apps/api/src/services/impersonation/impersonation.service.ts index e678356cb..223aa60c8 100644 --- a/apps/api/src/services/impersonation/impersonation.service.ts +++ b/apps/api/src/services/impersonation/impersonation.service.ts @@ -1,6 +1,7 @@ import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import type { RequestWithUser } from '@ghostfolio/common/types'; + import { Inject, Injectable } from '@nestjs/common'; import { REQUEST } from '@nestjs/core'; diff --git a/apps/api/src/services/interfaces/environment.interface.ts b/apps/api/src/services/interfaces/environment.interface.ts index c4baee3bf..5d3145a28 100644 --- a/apps/api/src/services/interfaces/environment.interface.ts +++ b/apps/api/src/services/interfaces/environment.interface.ts @@ -2,24 +2,25 @@ import { CleanedEnvAccessors } from 'envalid'; export interface Environment extends CleanedEnvAccessors { ACCESS_TOKEN_SALT: string; - ALPHA_VANTAGE_API_KEY: string; + API_KEY_ALPHA_VANTAGE: string; + API_KEY_BETTER_UPTIME: string; API_KEY_COINGECKO_DEMO: string; API_KEY_COINGECKO_PRO: string; - BETTER_UPTIME_API_KEY: string; + API_KEY_EOD_HISTORICAL_DATA: string; + API_KEY_FINANCIAL_MODELING_PREP: string; + API_KEY_OPEN_FIGI: string; + API_KEY_RAPID_API: string; CACHE_QUOTES_TTL: number; CACHE_TTL: number; DATA_SOURCE_EXCHANGE_RATES: string; DATA_SOURCE_IMPORT: string; DATA_SOURCES: string[]; - ENABLE_FEATURE_BLOG: boolean; ENABLE_FEATURE_FEAR_AND_GREED_INDEX: boolean; ENABLE_FEATURE_READ_ONLY_MODE: boolean; ENABLE_FEATURE_SOCIAL_LOGIN: boolean; ENABLE_FEATURE_STATISTICS: boolean; ENABLE_FEATURE_SUBSCRIPTION: boolean; ENABLE_FEATURE_SYSTEM_MESSAGE: boolean; - EOD_HISTORICAL_DATA_API_KEY: string; - FINANCIAL_MODELING_PREP_API_KEY: string; GOOGLE_CLIENT_ID: string; GOOGLE_SECRET: string; GOOGLE_SHEETS_ACCOUNT: string; @@ -28,9 +29,8 @@ export interface Environment extends CleanedEnvAccessors { JWT_SECRET_KEY: string; MAX_ACTIVITIES_TO_IMPORT: number; MAX_ITEM_IN_CACHE: number; - OPEN_FIGI_API_KEY: string; PORT: number; - RAPID_API_API_KEY: string; + REDIS_DB: number; REDIS_HOST: string; REDIS_PASSWORD: string; REDIS_PORT: number; @@ -42,5 +42,4 @@ export interface Environment extends CleanedEnvAccessors { TWITTER_ACCESS_TOKEN_SECRET: string; TWITTER_API_KEY: string; TWITTER_API_SECRET: string; - WEB_AUTH_RP_ID: string; } diff --git a/apps/api/src/services/interfaces/interfaces.ts b/apps/api/src/services/interfaces/interfaces.ts index 15505db63..b945d0945 100644 --- a/apps/api/src/services/interfaces/interfaces.ts +++ b/apps/api/src/services/interfaces/interfaces.ts @@ -1,10 +1,11 @@ import { DataProviderInfo, UniqueAsset } from '@ghostfolio/common/interfaces'; import { MarketState } from '@ghostfolio/common/types'; + import { Account, DataSource, SymbolProfile, - Type as TypeOfOrder + Type as ActivityType } from '@prisma/client'; export interface IOrder { @@ -17,7 +18,7 @@ export interface IOrder { quantity: number; symbol: string; symbolProfile: SymbolProfile; - type: TypeOfOrder; + type: ActivityType; unitPrice: number; } diff --git a/apps/api/src/services/market-data/market-data.module.ts b/apps/api/src/services/market-data/market-data.module.ts index 32367d5c0..77428ce49 100644 --- a/apps/api/src/services/market-data/market-data.module.ts +++ b/apps/api/src/services/market-data/market-data.module.ts @@ -1,4 +1,5 @@ import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; + import { Module } from '@nestjs/common'; import { MarketDataService } from './market-data.service'; 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 05172dfe1..faf429955 100644 --- a/apps/api/src/services/market-data/market-data.service.ts +++ b/apps/api/src/services/market-data/market-data.service.ts @@ -4,6 +4,7 @@ import { IDataGatheringItem } from '@ghostfolio/api/services/interfaces/interfac import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { resetHours } from '@ghostfolio/common/helper'; import { UniqueAsset } from '@ghostfolio/common/interfaces'; + import { Injectable } from '@nestjs/common'; import { DataSource, diff --git a/apps/api/src/services/prisma/prisma.module.ts b/apps/api/src/services/prisma/prisma.module.ts index 7cd76d314..3875c8cab 100644 --- a/apps/api/src/services/prisma/prisma.module.ts +++ b/apps/api/src/services/prisma/prisma.module.ts @@ -1,4 +1,5 @@ import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; + import { Module } from '@nestjs/common'; @Module({ diff --git a/apps/api/src/services/property/property.module.ts b/apps/api/src/services/property/property.module.ts index 50fba955d..239c560c1 100644 --- a/apps/api/src/services/property/property.module.ts +++ b/apps/api/src/services/property/property.module.ts @@ -1,4 +1,5 @@ import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; + import { Module } from '@nestjs/common'; import { PropertyService } from './property.service'; diff --git a/apps/api/src/services/property/property.service.ts b/apps/api/src/services/property/property.service.ts index cb5902cd5..34ce5713b 100644 --- a/apps/api/src/services/property/property.service.ts +++ b/apps/api/src/services/property/property.service.ts @@ -3,6 +3,7 @@ import { PROPERTY_CURRENCIES, PROPERTY_IS_USER_SIGNUP_ENABLED } from '@ghostfolio/common/config'; + import { Injectable } from '@nestjs/common'; @Injectable() diff --git a/apps/api/src/services/symbol-profile/symbol-profile.module.ts b/apps/api/src/services/symbol-profile/symbol-profile.module.ts index fb3fc4d62..2360cad10 100644 --- a/apps/api/src/services/symbol-profile/symbol-profile.module.ts +++ b/apps/api/src/services/symbol-profile/symbol-profile.module.ts @@ -1,4 +1,5 @@ import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; + import { Module } from '@nestjs/common'; import { SymbolProfileService } from './symbol-profile.service'; 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 1cab9b061..751feda22 100644 --- a/apps/api/src/services/symbol-profile/symbol-profile.service.ts +++ b/apps/api/src/services/symbol-profile/symbol-profile.service.ts @@ -7,6 +7,7 @@ import { } from '@ghostfolio/common/interfaces'; import { Country } from '@ghostfolio/common/interfaces/country.interface'; import { Sector } from '@ghostfolio/common/interfaces/sector.interface'; + import { Injectable } from '@nestjs/common'; import { Prisma, SymbolProfile, SymbolProfileOverrides } from '@prisma/client'; import { continents, countries } from 'countries-list'; @@ -188,9 +189,8 @@ export class SymbolProfileService { return { code, weight, - continent: - continents[countries[code as string]?.continent] ?? UNKNOWN_KEY, - name: countries[code as string]?.name ?? UNKNOWN_KEY + continent: continents[countries[code]?.continent] ?? UNKNOWN_KEY, + name: countries[code]?.name ?? UNKNOWN_KEY }; }); } diff --git a/apps/api/src/services/tag/tag.module.ts b/apps/api/src/services/tag/tag.module.ts index 76ed9fcd6..ea129e3ec 100644 --- a/apps/api/src/services/tag/tag.module.ts +++ b/apps/api/src/services/tag/tag.module.ts @@ -1,4 +1,5 @@ import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; + import { Module } from '@nestjs/common'; import { TagService } from './tag.service'; diff --git a/apps/api/src/services/tag/tag.service.ts b/apps/api/src/services/tag/tag.service.ts index c02345784..25e0a32c4 100644 --- a/apps/api/src/services/tag/tag.service.ts +++ b/apps/api/src/services/tag/tag.service.ts @@ -1,4 +1,5 @@ import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; + import { Injectable } from '@nestjs/common'; @Injectable() diff --git a/apps/api/src/services/twitter-bot/twitter-bot.module.ts b/apps/api/src/services/twitter-bot/twitter-bot.module.ts index d4d565cb1..4a2b1589a 100644 --- a/apps/api/src/services/twitter-bot/twitter-bot.module.ts +++ b/apps/api/src/services/twitter-bot/twitter-bot.module.ts @@ -2,6 +2,7 @@ import { BenchmarkModule } from '@ghostfolio/api/app/benchmark/benchmark.module' import { SymbolModule } from '@ghostfolio/api/app/symbol/symbol.module'; import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; import { TwitterBotService } from '@ghostfolio/api/services/twitter-bot/twitter-bot.service'; + import { Module } from '@nestjs/common'; @Module({ diff --git a/apps/api/src/services/twitter-bot/twitter-bot.service.ts b/apps/api/src/services/twitter-bot/twitter-bot.service.ts index 02a11b74f..5a98afaed 100644 --- a/apps/api/src/services/twitter-bot/twitter-bot.service.ts +++ b/apps/api/src/services/twitter-bot/twitter-bot.service.ts @@ -9,6 +9,7 @@ import { resolveFearAndGreedIndex, resolveMarketCondition } from '@ghostfolio/common/helper'; + import { Injectable, Logger } from '@nestjs/common'; import { isWeekend } from 'date-fns'; import { TwitterApi, TwitterApiReadWrite } from 'twitter-api-v2'; diff --git a/apps/client-e2e/src/support/index.ts b/apps/client-e2e/src/support/index.ts index 3d469a6b6..fad130159 100644 --- a/apps/client-e2e/src/support/index.ts +++ b/apps/client-e2e/src/support/index.ts @@ -12,6 +12,5 @@ // You can read more here: // https://on.cypress.io/configuration // *********************************************************** - // Import commands.js using ES2015 syntax: import './commands'; diff --git a/apps/client/project.json b/apps/client/project.json index 4eb03df3c..8d778bef4 100644 --- a/apps/client/project.json +++ b/apps/client/project.json @@ -13,13 +13,13 @@ "build": { "executor": "@nx/angular:webpack-browser", "options": { + "deleteOutputPath": false, "localize": true, "outputPath": "dist/apps/client", "index": "apps/client/src/index.html", "main": "apps/client/src/main.ts", "polyfills": "apps/client/src/polyfills.ts", "tsConfig": "apps/client/tsconfig.app.json", - "assets": [], "styles": [ "apps/client/src/assets/fonts/inter.css", "apps/client/src/styles/theme.scss", @@ -108,13 +108,22 @@ "options": { "commands": [ { - "command": "shx mkdir -p dist/apps/client" + "command": "shx rm -rf dist/apps/client" }, { - "command": "shx cp -r apps/client/src/assets dist/apps/client" + "command": "shx mkdir -p dist/apps/client/.well-known" }, { - "command": "shx cp -r apps/client/src/assets/.well-known dist/apps/client" + "command": "shx mkdir -p dist/apps/client/assets" + }, + { + "command": "shx mkdir -p dist/apps/client/ionicons" + }, + { + "command": "shx cp -r apps/client/src/assets/* dist/apps/client/assets" + }, + { + "command": "shx cp -r apps/client/src/assets/.well-known/* dist/apps/client/.well-known" }, { "command": "shx cp apps/client/src/assets/favicon.ico dist/apps/client" @@ -128,9 +137,6 @@ { "command": "shx cp apps/client/src/assets/site.webmanifest dist/apps/client" }, - { - "command": "shx cp -r apps/client/src/locales dist/apps/api/assets" - }, { "command": "shx cp node_modules/ionicons/dist/index.js dist/apps/client" }, @@ -138,7 +144,7 @@ "command": "shx cp node_modules/ionicons/dist/ionicons.js dist/apps/client" }, { - "command": "shx cp -r node_modules/ionicons/dist/ionicons dist/apps/client/ionicons" + "command": "shx cp -r node_modules/ionicons/dist/ionicons/* dist/apps/client/ionicons" }, { "command": "shx cp CHANGELOG.md dist/apps/client/assets" @@ -146,7 +152,8 @@ { "command": "shx cp LICENSE dist/apps/client/assets" } - ] + ], + "parallel": false } }, "serve": { diff --git a/apps/client/src/app/adapter/custom-date-adapter.ts b/apps/client/src/app/adapter/custom-date-adapter.ts index 53809dc5f..724ea7211 100644 --- a/apps/client/src/app/adapter/custom-date-adapter.ts +++ b/apps/client/src/app/adapter/custom-date-adapter.ts @@ -1,6 +1,7 @@ +import { getDateFormatString } from '@ghostfolio/common/helper'; + import { Inject, forwardRef } from '@angular/core'; import { MAT_DATE_LOCALE, NativeDateAdapter } from '@angular/material/core'; -import { getDateFormatString } from '@ghostfolio/common/helper'; import { addYears, format, getYear, parse } from 'date-fns'; export class CustomDateAdapter extends NativeDateAdapter { diff --git a/apps/client/src/app/app-routing.module.ts b/apps/client/src/app/app-routing.module.ts index 26080e884..8f7aaea4e 100644 --- a/apps/client/src/app/app-routing.module.ts +++ b/apps/client/src/app/app-routing.module.ts @@ -1,6 +1,7 @@ +import { PageTitleStrategy } from '@ghostfolio/client/services/page-title.strategy'; + import { NgModule } from '@angular/core'; import { RouterModule, Routes, TitleStrategy } from '@angular/router'; -import { PageTitleStrategy } from '@ghostfolio/client/services/page-title.strategy'; import { ModulePreloadService } from './core/module-preload.service'; diff --git a/apps/client/src/app/app.component.html b/apps/client/src/app/app.component.html index 8d4b65ccc..713eb1a94 100644 --- a/apps/client/src/app/app.component.html +++ b/apps/client/src/app/app.component.html @@ -64,7 +64,7 @@
Ghostfolio
  • About
  • -
  • +
  • Blog
  • diff --git a/apps/client/src/app/app.component.ts b/apps/client/src/app/app.component.ts index 2ffdd2189..8d6390f02 100644 --- a/apps/client/src/app/app.component.ts +++ b/apps/client/src/app/app.component.ts @@ -1,3 +1,8 @@ +import { getCssVariable } from '@ghostfolio/common/helper'; +import { InfoItem, User } from '@ghostfolio/common/interfaces'; +import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { ColorScheme } from '@ghostfolio/common/types'; + import { DOCUMENT } from '@angular/common'; import { ChangeDetectionStrategy, @@ -10,10 +15,6 @@ import { } from '@angular/core'; import { Title } from '@angular/platform-browser'; import { NavigationEnd, PRIMARY_OUTLET, Router } from '@angular/router'; -import { getCssVariable } from '@ghostfolio/common/helper'; -import { InfoItem, User } from '@ghostfolio/common/interfaces'; -import { hasPermission, permissions } from '@ghostfolio/common/permissions'; -import { ColorScheme } from '@ghostfolio/common/types'; import { DeviceDetectorService } from 'ngx-device-detector'; import { Subject } from 'rxjs'; import { filter, takeUntil } from 'rxjs/operators'; @@ -38,7 +39,6 @@ export class AppComponent implements OnDestroy, OnInit { public currentYear = new Date().getFullYear(); public deviceType: string; public hasInfoMessage: boolean; - public hasPermissionForBlog: boolean; public hasPermissionForStatistics: boolean; public hasPermissionForSubscription: boolean; public hasPermissionToAccessFearAndGreedIndex: boolean; @@ -81,11 +81,6 @@ export class AppComponent implements OnDestroy, OnInit { this.deviceType = this.deviceService.getDeviceInfo().deviceType; this.info = this.dataService.fetchInfo(); - this.hasPermissionForBlog = hasPermission( - this.info?.globalPermissions, - permissions.enableBlog - ); - this.hasPermissionForSubscription = hasPermission( this.info?.globalPermissions, permissions.enableSubscription @@ -111,6 +106,7 @@ export class AppComponent implements OnDestroy, OnInit { this.hasTabs = (this.currentRoute === this.routerLinkAbout[0].slice(1) || + this.currentRoute === this.routerLinkFaq[0].slice(1) || this.currentRoute === 'account' || this.currentRoute === 'admin' || this.currentRoute === 'home' || @@ -120,7 +116,6 @@ export class AppComponent implements OnDestroy, OnInit { this.showFooter = (this.currentRoute === 'blog' || - this.currentRoute === this.routerLinkFaq[0].slice(1) || this.currentRoute === this.routerLinkFeatures[0].slice(1) || this.currentRoute === this.routerLinkMarkets[0].slice(1) || this.currentRoute === 'open' || diff --git a/apps/client/src/app/app.module.ts b/apps/client/src/app/app.module.ts index 608ba0100..f8b52faa9 100644 --- a/apps/client/src/app/app.module.ts +++ b/apps/client/src/app/app.module.ts @@ -1,3 +1,5 @@ +import { GfLogoModule } from '@ghostfolio/ui/logo'; + import { Platform } from '@angular/cdk/platform'; import { HttpClientModule } from '@angular/common/http'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; @@ -14,7 +16,6 @@ import { MatTooltipModule } from '@angular/material/tooltip'; import { BrowserModule } from '@angular/platform-browser'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { ServiceWorkerModule } from '@angular/service-worker'; -import { GfLogoModule } from '@ghostfolio/ui/logo'; import { MarkdownModule } from 'ngx-markdown'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { NgxStripeModule, STRIPE_PUBLISHABLE_KEY } from 'ngx-stripe'; diff --git a/apps/client/src/app/components/access-table/access-table.component.ts b/apps/client/src/app/components/access-table/access-table.component.ts index c0db8fb2f..12412a3c2 100644 --- a/apps/client/src/app/components/access-table/access-table.component.ts +++ b/apps/client/src/app/components/access-table/access-table.component.ts @@ -1,3 +1,6 @@ +import { DEFAULT_LANGUAGE_CODE } from '@ghostfolio/common/config'; +import { Access } from '@ghostfolio/common/interfaces'; + import { ChangeDetectionStrategy, Component, @@ -8,8 +11,6 @@ import { Output } from '@angular/core'; import { MatTableDataSource } from '@angular/material/table'; -import { DEFAULT_LANGUAGE_CODE } from '@ghostfolio/common/config'; -import { Access } from '@ghostfolio/common/interfaces'; @Component({ selector: 'gf-access-table', diff --git a/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts b/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts index d5dfc7680..760f8081b 100644 --- a/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts +++ b/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts @@ -1,16 +1,4 @@ -import { - ChangeDetectionStrategy, - ChangeDetectorRef, - Component, - Inject, - OnDestroy, - OnInit -} from '@angular/core'; -import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; -import { Sort, SortDirection } from '@angular/material/sort'; -import { MatTableDataSource } from '@angular/material/table'; import { DataService } from '@ghostfolio/client/services/data.service'; -import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { downloadAsFile } from '@ghostfolio/common/helper'; import { @@ -21,6 +9,18 @@ import { } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { OrderWithAccount } from '@ghostfolio/common/types'; + +import { + ChangeDetectionStrategy, + ChangeDetectorRef, + Component, + Inject, + OnDestroy, + OnInit +} from '@angular/core'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { Sort, SortDirection } from '@angular/material/sort'; +import { MatTableDataSource } from '@angular/material/table'; import Big from 'big.js'; import { format, parseISO } from 'date-fns'; import { isNumber } from 'lodash'; @@ -43,7 +43,6 @@ export class AccountDetailDialog implements OnDestroy, OnInit { public currency: string; public dataSource: MatTableDataSource; public equity: number; - public hasImpersonationId: boolean; public hasPermissionToDeleteAccountBalance: boolean; public historicalDataItems: HistoricalDataItem[]; public holdings: PortfolioPosition[]; @@ -65,7 +64,6 @@ export class AccountDetailDialog implements OnDestroy, OnInit { @Inject(MAT_DIALOG_DATA) public data: AccountDetailDialogParams, private dataService: DataService, public dialogRef: MatDialogRef, - private impersonationStorageService: ImpersonationStorageService, private userService: UserService ) { this.userService.stateChanged @@ -117,7 +115,7 @@ export class AccountDetailDialog implements OnDestroy, OnInit { ); this.dataService - .fetchPortfolioDetails({ + .fetchPortfolioHoldings({ filters: [ { type: 'ACCOUNT', @@ -127,22 +125,11 @@ export class AccountDetailDialog implements OnDestroy, OnInit { }) .pipe(takeUntil(this.unsubscribeSubject)) .subscribe(({ holdings }) => { - this.holdings = []; - - for (const [symbol, holding] of Object.entries(holdings)) { - this.holdings.push(holding); - } + this.holdings = holdings; this.changeDetectorRef.markForCheck(); }); - this.impersonationStorageService - .onChangeHasImpersonation() - .pipe(takeUntil(this.unsubscribeSubject)) - .subscribe((impersonationId) => { - this.hasImpersonationId = !!impersonationId; - }); - this.fetchAccountBalances(); this.fetchActivities(); this.fetchPortfolioPerformance(); @@ -165,17 +152,9 @@ export class AccountDetailDialog implements OnDestroy, OnInit { } public onExport() { - let activityIds = []; - - if (this.user?.settings?.isExperimentalFeatures === true) { - activityIds = this.dataSource.data.map(({ id }) => { - return id; - }); - } else { - activityIds = this.activities.map(({ id }) => { - return id; - }); - } + let activityIds = this.dataSource.data.map(({ id }) => { + return id; + }); this.dataService .fetchExport({ activityIds }) @@ -215,36 +194,21 @@ export class AccountDetailDialog implements OnDestroy, OnInit { private fetchActivities() { this.isLoadingActivities = true; - if (this.user?.settings?.isExperimentalFeatures === true) { - this.dataService - .fetchActivities({ - filters: [{ id: this.data.accountId, type: 'ACCOUNT' }], - sortColumn: this.sortColumn, - sortDirection: this.sortDirection - }) - .pipe(takeUntil(this.unsubscribeSubject)) - .subscribe(({ activities, count }) => { - this.dataSource = new MatTableDataSource(activities); - this.totalItems = count; - - this.isLoadingActivities = false; - - this.changeDetectorRef.markForCheck(); - }); - } else { - this.dataService - .fetchActivities({ - filters: [{ id: this.data.accountId, type: 'ACCOUNT' }] - }) - .pipe(takeUntil(this.unsubscribeSubject)) - .subscribe(({ activities }) => { - this.activities = activities; + this.dataService + .fetchActivities({ + filters: [{ id: this.data.accountId, type: 'ACCOUNT' }], + sortColumn: this.sortColumn, + sortDirection: this.sortDirection + }) + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe(({ activities, count }) => { + this.dataSource = new MatTableDataSource(activities); + this.totalItems = count; - this.isLoadingActivities = false; + this.isLoadingActivities = false; - this.changeDetectorRef.markForCheck(); - }); - } + this.changeDetectorRef.markForCheck(); + }); } private fetchPortfolioPerformance() { @@ -259,7 +223,8 @@ export class AccountDetailDialog implements OnDestroy, OnInit { } ], range: 'max', - withExcludedAccounts: true + withExcludedAccounts: true, + withItems: true }) .pipe(takeUntil(this.unsubscribeSubject)) .subscribe(({ chart }) => { @@ -268,7 +233,8 @@ export class AccountDetailDialog implements OnDestroy, OnInit { return { date, value: - this.hasImpersonationId || this.user.settings.isRestrictedView + this.data.hasImpersonationId || + this.user.settings.isRestrictedView ? netWorthInPercentage : netWorth }; diff --git a/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html b/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html index 19b3e8a4e..041a779c4 100644 --- a/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html +++ b/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html @@ -25,7 +25,9 @@ class="h-100" [currency]="user?.settings?.baseCurrency" [historicalDataItems]="historicalDataItems" - [isInPercent]="hasImpersonationId || user.settings.isRestrictedView" + [isInPercent]=" + data.hasImpersonationId || user.settings.isRestrictedView + " [isLoading]="isLoadingChart" [locale]="user?.settings?.locale" /> @@ -77,6 +79,7 @@ @@ -86,13 +89,14 @@
    Activities
    - - @@ -126,7 +117,11 @@ [accountBalances]="accountBalances" [accountId]="data.accountId" [locale]="user?.settings?.locale" - [showActions]="!hasImpersonationId && hasPermissionToDeleteAccountBalance && !user.settings.isRestrictedView" + [showActions]=" + !data.hasImpersonationId && + hasPermissionToDeleteAccountBalance && + !user.settings.isRestrictedView + " (accountBalanceDeleted)="onDeleteAccountBalance($event)" /> diff --git a/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.module.ts b/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.module.ts index d015883df..faba1d6d2 100644 --- a/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.module.ts +++ b/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.module.ts @@ -1,16 +1,16 @@ -import { CommonModule } from '@angular/common'; -import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; -import { MatButtonModule } from '@angular/material/button'; -import { MatDialogModule } from '@angular/material/dialog'; -import { MatTabsModule } from '@angular/material/tabs'; import { GfDialogFooterModule } from '@ghostfolio/client/components/dialog-footer/dialog-footer.module'; import { GfDialogHeaderModule } from '@ghostfolio/client/components/dialog-header/dialog-header.module'; -import { GfHoldingsTableModule } from '@ghostfolio/ui/holdings-table/holdings-table.module'; import { GfInvestmentChartModule } from '@ghostfolio/client/components/investment-chart/investment-chart.module'; import { GfAccountBalancesModule } from '@ghostfolio/ui/account-balances/account-balances.module'; -import { GfActivitiesTableLazyModule } from '@ghostfolio/ui/activities-table-lazy/activities-table-lazy.module'; import { GfActivitiesTableModule } from '@ghostfolio/ui/activities-table/activities-table.module'; +import { GfHoldingsTableModule } from '@ghostfolio/ui/holdings-table/holdings-table.module'; import { GfValueModule } from '@ghostfolio/ui/value'; + +import { CommonModule } from '@angular/common'; +import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatDialogModule } from '@angular/material/dialog'; +import { MatTabsModule } from '@angular/material/tabs'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { AccountDetailDialog } from './account-detail-dialog.component'; @@ -21,7 +21,6 @@ import { AccountDetailDialog } from './account-detail-dialog.component'; CommonModule, GfAccountBalancesModule, GfActivitiesTableModule, - GfActivitiesTableLazyModule, GfDialogFooterModule, GfDialogHeaderModule, GfHoldingsTableModule, diff --git a/apps/client/src/app/components/accounts-table/accounts-table.component.html b/apps/client/src/app/components/accounts-table/accounts-table.component.html index 199628a94..cd4f139c4 100644 --- a/apps/client/src/app/components/accounts-table/accounts-table.component.html +++ b/apps/client/src/app/components/accounts-table/accounts-table.component.html @@ -40,12 +40,7 @@ [tooltip]="element.Platform?.name" [url]="element.Platform?.url" /> - {{ element.name }} - (Default) + {{ element.name }} Total @@ -261,7 +256,7 @@ @@ -33,10 +35,28 @@ mat-menu-item type="button" [disabled]="assetProfileForm.dirty" - (click)="onGatherProfileDataBySymbol({dataSource: data.dataSource, symbol: data.symbol})" + (click)=" + onGatherProfileDataBySymbol({ + dataSource: data.dataSource, + symbol: data.symbol + }) + " > Gather Profile Data + @@ -73,7 +93,12 @@ color="accent" mat-flat-button type="button" - [disabled]="!assetProfileForm.controls['historicalData']?.controls['csvString'].touched || assetProfileForm.controls['historicalData']?.controls['csvString']?.value === ''" + [disabled]=" + !assetProfileForm.controls['historicalData']?.controls['csvString'] + .touched || + assetProfileForm.controls['historicalData']?.controls['csvString'] + ?.value === '' + " (click)="onImportHistoricalData()" > Import @@ -129,11 +154,15 @@ > - + @if ( + assetProfile?.countries?.length === 1 && + assetProfile?.sectors?.length === 1 + ) {
    Country
    -
    - + } @else {
    Sectors
    -
    + }
    @@ -196,7 +224,7 @@ Asset Class - + Asset Sub Class - + Benchmark
    @@ -255,7 +293,9 @@ color="accent" mat-flat-button type="button" - [disabled]="assetProfileForm.controls['scraperConfiguration'].value === '{}'" + [disabled]=" + assetProfileForm.controls['scraperConfiguration'].value === '{}' + " (click)="onTestMarketData()" > Test diff --git a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.module.ts b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.module.ts index 8cbe21ef3..846b5e599 100644 --- a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.module.ts +++ b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.module.ts @@ -1,3 +1,9 @@ +import { GfAdminMarketDataDetailModule } from '@ghostfolio/client/components/admin-market-data-detail/admin-market-data-detail.module'; +import { AdminMarketDataService } from '@ghostfolio/client/components/admin-market-data/admin-market-data.service'; +import { GfCurrencySelectorModule } from '@ghostfolio/ui/currency-selector/currency-selector.module'; +import { GfPortfolioProportionChartModule } from '@ghostfolio/ui/portfolio-proportion-chart/portfolio-proportion-chart.module'; +import { GfValueModule } from '@ghostfolio/ui/value'; + import { TextFieldModule } from '@angular/cdk/text-field'; import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; @@ -9,10 +15,6 @@ import { MatInputModule } from '@angular/material/input'; import { MatMenuModule } from '@angular/material/menu'; import { MatSelectModule } from '@angular/material/select'; import { MatSnackBarModule } from '@angular/material/snack-bar'; -import { GfAdminMarketDataDetailModule } from '@ghostfolio/client/components/admin-market-data-detail/admin-market-data-detail.module'; -import { GfCurrencySelectorModule } from '@ghostfolio/ui/currency-selector/currency-selector.module'; -import { GfPortfolioProportionChartModule } from '@ghostfolio/ui/portfolio-proportion-chart/portfolio-proportion-chart.module'; -import { GfValueModule } from '@ghostfolio/ui/value'; import { AssetProfileDialog } from './asset-profile-dialog.component'; @@ -35,6 +37,7 @@ import { AssetProfileDialog } from './asset-profile-dialog.component'; ReactiveFormsModule, TextFieldModule ], + providers: [AdminMarketDataService], schemas: [CUSTOM_ELEMENTS_SCHEMA] }) export class GfAssetProfileDialogModule {} diff --git a/apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.component.ts b/apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.component.ts index eea8898c1..d5415524b 100644 --- a/apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.component.ts +++ b/apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.component.ts @@ -1,3 +1,5 @@ +import { AdminService } from '@ghostfolio/client/services/admin.service'; + import { ChangeDetectionStrategy, Component, @@ -13,7 +15,6 @@ import { Validators } from '@angular/forms'; import { MatDialogRef } from '@angular/material/dialog'; -import { AdminService } from '@ghostfolio/client/services/admin.service'; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, diff --git a/apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html b/apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html index e7ed9352a..0f4901c31 100644 --- a/apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html +++ b/apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -12,7 +12,7 @@ [value]="mode" (change)="onRadioChange($event.value)" > - + diff --git a/apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.module.ts b/apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.module.ts index 2d50200c4..888abfa56 100644 --- a/apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.module.ts +++ b/apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.module.ts @@ -1,3 +1,5 @@ +import { GfSymbolAutocompleteModule } from '@ghostfolio/ui/symbol-autocomplete'; + import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; @@ -6,7 +8,6 @@ import { MatDialogModule } from '@angular/material/dialog'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatInputModule } from '@angular/material/input'; import { MatRadioModule } from '@angular/material/radio'; -import { GfSymbolAutocompleteModule } from '@ghostfolio/ui/symbol-autocomplete'; import { CreateAssetProfileDialog } from './create-asset-profile-dialog.component'; 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 4b3e1f125..b9c1f3a5f 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 @@ -1,5 +1,3 @@ -import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; -import { MatSlideToggleChange } from '@angular/material/slide-toggle'; import { AdminService } from '@ghostfolio/client/services/admin.service'; import { CacheService } from '@ghostfolio/client/services/cache.service'; import { DataService } from '@ghostfolio/client/services/data.service'; @@ -7,6 +5,7 @@ import { UserService } from '@ghostfolio/client/services/user/user.service'; import { PROPERTY_COUPONS, PROPERTY_CURRENCIES, + PROPERTY_IS_DATA_GATHERING_ENABLED, PROPERTY_IS_READ_ONLY_MODE, PROPERTY_IS_USER_SIGNUP_ENABLED, PROPERTY_SYSTEM_MESSAGE, @@ -19,6 +18,9 @@ import { User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; + +import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; +import { MatSlideToggleChange } from '@angular/material/slide-toggle'; import { differenceInSeconds, formatDistanceToNowStrict, @@ -43,6 +45,7 @@ export class AdminOverviewComponent implements OnDestroy, OnInit { public hasPermissionForSystemMessage: boolean; public hasPermissionToToggleReadOnlyMode: boolean; public info: InfoItem; + public isDataGatheringEnabled: boolean; public permissions = permissions; public systemMessage: SystemMessage; public transactionCount: number; @@ -168,6 +171,13 @@ export class AdminOverviewComponent implements OnDestroy, OnInit { } } + public onEnableDataGatheringChange(aEvent: MatSlideToggleChange) { + this.putAdminSetting({ + key: PROPERTY_IS_DATA_GATHERING_ENABLED, + value: aEvent.checked ? undefined : false + }); + } + public onFlushCache() { const confirmation = confirm( $localize`Do you really want to flush the cache?` @@ -233,6 +243,10 @@ export class AdminOverviewComponent implements OnDestroy, OnInit { this.coupons = (settings[PROPERTY_COUPONS] as Coupon[]) ?? []; this.customCurrencies = settings[PROPERTY_CURRENCIES] as string[]; this.exchangeRates = exchangeRates; + this.isDataGatheringEnabled = + settings[PROPERTY_IS_DATA_GATHERING_ENABLED] === false + ? false + : true; this.systemMessage = settings[ PROPERTY_SYSTEM_MESSAGE ] as SystemMessage; diff --git a/apps/client/src/app/components/admin-overview/admin-overview.html b/apps/client/src/app/components/admin-overview/admin-overview.html index bdf623bab..d23210b54 100644 --- a/apps/client/src/app/components/admin-overview/admin-overview.html +++ b/apps/client/src/app/components/admin-overview/admin-overview.html @@ -28,7 +28,7 @@ [value]="transactionCount" />
    - {{ transactionCount / userCount | number : '1.2-2' }} + {{ transactionCount / userCount | number: '1.2-2' }} per User
    @@ -69,10 +69,10 @@ @@ -112,9 +112,11 @@ + />
    @@ -125,14 +127,25 @@ hideIcon="true" [checked]="info?.isReadOnlyMode" (change)="onReadOnlyModeChange($event)" - > + /> +
    + +
    +
    Data Gathering
    +
    +
    System Message
    -
    {{ systemMessage | json }}
    +
    {{ systemMessage | json }}
    - -
    - +
    - +
    @@ -114,7 +120,11 @@ [isCurrency]="true" [locale]="locale" [unit]="baseCurrency" - [value]="isLoading ? undefined : summary?.currentNetPerformance" + [value]=" + isLoading + ? undefined + : summary?.currentNetPerformanceWithCurrencyEffect + " /> @@ -134,7 +144,11 @@ [colorizeSign]="true" [isPercent]="true" [locale]="locale" - [value]="isLoading ? undefined : summary?.currentNetPerformancePercent" + [value]=" + isLoading + ? undefined + : summary?.currentNetPerformancePercentWithCurrencyEffect + " /> @@ -268,7 +282,7 @@ [isCurrency]="true" [locale]="locale" [unit]="baseCurrency" - [value]="isLoading ? undefined : summary?.netWorth" + [value]="isLoading ? undefined : summary?.totalValueInBaseCurrency" /> @@ -283,7 +297,11 @@ [colorizeSign]="true" [isPercent]="true" [locale]="locale" - [value]="isLoading ? undefined : summary?.annualizedPerformancePercent" + [value]=" + isLoading + ? undefined + : summary?.annualizedPerformancePercentWithCurrencyEffect + " /> @@ -310,7 +328,7 @@ [isCurrency]="true" [locale]="locale" [unit]="baseCurrency" - [value]="isLoading ? undefined : summary?.dividend" + [value]="isLoading ? undefined : summary?.dividendInBaseCurrency" /> diff --git a/apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts b/apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts index 337fc5211..9ceae5186 100644 --- a/apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts +++ b/apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts @@ -1,3 +1,6 @@ +import { getDateFnsLocale, getLocale } from '@ghostfolio/common/helper'; +import { PortfolioSummary } from '@ghostfolio/common/interfaces'; + import { ChangeDetectionStrategy, Component, @@ -7,8 +10,6 @@ import { OnInit, Output } from '@angular/core'; -import { getDateFnsLocale } from '@ghostfolio/common/helper'; -import { PortfolioSummary } from '@ghostfolio/common/interfaces'; import { formatDistanceToNow } from 'date-fns'; @Component({ @@ -22,7 +23,7 @@ export class PortfolioSummaryComponent implements OnChanges, OnInit { @Input() hasPermissionToUpdateUserSettings: boolean; @Input() isLoading: boolean; @Input() language: string; - @Input() locale: string; + @Input() locale = getLocale(); @Input() summary: PortfolioSummary; @Output() emergencyFundChanged = new EventEmitter(); diff --git a/apps/client/src/app/components/portfolio-summary/portfolio-summary.module.ts b/apps/client/src/app/components/portfolio-summary/portfolio-summary.module.ts index 1724aa8c5..be9f6fef8 100644 --- a/apps/client/src/app/components/portfolio-summary/portfolio-summary.module.ts +++ b/apps/client/src/app/components/portfolio-summary/portfolio-summary.module.ts @@ -1,6 +1,7 @@ +import { GfValueModule } from '@ghostfolio/ui/value'; + import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; -import { GfValueModule } from '@ghostfolio/ui/value'; import { PortfolioSummaryComponent } from './portfolio-summary.component'; diff --git a/apps/client/src/app/components/position/position-detail-dialog/interfaces/interfaces.ts b/apps/client/src/app/components/position/position-detail-dialog/interfaces/interfaces.ts index 0a7db166e..bbededf57 100644 --- a/apps/client/src/app/components/position/position-detail-dialog/interfaces/interfaces.ts +++ b/apps/client/src/app/components/position/position-detail-dialog/interfaces/interfaces.ts @@ -1,4 +1,5 @@ import { ColorScheme } from '@ghostfolio/common/types'; + import { DataSource } from '@prisma/client'; export interface PositionDetailDialogParams { diff --git a/apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.component.ts b/apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.component.ts index 55dcadec3..2e3f8f1d3 100644 --- a/apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.component.ts +++ b/apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.component.ts @@ -1,14 +1,3 @@ -import { - ChangeDetectionStrategy, - ChangeDetectorRef, - Component, - Inject, - OnDestroy, - OnInit -} from '@angular/core'; -import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; -import { Sort, SortDirection } from '@angular/material/sort'; -import { MatTableDataSource } from '@angular/material/table'; import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { DATE_FORMAT, downloadAsFile } from '@ghostfolio/common/helper'; @@ -20,7 +9,19 @@ import { } from '@ghostfolio/common/interfaces'; import { OrderWithAccount } from '@ghostfolio/common/types'; import { translate } from '@ghostfolio/ui/i18n'; -import { Tag } from '@prisma/client'; + +import { + ChangeDetectionStrategy, + ChangeDetectorRef, + Component, + Inject, + OnDestroy, + OnInit +} from '@angular/core'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { SortDirection } from '@angular/material/sort'; +import { MatTableDataSource } from '@angular/material/table'; +import { Account, Tag } from '@prisma/client'; import { format, isSameMonth, isToday, parseISO } from 'date-fns'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; @@ -35,6 +36,7 @@ import { PositionDetailDialogParams } from './interfaces/interfaces'; styleUrls: ['./position-detail-dialog.component.scss'] }) export class PositionDetailDialog implements OnDestroy, OnInit { + public accounts: Account[]; public activities: OrderWithAccount[]; public assetClass: string; public assetSubClass: string; @@ -48,15 +50,13 @@ export class PositionDetailDialog implements OnDestroy, OnInit { public dividendInBaseCurrency: number; public feeInBaseCurrency: number; public firstBuyDate: string; - public grossPerformance: number; - public grossPerformancePercent: number; public historicalDataItems: LineChartItem[]; public investment: number; public marketPrice: number; public maxPrice: number; public minPrice: number; - public netPerformance: number; - public netPerformancePercent: number; + public netPerformancePercentWithCurrencyEffect: number; + public netPerformanceWithCurrencyEffect: number; public quantity: number; public quantityPrecision = 2; public reportDataGlitchMail: string; @@ -82,7 +82,7 @@ export class PositionDetailDialog implements OnDestroy, OnInit { private userService: UserService ) {} - public ngOnInit(): void { + public ngOnInit() { this.dataService .fetchPositionDetail({ dataSource: this.data.dataSource, @@ -91,20 +91,19 @@ export class PositionDetailDialog implements OnDestroy, OnInit { .pipe(takeUntil(this.unsubscribeSubject)) .subscribe( ({ + accounts, averagePrice, dataProviderInfo, dividendInBaseCurrency, feeInBaseCurrency, firstBuyDate, - grossPerformance, - grossPerformancePercent, historicalData, investment, marketPrice, maxPrice, minPrice, - netPerformance, - netPerformancePercent, + netPerformancePercentWithCurrencyEffect, + netPerformanceWithCurrencyEffect, orders, quantity, SymbolProfile, @@ -112,6 +111,7 @@ export class PositionDetailDialog implements OnDestroy, OnInit { transactionCount, value }) => { + this.accounts = accounts; this.activities = orders; this.averagePrice = averagePrice; this.benchmarkDataItems = []; @@ -121,8 +121,6 @@ export class PositionDetailDialog implements OnDestroy, OnInit { this.dividendInBaseCurrency = dividendInBaseCurrency; this.feeInBaseCurrency = feeInBaseCurrency; this.firstBuyDate = firstBuyDate; - this.grossPerformance = grossPerformance; - this.grossPerformancePercent = grossPerformancePercent; this.historicalDataItems = historicalData.map( (historicalDataItem) => { this.benchmarkDataItems.push({ @@ -140,8 +138,10 @@ export class PositionDetailDialog implements OnDestroy, OnInit { this.marketPrice = marketPrice; this.maxPrice = maxPrice; this.minPrice = minPrice; - this.netPerformance = netPerformance; - this.netPerformancePercent = netPerformancePercent; + this.netPerformancePercentWithCurrencyEffect = + netPerformancePercentWithCurrencyEffect; + this.netPerformanceWithCurrencyEffect = + netPerformanceWithCurrencyEffect; this.quantity = quantity; this.reportDataGlitchMail = `mailto:hi@ghostfol.io?Subject=Ghostfolio Data Glitch Report&body=Hello%0D%0DI would like to report a data glitch for%0D%0DSymbol: ${SymbolProfile?.symbol}%0DData Source: ${SymbolProfile?.dataSource}%0D%0DAdditional notes:%0D%0DCan you please take a look?%0D%0DKind regards`; this.sectors = {}; @@ -263,22 +263,14 @@ export class PositionDetailDialog implements OnDestroy, OnInit { }); } - public onClose(): void { + public onClose() { this.dialogRef.close(); } public onExport() { - let activityIds = []; - - if (this.user?.settings?.isExperimentalFeatures === true) { - activityIds = this.dataSource.data.map(({ id }) => { - return id; - }); - } else { - activityIds = this.activities.map(({ id }) => { - return id; - }); - } + let activityIds = this.dataSource.data.map(({ id }) => { + return id; + }); this.dataService .fetchExport({ activityIds }) diff --git a/apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html b/apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html index e2b72366b..3a8694c83 100644 --- a/apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html +++ b/apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -44,7 +44,7 @@ [isCurrency]="true" [locale]="data.locale" [unit]="data.baseCurrency" - [value]="netPerformance" + [value]="netPerformanceWithCurrencyEffect" >Change @@ -55,7 +55,7 @@ [colorizeSign]="true" [isPercent]="true" [locale]="data.locale" - [value]="netPerformancePercent" + [value]="netPerformancePercentWithCurrencyEffect" >Performance @@ -87,7 +87,11 @@ size="medium" [isCurrency]="true" [locale]="data.locale" - [ngClass]="{ 'text-danger': minPrice?.toFixed(2) === marketPrice?.toFixed(2) && maxPrice?.toFixed(2) !== minPrice?.toFixed(2) }" + [ngClass]="{ + 'text-danger': + minPrice?.toFixed(2) === marketPrice?.toFixed(2) && + maxPrice?.toFixed(2) !== minPrice?.toFixed(2) + }" [unit]="SymbolProfile?.currency" [value]="minPrice" >Minimum PriceMaximum PriceActivityActivities + @if (transactionCount === 1) { + Activity + } @else { + Activities + } +
    Asset Sub Class
    - - -
    + @if ( + SymbolProfile?.countries?.length > 0 || + SymbolProfile?.sectors?.length > 0 + ) { + @if ( + SymbolProfile?.countries?.length === 1 && + SymbolProfile?.sectors?.length === 1 + ) { +
    Sector
    -
    - Country -
    - - + @if (SymbolProfile?.countries?.length === 1) { +
    + Country +
    + } + } @else {
    Sectors
    -
    - -
    -
    - - -
    + } + } +
    + Symbol +
    +
    + ISIN
    + + @if (dataProviderInfo) { +
    +
    + +
    +
    + }
    -
    -
    -
    Activities
    - + + + +
    Activities
    +
    + - + + + +
    Accounts
    +
    + -
    -
    + + -
    -
    -
    Tags
    - - {{ tag.name }} - + @if (tags?.length > 0) { +
    +
    +
    Tags
    + + {{ + tag.name + }} + +
    -
    + } -
    -
    -
    - Report Data Glitch + @if ( + activities?.length > 0 && data.hasPermissionToReportDataGlitch === true + ) { + -
    + }
    diff --git a/apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.module.ts b/apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.module.ts index 46ae87f66..675f8187b 100644 --- a/apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.module.ts +++ b/apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.module.ts @@ -1,16 +1,18 @@ -import { CommonModule } from '@angular/common'; -import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; -import { MatButtonModule } from '@angular/material/button'; -import { MatChipsModule } from '@angular/material/chips'; -import { MatDialogModule } from '@angular/material/dialog'; +import { GfAccountsTableModule } from '@ghostfolio/client/components/accounts-table/accounts-table.module'; import { GfDialogFooterModule } from '@ghostfolio/client/components/dialog-footer/dialog-footer.module'; import { GfDialogHeaderModule } from '@ghostfolio/client/components/dialog-header/dialog-header.module'; -import { GfActivitiesTableLazyModule } from '@ghostfolio/ui/activities-table-lazy/activities-table-lazy.module'; import { GfActivitiesTableModule } from '@ghostfolio/ui/activities-table/activities-table.module'; import { GfDataProviderCreditsModule } from '@ghostfolio/ui/data-provider-credits/data-provider-credits.module'; import { GfLineChartModule } from '@ghostfolio/ui/line-chart/line-chart.module'; import { GfPortfolioProportionChartModule } from '@ghostfolio/ui/portfolio-proportion-chart/portfolio-proportion-chart.module'; import { GfValueModule } from '@ghostfolio/ui/value'; + +import { CommonModule } from '@angular/common'; +import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatChipsModule } from '@angular/material/chips'; +import { MatDialogModule } from '@angular/material/dialog'; +import { MatTabsModule } from '@angular/material/tabs'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { PositionDetailDialog } from './position-detail-dialog.component'; @@ -19,8 +21,8 @@ import { PositionDetailDialog } from './position-detail-dialog.component'; declarations: [PositionDetailDialog], imports: [ CommonModule, + GfAccountsTableModule, GfActivitiesTableModule, - GfActivitiesTableLazyModule, GfDataProviderCreditsModule, GfDialogFooterModule, GfDialogHeaderModule, @@ -30,6 +32,7 @@ import { PositionDetailDialog } from './position-detail-dialog.component'; MatButtonModule, MatChipsModule, MatDialogModule, + MatTabsModule, NgxSkeletonLoaderModule ], schemas: [CUSTOM_ELEMENTS_SCHEMA] diff --git a/apps/client/src/app/components/position/position.component.html b/apps/client/src/app/components/position/position.component.html index 007ccc70f..4a5ed6f9a 100644 --- a/apps/client/src/app/components/position/position.component.html +++ b/apps/client/src/app/components/position/position.component.html @@ -17,7 +17,7 @@ [isLoading]="isLoading" [marketState]="position?.marketState" [range]="range" - [value]="position?.netPerformancePercentage" + [value]="position?.netPerformancePercentageWithCurrencyEffect" />
    @@ -49,13 +49,13 @@ [isCurrency]="true" [locale]="locale" [unit]="baseCurrency" - [value]="position?.netPerformance" + [value]="position?.netPerformanceWithCurrencyEffect" />
    diff --git a/apps/client/src/app/components/position/position.component.ts b/apps/client/src/app/components/position/position.component.ts index f871b0dad..3a5fbae81 100644 --- a/apps/client/src/app/components/position/position.component.ts +++ b/apps/client/src/app/components/position/position.component.ts @@ -1,3 +1,7 @@ +import { UNKNOWN_KEY } from '@ghostfolio/common/config'; +import { getLocale } from '@ghostfolio/common/helper'; +import { Position } from '@ghostfolio/common/interfaces'; + import { ChangeDetectionStrategy, Component, @@ -5,8 +9,6 @@ import { OnDestroy, OnInit } from '@angular/core'; -import { UNKNOWN_KEY } from '@ghostfolio/common/config'; -import { Position } from '@ghostfolio/common/interfaces'; import { Subject } from 'rxjs'; @Component({ @@ -19,7 +21,7 @@ export class PositionComponent implements OnDestroy, OnInit { @Input() baseCurrency: string; @Input() deviceType: string; @Input() isLoading: boolean; - @Input() locale: string; + @Input() locale = getLocale(); @Input() position: Position; @Input() range: string; diff --git a/apps/client/src/app/components/position/position.module.ts b/apps/client/src/app/components/position/position.module.ts index f72481296..0b225cd04 100644 --- a/apps/client/src/app/components/position/position.module.ts +++ b/apps/client/src/app/components/position/position.module.ts @@ -1,10 +1,11 @@ +import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module'; +import { GfTrendIndicatorModule } from '@ghostfolio/ui/trend-indicator'; +import { GfValueModule } from '@ghostfolio/ui/value'; + import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { MatDialogModule } from '@angular/material/dialog'; import { RouterModule } from '@angular/router'; -import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module'; -import { GfTrendIndicatorModule } from '@ghostfolio/ui/trend-indicator'; -import { GfValueModule } from '@ghostfolio/ui/value'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { GfPositionDetailDialogModule } from './position-detail-dialog/position-detail-dialog.module'; diff --git a/apps/client/src/app/components/positions/positions.component.ts b/apps/client/src/app/components/positions/positions.component.ts index b3d6bd3ca..ab9812462 100644 --- a/apps/client/src/app/components/positions/positions.component.ts +++ b/apps/client/src/app/components/positions/positions.component.ts @@ -1,3 +1,6 @@ +import { getLocale } from '@ghostfolio/common/helper'; +import { Position } from '@ghostfolio/common/interfaces'; + import { ChangeDetectionStrategy, Component, @@ -5,7 +8,6 @@ import { OnChanges, OnInit } from '@angular/core'; -import { Position } from '@ghostfolio/common/interfaces'; @Component({ selector: 'gf-positions', @@ -17,7 +19,7 @@ export class PositionsComponent implements OnChanges, OnInit { @Input() baseCurrency: string; @Input() deviceType: string; @Input() hasPermissionToCreateOrder: boolean; - @Input() locale: string; + @Input() locale = getLocale(); @Input() positions: Position[]; @Input() range: string; diff --git a/apps/client/src/app/components/positions/positions.module.ts b/apps/client/src/app/components/positions/positions.module.ts index 400b2ea6c..e9d1cb838 100644 --- a/apps/client/src/app/components/positions/positions.module.ts +++ b/apps/client/src/app/components/positions/positions.module.ts @@ -1,7 +1,8 @@ +import { GfNoTransactionsInfoModule } from '@ghostfolio/ui/no-transactions-info'; + import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; -import { GfNoTransactionsInfoModule } from '@ghostfolio/ui/no-transactions-info'; import { GfPositionModule } from '../position/position.module'; import { PositionsComponent } from './positions.component'; diff --git a/apps/client/src/app/components/rule/rule.component.ts b/apps/client/src/app/components/rule/rule.component.ts index 0e61caef2..61514939f 100644 --- a/apps/client/src/app/components/rule/rule.component.ts +++ b/apps/client/src/app/components/rule/rule.component.ts @@ -1,10 +1,11 @@ +import { PortfolioReportRule } from '@ghostfolio/common/interfaces'; + import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core'; -import { PortfolioReportRule } from '@ghostfolio/common/interfaces'; @Component({ selector: 'gf-rule', diff --git a/apps/client/src/app/components/rules/rules.component.ts b/apps/client/src/app/components/rules/rules.component.ts index e1f15d23f..9017700c2 100644 --- a/apps/client/src/app/components/rules/rules.component.ts +++ b/apps/client/src/app/components/rules/rules.component.ts @@ -1,6 +1,7 @@ -import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; import { PortfolioReportRule } from '@ghostfolio/common/interfaces'; +import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; + @Component({ selector: 'gf-rules', changeDetection: ChangeDetectionStrategy.OnPush, diff --git a/apps/client/src/app/components/rules/rules.module.ts b/apps/client/src/app/components/rules/rules.module.ts index ebf4eaeaf..48cd02388 100644 --- a/apps/client/src/app/components/rules/rules.module.ts +++ b/apps/client/src/app/components/rules/rules.module.ts @@ -1,9 +1,10 @@ +import { GfRuleModule } from '@ghostfolio/client/components/rule/rule.module'; +import { GfNoTransactionsInfoModule } from '@ghostfolio/ui/no-transactions-info'; + import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; import { MatCardModule } from '@angular/material/card'; -import { GfRuleModule } from '@ghostfolio/client/components/rule/rule.module'; -import { GfNoTransactionsInfoModule } from '@ghostfolio/ui/no-transactions-info'; import { GfPositionModule } from '../position/position.module'; import { RulesComponent } from './rules.component'; diff --git a/apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.module.ts b/apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.module.ts index d7a7cfcf2..b67d2783c 100644 --- a/apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.module.ts +++ b/apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.module.ts @@ -1,9 +1,10 @@ +import { GfPremiumIndicatorModule } from '@ghostfolio/ui/premium-indicator'; + import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; import { MatDialogModule } from '@angular/material/dialog'; import { RouterModule } from '@angular/router'; -import { GfPremiumIndicatorModule } from '@ghostfolio/ui/premium-indicator'; import { SubscriptionInterstitialDialog } from './subscription-interstitial-dialog.component'; diff --git a/apps/client/src/app/components/toggle/toggle.component.ts b/apps/client/src/app/components/toggle/toggle.component.ts index 622c1e144..fe41ec77e 100644 --- a/apps/client/src/app/components/toggle/toggle.component.ts +++ b/apps/client/src/app/components/toggle/toggle.component.ts @@ -1,3 +1,5 @@ +import { ToggleOption } from '@ghostfolio/common/types'; + import { ChangeDetectionStrategy, Component, @@ -8,7 +10,6 @@ import { Output } from '@angular/core'; import { FormControl } from '@angular/forms'; -import { ToggleOption } from '@ghostfolio/common/types'; @Component({ selector: 'gf-toggle', diff --git a/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts b/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts index 0e3c5533e..4c6cbbb85 100644 --- a/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts +++ b/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts @@ -1,3 +1,6 @@ +import { CreateAccessDto } from '@ghostfolio/api/app/access/create-access.dto'; +import { DataService } from '@ghostfolio/client/services/data.service'; + import { ChangeDetectionStrategy, ChangeDetectorRef, @@ -7,8 +10,6 @@ import { } from '@angular/core'; import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; -import { CreateAccessDto } from '@ghostfolio/api/app/access/create-access.dto'; -import { DataService } from '@ghostfolio/client/services/data.service'; import { StatusCodes } from 'http-status-codes'; import { EMPTY, Subject, catchError, takeUntil } from 'rxjs'; @@ -28,7 +29,7 @@ export class CreateOrUpdateAccessDialog implements OnDestroy { public constructor( private changeDetectorRef: ChangeDetectorRef, - @Inject(MAT_DIALOG_DATA) public data: CreateOrUpdateAccessDialogParams, + @Inject(MAT_DIALOG_DATA) private data: CreateOrUpdateAccessDialogParams, public dialogRef: MatDialogRef, private dataService: DataService, private formBuilder: FormBuilder diff --git a/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html b/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html index 863ac5e16..eba44adbd 100644 --- a/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html +++ b/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html @@ -28,30 +28,30 @@ @if (accessForm.controls['type'].value === 'PRIVATE') { -
    - - Permission - - Restricted view - @if(data?.user?.settings?.isExperimentalFeatures) { - View - } - - -
    -
    - - - Ghostfolio User ID - - - -
    +
    + + Permission + + Restricted view + View + + +
    +
    + + + Ghostfolio User ID + + + +
    }
    diff --git a/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/interfaces/interfaces.ts b/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/interfaces/interfaces.ts index f3b2f4964..b7850fb38 100644 --- a/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/interfaces/interfaces.ts +++ b/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/interfaces/interfaces.ts @@ -1,6 +1,5 @@ -import { Access, User } from '@ghostfolio/common/interfaces'; +import { Access } from '@ghostfolio/common/interfaces'; export interface CreateOrUpdateAccessDialogParams { access: Access; - user: User; } diff --git a/apps/client/src/app/components/user-account-access/user-account-access.component.ts b/apps/client/src/app/components/user-account-access/user-account-access.component.ts index 6242725b8..380a03700 100644 --- a/apps/client/src/app/components/user-account-access/user-account-access.component.ts +++ b/apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -1,3 +1,8 @@ +import { DataService } from '@ghostfolio/client/services/data.service'; +import { UserService } from '@ghostfolio/client/services/user/user.service'; +import { Access, User } from '@ghostfolio/common/interfaces'; +import { hasPermission, permissions } from '@ghostfolio/common/permissions'; + import { ChangeDetectionStrategy, ChangeDetectorRef, @@ -7,10 +12,6 @@ import { } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute, Router } from '@angular/router'; -import { DataService } from '@ghostfolio/client/services/data.service'; -import { UserService } from '@ghostfolio/client/services/user/user.service'; -import { Access, User } from '@ghostfolio/common/interfaces'; -import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { DeviceDetectorService } from 'ngx-device-detector'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; @@ -99,15 +100,14 @@ export class UserAccountAccessComponent implements OnDestroy, OnInit { this.unsubscribeSubject.complete(); } - private openCreateAccessDialog(): void { + private openCreateAccessDialog() { const dialogRef = this.dialog.open(CreateOrUpdateAccessDialog, { data: { access: { alias: '', permissions: ['READ_RESTRICTED'], type: 'PRIVATE' - }, - user: this.user + } }, height: this.deviceType === 'mobile' ? '97.5vh' : '80vh', width: this.deviceType === 'mobile' ? '100vw' : '50rem' diff --git a/apps/client/src/app/components/user-account-access/user-account-access.module.ts b/apps/client/src/app/components/user-account-access/user-account-access.module.ts index fb3346ae0..c8d1cc578 100644 --- a/apps/client/src/app/components/user-account-access/user-account-access.module.ts +++ b/apps/client/src/app/components/user-account-access/user-account-access.module.ts @@ -1,10 +1,11 @@ +import { GfPortfolioAccessTableModule } from '@ghostfolio/client/components/access-table/access-table.module'; +import { GfPremiumIndicatorModule } from '@ghostfolio/ui/premium-indicator'; + import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; import { MatDialogModule } from '@angular/material/dialog'; import { RouterModule } from '@angular/router'; -import { GfPortfolioAccessTableModule } from '@ghostfolio/client/components/access-table/access-table.module'; -import { GfPremiumIndicatorModule } from '@ghostfolio/ui/premium-indicator'; import { GfCreateOrUpdateAccessDialogModule } from './create-or-update-access-dialog/create-or-update-access-dialog.module'; import { UserAccountAccessComponent } from './user-account-access.component'; diff --git a/apps/client/src/app/components/user-account-membership/user-account-membership.component.ts b/apps/client/src/app/components/user-account-membership/user-account-membership.component.ts index 13d7495a9..bc9212b15 100644 --- a/apps/client/src/app/components/user-account-membership/user-account-membership.component.ts +++ b/apps/client/src/app/components/user-account-membership/user-account-membership.component.ts @@ -1,3 +1,9 @@ +import { DataService } from '@ghostfolio/client/services/data.service'; +import { UserService } from '@ghostfolio/client/services/user/user.service'; +import { getDateFormatString } from '@ghostfolio/common/helper'; +import { User } from '@ghostfolio/common/interfaces'; +import { hasPermission, permissions } from '@ghostfolio/common/permissions'; + import { ChangeDetectionStrategy, ChangeDetectorRef, @@ -10,11 +16,6 @@ import { MatSnackBarRef, TextOnlySnackBar } from '@angular/material/snack-bar'; -import { DataService } from '@ghostfolio/client/services/data.service'; -import { UserService } from '@ghostfolio/client/services/user/user.service'; -import { getDateFormatString } from '@ghostfolio/common/helper'; -import { User } from '@ghostfolio/common/interfaces'; -import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { StripeService } from 'ngx-stripe'; import { EMPTY, Subject } from 'rxjs'; import { catchError, switchMap, takeUntil } from 'rxjs/operators'; diff --git a/apps/client/src/app/components/user-account-membership/user-account-membership.html b/apps/client/src/app/components/user-account-membership/user-account-membership.html index 55fc3ca79..369a5949b 100644 --- a/apps/client/src/app/components/user-account-membership/user-account-membership.html +++ b/apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -3,7 +3,7 @@
    @@ -25,7 +32,8 @@ {{ baseCurrency }} {{ price }} {{ baseCurrency }} {{ price - coupon + > {{ baseCurrency }} {{ + price - coupon }} + />
    @@ -32,7 +32,9 @@ name="baseCurrency" [disabled]="!hasPermissionToUpdateUserSettings" [value]="user.settings.baseCurrency" - (selectionChange)="onChangeUserSetting('baseCurrency', $event.value)" + (selectionChange)=" + onChangeUserSetting('baseCurrency', $event.value) + " > If a translation is missing, kindly support us in extending it here. @@ -65,9 +69,11 @@ name="language" [disabled]="!hasPermissionToUpdateUserSettings" [value]="language" - (selectionChange)="onChangeUserSetting('language', $event.value)" + (selectionChange)=" + onChangeUserSetting('language', $event.value) + " > - + Deutsch English - - {{ locale }} + + {{ + locale + }}
    @@ -137,7 +145,9 @@ [disabled]="!hasPermissionToUpdateUserSettings" [placeholder]="appearancePlaceholder" [value]="user?.settings?.colorScheme" - (selectionChange)="onChangeUserSetting('colorScheme', $event.value)" + (selectionChange)=" + onChangeUserSetting('colorScheme', $event.value) + " > Auto Light @@ -162,7 +172,7 @@ [checked]="user.settings.viewMode === 'ZEN'" [disabled]="!hasPermissionToUpdateViewMode" (change)="onViewModeChange($event)" - > + />
    @@ -177,7 +187,7 @@ [checked]="isWebAuthnEnabled === true" [disabled]="!hasPermissionToUpdateUserSettings" (change)="onSignInWithFingerprintChange($event)" - > + />
    + />
    diff --git a/apps/client/src/app/components/user-account-settings/user-account-settings.module.ts b/apps/client/src/app/components/user-account-settings/user-account-settings.module.ts index 7a40cf641..50d092a1e 100644 --- a/apps/client/src/app/components/user-account-settings/user-account-settings.module.ts +++ b/apps/client/src/app/components/user-account-settings/user-account-settings.module.ts @@ -1,3 +1,5 @@ +import { GfValueModule } from '@ghostfolio/ui/value'; + import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; @@ -7,7 +9,6 @@ import { MatFormFieldModule } from '@angular/material/form-field'; import { MatSelectModule } from '@angular/material/select'; import { MatSlideToggleModule } from '@angular/material/slide-toggle'; import { RouterModule } from '@angular/router'; -import { GfValueModule } from '@ghostfolio/ui/value'; import { UserAccountSettingsComponent } from './user-account-settings.component'; diff --git a/apps/client/src/app/components/world-map-chart/world-map-chart.component.ts b/apps/client/src/app/components/world-map-chart/world-map-chart.component.ts index 62774edf2..04472c3fe 100644 --- a/apps/client/src/app/components/world-map-chart/world-map-chart.component.ts +++ b/apps/client/src/app/components/world-map-chart/world-map-chart.component.ts @@ -1,3 +1,5 @@ +import { getLocale, getNumberFormatGroup } from '@ghostfolio/common/helper'; + import { ChangeDetectionStrategy, ChangeDetectorRef, @@ -7,7 +9,6 @@ import { OnDestroy, OnInit } from '@angular/core'; -import { getNumberFormatGroup } from '@ghostfolio/common/helper'; import svgMap from 'svgmap'; @Component({ @@ -20,7 +21,7 @@ export class WorldMapChartComponent implements OnChanges, OnDestroy, OnInit { @Input() countries: { [code: string]: { name?: string; value: number } }; @Input() format: string; @Input() isInPercent = false; - @Input() locale: string; + @Input() locale = getLocale(); public isLoading = true; public svgMapElement; diff --git a/apps/client/src/app/core/auth.guard.ts b/apps/client/src/app/core/auth.guard.ts index addd5c5e6..52d1e14ab 100644 --- a/apps/client/src/app/core/auth.guard.ts +++ b/apps/client/src/app/core/auth.guard.ts @@ -1,13 +1,14 @@ +import { paths } from '@ghostfolio/client/app-routing.module'; +import { DataService } from '@ghostfolio/client/services/data.service'; +import { SettingsStorageService } from '@ghostfolio/client/services/settings-storage.service'; +import { UserService } from '@ghostfolio/client/services/user/user.service'; + import { Injectable } from '@angular/core'; import { ActivatedRouteSnapshot, Router, RouterStateSnapshot } from '@angular/router'; -import { paths } from '@ghostfolio/client/app-routing.module'; -import { DataService } from '@ghostfolio/client/services/data.service'; -import { SettingsStorageService } from '@ghostfolio/client/services/settings-storage.service'; -import { UserService } from '@ghostfolio/client/services/user/user.service'; import { EMPTY } from 'rxjs'; import { catchError } from 'rxjs/operators'; diff --git a/apps/client/src/app/core/auth.interceptor.ts b/apps/client/src/app/core/auth.interceptor.ts index 22e2cce76..b0dbdf641 100644 --- a/apps/client/src/app/core/auth.interceptor.ts +++ b/apps/client/src/app/core/auth.interceptor.ts @@ -1,10 +1,3 @@ -import { HTTP_INTERCEPTORS, HttpEvent } from '@angular/common/http'; -import { - HttpHandler, - HttpInterceptor, - HttpRequest -} from '@angular/common/http'; -import { Injectable } from '@angular/core'; import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service'; import { @@ -12,6 +5,14 @@ import { HEADER_KEY_TIMEZONE, HEADER_KEY_TOKEN } from '@ghostfolio/common/config'; + +import { HTTP_INTERCEPTORS, HttpEvent } from '@angular/common/http'; +import { + HttpHandler, + HttpInterceptor, + HttpRequest +} from '@angular/common/http'; +import { Injectable } from '@angular/core'; import { Observable } from 'rxjs'; @Injectable() diff --git a/apps/client/src/app/core/http-response.interceptor.ts b/apps/client/src/app/core/http-response.interceptor.ts index 3beb2ad1d..15a0d2e9f 100644 --- a/apps/client/src/app/core/http-response.interceptor.ts +++ b/apps/client/src/app/core/http-response.interceptor.ts @@ -1,3 +1,9 @@ +import { DataService } from '@ghostfolio/client/services/data.service'; +import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service'; +import { WebAuthnService } from '@ghostfolio/client/services/web-authn.service'; +import { InfoItem } from '@ghostfolio/common/interfaces'; +import { hasPermission, permissions } from '@ghostfolio/common/permissions'; + import { HTTP_INTERCEPTORS, HttpErrorResponse, @@ -13,11 +19,6 @@ import { TextOnlySnackBar } from '@angular/material/snack-bar'; import { Router } from '@angular/router'; -import { DataService } from '@ghostfolio/client/services/data.service'; -import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service'; -import { WebAuthnService } from '@ghostfolio/client/services/web-authn.service'; -import { InfoItem } from '@ghostfolio/common/interfaces'; -import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { StatusCodes } from 'http-status-codes'; import { Observable, throwError } from 'rxjs'; import { catchError, tap } from 'rxjs/operators'; @@ -98,6 +99,16 @@ export class HttpResponseInterceptor implements HttpInterceptor { window.location.reload(); }); } + } else if (error.status === StatusCodes.TOO_MANY_REQUESTS) { + if (!this.snackBarRef) { + this.snackBarRef = this.snackBar.open( + $localize`Oops! It looks like you’re making too many requests. Please slow down a bit.` + ); + + this.snackBarRef.afterDismissed().subscribe(() => { + this.snackBarRef = undefined; + }); + } } else if (error.status === StatusCodes.UNAUTHORIZED) { if (this.webAuthnService.isEnabled()) { this.router.navigate(['/webauthn']); diff --git a/apps/client/src/app/core/layout.service.ts b/apps/client/src/app/core/layout.service.ts new file mode 100644 index 000000000..3ba7af91e --- /dev/null +++ b/apps/client/src/app/core/layout.service.ts @@ -0,0 +1,19 @@ +import { Injectable } from '@angular/core'; +import { Observable, Subject } from 'rxjs'; + +@Injectable({ + providedIn: 'root' +}) +export class LayoutService { + public shouldReloadContent$: Observable; + + private shouldReloadSubject = new Subject(); + + public constructor() { + this.shouldReloadContent$ = this.shouldReloadSubject.asObservable(); + } + + public getShouldReloadSubject() { + return this.shouldReloadSubject; + } +} diff --git a/apps/client/src/app/pages/about/about-page-routing.module.ts b/apps/client/src/app/pages/about/about-page-routing.module.ts index ac586e069..ac02124ae 100644 --- a/apps/client/src/app/pages/about/about-page-routing.module.ts +++ b/apps/client/src/app/pages/about/about-page-routing.module.ts @@ -1,9 +1,8 @@ -import * as path from 'path'; +import { paths } from '@ghostfolio/client/app-routing.module'; +import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { paths } from '@ghostfolio/client/app-routing.module'; -import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; import { AboutPageComponent } from './about-page.component'; diff --git a/apps/client/src/app/pages/about/about-page.component.ts b/apps/client/src/app/pages/about/about-page.component.ts index 807dd8066..b16dc4e06 100644 --- a/apps/client/src/app/pages/about/about-page.component.ts +++ b/apps/client/src/app/pages/about/about-page.component.ts @@ -1,8 +1,9 @@ -import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { TabConfiguration, User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; + +import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { DeviceDetectorService } from 'ngx-device-detector'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; diff --git a/apps/client/src/app/pages/about/about-page.html b/apps/client/src/app/pages/about/about-page.html index 839e8114f..360cbd463 100644 --- a/apps/client/src/app/pages/about/about-page.html +++ b/apps/client/src/app/pages/about/about-page.html @@ -21,7 +21,7 @@ >
    {{ tab.label }}
    diff --git a/apps/client/src/app/pages/about/about-page.module.ts b/apps/client/src/app/pages/about/about-page.module.ts index bd2a1bc80..161faaee7 100644 --- a/apps/client/src/app/pages/about/about-page.module.ts +++ b/apps/client/src/app/pages/about/about-page.module.ts @@ -8,7 +8,7 @@ import { AboutPageComponent } from './about-page.component'; @NgModule({ declarations: [AboutPageComponent], - imports: [CommonModule, MatTabsModule, AboutPageRoutingModule, RouterModule], + imports: [AboutPageRoutingModule, CommonModule, MatTabsModule, RouterModule], schemas: [CUSTOM_ELEMENTS_SCHEMA] }) export class AboutPageModule {} diff --git a/apps/client/src/app/pages/about/changelog/changelog-page-routing.module.ts b/apps/client/src/app/pages/about/changelog/changelog-page-routing.module.ts index 873765f0e..2aaef8282 100644 --- a/apps/client/src/app/pages/about/changelog/changelog-page-routing.module.ts +++ b/apps/client/src/app/pages/about/changelog/changelog-page-routing.module.ts @@ -1,6 +1,7 @@ +import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; + import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; import { ChangelogPageComponent } from './changelog-page.component'; diff --git a/apps/client/src/app/pages/about/license/license-page-routing.module.ts b/apps/client/src/app/pages/about/license/license-page-routing.module.ts index 751d06540..928eeb0f0 100644 --- a/apps/client/src/app/pages/about/license/license-page-routing.module.ts +++ b/apps/client/src/app/pages/about/license/license-page-routing.module.ts @@ -1,6 +1,7 @@ +import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; + import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; import { LicensePageComponent } from './license-page.component'; diff --git a/apps/client/src/app/pages/about/oss-friends/oss-friends-page-routing.module.ts b/apps/client/src/app/pages/about/oss-friends/oss-friends-page-routing.module.ts index 34aa528a5..08040419d 100644 --- a/apps/client/src/app/pages/about/oss-friends/oss-friends-page-routing.module.ts +++ b/apps/client/src/app/pages/about/oss-friends/oss-friends-page-routing.module.ts @@ -1,6 +1,7 @@ +import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; + import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; import { OpenSourceSoftwareFriendsPageComponent } from './oss-friends-page.component'; diff --git a/apps/client/src/app/pages/about/oss-friends/oss-friends-page.html b/apps/client/src/app/pages/about/oss-friends/oss-friends-page.html index 24704446c..f1431697f 100644 --- a/apps/client/src/app/pages/about/oss-friends/oss-friends-page.html +++ b/apps/client/src/app/pages/about/oss-friends/oss-friends-page.html @@ -10,29 +10,30 @@ >
    diff --git a/apps/client/src/app/pages/about/overview/about-overview-page-routing.module.ts b/apps/client/src/app/pages/about/overview/about-overview-page-routing.module.ts index 7713f3971..989dddc9d 100644 --- a/apps/client/src/app/pages/about/overview/about-overview-page-routing.module.ts +++ b/apps/client/src/app/pages/about/overview/about-overview-page-routing.module.ts @@ -1,6 +1,7 @@ +import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; + import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; import { AboutOverviewPageComponent } from './about-overview-page.component'; diff --git a/apps/client/src/app/pages/about/overview/about-overview-page.component.ts b/apps/client/src/app/pages/about/overview/about-overview-page.component.ts index 4c15f73b0..c07db433a 100644 --- a/apps/client/src/app/pages/about/overview/about-overview-page.component.ts +++ b/apps/client/src/app/pages/about/overview/about-overview-page.component.ts @@ -1,8 +1,9 @@ -import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; + +import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; @@ -12,7 +13,6 @@ import { takeUntil } from 'rxjs/operators'; templateUrl: './about-overview-page.html' }) export class AboutOverviewPageComponent implements OnDestroy, OnInit { - public hasPermissionForBlog: boolean; public hasPermissionForStatistics: boolean; public hasPermissionForSubscription: boolean; public isLoggedIn: boolean; @@ -29,11 +29,6 @@ export class AboutOverviewPageComponent implements OnDestroy, OnInit { ) { const { globalPermissions } = this.dataService.fetchInfo(); - this.hasPermissionForBlog = hasPermission( - globalPermissions, - permissions.enableBlog - ); - this.hasPermissionForStatistics = hasPermission( globalPermissions, permissions.enableStatistics diff --git a/apps/client/src/app/pages/about/overview/about-overview-page.html b/apps/client/src/app/pages/about/overview/about-overview-page.html index bc1c32bc6..1a6b6c466 100644 --- a/apps/client/src/app/pages/about/overview/about-overview-page.html +++ b/apps/client/src/app/pages/about/overview/about-overview-page.html @@ -133,23 +133,29 @@
    -
    + -
    - Blog -
    + @if (hasPermissionForSubscription) { +
    + Blog +
    + }
    diff --git a/apps/client/src/app/pages/about/privacy-policy/privacy-policy-page-routing.module.ts b/apps/client/src/app/pages/about/privacy-policy/privacy-policy-page-routing.module.ts index 8eaa96329..eb8dca803 100644 --- a/apps/client/src/app/pages/about/privacy-policy/privacy-policy-page-routing.module.ts +++ b/apps/client/src/app/pages/about/privacy-policy/privacy-policy-page-routing.module.ts @@ -1,6 +1,7 @@ +import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; + import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; import { PrivacyPolicyPageComponent } from './privacy-policy-page.component'; diff --git a/apps/client/src/app/pages/accounts/accounts-page-routing.module.ts b/apps/client/src/app/pages/accounts/accounts-page-routing.module.ts index 705c4449c..59c708006 100644 --- a/apps/client/src/app/pages/accounts/accounts-page-routing.module.ts +++ b/apps/client/src/app/pages/accounts/accounts-page-routing.module.ts @@ -1,6 +1,7 @@ +import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; + import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; import { AccountsPageComponent } from './accounts-page.component'; 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 93d3ee181..93d88cd64 100644 --- a/apps/client/src/app/pages/accounts/accounts-page.component.ts +++ b/apps/client/src/app/pages/accounts/accounts-page.component.ts @@ -1,6 +1,3 @@ -import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; -import { MatDialog } from '@angular/material/dialog'; -import { ActivatedRoute, Router } from '@angular/router'; import { CreateAccountDto } from '@ghostfolio/api/app/account/create-account.dto'; import { TransferBalanceDto } from '@ghostfolio/api/app/account/transfer-balance.dto'; import { UpdateAccountDto } from '@ghostfolio/api/app/account/update-account.dto'; @@ -11,6 +8,10 @@ import { ImpersonationStorageService } from '@ghostfolio/client/services/imperso import { UserService } from '@ghostfolio/client/services/user/user.service'; import { User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; + +import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; +import { ActivatedRoute, Router } from '@angular/router'; import { Account as AccountModel } from '@prisma/client'; import { DeviceDetectorService } from 'ngx-device-detector'; import { EMPTY, Subject, Subscription } from 'rxjs'; @@ -168,7 +169,7 @@ export class AccountsPageComponent implements OnDestroy, OnInit { isExcluded, name, platformId - }: AccountModel): void { + }: AccountModel) { const dialogRef = this.dialog.open(CreateOrUpdateAccountDialog, { data: { account: { @@ -236,7 +237,7 @@ export class AccountsPageComponent implements OnDestroy, OnInit { }); } - private openCreateAccountDialog(): void { + private openCreateAccountDialog() { const dialogRef = this.dialog.open(CreateOrUpdateAccountDialog, { data: { account: { @@ -278,7 +279,7 @@ export class AccountsPageComponent implements OnDestroy, OnInit { }); } - private openTransferBalanceDialog(): void { + private openTransferBalanceDialog() { const dialogRef = this.dialog.open(TransferBalanceDialog, { data: { accounts: this.accounts diff --git a/apps/client/src/app/pages/accounts/accounts-page.html b/apps/client/src/app/pages/accounts/accounts-page.html index d8bd01881..cffbe4251 100644 --- a/apps/client/src/app/pages/accounts/accounts-page.html +++ b/apps/client/src/app/pages/accounts/accounts-page.html @@ -8,7 +8,11 @@ [baseCurrency]="user?.settings?.baseCurrency" [deviceType]="deviceType" [locale]="user?.settings?.locale" - [showActions]="!hasImpersonationId && hasPermissionToUpdateAccount && !user.settings.isRestrictedView" + [showActions]=" + !hasImpersonationId && + hasPermissionToUpdateAccount && + !user.settings.isRestrictedView + " [totalBalanceInBaseCurrency]="totalBalanceInBaseCurrency" [totalValueInBaseCurrency]="totalValueInBaseCurrency" [transactionCount]="transactionCount" @@ -21,7 +25,11 @@
    diff --git a/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.module.ts b/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.module.ts index 2ccf56751..44d3b6847 100644 --- a/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.module.ts +++ b/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.module.ts @@ -1,3 +1,6 @@ +import { GfSymbolIconModule } from '@ghostfolio/client/components/symbol-icon/symbol-icon.module'; +import { GfCurrencySelectorModule } from '@ghostfolio/ui/currency-selector/currency-selector.module'; + import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; @@ -7,8 +10,6 @@ import { MatCheckboxModule } from '@angular/material/checkbox'; import { MatDialogModule } from '@angular/material/dialog'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatInputModule } from '@angular/material/input'; -import { GfSymbolIconModule } from '@ghostfolio/client/components/symbol-icon/symbol-icon.module'; -import { GfCurrencySelectorModule } from '@ghostfolio/ui/currency-selector/currency-selector.module'; import { CreateOrUpdateAccountDialog } from './create-or-update-account-dialog.component'; diff --git a/apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.component.ts b/apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.component.ts index 8fc4e1379..60acd52b3 100644 --- a/apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.component.ts +++ b/apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.component.ts @@ -1,3 +1,5 @@ +import { TransferBalanceDto } from '@ghostfolio/api/app/account/transfer-balance.dto'; + import { ChangeDetectionStrategy, Component, @@ -12,7 +14,6 @@ import { Validators } from '@angular/forms'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; -import { TransferBalanceDto } from '@ghostfolio/api/app/account/transfer-balance.dto'; import { Account } from '@prisma/client'; import { Subject } from 'rxjs'; diff --git a/apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.module.ts b/apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.module.ts index ad559e28c..e0f1f574d 100644 --- a/apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.module.ts +++ b/apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.module.ts @@ -1,3 +1,5 @@ +import { GfSymbolIconModule } from '@ghostfolio/client/components/symbol-icon/symbol-icon.module'; + import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; import { ReactiveFormsModule } from '@angular/forms'; @@ -6,7 +8,6 @@ import { MatDialogModule } from '@angular/material/dialog'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatInputModule } from '@angular/material/input'; import { MatSelectModule } from '@angular/material/select'; -import { GfSymbolIconModule } from '@ghostfolio/client/components/symbol-icon/symbol-icon.module'; import { TransferBalanceDialog } from './transfer-balance-dialog.component'; diff --git a/apps/client/src/app/pages/admin/admin-page-routing.module.ts b/apps/client/src/app/pages/admin/admin-page-routing.module.ts index 52263715a..a6a69641c 100644 --- a/apps/client/src/app/pages/admin/admin-page-routing.module.ts +++ b/apps/client/src/app/pages/admin/admin-page-routing.module.ts @@ -1,5 +1,3 @@ -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; import { AdminJobsComponent } from '@ghostfolio/client/components/admin-jobs/admin-jobs.component'; import { AdminMarketDataComponent } from '@ghostfolio/client/components/admin-market-data/admin-market-data.component'; import { AdminOverviewComponent } from '@ghostfolio/client/components/admin-overview/admin-overview.component'; @@ -7,6 +5,9 @@ import { AdminSettingsComponent } from '@ghostfolio/client/components/admin-sett import { AdminUsersComponent } from '@ghostfolio/client/components/admin-users/admin-users.component'; import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + import { AdminPageComponent } from './admin-page.component'; const routes: Routes = [ diff --git a/apps/client/src/app/pages/admin/admin-page.component.ts b/apps/client/src/app/pages/admin/admin-page.component.ts index acb825e90..8a1a9fdcc 100644 --- a/apps/client/src/app/pages/admin/admin-page.component.ts +++ b/apps/client/src/app/pages/admin/admin-page.component.ts @@ -1,5 +1,6 @@ -import { Component, OnDestroy, OnInit } from '@angular/core'; import { TabConfiguration } from '@ghostfolio/common/interfaces'; + +import { Component, OnDestroy, OnInit } from '@angular/core'; import { DeviceDetectorService } from 'ngx-device-detector'; import { Subject } from 'rxjs'; diff --git a/apps/client/src/app/pages/admin/admin-page.html b/apps/client/src/app/pages/admin/admin-page.html index 839e8114f..360cbd463 100644 --- a/apps/client/src/app/pages/admin/admin-page.html +++ b/apps/client/src/app/pages/admin/admin-page.html @@ -21,7 +21,7 @@ >
    {{ tab.label }}
    diff --git a/apps/client/src/app/pages/admin/admin-page.module.ts b/apps/client/src/app/pages/admin/admin-page.module.ts index a54b143d4..2b986aa6c 100644 --- a/apps/client/src/app/pages/admin/admin-page.module.ts +++ b/apps/client/src/app/pages/admin/admin-page.module.ts @@ -1,6 +1,3 @@ -import { CommonModule } from '@angular/common'; -import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; -import { MatTabsModule } from '@angular/material/tabs'; import { GfAdminJobsModule } from '@ghostfolio/client/components/admin-jobs/admin-jobs.module'; import { GfAdminMarketDataModule } from '@ghostfolio/client/components/admin-market-data/admin-market-data.module'; import { GfAdminOverviewModule } from '@ghostfolio/client/components/admin-overview/admin-overview.module'; @@ -8,6 +5,10 @@ import { GfAdminSettingsModule } from '@ghostfolio/client/components/admin-setti import { GfAdminUsersModule } from '@ghostfolio/client/components/admin-users/admin-users.module'; import { CacheService } from '@ghostfolio/client/services/cache.service'; +import { CommonModule } from '@angular/common'; +import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; +import { MatTabsModule } from '@angular/material/tabs'; + import { AdminPageRoutingModule } from './admin-page-routing.module'; import { AdminPageComponent } from './admin-page.component'; diff --git a/apps/client/src/app/pages/auth/auth-page.component.ts b/apps/client/src/app/pages/auth/auth-page.component.ts index 1dc494773..2c70ea020 100644 --- a/apps/client/src/app/pages/auth/auth-page.component.ts +++ b/apps/client/src/app/pages/auth/auth-page.component.ts @@ -1,10 +1,11 @@ -import { Component, OnDestroy, OnInit } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; import { KEY_STAY_SIGNED_IN, SettingsStorageService } from '@ghostfolio/client/services/settings-storage.service'; import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service'; + +import { Component, OnDestroy, OnInit } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; diff --git a/apps/client/src/app/pages/blog/2022/11/black-friday-2022/black-friday-2022-page.component.ts b/apps/client/src/app/pages/blog/2022/11/black-friday-2022/black-friday-2022-page.component.ts index bfb42f55c..ab117d0a3 100644 --- a/apps/client/src/app/pages/blog/2022/11/black-friday-2022/black-friday-2022-page.component.ts +++ b/apps/client/src/app/pages/blog/2022/11/black-friday-2022/black-friday-2022-page.component.ts @@ -1,7 +1,8 @@ +import { GfPremiumIndicatorModule } from '@ghostfolio/ui/premium-indicator'; + import { Component } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; import { RouterModule } from '@angular/router'; -import { GfPremiumIndicatorModule } from '@ghostfolio/ui/premium-indicator'; @Component({ host: { class: 'page' }, diff --git a/apps/client/src/app/pages/blog/2023/11/black-week-2023/black-week-2023-page.component.ts b/apps/client/src/app/pages/blog/2023/11/black-week-2023/black-week-2023-page.component.ts index be354c55a..9f23f30ff 100644 --- a/apps/client/src/app/pages/blog/2023/11/black-week-2023/black-week-2023-page.component.ts +++ b/apps/client/src/app/pages/blog/2023/11/black-week-2023/black-week-2023-page.component.ts @@ -1,7 +1,8 @@ +import { GfPremiumIndicatorModule } from '@ghostfolio/ui/premium-indicator'; + import { Component } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; import { RouterModule } from '@angular/router'; -import { GfPremiumIndicatorModule } from '@ghostfolio/ui/premium-indicator'; @Component({ host: { class: 'page' }, diff --git a/apps/client/src/app/pages/blog/blog-page-routing.module.ts b/apps/client/src/app/pages/blog/blog-page-routing.module.ts index 487f53f02..47bf7cafc 100644 --- a/apps/client/src/app/pages/blog/blog-page-routing.module.ts +++ b/apps/client/src/app/pages/blog/blog-page-routing.module.ts @@ -1,6 +1,7 @@ +import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; + import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; import { BlogPageComponent } from './blog-page.component'; diff --git a/apps/client/src/app/pages/blog/blog-page.component.ts b/apps/client/src/app/pages/blog/blog-page.component.ts index db5454fbf..531f94886 100644 --- a/apps/client/src/app/pages/blog/blog-page.component.ts +++ b/apps/client/src/app/pages/blog/blog-page.component.ts @@ -1,6 +1,7 @@ -import { Component, OnDestroy } from '@angular/core'; import { DataService } from '@ghostfolio/client/services/data.service'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; + +import { Component, OnDestroy } from '@angular/core'; import { Subject } from 'rxjs'; @Component({ diff --git a/apps/client/src/app/pages/blog/blog-page.html b/apps/client/src/app/pages/blog/blog-page.html index ff83afd0f..cd05d065c 100644 --- a/apps/client/src/app/pages/blog/blog-page.html +++ b/apps/client/src/app/pages/blog/blog-page.html @@ -8,34 +8,32 @@ finance - - -
    - - - + + + }
    @@ -295,34 +293,32 @@
    - - -
    - - - + + + }
    diff --git a/apps/client/src/app/pages/demo/demo-page-routing.module.ts b/apps/client/src/app/pages/demo/demo-page-routing.module.ts index 8d817447e..e0b86fb4d 100644 --- a/apps/client/src/app/pages/demo/demo-page-routing.module.ts +++ b/apps/client/src/app/pages/demo/demo-page-routing.module.ts @@ -1,6 +1,7 @@ +import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; + import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; import { DemoPageComponent } from './demo-page.component'; diff --git a/apps/client/src/app/pages/demo/demo-page.component.ts b/apps/client/src/app/pages/demo/demo-page.component.ts index c62ece50a..6515fd898 100644 --- a/apps/client/src/app/pages/demo/demo-page.component.ts +++ b/apps/client/src/app/pages/demo/demo-page.component.ts @@ -1,8 +1,9 @@ -import { Component, OnDestroy } from '@angular/core'; -import { Router } from '@angular/router'; import { DataService } from '@ghostfolio/client/services/data.service'; import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service'; import { InfoItem } from '@ghostfolio/common/interfaces'; + +import { Component, OnDestroy } from '@angular/core'; +import { Router } from '@angular/router'; import { Subject } from 'rxjs'; @Component({ diff --git a/apps/client/src/app/pages/faq/faq-page-routing.module.ts b/apps/client/src/app/pages/faq/faq-page-routing.module.ts index 11a3a9127..17c087834 100644 --- a/apps/client/src/app/pages/faq/faq-page-routing.module.ts +++ b/apps/client/src/app/pages/faq/faq-page-routing.module.ts @@ -1,12 +1,34 @@ +import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; + import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; import { FaqPageComponent } from './faq-page.component'; const routes: Routes = [ { canActivate: [AuthGuard], + children: [ + { + path: '', + loadChildren: () => + import('./overview/faq-overview-page.module').then( + (m) => m.FaqOverviewPageModule + ) + }, + { + path: 'saas', + loadChildren: () => + import('./saas/saas-page.module').then((m) => m.SaasPageModule) + }, + { + path: 'self-hosting', + loadChildren: () => + import('./self-hosting/self-hosting-page.module').then( + (m) => m.SelfHostingPageModule + ) + } + ], component: FaqPageComponent, path: '', title: $localize`Frequently Asked Questions (FAQ)` diff --git a/apps/client/src/app/pages/faq/faq-page.component.ts b/apps/client/src/app/pages/faq/faq-page.component.ts index 0dc4007e3..0bbe1c904 100644 --- a/apps/client/src/app/pages/faq/faq-page.component.ts +++ b/apps/client/src/app/pages/faq/faq-page.component.ts @@ -1,38 +1,57 @@ -import { ChangeDetectorRef, Component, OnDestroy } from '@angular/core'; -import { UserService } from '@ghostfolio/client/services/user/user.service'; -import { User } from '@ghostfolio/common/interfaces'; -import { Subject, takeUntil } from 'rxjs'; +import { DataService } from '@ghostfolio/client/services/data.service'; +import { TabConfiguration, User } from '@ghostfolio/common/interfaces'; +import { hasPermission, permissions } from '@ghostfolio/common/permissions'; + +import { Component, OnDestroy, OnInit } from '@angular/core'; +import { DeviceDetectorService } from 'ngx-device-detector'; +import { Subject } from 'rxjs'; @Component({ - host: { class: 'page' }, + host: { class: 'page has-tabs' }, selector: 'gf-faq-page', styleUrls: ['./faq-page.scss'], templateUrl: './faq-page.html' }) -export class FaqPageComponent implements OnDestroy { - public routerLinkFeatures = ['/' + $localize`features`]; - public routerLinkMarkets = ['/' + $localize`markets`]; - public routerLinkPricing = ['/' + $localize`pricing`]; - public routerLinkRegister = ['/' + $localize`register`]; - public user: User; +export class FaqPageComponent implements OnDestroy, OnInit { + public deviceType: string; + public hasPermissionForSubscription: boolean; + public tabs: TabConfiguration[] = []; private unsubscribeSubject = new Subject(); public constructor( - private changeDetectorRef: ChangeDetectorRef, - private userService: UserService - ) {} + private dataService: DataService, + private deviceService: DeviceDetectorService + ) { + const { globalPermissions } = this.dataService.fetchInfo(); + + this.hasPermissionForSubscription = hasPermission( + globalPermissions, + permissions.enableSubscription + ); + + this.tabs = [ + { + iconName: 'reader-outline', + label: $localize`General`, + path: ['/' + $localize`faq`] + }, + { + iconName: 'cloudy-outline', + label: $localize`Cloud` + ' (SaaS)', + path: ['/' + $localize`faq`, 'saas'], + showCondition: this.hasPermissionForSubscription + }, + { + iconName: 'server-outline', + label: $localize`Self-Hosting`, + path: ['/' + $localize`faq`, $localize`self-hosting`] + } + ]; + } public ngOnInit() { - this.userService.stateChanged - .pipe(takeUntil(this.unsubscribeSubject)) - .subscribe((state) => { - if (state?.user) { - this.user = state.user; - - this.changeDetectorRef.markForCheck(); - } - }); + this.deviceType = this.deviceService.getDeviceInfo().deviceType; } public ngOnDestroy() { diff --git a/apps/client/src/app/pages/faq/faq-page.html b/apps/client/src/app/pages/faq/faq-page.html index 3969451a0..360cbd463 100644 --- a/apps/client/src/app/pages/faq/faq-page.html +++ b/apps/client/src/app/pages/faq/faq-page.html @@ -1,291 +1,29 @@ -
    -
    -
    -

    - Frequently Asked Questions (FAQ) -

    -

    - Find quick answers to commonly asked questions about Ghostfolio in our - Frequently Asked Questions (FAQ) section. Discover what Ghostfolio is, - explore its features, and learn about our privacy practices. Get all the - information you need in one place. -

    - - - What is Ghostfolio? - - - Ghostfolio is a lightweight, open source wealth management application - for individuals to keep track of their net worth. The software - empowers you to make solid, data-driven investment decisions. - - - - - What assets can I track with Ghostfolio? - - - With Ghostfolio, you can keep track of various assets like stocks, - ETFs, bonds, cryptocurrencies and commodities. - - - - - What else is included in Ghostfolio? - - Please find a feature overview to manage your wealth - here. - - - - - How do I start? - - You can sign up via the “Get Started” button at the top of the page. You have multiple options to join - Ghostfolio: Create an account with a security token or - Google Sign. We will guide you to set up your portfolio. - - - - - Will you spam me with emails once I sign up? - - No, we do not even collect your email address, so you will not receive - any spam emails from us. - - - - - Can I use Ghostfolio anonymously? - - Yes, the authentication system via security token enables you to sign - in securely and anonymously to Ghostfolio. There is no need for an - e-mail address, phone number, or a username. - - - - - How can Ghostfolio be free? - This project is driven by the efforts of contributors from around the - world. The - source code is - fully available as open source software (OSS). Thanks to our generous - Ghostfolio Premium users and - sponsors we have - the ability to run a free, limited plan for novice - investors. - - - - Is it really free? - Yes, it is! Our - pricing page details - everything you get for free. - - - - Do you monetize or sell my financial data? - No, we value your privacy. We do not sell or share your financial - data with any third parties. - - - - What is your business model? - By offering - Ghostfolio Premium, a - subscription plan with a managed hosting service and enhanced - features, we fund our business while providing added value to our - users. - - - - What is Ghostfolio Premium? - Ghostfolio Premium is a fully - managed Ghostfolio cloud offering for ambitious investors. Revenue is - used to cover the costs of the hosting infrastructure and to fund - ongoing development. It is the Open Source code base with some extras - like the markets overview and - a professional data provider. - - - - Can I start with a trial version? - Yes, you can try - Ghostfolio Premium by signing - up for Ghostfolio and applying for a trial (see “My Ghostfolio”). It - is easy, free and there is no commitment. You can stop using it at any - time. - - - - How can I get a student discount for Ghostfolio - Premium? - - Request your student discount - here with - your university e-mail address. - - - - Does the Ghostfolio Premium subscription renew - automatically? - - No, Ghostfolio Premium does - not include auto-renewal. Upon expiration, you can choose whether to - start a new subscription. - - - - Which devices are supported? - - Ghostfolio works in every modern web browser on smartphones, tablets - and desktop computers. For Android users, there is a dedicated - Ghostfolio app available in the - Google Play Store. - - - - I cannot find my broker in the list of platforms. What can I - do? - - - Please send an e-mail with the web address of your broker to - hi@ghostfol.io and we are - happy to add it. - - - - - Ghostfolio sounds cool, how can I get involved? - - Any support for Ghostfolio is welcome. Be it with a - Ghostfolio Premium - subscription to finance the hosting infrastructure, a positive rating - in the - Google Play Store, a star on - GitHub, - feedback, bug reports, feature requests and of course contributions! - You can reach us via Ghostfolio - Slack - community, - @ghostfolio_, - hi@ghostfol.io - or - GitHub. - - - - Got any other questions? - - Please join the Ghostfolio - Slack community, post to - @ghostfolio_, send an e-mail to - hi@ghostfol.io - or start a discussion at - GitHub. - -
    -
    -
    + + + + + diff --git a/apps/client/src/app/pages/faq/faq-page.module.ts b/apps/client/src/app/pages/faq/faq-page.module.ts index b411437eb..026fe9e71 100644 --- a/apps/client/src/app/pages/faq/faq-page.module.ts +++ b/apps/client/src/app/pages/faq/faq-page.module.ts @@ -1,13 +1,14 @@ import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; -import { MatCardModule } from '@angular/material/card'; +import { MatTabsModule } from '@angular/material/tabs'; +import { RouterModule } from '@angular/router'; import { FaqPageRoutingModule } from './faq-page-routing.module'; import { FaqPageComponent } from './faq-page.component'; @NgModule({ declarations: [FaqPageComponent], - imports: [CommonModule, FaqPageRoutingModule, MatCardModule], + imports: [CommonModule, FaqPageRoutingModule, MatTabsModule, RouterModule], schemas: [CUSTOM_ELEMENTS_SCHEMA] }) export class FaqPageModule {} diff --git a/apps/client/src/app/pages/faq/faq-page.scss b/apps/client/src/app/pages/faq/faq-page.scss index 75bda52c9..e87d9a05b 100644 --- a/apps/client/src/app/pages/faq/faq-page.scss +++ b/apps/client/src/app/pages/faq/faq-page.scss @@ -1,12 +1,7 @@ :host { - display: block; - - a { - color: rgba(var(--palette-primary-500), 1); - font-weight: 500; + color: rgb(var(--dark-primary-text)); +} - &:hover { - color: rgba(var(--palette-primary-300), 1); - } - } +:host-context(.is-dark-theme) { + color: rgb(var(--light-primary-text)); } diff --git a/apps/client/src/app/pages/faq/overview/faq-overview-page-routing.module.ts b/apps/client/src/app/pages/faq/overview/faq-overview-page-routing.module.ts new file mode 100644 index 000000000..78a466e70 --- /dev/null +++ b/apps/client/src/app/pages/faq/overview/faq-overview-page-routing.module.ts @@ -0,0 +1,21 @@ +import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; + +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + +import { FaqOverviewPageComponent } from './faq-overview-page.component'; + +const routes: Routes = [ + { + canActivate: [AuthGuard], + component: FaqOverviewPageComponent, + path: '', + title: $localize`Frequently Asked Questions (FAQ)` + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class FaqOverviewPageRoutingModule {} diff --git a/apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts b/apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts new file mode 100644 index 000000000..f9abb8824 --- /dev/null +++ b/apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts @@ -0,0 +1,40 @@ +import { UserService } from '@ghostfolio/client/services/user/user.service'; +import { User } from '@ghostfolio/common/interfaces'; + +import { ChangeDetectorRef, Component, OnDestroy } from '@angular/core'; +import { Subject, takeUntil } from 'rxjs'; + +@Component({ + host: { class: 'page' }, + selector: 'gf-faq-overview-page', + styleUrls: ['./faq-overview-page.scss'], + templateUrl: './faq-overview-page.html' +}) +export class FaqOverviewPageComponent implements OnDestroy { + public routerLinkFeatures = ['/' + $localize`features`]; + public user: User; + + private unsubscribeSubject = new Subject(); + + public constructor( + private changeDetectorRef: ChangeDetectorRef, + private userService: UserService + ) {} + + public ngOnInit() { + this.userService.stateChanged + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe((state) => { + if (state?.user) { + this.user = state.user; + + this.changeDetectorRef.markForCheck(); + } + }); + } + + public ngOnDestroy() { + this.unsubscribeSubject.next(); + this.unsubscribeSubject.complete(); + } +} diff --git a/apps/client/src/app/pages/faq/overview/faq-overview-page.html b/apps/client/src/app/pages/faq/overview/faq-overview-page.html new file mode 100644 index 000000000..925871a60 --- /dev/null +++ b/apps/client/src/app/pages/faq/overview/faq-overview-page.html @@ -0,0 +1,173 @@ +
    +
    +
    +

    + Frequently Asked Questions (FAQ) +

    +

    + Find quick answers to commonly asked questions about Ghostfolio in our + Frequently Asked Questions (FAQ) section. Discover what Ghostfolio is, + explore its features, and learn about our privacy practices. Get all the + information you need in one place. +

    + + + What is Ghostfolio? + + + Ghostfolio is a lightweight, open source wealth management application + for individuals to keep track of their net worth. The software + empowers you to make solid, data-driven investment decisions. + + + + + What assets can I track with Ghostfolio? + + + With Ghostfolio, you can keep track of various assets like stocks, + ETFs, bonds, cryptocurrencies and commodities. + + + + + What else is included in Ghostfolio? + + + Please find a feature overview to manage your wealth + here. + + + + + Can I use Ghostfolio anonymously? + + + Yes, the authentication system via security token enables you to sign + in securely and anonymously to Ghostfolio. There is no need for an + e-mail address, phone number, or a username. + + + + + How can Ghostfolio be free? + + This project is driven by the efforts of contributors from around the + world. The + source code is + fully available as open source software (OSS). Thanks to our generous + Ghostfolio Premium users + and sponsors we + have the ability to run a free, limited plan for novice + investors. + + + + Do you monetize or sell my financial data? + + No, we value your privacy. We do not sell or share your financial + data with any third parties. + + + + What is your business model? + + By offering + Ghostfolio Premium, a + subscription plan with a managed hosting service and enhanced + features, we fund our business while providing added value to our + users. + + + + What is your product roadmap? + + At this time, we do not have a public roadmap + available. + + + + Ghostfolio sounds cool, how can I get involved? + + Any support for Ghostfolio is welcome. Be it with a + Ghostfolio Premium + subscription to finance the hosting infrastructure, a positive rating + in the + Google Play Store, a star on + GitHub, + feedback, bug reports, feature requests and of course contributions! + You can reach us via Ghostfolio + Slack + community, + @ghostfolio_, + hi@ghostfol.io + or + GitHub. + + + + Got any other questions? + + Please join the Ghostfolio + Slack community, post to + @ghostfolio_, send an e-mail to + hi@ghostfol.io + or start a discussion at + GitHub. + +
    +
    +
    diff --git a/apps/client/src/app/pages/faq/overview/faq-overview-page.module.ts b/apps/client/src/app/pages/faq/overview/faq-overview-page.module.ts new file mode 100644 index 000000000..1f26d623a --- /dev/null +++ b/apps/client/src/app/pages/faq/overview/faq-overview-page.module.ts @@ -0,0 +1,13 @@ +import { CommonModule } from '@angular/common'; +import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; +import { MatCardModule } from '@angular/material/card'; + +import { FaqOverviewPageRoutingModule } from './faq-overview-page-routing.module'; +import { FaqOverviewPageComponent } from './faq-overview-page.component'; + +@NgModule({ + declarations: [FaqOverviewPageComponent], + imports: [CommonModule, FaqOverviewPageRoutingModule, MatCardModule], + schemas: [CUSTOM_ELEMENTS_SCHEMA] +}) +export class FaqOverviewPageModule {} diff --git a/apps/client/src/app/pages/faq/overview/faq-overview-page.scss b/apps/client/src/app/pages/faq/overview/faq-overview-page.scss new file mode 100644 index 000000000..75bda52c9 --- /dev/null +++ b/apps/client/src/app/pages/faq/overview/faq-overview-page.scss @@ -0,0 +1,12 @@ +:host { + display: block; + + a { + color: rgba(var(--palette-primary-500), 1); + font-weight: 500; + + &:hover { + color: rgba(var(--palette-primary-300), 1); + } + } +} diff --git a/apps/client/src/app/pages/faq/saas/saas-page-routing.module.ts b/apps/client/src/app/pages/faq/saas/saas-page-routing.module.ts new file mode 100644 index 000000000..4c4c3d62c --- /dev/null +++ b/apps/client/src/app/pages/faq/saas/saas-page-routing.module.ts @@ -0,0 +1,21 @@ +import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; + +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + +import { SaasPageComponent } from './saas-page.component'; + +const routes: Routes = [ + { + canActivate: [AuthGuard], + component: SaasPageComponent, + path: '', + title: $localize`Cloud` + ' (SaaS) – ' + $localize`FAQ` + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class SaasPageRoutingModule {} diff --git a/apps/client/src/app/pages/faq/saas/saas-page.component.ts b/apps/client/src/app/pages/faq/saas/saas-page.component.ts new file mode 100644 index 000000000..b06a7dbd1 --- /dev/null +++ b/apps/client/src/app/pages/faq/saas/saas-page.component.ts @@ -0,0 +1,42 @@ +import { UserService } from '@ghostfolio/client/services/user/user.service'; +import { User } from '@ghostfolio/common/interfaces'; + +import { ChangeDetectorRef, Component, OnDestroy } from '@angular/core'; +import { Subject, takeUntil } from 'rxjs'; + +@Component({ + host: { class: 'page' }, + selector: 'gf-saas-page', + styleUrls: ['./saas-page.scss'], + templateUrl: './saas-page.html' +}) +export class SaasPageComponent implements OnDestroy { + public routerLinkMarkets = ['/' + $localize`markets`]; + public routerLinkPricing = ['/' + $localize`pricing`]; + public routerLinkRegister = ['/' + $localize`register`]; + public user: User; + + private unsubscribeSubject = new Subject(); + + public constructor( + private changeDetectorRef: ChangeDetectorRef, + private userService: UserService + ) {} + + public ngOnInit() { + this.userService.stateChanged + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe((state) => { + if (state?.user) { + this.user = state.user; + + this.changeDetectorRef.markForCheck(); + } + }); + } + + public ngOnDestroy() { + this.unsubscribeSubject.next(); + this.unsubscribeSubject.complete(); + } +} diff --git a/apps/client/src/app/pages/faq/saas/saas-page.html b/apps/client/src/app/pages/faq/saas/saas-page.html new file mode 100644 index 000000000..f834e1f6f --- /dev/null +++ b/apps/client/src/app/pages/faq/saas/saas-page.html @@ -0,0 +1,162 @@ +
    +
    +
    +

    + Frequently Asked Questions (FAQ) +

    +

    + Find quick answers to commonly asked questions about the fully managed + Ghostfolio cloud offering in our Frequently Asked Questions (FAQ) + section. +

    + + + How do I start? + + + You can sign up via the “Get Started” button at the top of the page. You have multiple options to join + Ghostfolio: Create an account with a security token or + Google Sign. We will guide you to set up your portfolio. + + + + + Will you spam me with emails once I sign up? + + No, we do not even collect your email address, so you will not receive + any spam emails from us. + + + + + Is it really free? + Yes, it is! Our + pricing page details + everything you get for free. + + + + What is Ghostfolio Premium? + Ghostfolio Premium is a fully + managed Ghostfolio cloud offering for ambitious investors. Revenue is + used to cover the costs of the hosting infrastructure and to fund + ongoing development. It is the Open Source code base with some extras + like the markets overview and + a professional data provider. + + + + Can I start with a trial version? + Yes, you can try + Ghostfolio Premium by signing + up for Ghostfolio and applying for a trial (see “My Ghostfolio”). It + is easy, free and there is no commitment. You can stop using it at any + time. + + + + How can I get a student discount for Ghostfolio + Premium? + + Request your student discount + here with + your university e-mail address. + + + + Does the Ghostfolio Premium subscription renew + automatically? + + No, Ghostfolio Premium does + not include auto-renewal. Upon expiration, you can choose whether to + start a new subscription. + + + + I cannot find my broker in the list of platforms. What can I + do? + + + Please send an e-mail with the web address of your broker to + hi@ghostfol.io and we are + happy to add it. + + + + + Which devices are supported? + + Ghostfolio works in every modern web browser on smartphones, tablets + and desktop computers. For Android users of the managed cloud + offering, there is a dedicated Ghostfolio app available in the + Google Play Store. + + + + Got any other questions? + + Please join the Ghostfolio + Slack community, post to + @ghostfolio_, send an e-mail to + hi@ghostfol.io + or start a discussion at + GitHub. + +
    +
    +
    diff --git a/apps/client/src/app/pages/faq/saas/saas-page.module.ts b/apps/client/src/app/pages/faq/saas/saas-page.module.ts new file mode 100644 index 000000000..4ddcf9d24 --- /dev/null +++ b/apps/client/src/app/pages/faq/saas/saas-page.module.ts @@ -0,0 +1,13 @@ +import { CommonModule } from '@angular/common'; +import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; +import { MatCardModule } from '@angular/material/card'; + +import { SaasPageRoutingModule } from './saas-page-routing.module'; +import { SaasPageComponent } from './saas-page.component'; + +@NgModule({ + declarations: [SaasPageComponent], + imports: [CommonModule, MatCardModule, SaasPageRoutingModule], + schemas: [CUSTOM_ELEMENTS_SCHEMA] +}) +export class SaasPageModule {} diff --git a/apps/client/src/app/pages/faq/saas/saas-page.scss b/apps/client/src/app/pages/faq/saas/saas-page.scss new file mode 100644 index 000000000..75bda52c9 --- /dev/null +++ b/apps/client/src/app/pages/faq/saas/saas-page.scss @@ -0,0 +1,12 @@ +:host { + display: block; + + a { + color: rgba(var(--palette-primary-500), 1); + font-weight: 500; + + &:hover { + color: rgba(var(--palette-primary-300), 1); + } + } +} diff --git a/apps/client/src/app/pages/faq/self-hosting/self-hosting-page-routing.module.ts b/apps/client/src/app/pages/faq/self-hosting/self-hosting-page-routing.module.ts new file mode 100644 index 000000000..3879f7dbb --- /dev/null +++ b/apps/client/src/app/pages/faq/self-hosting/self-hosting-page-routing.module.ts @@ -0,0 +1,21 @@ +import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; + +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + +import { SelfHostingPageComponent } from './self-hosting-page.component'; + +const routes: Routes = [ + { + canActivate: [AuthGuard], + component: SelfHostingPageComponent, + path: '', + title: $localize`Self-Hosting` + ' – ' + $localize`FAQ` + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class SelfHostingPageRoutingModule {} diff --git a/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts b/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts new file mode 100644 index 000000000..b454020e1 --- /dev/null +++ b/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts @@ -0,0 +1,21 @@ +import { Component, OnDestroy } from '@angular/core'; +import { Subject } from 'rxjs'; + +@Component({ + host: { class: 'page' }, + selector: 'gf-self-hosting-page', + styleUrls: ['./self-hosting-page.scss'], + templateUrl: './self-hosting-page.html' +}) +export class SelfHostingPageComponent implements OnDestroy { + private unsubscribeSubject = new Subject(); + + public constructor() {} + + public ngOnInit() {} + + public ngOnDestroy() { + this.unsubscribeSubject.next(); + this.unsubscribeSubject.complete(); + } +} diff --git a/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.html b/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.html new file mode 100644 index 000000000..1f95abef3 --- /dev/null +++ b/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.html @@ -0,0 +1,145 @@ +
    +
    +
    +

    + Frequently Asked Questions (FAQ) +

    +

    + Find quick answers to commonly asked questions about self-hosting + Ghostfolio in our Frequently Asked Questions (FAQ) section. +

    + + + How do I start? + + + If you prefer to run Ghostfolio on your own infrastructure, please + find the source code and further instructions on + GitHub. + + + + + Which home server systems is Ghostfolio available + on? + + + The community has made Ghostfolio available on various home server + systems, including + CasaOS, Runtipi, + TrueCharts, Umbrel, and + Unraid. + + + + + How do I add a new currency? + + +

    + Ghostfolio manages currencies automatically based on all the + recorded activities. If you need an additional currency, you can + manually enter it. +

    +
      +
    1. Go to the Admin Control panel
    2. +
    3. Click on the Add Currency button
    4. +
    5. Insert e.g. EUR in the prompt
    6. +
    +
    +
    + + + How do I resolve + No exchange rate has been found errors? + + +

    + In Ghostfolio, you are responsible for providing the relevant + historical exchange rates. This can be done with a one-time import + of the data. If you see errors like + Historical exchange rate at 2024-01-01 is not available from + "EUR" to "USD" + do the following: +

    +
      +
    1. Go to the Admin Control panel
    2. +
    3. Go to the Market Data section
    4. +
    5. Select Filter by Currencies
    6. +
    7. Find the entry USDEUR
    8. +
    9. + Click the menu item Gather Historical Data in the dialog +
    10. +
    +
    +
    + + + How do I add a new platform? + + +
      +
    1. Go to the Admin Control panel
    2. +
    3. Go to the Settings section
    4. +
    5. Click on the Add Platform button
    6. +
    +
    +
    + + + How do I add a new tag? + + +
      +
    1. Go to the Admin Control panel
    2. +
    3. Go to the Settings section
    4. +
    5. Click on the Add Tag button
    6. +
    +
    +
    + + + Which devices are supported? + + Ghostfolio works in every modern web browser on smartphones, tablets + and desktop computers. + + + + Got any other questions? + + Please join the Ghostfolio + Slack community, post to + @ghostfolio_ + or start a discussion at + GitHub. + +
    +
    +
    diff --git a/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.module.ts b/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.module.ts new file mode 100644 index 000000000..65f9969a3 --- /dev/null +++ b/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.module.ts @@ -0,0 +1,13 @@ +import { CommonModule } from '@angular/common'; +import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; +import { MatCardModule } from '@angular/material/card'; + +import { SelfHostingPageRoutingModule } from './self-hosting-page-routing.module'; +import { SelfHostingPageComponent } from './self-hosting-page.component'; + +@NgModule({ + declarations: [SelfHostingPageComponent], + imports: [CommonModule, MatCardModule, SelfHostingPageRoutingModule], + schemas: [CUSTOM_ELEMENTS_SCHEMA] +}) +export class SelfHostingPageModule {} diff --git a/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.scss b/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.scss new file mode 100644 index 000000000..75bda52c9 --- /dev/null +++ b/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.scss @@ -0,0 +1,12 @@ +:host { + display: block; + + a { + color: rgba(var(--palette-primary-500), 1); + font-weight: 500; + + &:hover { + color: rgba(var(--palette-primary-300), 1); + } + } +} diff --git a/apps/client/src/app/pages/features/features-page-routing.module.ts b/apps/client/src/app/pages/features/features-page-routing.module.ts index 1723fd4e7..d6691acbd 100644 --- a/apps/client/src/app/pages/features/features-page-routing.module.ts +++ b/apps/client/src/app/pages/features/features-page-routing.module.ts @@ -1,6 +1,7 @@ +import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; + import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; import { FeaturesPageComponent } from './features-page.component'; diff --git a/apps/client/src/app/pages/features/features-page.component.ts b/apps/client/src/app/pages/features/features-page.component.ts index 3ec35c91d..822a54b7b 100644 --- a/apps/client/src/app/pages/features/features-page.component.ts +++ b/apps/client/src/app/pages/features/features-page.component.ts @@ -1,8 +1,9 @@ -import { ChangeDetectorRef, Component, OnDestroy } from '@angular/core'; import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { InfoItem, User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; + +import { ChangeDetectorRef, Component, OnDestroy } from '@angular/core'; import { Subject, takeUntil } from 'rxjs'; @Component({ diff --git a/apps/client/src/app/pages/features/features-page.html b/apps/client/src/app/pages/features/features-page.html index c7636ce08..01fce0f00 100644 --- a/apps/client/src/app/pages/features/features-page.html +++ b/apps/client/src/app/pages/features/features-page.html @@ -139,10 +139,9 @@

    Portfolio Calculations - + @if (hasPermissionForSubscription) { + + }

    Check the rate of return of your portfolio for @@ -159,10 +158,9 @@

    Portfolio Allocations - + @if (hasPermissionForSubscription) { + + }

    Check the allocations of your portfolio by account, asset @@ -198,37 +196,35 @@

    -
    - - -
    -

    - Market Mood - -

    -

    - Check the current market mood (Fear & Greed Index) within the app. -

    -
    -
    -
    -
    + @if (hasPermissionForSubscription) { +
    + + +
    +

    + Market Mood + +

    +

    + Check the current market mood (Fear & Greed Index) within the app. +

    +
    +
    +
    +
    + }

    Static Analysis - + @if (hasPermissionForSubscription) { + + }

    Identify potential risks in your portfolio with Ghostfolio @@ -293,11 +289,17 @@

    -
    -
    - Get Started + @if (!user) { +
    +
    -
    + }
    diff --git a/apps/client/src/app/pages/features/features-page.module.ts b/apps/client/src/app/pages/features/features-page.module.ts index 9c90ccc00..ede263d94 100644 --- a/apps/client/src/app/pages/features/features-page.module.ts +++ b/apps/client/src/app/pages/features/features-page.module.ts @@ -1,8 +1,9 @@ +import { GfPremiumIndicatorModule } from '@ghostfolio/ui/premium-indicator'; + import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; import { MatCardModule } from '@angular/material/card'; -import { GfPremiumIndicatorModule } from '@ghostfolio/ui/premium-indicator'; import { FeaturesPageRoutingModule } from './features-page-routing.module'; import { FeaturesPageComponent } from './features-page.component'; diff --git a/apps/client/src/app/pages/home/home-page-routing.module.ts b/apps/client/src/app/pages/home/home-page-routing.module.ts index 347bfc567..bccfc2f57 100644 --- a/apps/client/src/app/pages/home/home-page-routing.module.ts +++ b/apps/client/src/app/pages/home/home-page-routing.module.ts @@ -1,11 +1,12 @@ -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; import { HomeHoldingsComponent } from '@ghostfolio/client/components/home-holdings/home-holdings.component'; import { HomeMarketComponent } from '@ghostfolio/client/components/home-market/home-market.component'; import { HomeOverviewComponent } from '@ghostfolio/client/components/home-overview/home-overview.component'; import { HomeSummaryComponent } from '@ghostfolio/client/components/home-summary/home-summary.component'; import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + import { HomePageComponent } from './home-page.component'; const routes: Routes = [ diff --git a/apps/client/src/app/pages/home/home-page.component.ts b/apps/client/src/app/pages/home/home-page.component.ts index fea8e9ac3..3a6a0cb26 100644 --- a/apps/client/src/app/pages/home/home-page.component.ts +++ b/apps/client/src/app/pages/home/home-page.component.ts @@ -1,6 +1,7 @@ -import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { TabConfiguration, User } from '@ghostfolio/common/interfaces'; + +import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { DeviceDetectorService } from 'ngx-device-detector'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; diff --git a/apps/client/src/app/pages/home/home-page.html b/apps/client/src/app/pages/home/home-page.html index 839e8114f..360cbd463 100644 --- a/apps/client/src/app/pages/home/home-page.html +++ b/apps/client/src/app/pages/home/home-page.html @@ -21,7 +21,7 @@ >
    {{ tab.label }}
    diff --git a/apps/client/src/app/pages/home/home-page.module.ts b/apps/client/src/app/pages/home/home-page.module.ts index 3493a2855..045cfa8c0 100644 --- a/apps/client/src/app/pages/home/home-page.module.ts +++ b/apps/client/src/app/pages/home/home-page.module.ts @@ -1,12 +1,13 @@ -import { CommonModule } from '@angular/common'; -import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; -import { MatTabsModule } from '@angular/material/tabs'; -import { RouterModule } from '@angular/router'; import { GfHomeHoldingsModule } from '@ghostfolio/client/components/home-holdings/home-holdings.module'; import { GfHomeMarketModule } from '@ghostfolio/client/components/home-market/home-market.module'; import { GfHomeOverviewModule } from '@ghostfolio/client/components/home-overview/home-overview.module'; import { GfHomeSummaryModule } from '@ghostfolio/client/components/home-summary/home-summary.module'; +import { CommonModule } from '@angular/common'; +import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; +import { MatTabsModule } from '@angular/material/tabs'; +import { RouterModule } from '@angular/router'; + import { HomePageRoutingModule } from './home-page-routing.module'; import { HomePageComponent } from './home-page.component'; diff --git a/apps/client/src/app/pages/i18n/i18n-page-routing.module.ts b/apps/client/src/app/pages/i18n/i18n-page-routing.module.ts index 9965121ca..d268ddba0 100644 --- a/apps/client/src/app/pages/i18n/i18n-page-routing.module.ts +++ b/apps/client/src/app/pages/i18n/i18n-page-routing.module.ts @@ -1,6 +1,7 @@ +import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; + import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; import { I18nPageComponent } from './i18n-page.component'; diff --git a/apps/client/src/app/pages/i18n/i18n-page.html b/apps/client/src/app/pages/i18n/i18n-page.html index 4922b01cd..b23129c45 100644 --- a/apps/client/src/app/pages/i18n/i18n-page.html +++ b/apps/client/src/app/pages/i18n/i18n-page.html @@ -10,6 +10,7 @@ app, asset, cryptocurrency, dashboard, etf, finance, management, performance, portfolio, software, stock, trading, wealth, web3
  • +
  • My Account
  • Open Source Wealth Management Software
diff --git a/apps/client/src/app/pages/landing/landing-page-routing.module.ts b/apps/client/src/app/pages/landing/landing-page-routing.module.ts index 48eb070d3..0a8ac146d 100644 --- a/apps/client/src/app/pages/landing/landing-page-routing.module.ts +++ b/apps/client/src/app/pages/landing/landing-page-routing.module.ts @@ -1,6 +1,7 @@ +import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; + import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; import { LandingPageComponent } from './landing-page.component'; diff --git a/apps/client/src/app/pages/landing/landing-page.component.ts b/apps/client/src/app/pages/landing/landing-page.component.ts index fddd0bb6d..ca8c0b420 100644 --- a/apps/client/src/app/pages/landing/landing-page.component.ts +++ b/apps/client/src/app/pages/landing/landing-page.component.ts @@ -1,7 +1,8 @@ -import { Component, OnDestroy, OnInit } from '@angular/core'; import { DataService } from '@ghostfolio/client/services/data.service'; import { Statistics } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; + +import { Component, OnDestroy, OnInit } from '@angular/core'; import { format } from 'date-fns'; import { DeviceDetectorService } from 'ngx-device-detector'; import { Subject } from 'rxjs'; diff --git a/apps/client/src/app/pages/landing/landing-page.html b/apps/client/src/app/pages/landing/landing-page.html index b54e19633..e48b5e6ed 100644 --- a/apps/client/src/app/pages/landing/landing-page.html +++ b/apps/client/src/app/pages/landing/landing-page.html @@ -339,7 +339,8 @@ [href]="testimonial.url" >{{ testimonial.author }} - {{ testimonial.author }}, + {{ testimonial.author }}, {{ testimonial.country }} diff --git a/apps/client/src/app/pages/landing/landing-page.module.ts b/apps/client/src/app/pages/landing/landing-page.module.ts index 4357f52fc..ef1d3d0ac 100644 --- a/apps/client/src/app/pages/landing/landing-page.module.ts +++ b/apps/client/src/app/pages/landing/landing-page.module.ts @@ -1,12 +1,13 @@ +import { GfWorldMapChartModule } from '@ghostfolio/client/components/world-map-chart/world-map-chart.module'; +import { GfCarouselModule } from '@ghostfolio/ui/carousel'; +import { GfLogoModule } from '@ghostfolio/ui/logo'; +import { GfValueModule } from '@ghostfolio/ui/value'; + import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; import { MatCardModule } from '@angular/material/card'; import { RouterModule } from '@angular/router'; -import { GfWorldMapChartModule } from '@ghostfolio/client/components/world-map-chart/world-map-chart.module'; -import { GfCarouselModule } from '@ghostfolio/ui/carousel'; -import { GfLogoModule } from '@ghostfolio/ui/logo'; -import { GfValueModule } from '@ghostfolio/ui/value'; import { LandingPageRoutingModule } from './landing-page-routing.module'; import { LandingPageComponent } from './landing-page.component'; diff --git a/apps/client/src/app/pages/markets/markets-page-routing.module.ts b/apps/client/src/app/pages/markets/markets-page-routing.module.ts index ba6b6bb82..6501d58b9 100644 --- a/apps/client/src/app/pages/markets/markets-page-routing.module.ts +++ b/apps/client/src/app/pages/markets/markets-page-routing.module.ts @@ -1,6 +1,7 @@ +import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; + import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; import { MarketsPageComponent } from './markets-page.component'; diff --git a/apps/client/src/app/pages/markets/markets-page.module.ts b/apps/client/src/app/pages/markets/markets-page.module.ts index e61c7ccfe..cabb078bc 100644 --- a/apps/client/src/app/pages/markets/markets-page.module.ts +++ b/apps/client/src/app/pages/markets/markets-page.module.ts @@ -1,6 +1,7 @@ +import { GfHomeMarketModule } from '@ghostfolio/client/components/home-market/home-market.module'; + import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; -import { GfHomeMarketModule } from '@ghostfolio/client/components/home-market/home-market.module'; import { MarketsPageRoutingModule } from './markets-page-routing.module'; import { MarketsPageComponent } from './markets-page.component'; diff --git a/apps/client/src/app/pages/open/open-page-routing.module.ts b/apps/client/src/app/pages/open/open-page-routing.module.ts index 4dadc912e..b9db4ab10 100644 --- a/apps/client/src/app/pages/open/open-page-routing.module.ts +++ b/apps/client/src/app/pages/open/open-page-routing.module.ts @@ -1,6 +1,7 @@ +import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; + import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; import { OpenPageComponent } from './open-page.component'; diff --git a/apps/client/src/app/pages/open/open-page.component.ts b/apps/client/src/app/pages/open/open-page.component.ts index cf438a816..c7faaa4e2 100644 --- a/apps/client/src/app/pages/open/open-page.component.ts +++ b/apps/client/src/app/pages/open/open-page.component.ts @@ -1,7 +1,8 @@ -import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { Statistics, User } from '@ghostfolio/common/interfaces'; + +import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { Subject, takeUntil } from 'rxjs'; @Component({ diff --git a/apps/client/src/app/pages/open/open-page.module.ts b/apps/client/src/app/pages/open/open-page.module.ts index 6a9c988d6..ba8a94831 100644 --- a/apps/client/src/app/pages/open/open-page.module.ts +++ b/apps/client/src/app/pages/open/open-page.module.ts @@ -1,7 +1,8 @@ +import { GfValueModule } from '@ghostfolio/ui/value'; + import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { MatCardModule } from '@angular/material/card'; -import { GfValueModule } from '@ghostfolio/ui/value'; import { OpenPageRoutingModule } from './open-page-routing.module'; import { OpenPageComponent } from './open-page.component'; diff --git a/apps/client/src/app/pages/portfolio/activities/activities-page-routing.module.ts b/apps/client/src/app/pages/portfolio/activities/activities-page-routing.module.ts index b1a3e1e4c..00962d563 100644 --- a/apps/client/src/app/pages/portfolio/activities/activities-page-routing.module.ts +++ b/apps/client/src/app/pages/portfolio/activities/activities-page-routing.module.ts @@ -1,6 +1,7 @@ +import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; + import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; import { ActivitiesPageComponent } from './activities-page.component'; 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 01f939905..190fc673e 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 @@ -1,9 +1,3 @@ -import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; -import { MatDialog } from '@angular/material/dialog'; -import { PageEvent } from '@angular/material/paginator'; -import { Sort, SortDirection } from '@angular/material/sort'; -import { MatTableDataSource } from '@angular/material/table'; -import { ActivatedRoute, Router } from '@angular/router'; import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto'; import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { UpdateOrderDto } from '@ghostfolio/api/app/order/update-order.dto'; @@ -17,6 +11,13 @@ import { DEFAULT_PAGE_SIZE } from '@ghostfolio/common/config'; import { downloadAsFile } from '@ghostfolio/common/helper'; import { User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; + +import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; +import { PageEvent } from '@angular/material/paginator'; +import { Sort, SortDirection } from '@angular/material/sort'; +import { MatTableDataSource } from '@angular/material/table'; +import { ActivatedRoute, Router } from '@angular/router'; import { DataSource, Order as OrderModel } from '@prisma/client'; import { format, parseISO } from 'date-fns'; import { DeviceDetectorService } from 'ngx-device-detector'; @@ -35,7 +36,6 @@ import { ImportActivitiesDialogParams } from './import-activities-dialog/interfa export class ActivitiesPageComponent implements OnDestroy, OnInit { public activities: Activity[]; public dataSource: MatTableDataSource; - public defaultAccountId: string; public deviceType: string; public hasImpersonationId: boolean; public hasPermissionToCreateActivity: boolean; @@ -121,43 +121,25 @@ export class ActivitiesPageComponent implements OnDestroy, OnInit { } public fetchActivities() { - if (this.user?.settings?.isExperimentalFeatures === true) { - this.dataService - .fetchActivities({ - filters: this.userService.getFilters(), - skip: this.pageIndex * this.pageSize, - sortColumn: this.sortColumn, - sortDirection: this.sortDirection, - take: this.pageSize - }) - .pipe(takeUntil(this.unsubscribeSubject)) - .subscribe(({ activities, count }) => { - this.dataSource = new MatTableDataSource(activities); - this.totalItems = count; - - if (this.hasPermissionToCreateActivity && this.totalItems <= 0) { - this.router.navigate([], { queryParams: { createDialog: true } }); - } + this.dataService + .fetchActivities({ + filters: this.userService.getFilters(), + skip: this.pageIndex * this.pageSize, + sortColumn: this.sortColumn, + sortDirection: this.sortDirection, + take: this.pageSize + }) + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe(({ activities, count }) => { + this.dataSource = new MatTableDataSource(activities); + this.totalItems = count; - this.changeDetectorRef.markForCheck(); - }); - } else { - this.dataService - .fetchActivities({}) - .pipe(takeUntil(this.unsubscribeSubject)) - .subscribe(({ activities }) => { - this.activities = activities; - - if ( - this.hasPermissionToCreateActivity && - this.activities?.length <= 0 - ) { - this.router.navigate([], { queryParams: { createDialog: true } }); - } + if (this.hasPermissionToCreateActivity && this.totalItems <= 0) { + this.router.navigate([], { queryParams: { createDialog: true } }); + } - this.changeDetectorRef.markForCheck(); - }); - } + this.changeDetectorRef.markForCheck(); + }); } public onChangePage(page: PageEvent) { @@ -291,7 +273,7 @@ export class ActivitiesPageComponent implements OnDestroy, OnInit { }); } - public openUpdateActivityDialog(activity: Activity): void { + public openUpdateActivityDialog(activity: Activity) { const dialogRef = this.dialog.open(CreateOrUpdateActivityDialog, { data: { activity, @@ -328,7 +310,7 @@ export class ActivitiesPageComponent implements OnDestroy, OnInit { this.unsubscribeSubject.complete(); } - private openCreateActivityDialog(aActivity?: Activity): void { + private openCreateActivityDialog(aActivity?: Activity) { this.userService .get() .pipe(takeUntil(this.unsubscribeSubject)) @@ -340,7 +322,7 @@ export class ActivitiesPageComponent implements OnDestroy, OnInit { accounts: this.user?.accounts, activity: { ...aActivity, - accountId: aActivity?.accountId ?? this.defaultAccountId, + accountId: aActivity?.accountId, date: new Date(), id: null, fee: 0, @@ -416,10 +398,6 @@ export class ActivitiesPageComponent implements OnDestroy, OnInit { private updateUser(aUser: User) { this.user = aUser; - this.defaultAccountId = this.user?.accounts.find((account) => { - return account.isDefault; - })?.id; - this.hasPermissionToCreateActivity = !this.hasImpersonationId && hasPermission(this.user.permissions, permissions.createOrder); diff --git a/apps/client/src/app/pages/portfolio/activities/activities-page.html b/apps/client/src/app/pages/portfolio/activities/activities-page.html index 3322ff184..8872470b7 100644 --- a/apps/client/src/app/pages/portfolio/activities/activities-page.html +++ b/apps/client/src/app/pages/portfolio/activities/activities-page.html @@ -2,8 +2,7 @@

Activities

- -
-
- - - -
+ @if ( + !hasImpersonationId && + hasPermissionToCreateActivity && + !user.settings.isRestrictedView + ) { +
+ + + +
+ } diff --git a/apps/client/src/app/pages/portfolio/activities/activities-page.module.ts b/apps/client/src/app/pages/portfolio/activities/activities-page.module.ts index 7f6d708df..c7c14b623 100644 --- a/apps/client/src/app/pages/portfolio/activities/activities-page.module.ts +++ b/apps/client/src/app/pages/portfolio/activities/activities-page.module.ts @@ -1,11 +1,11 @@ +import { ImportActivitiesService } from '@ghostfolio/client/services/import-activities.service'; +import { GfActivitiesTableModule } from '@ghostfolio/ui/activities-table/activities-table.module'; + import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; import { MatSnackBarModule } from '@angular/material/snack-bar'; import { RouterModule } from '@angular/router'; -import { ImportActivitiesService } from '@ghostfolio/client/services/import-activities.service'; -import { GfActivitiesTableLazyModule } from '@ghostfolio/ui/activities-table-lazy/activities-table-lazy.module'; -import { GfActivitiesTableModule } from '@ghostfolio/ui/activities-table/activities-table.module'; import { ActivitiesPageRoutingModule } from './activities-page-routing.module'; import { ActivitiesPageComponent } from './activities-page.component'; @@ -18,7 +18,6 @@ import { GfImportActivitiesDialogModule } from './import-activities-dialog/impor ActivitiesPageRoutingModule, CommonModule, GfActivitiesTableModule, - GfActivitiesTableLazyModule, GfCreateOrUpdateActivityDialogModule, GfImportActivitiesDialogModule, MatButtonModule, diff --git a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts index 0a67ce60e..b628aba46 100644 --- a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts +++ b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts @@ -1,3 +1,9 @@ +import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto'; +import { UpdateOrderDto } from '@ghostfolio/api/app/order/update-order.dto'; +import { DataService } from '@ghostfolio/client/services/data.service'; +import { getDateFormatString } from '@ghostfolio/common/helper'; +import { translate } from '@ghostfolio/ui/i18n'; + import { COMMA, ENTER } from '@angular/cdk/keycodes'; import { ChangeDetectionStrategy, @@ -12,13 +18,9 @@ import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { MatAutocompleteSelectedEvent } from '@angular/material/autocomplete'; import { DateAdapter, MAT_DATE_LOCALE } from '@angular/material/core'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; -import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto'; -import { UpdateOrderDto } from '@ghostfolio/api/app/order/update-order.dto'; -import { DataService } from '@ghostfolio/client/services/data.service'; -import { getDateFormatString } from '@ghostfolio/common/helper'; -import { translate } from '@ghostfolio/ui/i18n'; import { AssetClass, AssetSubClass, Tag, Type } from '@prisma/client'; import { isUUID } from 'class-validator'; +import { isToday } from 'date-fns'; import { EMPTY, Observable, Subject, lastValueFrom, of } from 'rxjs'; import { catchError, delay, map, startWith, takeUntil } from 'rxjs/operators'; @@ -47,6 +49,7 @@ export class CreateOrUpdateActivityDialog implements OnDestroy { public defaultDateFormat: string; public filteredTagsObservable: Observable = of([]); public isLoading = false; + public isToday = isToday; public platforms: { id: string; name: string }[]; public separatorKeysCodes: number[] = [ENTER, COMMA]; public tags: Tag[] = []; @@ -257,6 +260,17 @@ export class CreateOrUpdateActivityDialog implements OnDestroy { this.activityForm.controls['currency'].setValue(currency); this.activityForm.controls['currencyOfFee'].setValue(currency); this.activityForm.controls['currencyOfUnitPrice'].setValue(currency); + + if (['FEE', 'INTEREST'].includes(type)) { + if (this.activityForm.controls['accountId'].value) { + this.activityForm.controls['updateAccountBalance'].enable(); + } else { + this.activityForm.controls['updateAccountBalance'].disable(); + this.activityForm.controls['updateAccountBalance'].setValue( + false + ); + } + } } } ); @@ -371,8 +385,15 @@ export class CreateOrUpdateActivityDialog implements OnDestroy { this.activityForm.controls['unitPriceInCustomCurrency'].setValue(0); } - this.activityForm.controls['updateAccountBalance'].disable(); - this.activityForm.controls['updateAccountBalance'].setValue(false); + if ( + ['FEE', 'INTEREST'].includes(type) && + this.activityForm.controls['accountId'].value + ) { + this.activityForm.controls['updateAccountBalance'].enable(); + } else { + this.activityForm.controls['updateAccountBalance'].disable(); + this.activityForm.controls['updateAccountBalance'].setValue(false); + } } else { this.activityForm.controls['accountId'].setValidators( Validators.required diff --git a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html index 6aa9ed9d2..81c41a316 100644 --- a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html +++ b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -11,48 +11,61 @@ Type - {{ typesTranslationMap[activityForm.controls['type'].value] - }} + {{ + typesTranslationMap[activityForm.controls['type'].value] + }} - {{ typesTranslationMap['BUY'] }} + {{ typesTranslationMap['BUY'] }} Stocks, ETFs, bonds, cryptocurrencies, commodities - {{ typesTranslationMap['FEE'] }} + {{ typesTranslationMap['FEE'] }} One-time fee, annual account fees - {{ typesTranslationMap['DIVIDEND'] }} + {{ typesTranslationMap['DIVIDEND'] }} Distribution of corporate earnings - {{ typesTranslationMap['INTEREST'] }} + {{ typesTranslationMap['INTEREST'] }} Revenue for lending out money - {{ typesTranslationMap['LIABILITY'] }} + {{ typesTranslationMap['LIABILITY'] }} Mortgages, personal loans, credit cards - {{ typesTranslationMap['SELL'] }} + {{ typesTranslationMap['SELL'] }} Stocks, ETFs, bonds, cryptocurrencies, commodities - {{ typesTranslationMap['ITEM'] }} + {{ typesTranslationMap['ITEM'] }} Luxury items, real estate, private companies @@ -60,18 +73,22 @@ -
+
Account + />
-
+
Update Cash Balance
Name, symbol or ISIN @@ -107,7 +128,11 @@
Name @@ -118,9 +143,9 @@ Currency - {{ currency }} + {{ + currency + }}
@@ -141,12 +166,18 @@ name="calendar-clear-outline" /> - +
Quantity @@ -155,7 +186,7 @@
@@ -192,17 +223,26 @@
Oops! Could not get the historical exchange rate from - {{ activityForm.controls['date']?.value | date: defaultDateFormat + {{ + activityForm.controls['date']?.value | date: defaultDateFormat }}
Fee @@ -252,11 +297,14 @@
Oops! Could not get the historical exchange rate from - {{ activityForm.controls['date']?.value | date: defaultDateFormat + {{ + activityForm.controls['date']?.value | date: defaultDateFormat }} @@ -265,9 +313,9 @@ Fee - {{ activityForm.controls['currency'].value }} + {{ + activityForm.controls['currency'].value + }}
@@ -289,7 +337,7 @@ Asset Class - + Asset Sub Class - + {{ tag.name }} @@ -354,7 +402,10 @@ class="flex-grow-1" [isCurrency]="true" [locale]="data.user?.settings?.locale" - [unit]="activityForm.controls['currency']?.value ?? data.user?.settings?.baseCurrency" + [unit]=" + activityForm.controls['currency']?.value ?? + data.user?.settings?.baseCurrency + " [value]="total" />
diff --git a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.module.ts b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.module.ts index 316011d42..da834fda6 100644 --- a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.module.ts +++ b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.module.ts @@ -1,3 +1,7 @@ +import { GfSymbolIconModule } from '@ghostfolio/client/components/symbol-icon/symbol-icon.module'; +import { GfSymbolAutocompleteModule } from '@ghostfolio/ui/symbol-autocomplete/symbol-autocomplete.module'; +import { GfValueModule } from '@ghostfolio/ui/value'; + import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; @@ -10,9 +14,6 @@ import { MatDialogModule } from '@angular/material/dialog'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatInputModule } from '@angular/material/input'; import { MatSelectModule } from '@angular/material/select'; -import { GfSymbolIconModule } from '@ghostfolio/client/components/symbol-icon/symbol-icon.module'; -import { GfSymbolAutocompleteModule } from '@ghostfolio/ui/symbol-autocomplete/symbol-autocomplete.module'; -import { GfValueModule } from '@ghostfolio/ui/value'; import { CreateOrUpdateActivityDialog } from './create-or-update-activity-dialog.component'; diff --git a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/interfaces/interfaces.ts b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/interfaces/interfaces.ts index 2db48a452..60a39d361 100644 --- a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/interfaces/interfaces.ts +++ b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/interfaces/interfaces.ts @@ -1,5 +1,6 @@ import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { User } from '@ghostfolio/common/interfaces'; + import { Account } from '@prisma/client'; export interface CreateOrUpdateActivityDialogParams { diff --git a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts index 7fc4b234b..c8d369f54 100644 --- a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts +++ b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts @@ -1,3 +1,9 @@ +import { CreateAccountDto } from '@ghostfolio/api/app/account/create-account.dto'; +import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; +import { DataService } from '@ghostfolio/client/services/data.service'; +import { ImportActivitiesService } from '@ghostfolio/client/services/import-activities.service'; +import { Position } from '@ghostfolio/common/interfaces'; + import { StepperOrientation, StepperSelectionEvent @@ -15,11 +21,6 @@ import { MatSnackBar } from '@angular/material/snack-bar'; import { SortDirection } from '@angular/material/sort'; import { MatStepper } from '@angular/material/stepper'; import { MatTableDataSource } from '@angular/material/table'; -import { CreateAccountDto } from '@ghostfolio/api/app/account/create-account.dto'; -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; -import { DataService } from '@ghostfolio/client/services/data.service'; -import { ImportActivitiesService } from '@ghostfolio/client/services/import-activities.service'; -import { Position } from '@ghostfolio/common/interfaces'; import { AssetClass } from '@prisma/client'; import { isArray, sortBy } from 'lodash'; import { DeviceDetectorService } from 'ngx-device-detector'; @@ -149,7 +150,7 @@ export class ImportActivitiesDialog implements OnDestroy { }: { files: FileList; stepper: MatStepper; - }): void { + }) { if (files.length === 0) { return; } diff --git a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html index d98841edf..032480acf 100644 --- a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html +++ b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html @@ -24,7 +24,7 @@ >
- + @if (mode === 'DIVIDEND') { Holding - {{ uniqueAssetForm.controls['uniqueAsset']?.value?.name - }} + {{ + uniqueAssetForm.controls['uniqueAsset']?.value?.name + }} - {{ holding.name }} + {{ holding.name }}
{{ holding.symbol | gfSymbol }} · {{ holding.currency - }}{{ holding.symbol | gfSymbol }} · + {{ holding.currency }}
@@ -53,7 +58,7 @@ *ngIf="isLoading" class="position-absolute" [diameter]="20" - > + />
-
- + } @else {
@@ -115,9 +119,9 @@ >
- - -
-
- + } @else { Import
- + }
diff --git a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.module.ts b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.module.ts index 6865a8f0d..95573b1d6 100644 --- a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.module.ts +++ b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.module.ts @@ -1,3 +1,9 @@ +import { GfDialogFooterModule } from '@ghostfolio/client/components/dialog-footer/dialog-footer.module'; +import { GfDialogHeaderModule } from '@ghostfolio/client/components/dialog-header/dialog-header.module'; +import { GfFileDropModule } from '@ghostfolio/client/directives/file-drop/file-drop.module'; +import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module'; +import { GfActivitiesTableModule } from '@ghostfolio/ui/activities-table/activities-table.module'; + import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; @@ -8,12 +14,6 @@ import { MatFormFieldModule } from '@angular/material/form-field'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { MatSelectModule } from '@angular/material/select'; import { MatStepperModule } from '@angular/material/stepper'; -import { GfDialogFooterModule } from '@ghostfolio/client/components/dialog-footer/dialog-footer.module'; -import { GfDialogHeaderModule } from '@ghostfolio/client/components/dialog-header/dialog-header.module'; -import { GfFileDropModule } from '@ghostfolio/client/directives/file-drop/file-drop.module'; -import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module'; -import { GfActivitiesTableModule } from '@ghostfolio/ui/activities-table/activities-table.module'; -import { GfActivitiesTableLazyModule } from '@ghostfolio/ui/activities-table-lazy/activities-table-lazy.module'; import { ImportActivitiesDialog } from './import-activities-dialog.component'; @@ -23,7 +23,6 @@ import { ImportActivitiesDialog } from './import-activities-dialog.component'; CommonModule, FormsModule, GfActivitiesTableModule, - GfActivitiesTableLazyModule, GfDialogFooterModule, GfDialogHeaderModule, GfFileDropModule, diff --git a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/interfaces/interfaces.ts b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/interfaces/interfaces.ts index 755a50baf..a2131db88 100644 --- a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/interfaces/interfaces.ts +++ b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/interfaces/interfaces.ts @@ -1,4 +1,5 @@ import { User } from '@ghostfolio/common/interfaces'; + import { Type } from '@prisma/client'; export interface ImportActivitiesDialogParams { diff --git a/apps/client/src/app/pages/portfolio/allocations/allocations-page-routing.module.ts b/apps/client/src/app/pages/portfolio/allocations/allocations-page-routing.module.ts index e5dfd6a2a..bb5833442 100644 --- a/apps/client/src/app/pages/portfolio/allocations/allocations-page-routing.module.ts +++ b/apps/client/src/app/pages/portfolio/allocations/allocations-page-routing.module.ts @@ -1,6 +1,7 @@ +import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; + import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; import { AllocationsPageComponent } from './allocations-page.component'; 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 eb87c21ca..67ad82316 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 @@ -1,6 +1,3 @@ -import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; -import { MatDialog } from '@angular/material/dialog'; -import { ActivatedRoute, Router } from '@angular/router'; import { AccountDetailDialog } from '@ghostfolio/client/components/account-detail-dialog/account-detail-dialog.component'; import { AccountDetailDialogParams } from '@ghostfolio/client/components/account-detail-dialog/interfaces/interfaces'; import { PositionDetailDialogParams } from '@ghostfolio/client/components/position/position-detail-dialog/interfaces/interfaces'; @@ -11,7 +8,6 @@ import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UNKNOWN_KEY } from '@ghostfolio/common/config'; import { prettifySymbol } from '@ghostfolio/common/helper'; import { - Filter, PortfolioDetails, PortfolioPosition, UniqueAsset, @@ -20,11 +16,15 @@ import { import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { Market, MarketAdvanced } from '@ghostfolio/common/types'; import { translate } from '@ghostfolio/ui/i18n'; + +import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; +import { ActivatedRoute, Router } from '@angular/router'; import { Account, AssetClass, DataSource, Platform } from '@prisma/client'; import { isNumber } from 'lodash'; import { DeviceDetectorService } from 'ngx-device-detector'; import { Subject } from 'rxjs'; -import { distinctUntilChanged, switchMap, takeUntil } from 'rxjs/operators'; +import { takeUntil } from 'rxjs/operators'; @Component({ selector: 'gf-allocations-page', @@ -38,8 +38,6 @@ export class AllocationsPageComponent implements OnDestroy, OnInit { value: number; }; }; - public activeFilters: Filter[] = []; - public allFilters: Filter[]; public continents: { [code: string]: { name: string; value: number }; }; @@ -47,7 +45,6 @@ export class AllocationsPageComponent implements OnDestroy, OnInit { [code: string]: { name: string; value: number }; }; public deviceType: string; - public filters$ = new Subject(); public hasImpersonationId: boolean; public isLoading = false; public markets: { @@ -60,7 +57,6 @@ export class AllocationsPageComponent implements OnDestroy, OnInit { value: number; }; }; - public placeholder = ''; public platforms: { [id: string]: Pick & { id: string; @@ -135,98 +131,34 @@ export class AllocationsPageComponent implements OnDestroy, OnInit { this.hasImpersonationId = !!impersonationId; }); - this.filters$ - .pipe( - distinctUntilChanged(), - switchMap((filters) => { - this.isLoading = true; - this.activeFilters = filters; - this.placeholder = - this.activeFilters.length <= 0 - ? $localize`Filter by account or tag...` - : ''; - - this.initialize(); - - return this.fetchPortfolioDetails(); - }), - takeUntil(this.unsubscribeSubject) - ) - .subscribe((portfolioDetails) => { - this.initialize(); - - this.portfolioDetails = portfolioDetails; - - this.initializeAllocationsData(); - - this.isLoading = false; - - this.changeDetectorRef.markForCheck(); - }); - this.userService.stateChanged .pipe(takeUntil(this.unsubscribeSubject)) .subscribe((state) => { if (state?.user) { this.user = state.user; - const accountFilters: Filter[] = this.user.accounts.map( - ({ id, name }) => { - return { - id, - label: name, - type: 'ACCOUNT' - }; - } - ); - - const assetClassFilters: Filter[] = []; - for (const assetClass of Object.keys(AssetClass)) { - assetClassFilters.push({ - id: assetClass, - label: translate(assetClass), - type: 'ASSET_CLASS' - }); - } - - const tagFilters: Filter[] = this.user.tags.map(({ id, name }) => { - return { - id, - label: translate(name), - type: 'TAG' - }; - }); - - this.allFilters = [ - ...accountFilters, - ...assetClassFilters, - ...tagFilters - ]; - this.worldMapChartFormat = this.hasImpersonationId || this.user.settings.isRestrictedView ? `{0}%` : `{0} ${this.user?.settings?.baseCurrency}`; - if (this.user?.settings?.isExperimentalFeatures === true) { - this.isLoading = true; + this.isLoading = true; - this.initialize(); + this.initialize(); - this.fetchPortfolioDetails() - .pipe(takeUntil(this.unsubscribeSubject)) - .subscribe((portfolioDetails) => { - this.initialize(); + this.fetchPortfolioDetails() + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe((portfolioDetails) => { + this.initialize(); - this.portfolioDetails = portfolioDetails; + this.portfolioDetails = portfolioDetails; - this.initializeAllocationsData(); + this.initializeAllocationsData(); - this.isLoading = false; + this.isLoading = false; - this.changeDetectorRef.markForCheck(); - }); - } + this.changeDetectorRef.markForCheck(); + }); this.changeDetectorRef.markForCheck(); } @@ -273,10 +205,7 @@ export class AllocationsPageComponent implements OnDestroy, OnInit { private fetchPortfolioDetails() { return this.dataService.fetchPortfolioDetails({ - filters: - this.activeFilters.length > 0 - ? this.activeFilters - : this.userService.getFilters() + filters: this.userService.getFilters() }); } @@ -352,7 +281,6 @@ export class AllocationsPageComponent implements OnDestroy, OnInit { this.platforms = {}; this.portfolioDetails = { accounts: {}, - filteredValueInPercentage: 0, holdings: {}, platforms: {}, summary: undefined diff --git a/apps/client/src/app/pages/portfolio/allocations/allocations-page.html b/apps/client/src/app/pages/portfolio/allocations/allocations-page.html index 7088c177b..04bf96f39 100644 --- a/apps/client/src/app/pages/portfolio/allocations/allocations-page.html +++ b/apps/client/src/app/pages/portfolio/allocations/allocations-page.html @@ -2,14 +2,6 @@

Allocations

- @if (!user?.settings?.isExperimentalFeatures) { - - }
@@ -23,15 +15,23 @@ class="justify-content-end l-2" size="medium" [isPercent]="true" - [value]="isLoading ? undefined : portfolioDetails?.filteredValueInPercentage" + [value]=" + isLoading + ? undefined + : portfolioDetails?.summary?.filteredValueInPercentage + " /> + [title]=" + ( + portfolioDetails?.summary?.filteredValueInPercentage * 100 + ).toFixed(2) + '%' + " + [value]="portfolioDetails?.summary?.filteredValueInPercentage * 100" + />
@@ -106,8 +106,8 @@ - By Holding + By Holding +
diff --git a/apps/client/src/app/pages/portfolio/allocations/allocations-page.module.ts b/apps/client/src/app/pages/portfolio/allocations/allocations-page.module.ts index 44ac94a6f..b0a027cb5 100644 --- a/apps/client/src/app/pages/portfolio/allocations/allocations-page.module.ts +++ b/apps/client/src/app/pages/portfolio/allocations/allocations-page.module.ts @@ -1,13 +1,13 @@ +import { GfWorldMapChartModule } from '@ghostfolio/client/components/world-map-chart/world-map-chart.module'; +import { GfPortfolioProportionChartModule } from '@ghostfolio/ui/portfolio-proportion-chart/portfolio-proportion-chart.module'; +import { GfPremiumIndicatorModule } from '@ghostfolio/ui/premium-indicator'; +import { GfValueModule } from '@ghostfolio/ui/value'; + import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { MatCardModule } from '@angular/material/card'; import { MatDialogModule } from '@angular/material/dialog'; import { MatProgressBarModule } from '@angular/material/progress-bar'; -import { GfWorldMapChartModule } from '@ghostfolio/client/components/world-map-chart/world-map-chart.module'; -import { GfActivitiesFilterModule } from '@ghostfolio/ui/activities-filter/activities-filter.module'; -import { GfPortfolioProportionChartModule } from '@ghostfolio/ui/portfolio-proportion-chart/portfolio-proportion-chart.module'; -import { GfPremiumIndicatorModule } from '@ghostfolio/ui/premium-indicator'; -import { GfValueModule } from '@ghostfolio/ui/value'; import { AllocationsPageRoutingModule } from './allocations-page-routing.module'; import { AllocationsPageComponent } from './allocations-page.component'; @@ -17,7 +17,6 @@ import { AllocationsPageComponent } from './allocations-page.component'; imports: [ AllocationsPageRoutingModule, CommonModule, - GfActivitiesFilterModule, GfPortfolioProportionChartModule, GfPremiumIndicatorModule, GfWorldMapChartModule, diff --git a/apps/client/src/app/pages/portfolio/analysis/analysis-page-routing.module.ts b/apps/client/src/app/pages/portfolio/analysis/analysis-page-routing.module.ts index b9b8fd712..fce4bf221 100644 --- a/apps/client/src/app/pages/portfolio/analysis/analysis-page-routing.module.ts +++ b/apps/client/src/app/pages/portfolio/analysis/analysis-page-routing.module.ts @@ -1,6 +1,7 @@ +import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; + import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; import { AnalysisPageComponent } from './analysis-page.component'; diff --git a/apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts b/apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts index f0fb33665..96c7c01dc 100644 --- a/apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts +++ b/apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts @@ -1,6 +1,3 @@ -import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; -import { MatDialog } from '@angular/material/dialog'; -import { ActivatedRoute, Router } from '@angular/router'; import { PositionDetailDialogParams } from '@ghostfolio/client/components/position/position-detail-dialog/interfaces/interfaces'; import { PositionDetailDialog } from '@ghostfolio/client/components/position/position-detail-dialog/position-detail-dialog.component'; import { ToggleComponent } from '@ghostfolio/client/components/toggle/toggle.component'; @@ -8,7 +5,6 @@ import { DataService } from '@ghostfolio/client/services/data.service'; import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { - Filter, HistoricalDataItem, PortfolioInvestments, PortfolioPerformance, @@ -17,14 +13,18 @@ import { } from '@ghostfolio/common/interfaces'; import { InvestmentItem } from '@ghostfolio/common/interfaces/investment-item.interface'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; -import { DateRange, GroupBy, ToggleOption } from '@ghostfolio/common/types'; +import { GroupBy, ToggleOption } from '@ghostfolio/common/types'; import { translate } from '@ghostfolio/ui/i18n'; -import { AssetClass, DataSource, SymbolProfile } from '@prisma/client'; + +import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; +import { ActivatedRoute, Router } from '@angular/router'; +import { DataSource, SymbolProfile } from '@prisma/client'; import { differenceInDays } from 'date-fns'; import { isNumber, sortBy } from 'lodash'; import { DeviceDetectorService } from 'ngx-device-detector'; import { Subject } from 'rxjs'; -import { distinctUntilChanged, map, takeUntil } from 'rxjs/operators'; +import { takeUntil } from 'rxjs/operators'; @Component({ selector: 'gf-analysis-page', @@ -32,8 +32,6 @@ import { distinctUntilChanged, map, takeUntil } from 'rxjs/operators'; templateUrl: './analysis-page.html' }) export class AnalysisPageComponent implements OnDestroy, OnInit { - public activeFilters: Filter[] = []; - public allFilters: Filter[]; public benchmarkDataItems: HistoricalDataItem[] = []; public benchmarks: Partial[]; public bottom3: Position[]; @@ -42,14 +40,15 @@ export class AnalysisPageComponent implements OnDestroy, OnInit { public deviceType: string; public dividendsByGroup: InvestmentItem[]; public dividendTimelineDataLabel = $localize`Dividend`; - public filters$ = new Subject(); public firstOrderDate: Date; public hasImpersonationId: boolean; public investments: InvestmentItem[]; public investmentTimelineDataLabel = $localize`Investment`; public investmentsByGroup: InvestmentItem[]; public isLoadingBenchmarkComparator: boolean; + public isLoadingDividendTimelineChart: boolean; public isLoadingInvestmentChart: boolean; + public isLoadingInvestmentTimelineChart: boolean; public mode: GroupBy = 'month'; public modeOptions: ToggleOption[] = [ { label: $localize`Monthly`, value: 'month' }, @@ -58,7 +57,6 @@ export class AnalysisPageComponent implements OnDestroy, OnInit { public performance: PortfolioPerformance; public performanceDataItems: HistoricalDataItem[]; public performanceDataItemsInPercentage: HistoricalDataItem[]; - public placeholder = ''; public portfolioEvolutionDataLabel = $localize`Investment`; public streaks: PortfolioInvestments['streaks']; public top3: Position[]; @@ -118,61 +116,12 @@ export class AnalysisPageComponent implements OnDestroy, OnInit { this.hasImpersonationId = !!impersonationId; }); - this.filters$ - .pipe( - distinctUntilChanged(), - map((filters) => { - this.activeFilters = filters; - this.placeholder = - this.activeFilters.length <= 0 - ? $localize`Filter by account or tag...` - : ''; - - this.update(); - }), - takeUntil(this.unsubscribeSubject) - ) - .subscribe(() => {}); - this.userService.stateChanged .pipe(takeUntil(this.unsubscribeSubject)) .subscribe((state) => { if (state?.user) { this.user = state.user; - const accountFilters: Filter[] = this.user.accounts.map( - ({ id, name }) => { - return { - id, - label: name, - type: 'ACCOUNT' - }; - } - ); - - const assetClassFilters: Filter[] = []; - for (const assetClass of Object.keys(AssetClass)) { - assetClassFilters.push({ - id: assetClass, - label: translate(assetClass), - type: 'ASSET_CLASS' - }); - } - - const tagFilters: Filter[] = this.user.tags.map(({ id, name }) => { - return { - id, - label: translate(name), - type: 'TAG' - }; - }); - - this.allFilters = [ - ...accountFilters, - ...assetClassFilters, - ...tagFilters - ]; - this.update(); } }); @@ -196,24 +145,6 @@ export class AnalysisPageComponent implements OnDestroy, OnInit { }); } - public onChangeDateRange(dateRange: DateRange) { - this.dataService - .putUserSetting({ dateRange }) - .pipe(takeUntil(this.unsubscribeSubject)) - .subscribe(() => { - this.userService.remove(); - - this.userService - .get() - .pipe(takeUntil(this.unsubscribeSubject)) - .subscribe((user) => { - this.user = user; - - this.changeDetectorRef.markForCheck(); - }); - }); - } - public onChangeGroupBy(aMode: GroupBy) { this.mode = aMode; this.fetchDividendsAndInvestments(); @@ -225,12 +156,12 @@ export class AnalysisPageComponent implements OnDestroy, OnInit { } private fetchDividendsAndInvestments() { + this.isLoadingDividendTimelineChart = true; + this.isLoadingInvestmentTimelineChart = true; + this.dataService .fetchDividends({ - filters: - this.activeFilters.length > 0 - ? this.activeFilters - : this.userService.getFilters(), + filters: this.userService.getFilters(), groupBy: this.mode, range: this.user?.settings?.dateRange }) @@ -238,15 +169,14 @@ export class AnalysisPageComponent implements OnDestroy, OnInit { .subscribe(({ dividends }) => { this.dividendsByGroup = dividends; + this.isLoadingDividendTimelineChart = false; + this.changeDetectorRef.markForCheck(); }); this.dataService .fetchInvestments({ - filters: - this.activeFilters.length > 0 - ? this.activeFilters - : this.userService.getFilters(), + filters: this.userService.getFilters(), groupBy: this.mode, range: this.user?.settings?.dateRange }) @@ -271,6 +201,8 @@ export class AnalysisPageComponent implements OnDestroy, OnInit { ? translate('MONTH') : translate('MONTHS'); + this.isLoadingInvestmentTimelineChart = false; + this.changeDetectorRef.markForCheck(); }); } @@ -321,10 +253,7 @@ export class AnalysisPageComponent implements OnDestroy, OnInit { this.dataService .fetchPortfolioPerformance({ - filters: - this.activeFilters.length > 0 - ? this.activeFilters - : this.userService.getFilters(), + filters: this.userService.getFilters(), range: this.user?.settings?.dateRange }) .pipe(takeUntil(this.unsubscribeSubject)) @@ -341,23 +270,28 @@ export class AnalysisPageComponent implements OnDestroy, OnInit { index, { date, - netPerformanceInPercentage, - totalInvestment, - value, - valueInPercentage + netPerformanceInPercentageWithCurrencyEffect, + totalInvestmentValueWithCurrencyEffect, + valueInPercentage, + valueWithCurrencyEffect } ] of chart.entries()) { if (index > 0 || this.user?.settings?.dateRange === 'max') { // Ignore first item where value is 0 - this.investments.push({ date, investment: totalInvestment }); + this.investments.push({ + date, + investment: totalInvestmentValueWithCurrencyEffect + }); this.performanceDataItems.push({ date, - value: isNumber(value) ? value : valueInPercentage + value: isNumber(valueWithCurrencyEffect) + ? valueWithCurrencyEffect + : valueInPercentage }); } this.performanceDataItemsInPercentage.push({ date, - value: netPerformanceInPercentage + value: netPerformanceInPercentageWithCurrencyEffect }); } @@ -370,19 +304,16 @@ export class AnalysisPageComponent implements OnDestroy, OnInit { this.dataService .fetchPositions({ - filters: - this.activeFilters.length > 0 - ? this.activeFilters - : this.userService.getFilters(), + filters: this.userService.getFilters(), range: this.user?.settings?.dateRange }) .pipe(takeUntil(this.unsubscribeSubject)) .subscribe(({ positions }) => { const positionsSorted = sortBy( - positions.filter(({ netPerformancePercentage }) => { - return isNumber(netPerformancePercentage); + positions.filter(({ netPerformancePercentageWithCurrencyEffect }) => { + return isNumber(netPerformancePercentageWithCurrencyEffect); }), - 'netPerformancePercentage' + 'netPerformancePercentageWithCurrencyEffect' ).reverse(); this.top3 = positionsSorted.slice(0, 3); diff --git a/apps/client/src/app/pages/portfolio/analysis/analysis-page.html b/apps/client/src/app/pages/portfolio/analysis/analysis-page.html index 7ce6a8d25..692adeb7a 100644 --- a/apps/client/src/app/pages/portfolio/analysis/analysis-page.html +++ b/apps/client/src/app/pages/portfolio/analysis/analysis-page.html @@ -1,21 +1,5 @@

Analysis

- @if (!user?.settings?.isExperimentalFeatures) { -
- -
- - }
- @if (user?.settings?.isExperimentalFeatures) {
-
- Absolute Asset Performance +
+ Absolute Asset Performance +
@@ -65,13 +58,23 @@ [colorizeSign]="true" [isPercent]="true" [locale]="user?.settings?.locale" - [value]="isLoadingInvestmentChart ? undefined : performance?.currentNetPerformancePercent" + [value]=" + isLoadingInvestmentChart + ? undefined + : performance?.currentNetPerformancePercent + " />
-
- Absolute Currency Performance +
+ Absolute Currency Performance +
@@ -95,7 +105,14 @@ [colorizeSign]="true" [isPercent]="true" [locale]="user?.settings?.locale" - [value]="isLoadingInvestmentChart ? undefined : performance?.currentNetPerformancePercentWithCurrencyEffect - performance?.currentNetPerformancePercent" + [value]=" + isLoadingInvestmentChart + ? undefined + : performance?.currentNetPerformancePercent === null + ? null + : performance?.currentNetPerformancePercentWithCurrencyEffect - + performance?.currentNetPerformancePercent + " />
@@ -111,7 +128,11 @@ [isCurrency]="true" [locale]="user?.settings?.locale" [unit]="user?.settings?.baseCurrency" - [value]="isLoadingInvestmentChart ? undefined : performance?.currentNetPerformanceWithCurrencyEffect" + [value]=" + isLoadingInvestmentChart + ? undefined + : performance?.currentNetPerformanceWithCurrencyEffect + " />
@@ -126,7 +147,11 @@ [colorizeSign]="true" [isPercent]="true" [locale]="user?.settings?.locale" - [value]="isLoadingInvestmentChart ? undefined : performance?.currentNetPerformancePercentWithCurrencyEffect" + [value]=" + isLoadingInvestmentChart + ? undefined + : performance?.currentNetPerformancePercentWithCurrencyEffect + " />
@@ -134,7 +159,6 @@ - }
@@ -150,15 +174,13 @@ -
- {{ position.name }} -
+
{{ position.name }}
@@ -198,15 +222,13 @@ -
- {{ position.name }} -
+
{{ position.name }}
@@ -314,6 +338,7 @@ [daysInMarket]="daysInMarket" [groupBy]="mode" [isInPercent]="hasImpersonationId || user.settings.isRestrictedView" + [isLoading]="isLoadingInvestmentTimelineChart" [locale]="user?.settings?.locale" [range]="user?.settings?.dateRange" [savingsRate]="savingsRate" @@ -351,6 +376,7 @@ [daysInMarket]="daysInMarket" [groupBy]="mode" [isInPercent]="hasImpersonationId || user.settings.isRestrictedView" + [isLoading]="isLoadingDividendTimelineChart" [locale]="user?.settings?.locale" [range]="user?.settings?.dateRange" /> diff --git a/apps/client/src/app/pages/portfolio/analysis/analysis-page.module.ts b/apps/client/src/app/pages/portfolio/analysis/analysis-page.module.ts index a9dc26b4e..52e45c330 100644 --- a/apps/client/src/app/pages/portfolio/analysis/analysis-page.module.ts +++ b/apps/client/src/app/pages/portfolio/analysis/analysis-page.module.ts @@ -1,12 +1,13 @@ -import { CommonModule } from '@angular/common'; -import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; -import { MatCardModule } from '@angular/material/card'; import { GfBenchmarkComparatorModule } from '@ghostfolio/client/components/benchmark-comparator/benchmark-comparator.module'; import { GfInvestmentChartModule } from '@ghostfolio/client/components/investment-chart/investment-chart.module'; import { GfToggleModule } from '@ghostfolio/client/components/toggle/toggle.module'; import { GfActivitiesFilterModule } from '@ghostfolio/ui/activities-filter/activities-filter.module'; import { GfPremiumIndicatorModule } from '@ghostfolio/ui/premium-indicator'; import { GfValueModule } from '@ghostfolio/ui/value'; + +import { CommonModule } from '@angular/common'; +import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; +import { MatCardModule } from '@angular/material/card'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { AnalysisPageRoutingModule } from './analysis-page-routing.module'; diff --git a/apps/client/src/app/pages/portfolio/fire/fire-page-routing.module.ts b/apps/client/src/app/pages/portfolio/fire/fire-page-routing.module.ts index 7ca0c8d20..885dc5509 100644 --- a/apps/client/src/app/pages/portfolio/fire/fire-page-routing.module.ts +++ b/apps/client/src/app/pages/portfolio/fire/fire-page-routing.module.ts @@ -1,6 +1,7 @@ +import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; + import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; import { FirePageComponent } from './fire-page.component'; diff --git a/apps/client/src/app/pages/portfolio/fire/fire-page.component.ts b/apps/client/src/app/pages/portfolio/fire/fire-page.component.ts index 909ca774a..36bc385f6 100644 --- a/apps/client/src/app/pages/portfolio/fire/fire-page.component.ts +++ b/apps/client/src/app/pages/portfolio/fire/fire-page.component.ts @@ -1,9 +1,10 @@ -import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { DataService } from '@ghostfolio/client/services/data.service'; import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { PortfolioReportRule, User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; + +import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import Big from 'big.js'; import { DeviceDetectorService } from 'ngx-device-detector'; import { Subject } from 'rxjs'; @@ -47,11 +48,9 @@ export class FirePageComponent implements OnDestroy, OnInit { .fetchPortfolioDetails() .pipe(takeUntil(this.unsubscribeSubject)) .subscribe(({ summary }) => { - if (summary.cash === null || summary.currentValue === null) { - return; - } - - this.fireWealth = new Big(summary.fireWealth); + this.fireWealth = summary.fireWealth + ? new Big(summary.fireWealth) + : new Big(10000); this.withdrawalRatePerYear = this.fireWealth.mul(4).div(100); this.withdrawalRatePerMonth = this.withdrawalRatePerYear.div(12); @@ -93,10 +92,13 @@ export class FirePageComponent implements OnDestroy, OnInit { permissions.createOrder ); - this.hasPermissionToUpdateUserSettings = hasPermission( - this.user.permissions, - permissions.updateUserSettings - ); + this.hasPermissionToUpdateUserSettings = + this.user.subscription?.type === 'Basic' + ? false + : hasPermission( + this.user.permissions, + permissions.updateUserSettings + ); this.changeDetectorRef.markForCheck(); } diff --git a/apps/client/src/app/pages/portfolio/fire/fire-page.html b/apps/client/src/app/pages/portfolio/fire/fire-page.html index aa3c33a74..099f2e98c 100644 --- a/apps/client/src/app/pages/portfolio/fire/fire-page.html +++ b/apps/client/src/app/pages/portfolio/fire/fire-page.html @@ -16,8 +16,15 @@ [currency]="user?.settings?.baseCurrency" [deviceType]="deviceType" [fireWealth]="fireWealth?.toNumber()" - [hasPermissionToUpdateUserSettings]="!hasImpersonationId && hasPermissionToUpdateUserSettings" + [hasPermissionToUpdateUserSettings]=" + !hasImpersonationId && hasPermissionToUpdateUserSettings + " [locale]="user?.settings?.locale" + [ngStyle]="{ + opacity: user?.subscription?.type === 'Basic' ? '0.67' : 'initial', + 'pointer-events': + user?.subscription?.type === 'Basic' ? 'none' : 'initial' + }" [projectedTotalAmount]="user?.settings?.projectedTotalAmount" [retirementDate]="user?.settings?.retirementDate" [savingsRate]="user?.settings?.savingsRate" @@ -54,7 +61,11 @@ }" />
-
+
If you retire today, you would be able to withdraw (); public hasImpersonationId: boolean; public hasPermissionToCreateOrder: boolean; public holdings: PortfolioPosition[]; - public isLoading = false; - public placeholder = ''; - public portfolioDetails: PortfolioDetails; + public holdingType: HoldingType = 'ACTIVE'; + public holdingTypeOptions: ToggleOption[] = [ + { label: $localize`Active`, value: 'ACTIVE' }, + { label: $localize`Closed`, value: 'CLOSED' } + ]; public user: User; private unsubscribeSubject = new Subject(); @@ -75,31 +70,6 @@ export class HoldingsPageComponent implements OnDestroy, OnInit { this.hasImpersonationId = !!impersonationId; }); - this.filters$ - .pipe( - distinctUntilChanged(), - switchMap((filters) => { - this.isLoading = true; - this.activeFilters = filters; - this.placeholder = - this.activeFilters.length <= 0 - ? $localize`Filter by account or tag...` - : ''; - - return this.fetchPortfolioDetails(); - }), - takeUntil(this.unsubscribeSubject) - ) - .subscribe((portfolioDetails) => { - this.portfolioDetails = portfolioDetails; - - this.initialize(); - - this.isLoading = false; - - this.changeDetectorRef.markForCheck(); - }); - this.userService.stateChanged .pipe(takeUntil(this.unsubscribeSubject)) .subscribe((state) => { @@ -111,55 +81,32 @@ export class HoldingsPageComponent implements OnDestroy, OnInit { permissions.createOrder ); - const accountFilters: Filter[] = this.user.accounts.map( - ({ id, name }) => { - return { - id, - label: name, - type: 'ACCOUNT' - }; - } - ); + this.holdings = undefined; - const assetClassFilters: Filter[] = []; - for (const assetClass of Object.keys(AssetClass)) { - assetClassFilters.push({ - id: assetClass, - label: translate(assetClass), - type: 'ASSET_CLASS' - }); - } - - const tagFilters: Filter[] = this.user.tags.map(({ id, name }) => { - return { - id, - label: translate(name), - type: 'TAG' - }; - }); + this.fetchHoldings() + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe(({ holdings }) => { + this.holdings = holdings; - this.allFilters = [ - ...accountFilters, - ...assetClassFilters, - ...tagFilters - ]; + this.changeDetectorRef.markForCheck(); + }); - if (this.user?.settings?.isExperimentalFeatures === true) { - this.holdings = undefined; + this.changeDetectorRef.markForCheck(); + } + }); + } - this.fetchPortfolioDetails() - .pipe(takeUntil(this.unsubscribeSubject)) - .subscribe((portfolioDetails) => { - this.portfolioDetails = portfolioDetails; + public onChangeHoldingType(aHoldingType: HoldingType) { + this.holdingType = aHoldingType; - this.initialize(); + this.holdings = undefined; - this.changeDetectorRef.markForCheck(); - }); - } + this.fetchHoldings() + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe(({ holdings }) => { + this.holdings = holdings; - this.changeDetectorRef.markForCheck(); - } + this.changeDetectorRef.markForCheck(); }); } @@ -168,23 +115,16 @@ export class HoldingsPageComponent implements OnDestroy, OnInit { this.unsubscribeSubject.complete(); } - private fetchPortfolioDetails() { - return this.dataService.fetchPortfolioDetails({ - filters: - this.activeFilters.length > 0 - ? this.activeFilters - : this.userService.getFilters() - }); - } + private fetchHoldings() { + const filters = this.userService.getFilters(); - private initialize() { - this.holdings = []; - - for (const [symbol, holding] of Object.entries( - this.portfolioDetails.holdings - )) { - this.holdings.push(holding); + if (this.holdingType === 'CLOSED') { + filters.push({ id: 'CLOSED', type: 'HOLDING_TYPE' }); } + + return this.dataService.fetchPortfolioHoldings({ + filters + }); } private openPositionDialog({ diff --git a/apps/client/src/app/pages/portfolio/holdings/holdings-page.html b/apps/client/src/app/pages/portfolio/holdings/holdings-page.html index c6251c184..a2bd43636 100644 --- a/apps/client/src/app/pages/portfolio/holdings/holdings-page.html +++ b/apps/client/src/app/pages/portfolio/holdings/holdings-page.html @@ -2,18 +2,19 @@

Holdings

- @if (!user?.settings?.isExperimentalFeatures) { - - }
+
+ +
- + @if (hasPermissionToCreateOrder && holdings?.length > 0) { + + }
diff --git a/apps/client/src/app/pages/portfolio/holdings/holdings-page.module.ts b/apps/client/src/app/pages/portfolio/holdings/holdings-page.module.ts index e2a3265d5..eae26d2b3 100644 --- a/apps/client/src/app/pages/portfolio/holdings/holdings-page.module.ts +++ b/apps/client/src/app/pages/portfolio/holdings/holdings-page.module.ts @@ -1,8 +1,9 @@ +import { GfToggleModule } from '@ghostfolio/client/components/toggle/toggle.module'; +import { GfHoldingsTableModule } from '@ghostfolio/ui/holdings-table/holdings-table.module'; + import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; -import { GfActivitiesFilterModule } from '@ghostfolio/ui/activities-filter/activities-filter.module'; -import { GfHoldingsTableModule } from '@ghostfolio/ui/holdings-table/holdings-table.module'; import { HoldingsPageRoutingModule } from './holdings-page-routing.module'; import { HoldingsPageComponent } from './holdings-page.component'; @@ -11,8 +12,8 @@ import { HoldingsPageComponent } from './holdings-page.component'; declarations: [HoldingsPageComponent], imports: [ CommonModule, - GfActivitiesFilterModule, GfHoldingsTableModule, + GfToggleModule, HoldingsPageRoutingModule, MatButtonModule ], diff --git a/apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts b/apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts index 6ca831e9c..d4f93b567 100644 --- a/apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts +++ b/apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts @@ -1,6 +1,7 @@ +import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; + import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; import { PortfolioPageComponent } from './portfolio-page.component'; diff --git a/apps/client/src/app/pages/portfolio/portfolio-page.component.ts b/apps/client/src/app/pages/portfolio/portfolio-page.component.ts index 8666ca1e4..bbd70c1c9 100644 --- a/apps/client/src/app/pages/portfolio/portfolio-page.component.ts +++ b/apps/client/src/app/pages/portfolio/portfolio-page.component.ts @@ -1,6 +1,7 @@ -import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { TabConfiguration, User } from '@ghostfolio/common/interfaces'; + +import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { DeviceDetectorService } from 'ngx-device-detector'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; diff --git a/apps/client/src/app/pages/portfolio/portfolio-page.html b/apps/client/src/app/pages/portfolio/portfolio-page.html index 839e8114f..360cbd463 100644 --- a/apps/client/src/app/pages/portfolio/portfolio-page.html +++ b/apps/client/src/app/pages/portfolio/portfolio-page.html @@ -21,7 +21,7 @@ >
{{ tab.label }}
diff --git a/apps/client/src/app/pages/pricing/pricing-page-routing.module.ts b/apps/client/src/app/pages/pricing/pricing-page-routing.module.ts index 0e4af3df3..5ba675184 100644 --- a/apps/client/src/app/pages/pricing/pricing-page-routing.module.ts +++ b/apps/client/src/app/pages/pricing/pricing-page-routing.module.ts @@ -1,6 +1,7 @@ +import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; + import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; import { PricingPageComponent } from './pricing-page.component'; diff --git a/apps/client/src/app/pages/pricing/pricing-page.component.ts b/apps/client/src/app/pages/pricing/pricing-page.component.ts index f7776f871..280f7bf74 100644 --- a/apps/client/src/app/pages/pricing/pricing-page.component.ts +++ b/apps/client/src/app/pages/pricing/pricing-page.component.ts @@ -1,9 +1,10 @@ -import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { translate } from '@ghostfolio/ui/i18n'; + +import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { StripeService } from 'ngx-stripe'; import { Subject } from 'rxjs'; import { catchError, switchMap, takeUntil } from 'rxjs/operators'; diff --git a/apps/client/src/app/pages/pricing/pricing-page.html b/apps/client/src/app/pages/pricing/pricing-page.html index 9cad9f93a..e4537ebb1 100644 --- a/apps/client/src/app/pages/pricing/pricing-page.html +++ b/apps/client/src/app/pages/pricing/pricing-page.html @@ -107,7 +107,7 @@
@@ -164,7 +164,7 @@
@@ -243,19 +243,22 @@ {{ baseCurrency }} {{ price }} {{ baseCurrency }} {{ price - coupon }} + > {{ baseCurrency }} {{ + price - coupon + }} {{ baseCurrency }} {{ price }}{{ baseCurrency }} {{ + price + }} per year

- + - +@if (isLoading) { + +} -
- -
+@if (dataSource.data.length > pageSize && !isLoading) { +
+ +
+} -
- -
+@if ( + dataSource.data.length === 0 && hasPermissionToCreateActivity && !isLoading +) { +
+ +
+} diff --git a/libs/ui/src/lib/holdings-table/holdings-table.component.ts b/libs/ui/src/lib/holdings-table/holdings-table.component.ts index 18105861f..38403d519 100644 --- a/libs/ui/src/lib/holdings-table/holdings-table.component.ts +++ b/libs/ui/src/lib/holdings-table/holdings-table.component.ts @@ -1,3 +1,6 @@ +import { getLocale } from '@ghostfolio/common/helper'; +import { PortfolioPosition, UniqueAsset } from '@ghostfolio/common/interfaces'; + import { ChangeDetectionStrategy, Component, @@ -11,7 +14,6 @@ import { MatPaginator } from '@angular/material/paginator'; import { MatSort } from '@angular/material/sort'; import { MatTableDataSource } from '@angular/material/table'; import { Router } from '@angular/router'; -import { PortfolioPosition, UniqueAsset } from '@ghostfolio/common/interfaces'; import { AssetClass } from '@prisma/client'; import { Subject, Subscription } from 'rxjs'; @@ -25,9 +27,10 @@ export class HoldingsTableComponent implements OnChanges, OnDestroy, OnInit { @Input() baseCurrency: string; @Input() deviceType: string; @Input() hasPermissionToCreateActivity: boolean; + @Input() hasPermissionToOpenDetails = true; @Input() hasPermissionToShowValues = true; @Input() holdings: PortfolioPosition[]; - @Input() locale: string; + @Input() locale = getLocale(); @Input() pageSize = Number.MAX_SAFE_INTEGER; @ViewChild(MatPaginator) paginator: MatPaginator; @@ -67,10 +70,12 @@ export class HoldingsTableComponent implements OnChanges, OnDestroy, OnInit { } } - public onOpenPositionDialog({ dataSource, symbol }: UniqueAsset): void { - this.router.navigate([], { - queryParams: { dataSource, symbol, positionDetailDialog: true } - }); + public onOpenPositionDialog({ dataSource, symbol }: UniqueAsset) { + if (this.hasPermissionToOpenDetails) { + this.router.navigate([], { + queryParams: { dataSource, symbol, positionDetailDialog: true } + }); + } } public onShowAllPositions() { diff --git a/libs/ui/src/lib/holdings-table/holdings-table.module.ts b/libs/ui/src/lib/holdings-table/holdings-table.module.ts index 507c45594..916489573 100644 --- a/libs/ui/src/lib/holdings-table/holdings-table.module.ts +++ b/libs/ui/src/lib/holdings-table/holdings-table.module.ts @@ -1,3 +1,9 @@ +import { GfPositionDetailDialogModule } from '@ghostfolio/client/components/position/position-detail-dialog/position-detail-dialog.module'; +import { GfSymbolIconModule } from '@ghostfolio/client/components/symbol-icon/symbol-icon.module'; +import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module'; +import { GfNoTransactionsInfoModule } from '@ghostfolio/ui/no-transactions-info'; +import { GfValueModule } from '@ghostfolio/ui/value'; + import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; @@ -6,11 +12,6 @@ import { MatPaginatorModule } from '@angular/material/paginator'; import { MatSortModule } from '@angular/material/sort'; import { MatTableModule } from '@angular/material/table'; import { RouterModule } from '@angular/router'; -import { GfPositionDetailDialogModule } from '@ghostfolio/client/components/position/position-detail-dialog/position-detail-dialog.module'; -import { GfSymbolIconModule } from '@ghostfolio/client/components/symbol-icon/symbol-icon.module'; -import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module'; -import { GfNoTransactionsInfoModule } from '@ghostfolio/ui/no-transactions-info'; -import { GfValueModule } from '@ghostfolio/ui/value'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { HoldingsTableComponent } from './holdings-table.component'; diff --git a/libs/ui/src/lib/i18n.ts b/libs/ui/src/lib/i18n.ts index 53c2d3a77..9687f461c 100644 --- a/libs/ui/src/lib/i18n.ts +++ b/libs/ui/src/lib/i18n.ts @@ -35,14 +35,14 @@ const locales = { LIABILITY: $localize`Liability`, SELL: $localize`Sell`, - // enum AssetClass + // AssetClass (enum) CASH: $localize`Cash`, COMMODITY: $localize`Commodity`, EQUITY: $localize`Equity`, FIXED_INCOME: $localize`Fixed Income`, REAL_ESTATE: $localize`Real Estate`, - // enum AssetSubClass + // AssetSubClass (enum) BOND: $localize`Bond`, CRYPTOCURRENCY: $localize`Cryptocurrency`, ETF: $localize`ETF`, @@ -51,6 +51,10 @@ const locales = { PRIVATE_EQUITY: $localize`Private Equity`, STOCK: $localize`Stock`, + // Benchmark + ALL_TIME_HIGH: 'All time high', + BEAR_MARKET: 'Bear market', + // Continents Africa: $localize`Africa`, Asia: $localize`Asia`, diff --git a/libs/ui/src/lib/line-chart/line-chart.component.html b/libs/ui/src/lib/line-chart/line-chart.component.html index e60f964b7..e9a5bbbe0 100644 --- a/libs/ui/src/lib/line-chart/line-chart.component.html +++ b/libs/ui/src/lib/line-chart/line-chart.component.html @@ -1,11 +1,12 @@ - +@if (isLoading && showLoader) { + +} - {{ label ?? 'Ghostfolio' }} + @if (showLabel) { + {{ label ?? 'Ghostfolio' }} + } + diff --git a/libs/ui/src/lib/membership-card/membership-card.component.html b/libs/ui/src/lib/membership-card/membership-card.component.html index d069274ca..02a4a03f7 100644 --- a/libs/ui/src/lib/membership-card/membership-card.component.html +++ b/libs/ui/src/lib/membership-card/membership-card.component.html @@ -18,12 +18,14 @@
Membership
{{ name }}
-
-
Valid until
-
- {{ expiresAt }} + @if (expiresAt) { +
+
Valid until
+
+ {{ expiresAt }} +
-
+ }
diff --git a/libs/ui/src/lib/membership-card/membership-card.module.ts b/libs/ui/src/lib/membership-card/membership-card.module.ts index 4f51cc756..564308e29 100644 --- a/libs/ui/src/lib/membership-card/membership-card.module.ts +++ b/libs/ui/src/lib/membership-card/membership-card.module.ts @@ -1,7 +1,8 @@ +import { GfLogoModule } from '@ghostfolio/ui/logo'; + import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { RouterModule } from '@angular/router'; -import { GfLogoModule } from '@ghostfolio/ui/logo'; import { MembershipCardComponent } from './membership-card.component'; diff --git a/libs/ui/src/lib/no-transactions-info/no-transactions-info.component.stories.ts b/libs/ui/src/lib/no-transactions-info/no-transactions-info.component.stories.ts index 4e26d0083..13a3404ee 100644 --- a/libs/ui/src/lib/no-transactions-info/no-transactions-info.component.stories.ts +++ b/libs/ui/src/lib/no-transactions-info/no-transactions-info.component.stories.ts @@ -1,5 +1,6 @@ -import { RouterTestingModule } from '@angular/router/testing'; import { GfLogoModule } from '@ghostfolio/ui/logo'; + +import { RouterTestingModule } from '@angular/router/testing'; import { Meta, Story, moduleMetadata } from '@storybook/angular'; import { NoTransactionsInfoComponent } from './no-transactions-info.component'; diff --git a/libs/ui/src/lib/no-transactions-info/no-transactions-info.module.ts b/libs/ui/src/lib/no-transactions-info/no-transactions-info.module.ts index 85869e043..03363abc8 100644 --- a/libs/ui/src/lib/no-transactions-info/no-transactions-info.module.ts +++ b/libs/ui/src/lib/no-transactions-info/no-transactions-info.module.ts @@ -1,8 +1,9 @@ +import { GfLogoModule } from '@ghostfolio/ui/logo'; + import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; import { RouterModule } from '@angular/router'; -import { GfLogoModule } from '@ghostfolio/ui/logo'; import { NoTransactionsInfoComponent } from './no-transactions-info.component'; diff --git a/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.html b/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.html index 67e4798f7..c7de5ef4d 100644 --- a/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.html +++ b/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.html @@ -1,11 +1,12 @@ - +@if (isLoading) { + +} return this.focused || !this.empty; } - public ngDoCheck(): void { + public ngDoCheck() { if (this.ngControl) { this.errorState = this.ngControl.invalid && this.ngControl.touched; this.stateChanges.next(); } } - public ngOnDestroy(): void { + public ngOnDestroy() { this.stateChanges.complete(); this._focusMonitor.stopMonitoring(this._elementRef.nativeElement); } - public registerOnChange(fn: (_: T) => void): void { + public registerOnChange(fn: (_: T) => void) { this.onChange = fn; } - public registerOnTouched(fn: () => void): void { + public registerOnTouched(fn: () => void) { this.onTouched = fn; } - public setDescribedByIds(ids: string[]): void { + public setDescribedByIds(ids: string[]) { this.describedBy = ids.join(' '); } - public writeValue(value: T): void { + public writeValue(value: T) { this.value = value; } @@ -173,7 +173,7 @@ export abstract class AbstractMatFormField this.stateChanges.next(); } - public onContainerClick(): void { + public onContainerClick() { if (!this.focused) { this.focus(); } diff --git a/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html index b59f007e7..2a2f98d7d 100644 --- a/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html +++ b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html @@ -11,30 +11,30 @@ [displayWith]="displayFn" (optionSelected)="onUpdateSymbol($event)" > - - - {{ lookupItem.name }} - @if (lookupItem.dataProviderInfo.isPremium) { - - } - - {{ lookupItem.symbol | gfSymbol }} · {{ lookupItem.currency - }} - · {{ lookupItem.assetSubClassString }} - - + {{ lookupItem.name }} + @if (lookupItem.dataProviderInfo.isPremium) { + + } + + {{ lookupItem.symbol | gfSymbol }} · {{ lookupItem.currency }} + @if (lookupItem.assetSubClass) { + · {{ lookupItem.assetSubClassString }} + } + + + } + } - + +@if (isLoading) { + +} diff --git a/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts index 17cdb853d..d25a15a28 100644 --- a/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts +++ b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts @@ -1,3 +1,8 @@ +import { LookupItem } from '@ghostfolio/api/app/symbol/interfaces/lookup-item.interface'; +import { DataService } from '@ghostfolio/client/services/data.service'; +import { translate } from '@ghostfolio/ui/i18n'; +import { AbstractMatFormField } from '@ghostfolio/ui/shared/abstract-mat-form-field'; + import { FocusMonitor } from '@angular/cdk/a11y'; import { ChangeDetectionStrategy, @@ -16,10 +21,6 @@ import { } from '@angular/material/autocomplete'; import { MatFormFieldControl } from '@angular/material/form-field'; import { MatInput } from '@angular/material/input'; -import { LookupItem } from '@ghostfolio/api/app/symbol/interfaces/lookup-item.interface'; -import { DataService } from '@ghostfolio/client/services/data.service'; -import { translate } from '@ghostfolio/ui/i18n'; -import { AbstractMatFormField } from '@ghostfolio/ui/shared/abstract-mat-form-field'; import { isString } from 'lodash'; import { Subject, tap } from 'rxjs'; import { diff --git a/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.module.ts b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.module.ts index 259403043..cdb6cc97a 100644 --- a/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.module.ts +++ b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.module.ts @@ -1,3 +1,7 @@ +import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module'; +import { GfPremiumIndicatorModule } from '@ghostfolio/ui/premium-indicator'; +import { SymbolAutocompleteComponent } from '@ghostfolio/ui/symbol-autocomplete/symbol-autocomplete.component'; + import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; @@ -5,9 +9,6 @@ import { MatAutocompleteModule } from '@angular/material/autocomplete'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatInputModule } from '@angular/material/input'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module'; -import { SymbolAutocompleteComponent } from '@ghostfolio/ui/symbol-autocomplete/symbol-autocomplete.component'; -import { GfPremiumIndicatorModule } from '@ghostfolio/ui/premium-indicator'; @NgModule({ declarations: [SymbolAutocompleteComponent], diff --git a/libs/ui/src/lib/trend-indicator/trend-indicator.component.ts b/libs/ui/src/lib/trend-indicator/trend-indicator.component.ts index e9152f8a0..fafe6e0f3 100644 --- a/libs/ui/src/lib/trend-indicator/trend-indicator.component.ts +++ b/libs/ui/src/lib/trend-indicator/trend-indicator.component.ts @@ -1,6 +1,7 @@ -import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; import { DateRange, MarketState } from '@ghostfolio/common/types'; +import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; + @Component({ selector: 'gf-trend-indicator', changeDetection: ChangeDetectionStrategy.OnPush, diff --git a/libs/ui/src/lib/value/value.component.html b/libs/ui/src/lib/value/value.component.html index 07c4616df..4bdaf06a5 100644 --- a/libs/ui/src/lib/value/value.component.html +++ b/libs/ui/src/lib/value/value.component.html @@ -21,7 +21,11 @@ h4: size === 'medium' }" > - {{ formattedValue }}% + @if (value === null) { + *****% + } @else { + {{ formattedValue }}% + }
- + @if (value === null) { ***** - - + } @else { {{ formattedValue }} - + }
{{ unit }} diff --git a/libs/ui/src/lib/value/value.component.ts b/libs/ui/src/lib/value/value.component.ts index d35c2d1b0..13675403f 100644 --- a/libs/ui/src/lib/value/value.component.ts +++ b/libs/ui/src/lib/value/value.component.ts @@ -1,10 +1,11 @@ +import { getLocale } from '@ghostfolio/common/helper'; + import { ChangeDetectionStrategy, Component, Input, OnChanges } from '@angular/core'; -import { getLocale } from '@ghostfolio/common/helper'; import { isNumber } from 'lodash'; @Component({ @@ -20,7 +21,7 @@ export class ValueComponent implements OnChanges { @Input() isCurrency = false; @Input() isDate = false; @Input() isPercent = false; - @Input() locale: string | undefined; + @Input() locale = getLocale(); @Input() position = ''; @Input() precision: number | undefined; @Input() size: 'large' | 'medium' | 'small' = 'small'; @@ -128,11 +129,6 @@ export class ValueComponent implements OnChanges { this.formattedValue = ''; this.isNumber = false; this.isString = false; - - if (!this.locale) { - this.locale = getLocale(); - } - this.useAbsoluteValue = false; } } diff --git a/package.json b/package.json index 4a455a54a..47e913e5b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "2.48.0", + "version": "2.64.0", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio", @@ -14,8 +14,7 @@ "affected:lint": "nx affected:lint", "affected:test": "nx affected:test", "angular": "node --max_old_space_size=32768 ./node_modules/@angular/cli/bin/ng", - "build:dev": "nx run api:build && nx run client:build && nx run client:copy-assets && yarn replace-placeholders-in-build", - "build:production": "nx run api:build:production && nx run client:build:production && nx run client:copy-assets && yarn replace-placeholders-in-build", + "build:production": "nx run api:copy-assets && nx run api:build:production && nx run client:copy-assets && nx run client:build:production && yarn replace-placeholders-in-build", "build:storybook": "nx run ui:build-storybook", "database:format-schema": "prisma format", "database:generate-typings": "prisma generate", @@ -25,7 +24,7 @@ "database:push": "prisma db push", "database:seed": "prisma db seed", "database:setup": "yarn database:push && yarn database:seed", - "database:validate": "prisma validate", + "database:validate-schema": "prisma validate", "dep-graph": "nx dep-graph", "e2e": "ng e2e", "extract-locales": "nx run client:extract-i18n --output-path ./apps/client/src/locales", @@ -33,7 +32,6 @@ "format:check": "nx format:check", "format:write": "nx format:write", "help": "nx help", - "import-sort": "import-sort --write '{apps,libs}/**/*.ts'", "lint": "nx lint", "ng": "nx", "nx": "nx", @@ -42,7 +40,7 @@ "start": "node dist/apps/api/main", "start:client": "nx run client:copy-assets && nx run client:serve --configuration=development-en --hmr -o", "start:production": "yarn database:migrate && yarn database:seed && node main", - "start:server": "nx run api:serve --watch", + "start:server": "nx run api:copy-assets && nx run api:serve --watch", "start:storybook": "nx run ui:storybook", "test": "yarn test:api && yarn test:common", "test:api": "npx dotenv-cli -e .env.example -- nx test api", @@ -50,22 +48,22 @@ "test:single": "nx run api:test --test-file portfolio-calculator-novn-buy-and-sell.spec.ts", "ts-node": "ts-node", "update": "nx migrate latest", - "watch:server": "nx run api:build --watch", + "watch:server": "nx run api:copy-assets && nx run api:build --watch", "watch:test": "nx test --watch", "workspace-generator": "nx workspace-generator" }, "dependencies": { - "@angular/animations": "17.0.7", - "@angular/cdk": "17.0.4", - "@angular/common": "17.0.7", - "@angular/compiler": "17.0.7", - "@angular/core": "17.0.7", - "@angular/forms": "17.0.7", - "@angular/material": "17.0.4", - "@angular/platform-browser": "17.0.7", - "@angular/platform-browser-dynamic": "17.0.7", - "@angular/router": "17.0.7", - "@angular/service-worker": "17.0.7", + "@angular/animations": "17.1.3", + "@angular/cdk": "17.1.2", + "@angular/common": "17.1.3", + "@angular/compiler": "17.1.3", + "@angular/core": "17.1.3", + "@angular/forms": "17.1.3", + "@angular/material": "17.1.2", + "@angular/platform-browser": "17.1.3", + "@angular/platform-browser-dynamic": "17.1.3", + "@angular/router": "17.1.3", + "@angular/service-worker": "17.1.3", "@codewithdan/observable-store": "2.2.15", "@dfinity/agent": "0.15.7", "@dfinity/auth-client": "0.15.7", @@ -84,9 +82,9 @@ "@nestjs/platform-express": "10.1.3", "@nestjs/schedule": "3.0.2", "@nestjs/serve-static": "4.0.0", - "@prisma/client": "5.8.1", - "@simplewebauthn/browser": "8.3.1", - "@simplewebauthn/server": "8.3.2", + "@prisma/client": "5.11.0", + "@simplewebauthn/browser": "9.0.1", + "@simplewebauthn/server": "9.0.3", "@stripe/stripe-js": "1.47.0", "alphavantage": "2.2.0", "big.js": "6.2.1", @@ -104,7 +102,7 @@ "class-validator": "0.14.0", "color": "4.2.3", "countries-and-timezones": "3.4.1", - "countries-list": "2.6.1", + "countries-list": "3.1.0", "countup.js": "2.3.2", "date-fns": "2.29.3", "envalid": "7.3.1", @@ -117,7 +115,7 @@ "lodash": "4.17.21", "marked": "9.1.6", "ms": "3.0.0-canary.1", - "ng-extract-i18n-merge": "2.9.1", + "ng-extract-i18n-merge": "2.10.0", "ngx-device-detector": "5.0.1", "ngx-markdown": "17.1.1", "ngx-skeleton-loader": "7.0.0", @@ -126,45 +124,46 @@ "passport": "0.6.0", "passport-google-oauth20": "2.0.0", "passport-jwt": "4.0.0", - "prisma": "5.8.1", + "prisma": "5.11.0", "reflect-metadata": "0.1.13", "rxjs": "7.5.6", "stripe": "11.12.0", "svgmap": "2.6.0", "twitter-api-v2": "1.14.2", "uuid": "9.0.1", - "yahoo-finance2": "2.9.0", - "zone.js": "0.14.2" + "yahoo-finance2": "2.10.0", + "zone.js": "0.14.3" }, "devDependencies": { - "@angular-devkit/build-angular": "17.0.7", - "@angular-devkit/core": "17.0.7", - "@angular-devkit/schematics": "17.0.7", - "@angular-eslint/eslint-plugin": "17.1.1", - "@angular-eslint/eslint-plugin-template": "17.1.1", - "@angular-eslint/template-parser": "17.1.1", - "@angular/cli": "17.0.7", - "@angular/compiler-cli": "17.0.7", - "@angular/language-service": "17.0.7", - "@angular/localize": "17.0.7", - "@angular/pwa": "17.0.7", + "@angular-devkit/build-angular": "17.1.3", + "@angular-devkit/core": "17.1.3", + "@angular-devkit/schematics": "17.1.3", + "@angular-eslint/eslint-plugin": "17.2.1", + "@angular-eslint/eslint-plugin-template": "17.2.1", + "@angular-eslint/template-parser": "17.2.1", + "@angular/cli": "17.1.3", + "@angular/compiler-cli": "17.1.3", + "@angular/language-service": "17.1.3", + "@angular/localize": "17.1.3", + "@angular/pwa": "17.1.3", "@nestjs/schematics": "10.0.1", "@nestjs/testing": "10.1.3", - "@nx/angular": "17.2.8", - "@nx/cypress": "17.2.8", - "@nx/eslint-plugin": "17.2.8", - "@nx/jest": "17.2.8", - "@nx/js": "17.2.8", - "@nx/nest": "17.2.8", - "@nx/node": "17.2.8", - "@nx/storybook": "17.2.8", - "@nx/web": "17.2.8", - "@nx/workspace": "17.2.8", - "@schematics/angular": "17.0.0", - "@simplewebauthn/typescript-types": "8.0.0", + "@nx/angular": "18.0.4", + "@nx/cypress": "18.0.4", + "@nx/eslint-plugin": "18.0.4", + "@nx/jest": "18.0.4", + "@nx/js": "18.0.4", + "@nx/nest": "18.0.4", + "@nx/node": "18.0.4", + "@nx/storybook": "18.0.4", + "@nx/web": "18.0.4", + "@nx/workspace": "18.0.4", + "@schematics/angular": "17.1.3", + "@simplewebauthn/types": "9.0.1", "@storybook/addon-essentials": "7.6.5", "@storybook/angular": "7.6.5", "@storybook/core-server": "7.6.5", + "@trivago/prettier-plugin-sort-imports": "4.3.0", "@types/big.js": "6.1.6", "@types/body-parser": "1.19.2", "@types/cache-manager": "3.4.2", @@ -175,22 +174,19 @@ "@types/node": "18.16.9", "@types/papaparse": "5.3.7", "@types/passport-google-oauth20": "2.0.11", - "@typescript-eslint/eslint-plugin": "5.51.0", - "@typescript-eslint/parser": "5.51.0", + "@typescript-eslint/eslint-plugin": "6.21.0", + "@typescript-eslint/parser": "6.21.0", "codelyzer": "6.0.1", "cypress": "6.2.1", - "eslint": "8.33.0", + "eslint": "8.56.0", "eslint-config-prettier": "9.1.0", - "eslint-plugin-cypress": "2.14.0", - "eslint-plugin-import": "2.27.5", - "eslint-plugin-storybook": "0.6.12", - "import-sort-cli": "6.0.0", - "import-sort-parser-typescript": "6.0.0", - "import-sort-style-module": "6.0.0", + "eslint-plugin-cypress": "2.15.1", + "eslint-plugin-import": "2.29.1", + "eslint-plugin-storybook": "0.6.15", "jest": "29.4.3", "jest-environment-jsdom": "29.4.3", "jest-preset-angular": "13.1.4", - "nx": "17.2.8", + "nx": "18.0.4", "prettier": "3.2.5", "prettier-plugin-organize-attributes": "1.0.0", "react": "18.2.0", @@ -201,17 +197,11 @@ "ts-jest": "29.1.0", "ts-node": "10.9.1", "tslib": "2.6.0", - "typescript": "5.2.2" + "typescript": "5.3.3" }, "engines": { "node": ">=18" }, - "importSort": { - ".ts": { - "parser": "typescript", - "style": "module" - } - }, "prisma": { "seed": "node prisma/seed.js" }, diff --git a/prisma/migrations/20240218173439_added_inactive_to_role/migration.sql b/prisma/migrations/20240218173439_added_inactive_to_role/migration.sql new file mode 100644 index 000000000..0070382b6 --- /dev/null +++ b/prisma/migrations/20240218173439_added_inactive_to_role/migration.sql @@ -0,0 +1,2 @@ +-- AlterEnum +ALTER TYPE "Role" ADD VALUE 'INACTIVE'; diff --git a/prisma/migrations/20240219182116_added_missing_indexes/migration.sql b/prisma/migrations/20240219182116_added_missing_indexes/migration.sql new file mode 100644 index 000000000..a18639489 --- /dev/null +++ b/prisma/migrations/20240219182116_added_missing_indexes/migration.sql @@ -0,0 +1,11 @@ +-- CreateIndex +CREATE INDEX "Account_id_idx" ON "Account"("id"); + +-- CreateIndex +CREATE INDEX "MarketData_dataSource_idx" ON "MarketData"("dataSource"); + +-- CreateIndex +CREATE INDEX "MarketData_date_idx" ON "MarketData"("date"); + +-- CreateIndex +CREATE INDEX "Order_accountId_idx" ON "Order"("accountId"); diff --git a/prisma/migrations/20240221201438_added_missing_indexes/migration.sql b/prisma/migrations/20240221201438_added_missing_indexes/migration.sql new file mode 100644 index 000000000..7de6885bd --- /dev/null +++ b/prisma/migrations/20240221201438_added_missing_indexes/migration.sql @@ -0,0 +1,86 @@ +-- CreateIndex +CREATE INDEX "Access_alias_idx" ON "Access"("alias"); + +-- CreateIndex +CREATE INDEX "Access_granteeUserId_idx" ON "Access"("granteeUserId"); + +-- CreateIndex +CREATE INDEX "Access_userId_idx" ON "Access"("userId"); + +-- CreateIndex +CREATE INDEX "Account_currency_idx" ON "Account"("currency"); + +-- CreateIndex +CREATE INDEX "Account_name_idx" ON "Account"("name"); + +-- CreateIndex +CREATE INDEX "Account_userId_idx" ON "Account"("userId"); + +-- CreateIndex +CREATE INDEX "AccountBalance_accountId_idx" ON "AccountBalance"("accountId"); + +-- CreateIndex +CREATE INDEX "AccountBalance_date_idx" ON "AccountBalance"("date"); + +-- CreateIndex +CREATE INDEX "Analytics_updatedAt_idx" ON "Analytics"("updatedAt"); + +-- CreateIndex +CREATE INDEX "AuthDevice_userId_idx" ON "AuthDevice"("userId"); + +-- CreateIndex +CREATE INDEX "MarketData_marketPrice_idx" ON "MarketData"("marketPrice"); + +-- CreateIndex +CREATE INDEX "MarketData_state_idx" ON "MarketData"("state"); + +-- CreateIndex +CREATE INDEX "Order_date_idx" ON "Order"("date"); + +-- CreateIndex +CREATE INDEX "Order_isDraft_idx" ON "Order"("isDraft"); + +-- CreateIndex +CREATE INDEX "Order_userId_idx" ON "Order"("userId"); + +-- CreateIndex +CREATE INDEX "Platform_name_idx" ON "Platform"("name"); + +-- CreateIndex +CREATE INDEX "Subscription_userId_idx" ON "Subscription"("userId"); + +-- CreateIndex +CREATE INDEX "SymbolProfile_assetClass_idx" ON "SymbolProfile"("assetClass"); + +-- CreateIndex +CREATE INDEX "SymbolProfile_currency_idx" ON "SymbolProfile"("currency"); + +-- CreateIndex +CREATE INDEX "SymbolProfile_dataSource_idx" ON "SymbolProfile"("dataSource"); + +-- CreateIndex +CREATE INDEX "SymbolProfile_isin_idx" ON "SymbolProfile"("isin"); + +-- CreateIndex +CREATE INDEX "SymbolProfile_name_idx" ON "SymbolProfile"("name"); + +-- CreateIndex +CREATE INDEX "SymbolProfile_symbol_idx" ON "SymbolProfile"("symbol"); + +-- CreateIndex +CREATE INDEX "Tag_name_idx" ON "Tag"("name"); + +-- CreateIndex +CREATE INDEX "User_accessToken_idx" ON "User"("accessToken"); + +-- CreateIndex +CREATE INDEX "User_createdAt_idx" ON "User"("createdAt"); + +-- CreateIndex +CREATE INDEX "User_provider_idx" ON "User"("provider"); + +-- CreateIndex +CREATE INDEX "User_role_idx" ON "User"("role"); + +-- CreateIndex +CREATE INDEX "User_thirdPartyId_idx" ON "User"("thirdPartyId"); diff --git a/prisma/migrations/20240224102024_removed_is_default_from_account/migration.sql b/prisma/migrations/20240224102024_removed_is_default_from_account/migration.sql new file mode 100644 index 000000000..7147a94c3 --- /dev/null +++ b/prisma/migrations/20240224102024_removed_is_default_from_account/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Account" DROP COLUMN "isDefault"; diff --git a/prisma/migrations/20240229191929_added_index_for_is_excluded_to_account/migration.sql b/prisma/migrations/20240229191929_added_index_for_is_excluded_to_account/migration.sql new file mode 100644 index 000000000..70408fff3 --- /dev/null +++ b/prisma/migrations/20240229191929_added_index_for_is_excluded_to_account/migration.sql @@ -0,0 +1,2 @@ +-- CreateIndex +CREATE INDEX "Account_isExcluded_idx" ON "Account"("isExcluded"); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index a5a57d8c0..df0f15e9e 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -19,6 +19,10 @@ model Access { userId String GranteeUser User? @relation("accessGet", fields: [granteeUserId], references: [id]) User User @relation("accessGive", fields: [userId], references: [id]) + + @@index([alias]) + @@index([granteeUserId]) + @@index([userId]) } model Account { @@ -28,7 +32,6 @@ model Account { createdAt DateTime @default(now()) currency String? id String @default(uuid()) - isDefault Boolean @default(false) isExcluded Boolean @default(false) name String? platformId String? @@ -39,6 +42,11 @@ model Account { Order Order[] @@id([id, userId]) + @@index([currency]) + @@index([id]) + @@index([isExcluded]) + @@index([name]) + @@index([userId]) } model AccountBalance { @@ -50,6 +58,9 @@ model AccountBalance { userId String value Float Account Account @relation(fields: [accountId, userId], onDelete: Cascade, references: [id, userId]) + + @@index([accountId]) + @@index([date]) } model Analytics { @@ -58,6 +69,8 @@ model Analytics { updatedAt DateTime @updatedAt userId String @id User User @relation(fields: [userId], references: [id]) + + @@index([updatedAt]) } model AuthDevice { @@ -69,6 +82,8 @@ model AuthDevice { updatedAt DateTime @updatedAt userId String User User @relation(fields: [userId], references: [id]) + + @@index([userId]) } model MarketData { @@ -81,6 +96,10 @@ model MarketData { symbol String @@unique([dataSource, date, symbol]) + @@index([dataSource]) + @@index([date]) + @@index([marketPrice]) + @@index([state]) @@index([symbol]) } @@ -103,6 +122,11 @@ model Order { SymbolProfile SymbolProfile @relation(fields: [symbolProfileId], references: [id]) User User @relation(fields: [userId], references: [id]) tags Tag[] + + @@index([accountId]) + @@index([date]) + @@index([isDraft]) + @@index([userId]) } model Platform { @@ -110,6 +134,8 @@ model Platform { name String? url String @unique Account Account[] + + @@index([name]) } model Property { @@ -148,6 +174,12 @@ model SymbolProfile { SymbolProfileOverrides SymbolProfileOverrides? @@unique([dataSource, symbol]) + @@index([assetClass]) + @@index([currency]) + @@index([dataSource]) + @@index([isin]) + @@index([name]) + @@index([symbol]) } model SymbolProfileOverrides { @@ -170,12 +202,16 @@ model Subscription { updatedAt DateTime @updatedAt userId String User User @relation(fields: [userId], references: [id]) + + @@index([userId]) } model Tag { id String @id @default(uuid()) name String @unique orders Order[] + + @@index([name]) } model User { @@ -195,6 +231,12 @@ model User { Order Order[] Settings Settings? Subscription Subscription[] + + @@index([accessToken]) + @@index([createdAt]) + @@index([provider]) + @@index([role]) + @@index([thirdPartyId]) } enum AccessPermission { @@ -246,6 +288,7 @@ enum Provider { enum Role { ADMIN DEMO + INACTIVE USER } diff --git a/yarn.lock b/yarn.lock index 46efe4265..fedf2a587 100644 --- a/yarn.lock +++ b/yarn.lock @@ -20,12 +20,12 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@angular-devkit/architect@0.1700.7": - version "0.1700.7" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1700.7.tgz#6137deee169704de6c675023cddb3f4e1d6ae2e9" - integrity sha512-32uitQKsYLGXAKoXBsmOnPsTt9pS+b9cnFI9ZvBFVhJ31I2EOM7vGcMFalhTxdB/DkVHk4TyO78efV0V26DwCA== +"@angular-devkit/architect@0.1701.3": + version "0.1701.3" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1701.3.tgz#974cc8680baa5b8440cfc8039bbc4c46008e80bf" + integrity sha512-K5rvhslbXNwx04cCLviEJCA27MwoJRMMzALFXySi9BqjZnZUOtZnOBuuCdrTPaRmFaYqGO4Im5GNzpbb/NB8zg== dependencies: - "@angular-devkit/core" "17.0.7" + "@angular-devkit/core" "17.1.3" rxjs "7.8.1" "@angular-devkit/architect@^0.1301.0 || ^0.1401.0 || ^0.1501.0 || ^0.1601.0 || ^0.1700.0": @@ -36,42 +36,40 @@ "@angular-devkit/core" "17.0.0" rxjs "7.8.1" -"@angular-devkit/build-angular@17.0.7": - version "17.0.7" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-17.0.7.tgz#0edbda90050efe7e0c9d9500144af05eebfc347b" - integrity sha512-AtEzLk6n6BXqQzk0Bsupe6GV0IgUe7RbpBfqROi+NZqMA7OUAHCX3xA6M68Qu+5KxBtW7T5lHeZZ7iP/y39wtQ== +"@angular-devkit/build-angular@17.1.3": + version "17.1.3" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-17.1.3.tgz#05634e6a81ade1eb4e12844e37cbf636bf949bc4" + integrity sha512-pusFVSWMnrm2GrF3+Fw19OhA2rNw4WkfTMUruhaKAjW5QIvZ3wHYf+pH//1Ud+tuhFBi9BH7UALP2vnJMu1ehw== dependencies: "@ampproject/remapping" "2.2.1" - "@angular-devkit/architect" "0.1700.7" - "@angular-devkit/build-webpack" "0.1700.7" - "@angular-devkit/core" "17.0.7" - "@babel/core" "7.23.2" - "@babel/generator" "7.23.0" + "@angular-devkit/architect" "0.1701.3" + "@angular-devkit/build-webpack" "0.1701.3" + "@angular-devkit/core" "17.1.3" + "@babel/core" "7.23.7" + "@babel/generator" "7.23.6" "@babel/helper-annotate-as-pure" "7.22.5" "@babel/helper-split-export-declaration" "7.22.6" - "@babel/plugin-transform-async-generator-functions" "7.23.2" - "@babel/plugin-transform-async-to-generator" "7.22.5" - "@babel/plugin-transform-runtime" "7.23.2" - "@babel/preset-env" "7.23.2" - "@babel/runtime" "7.23.2" + "@babel/plugin-transform-async-generator-functions" "7.23.7" + "@babel/plugin-transform-async-to-generator" "7.23.3" + "@babel/plugin-transform-runtime" "7.23.7" + "@babel/preset-env" "7.23.7" + "@babel/runtime" "7.23.7" "@discoveryjs/json-ext" "0.5.7" - "@ngtools/webpack" "17.0.7" - "@vitejs/plugin-basic-ssl" "1.0.1" + "@ngtools/webpack" "17.1.3" + "@vitejs/plugin-basic-ssl" "1.0.2" ansi-colors "4.1.3" autoprefixer "10.4.16" babel-loader "9.1.3" babel-plugin-istanbul "6.1.1" - browser-sync "2.29.3" browserslist "^4.21.5" - chokidar "3.5.3" copy-webpack-plugin "11.0.0" critters "0.0.20" css-loader "6.8.1" - esbuild-wasm "0.19.5" - fast-glob "3.3.1" + esbuild-wasm "0.19.11" + fast-glob "3.3.2" http-proxy-middleware "2.0.6" https-proxy-agent "7.0.2" - inquirer "9.2.11" + inquirer "9.2.12" jsonc-parser "3.2.0" karma-source-map-support "1.4.0" less "4.2.0" @@ -80,41 +78,42 @@ loader-utils "3.2.1" magic-string "0.30.5" mini-css-extract-plugin "2.7.6" - mrmime "1.0.1" + mrmime "2.0.0" open "8.4.2" ora "5.4.1" parse5-html-rewriting-stream "7.0.0" picomatch "3.0.1" - piscina "4.1.0" - postcss "8.4.31" - postcss-loader "7.3.3" + piscina "4.2.1" + postcss "8.4.33" + postcss-loader "7.3.4" resolve-url-loader "5.0.0" rxjs "7.8.1" - sass "1.69.5" - sass-loader "13.3.2" + sass "1.69.7" + sass-loader "13.3.3" semver "7.5.4" - source-map-loader "4.0.1" + source-map-loader "5.0.0" source-map-support "0.5.21" - terser "5.24.0" + terser "5.26.0" text-table "0.2.0" tree-kill "1.2.2" tslib "2.6.2" - undici "5.27.2" - vite "4.5.1" + undici "6.2.1" + vite "5.0.12" + watchpack "2.4.0" webpack "5.89.0" webpack-dev-middleware "6.1.1" webpack-dev-server "4.15.1" webpack-merge "5.10.0" webpack-subresource-integrity "5.1.0" optionalDependencies: - esbuild "0.19.5" + esbuild "0.19.11" -"@angular-devkit/build-webpack@0.1700.7": - version "0.1700.7" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.1700.7.tgz#896520220b5b09f8e9a9c617ee0d9caabb489766" - integrity sha512-B9Mg/qYDpE5my8PJ3VPQyRSUV0Oq1bFUzU8s0ZpqEZl1URKc04pm0LtLmebrMIcUZgDiGk0RHaD+O1E9IV/bdQ== +"@angular-devkit/build-webpack@0.1701.3": + version "0.1701.3" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.1701.3.tgz#584275d98be9e76d5db3d870ff37c57175d04a45" + integrity sha512-fpZtJf6yvXM7mX1T83caeYpa0e3zPv7sgKmx0ZIJKGL8+DETgNcCCeCTgui7HMBcHGCD8yj72DZ8xMMBWwVBIA== dependencies: - "@angular-devkit/architect" "0.1700.7" + "@angular-devkit/architect" "0.1701.3" rxjs "7.8.1" "@angular-devkit/core@16.0.1": @@ -151,10 +150,10 @@ rxjs "7.8.1" source-map "0.7.4" -"@angular-devkit/core@17.0.7": - version "17.0.7" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-17.0.7.tgz#a11b04b4d51103ce456c49739a34d129e34a9dc5" - integrity sha512-vATobHo5O5tJba424hJfQWLb40GzvZPNsI74dcgSUTgrDph8ksmk5xB9OvEvf0INorQZ2IMphj/VIWj4/+JqSA== +"@angular-devkit/core@17.1.3": + version "17.1.3" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-17.1.3.tgz#d3b2212f9fa753506b1ccab24ee34edcdcd02e63" + integrity sha512-iuVK4hyW3YhusxIi8zGBvvVA9pWtDT3H6LQbWdVk9D3jXCZBIrEMklvAiJErqficKnUurf6gtFOeA8Fop6GotA== dependencies: ajv "8.12.0" ajv-formats "2.1.1" @@ -196,109 +195,109 @@ ora "5.4.1" rxjs "7.8.1" -"@angular-devkit/schematics@17.0.7": - version "17.0.7" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-17.0.7.tgz#35f085d5b3da249c3d8513be5613d02219fedb2e" - integrity sha512-BY11OkJkM3xyXcvyD7x5kGY/c8Ufd4AfPvI0D9imhVxbns45Q48b1DlvCQvSnCJ/s+OwnkrYb/Efa70ZiaGu8A== +"@angular-devkit/schematics@17.1.3": + version "17.1.3" + resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-17.1.3.tgz#9fc4c82f64af9375249910d26093e449a73f0166" + integrity sha512-zKoWG1hDfvi1vR9Hqoca9hWo9vDg8evmQvGcBW5jXR5ndZi5Oit/uDcGdA8WUKvBd1EG7WMqp0FgcDR9EA9WCw== dependencies: - "@angular-devkit/core" "17.0.7" + "@angular-devkit/core" "17.1.3" jsonc-parser "3.2.0" magic-string "0.30.5" ora "5.4.1" rxjs "7.8.1" -"@angular-eslint/bundled-angular-compiler@17.1.1": - version "17.1.1" - resolved "https://registry.yarnpkg.com/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-17.1.1.tgz#fdd9c0b7497efc6ee918502dd008290625afb903" - integrity sha512-xRlSh9qjdUdUKAy/0UQsxX7wf1tHApAsHsfismebPriqfmVAPyEg4HBrM8ImWaZxiqaTGC1AyHsUBQD5FK8o6w== +"@angular-eslint/bundled-angular-compiler@17.2.1": + version "17.2.1" + resolved "https://registry.yarnpkg.com/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-17.2.1.tgz#d849b0845371b41856b9f598af81ce5bf799bca0" + integrity sha512-puC0itsZv2QlrDOCcWtq1KZH+DvfrpV+mV78HHhi6+h25R5iIhr8ARKcl3EQxFjvrFq34jhG8pSupxKvFbHVfA== -"@angular-eslint/eslint-plugin-template@17.1.1": - version "17.1.1" - resolved "https://registry.yarnpkg.com/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-17.1.1.tgz#18862e2c5361a8ba885e975e8fd6706e63420f09" - integrity sha512-unZ6QNwtxuB8Eni7UPdw7uK6iZipZUXIsH+ZuLMOxwFgGMqeRnpv8SW0212rto3d/Ec0jESzVHKcwZ9pT+jxgw== +"@angular-eslint/eslint-plugin-template@17.2.1": + version "17.2.1" + resolved "https://registry.yarnpkg.com/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-17.2.1.tgz#226a623219375a2344112c1c896fefef0dae4df6" + integrity sha512-hl1hcHtcm90wyVL1OQGTz16oA0KHon+FFb3Qg0fLXObaXxA495Ecefd9ub5Xxg4JEOPRDi29bF1Y3YKpwflgeg== dependencies: - "@angular-eslint/bundled-angular-compiler" "17.1.1" - "@angular-eslint/utils" "17.1.1" - "@typescript-eslint/type-utils" "6.13.1" - "@typescript-eslint/utils" "6.13.1" + "@angular-eslint/bundled-angular-compiler" "17.2.1" + "@angular-eslint/utils" "17.2.1" + "@typescript-eslint/type-utils" "6.19.0" + "@typescript-eslint/utils" "6.19.0" aria-query "5.3.0" axobject-query "4.0.0" -"@angular-eslint/eslint-plugin@17.1.1": - version "17.1.1" - resolved "https://registry.yarnpkg.com/@angular-eslint/eslint-plugin/-/eslint-plugin-17.1.1.tgz#d17cec6d7a4575d0c6bc6a306e4b7b57b64c23e4" - integrity sha512-fFOBlCOVObVu3gjLj+0BypqO1ZR/0bfJnDElqMdYwJG7zRaFT8NNQbrOo/q/GQoqOFoNna6mw3teTGsd5JnL2A== +"@angular-eslint/eslint-plugin@17.2.1": + version "17.2.1" + resolved "https://registry.yarnpkg.com/@angular-eslint/eslint-plugin/-/eslint-plugin-17.2.1.tgz#2be51ead1785950feb8351001e0683eae42f4c29" + integrity sha512-9yA81BHpsaCUKRBtHGN3ieAy8HpIoffzPQMu34lYqZFT4yGHGhYmhQjNSQGBRbV2LD9dVv2U35rMHNmUcozXpw== dependencies: - "@angular-eslint/utils" "17.1.1" - "@typescript-eslint/utils" "6.13.1" + "@angular-eslint/utils" "17.2.1" + "@typescript-eslint/utils" "6.19.0" -"@angular-eslint/template-parser@17.1.1": - version "17.1.1" - resolved "https://registry.yarnpkg.com/@angular-eslint/template-parser/-/template-parser-17.1.1.tgz#a3a52d18cae276c9d1d67a69a663dd0b404ffaf5" - integrity sha512-ofL46rNhRVeSxrSQF0vwhKMco+vJuo+ZGjSOzFmT9N3KAMB0j+WXTbpyGGMy0gQSBc4W6p+j+zxGa2CR2xb6wA== +"@angular-eslint/template-parser@17.2.1": + version "17.2.1" + resolved "https://registry.yarnpkg.com/@angular-eslint/template-parser/-/template-parser-17.2.1.tgz#005f997346eb17c6dbca5fffc41da51b7e755013" + integrity sha512-WPQYFvRju0tCDXQ/pwrzC911pE07JvpeDgcN2elhzV6lxDHJEZpA5O9pnW9qgNA6J6XM9Q7dBkJ22ztAzC4WFw== dependencies: - "@angular-eslint/bundled-angular-compiler" "17.1.1" - eslint-scope "^7.0.0" + "@angular-eslint/bundled-angular-compiler" "17.2.1" + eslint-scope "^8.0.0" -"@angular-eslint/utils@17.1.1": - version "17.1.1" - resolved "https://registry.yarnpkg.com/@angular-eslint/utils/-/utils-17.1.1.tgz#e24a01a797285c4bac468cfbc3fd862b480652b6" - integrity sha512-CTNPOb05S/DII/Fm8JYUvKo+B4u/ctHjGJ0X1YXUR0q31oaGqTE3KePGq76+Y6swRDf9NjUIcfcnZp3u3j4CBQ== +"@angular-eslint/utils@17.2.1": + version "17.2.1" + resolved "https://registry.yarnpkg.com/@angular-eslint/utils/-/utils-17.2.1.tgz#3d4217775d86479348fdd0e1ad83014c9d8339f2" + integrity sha512-qQYTBXy90dWM7fhhpa5i9lTtqqhJisvRa+naCrQx9kBgR458JScLdkVIdcZ9D/rPiDCmKiVUfgcDISnjUeqTqg== dependencies: - "@angular-eslint/bundled-angular-compiler" "17.1.1" - "@typescript-eslint/utils" "6.13.1" + "@angular-eslint/bundled-angular-compiler" "17.2.1" + "@typescript-eslint/utils" "6.19.0" -"@angular/animations@17.0.7": - version "17.0.7" - resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-17.0.7.tgz#0a9f212ea615014c0e646978fd8a5a52cb85a179" - integrity sha512-IjZjPGMxvi2a9o7fzjwNO44FvhTZlVSgcPtqM6Glq0+WVeQcnZxf1Onj68M/FGx2AunS8elRbrgPxTexVeSo7A== +"@angular/animations@17.1.3": + version "17.1.3" + resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-17.1.3.tgz#be67fc479cfc700d7c1270222003c6d2bc622194" + integrity sha512-AS9CHOjjKqkuAzlKEMJfAkZfkIdSoagB3D8HwvH+ZHo6GVJc9KbtLQn/okNijFK+Fg7QK/hYbQ3lJhjgk0GQDA== dependencies: tslib "^2.3.0" -"@angular/cdk@17.0.4": - version "17.0.4" - resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-17.0.4.tgz#02ea9ae9b85d29b6eb1ac4c63a3fc175767b4d59" - integrity sha512-mh/EuIR0NPfpNqAXBSZWuJeBMXUvUDYdKhiFWZet5NLO1bDgFe1MGLBjtW4us95k4BZsMLbCKNxJgc+4JqwUvg== +"@angular/cdk@17.1.2": + version "17.1.2" + resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-17.1.2.tgz#f79bbf57fbbd0cf59ed9a1611c2c5ffacea11628" + integrity sha512-eu9D60RQv213qi7oh6ae9Z+d6+AG/aqi0y70Ag9BjwqTiatDiYvSySxswxYYKdzPp0hx0ZUTGi16LqtT6pyj6Q== dependencies: tslib "^2.3.0" optionalDependencies: parse5 "^7.1.2" -"@angular/cli@17.0.7": - version "17.0.7" - resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-17.0.7.tgz#ecdcbf4cd3400d56871b64b644195a4a2a6cb580" - integrity sha512-oSa0GVAQNA7wFbLJYeaO3kV4iUcbKEqXDLxcIE8s1GfHddBOlXH2P1T4fXonCBl5qvV+joP0G0+fs7I0w2utZQ== +"@angular/cli@17.1.3": + version "17.1.3" + resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-17.1.3.tgz#45af3e5041f3df14ff10dc48ee64960f575d5aac" + integrity sha512-ysPWDdqo2cwfeskKVAg8p4C8xuezWcIWyW/ACSjWw6yp4OZvyVd6cGZrc0POVZzAPtTOYJSgWOpF/DCHQFluSg== dependencies: - "@angular-devkit/architect" "0.1700.7" - "@angular-devkit/core" "17.0.7" - "@angular-devkit/schematics" "17.0.7" - "@schematics/angular" "17.0.7" + "@angular-devkit/architect" "0.1701.3" + "@angular-devkit/core" "17.1.3" + "@angular-devkit/schematics" "17.1.3" + "@schematics/angular" "17.1.3" "@yarnpkg/lockfile" "1.1.0" ansi-colors "4.1.3" ini "4.1.1" - inquirer "9.2.11" + inquirer "9.2.12" jsonc-parser "3.2.0" npm-package-arg "11.0.1" npm-pick-manifest "9.0.0" open "8.4.2" ora "5.4.1" - pacote "17.0.4" + pacote "17.0.5" resolve "1.22.8" semver "7.5.4" symbol-observable "4.0.0" yargs "17.7.2" -"@angular/common@17.0.7": - version "17.0.7" - resolved "https://registry.yarnpkg.com/@angular/common/-/common-17.0.7.tgz#8222a94f3ffae119920c0857118d8fa01cc89740" - integrity sha512-bPPL6x0KOAOTxKSE2j4EWmEUOnqZYzOYiHzroa5b9UEyA9NvGkd9bm3zIxw8xcndRj1Ehcmvpi6KBLcYBBbWfg== +"@angular/common@17.1.3": + version "17.1.3" + resolved "https://registry.yarnpkg.com/@angular/common/-/common-17.1.3.tgz#d8411db80510a99a23ad01a56264c3594625936a" + integrity sha512-AzLzoNSeRSNGBQk0K+iG0XdYG36SDeJqYqE8rfoiWuv1NDFLL05UJM2/fQfaMNg0oX5bHOlHUqHFj3sFR/NVpw== dependencies: tslib "^2.3.0" -"@angular/compiler-cli@17.0.7": - version "17.0.7" - resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-17.0.7.tgz#7fa39624bbc2e5b2311087ecffdc83aed5d84f1b" - integrity sha512-YnL38idjIYtl3BXYpv+sVJKWGbUjHT6eyQSQVAfO/1AwWqVa21K9hnE+Q37VmUKEcKFMnQembeuErA+KVsGI6A== +"@angular/compiler-cli@17.1.3": + version "17.1.3" + resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-17.1.3.tgz#f1cbb68eb089c7aa161bab315cdc1a0004fac768" + integrity sha512-bNDHXo3Twub0BZK9OmXly+0REs0RuR1SUXlTAeq+0XubCvnBDvpg9peL7UTTGS5YRo9sUTBnR6faSUA1F5objQ== dependencies: "@babel/core" "7.23.2" "@jridgewell/sourcemap-codec" "^1.4.14" @@ -309,10 +308,10 @@ tslib "^2.3.0" yargs "^17.2.1" -"@angular/compiler@17.0.7": - version "17.0.7" - resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-17.0.7.tgz#cb695fccaa5dbb51f380f835d81dddb9039d8bcb" - integrity sha512-QHPuLti2c2tGZmOGZ0cfCHo4LxiHUkC27I0aZFDyQSSQqEI5obQGVlEREHysw0nsS3sYIcLvqcwcKcRtXlXtxQ== +"@angular/compiler@17.1.3": + version "17.1.3" + resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-17.1.3.tgz#157e834eb4b0cb4f339bc8a0da8dcb438e92034a" + integrity sha512-k/s21gPPKStxVOLr6l4Y145OIxyBY7BhTPVOl/qEAgE+IcZ9vkiA8dYl8yjL884Kl1ZKPmFA3AofMJjWjZGNag== dependencies: tslib "^2.3.0" @@ -321,10 +320,10 @@ resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-9.0.0.tgz#87e0bef4c369b6cadae07e3a4295778fc93799d5" integrity sha512-ctjwuntPfZZT2mNj2NDIVu51t9cvbhl/16epc5xEwyzyDt76pX9UgwvY+MbXrf/C/FWwdtmNtfP698BKI+9leQ== -"@angular/core@17.0.7": - version "17.0.7" - resolved "https://registry.yarnpkg.com/@angular/core/-/core-17.0.7.tgz#ab1a38824d60fd07e533c0f03386c4a5a84f3749" - integrity sha512-mEkelXkzEi6+A9GjdKOSGGzQAfo1iAjVTn6YsplNUeGE5JgDZYZ7sXGQqs0Lin7dzJxnPAgGjCOl7SpWLXIPSQ== +"@angular/core@17.1.3": + version "17.1.3" + resolved "https://registry.yarnpkg.com/@angular/core/-/core-17.1.3.tgz#12f4adb8d1037ba1572c7531997d82a82fbe8fc1" + integrity sha512-2lZ4DRHN8KJ/aQads+YXIcx5Ri9yyeFIlw69m5Pn7wAi/+Rakg7IsclgLaWs7aBtWwMHG7LnqFKxAVq7CjXKtA== dependencies: tslib "^2.3.0" @@ -333,115 +332,116 @@ resolved "https://registry.yarnpkg.com/@angular/core/-/core-9.0.0.tgz#227dc53e1ac81824f998c6e76000b7efc522641e" integrity sha512-6Pxgsrf0qF9iFFqmIcWmjJGkkCaCm6V5QNnxMy2KloO3SDq6QuMVRbN9RtC8Urmo25LP+eZ6ZgYqFYpdD8Hd9w== -"@angular/forms@17.0.7": - version "17.0.7" - resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-17.0.7.tgz#b8d1ffbe565567c529b0b9ac3e9f7cb51f24c655" - integrity sha512-28BxRxEmgZIofGwVp6s2v3ri/kuWW+/EY/ZXhavlWKJEh4ATJl72k0RkRWNcQi4wnvn0Qb8tFdnVJnvRZvvKEw== +"@angular/forms@17.1.3": + version "17.1.3" + resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-17.1.3.tgz#1e87b39e237a1d6f7cc2f78ad8d6b597b5ef08aa" + integrity sha512-aNa0jGLT5d+hnKVrSo8tk3TRo/NLNu1RxLNx8RhIczKAeCK3eD8SvTMy27iJtyXmNG2GWN7QPiDeGepd75nbxQ== dependencies: tslib "^2.3.0" -"@angular/language-service@17.0.7": - version "17.0.7" - resolved "https://registry.yarnpkg.com/@angular/language-service/-/language-service-17.0.7.tgz#2bc73f177bfe90b79d3011964633364b0670f21f" - integrity sha512-03EXeBZgyGNnEDLiABwEw0lpAcqLxSgl+bXQahOO4OnBSYQWGEiqfs3ymNbNj0chUfQVadG4FWghwGTGbj77Iw== +"@angular/language-service@17.1.3": + version "17.1.3" + resolved "https://registry.yarnpkg.com/@angular/language-service/-/language-service-17.1.3.tgz#40ec52fa58ee67624ebf8a2eaf20dab04c2a01fb" + integrity sha512-SO1xXfLwfTvPzxzJoan/sx5Agt1k3WlpEO9siPlZdNsD6zCkRziS0DotWIblGFtxCPUA4x205V3ihx+gaFi3DA== -"@angular/localize@17.0.7": - version "17.0.7" - resolved "https://registry.yarnpkg.com/@angular/localize/-/localize-17.0.7.tgz#46b6623734c7e46070125f5ff29bf34dc83cad36" - integrity sha512-avYYQ8zin2thzvsH2YP3WxlwkvOzjNEXxjv4yyZBx6wul68e/753kQK/0RmSUYaBpDTUEZYzrPpDay00TKwBOA== +"@angular/localize@17.1.3": + version "17.1.3" + resolved "https://registry.yarnpkg.com/@angular/localize/-/localize-17.1.3.tgz#626564dcd89a3f5d26cd31eb2fcdc848e01898ad" + integrity sha512-Jdz5FWcaQLRhEhUHJk0iyMOT1ts4HHcY9B20mBmAd7u3kqEoBc57N8hOX0vHjU4/rk1tGqIvzfhJJf6zqIWcZQ== dependencies: "@babel/core" "7.23.2" + "@types/babel__core" "7.20.2" fast-glob "3.3.1" yargs "^17.2.1" -"@angular/material@17.0.4": - version "17.0.4" - resolved "https://registry.yarnpkg.com/@angular/material/-/material-17.0.4.tgz#d3d7b093ae09662f18b04a27cfccfab8f4182895" - integrity sha512-IKkys4EavE1TMHApPMbFLvJU4pP8S8XNfY2eS7/kFwW7eyTcz0zV/IKeBbxkpej19MaouozU+KWeRJtxHg6x8g== - dependencies: - "@material/animation" "15.0.0-canary.a246a4439.0" - "@material/auto-init" "15.0.0-canary.a246a4439.0" - "@material/banner" "15.0.0-canary.a246a4439.0" - "@material/base" "15.0.0-canary.a246a4439.0" - "@material/button" "15.0.0-canary.a246a4439.0" - "@material/card" "15.0.0-canary.a246a4439.0" - "@material/checkbox" "15.0.0-canary.a246a4439.0" - "@material/chips" "15.0.0-canary.a246a4439.0" - "@material/circular-progress" "15.0.0-canary.a246a4439.0" - "@material/data-table" "15.0.0-canary.a246a4439.0" - "@material/density" "15.0.0-canary.a246a4439.0" - "@material/dialog" "15.0.0-canary.a246a4439.0" - "@material/dom" "15.0.0-canary.a246a4439.0" - "@material/drawer" "15.0.0-canary.a246a4439.0" - "@material/elevation" "15.0.0-canary.a246a4439.0" - "@material/fab" "15.0.0-canary.a246a4439.0" - "@material/feature-targeting" "15.0.0-canary.a246a4439.0" - "@material/floating-label" "15.0.0-canary.a246a4439.0" - "@material/form-field" "15.0.0-canary.a246a4439.0" - "@material/icon-button" "15.0.0-canary.a246a4439.0" - "@material/image-list" "15.0.0-canary.a246a4439.0" - "@material/layout-grid" "15.0.0-canary.a246a4439.0" - "@material/line-ripple" "15.0.0-canary.a246a4439.0" - "@material/linear-progress" "15.0.0-canary.a246a4439.0" - "@material/list" "15.0.0-canary.a246a4439.0" - "@material/menu" "15.0.0-canary.a246a4439.0" - "@material/menu-surface" "15.0.0-canary.a246a4439.0" - "@material/notched-outline" "15.0.0-canary.a246a4439.0" - "@material/radio" "15.0.0-canary.a246a4439.0" - "@material/ripple" "15.0.0-canary.a246a4439.0" - "@material/rtl" "15.0.0-canary.a246a4439.0" - "@material/segmented-button" "15.0.0-canary.a246a4439.0" - "@material/select" "15.0.0-canary.a246a4439.0" - "@material/shape" "15.0.0-canary.a246a4439.0" - "@material/slider" "15.0.0-canary.a246a4439.0" - "@material/snackbar" "15.0.0-canary.a246a4439.0" - "@material/switch" "15.0.0-canary.a246a4439.0" - "@material/tab" "15.0.0-canary.a246a4439.0" - "@material/tab-bar" "15.0.0-canary.a246a4439.0" - "@material/tab-indicator" "15.0.0-canary.a246a4439.0" - "@material/tab-scroller" "15.0.0-canary.a246a4439.0" - "@material/textfield" "15.0.0-canary.a246a4439.0" - "@material/theme" "15.0.0-canary.a246a4439.0" - "@material/tooltip" "15.0.0-canary.a246a4439.0" - "@material/top-app-bar" "15.0.0-canary.a246a4439.0" - "@material/touch-target" "15.0.0-canary.a246a4439.0" - "@material/typography" "15.0.0-canary.a246a4439.0" +"@angular/material@17.1.2": + version "17.1.2" + resolved "https://registry.yarnpkg.com/@angular/material/-/material-17.1.2.tgz#cc58d155c76e358e7a9bd07750789b001385deb6" + integrity sha512-50n7JDWtWGCxfrMKVKZ2wqkdozukA3IWeypQgXxzZc+4jqgT6Vj8/U4xNvcO9OgPLMOaTvktfT+wzUmCKJ0sng== + dependencies: + "@material/animation" "15.0.0-canary.7f224ddd4.0" + "@material/auto-init" "15.0.0-canary.7f224ddd4.0" + "@material/banner" "15.0.0-canary.7f224ddd4.0" + "@material/base" "15.0.0-canary.7f224ddd4.0" + "@material/button" "15.0.0-canary.7f224ddd4.0" + "@material/card" "15.0.0-canary.7f224ddd4.0" + "@material/checkbox" "15.0.0-canary.7f224ddd4.0" + "@material/chips" "15.0.0-canary.7f224ddd4.0" + "@material/circular-progress" "15.0.0-canary.7f224ddd4.0" + "@material/data-table" "15.0.0-canary.7f224ddd4.0" + "@material/density" "15.0.0-canary.7f224ddd4.0" + "@material/dialog" "15.0.0-canary.7f224ddd4.0" + "@material/dom" "15.0.0-canary.7f224ddd4.0" + "@material/drawer" "15.0.0-canary.7f224ddd4.0" + "@material/elevation" "15.0.0-canary.7f224ddd4.0" + "@material/fab" "15.0.0-canary.7f224ddd4.0" + "@material/feature-targeting" "15.0.0-canary.7f224ddd4.0" + "@material/floating-label" "15.0.0-canary.7f224ddd4.0" + "@material/form-field" "15.0.0-canary.7f224ddd4.0" + "@material/icon-button" "15.0.0-canary.7f224ddd4.0" + "@material/image-list" "15.0.0-canary.7f224ddd4.0" + "@material/layout-grid" "15.0.0-canary.7f224ddd4.0" + "@material/line-ripple" "15.0.0-canary.7f224ddd4.0" + "@material/linear-progress" "15.0.0-canary.7f224ddd4.0" + "@material/list" "15.0.0-canary.7f224ddd4.0" + "@material/menu" "15.0.0-canary.7f224ddd4.0" + "@material/menu-surface" "15.0.0-canary.7f224ddd4.0" + "@material/notched-outline" "15.0.0-canary.7f224ddd4.0" + "@material/radio" "15.0.0-canary.7f224ddd4.0" + "@material/ripple" "15.0.0-canary.7f224ddd4.0" + "@material/rtl" "15.0.0-canary.7f224ddd4.0" + "@material/segmented-button" "15.0.0-canary.7f224ddd4.0" + "@material/select" "15.0.0-canary.7f224ddd4.0" + "@material/shape" "15.0.0-canary.7f224ddd4.0" + "@material/slider" "15.0.0-canary.7f224ddd4.0" + "@material/snackbar" "15.0.0-canary.7f224ddd4.0" + "@material/switch" "15.0.0-canary.7f224ddd4.0" + "@material/tab" "15.0.0-canary.7f224ddd4.0" + "@material/tab-bar" "15.0.0-canary.7f224ddd4.0" + "@material/tab-indicator" "15.0.0-canary.7f224ddd4.0" + "@material/tab-scroller" "15.0.0-canary.7f224ddd4.0" + "@material/textfield" "15.0.0-canary.7f224ddd4.0" + "@material/theme" "15.0.0-canary.7f224ddd4.0" + "@material/tooltip" "15.0.0-canary.7f224ddd4.0" + "@material/top-app-bar" "15.0.0-canary.7f224ddd4.0" + "@material/touch-target" "15.0.0-canary.7f224ddd4.0" + "@material/typography" "15.0.0-canary.7f224ddd4.0" tslib "^2.3.0" -"@angular/platform-browser-dynamic@17.0.7": - version "17.0.7" - resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.0.7.tgz#a2404d4625f17078c6de595bbddb6011eda2f74a" - integrity sha512-OquwUX9fLWA2JUZW5Jm6atk0CPt0sA7Tg24eGLsr6g1XfTS7jRZprlGaa72NgPLnQVV6m84o/ZiNYS6yPmq1Gg== +"@angular/platform-browser-dynamic@17.1.3": + version "17.1.3" + resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.1.3.tgz#7391d547a22b85e95de8ee1f16faf6b876f26ae1" + integrity sha512-0lFhcFJfDzCSSVe8l8OY+UgUiwUwcbxwpvLod3XWBpf1iEUlr5720FIMA3VJYwpW3Oj4Uey3nVm13EMtRqpqdA== dependencies: tslib "^2.3.0" -"@angular/platform-browser@17.0.7": - version "17.0.7" - resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-17.0.7.tgz#9f7f048be9b584254d468cc4d1be772ff2b08288" - integrity sha512-bm9/wt51nc/MPjft/FlRNIgFSeLjDtfJOT7M32Rt6kOHhNKSK7ZTPWdMe9ahuHSbAhLzd0G/4NsT5sKrWSeVZg== +"@angular/platform-browser@17.1.3": + version "17.1.3" + resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-17.1.3.tgz#3883cf089f2e5bd24b99df1e7c2cdd3df3d97514" + integrity sha512-onPCvdk9f/6OhOo2zP6nfGKpzLma1QIxpFqD3jymbmIJTcVMOOQDMYW3eLtY+uSX8ribcJ7GQcbDGIM4rliTFg== dependencies: tslib "^2.3.0" -"@angular/pwa@17.0.7": - version "17.0.7" - resolved "https://registry.yarnpkg.com/@angular/pwa/-/pwa-17.0.7.tgz#45ddec964364e6c6dd0f765351b31d7aef215d10" - integrity sha512-VY5uuoC/NWpoFVSfoTYduQlMxdMLCJConPmK39NxOkhMW7KSphNwwY8tYjoDEUZwyhAooBT7QMi6EnSOrEi9Bg== +"@angular/pwa@17.1.3": + version "17.1.3" + resolved "https://registry.yarnpkg.com/@angular/pwa/-/pwa-17.1.3.tgz#55dd8d5bd53d12765300d9ce4ae29030e4216cf7" + integrity sha512-2wHu9GvFjGSYbMZuaD9NBtgwdZxDtwc3WTpDbOStp0kdaDwYV+wI/YWqc4lxKy1FCMJZ/zFBW7Ha0bDHbJHTRw== dependencies: - "@angular-devkit/schematics" "17.0.7" - "@schematics/angular" "17.0.7" + "@angular-devkit/schematics" "17.1.3" + "@schematics/angular" "17.1.3" parse5-html-rewriting-stream "7.0.0" -"@angular/router@17.0.7": - version "17.0.7" - resolved "https://registry.yarnpkg.com/@angular/router/-/router-17.0.7.tgz#a1bc4f49ad2f0bb1f6e1ab0a0e63d92836d7cbea" - integrity sha512-rUFPe1uDlYYw6+3Gq68czW7WxBH7zT/D3UsT1otqwUV4RnQQsVze4fIit9FqJh7tuP4y3WpB4XBNf7p7Oi6TJw== +"@angular/router@17.1.3": + version "17.1.3" + resolved "https://registry.yarnpkg.com/@angular/router/-/router-17.1.3.tgz#30d12b43079f44fda2ab968cde41da3548450d9e" + integrity sha512-6HigdtFjm+76UU2hiLGLE2SpOecQhD6TnAVTocDuRitpN5m0dyiffBrqxarfNwoZuMdIiXyqClJR4JRo1rJjoQ== dependencies: tslib "^2.3.0" -"@angular/service-worker@17.0.7": - version "17.0.7" - resolved "https://registry.yarnpkg.com/@angular/service-worker/-/service-worker-17.0.7.tgz#3d0e26f04b61af9e0360d1ead50335d11bee69f8" - integrity sha512-R/KDgnq5gV9XRv1B8zQqWz64pJ3fb0oFwCkB+w07llbxC9KDUS4MLbMmN3q/TSLOshGzs4sszNVyWGKAiTP13g== +"@angular/service-worker@17.1.3": + version "17.1.3" + resolved "https://registry.yarnpkg.com/@angular/service-worker/-/service-worker-17.1.3.tgz#1222de7a4752b6f8dc7bbb5dcc6015db13346b45" + integrity sha512-DSndSwNvNnETiqtFAt/jPUMBUUfAxot7IhEUp19KFbS4HhasSZ+QxkNECN9bT6SUWjeaN7wvPcvR4gdSkQs3Pg== dependencies: tslib "^2.3.0" @@ -490,7 +490,7 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.5.tgz#ffb878728bb6bdcb6f4510aa51b1be9afb8cfd98" integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw== -"@babel/core@7.23.2", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.13.16", "@babel/core@^7.2.2", "@babel/core@^7.20.2", "@babel/core@^7.22.9": +"@babel/core@7.23.2", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.13.16", "@babel/core@^7.20.2": version "7.23.2" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.2.tgz#ed10df0d580fff67c5f3ee70fd22e2e4c90a9f94" integrity sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ== @@ -511,6 +511,27 @@ json5 "^2.2.3" semver "^6.3.1" +"@babel/core@7.23.7": + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.7.tgz#4d8016e06a14b5f92530a13ed0561730b5c6483f" + integrity sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.23.5" + "@babel/generator" "^7.23.6" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helpers" "^7.23.7" + "@babel/parser" "^7.23.6" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.7" + "@babel/types" "^7.23.6" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + "@babel/core@^7.23.0", "@babel/core@^7.23.2": version "7.23.6" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.6.tgz#8be77cd77c55baadcc1eae1c33df90ab6d2151d4" @@ -553,17 +574,16 @@ json5 "^2.2.2" semver "^6.3.0" -"@babel/generator@7.23.0", "@babel/generator@^7.21.5", "@babel/generator@^7.23.0", "@babel/generator@^7.7.2": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" - integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== +"@babel/generator@7.17.7": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.7.tgz#8da2599beb4a86194a3b24df6c085931d9ee45ad" + integrity sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w== dependencies: - "@babel/types" "^7.23.0" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" + "@babel/types" "^7.17.0" jsesc "^2.5.1" + source-map "^0.5.0" -"@babel/generator@^7.23.6": +"@babel/generator@7.23.6", "@babel/generator@^7.23.6": version "7.23.6" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.6.tgz#9e1fca4811c77a10580d17d26b57b036133f3c2e" integrity sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw== @@ -573,6 +593,16 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" +"@babel/generator@^7.21.5", "@babel/generator@^7.23.0", "@babel/generator@^7.7.2": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" + integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== + dependencies: + "@babel/types" "^7.23.0" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + "@babel/generator@~7.21.1": version "7.21.9" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.9.tgz#3a1b706e07d836e204aee0650e8ee878d3aaa241" @@ -681,6 +711,28 @@ lodash.debounce "^4.0.8" resolve "^1.14.2" +"@babel/helper-define-polyfill-provider@^0.4.4": + version "0.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz#64df615451cb30e94b59a9696022cffac9a10088" + integrity sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA== + dependencies: + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + +"@babel/helper-define-polyfill-provider@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz#465805b7361f461e86c680f1de21eaf88c25901b" + integrity sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q== + dependencies: + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + "@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.21.5", "@babel/helper-environment-visitor@^7.22.20", "@babel/helper-environment-visitor@^7.22.5": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" @@ -798,7 +850,7 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83" integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== -"@babel/helper-validator-identifier@^7.19.1", "@babel/helper-validator-identifier@^7.22.20": +"@babel/helper-validator-identifier@^7.16.7", "@babel/helper-validator-identifier@^7.19.1", "@babel/helper-validator-identifier@^7.22.20": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== @@ -840,6 +892,15 @@ "@babel/traverse" "^7.23.6" "@babel/types" "^7.23.6" +"@babel/helpers@^7.23.7": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.9.tgz#c3e20bbe7f7a7e10cb9b178384b4affdf5995c7d" + integrity sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ== + dependencies: + "@babel/template" "^7.23.9" + "@babel/traverse" "^7.23.9" + "@babel/types" "^7.23.9" + "@babel/highlight@^7.22.13": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" @@ -858,16 +919,21 @@ chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@^7.0.0-beta.54", "@babel/parser@^7.1.0", "@babel/parser@^7.13.16", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.21.5", "@babel/parser@^7.21.8", "@babel/parser@^7.22.15", "@babel/parser@^7.23.0": +"@babel/parser@^7.1.0", "@babel/parser@^7.13.16", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.21.5", "@babel/parser@^7.21.8", "@babel/parser@^7.22.15", "@babel/parser@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== -"@babel/parser@^7.23.6": +"@babel/parser@^7.20.5", "@babel/parser@^7.23.6": version "7.23.6" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.6.tgz#ba1c9e512bda72a47e285ae42aff9d2a635a9e3b" integrity sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ== +"@babel/parser@^7.23.9": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.9.tgz#7b903b6149b0f8fa7ad564af646c4c38a77fc44b" + integrity sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA== + "@babel/parser@~7.21.2": version "7.21.9" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.9.tgz#ab18ea3b85b4bc33ba98a8d4c2032c557d23cf14" @@ -913,6 +979,14 @@ "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-plugin-utils" "^7.22.5" +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.23.7": + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz#516462a95d10a9618f197d39ad291a9b47ae1d7b" + integrity sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-proposal-async-generator-functions@^7.20.7": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326" @@ -1269,7 +1343,17 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-async-generator-functions@7.23.2", "@babel/plugin-transform-async-generator-functions@^7.23.2": +"@babel/plugin-transform-async-generator-functions@7.23.7": + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.7.tgz#3aa0b4f2fa3788b5226ef9346cf6d16ec61f99cd" + integrity sha512-PdxEpL71bJp1byMG0va5gwQcXHxuEYC/BgI/e88mGTtohbZN28O5Yit0Plkkm/dBzCF/BxmbNcses1RH1T+urA== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.20" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-transform-async-generator-functions@^7.23.2": version "7.23.2" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz#054afe290d64c6f576f371ccc321772c8ea87ebb" integrity sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ== @@ -1289,16 +1373,17 @@ "@babel/helper-remap-async-to-generator" "^7.22.20" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-transform-async-to-generator@7.22.5", "@babel/plugin-transform-async-to-generator@^7.20.7", "@babel/plugin-transform-async-to-generator@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz#c7a85f44e46f8952f6d27fe57c2ed3cc084c3775" - integrity sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ== +"@babel/plugin-transform-async-generator-functions@^7.23.7": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.9.tgz#9adaeb66fc9634a586c5df139c6240d41ed801ce" + integrity sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ== dependencies: - "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-remap-async-to-generator" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.20" + "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-transform-async-to-generator@^7.23.3": +"@babel/plugin-transform-async-to-generator@7.23.3", "@babel/plugin-transform-async-to-generator@^7.23.3": version "7.23.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz#d1f513c7a8a506d43f47df2bf25f9254b0b051fa" integrity sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw== @@ -1307,6 +1392,15 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-remap-async-to-generator" "^7.22.20" +"@babel/plugin-transform-async-to-generator@^7.20.7", "@babel/plugin-transform-async-to-generator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz#c7a85f44e46f8952f6d27fe57c2ed3cc084c3775" + integrity sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ== + dependencies: + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.5" + "@babel/plugin-transform-block-scoped-functions@^7.18.6", "@babel/plugin-transform-block-scoped-functions@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz#27978075bfaeb9fa586d3cb63a3d30c1de580024" @@ -1906,16 +2000,28 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-runtime@7.23.2", "@babel/plugin-transform-runtime@^7.22.9": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.2.tgz#c956a3f8d1aa50816ff6c30c6288d66635c12990" - integrity sha512-XOntj6icgzMS58jPVtQpiuF6ZFWxQiJavISGx5KGjRj+3gqZr8+N6Kx+N9BApWzgS+DOjIZfXXj0ZesenOWDyA== +"@babel/plugin-transform-runtime@7.23.7": + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.7.tgz#52bbd20054855beb9deae3bee9ceb05289c343e6" + integrity sha512-fa0hnfmiXc9fq/weK34MUV0drz2pOL/vfKWvN7Qw127hiUPabFCUMgAbYWcchRzMJit4o5ARsK/s+5h0249pLw== dependencies: "@babel/helper-module-imports" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" - babel-plugin-polyfill-corejs2 "^0.4.6" - babel-plugin-polyfill-corejs3 "^0.8.5" - babel-plugin-polyfill-regenerator "^0.5.3" + babel-plugin-polyfill-corejs2 "^0.4.7" + babel-plugin-polyfill-corejs3 "^0.8.7" + babel-plugin-polyfill-regenerator "^0.5.4" + semver "^6.3.1" + +"@babel/plugin-transform-runtime@^7.23.2": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.9.tgz#2c64d0680fc8e09e1dfe8fd5c646fe72abd82004" + integrity sha512-A7clW3a0aSjm3ONU9o2HAILSegJCYlEZmOhmBRReVtIpY/Z/p7yIZ+wR41Z+UipwdGuqwtID/V/dOdZXjwi9gQ== + dependencies: + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + babel-plugin-polyfill-corejs2 "^0.4.8" + babel-plugin-polyfill-corejs3 "^0.9.0" + babel-plugin-polyfill-regenerator "^0.5.5" semver "^6.3.1" "@babel/plugin-transform-shorthand-properties@^7.18.6", "@babel/plugin-transform-shorthand-properties@^7.22.5": @@ -2072,7 +2178,93 @@ "@babel/helper-create-regexp-features-plugin" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/preset-env@7.23.2", "@babel/preset-env@^7.20.2", "@babel/preset-env@^7.22.9": +"@babel/preset-env@7.23.7": + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.23.7.tgz#e5d69b9f14db8a13bae4d8e5ce7f360973626241" + integrity sha512-SY27X/GtTz/L4UryMNJ6p4fH4nsgWbz84y9FE0bQeWJP6O5BhgVCt53CotQKHCOeXJel8VyhlhujhlltKms/CA== + dependencies: + "@babel/compat-data" "^7.23.5" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.23.5" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.23.3" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.23.3" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.23.7" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.23.3" + "@babel/plugin-syntax-import-attributes" "^7.23.3" + "@babel/plugin-syntax-import-meta" "^7.10.4" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.23.3" + "@babel/plugin-transform-async-generator-functions" "^7.23.7" + "@babel/plugin-transform-async-to-generator" "^7.23.3" + "@babel/plugin-transform-block-scoped-functions" "^7.23.3" + "@babel/plugin-transform-block-scoping" "^7.23.4" + "@babel/plugin-transform-class-properties" "^7.23.3" + "@babel/plugin-transform-class-static-block" "^7.23.4" + "@babel/plugin-transform-classes" "^7.23.5" + "@babel/plugin-transform-computed-properties" "^7.23.3" + "@babel/plugin-transform-destructuring" "^7.23.3" + "@babel/plugin-transform-dotall-regex" "^7.23.3" + "@babel/plugin-transform-duplicate-keys" "^7.23.3" + "@babel/plugin-transform-dynamic-import" "^7.23.4" + "@babel/plugin-transform-exponentiation-operator" "^7.23.3" + "@babel/plugin-transform-export-namespace-from" "^7.23.4" + "@babel/plugin-transform-for-of" "^7.23.6" + "@babel/plugin-transform-function-name" "^7.23.3" + "@babel/plugin-transform-json-strings" "^7.23.4" + "@babel/plugin-transform-literals" "^7.23.3" + "@babel/plugin-transform-logical-assignment-operators" "^7.23.4" + "@babel/plugin-transform-member-expression-literals" "^7.23.3" + "@babel/plugin-transform-modules-amd" "^7.23.3" + "@babel/plugin-transform-modules-commonjs" "^7.23.3" + "@babel/plugin-transform-modules-systemjs" "^7.23.3" + "@babel/plugin-transform-modules-umd" "^7.23.3" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" + "@babel/plugin-transform-new-target" "^7.23.3" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.23.4" + "@babel/plugin-transform-numeric-separator" "^7.23.4" + "@babel/plugin-transform-object-rest-spread" "^7.23.4" + "@babel/plugin-transform-object-super" "^7.23.3" + "@babel/plugin-transform-optional-catch-binding" "^7.23.4" + "@babel/plugin-transform-optional-chaining" "^7.23.4" + "@babel/plugin-transform-parameters" "^7.23.3" + "@babel/plugin-transform-private-methods" "^7.23.3" + "@babel/plugin-transform-private-property-in-object" "^7.23.4" + "@babel/plugin-transform-property-literals" "^7.23.3" + "@babel/plugin-transform-regenerator" "^7.23.3" + "@babel/plugin-transform-reserved-words" "^7.23.3" + "@babel/plugin-transform-shorthand-properties" "^7.23.3" + "@babel/plugin-transform-spread" "^7.23.3" + "@babel/plugin-transform-sticky-regex" "^7.23.3" + "@babel/plugin-transform-template-literals" "^7.23.3" + "@babel/plugin-transform-typeof-symbol" "^7.23.3" + "@babel/plugin-transform-unicode-escapes" "^7.23.3" + "@babel/plugin-transform-unicode-property-regex" "^7.23.3" + "@babel/plugin-transform-unicode-regex" "^7.23.3" + "@babel/plugin-transform-unicode-sets-regex" "^7.23.3" + "@babel/preset-modules" "0.1.6-no-external-plugins" + babel-plugin-polyfill-corejs2 "^0.4.7" + babel-plugin-polyfill-corejs3 "^0.8.7" + babel-plugin-polyfill-regenerator "^0.5.4" + core-js-compat "^3.31.0" + semver "^6.3.1" + +"@babel/preset-env@^7.20.2": version "7.23.2" resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.23.2.tgz#1f22be0ff0e121113260337dbc3e58fafce8d059" integrity sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ== @@ -2402,7 +2594,14 @@ resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/runtime@7.23.2", "@babel/runtime@^7.13.10", "@babel/runtime@^7.17.8", "@babel/runtime@^7.22.6", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4": +"@babel/runtime@7.23.7": + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.7.tgz#dd7c88deeb218a0f8bd34d5db1aa242e0f203193" + integrity sha512-w06OXVOFso7LcbzMiDGt+3X7Rh7Ho8MmgPoWU3rarH+8upf+wSU/grlGbWzQyr3DkdN6ZeuMFjpdwW0Q+HxobA== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/runtime@^7.13.10", "@babel/runtime@^7.17.8", "@babel/runtime@^7.22.6", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4": version "7.23.2" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.2.tgz#062b0ac103261d68a966c4c7baf2ae3e62ec3885" integrity sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg== @@ -2418,7 +2617,16 @@ "@babel/parser" "^7.22.15" "@babel/types" "^7.22.15" -"@babel/traverse@^7.0.0-beta.54", "@babel/traverse@^7.16.0", "@babel/traverse@^7.21.5", "@babel/traverse@^7.23.2": +"@babel/template@^7.23.9": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.23.9.tgz#f881d0487cba2828d3259dcb9ef5005a9731011a" + integrity sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA== + dependencies: + "@babel/code-frame" "^7.23.5" + "@babel/parser" "^7.23.9" + "@babel/types" "^7.23.9" + +"@babel/traverse@7.23.2", "@babel/traverse@^7.16.0", "@babel/traverse@^7.21.5", "@babel/traverse@^7.23.2": version "7.23.2" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== @@ -2450,6 +2658,22 @@ debug "^4.3.1" globals "^11.1.0" +"@babel/traverse@^7.23.7", "@babel/traverse@^7.23.9": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.9.tgz#2f9d6aead6b564669394c5ce0f9302bb65b9d950" + integrity sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg== + dependencies: + "@babel/code-frame" "^7.23.5" + "@babel/generator" "^7.23.6" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.23.9" + "@babel/types" "^7.23.9" + debug "^4.3.1" + globals "^11.1.0" + "@babel/traverse@~7.21.2": version "7.21.5" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.5.tgz#ad22361d352a5154b498299d523cf72998a4b133" @@ -2466,7 +2690,15 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.54", "@babel/types@^7.20.7", "@babel/types@^7.21.5", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": +"@babel/types@7.17.0": + version "7.17.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b" + integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + to-fast-properties "^2.0.0" + +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.21.5", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== @@ -2475,7 +2707,7 @@ "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" -"@babel/types@^7.23.6": +"@babel/types@^7.17.0", "@babel/types@^7.23.6": version "7.23.6" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.6.tgz#be33fdb151e1f5a56877d704492c240fc71c7ccd" integrity sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg== @@ -2484,6 +2716,15 @@ "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" +"@babel/types@^7.23.9": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.9.tgz#1dd7b59a9a2b5c87f8b41e52770b5ecbf492e002" + integrity sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q== + dependencies: + "@babel/helper-string-parser" "^7.23.4" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + "@babel/types@~7.21.2": version "7.21.5" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.5.tgz#18dfbd47c39d3904d5db3d3dc2cc80bedb60e5b6" @@ -2503,36 +2744,6 @@ resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz#923ca57e173c6b232bbbb07347b1be982f03e783" integrity sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A== -"@cbor-extract/cbor-extract-darwin-arm64@2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-darwin-arm64/-/cbor-extract-darwin-arm64-2.1.1.tgz#5721f6dd3feae0b96d23122853ce977e0671b7a6" - integrity sha512-blVBy5MXz6m36Vx0DfLd7PChOQKEs8lK2bD1WJn/vVgG4FXZiZmZb2GECHFvVPA5T7OnODd9xZiL3nMCv6QUhA== - -"@cbor-extract/cbor-extract-darwin-x64@2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-darwin-x64/-/cbor-extract-darwin-x64-2.1.1.tgz#c25e7d0133950d87d101d7b3afafea8d50d83f5f" - integrity sha512-h6KFOzqk8jXTvkOftyRIWGrd7sKQzQv2jVdTL9nKSf3D2drCvQB/LHUxAOpPXo3pv2clDtKs3xnHalpEh3rDsw== - -"@cbor-extract/cbor-extract-linux-arm64@2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-linux-arm64/-/cbor-extract-linux-arm64-2.1.1.tgz#48f78e7d8f0fcc84ed074b6bfa6d15dd83187c63" - integrity sha512-SxAaRcYf8S0QHaMc7gvRSiTSr7nUYMqbUdErBEu+HYA4Q6UNydx1VwFE68hGcp1qvxcy9yT5U7gA+a5XikfwSQ== - -"@cbor-extract/cbor-extract-linux-arm@2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-linux-arm/-/cbor-extract-linux-arm-2.1.1.tgz#7507d346389cb682e44fab8fae9534edd52e2e41" - integrity sha512-ds0uikdcIGUjPyraV4oJqyVE5gl/qYBpa/Wnh6l6xLE2lj/hwnjT2XcZCChdXwW/YFZ1LUHs6waoYN8PmK0nKQ== - -"@cbor-extract/cbor-extract-linux-x64@2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-linux-x64/-/cbor-extract-linux-x64-2.1.1.tgz#b7c1d2be61c58ec18d58afbad52411ded63cd4cd" - integrity sha512-GVK+8fNIE9lJQHAlhOROYiI0Yd4bAZ4u++C2ZjlkS3YmO6hi+FUxe6Dqm+OKWTcMpL/l71N6CQAmaRcb4zyJuA== - -"@cbor-extract/cbor-extract-win32-x64@2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-win32-x64/-/cbor-extract-win32-x64-2.1.1.tgz#21b11a1a3f18c3e7d62fd5f87438b7ed2c64c1f7" - integrity sha512-2Niq1C41dCRIDeD8LddiH+mxGlO7HJ612Ll3D/E73ZWBmycued+8ghTr/Ho3CMOWPUEr08XtyBMVXAjqF+TcKw== - "@codewithdan/observable-store@2.2.15": version "2.2.15" resolved "https://registry.yarnpkg.com/@codewithdan/observable-store/-/observable-store-2.2.15.tgz#6d27e0988e182853def59a714b712f4389e558d2" @@ -2650,6 +2861,16 @@ resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz#08de79f54eb3406f9daaf77c76e35313da963963" integrity sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw== +"@esbuild/aix-ppc64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz#2acd20be6d4f0458bc8c784103495ff24f13b1d3" + integrity sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g== + +"@esbuild/aix-ppc64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz#d1bc06aedb6936b3b6d313bf809a5a40387d2b7f" + integrity sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA== + "@esbuild/android-arm64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz#bafb75234a5d3d1b690e7c2956a599345e84a2fd" @@ -2660,6 +2881,16 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622" integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ== +"@esbuild/android-arm64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz#b45d000017385c9051a4f03e17078abb935be220" + integrity sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q== + +"@esbuild/android-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz#7ad65a36cfdb7e0d429c353e00f680d737c2aed4" + integrity sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA== + "@esbuild/android-arm64@0.19.5": version "0.19.5" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.5.tgz#276c5f99604054d3dbb733577e09adae944baa90" @@ -2675,6 +2906,16 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682" integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw== +"@esbuild/android-arm@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.11.tgz#f46f55414e1c3614ac682b29977792131238164c" + integrity sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw== + +"@esbuild/android-arm@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.12.tgz#b0c26536f37776162ca8bde25e42040c203f2824" + integrity sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w== + "@esbuild/android-arm@0.19.5": version "0.19.5" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.5.tgz#4a3cbf14758166abaae8ba9c01a80e68342a4eec" @@ -2690,6 +2931,16 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2" integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg== +"@esbuild/android-x64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.11.tgz#bfc01e91740b82011ef503c48f548950824922b2" + integrity sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg== + +"@esbuild/android-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.12.tgz#cb13e2211282012194d89bf3bfe7721273473b3d" + integrity sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew== + "@esbuild/android-x64@0.19.5": version "0.19.5" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.5.tgz#21a3d11cd4613d2d3c5ccb9e746c254eb9265b0a" @@ -2705,6 +2956,16 @@ resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1" integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA== +"@esbuild/darwin-arm64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz#533fb7f5a08c37121d82c66198263dcc1bed29bf" + integrity sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ== + +"@esbuild/darwin-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz#cbee41e988020d4b516e9d9e44dd29200996275e" + integrity sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g== + "@esbuild/darwin-arm64@0.19.5": version "0.19.5" resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.5.tgz#714cb839f467d6a67b151ee8255886498e2b9bf6" @@ -2720,6 +2981,16 @@ resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d" integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ== +"@esbuild/darwin-x64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz#62f3819eff7e4ddc656b7c6815a31cf9a1e7d98e" + integrity sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g== + +"@esbuild/darwin-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz#e37d9633246d52aecf491ee916ece709f9d5f4cd" + integrity sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A== + "@esbuild/darwin-x64@0.19.5": version "0.19.5" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.5.tgz#2c553e97a6d2b4ae76a884e35e6cbab85a990bbf" @@ -2735,6 +3006,16 @@ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54" integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw== +"@esbuild/freebsd-arm64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz#d478b4195aa3ca44160272dab85ef8baf4175b4a" + integrity sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA== + +"@esbuild/freebsd-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz#1ee4d8b682ed363b08af74d1ea2b2b4dbba76487" + integrity sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA== + "@esbuild/freebsd-arm64@0.19.5": version "0.19.5" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.5.tgz#d554f556718adb31917a0da24277bf84b6ee87f3" @@ -2750,6 +3031,16 @@ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e" integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ== +"@esbuild/freebsd-x64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz#7bdcc1917409178257ca6a1a27fe06e797ec18a2" + integrity sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw== + +"@esbuild/freebsd-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz#37a693553d42ff77cd7126764b535fb6cc28a11c" + integrity sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg== + "@esbuild/freebsd-x64@0.19.5": version "0.19.5" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.5.tgz#288f7358a3bb15d99e73c65c9adaa3dabb497432" @@ -2765,6 +3056,16 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0" integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA== +"@esbuild/linux-arm64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz#58ad4ff11685fcc735d7ff4ca759ab18fcfe4545" + integrity sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg== + +"@esbuild/linux-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz#be9b145985ec6c57470e0e051d887b09dddb2d4b" + integrity sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA== + "@esbuild/linux-arm64@0.19.5": version "0.19.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.5.tgz#95933ae86325c93cb6b5e8333d22120ecfdc901b" @@ -2780,6 +3081,16 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0" integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg== +"@esbuild/linux-arm@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz#ce82246d873b5534d34de1e5c1b33026f35e60e3" + integrity sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q== + +"@esbuild/linux-arm@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz#207ecd982a8db95f7b5279207d0ff2331acf5eef" + integrity sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w== + "@esbuild/linux-arm@0.19.5": version "0.19.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.5.tgz#0acef93aa3e0579e46d33b666627bddb06636664" @@ -2795,6 +3106,16 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7" integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA== +"@esbuild/linux-ia32@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz#cbae1f313209affc74b80f4390c4c35c6ab83fa4" + integrity sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA== + +"@esbuild/linux-ia32@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz#d0d86b5ca1562523dc284a6723293a52d5860601" + integrity sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA== + "@esbuild/linux-ia32@0.19.5": version "0.19.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.5.tgz#b6e5c9e80b42131cbd6b1ddaa48c92835f1ed67f" @@ -2810,6 +3131,16 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d" integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg== +"@esbuild/linux-loong64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz#5f32aead1c3ec8f4cccdb7ed08b166224d4e9121" + integrity sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg== + +"@esbuild/linux-loong64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz#9a37f87fec4b8408e682b528391fa22afd952299" + integrity sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA== + "@esbuild/linux-loong64@0.19.5": version "0.19.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.5.tgz#e5f0cf95a180158b01ff5f417da796a1c09dfbea" @@ -2825,6 +3156,16 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231" integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ== +"@esbuild/linux-mips64el@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz#38eecf1cbb8c36a616261de858b3c10d03419af9" + integrity sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg== + +"@esbuild/linux-mips64el@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz#4ddebd4e6eeba20b509d8e74c8e30d8ace0b89ec" + integrity sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w== + "@esbuild/linux-mips64el@0.19.5": version "0.19.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.5.tgz#ae36fb86c7d5f641f3a0c8472e83dcb6ea36a408" @@ -2840,6 +3181,16 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb" integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA== +"@esbuild/linux-ppc64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz#9c5725a94e6ec15b93195e5a6afb821628afd912" + integrity sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA== + +"@esbuild/linux-ppc64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz#adb67dadb73656849f63cd522f5ecb351dd8dee8" + integrity sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg== + "@esbuild/linux-ppc64@0.19.5": version "0.19.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.5.tgz#7960cb1666f0340ddd9eef7b26dcea3835d472d0" @@ -2855,6 +3206,16 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6" integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A== +"@esbuild/linux-riscv64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz#2dc4486d474a2a62bbe5870522a9a600e2acb916" + integrity sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ== + +"@esbuild/linux-riscv64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz#11bc0698bf0a2abf8727f1c7ace2112612c15adf" + integrity sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg== + "@esbuild/linux-riscv64@0.19.5": version "0.19.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.5.tgz#32207df26af60a3a9feea1783fc21b9817bade19" @@ -2870,6 +3231,16 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071" integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ== +"@esbuild/linux-s390x@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz#4ad8567df48f7dd4c71ec5b1753b6f37561a65a8" + integrity sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q== + +"@esbuild/linux-s390x@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz#e86fb8ffba7c5c92ba91fc3b27ed5a70196c3cc8" + integrity sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg== + "@esbuild/linux-s390x@0.19.5": version "0.19.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.5.tgz#b38d5681db89a3723862dfa792812397b1510a7d" @@ -2885,6 +3256,16 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338" integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w== +"@esbuild/linux-x64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz#b7390c4d5184f203ebe7ddaedf073df82a658766" + integrity sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA== + +"@esbuild/linux-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz#5f37cfdc705aea687dfe5dfbec086a05acfe9c78" + integrity sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg== + "@esbuild/linux-x64@0.19.5": version "0.19.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.5.tgz#46feba2ad041a241379d150f415b472fe3885075" @@ -2900,6 +3281,16 @@ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1" integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A== +"@esbuild/netbsd-x64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz#d633c09492a1721377f3bccedb2d821b911e813d" + integrity sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ== + +"@esbuild/netbsd-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz#29da566a75324e0d0dd7e47519ba2f7ef168657b" + integrity sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA== + "@esbuild/netbsd-x64@0.19.5": version "0.19.5" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.5.tgz#3b5c1fb068f26bfc681d31f682adf1bea4ef0702" @@ -2915,6 +3306,16 @@ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae" integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg== +"@esbuild/openbsd-x64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz#17388c76e2f01125bf831a68c03a7ffccb65d1a2" + integrity sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw== + +"@esbuild/openbsd-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz#306c0acbdb5a99c95be98bdd1d47c916e7dc3ff0" + integrity sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw== + "@esbuild/openbsd-x64@0.19.5": version "0.19.5" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.5.tgz#ca6830316ca68056c5c88a875f103ad3235e00db" @@ -2930,6 +3331,16 @@ resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d" integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ== +"@esbuild/sunos-x64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz#e320636f00bb9f4fdf3a80e548cb743370d41767" + integrity sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ== + +"@esbuild/sunos-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz#0933eaab9af8b9b2c930236f62aae3fc593faf30" + integrity sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA== + "@esbuild/sunos-x64@0.19.5": version "0.19.5" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.5.tgz#9efc4eb9539a7be7d5a05ada52ee43cda0d8e2dd" @@ -2945,6 +3356,16 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9" integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg== +"@esbuild/win32-arm64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz#c778b45a496e90b6fc373e2a2bb072f1441fe0ee" + integrity sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ== + +"@esbuild/win32-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz#773bdbaa1971b36db2f6560088639ccd1e6773ae" + integrity sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A== + "@esbuild/win32-arm64@0.19.5": version "0.19.5" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.5.tgz#29f8184afa7a02a956ebda4ed638099f4b8ff198" @@ -2960,6 +3381,16 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102" integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g== +"@esbuild/win32-ia32@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz#481a65fee2e5cce74ec44823e6b09ecedcc5194c" + integrity sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg== + +"@esbuild/win32-ia32@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz#000516cad06354cc84a73f0943a4aa690ef6fd67" + integrity sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ== + "@esbuild/win32-ia32@0.19.5": version "0.19.5" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.5.tgz#f3de07afb292ecad651ae4bb8727789de2d95b05" @@ -2975,6 +3406,16 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d" integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ== +"@esbuild/win32-x64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz#a5d300008960bb39677c46bf16f53ec70d8dee04" + integrity sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw== + +"@esbuild/win32-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz#c57c8afbb4054a3ab8317591a0b7320360b444ae" + integrity sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA== + "@esbuild/win32-x64@0.19.5": version "0.19.5" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.5.tgz#faad84c41ba12e3a0acb52571df9bff37bee75f6" @@ -2987,14 +3428,19 @@ dependencies: eslint-visitor-keys "^3.3.0" -"@eslint/eslintrc@^1.4.1": - version "1.4.1" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.4.1.tgz#af58772019a2d271b7e2d4c23ff4ddcba3ccfb3e" - integrity sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA== +"@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" + integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== + +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== dependencies: ajv "^6.12.4" debug "^4.3.2" - espree "^9.4.0" + espree "^9.6.0" globals "^13.19.0" ignore "^5.2.0" import-fresh "^3.2.1" @@ -3002,6 +3448,11 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" +"@eslint/js@8.56.0": + version "8.56.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.56.0.tgz#ef20350fec605a7f7035a01764731b2de0f3782b" + integrity sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A== + "@fal-works/esbuild-plugin-global-externals@^2.1.2": version "2.1.2" resolved "https://registry.yarnpkg.com/@fal-works/esbuild-plugin-global-externals/-/esbuild-plugin-global-externals-2.1.2.tgz#c05ed35ad82df8e6ac616c68b92c2282bd083ba4" @@ -3044,13 +3495,13 @@ resolved "https://registry.yarnpkg.com/@hexagon/base64/-/base64-1.1.28.tgz#7d306a97f1423829be5b27c9d388fe50e3099d48" integrity sha512-lhqDEAvWixy3bZ+UOYbPwUbBkwBq5C1LAJ/xPC8Oi+lL54oyakv/npbA0aU2hgCsx/1NUd4IBvV03+aUBWxerw== -"@humanwhocodes/config-array@^0.11.8": - version "0.11.13" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.13.tgz#075dc9684f40a531d9b26b0822153c1e832ee297" - integrity sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ== +"@humanwhocodes/config-array@^0.11.13": + version "0.11.14" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" + integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== dependencies: - "@humanwhocodes/object-schema" "^2.0.1" - debug "^4.1.1" + "@humanwhocodes/object-schema" "^2.0.2" + debug "^4.3.1" minimatch "^3.0.5" "@humanwhocodes/module-importer@^1.0.1": @@ -3058,10 +3509,10 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz#e5211452df060fa8522b55c7b3c0c4d1981cb044" - integrity sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw== +"@humanwhocodes/object-schema@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz#d9fae00a2d5cb40f92cfe64b47ad749fbc38f917" + integrity sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw== "@internationalized/number@3.5.0": version "3.5.0" @@ -3358,718 +3809,723 @@ resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== -"@ljharb/through@^2.3.9": - version "2.3.11" - resolved "https://registry.yarnpkg.com/@ljharb/through/-/through-2.3.11.tgz#783600ff12c06f21a76cc26e33abd0b1595092f9" - integrity sha512-ccfcIDlogiXNq5KcbAwbaO7lMh3Tm1i3khMPYpxlK8hH/W53zN81KM9coerRLOnTGu3nfXIniAmQbRI9OxbC0w== +"@levischuck/tiny-cbor@^0.2.2": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@levischuck/tiny-cbor/-/tiny-cbor-0.2.2.tgz#84239ce80e1107b810f1fe9f66546d4f79f31aea" + integrity sha512-f5CnPw997Y2GQ8FAvtuVVC19FX8mwNNC+1XJcIi16n/LTJifKO6QBgGLgN3YEmqtGMk17SKSuoWES3imJVxAVw== + +"@ljharb/through@^2.3.11": + version "2.3.12" + resolved "https://registry.yarnpkg.com/@ljharb/through/-/through-2.3.12.tgz#c418c43060eee193adce48b15c2206096a28e9ea" + integrity sha512-ajo/heTlG3QgC8EGP6APIejksVAYt4ayz4tqoP3MolFELzcH1x1fzwEYRJTPO0IELutZ5HQ0c26/GqAYy79u3g== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.5" "@lukeed/csprng@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@lukeed/csprng/-/csprng-1.1.0.tgz#1e3e4bd05c1cc7a0b2ddbd8a03f39f6e4b5e6cfe" integrity sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA== -"@material/animation@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/animation/-/animation-15.0.0-canary.a246a4439.0.tgz#bb7a8dc450e99be4f3c3ef4ace206b44ee1a9162" - integrity sha512-0eV06UGYeuFwC/4t+yjg3LCRGRLq72ybBtJYzcBDpP4ASTjie0WmpAOFJYXRq2U5X/yxLviDMhpRemoSUjgZ0Q== +"@material/animation@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/animation/-/animation-15.0.0-canary.7f224ddd4.0.tgz#14b4f80718f9d405953dfca4376f9bcef609adc6" + integrity sha512-1GSJaPKef+7HRuV+HusVZHps64cmZuOItDbt40tjJVaikcaZvwmHlcTxRIqzcRoCdt5ZKHh3NoO7GB9Khg4Jnw== dependencies: tslib "^2.1.0" -"@material/auto-init@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/auto-init/-/auto-init-15.0.0-canary.a246a4439.0.tgz#b5235074cd8ec08a2c28f2b2be1a452a173c4e98" - integrity sha512-0QfmjT5elQ10hCxToVgq/WaC3301tVH1sJaO3O2yocVzr7s6iWm8/zch16V5hcHzQHbtcT3Rf4y1ZzmdNys2Iw== +"@material/auto-init@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/auto-init/-/auto-init-15.0.0-canary.7f224ddd4.0.tgz#9d1b6ed5d27e0c4c037a0cdc14e73729282d718d" + integrity sha512-t7ZGpRJ3ec0QDUO0nJu/SMgLW7qcuG2KqIsEYD1Ej8qhI2xpdR2ydSDQOkVEitXmKoGol1oq4nYSBjTlB65GqA== dependencies: - "@material/base" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.7f224ddd4.0" tslib "^2.1.0" -"@material/banner@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/banner/-/banner-15.0.0-canary.a246a4439.0.tgz#0e9dfb1063b9746b5420579c7a1cc736c589aba9" - integrity sha512-PBLgH7JEbEpTkLy33oyWXUhIFmSsdOrR6Gn6qIgQRo1qrnk5RSBGW2gEq4Z6793vjxM107gKudDb23E4Fcu4vg== - dependencies: - "@material/base" "15.0.0-canary.a246a4439.0" - "@material/button" "15.0.0-canary.a246a4439.0" - "@material/dom" "15.0.0-canary.a246a4439.0" - "@material/elevation" "15.0.0-canary.a246a4439.0" - "@material/feature-targeting" "15.0.0-canary.a246a4439.0" - "@material/ripple" "15.0.0-canary.a246a4439.0" - "@material/rtl" "15.0.0-canary.a246a4439.0" - "@material/shape" "15.0.0-canary.a246a4439.0" - "@material/theme" "15.0.0-canary.a246a4439.0" - "@material/tokens" "15.0.0-canary.a246a4439.0" - "@material/typography" "15.0.0-canary.a246a4439.0" +"@material/banner@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/banner/-/banner-15.0.0-canary.7f224ddd4.0.tgz#2cf24525e3dd1104f8c311d63c71f2e6200de1fb" + integrity sha512-g9wBUZzYBizyBcBQXTIafnRUUPi7efU9gPJfzeGgkynXiccP/vh5XMmH+PBxl5v+4MlP/d4cZ2NUYoAN7UTqSA== + dependencies: + "@material/base" "15.0.0-canary.7f224ddd4.0" + "@material/button" "15.0.0-canary.7f224ddd4.0" + "@material/dom" "15.0.0-canary.7f224ddd4.0" + "@material/elevation" "15.0.0-canary.7f224ddd4.0" + "@material/feature-targeting" "15.0.0-canary.7f224ddd4.0" + "@material/ripple" "15.0.0-canary.7f224ddd4.0" + "@material/rtl" "15.0.0-canary.7f224ddd4.0" + "@material/shape" "15.0.0-canary.7f224ddd4.0" + "@material/theme" "15.0.0-canary.7f224ddd4.0" + "@material/tokens" "15.0.0-canary.7f224ddd4.0" + "@material/typography" "15.0.0-canary.7f224ddd4.0" tslib "^2.1.0" -"@material/base@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/base/-/base-15.0.0-canary.a246a4439.0.tgz#a4b013e184d60969c3d27d04925f8a4dbd4a6683" - integrity sha512-/ob3v3IFU8q2gGdVNWw5kNPjW2mRTeBIz1YdhGWUmRxKn2Kl8bdLOvrAmZtQMmPn/4cGXvinxpec/zVBWQKDkA== +"@material/base@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/base/-/base-15.0.0-canary.7f224ddd4.0.tgz#4960bef078e0c092f5293eb331f732d8e8e9265e" + integrity sha512-I9KQOKXpLfJkP8MqZyr8wZIzdPHrwPjFvGd9zSK91/vPyE4hzHRJc/0njsh9g8Lm9PRYLbifXX+719uTbHxx+A== dependencies: tslib "^2.1.0" -"@material/button@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/button/-/button-15.0.0-canary.a246a4439.0.tgz#84676925fe6da5367b759c4ce9a585f7cbc96416" - integrity sha512-rGpVRde0Aqhv2t9QvT8Zl3HvG89BeUNPOpgfpaLBZ4SGGAO4rIrckl/eCENibKgmmdCKcYZlG9gc5abQVPfUvw== - dependencies: - "@material/density" "15.0.0-canary.a246a4439.0" - "@material/dom" "15.0.0-canary.a246a4439.0" - "@material/elevation" "15.0.0-canary.a246a4439.0" - "@material/feature-targeting" "15.0.0-canary.a246a4439.0" - "@material/focus-ring" "15.0.0-canary.a246a4439.0" - "@material/ripple" "15.0.0-canary.a246a4439.0" - "@material/rtl" "15.0.0-canary.a246a4439.0" - "@material/shape" "15.0.0-canary.a246a4439.0" - "@material/theme" "15.0.0-canary.a246a4439.0" - "@material/tokens" "15.0.0-canary.a246a4439.0" - "@material/touch-target" "15.0.0-canary.a246a4439.0" - "@material/typography" "15.0.0-canary.a246a4439.0" +"@material/button@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/button/-/button-15.0.0-canary.7f224ddd4.0.tgz#8de20a17fa75529f65553d9fb6c4af5d2743fa94" + integrity sha512-BHB7iyHgRVH+JF16+iscR+Qaic+p7LU1FOLgP8KucRlpF9tTwIxQA6mJwGRi5gUtcG+vyCmzVS+hIQ6DqT/7BA== + dependencies: + "@material/density" "15.0.0-canary.7f224ddd4.0" + "@material/dom" "15.0.0-canary.7f224ddd4.0" + "@material/elevation" "15.0.0-canary.7f224ddd4.0" + "@material/feature-targeting" "15.0.0-canary.7f224ddd4.0" + "@material/focus-ring" "15.0.0-canary.7f224ddd4.0" + "@material/ripple" "15.0.0-canary.7f224ddd4.0" + "@material/rtl" "15.0.0-canary.7f224ddd4.0" + "@material/shape" "15.0.0-canary.7f224ddd4.0" + "@material/theme" "15.0.0-canary.7f224ddd4.0" + "@material/tokens" "15.0.0-canary.7f224ddd4.0" + "@material/touch-target" "15.0.0-canary.7f224ddd4.0" + "@material/typography" "15.0.0-canary.7f224ddd4.0" tslib "^2.1.0" -"@material/card@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/card/-/card-15.0.0-canary.a246a4439.0.tgz#b195e66485fb450668eec12c3ad68404d659be5a" - integrity sha512-+rYUnBPgv5QVF6BeUs3toIRdSwFVohGmjk2ptTXMZkKxqAJt7Nr9Znbm3Ym2hD8GUHJeh3pyGFvEs6rG6JMYAw== - dependencies: - "@material/dom" "15.0.0-canary.a246a4439.0" - "@material/elevation" "15.0.0-canary.a246a4439.0" - "@material/feature-targeting" "15.0.0-canary.a246a4439.0" - "@material/ripple" "15.0.0-canary.a246a4439.0" - "@material/rtl" "15.0.0-canary.a246a4439.0" - "@material/shape" "15.0.0-canary.a246a4439.0" - "@material/theme" "15.0.0-canary.a246a4439.0" - "@material/tokens" "15.0.0-canary.a246a4439.0" +"@material/card@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/card/-/card-15.0.0-canary.7f224ddd4.0.tgz#3ac82035f7260ce8b8337402d2102bc254169dff" + integrity sha512-kt7y9/IWOtJTr3Z/AoWJT3ZLN7CLlzXhx2udCLP9ootZU2bfGK0lzNwmo80bv/pJfrY9ihQKCtuGTtNxUy+vIw== + dependencies: + "@material/dom" "15.0.0-canary.7f224ddd4.0" + "@material/elevation" "15.0.0-canary.7f224ddd4.0" + "@material/feature-targeting" "15.0.0-canary.7f224ddd4.0" + "@material/ripple" "15.0.0-canary.7f224ddd4.0" + "@material/rtl" "15.0.0-canary.7f224ddd4.0" + "@material/shape" "15.0.0-canary.7f224ddd4.0" + "@material/theme" "15.0.0-canary.7f224ddd4.0" + "@material/tokens" "15.0.0-canary.7f224ddd4.0" tslib "^2.1.0" -"@material/checkbox@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/checkbox/-/checkbox-15.0.0-canary.a246a4439.0.tgz#9b38a2fcff58f31adb2dcd22e6d6a0095fdf9250" - integrity sha512-sQwHzm1TSxHUoPrqplWTk/BhyzdDhzcwlbucwJK9W0o9WXMDk+d9PvcCxpP/9sAnVqZk42BfE89Y0T1DHglZ9A== - dependencies: - "@material/animation" "15.0.0-canary.a246a4439.0" - "@material/base" "15.0.0-canary.a246a4439.0" - "@material/density" "15.0.0-canary.a246a4439.0" - "@material/dom" "15.0.0-canary.a246a4439.0" - "@material/feature-targeting" "15.0.0-canary.a246a4439.0" - "@material/focus-ring" "15.0.0-canary.a246a4439.0" - "@material/ripple" "15.0.0-canary.a246a4439.0" - "@material/rtl" "15.0.0-canary.a246a4439.0" - "@material/theme" "15.0.0-canary.a246a4439.0" - "@material/touch-target" "15.0.0-canary.a246a4439.0" +"@material/checkbox@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/checkbox/-/checkbox-15.0.0-canary.7f224ddd4.0.tgz#a8223914b244cd7a23d9279b9fce3197a9473e69" + integrity sha512-rURcrL5O1u6hzWR+dNgiQ/n89vk6tdmdP3mZgnxJx61q4I/k1yijKqNJSLrkXH7Rto3bM5NRKMOlgvMvVd7UMQ== + dependencies: + "@material/animation" "15.0.0-canary.7f224ddd4.0" + "@material/base" "15.0.0-canary.7f224ddd4.0" + "@material/density" "15.0.0-canary.7f224ddd4.0" + "@material/dom" "15.0.0-canary.7f224ddd4.0" + "@material/feature-targeting" "15.0.0-canary.7f224ddd4.0" + "@material/focus-ring" "15.0.0-canary.7f224ddd4.0" + "@material/ripple" "15.0.0-canary.7f224ddd4.0" + "@material/rtl" "15.0.0-canary.7f224ddd4.0" + "@material/theme" "15.0.0-canary.7f224ddd4.0" + "@material/touch-target" "15.0.0-canary.7f224ddd4.0" tslib "^2.1.0" -"@material/chips@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/chips/-/chips-15.0.0-canary.a246a4439.0.tgz#2d73b4c7b5326ee6a160db01b84ad2a893b1cb53" - integrity sha512-TiV9WJ5taEHPGWPhXbxJvUJhLzThg+VpK7aAlvL4RurtmJ7pURuEdRS4Z6o0OEqi3wKQ4z/+K44kZUn/+9HALg== - dependencies: - "@material/animation" "15.0.0-canary.a246a4439.0" - "@material/base" "15.0.0-canary.a246a4439.0" - "@material/checkbox" "15.0.0-canary.a246a4439.0" - "@material/density" "15.0.0-canary.a246a4439.0" - "@material/dom" "15.0.0-canary.a246a4439.0" - "@material/elevation" "15.0.0-canary.a246a4439.0" - "@material/feature-targeting" "15.0.0-canary.a246a4439.0" - "@material/focus-ring" "15.0.0-canary.a246a4439.0" - "@material/ripple" "15.0.0-canary.a246a4439.0" - "@material/rtl" "15.0.0-canary.a246a4439.0" - "@material/shape" "15.0.0-canary.a246a4439.0" - "@material/theme" "15.0.0-canary.a246a4439.0" - "@material/tokens" "15.0.0-canary.a246a4439.0" - "@material/touch-target" "15.0.0-canary.a246a4439.0" - "@material/typography" "15.0.0-canary.a246a4439.0" +"@material/chips@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/chips/-/chips-15.0.0-canary.7f224ddd4.0.tgz#e5f44ba72100188e49075fc701d187ef3e75ba82" + integrity sha512-AYAivV3GSk/T/nRIpH27sOHFPaSMrE3L0WYbnb5Wa93FgY8a0fbsFYtSH2QmtwnzXveg+B1zGTt7/xIIcynKdQ== + dependencies: + "@material/animation" "15.0.0-canary.7f224ddd4.0" + "@material/base" "15.0.0-canary.7f224ddd4.0" + "@material/checkbox" "15.0.0-canary.7f224ddd4.0" + "@material/density" "15.0.0-canary.7f224ddd4.0" + "@material/dom" "15.0.0-canary.7f224ddd4.0" + "@material/elevation" "15.0.0-canary.7f224ddd4.0" + "@material/feature-targeting" "15.0.0-canary.7f224ddd4.0" + "@material/focus-ring" "15.0.0-canary.7f224ddd4.0" + "@material/ripple" "15.0.0-canary.7f224ddd4.0" + "@material/rtl" "15.0.0-canary.7f224ddd4.0" + "@material/shape" "15.0.0-canary.7f224ddd4.0" + "@material/theme" "15.0.0-canary.7f224ddd4.0" + "@material/tokens" "15.0.0-canary.7f224ddd4.0" + "@material/touch-target" "15.0.0-canary.7f224ddd4.0" + "@material/typography" "15.0.0-canary.7f224ddd4.0" safevalues "^0.3.4" tslib "^2.1.0" -"@material/circular-progress@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/circular-progress/-/circular-progress-15.0.0-canary.a246a4439.0.tgz#c5d850525d69852526925db21d40c05de516685a" - integrity sha512-+QTfyExPWzgm2tqMInd32qQOftsC1b8MUhAhZSfuecYBfqAc7KZkQEKa2nm4y8EHKMFWe8/DcxLV6IxMBLgHwA== - dependencies: - "@material/animation" "15.0.0-canary.a246a4439.0" - "@material/base" "15.0.0-canary.a246a4439.0" - "@material/dom" "15.0.0-canary.a246a4439.0" - "@material/feature-targeting" "15.0.0-canary.a246a4439.0" - "@material/progress-indicator" "15.0.0-canary.a246a4439.0" - "@material/rtl" "15.0.0-canary.a246a4439.0" - "@material/theme" "15.0.0-canary.a246a4439.0" +"@material/circular-progress@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/circular-progress/-/circular-progress-15.0.0-canary.7f224ddd4.0.tgz#0ee8de2cc989007a6029e60f6c7fb36af222a0ac" + integrity sha512-DJrqCKb+LuGtjNvKl8XigvyK02y36GRkfhMUYTcJEi3PrOE00bwXtyj7ilhzEVshQiXg6AHGWXtf5UqwNrx3Ow== + dependencies: + "@material/animation" "15.0.0-canary.7f224ddd4.0" + "@material/base" "15.0.0-canary.7f224ddd4.0" + "@material/dom" "15.0.0-canary.7f224ddd4.0" + "@material/feature-targeting" "15.0.0-canary.7f224ddd4.0" + "@material/progress-indicator" "15.0.0-canary.7f224ddd4.0" + "@material/rtl" "15.0.0-canary.7f224ddd4.0" + "@material/theme" "15.0.0-canary.7f224ddd4.0" tslib "^2.1.0" -"@material/data-table@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/data-table/-/data-table-15.0.0-canary.a246a4439.0.tgz#f0bc21c00b19ae2a1e93cb51de975c7d6c17ca76" - integrity sha512-89qVOjR7gqby6fsmh7tKj29SjQ2sGLXu2IzCeX3Vni4mz+xxo5dv11jxYNADvdgJDfhyDJFPh1FlqAH7O09nFA== - dependencies: - "@material/animation" "15.0.0-canary.a246a4439.0" - "@material/base" "15.0.0-canary.a246a4439.0" - "@material/checkbox" "15.0.0-canary.a246a4439.0" - "@material/density" "15.0.0-canary.a246a4439.0" - "@material/dom" "15.0.0-canary.a246a4439.0" - "@material/elevation" "15.0.0-canary.a246a4439.0" - "@material/feature-targeting" "15.0.0-canary.a246a4439.0" - "@material/icon-button" "15.0.0-canary.a246a4439.0" - "@material/linear-progress" "15.0.0-canary.a246a4439.0" - "@material/list" "15.0.0-canary.a246a4439.0" - "@material/menu" "15.0.0-canary.a246a4439.0" - "@material/rtl" "15.0.0-canary.a246a4439.0" - "@material/select" "15.0.0-canary.a246a4439.0" - "@material/shape" "15.0.0-canary.a246a4439.0" - "@material/theme" "15.0.0-canary.a246a4439.0" - "@material/tokens" "15.0.0-canary.a246a4439.0" - "@material/touch-target" "15.0.0-canary.a246a4439.0" - "@material/typography" "15.0.0-canary.a246a4439.0" +"@material/data-table@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/data-table/-/data-table-15.0.0-canary.7f224ddd4.0.tgz#fc5417a3e476896e92b8ada4804ef82d373831fa" + integrity sha512-/2WZsuBIq9z9RWYF5Jo6b7P6u0fwit+29/mN7rmAZ6akqUR54nXyNfoSNiyydMkzPlZZsep5KrSHododDhBZbA== + dependencies: + "@material/animation" "15.0.0-canary.7f224ddd4.0" + "@material/base" "15.0.0-canary.7f224ddd4.0" + "@material/checkbox" "15.0.0-canary.7f224ddd4.0" + "@material/density" "15.0.0-canary.7f224ddd4.0" + "@material/dom" "15.0.0-canary.7f224ddd4.0" + "@material/elevation" "15.0.0-canary.7f224ddd4.0" + "@material/feature-targeting" "15.0.0-canary.7f224ddd4.0" + "@material/icon-button" "15.0.0-canary.7f224ddd4.0" + "@material/linear-progress" "15.0.0-canary.7f224ddd4.0" + "@material/list" "15.0.0-canary.7f224ddd4.0" + "@material/menu" "15.0.0-canary.7f224ddd4.0" + "@material/rtl" "15.0.0-canary.7f224ddd4.0" + "@material/select" "15.0.0-canary.7f224ddd4.0" + "@material/shape" "15.0.0-canary.7f224ddd4.0" + "@material/theme" "15.0.0-canary.7f224ddd4.0" + "@material/tokens" "15.0.0-canary.7f224ddd4.0" + "@material/touch-target" "15.0.0-canary.7f224ddd4.0" + "@material/typography" "15.0.0-canary.7f224ddd4.0" tslib "^2.1.0" -"@material/density@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/density/-/density-15.0.0-canary.a246a4439.0.tgz#459282080188a6fc056ba903c5a156599c2e5813" - integrity sha512-h8BJVCWkPR97WeWCN6/atVbSOP8J4+ZbbssidcwsnX7b3+3IaWdtBxGii25dsILX8pUVwwqxVis24y211b+8rg== +"@material/density@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/density/-/density-15.0.0-canary.7f224ddd4.0.tgz#3fd8625b734597556c2bf18362a709485b4d1899" + integrity sha512-o9EXmGKVpiQ6mHhyV3oDDzc78Ow3E7v8dlaOhgaDSXgmqaE8v5sIlLNa/LKSyUga83/fpGk3QViSGXotpQx0jA== dependencies: tslib "^2.1.0" -"@material/dialog@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/dialog/-/dialog-15.0.0-canary.a246a4439.0.tgz#3f89a19028edd942804dcb66945ae6024357b6a4" - integrity sha512-4lyxd+5ccOEMUGKzZcssaYyzkCsYTpYCSQSANR0toQPLv3voDwKMfA709uZI6+nL7Re6Xdf7jx8qe+QpTTjVcw== - dependencies: - "@material/animation" "15.0.0-canary.a246a4439.0" - "@material/base" "15.0.0-canary.a246a4439.0" - "@material/button" "15.0.0-canary.a246a4439.0" - "@material/dom" "15.0.0-canary.a246a4439.0" - "@material/elevation" "15.0.0-canary.a246a4439.0" - "@material/feature-targeting" "15.0.0-canary.a246a4439.0" - "@material/icon-button" "15.0.0-canary.a246a4439.0" - "@material/ripple" "15.0.0-canary.a246a4439.0" - "@material/rtl" "15.0.0-canary.a246a4439.0" - "@material/shape" "15.0.0-canary.a246a4439.0" - "@material/theme" "15.0.0-canary.a246a4439.0" - "@material/tokens" "15.0.0-canary.a246a4439.0" - "@material/touch-target" "15.0.0-canary.a246a4439.0" - "@material/typography" "15.0.0-canary.a246a4439.0" +"@material/dialog@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/dialog/-/dialog-15.0.0-canary.7f224ddd4.0.tgz#13b414c6afa6e015845d1bbf09337d8eb1270465" + integrity sha512-u0XpTlv1JqWC/bQ3DavJ1JguofTelLT2wloj59l3/1b60jv42JQ6Am7jU3I8/SIUB1MKaW7dYocXjDWtWJakLA== + dependencies: + "@material/animation" "15.0.0-canary.7f224ddd4.0" + "@material/base" "15.0.0-canary.7f224ddd4.0" + "@material/button" "15.0.0-canary.7f224ddd4.0" + "@material/dom" "15.0.0-canary.7f224ddd4.0" + "@material/elevation" "15.0.0-canary.7f224ddd4.0" + "@material/feature-targeting" "15.0.0-canary.7f224ddd4.0" + "@material/icon-button" "15.0.0-canary.7f224ddd4.0" + "@material/ripple" "15.0.0-canary.7f224ddd4.0" + "@material/rtl" "15.0.0-canary.7f224ddd4.0" + "@material/shape" "15.0.0-canary.7f224ddd4.0" + "@material/theme" "15.0.0-canary.7f224ddd4.0" + "@material/tokens" "15.0.0-canary.7f224ddd4.0" + "@material/touch-target" "15.0.0-canary.7f224ddd4.0" + "@material/typography" "15.0.0-canary.7f224ddd4.0" tslib "^2.1.0" -"@material/dom@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/dom/-/dom-15.0.0-canary.a246a4439.0.tgz#040dbc4c2e75ed99cfc4a51e0e5ce75851dd304b" - integrity sha512-AftSOGQoQg/Ys2kOVjZzvqWmsnhg3Kam/2UC4Gj0DMMCu36J4MAoD+3PpnOd1aG3wiJKtUXR2vPIwE8I/PM9yg== +"@material/dom@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/dom/-/dom-15.0.0-canary.7f224ddd4.0.tgz#4650cdc01439d033073bca09bbe94e5cbdc1a70e" + integrity sha512-mQ1HT186GPQSkRg5S18i70typ5ZytfjL09R0gJ2Qg5/G+MLCGi7TAjZZSH65tuD/QGOjel4rDdWOTmYbPYV6HA== dependencies: - "@material/feature-targeting" "15.0.0-canary.a246a4439.0" - "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.7f224ddd4.0" + "@material/rtl" "15.0.0-canary.7f224ddd4.0" tslib "^2.1.0" -"@material/drawer@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/drawer/-/drawer-15.0.0-canary.a246a4439.0.tgz#791e4b776049efc7294a0a9a761c009f0f65fc88" - integrity sha512-/JUmbzRBaikdbZ250yA9ZTPqp2W5nGvvuHYoNVAAmtOmxuwGvvNNpWiVZy2lIYeYcf1hA7hJ5mEQxs0aSD7iWQ== - dependencies: - "@material/animation" "15.0.0-canary.a246a4439.0" - "@material/base" "15.0.0-canary.a246a4439.0" - "@material/dom" "15.0.0-canary.a246a4439.0" - "@material/elevation" "15.0.0-canary.a246a4439.0" - "@material/feature-targeting" "15.0.0-canary.a246a4439.0" - "@material/list" "15.0.0-canary.a246a4439.0" - "@material/ripple" "15.0.0-canary.a246a4439.0" - "@material/rtl" "15.0.0-canary.a246a4439.0" - "@material/shape" "15.0.0-canary.a246a4439.0" - "@material/theme" "15.0.0-canary.a246a4439.0" - "@material/typography" "15.0.0-canary.a246a4439.0" +"@material/drawer@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/drawer/-/drawer-15.0.0-canary.7f224ddd4.0.tgz#089efcc9ba1622c6f6acb5e292f2edd9b2482558" + integrity sha512-qyO0W0KBftfH8dlLR0gVAgv7ZHNvU8ae11Ao6zJif/YxcvK4+gph1z8AO4H410YmC2kZiwpSKyxM1iQCCzbb4g== + dependencies: + "@material/animation" "15.0.0-canary.7f224ddd4.0" + "@material/base" "15.0.0-canary.7f224ddd4.0" + "@material/dom" "15.0.0-canary.7f224ddd4.0" + "@material/elevation" "15.0.0-canary.7f224ddd4.0" + "@material/feature-targeting" "15.0.0-canary.7f224ddd4.0" + "@material/list" "15.0.0-canary.7f224ddd4.0" + "@material/ripple" "15.0.0-canary.7f224ddd4.0" + "@material/rtl" "15.0.0-canary.7f224ddd4.0" + "@material/shape" "15.0.0-canary.7f224ddd4.0" + "@material/theme" "15.0.0-canary.7f224ddd4.0" + "@material/typography" "15.0.0-canary.7f224ddd4.0" tslib "^2.1.0" -"@material/elevation@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/elevation/-/elevation-15.0.0-canary.a246a4439.0.tgz#1d41b571cd655947b5dcc6a0cb53e114bf9d39a1" - integrity sha512-lwPIOb8fHyOljIWYcVLPT73dPIEOKat/CXu6gqYIVMQgZQIksQNUA7z1O3l7apkRSuYUOYSXqrgU7AnWP4KcJg== +"@material/elevation@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/elevation/-/elevation-15.0.0-canary.7f224ddd4.0.tgz#b8fdde1b096dd8352440fc7a616c137d18e9c687" + integrity sha512-tV6s4/pUBECedaI36Yj18KmRCk1vfue/JP/5yYRlFNnLMRVISePbZaKkn/BHXVf+26I3W879+XqIGlDVdmOoMA== dependencies: - "@material/animation" "15.0.0-canary.a246a4439.0" - "@material/base" "15.0.0-canary.a246a4439.0" - "@material/feature-targeting" "15.0.0-canary.a246a4439.0" - "@material/rtl" "15.0.0-canary.a246a4439.0" - "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/animation" "15.0.0-canary.7f224ddd4.0" + "@material/base" "15.0.0-canary.7f224ddd4.0" + "@material/feature-targeting" "15.0.0-canary.7f224ddd4.0" + "@material/rtl" "15.0.0-canary.7f224ddd4.0" + "@material/theme" "15.0.0-canary.7f224ddd4.0" tslib "^2.1.0" -"@material/fab@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/fab/-/fab-15.0.0-canary.a246a4439.0.tgz#f37666a4f40b80a79e36f2b2e369a5f4b792bd85" - integrity sha512-XUex3FNqxPD1i/4jITucB/RWTNkkdv52mbNmwrvbuThZlhuhyH9GzOQYTDop/b2783TPcv++xr8UUbuh8GWYzA== - dependencies: - "@material/animation" "15.0.0-canary.a246a4439.0" - "@material/dom" "15.0.0-canary.a246a4439.0" - "@material/elevation" "15.0.0-canary.a246a4439.0" - "@material/feature-targeting" "15.0.0-canary.a246a4439.0" - "@material/focus-ring" "15.0.0-canary.a246a4439.0" - "@material/ripple" "15.0.0-canary.a246a4439.0" - "@material/rtl" "15.0.0-canary.a246a4439.0" - "@material/shape" "15.0.0-canary.a246a4439.0" - "@material/theme" "15.0.0-canary.a246a4439.0" - "@material/tokens" "15.0.0-canary.a246a4439.0" - "@material/touch-target" "15.0.0-canary.a246a4439.0" - "@material/typography" "15.0.0-canary.a246a4439.0" +"@material/fab@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/fab/-/fab-15.0.0-canary.7f224ddd4.0.tgz#e99acd7dc990e81ccb0deb834e6b6c3bd1747ea8" + integrity sha512-4h76QrzfZTcPdd+awDPZ4Q0YdSqsXQnS540TPtyXUJ/5G99V6VwGpjMPIxAsW0y+pmI9UkLL/srrMaJec+7r4Q== + dependencies: + "@material/animation" "15.0.0-canary.7f224ddd4.0" + "@material/dom" "15.0.0-canary.7f224ddd4.0" + "@material/elevation" "15.0.0-canary.7f224ddd4.0" + "@material/feature-targeting" "15.0.0-canary.7f224ddd4.0" + "@material/focus-ring" "15.0.0-canary.7f224ddd4.0" + "@material/ripple" "15.0.0-canary.7f224ddd4.0" + "@material/rtl" "15.0.0-canary.7f224ddd4.0" + "@material/shape" "15.0.0-canary.7f224ddd4.0" + "@material/theme" "15.0.0-canary.7f224ddd4.0" + "@material/tokens" "15.0.0-canary.7f224ddd4.0" + "@material/touch-target" "15.0.0-canary.7f224ddd4.0" + "@material/typography" "15.0.0-canary.7f224ddd4.0" tslib "^2.1.0" -"@material/feature-targeting@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/feature-targeting/-/feature-targeting-15.0.0-canary.a246a4439.0.tgz#ea6410861bc847f8315b163333147d7d7c82782b" - integrity sha512-/SU9X5y8CRp6RS9qnjnM/N5qfsJ8bYILpR841eZmN6DLqMupaM9Yy7Mx8+v/QvpBLLhk+jmu79nFzwkwW54d6Q== +"@material/feature-targeting@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/feature-targeting/-/feature-targeting-15.0.0-canary.7f224ddd4.0.tgz#bb1a326dad1cfd113459d7cb0096c0ab7ce0c951" + integrity sha512-SAjtxYh6YlKZriU83diDEQ7jNSP2MnxKsER0TvFeyG1vX/DWsUyYDOIJTOEa9K1N+fgJEBkNK8hY55QhQaspew== dependencies: tslib "^2.1.0" -"@material/floating-label@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/floating-label/-/floating-label-15.0.0-canary.a246a4439.0.tgz#6156b0192ac95c61dea705c4c1c6305be84acc22" - integrity sha512-832qZ/qxKx0KUatoeVY3Q2NmboVgiWBG0/1VsbJyodHrgQWfnBOHgLE+M322o6uM3OhvO+kWm4iYbvwhmLZGsw== - dependencies: - "@material/animation" "15.0.0-canary.a246a4439.0" - "@material/base" "15.0.0-canary.a246a4439.0" - "@material/dom" "15.0.0-canary.a246a4439.0" - "@material/feature-targeting" "15.0.0-canary.a246a4439.0" - "@material/rtl" "15.0.0-canary.a246a4439.0" - "@material/theme" "15.0.0-canary.a246a4439.0" - "@material/typography" "15.0.0-canary.a246a4439.0" +"@material/floating-label@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/floating-label/-/floating-label-15.0.0-canary.7f224ddd4.0.tgz#c47c9df4424bfdcb824ba91096b130bc574c7127" + integrity sha512-0KMo5ijjYaEHPiZ2pCVIcbaTS2LycvH9zEhEMKwPPGssBCX7iz5ffYQFk7e5yrQand1r3jnQQgYfHAwtykArnQ== + dependencies: + "@material/animation" "15.0.0-canary.7f224ddd4.0" + "@material/base" "15.0.0-canary.7f224ddd4.0" + "@material/dom" "15.0.0-canary.7f224ddd4.0" + "@material/feature-targeting" "15.0.0-canary.7f224ddd4.0" + "@material/rtl" "15.0.0-canary.7f224ddd4.0" + "@material/theme" "15.0.0-canary.7f224ddd4.0" + "@material/typography" "15.0.0-canary.7f224ddd4.0" tslib "^2.1.0" -"@material/focus-ring@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/focus-ring/-/focus-ring-15.0.0-canary.a246a4439.0.tgz#b4aad6f3eb8f3eef07da1f3302e291c02b3a992f" - integrity sha512-ar0BtACFS3K14k/enAg0ePeEA/f/RJY4Ji4L/00Dw/B3XVpNRbqLH49jkcbtcQjdTS0FEyk2sWSNMZl6wVi0/A== - dependencies: - "@material/dom" "15.0.0-canary.a246a4439.0" - "@material/feature-targeting" "15.0.0-canary.a246a4439.0" - "@material/rtl" "15.0.0-canary.a246a4439.0" - -"@material/form-field@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/form-field/-/form-field-15.0.0-canary.a246a4439.0.tgz#a3f4deccba0dafa0eefa7c82b9f9b21bec871607" - integrity sha512-Q/+ErgtAUFUPPUmWA1m5IP5voiN8XjPRwyoAlFxSTa/4t+EA5B18Z8Bsn9b6I0AC8RHke06H7UWrKz8XUDIFpw== - dependencies: - "@material/base" "15.0.0-canary.a246a4439.0" - "@material/feature-targeting" "15.0.0-canary.a246a4439.0" - "@material/ripple" "15.0.0-canary.a246a4439.0" - "@material/rtl" "15.0.0-canary.a246a4439.0" - "@material/theme" "15.0.0-canary.a246a4439.0" - "@material/typography" "15.0.0-canary.a246a4439.0" +"@material/focus-ring@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/focus-ring/-/focus-ring-15.0.0-canary.7f224ddd4.0.tgz#b1822b45a99009e9854a9e6c9f013708d159039d" + integrity sha512-Jmg1nltq4J6S6A10EGMZnvufrvU3YTi+8R8ZD9lkSbun0Fm2TVdICQt/Auyi6An9zP66oQN6c31eqO6KfIPsDg== + dependencies: + "@material/dom" "15.0.0-canary.7f224ddd4.0" + "@material/feature-targeting" "15.0.0-canary.7f224ddd4.0" + "@material/rtl" "15.0.0-canary.7f224ddd4.0" + +"@material/form-field@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/form-field/-/form-field-15.0.0-canary.7f224ddd4.0.tgz#0f3c332361ca5e00fdafb9f854cc5cebe445a340" + integrity sha512-fEPWgDQEPJ6WF7hNnIStxucHR9LE4DoDSMqCsGWS2Yu+NLZYLuCEecgR0UqQsl1EQdNRaFh8VH93KuxGd2hiPg== + dependencies: + "@material/base" "15.0.0-canary.7f224ddd4.0" + "@material/feature-targeting" "15.0.0-canary.7f224ddd4.0" + "@material/ripple" "15.0.0-canary.7f224ddd4.0" + "@material/rtl" "15.0.0-canary.7f224ddd4.0" + "@material/theme" "15.0.0-canary.7f224ddd4.0" + "@material/typography" "15.0.0-canary.7f224ddd4.0" tslib "^2.1.0" -"@material/icon-button@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/icon-button/-/icon-button-15.0.0-canary.a246a4439.0.tgz#6d0121dd8ab97b024dcd36eee620b61fe8bbc8a8" - integrity sha512-Igyo94rkIlqC91BR1Tv+WLTz1ZWcZZjl1xU7Vsx8mbWA1PnaRDUTNVV5LFi4e0ORp6GSblFTImpHngEy4agMEg== - dependencies: - "@material/base" "15.0.0-canary.a246a4439.0" - "@material/density" "15.0.0-canary.a246a4439.0" - "@material/dom" "15.0.0-canary.a246a4439.0" - "@material/elevation" "15.0.0-canary.a246a4439.0" - "@material/feature-targeting" "15.0.0-canary.a246a4439.0" - "@material/focus-ring" "15.0.0-canary.a246a4439.0" - "@material/ripple" "15.0.0-canary.a246a4439.0" - "@material/rtl" "15.0.0-canary.a246a4439.0" - "@material/theme" "15.0.0-canary.a246a4439.0" - "@material/touch-target" "15.0.0-canary.a246a4439.0" +"@material/icon-button@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/icon-button/-/icon-button-15.0.0-canary.7f224ddd4.0.tgz#75a31e0b1287f98fba4355554725248340521c04" + integrity sha512-DcK7IL4ICY/DW+48YQZZs9g0U1kRaW0Wb0BxhvppDMYziHo/CTpFdle4gjyuTyRxPOdHQz5a97ru48Z9O4muTw== + dependencies: + "@material/base" "15.0.0-canary.7f224ddd4.0" + "@material/density" "15.0.0-canary.7f224ddd4.0" + "@material/dom" "15.0.0-canary.7f224ddd4.0" + "@material/elevation" "15.0.0-canary.7f224ddd4.0" + "@material/feature-targeting" "15.0.0-canary.7f224ddd4.0" + "@material/focus-ring" "15.0.0-canary.7f224ddd4.0" + "@material/ripple" "15.0.0-canary.7f224ddd4.0" + "@material/rtl" "15.0.0-canary.7f224ddd4.0" + "@material/theme" "15.0.0-canary.7f224ddd4.0" + "@material/touch-target" "15.0.0-canary.7f224ddd4.0" tslib "^2.1.0" -"@material/image-list@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/image-list/-/image-list-15.0.0-canary.a246a4439.0.tgz#ecf3fa191d4e1b1b64050583abb9aa5b08f4e7b7" - integrity sha512-Rcj3q7Tp7Nwbe5ht6ptTc3zqK8TSDJHaPDBf+kzi0kkh6MAB4qoHPgn+HnA+zIZ79CScU56bN7zjA6XYaZvsLw== +"@material/image-list@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/image-list/-/image-list-15.0.0-canary.7f224ddd4.0.tgz#36bb04e6cf16a293dfb850d0fce585b1d2c724c3" + integrity sha512-voMjG2p80XbjL1B2lmF65zO5gEgJOVKClLdqh4wbYzYfwY/SR9c8eLvlYG7DLdFaFBl/7gGxD8TvvZ329HUFPw== dependencies: - "@material/feature-targeting" "15.0.0-canary.a246a4439.0" - "@material/shape" "15.0.0-canary.a246a4439.0" - "@material/theme" "15.0.0-canary.a246a4439.0" - "@material/typography" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.7f224ddd4.0" + "@material/shape" "15.0.0-canary.7f224ddd4.0" + "@material/theme" "15.0.0-canary.7f224ddd4.0" + "@material/typography" "15.0.0-canary.7f224ddd4.0" tslib "^2.1.0" -"@material/layout-grid@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/layout-grid/-/layout-grid-15.0.0-canary.a246a4439.0.tgz#65ad68bab019d92fc047bfd00a8ad2c654ad59f3" - integrity sha512-bkfxZuVzgtjEJgR3n8pvDQbe88ffULDJ5d2DF34IR8SOiRmQcj7UzqAt95XwIUcWlfisLCoIryP4U8XSpFb1EQ== +"@material/layout-grid@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/layout-grid/-/layout-grid-15.0.0-canary.7f224ddd4.0.tgz#656c39a44a715331ce11fe0aea281bc0e6c793aa" + integrity sha512-veDABLxMn2RmvfnUO2RUmC1OFfWr4cU+MrxKPoDD2hl3l3eDYv5fxws6r5T1JoSyXoaN+oEZpheS0+M9Ure8Pg== dependencies: tslib "^2.1.0" -"@material/line-ripple@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/line-ripple/-/line-ripple-15.0.0-canary.a246a4439.0.tgz#b38d7b59507067622825f31e7663301cd18ba240" - integrity sha512-20WmwRrejmtOdI37+959UqEVIjbMtAXlkDOkfCIA3OUhp+oZSjVkCqKxI16jxxVlnzJ353fy8xeSKzOHe4sExQ== +"@material/line-ripple@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/line-ripple/-/line-ripple-15.0.0-canary.7f224ddd4.0.tgz#66487ff758834306180a7449ce4487103bcfe1d8" + integrity sha512-f60hVJhIU6I3/17Tqqzch1emUKEcfVVgHVqADbU14JD+oEIz429ZX9ksZ3VChoU3+eejFl+jVdZMLE/LrAuwpg== dependencies: - "@material/animation" "15.0.0-canary.a246a4439.0" - "@material/base" "15.0.0-canary.a246a4439.0" - "@material/feature-targeting" "15.0.0-canary.a246a4439.0" - "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/animation" "15.0.0-canary.7f224ddd4.0" + "@material/base" "15.0.0-canary.7f224ddd4.0" + "@material/feature-targeting" "15.0.0-canary.7f224ddd4.0" + "@material/theme" "15.0.0-canary.7f224ddd4.0" tslib "^2.1.0" -"@material/linear-progress@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/linear-progress/-/linear-progress-15.0.0-canary.a246a4439.0.tgz#534d36d41e1c05d965fe2b0fe087ca76f15d282c" - integrity sha512-IcCd4476pXHloTYadHDJ+2c2lntoVigeNnQEiD/ASQTKqKrJqkIdvvczFm9Ryu+V2+TKhp7vvQGFLUMaLPcmhw== - dependencies: - "@material/animation" "15.0.0-canary.a246a4439.0" - "@material/base" "15.0.0-canary.a246a4439.0" - "@material/dom" "15.0.0-canary.a246a4439.0" - "@material/feature-targeting" "15.0.0-canary.a246a4439.0" - "@material/progress-indicator" "15.0.0-canary.a246a4439.0" - "@material/rtl" "15.0.0-canary.a246a4439.0" - "@material/theme" "15.0.0-canary.a246a4439.0" +"@material/linear-progress@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/linear-progress/-/linear-progress-15.0.0-canary.7f224ddd4.0.tgz#b18179c6790db14870505e4362184d01ee3b9cb3" + integrity sha512-pRDEwPQielDiC9Sc5XhCXrGxP8wWOnAO8sQlMebfBYHYqy5hhiIzibezS8CSaW4MFQFyXmCmpmqWlbqGYRmiyg== + dependencies: + "@material/animation" "15.0.0-canary.7f224ddd4.0" + "@material/base" "15.0.0-canary.7f224ddd4.0" + "@material/dom" "15.0.0-canary.7f224ddd4.0" + "@material/feature-targeting" "15.0.0-canary.7f224ddd4.0" + "@material/progress-indicator" "15.0.0-canary.7f224ddd4.0" + "@material/rtl" "15.0.0-canary.7f224ddd4.0" + "@material/theme" "15.0.0-canary.7f224ddd4.0" tslib "^2.1.0" -"@material/list@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/list/-/list-15.0.0-canary.a246a4439.0.tgz#530f76da6324f8d4d3b6f9545e1cb53b4dfd2d25" - integrity sha512-4H5dKIjCUGIPmKjfcegV0SBybD5NNdHp26OU6sovvWIvxSGQtDJr6z9I7i+0vF/HIS5ScbHD2+9/txtL80iqCA== - dependencies: - "@material/base" "15.0.0-canary.a246a4439.0" - "@material/density" "15.0.0-canary.a246a4439.0" - "@material/dom" "15.0.0-canary.a246a4439.0" - "@material/feature-targeting" "15.0.0-canary.a246a4439.0" - "@material/ripple" "15.0.0-canary.a246a4439.0" - "@material/rtl" "15.0.0-canary.a246a4439.0" - "@material/shape" "15.0.0-canary.a246a4439.0" - "@material/theme" "15.0.0-canary.a246a4439.0" - "@material/tokens" "15.0.0-canary.a246a4439.0" - "@material/typography" "15.0.0-canary.a246a4439.0" +"@material/list@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/list/-/list-15.0.0-canary.7f224ddd4.0.tgz#e096d903ddbf06dd0177a317953d902133395b5e" + integrity sha512-Is0NV91sJlXF5pOebYAtWLF4wU2MJDbYqztML/zQNENkQxDOvEXu3nWNb3YScMIYJJXvARO0Liur5K4yPagS1Q== + dependencies: + "@material/base" "15.0.0-canary.7f224ddd4.0" + "@material/density" "15.0.0-canary.7f224ddd4.0" + "@material/dom" "15.0.0-canary.7f224ddd4.0" + "@material/feature-targeting" "15.0.0-canary.7f224ddd4.0" + "@material/ripple" "15.0.0-canary.7f224ddd4.0" + "@material/rtl" "15.0.0-canary.7f224ddd4.0" + "@material/shape" "15.0.0-canary.7f224ddd4.0" + "@material/theme" "15.0.0-canary.7f224ddd4.0" + "@material/tokens" "15.0.0-canary.7f224ddd4.0" + "@material/typography" "15.0.0-canary.7f224ddd4.0" tslib "^2.1.0" -"@material/menu-surface@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/menu-surface/-/menu-surface-15.0.0-canary.a246a4439.0.tgz#e03cf761cfe331af3498bcbb5cd1601f83e9849e" - integrity sha512-4h4wZ0Rs7qBg1Otldw8ljp+LCULNL42pqbqcTXhKAkJM7pHcSw4k7IfoThSRLU3+V8T3/+qiAXyeQix2OGHzwg== - dependencies: - "@material/animation" "15.0.0-canary.a246a4439.0" - "@material/base" "15.0.0-canary.a246a4439.0" - "@material/elevation" "15.0.0-canary.a246a4439.0" - "@material/feature-targeting" "15.0.0-canary.a246a4439.0" - "@material/rtl" "15.0.0-canary.a246a4439.0" - "@material/shape" "15.0.0-canary.a246a4439.0" - "@material/theme" "15.0.0-canary.a246a4439.0" +"@material/menu-surface@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/menu-surface/-/menu-surface-15.0.0-canary.7f224ddd4.0.tgz#80678f927beec0ec22e68cb05b9242dc0b99543a" + integrity sha512-7RZHvw0gbwppaAJ/Oh5SWmfAKJ62aw1IMB3+3MRwsb5PLoV666wInYa+zJfE4i7qBeOn904xqT2Nko5hY0ssrg== + dependencies: + "@material/animation" "15.0.0-canary.7f224ddd4.0" + "@material/base" "15.0.0-canary.7f224ddd4.0" + "@material/elevation" "15.0.0-canary.7f224ddd4.0" + "@material/feature-targeting" "15.0.0-canary.7f224ddd4.0" + "@material/rtl" "15.0.0-canary.7f224ddd4.0" + "@material/shape" "15.0.0-canary.7f224ddd4.0" + "@material/theme" "15.0.0-canary.7f224ddd4.0" tslib "^2.1.0" -"@material/menu@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/menu/-/menu-15.0.0-canary.a246a4439.0.tgz#f8725573ff1296c7b1d6539675243a64b96b4957" - integrity sha512-2HOHQAIdWQtXjSvEIrW3lnbcIwFf5XaQhFzCEZ04FcSGApc4iLwsmRFVW3PzWx+mVrUrEfO/K42DVULIX9J1Pg== - dependencies: - "@material/base" "15.0.0-canary.a246a4439.0" - "@material/dom" "15.0.0-canary.a246a4439.0" - "@material/elevation" "15.0.0-canary.a246a4439.0" - "@material/feature-targeting" "15.0.0-canary.a246a4439.0" - "@material/list" "15.0.0-canary.a246a4439.0" - "@material/menu-surface" "15.0.0-canary.a246a4439.0" - "@material/ripple" "15.0.0-canary.a246a4439.0" - "@material/rtl" "15.0.0-canary.a246a4439.0" - "@material/shape" "15.0.0-canary.a246a4439.0" - "@material/theme" "15.0.0-canary.a246a4439.0" - "@material/tokens" "15.0.0-canary.a246a4439.0" +"@material/menu@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/menu/-/menu-15.0.0-canary.7f224ddd4.0.tgz#f7a2fc94640afae6e816a75abf5dfc77d0bf9920" + integrity sha512-D11QU1dXqLbh5X1zKlEhS3QWh0b5BPNXlafc5MXfkdJHhOiieb7LC9hMJhbrHtj24FadJ7evaFW/T2ugJbJNnQ== + dependencies: + "@material/base" "15.0.0-canary.7f224ddd4.0" + "@material/dom" "15.0.0-canary.7f224ddd4.0" + "@material/elevation" "15.0.0-canary.7f224ddd4.0" + "@material/feature-targeting" "15.0.0-canary.7f224ddd4.0" + "@material/list" "15.0.0-canary.7f224ddd4.0" + "@material/menu-surface" "15.0.0-canary.7f224ddd4.0" + "@material/ripple" "15.0.0-canary.7f224ddd4.0" + "@material/rtl" "15.0.0-canary.7f224ddd4.0" + "@material/shape" "15.0.0-canary.7f224ddd4.0" + "@material/theme" "15.0.0-canary.7f224ddd4.0" + "@material/tokens" "15.0.0-canary.7f224ddd4.0" tslib "^2.1.0" -"@material/notched-outline@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/notched-outline/-/notched-outline-15.0.0-canary.a246a4439.0.tgz#4d183b37014a3aacf961ee9630848e3b9a530a06" - integrity sha512-zmRZHJ+5cOWsBatRyK50wuht78olXySyKOJIIEmy8lxSMZefI1764u0mr8tS1KYF8vSAl5cUlwCC3/2Njz1FPg== - dependencies: - "@material/base" "15.0.0-canary.a246a4439.0" - "@material/feature-targeting" "15.0.0-canary.a246a4439.0" - "@material/floating-label" "15.0.0-canary.a246a4439.0" - "@material/rtl" "15.0.0-canary.a246a4439.0" - "@material/shape" "15.0.0-canary.a246a4439.0" - "@material/theme" "15.0.0-canary.a246a4439.0" +"@material/notched-outline@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/notched-outline/-/notched-outline-15.0.0-canary.7f224ddd4.0.tgz#d13391d4e211c077980e2fed81d81cc81a6a84fa" + integrity sha512-Yg2usuKB2DKlKIBISbie9BFsOVuffF71xjbxPbybvqemxqUBd+bD5/t6H1fLE+F8/NCu5JMigho4ewUU+0RCiw== + dependencies: + "@material/base" "15.0.0-canary.7f224ddd4.0" + "@material/feature-targeting" "15.0.0-canary.7f224ddd4.0" + "@material/floating-label" "15.0.0-canary.7f224ddd4.0" + "@material/rtl" "15.0.0-canary.7f224ddd4.0" + "@material/shape" "15.0.0-canary.7f224ddd4.0" + "@material/theme" "15.0.0-canary.7f224ddd4.0" tslib "^2.1.0" -"@material/progress-indicator@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/progress-indicator/-/progress-indicator-15.0.0-canary.a246a4439.0.tgz#8b4136e887dbf700fc17f1480eec91ced326c275" - integrity sha512-92HM5niUnqG5Y3M/xkscBD+2lkaWPDcIRPo0RHPYcyldL+EhWRv/sdQpfdiXw/h3uvKSowKxBMCHm8krAyf+sQ== +"@material/progress-indicator@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/progress-indicator/-/progress-indicator-15.0.0-canary.7f224ddd4.0.tgz#6d70bf1ecf406c1da317402021a2970506921077" + integrity sha512-UPbDjE5CqT+SqTs0mNFG6uFEw7wBlgYmh+noSkQ6ty/EURm8lF125dmi4dv4kW0+octonMXqkGtAoZwLIHKf/w== dependencies: tslib "^2.1.0" -"@material/radio@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/radio/-/radio-15.0.0-canary.a246a4439.0.tgz#3fe24387017bf312b0092eec65ccc2c531b10ca5" - integrity sha512-on8EVztWXc/ajcaowFZ31ClGADYxQrhj4ulMne0NxdHHWQ44ttf5aXOVqtv5mxeOzrRACOkQyTUXBG07yTWCEQ== - dependencies: - "@material/animation" "15.0.0-canary.a246a4439.0" - "@material/base" "15.0.0-canary.a246a4439.0" - "@material/density" "15.0.0-canary.a246a4439.0" - "@material/dom" "15.0.0-canary.a246a4439.0" - "@material/feature-targeting" "15.0.0-canary.a246a4439.0" - "@material/focus-ring" "15.0.0-canary.a246a4439.0" - "@material/ripple" "15.0.0-canary.a246a4439.0" - "@material/theme" "15.0.0-canary.a246a4439.0" - "@material/touch-target" "15.0.0-canary.a246a4439.0" +"@material/radio@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/radio/-/radio-15.0.0-canary.7f224ddd4.0.tgz#57834ac2d3441d1036041a94fe00b80c44d26b56" + integrity sha512-wR1X0Sr0KmQLu6+YOFKAI84G3L6psqd7Kys5kfb8WKBM36zxO5HQXC5nJm/Y0rdn22ixzsIz2GBo0MNU4V4k1A== + dependencies: + "@material/animation" "15.0.0-canary.7f224ddd4.0" + "@material/base" "15.0.0-canary.7f224ddd4.0" + "@material/density" "15.0.0-canary.7f224ddd4.0" + "@material/dom" "15.0.0-canary.7f224ddd4.0" + "@material/feature-targeting" "15.0.0-canary.7f224ddd4.0" + "@material/focus-ring" "15.0.0-canary.7f224ddd4.0" + "@material/ripple" "15.0.0-canary.7f224ddd4.0" + "@material/theme" "15.0.0-canary.7f224ddd4.0" + "@material/touch-target" "15.0.0-canary.7f224ddd4.0" tslib "^2.1.0" -"@material/ripple@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/ripple/-/ripple-15.0.0-canary.a246a4439.0.tgz#cc280802f29d9e230c2460f790f2adf90fe354a4" - integrity sha512-Vl615/PIBpBD+IOI9Xypz0SV3RsmYJYSNx890Rih7irhUOaPsOUBmTYOWF5AsGBynqLcXoTNVhK92drYLKtJwQ== - dependencies: - "@material/animation" "15.0.0-canary.a246a4439.0" - "@material/base" "15.0.0-canary.a246a4439.0" - "@material/dom" "15.0.0-canary.a246a4439.0" - "@material/feature-targeting" "15.0.0-canary.a246a4439.0" - "@material/rtl" "15.0.0-canary.a246a4439.0" - "@material/theme" "15.0.0-canary.a246a4439.0" +"@material/ripple@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/ripple/-/ripple-15.0.0-canary.7f224ddd4.0.tgz#5ce82710d337314f343d0b80e39f33a109e42801" + integrity sha512-JqOsWM1f4aGdotP0rh1vZlPZTg6lZgh39FIYHFMfOwfhR+LAikUJ+37ciqZuewgzXB6iiRO6a8aUH6HR5SJYPg== + dependencies: + "@material/animation" "15.0.0-canary.7f224ddd4.0" + "@material/base" "15.0.0-canary.7f224ddd4.0" + "@material/dom" "15.0.0-canary.7f224ddd4.0" + "@material/feature-targeting" "15.0.0-canary.7f224ddd4.0" + "@material/rtl" "15.0.0-canary.7f224ddd4.0" + "@material/theme" "15.0.0-canary.7f224ddd4.0" tslib "^2.1.0" -"@material/rtl@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/rtl/-/rtl-15.0.0-canary.a246a4439.0.tgz#31ef4971ad1b82c791acf62b412206e093048351" - integrity sha512-pgJFw8ZRpWGpwv7ZuBTJ+WdNmFBKoLVoMbbxKQWTHXVwhAqn3aoIq95o62T5QeEG/+sguNShdquG45CpAMmSRw== +"@material/rtl@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/rtl/-/rtl-15.0.0-canary.7f224ddd4.0.tgz#25cf5447c2f59eea80bdb83a71ab19f15ff32e3d" + integrity sha512-UVf14qAtmPiaaZjuJtmN36HETyoKWmsZM/qn1L5ciR2URb8O035dFWnz4ZWFMmAYBno/L7JiZaCkPurv2ZNrGA== dependencies: - "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.7f224ddd4.0" tslib "^2.1.0" -"@material/segmented-button@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/segmented-button/-/segmented-button-15.0.0-canary.a246a4439.0.tgz#cdd13b33901c20459105c3120b0d3e02380fe930" - integrity sha512-oqGHs2C7C+yJW/xZf/wP8jBGLs6HcerhM3CsorLAEMH3MGuIlVC17WcisBewEWucsILYEWbySXy/7T4h6/psZA== - dependencies: - "@material/base" "15.0.0-canary.a246a4439.0" - "@material/elevation" "15.0.0-canary.a246a4439.0" - "@material/feature-targeting" "15.0.0-canary.a246a4439.0" - "@material/ripple" "15.0.0-canary.a246a4439.0" - "@material/theme" "15.0.0-canary.a246a4439.0" - "@material/touch-target" "15.0.0-canary.a246a4439.0" - "@material/typography" "15.0.0-canary.a246a4439.0" +"@material/segmented-button@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/segmented-button/-/segmented-button-15.0.0-canary.7f224ddd4.0.tgz#c36ca64ea8dfeb73bfdfdddb08b436e6c29f7071" + integrity sha512-LCnVRUSAhELTKI/9hSvyvIvQIpPpqF29BV+O9yM4WoNNmNWqTulvuiv7grHZl6Z+kJuxSg4BGbsPxxb9dXozPg== + dependencies: + "@material/base" "15.0.0-canary.7f224ddd4.0" + "@material/elevation" "15.0.0-canary.7f224ddd4.0" + "@material/feature-targeting" "15.0.0-canary.7f224ddd4.0" + "@material/ripple" "15.0.0-canary.7f224ddd4.0" + "@material/theme" "15.0.0-canary.7f224ddd4.0" + "@material/touch-target" "15.0.0-canary.7f224ddd4.0" + "@material/typography" "15.0.0-canary.7f224ddd4.0" tslib "^2.1.0" -"@material/select@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/select/-/select-15.0.0-canary.a246a4439.0.tgz#0a480c12a09b9fb5e99da94ad5a9aa0c5d26a805" - integrity sha512-odoNLiVOgdwbEeePkjHtlr43pjskDwyO8hi4z3jcud1Rg1czk5zoJ2mUI0+olOJjBQ26PGocwrSLqf3qaThbIA== - dependencies: - "@material/animation" "15.0.0-canary.a246a4439.0" - "@material/base" "15.0.0-canary.a246a4439.0" - "@material/density" "15.0.0-canary.a246a4439.0" - "@material/dom" "15.0.0-canary.a246a4439.0" - "@material/elevation" "15.0.0-canary.a246a4439.0" - "@material/feature-targeting" "15.0.0-canary.a246a4439.0" - "@material/floating-label" "15.0.0-canary.a246a4439.0" - "@material/line-ripple" "15.0.0-canary.a246a4439.0" - "@material/list" "15.0.0-canary.a246a4439.0" - "@material/menu" "15.0.0-canary.a246a4439.0" - "@material/menu-surface" "15.0.0-canary.a246a4439.0" - "@material/notched-outline" "15.0.0-canary.a246a4439.0" - "@material/ripple" "15.0.0-canary.a246a4439.0" - "@material/rtl" "15.0.0-canary.a246a4439.0" - "@material/shape" "15.0.0-canary.a246a4439.0" - "@material/theme" "15.0.0-canary.a246a4439.0" - "@material/tokens" "15.0.0-canary.a246a4439.0" - "@material/typography" "15.0.0-canary.a246a4439.0" +"@material/select@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/select/-/select-15.0.0-canary.7f224ddd4.0.tgz#cf7fe97b9e4b47d1a53ee5fa1d21c3fe2245361c" + integrity sha512-WioZtQEXRpglum0cMSzSqocnhsGRr+ZIhvKb3FlaNrTaK8H3Y4QA7rVjv3emRtrLOOjaT6/RiIaUMTo9AGzWQQ== + dependencies: + "@material/animation" "15.0.0-canary.7f224ddd4.0" + "@material/base" "15.0.0-canary.7f224ddd4.0" + "@material/density" "15.0.0-canary.7f224ddd4.0" + "@material/dom" "15.0.0-canary.7f224ddd4.0" + "@material/elevation" "15.0.0-canary.7f224ddd4.0" + "@material/feature-targeting" "15.0.0-canary.7f224ddd4.0" + "@material/floating-label" "15.0.0-canary.7f224ddd4.0" + "@material/line-ripple" "15.0.0-canary.7f224ddd4.0" + "@material/list" "15.0.0-canary.7f224ddd4.0" + "@material/menu" "15.0.0-canary.7f224ddd4.0" + "@material/menu-surface" "15.0.0-canary.7f224ddd4.0" + "@material/notched-outline" "15.0.0-canary.7f224ddd4.0" + "@material/ripple" "15.0.0-canary.7f224ddd4.0" + "@material/rtl" "15.0.0-canary.7f224ddd4.0" + "@material/shape" "15.0.0-canary.7f224ddd4.0" + "@material/theme" "15.0.0-canary.7f224ddd4.0" + "@material/tokens" "15.0.0-canary.7f224ddd4.0" + "@material/typography" "15.0.0-canary.7f224ddd4.0" tslib "^2.1.0" -"@material/shape@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/shape/-/shape-15.0.0-canary.a246a4439.0.tgz#15ea064ada9d057400f9600bad385b49529f407d" - integrity sha512-rcWPlCoHyP79ozeEKk73KWt9WTWdh6R68+n75l08TSTvnWZB5RRTmsI9BMkz55O9OJD/8H8ZsOxBe4x2QXUT7w== +"@material/shape@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/shape/-/shape-15.0.0-canary.7f224ddd4.0.tgz#f4cb9f8f779449b12d69d8a303bab54211db7e52" + integrity sha512-8z8l1W3+cymObunJoRhwFPKZ+FyECfJ4MJykNiaZq7XJFZkV6xNmqAVrrbQj93FtLsECn9g4PjjIomguVn/OEw== dependencies: - "@material/feature-targeting" "15.0.0-canary.a246a4439.0" - "@material/rtl" "15.0.0-canary.a246a4439.0" - "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.7f224ddd4.0" + "@material/rtl" "15.0.0-canary.7f224ddd4.0" + "@material/theme" "15.0.0-canary.7f224ddd4.0" tslib "^2.1.0" -"@material/slider@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/slider/-/slider-15.0.0-canary.a246a4439.0.tgz#ae6506a049ea9b18dc781dec5117a723cad408b0" - integrity sha512-is1BSBpxaXBBv+wSVpe9WGWmWl59yJEeDNubTES2UFD0er3BmA+PdKkL09vvytDnBcbKf77TbxaRiUSGVaKUQA== - dependencies: - "@material/animation" "15.0.0-canary.a246a4439.0" - "@material/base" "15.0.0-canary.a246a4439.0" - "@material/dom" "15.0.0-canary.a246a4439.0" - "@material/elevation" "15.0.0-canary.a246a4439.0" - "@material/feature-targeting" "15.0.0-canary.a246a4439.0" - "@material/ripple" "15.0.0-canary.a246a4439.0" - "@material/rtl" "15.0.0-canary.a246a4439.0" - "@material/theme" "15.0.0-canary.a246a4439.0" - "@material/tokens" "15.0.0-canary.a246a4439.0" - "@material/typography" "15.0.0-canary.a246a4439.0" +"@material/slider@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/slider/-/slider-15.0.0-canary.7f224ddd4.0.tgz#beba0d242fd110f063422fba40be3850cda01e44" + integrity sha512-QU/WSaSWlLKQRqOhJrPgm29wqvvzRusMqwAcrCh1JTrCl+xwJ43q5WLDfjYhubeKtrEEgGu9tekkAiYfMG7EBw== + dependencies: + "@material/animation" "15.0.0-canary.7f224ddd4.0" + "@material/base" "15.0.0-canary.7f224ddd4.0" + "@material/dom" "15.0.0-canary.7f224ddd4.0" + "@material/elevation" "15.0.0-canary.7f224ddd4.0" + "@material/feature-targeting" "15.0.0-canary.7f224ddd4.0" + "@material/ripple" "15.0.0-canary.7f224ddd4.0" + "@material/rtl" "15.0.0-canary.7f224ddd4.0" + "@material/theme" "15.0.0-canary.7f224ddd4.0" + "@material/tokens" "15.0.0-canary.7f224ddd4.0" + "@material/typography" "15.0.0-canary.7f224ddd4.0" tslib "^2.1.0" -"@material/snackbar@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/snackbar/-/snackbar-15.0.0-canary.a246a4439.0.tgz#201b417a0e0d674d09c68e6b43668c3ad9b18346" - integrity sha512-2NAtC1qozR/uajszZnPy08Ej8HNnpgvCjNCBerDN4SLH2Q0/aWrVrUjqRCp2ayAvsX+szoroGbCboMhaWRzDuQ== - dependencies: - "@material/animation" "15.0.0-canary.a246a4439.0" - "@material/base" "15.0.0-canary.a246a4439.0" - "@material/button" "15.0.0-canary.a246a4439.0" - "@material/dom" "15.0.0-canary.a246a4439.0" - "@material/elevation" "15.0.0-canary.a246a4439.0" - "@material/feature-targeting" "15.0.0-canary.a246a4439.0" - "@material/icon-button" "15.0.0-canary.a246a4439.0" - "@material/ripple" "15.0.0-canary.a246a4439.0" - "@material/rtl" "15.0.0-canary.a246a4439.0" - "@material/shape" "15.0.0-canary.a246a4439.0" - "@material/theme" "15.0.0-canary.a246a4439.0" - "@material/tokens" "15.0.0-canary.a246a4439.0" - "@material/typography" "15.0.0-canary.a246a4439.0" +"@material/snackbar@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/snackbar/-/snackbar-15.0.0-canary.7f224ddd4.0.tgz#55765e8755d031186954fed98c2fb6209e82bce0" + integrity sha512-sm7EbVKddaXpT/aXAYBdPoN0k8yeg9+dprgBUkrdqGzWJAeCkxb4fv2B3He88YiCtvkTz2KLY4CThPQBSEsMFQ== + dependencies: + "@material/animation" "15.0.0-canary.7f224ddd4.0" + "@material/base" "15.0.0-canary.7f224ddd4.0" + "@material/button" "15.0.0-canary.7f224ddd4.0" + "@material/dom" "15.0.0-canary.7f224ddd4.0" + "@material/elevation" "15.0.0-canary.7f224ddd4.0" + "@material/feature-targeting" "15.0.0-canary.7f224ddd4.0" + "@material/icon-button" "15.0.0-canary.7f224ddd4.0" + "@material/ripple" "15.0.0-canary.7f224ddd4.0" + "@material/rtl" "15.0.0-canary.7f224ddd4.0" + "@material/shape" "15.0.0-canary.7f224ddd4.0" + "@material/theme" "15.0.0-canary.7f224ddd4.0" + "@material/tokens" "15.0.0-canary.7f224ddd4.0" + "@material/typography" "15.0.0-canary.7f224ddd4.0" tslib "^2.1.0" -"@material/switch@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/switch/-/switch-15.0.0-canary.a246a4439.0.tgz#3f3c1a1b17a51f971cc6356b7120daac163654c1" - integrity sha512-o0wcbYgm2yRs4een5uxT4RJnJ003DxXe33rk8vTBG2o7cdiSR3X7GJQxeIK3D9wPgWCAwBLhNYSzXrlTL5pkMw== - dependencies: - "@material/animation" "15.0.0-canary.a246a4439.0" - "@material/base" "15.0.0-canary.a246a4439.0" - "@material/density" "15.0.0-canary.a246a4439.0" - "@material/dom" "15.0.0-canary.a246a4439.0" - "@material/elevation" "15.0.0-canary.a246a4439.0" - "@material/feature-targeting" "15.0.0-canary.a246a4439.0" - "@material/focus-ring" "15.0.0-canary.a246a4439.0" - "@material/ripple" "15.0.0-canary.a246a4439.0" - "@material/rtl" "15.0.0-canary.a246a4439.0" - "@material/shape" "15.0.0-canary.a246a4439.0" - "@material/theme" "15.0.0-canary.a246a4439.0" - "@material/tokens" "15.0.0-canary.a246a4439.0" +"@material/switch@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/switch/-/switch-15.0.0-canary.7f224ddd4.0.tgz#71fa2bd8819917dae6991e118aef819d780d690e" + integrity sha512-lEDJfRvkVyyeHWIBfoxYjJVl+WlEAE2kZ/+6OqB1FW0OV8ftTODZGhHRSzjVBA1/p4FPuhAtKtoK9jTpa4AZjA== + dependencies: + "@material/animation" "15.0.0-canary.7f224ddd4.0" + "@material/base" "15.0.0-canary.7f224ddd4.0" + "@material/density" "15.0.0-canary.7f224ddd4.0" + "@material/dom" "15.0.0-canary.7f224ddd4.0" + "@material/elevation" "15.0.0-canary.7f224ddd4.0" + "@material/feature-targeting" "15.0.0-canary.7f224ddd4.0" + "@material/focus-ring" "15.0.0-canary.7f224ddd4.0" + "@material/ripple" "15.0.0-canary.7f224ddd4.0" + "@material/rtl" "15.0.0-canary.7f224ddd4.0" + "@material/shape" "15.0.0-canary.7f224ddd4.0" + "@material/theme" "15.0.0-canary.7f224ddd4.0" + "@material/tokens" "15.0.0-canary.7f224ddd4.0" safevalues "^0.3.4" tslib "^2.1.0" -"@material/tab-bar@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/tab-bar/-/tab-bar-15.0.0-canary.a246a4439.0.tgz#548c79f54c5ad912157eab95d2ede6b96bdd8697" - integrity sha512-dMQb1vXsBchQXcjbwgJZIGqTZHngm+3QGSOSb4LWjqHIgC5+w2RRrHsIAjNTyRhKssJ9nKKrbpM/Yz5vTPWH6w== - dependencies: - "@material/animation" "15.0.0-canary.a246a4439.0" - "@material/base" "15.0.0-canary.a246a4439.0" - "@material/density" "15.0.0-canary.a246a4439.0" - "@material/elevation" "15.0.0-canary.a246a4439.0" - "@material/feature-targeting" "15.0.0-canary.a246a4439.0" - "@material/tab" "15.0.0-canary.a246a4439.0" - "@material/tab-indicator" "15.0.0-canary.a246a4439.0" - "@material/tab-scroller" "15.0.0-canary.a246a4439.0" - "@material/theme" "15.0.0-canary.a246a4439.0" - "@material/tokens" "15.0.0-canary.a246a4439.0" - "@material/typography" "15.0.0-canary.a246a4439.0" +"@material/tab-bar@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/tab-bar/-/tab-bar-15.0.0-canary.7f224ddd4.0.tgz#34fb2585163c4da265ce6ca318e6bf6efd7caf1b" + integrity sha512-p1Asb2NzrcECvAQU3b2SYrpyJGyJLQWR+nXTYzDKE8WOpLIRCXap2audNqD7fvN/A20UJ1J8U01ptrvCkwJ4eA== + dependencies: + "@material/animation" "15.0.0-canary.7f224ddd4.0" + "@material/base" "15.0.0-canary.7f224ddd4.0" + "@material/density" "15.0.0-canary.7f224ddd4.0" + "@material/elevation" "15.0.0-canary.7f224ddd4.0" + "@material/feature-targeting" "15.0.0-canary.7f224ddd4.0" + "@material/tab" "15.0.0-canary.7f224ddd4.0" + "@material/tab-indicator" "15.0.0-canary.7f224ddd4.0" + "@material/tab-scroller" "15.0.0-canary.7f224ddd4.0" + "@material/theme" "15.0.0-canary.7f224ddd4.0" + "@material/tokens" "15.0.0-canary.7f224ddd4.0" + "@material/typography" "15.0.0-canary.7f224ddd4.0" tslib "^2.1.0" -"@material/tab-indicator@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/tab-indicator/-/tab-indicator-15.0.0-canary.a246a4439.0.tgz#ed9a9cf50d7175edf32b94d9a199a75656ed5c58" - integrity sha512-gG2BgHT+ggKnUOaT8LjmH/+9nknRLh8v9qemrhUkDuCtZ8inlaC33OVbbxfrpQW3J+UzBh5YCUSC+2KrN39uUA== +"@material/tab-indicator@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/tab-indicator/-/tab-indicator-15.0.0-canary.7f224ddd4.0.tgz#85f91e23142249d18379cf6415d3b2385ccdee0e" + integrity sha512-h9Td3MPqbs33spcPS7ecByRHraYgU4tNCZpZzZXw31RypjKvISDv/PS5wcA4RmWqNGih78T7xg4QIGsZg4Pk4w== dependencies: - "@material/animation" "15.0.0-canary.a246a4439.0" - "@material/base" "15.0.0-canary.a246a4439.0" - "@material/feature-targeting" "15.0.0-canary.a246a4439.0" - "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/animation" "15.0.0-canary.7f224ddd4.0" + "@material/base" "15.0.0-canary.7f224ddd4.0" + "@material/feature-targeting" "15.0.0-canary.7f224ddd4.0" + "@material/theme" "15.0.0-canary.7f224ddd4.0" tslib "^2.1.0" -"@material/tab-scroller@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/tab-scroller/-/tab-scroller-15.0.0-canary.a246a4439.0.tgz#353927782e309ee1d3b18871b6665a6bca0970d9" - integrity sha512-6KvBpalc4SwLbHFm0rnuIE64VffUj7AKhnPc+mqM6VmxOvDzQ/ZSYga0rWlUfM4mCDFX3ZkSxim+iNzVF+Ejaw== +"@material/tab-scroller@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/tab-scroller/-/tab-scroller-15.0.0-canary.7f224ddd4.0.tgz#f0fc898fc8f3ca293676d04179ed2b1d03cb38a1" + integrity sha512-LFeYNjQpdXecwECd8UaqHYbhscDCwhGln5Yh+3ctvcEgvmDPNjhKn/DL3sWprWvG8NAhP6sHMrsGhQFVdCWtTg== dependencies: - "@material/animation" "15.0.0-canary.a246a4439.0" - "@material/base" "15.0.0-canary.a246a4439.0" - "@material/dom" "15.0.0-canary.a246a4439.0" - "@material/feature-targeting" "15.0.0-canary.a246a4439.0" - "@material/tab" "15.0.0-canary.a246a4439.0" + "@material/animation" "15.0.0-canary.7f224ddd4.0" + "@material/base" "15.0.0-canary.7f224ddd4.0" + "@material/dom" "15.0.0-canary.7f224ddd4.0" + "@material/feature-targeting" "15.0.0-canary.7f224ddd4.0" + "@material/tab" "15.0.0-canary.7f224ddd4.0" tslib "^2.1.0" -"@material/tab@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/tab/-/tab-15.0.0-canary.a246a4439.0.tgz#7b3629d4259006042c846e77e60fa892f86ef999" - integrity sha512-HGLK774uMeLnhbjDJBOjft7S6SurZnKb+6Und88OMDUVUEG6MkFBAKQQr09iBIeLE2sUAiGQhBVQtb7LJKwolQ== - dependencies: - "@material/base" "15.0.0-canary.a246a4439.0" - "@material/elevation" "15.0.0-canary.a246a4439.0" - "@material/feature-targeting" "15.0.0-canary.a246a4439.0" - "@material/focus-ring" "15.0.0-canary.a246a4439.0" - "@material/ripple" "15.0.0-canary.a246a4439.0" - "@material/rtl" "15.0.0-canary.a246a4439.0" - "@material/tab-indicator" "15.0.0-canary.a246a4439.0" - "@material/theme" "15.0.0-canary.a246a4439.0" - "@material/tokens" "15.0.0-canary.a246a4439.0" - "@material/typography" "15.0.0-canary.a246a4439.0" +"@material/tab@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/tab/-/tab-15.0.0-canary.7f224ddd4.0.tgz#77950384cbf0a418dc59352e244c0c3ec0ee83cb" + integrity sha512-E1xGACImyCLurhnizyOTCgOiVezce4HlBFAI6YhJo/AyVwjN2Dtas4ZLQMvvWWqpyhITNkeYdOchwCC1mrz3AQ== + dependencies: + "@material/base" "15.0.0-canary.7f224ddd4.0" + "@material/elevation" "15.0.0-canary.7f224ddd4.0" + "@material/feature-targeting" "15.0.0-canary.7f224ddd4.0" + "@material/focus-ring" "15.0.0-canary.7f224ddd4.0" + "@material/ripple" "15.0.0-canary.7f224ddd4.0" + "@material/rtl" "15.0.0-canary.7f224ddd4.0" + "@material/tab-indicator" "15.0.0-canary.7f224ddd4.0" + "@material/theme" "15.0.0-canary.7f224ddd4.0" + "@material/tokens" "15.0.0-canary.7f224ddd4.0" + "@material/typography" "15.0.0-canary.7f224ddd4.0" tslib "^2.1.0" -"@material/textfield@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/textfield/-/textfield-15.0.0-canary.a246a4439.0.tgz#fa8b5c9ff15d44d98d223b1b658114c72f258591" - integrity sha512-4BW5bUERPlIeiPnLSby21h1/xDmySuAG9Ucn1LM801a0+5mK3IwWb8031AP3filKZZqTx5JJvOJYZd6/OWBJVA== - dependencies: - "@material/animation" "15.0.0-canary.a246a4439.0" - "@material/base" "15.0.0-canary.a246a4439.0" - "@material/density" "15.0.0-canary.a246a4439.0" - "@material/dom" "15.0.0-canary.a246a4439.0" - "@material/feature-targeting" "15.0.0-canary.a246a4439.0" - "@material/floating-label" "15.0.0-canary.a246a4439.0" - "@material/line-ripple" "15.0.0-canary.a246a4439.0" - "@material/notched-outline" "15.0.0-canary.a246a4439.0" - "@material/ripple" "15.0.0-canary.a246a4439.0" - "@material/rtl" "15.0.0-canary.a246a4439.0" - "@material/shape" "15.0.0-canary.a246a4439.0" - "@material/theme" "15.0.0-canary.a246a4439.0" - "@material/tokens" "15.0.0-canary.a246a4439.0" - "@material/typography" "15.0.0-canary.a246a4439.0" +"@material/textfield@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/textfield/-/textfield-15.0.0-canary.7f224ddd4.0.tgz#db502c644180f31afc6060bc5baaafab303d6608" + integrity sha512-AExmFvgE5nNF0UA4l2cSzPghtxSUQeeoyRjFLHLy+oAaE4eKZFrSy0zEpqPeWPQpEMDZk+6Y+6T3cOFYBeSvsw== + dependencies: + "@material/animation" "15.0.0-canary.7f224ddd4.0" + "@material/base" "15.0.0-canary.7f224ddd4.0" + "@material/density" "15.0.0-canary.7f224ddd4.0" + "@material/dom" "15.0.0-canary.7f224ddd4.0" + "@material/feature-targeting" "15.0.0-canary.7f224ddd4.0" + "@material/floating-label" "15.0.0-canary.7f224ddd4.0" + "@material/line-ripple" "15.0.0-canary.7f224ddd4.0" + "@material/notched-outline" "15.0.0-canary.7f224ddd4.0" + "@material/ripple" "15.0.0-canary.7f224ddd4.0" + "@material/rtl" "15.0.0-canary.7f224ddd4.0" + "@material/shape" "15.0.0-canary.7f224ddd4.0" + "@material/theme" "15.0.0-canary.7f224ddd4.0" + "@material/tokens" "15.0.0-canary.7f224ddd4.0" + "@material/typography" "15.0.0-canary.7f224ddd4.0" tslib "^2.1.0" -"@material/theme@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/theme/-/theme-15.0.0-canary.a246a4439.0.tgz#02d6f1ba7a7d6948d25b5f328f0381eb414fd081" - integrity sha512-HWxC5Nhz8JZKTLTVmAsNxIGB3Kzr53+YFMg327S8/XuEDmI0RFHFvtwM9rADmyrHFBmUaVhV4iELyxFdi67c9w== +"@material/theme@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/theme/-/theme-15.0.0-canary.7f224ddd4.0.tgz#7523997eb51a21bffd598aa84fd1e76b7a0bb980" + integrity sha512-hs45hJoE9yVnoVOcsN1jklyOa51U4lzWsEnQEuJTPOk2+0HqCQ0yv/q0InpSnm2i69fNSyZC60+8HADZGF8ugQ== dependencies: - "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.7f224ddd4.0" tslib "^2.1.0" -"@material/tokens@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/tokens/-/tokens-15.0.0-canary.a246a4439.0.tgz#93cf05d49bdbc8b494b21fc3159f1bf9274983fa" - integrity sha512-+5iGfQ51YSb0Qau8uC6/jHXCSC3enKaQKDf/iPHfuXAe04UznW3tmm1/Ju227aZXNISTJcnQYa2rpm1M14MeUg== - dependencies: - "@material/elevation" "15.0.0-canary.a246a4439.0" - -"@material/tooltip@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/tooltip/-/tooltip-15.0.0-canary.a246a4439.0.tgz#96d0818b141f4aa4b58f499ab37c02d29a2b5b6b" - integrity sha512-Ja2Z4aZQkYWD6InXA+MG4M9zdKR6dYsXXlYzQppYpfcQzXylZqh5Y7WBLulG5fA2o83pHVwILfwFZM7j7ht08Q== - dependencies: - "@material/animation" "15.0.0-canary.a246a4439.0" - "@material/base" "15.0.0-canary.a246a4439.0" - "@material/button" "15.0.0-canary.a246a4439.0" - "@material/dom" "15.0.0-canary.a246a4439.0" - "@material/elevation" "15.0.0-canary.a246a4439.0" - "@material/feature-targeting" "15.0.0-canary.a246a4439.0" - "@material/rtl" "15.0.0-canary.a246a4439.0" - "@material/shape" "15.0.0-canary.a246a4439.0" - "@material/theme" "15.0.0-canary.a246a4439.0" - "@material/tokens" "15.0.0-canary.a246a4439.0" - "@material/typography" "15.0.0-canary.a246a4439.0" +"@material/tokens@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/tokens/-/tokens-15.0.0-canary.7f224ddd4.0.tgz#4ae8b300fc3ea5b9a6e53c3257a5aa0efd3442a3" + integrity sha512-r9TDoicmcT7FhUXC4eYMFnt9TZsz0G8T3wXvkKncLppYvZ517gPyD/1+yhuGfGOxAzxTrM66S/oEc1fFE2q4hw== + dependencies: + "@material/elevation" "15.0.0-canary.7f224ddd4.0" + +"@material/tooltip@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/tooltip/-/tooltip-15.0.0-canary.7f224ddd4.0.tgz#78bf4353b426030071944cdef45f1c2a023537f6" + integrity sha512-8qNk3pmPLTnam3XYC1sZuplQXW9xLn4Z4MI3D+U17Q7pfNZfoOugGr+d2cLA9yWAEjVJYB0mj8Yu86+udo4N9w== + dependencies: + "@material/animation" "15.0.0-canary.7f224ddd4.0" + "@material/base" "15.0.0-canary.7f224ddd4.0" + "@material/button" "15.0.0-canary.7f224ddd4.0" + "@material/dom" "15.0.0-canary.7f224ddd4.0" + "@material/elevation" "15.0.0-canary.7f224ddd4.0" + "@material/feature-targeting" "15.0.0-canary.7f224ddd4.0" + "@material/rtl" "15.0.0-canary.7f224ddd4.0" + "@material/shape" "15.0.0-canary.7f224ddd4.0" + "@material/theme" "15.0.0-canary.7f224ddd4.0" + "@material/tokens" "15.0.0-canary.7f224ddd4.0" + "@material/typography" "15.0.0-canary.7f224ddd4.0" safevalues "^0.3.4" tslib "^2.1.0" -"@material/top-app-bar@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/top-app-bar/-/top-app-bar-15.0.0-canary.a246a4439.0.tgz#5ca10581940fec75c0da84bb232dc6bb421a3ab2" - integrity sha512-twQchmCa1In/FFrALPYojgeM8vmV7KH96wRY9NmPSJ046ANgPCicLBgLuSzrLETCFqAwbztqzxSG4xMBL81rYg== - dependencies: - "@material/animation" "15.0.0-canary.a246a4439.0" - "@material/base" "15.0.0-canary.a246a4439.0" - "@material/elevation" "15.0.0-canary.a246a4439.0" - "@material/ripple" "15.0.0-canary.a246a4439.0" - "@material/rtl" "15.0.0-canary.a246a4439.0" - "@material/shape" "15.0.0-canary.a246a4439.0" - "@material/theme" "15.0.0-canary.a246a4439.0" - "@material/typography" "15.0.0-canary.a246a4439.0" +"@material/top-app-bar@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/top-app-bar/-/top-app-bar-15.0.0-canary.7f224ddd4.0.tgz#ac042d558f0763e8e9f8e48504eac7062882f353" + integrity sha512-SARR5/ClYT4CLe9qAXakbr0i0cMY0V3V4pe3ElIJPfL2Z2c4wGR1mTR8m2LxU1MfGKK8aRoUdtfKaxWejp+eNA== + dependencies: + "@material/animation" "15.0.0-canary.7f224ddd4.0" + "@material/base" "15.0.0-canary.7f224ddd4.0" + "@material/elevation" "15.0.0-canary.7f224ddd4.0" + "@material/ripple" "15.0.0-canary.7f224ddd4.0" + "@material/rtl" "15.0.0-canary.7f224ddd4.0" + "@material/shape" "15.0.0-canary.7f224ddd4.0" + "@material/theme" "15.0.0-canary.7f224ddd4.0" + "@material/typography" "15.0.0-canary.7f224ddd4.0" tslib "^2.1.0" -"@material/touch-target@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/touch-target/-/touch-target-15.0.0-canary.a246a4439.0.tgz#1e9d7105ee985fe8b89370e00120d75a3518b78c" - integrity sha512-ubyD1TUjZnRPEdDnk6Lrcm2ZsjnU7CV5y7IX8pj9IPawiM6bx4FkjZBxUvclbv3WiTGk5UOnwPOySYAJYAMQ1w== +"@material/touch-target@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/touch-target/-/touch-target-15.0.0-canary.7f224ddd4.0.tgz#ab80eeec967fa1444dc5d0198c4c826916a9ff86" + integrity sha512-BJo/wFKHPYLGsRaIpd7vsQwKr02LtO2e89Psv0on/p0OephlNIgeB9dD9W+bQmaeZsZ6liKSKRl6wJWDiK71PA== dependencies: - "@material/base" "15.0.0-canary.a246a4439.0" - "@material/feature-targeting" "15.0.0-canary.a246a4439.0" - "@material/rtl" "15.0.0-canary.a246a4439.0" - "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.7f224ddd4.0" + "@material/feature-targeting" "15.0.0-canary.7f224ddd4.0" + "@material/rtl" "15.0.0-canary.7f224ddd4.0" + "@material/theme" "15.0.0-canary.7f224ddd4.0" tslib "^2.1.0" -"@material/typography@15.0.0-canary.a246a4439.0": - version "15.0.0-canary.a246a4439.0" - resolved "https://registry.yarnpkg.com/@material/typography/-/typography-15.0.0-canary.a246a4439.0.tgz#0d1387bc273511534d37cc6784b4ae1c4f70aeaf" - integrity sha512-eXzBl9ROzWZ+41nan5pCrn1C/Zq3o/VsrLFaGv8fdRmhRR6/wHMeuvCCwGf5VtEmWdAE9FpJzRU/4ZPiJCJUyg== +"@material/typography@15.0.0-canary.7f224ddd4.0": + version "15.0.0-canary.7f224ddd4.0" + resolved "https://registry.yarnpkg.com/@material/typography/-/typography-15.0.0-canary.7f224ddd4.0.tgz#1191633c70ad0ee0e162feacb5e6efaf42a52cef" + integrity sha512-kBaZeCGD50iq1DeRRH5OM5Jl7Gdk+/NOfKArkY4ksBZvJiStJ7ACAhpvb8MEGm4s3jvDInQFLsDq3hL+SA79sQ== dependencies: - "@material/feature-targeting" "15.0.0-canary.a246a4439.0" - "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.7f224ddd4.0" + "@material/theme" "15.0.0-canary.7f224ddd4.0" tslib "^2.1.0" "@mdx-js/react@^2.1.5": @@ -4080,14 +4536,6 @@ "@types/mdx" "^2.0.0" "@types/react" ">=16" -"@mrmlnc/readdir-enhanced@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" - integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== - dependencies: - call-me-maybe "^1.0.1" - glob-to-regexp "^0.3.0" - "@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.2": version "3.0.2" resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.2.tgz#44d752c1a2dc113f15f781b7cc4f53a307e3fa38" @@ -4245,10 +4693,10 @@ dependencies: tslib "2.6.1" -"@ngtools/webpack@17.0.7": - version "17.0.7" - resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-17.0.7.tgz#21e457c8ac9645990589df2ed9e536bde58697e6" - integrity sha512-gwhUhpwXn0trwwKdSu9WlJbEcLt+s/2fPwoD9lZ0y3wXfrOogsfcNBJKeO5BZf1h+A3AWt7ePmgrZXSJM+865Q== +"@ngtools/webpack@17.1.3": + version "17.1.3" + resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-17.1.3.tgz#510c5f6f6bf9ae470b0e43d4560cfc4ffc3a5ed5" + integrity sha512-mszRSb7aMNKHnkh3Jrfo83KVOguX/cUamJJcGIYe9o7tnLGRIoMp4vP0fx6Og4J0/CGDRhSDG4IiJ29aOU7K8A== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -4263,11 +4711,6 @@ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== -"@nodelib/fs.stat@^1.1.2": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" - integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== - "@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": version "1.2.8" resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" @@ -4339,98 +4782,98 @@ read-package-json-fast "^3.0.0" which "^4.0.0" -"@nrwl/angular@17.2.8": - version "17.2.8" - resolved "https://registry.yarnpkg.com/@nrwl/angular/-/angular-17.2.8.tgz#5e50fa7d4faac7eabbc41b383129464df2235616" - integrity sha512-hMTKcZDjsnyQojJ33IaCwoPVdFLqTLfCe/e52mn8ecELBSY3/ARZfmUpkSPSZ+261uEHjk0pTfQhu0CF7r2/HQ== +"@nrwl/angular@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nrwl/angular/-/angular-18.0.4.tgz#a231cbe7931d75e3d38de5c086676598d0f87c5c" + integrity sha512-bcwFDzX2f34LZz+RVCp3pbwVQAHzgpWfwCp6I40A3cjDjDpUhPAfZvaQxf5MjpPATlBJVhrh7bJPOJv/Kxat7g== dependencies: - "@nx/angular" "17.2.8" + "@nx/angular" "18.0.4" tslib "^2.3.0" -"@nrwl/cypress@17.2.8": - version "17.2.8" - resolved "https://registry.yarnpkg.com/@nrwl/cypress/-/cypress-17.2.8.tgz#0fcdece62e35ed7a02fc7b92c0dfc9d1743726e7" - integrity sha512-32owq2ybkkKOIeqQ/mkwBzFH4HPukmHEJyJ4v95sUgY8qrnj/Ca89vozdJ6WEvUiqcAb7ebrmp/nqFCz7PIWbg== +"@nrwl/cypress@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nrwl/cypress/-/cypress-18.0.4.tgz#a70aacee9dffe14637840016c3a136e6abe43f05" + integrity sha512-X7ZORP9Xt3lB+7goAb5JcBfVl6FQx8BPNv6TFi9ZiKayUqovgCMPOlmL2BDizsladv+7iacnTZTdo2X/4aunJA== dependencies: - "@nx/cypress" "17.2.8" + "@nx/cypress" "18.0.4" -"@nrwl/devkit@17.2.8": - version "17.2.8" - resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-17.2.8.tgz#dd3467b484c4611454a45541ffb29e4de5b2ebe7" - integrity sha512-l2dFy5LkWqSA45s6pee6CoqJeluH+sjRdVnAAQfjLHRNSx6mFAKblyzq5h1f4P0EUCVVVqLs+kVqmNx5zxYqvw== +"@nrwl/devkit@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-18.0.4.tgz#5135f2f27218ca34d7b93f95f9967f75320ce75a" + integrity sha512-fKHnjg4/9MdFd2U4e8p6ja9fRa864DCyF70kB4YUB9NuUIgWLQ15Uj6wXC3xjdXmxQRyHDa7ORodVoFzdo4UCg== dependencies: - "@nx/devkit" "17.2.8" + "@nx/devkit" "18.0.4" -"@nrwl/eslint-plugin-nx@17.2.8": - version "17.2.8" - resolved "https://registry.yarnpkg.com/@nrwl/eslint-plugin-nx/-/eslint-plugin-nx-17.2.8.tgz#bf3a3c0820eb9a6bf42355ec1012799136595801" - integrity sha512-g76ZzBvJ7jenvLXQuXdBUs7p3KP2vr00u7TV4A/J01eDJMFHYVZhYfQNjLhr4nnE4NvNRr8WdrMD2KeGYtdycQ== +"@nrwl/eslint-plugin-nx@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nrwl/eslint-plugin-nx/-/eslint-plugin-nx-18.0.4.tgz#b9cef2b6f0075a17e93f11f99301b0c44f3e06d3" + integrity sha512-j+5d7+ANY4E7Xn0CUXi+U8DRtv1WKYfI5dxL8JF5EPAfRl7xcX9VVPA9/R5dc/PHXIPeJMIg2CEH1TetH7O6Vw== dependencies: - "@nx/eslint-plugin" "17.2.8" + "@nx/eslint-plugin" "18.0.4" -"@nrwl/jest@17.2.8": - version "17.2.8" - resolved "https://registry.yarnpkg.com/@nrwl/jest/-/jest-17.2.8.tgz#188644e3177c47e1160cb135662b7697bb152467" - integrity sha512-suyAm+5dj03ZevZW0fEZJSn+au1k6+OGPo4LKQ9Y4u/QJW52d2k0nOzrKu79CwkdKP5PFhjnvPP4Oo93RbNNnA== +"@nrwl/jest@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nrwl/jest/-/jest-18.0.4.tgz#7d139d92ff98767ee3556e586d6ebc5ee18d0f4b" + integrity sha512-oe4qfnXc1WUPPmd9ua4mtgiqwXY+2XPz6zSkWghrrvc5wXu15tPvrBxHeU+KEXWu+rVy3iGLU2s5AivdXxEbIA== dependencies: - "@nx/jest" "17.2.8" + "@nx/jest" "18.0.4" -"@nrwl/js@17.2.8": - version "17.2.8" - resolved "https://registry.yarnpkg.com/@nrwl/js/-/js-17.2.8.tgz#d10795206769bd30faaf9e137e971ae402977731" - integrity sha512-ZfTGNSmSBqvEfP8NOfOHcnqKwhXsfqBrN4IhthQR02sqTA9GkrjSfSUtcGXY01fUitsNUDOn6RZjgX6UysDCXg== +"@nrwl/js@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nrwl/js/-/js-18.0.4.tgz#0bb7fa6198037921072f8bc2285f4b6bb25fbb9d" + integrity sha512-7aY6vjHHD99MMF+WtHSdmA7sxLmMNhbd12CQ6lXmSK41Yj82mBgQMwV/Ed+UT10XEh5uMes/iODL460SzwPMZA== dependencies: - "@nx/js" "17.2.8" + "@nx/js" "18.0.4" -"@nrwl/nest@17.2.8": - version "17.2.8" - resolved "https://registry.yarnpkg.com/@nrwl/nest/-/nest-17.2.8.tgz#52ed0729cfece3a763b337e5a00183eb5be9a4ef" - integrity sha512-pj2UNE7XM/7JdKlGhywXOVaCXZE3Fpd7eoZNZc8fBq+pcxvX3ylh4KLmnCwcSaKlcqFsYkWbmj6xDBJx8xSGoA== +"@nrwl/nest@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nrwl/nest/-/nest-18.0.4.tgz#ccf141bb33a4865e6c93450cc225106c5ade1b42" + integrity sha512-tLlHOhV/8fFf5IhYyXekF4y7xVvbM5gK+IGKUTVQKZW2GMSXO3DQmjQyrUEzuEk9O/WAujhXsHURd4fX06+zVg== dependencies: - "@nx/nest" "17.2.8" + "@nx/nest" "18.0.4" -"@nrwl/node@17.2.8": - version "17.2.8" - resolved "https://registry.yarnpkg.com/@nrwl/node/-/node-17.2.8.tgz#f2cd32f92979096698c18a361a598e3a98fbf06f" - integrity sha512-DGwPAasjDgSrNJcB2qcCA7y02licJFCNyiGhEnIhLEUCWOyPCrAsuPmBy4/QYFoiEP6YOsIpJac/1p+9QWeJ7Q== +"@nrwl/node@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nrwl/node/-/node-18.0.4.tgz#c792107bbd0833dc894c52759ab5efaadfbb0377" + integrity sha512-e7kpWUazYmiiFUTdzvOUeSMukolS0TEgfEqFdPjb+L3QaN58KdrsBAiMlY1GVX2VR019nJKBJXGXn6LOYfDxUg== dependencies: - "@nx/node" "17.2.8" + "@nx/node" "18.0.4" -"@nrwl/storybook@17.2.8": - version "17.2.8" - resolved "https://registry.yarnpkg.com/@nrwl/storybook/-/storybook-17.2.8.tgz#7e4f4b5bcf6f19b5dd759c4e729d6443e6b78aa6" - integrity sha512-YBedhVfpylP48lG7VqB7xdiPp5DsEY6aFeabiZC3DQWK+oaMAIOYUKFD6+LiviDoPGpIJCeoJRC0UcnAuaLO7g== +"@nrwl/storybook@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nrwl/storybook/-/storybook-18.0.4.tgz#edf2c7f4722ae99abb03c0240d67f069a7975661" + integrity sha512-s9ksmNGRly34nR6ATexiKGEeu2hGDvwSXCm8EPQ/7zVcwYsRXl9fOa7d5tiI1iz3cuu++iVJvOF8eQT9ODJ7rg== dependencies: - "@nx/storybook" "17.2.8" + "@nx/storybook" "18.0.4" -"@nrwl/tao@17.2.8": - version "17.2.8" - resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-17.2.8.tgz#41ff3d715a0763e95cf5c35e7f79cd3be358dc5f" - integrity sha512-Qpk5YKeJ+LppPL/wtoDyNGbJs2MsTi6qyX/RdRrEc8lc4bk6Cw3Oul1qTXCI6jT0KzTz+dZtd0zYD/G7okkzvg== +"@nrwl/tao@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-18.0.4.tgz#a74933a4c7d1b7c6467a526e9ac524f3b8edd212" + integrity sha512-/PzGOJevlDQnp5RPXF3WDe+w1cdohGkY+mbJUgDVA4Q5JEPT1DtE10h9GgdHdzkPjVPNYsaI4Vs/53NUdlVHHA== dependencies: - nx "17.2.8" + nx "18.0.4" tslib "^2.3.0" -"@nrwl/web@17.2.8": - version "17.2.8" - resolved "https://registry.yarnpkg.com/@nrwl/web/-/web-17.2.8.tgz#5ff1c388a5e26a345d445eb52d8e5474e3d48bd3" - integrity sha512-oBiuSQ7Q6hOXHuZW5Gf8m0gcrLTV78jxhSjmhC5F6yzgvBvnfMpCdrJn7W1G+O+kEg3byko8v+Rz39tfc8YPjg== +"@nrwl/web@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nrwl/web/-/web-18.0.4.tgz#75158c7c7acfe75d4dd47f6097e8df78fb3373d9" + integrity sha512-NJSWj4pH/CWCFj3liOg3ExskfWqynjpGNsPS7zmkM6isbFHRXx7+s+eAVIQJtk5AttKOGeCUkUAaA91SaaTxKg== dependencies: - "@nx/web" "17.2.8" + "@nx/web" "18.0.4" -"@nrwl/webpack@17.2.8": - version "17.2.8" - resolved "https://registry.yarnpkg.com/@nrwl/webpack/-/webpack-17.2.8.tgz#e0d5061c62f6896c6ff0b2b2d4fbda950cc9afa7" - integrity sha512-HcwdfjXVz1NrZZnx1Fv48vleOTlsDAgTRHnQL02xYWT6ElhuKRQsqJGvDduQIFAp4KrnEEhEKEx6oDAEZKUkDg== +"@nrwl/webpack@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nrwl/webpack/-/webpack-18.0.4.tgz#efedbd097eebc27847006175585a0b9c3f40e8bc" + integrity sha512-5GP8leMQHjyvEEflkuOGIDZhZ3kteYME0sKSAmpdD7jMnR9D1OLpRbq0V2WbyhMCCCuC6ae0ihzGZy8n8VhmuQ== dependencies: - "@nx/webpack" "17.2.8" + "@nx/webpack" "18.0.4" -"@nrwl/workspace@17.2.8": - version "17.2.8" - resolved "https://registry.yarnpkg.com/@nrwl/workspace/-/workspace-17.2.8.tgz#79d0c143d38087c3e8ee1401c1f977696e5055cd" - integrity sha512-RiTDTuzdueZ+++kNQAENHdHbYToOhzO56XWxKOGoMEUSpcmbKRAFReFBzNqD91Fnv562vkW1VNRIb6Ey7X1YHQ== +"@nrwl/workspace@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nrwl/workspace/-/workspace-18.0.4.tgz#f1772cee1d3310b25a91d17bf303cc1e255f3e82" + integrity sha512-UFD96NeEeHLKADLBDfF2U5rFOhyMjCwYzpA+D3Yp3X25aB7D89Kan4spq9ZC/Zxethz3911nNaYy+I+L5WlDoA== dependencies: - "@nx/workspace" "17.2.8" + "@nx/workspace" "18.0.4" "@nuxtjs/opencollective@0.3.2": version "0.3.2" @@ -4441,120 +4884,124 @@ consola "^2.15.0" node-fetch "^2.6.1" -"@nx/angular@17.2.8": - version "17.2.8" - resolved "https://registry.yarnpkg.com/@nx/angular/-/angular-17.2.8.tgz#3112e13a4d1f122da6c81faac56d42baa7582fb8" - integrity sha512-vznuo8z9n/xcuZ4j2wv6lg4GT/SGSBQM+dAyG/8GFm34gEato75rhtbjDlsOzZc4gUEBJXRwtuntnfa7pvW88w== - dependencies: - "@nrwl/angular" "17.2.8" - "@nx/cypress" "17.2.8" - "@nx/devkit" "17.2.8" - "@nx/eslint" "17.2.8" - "@nx/jest" "17.2.8" - "@nx/js" "17.2.8" - "@nx/web" "17.2.8" - "@nx/webpack" "17.2.8" - "@nx/workspace" "17.2.8" +"@nx/angular@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nx/angular/-/angular-18.0.4.tgz#b4c9d3a84bf0450554468b648f7237ed44615b21" + integrity sha512-3Mr4/+U/qV7dXrL+68W8bVU+sB4i7eH2GsX4ixNMm5d6qY0/rJdV7OYOSsuL7zVfD5q0Eu2HvgZeA61ADpUx+w== + dependencies: + "@nrwl/angular" "18.0.4" + "@nx/cypress" "18.0.4" + "@nx/devkit" "18.0.4" + "@nx/eslint" "18.0.4" + "@nx/jest" "18.0.4" + "@nx/js" "18.0.4" + "@nx/web" "18.0.4" + "@nx/webpack" "18.0.4" + "@nx/workspace" "18.0.4" "@phenomnomnominal/tsquery" "~5.0.1" "@typescript-eslint/type-utils" "^6.9.1" chalk "^4.1.0" find-cache-dir "^3.3.2" ignore "^5.0.4" magic-string "~0.30.2" - minimatch "3.0.5" - semver "7.5.3" + minimatch "9.0.3" + piscina "^4.2.1" + semver "^7.5.3" tslib "^2.3.0" webpack "^5.80.0" webpack-merge "^5.8.0" -"@nx/cypress@17.2.8": - version "17.2.8" - resolved "https://registry.yarnpkg.com/@nx/cypress/-/cypress-17.2.8.tgz#354fb0b1308499d2580ec270ebfcd565b0ef6f90" - integrity sha512-RjDD2AjDg7D743/+hSgzllLlSi4RwP196Nm0C8ltG5udPK1W+3S0qcERgHgtTuYr6+WVZIMtcZF2Vq09zcbtyg== +"@nx/cypress@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nx/cypress/-/cypress-18.0.4.tgz#7ab91a192bcd09b674a491e4c798dcef29e2b866" + integrity sha512-G/t83/SSYNIor8aGE+u9nNbCrqcsbG4EnhESP0eXwk5k6ycW6eVGMuSlLkRe7debosL/RhGLwcw491alQug7PQ== dependencies: - "@nrwl/cypress" "17.2.8" - "@nx/devkit" "17.2.8" - "@nx/eslint" "17.2.8" - "@nx/js" "17.2.8" + "@nrwl/cypress" "18.0.4" + "@nx/devkit" "18.0.4" + "@nx/eslint" "18.0.4" + "@nx/js" "18.0.4" "@phenomnomnominal/tsquery" "~5.0.1" detect-port "^1.5.1" - semver "7.5.3" + semver "^7.5.3" tslib "^2.3.0" -"@nx/devkit@17.2.8": - version "17.2.8" - resolved "https://registry.yarnpkg.com/@nx/devkit/-/devkit-17.2.8.tgz#49b6c94a3c12fba63eae6514fb37a468d0570e2e" - integrity sha512-6LtiQihtZwqz4hSrtT5cCG5XMCWppG6/B8c1kNksg97JuomELlWyUyVF+sxmeERkcLYFaKPTZytP0L3dmCFXaw== +"@nx/devkit@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nx/devkit/-/devkit-18.0.4.tgz#fec28139ef5d078933c5f1b5a7e0a585672dbdd6" + integrity sha512-Vs1AXgOjMJyaWpKopD04dy0FwQ22n5ZR1bFf98Ab4Ht0WJwJE90IpUVAkwI03n5BYxAKOlQnFltsB4gu6Y8mZQ== dependencies: - "@nrwl/devkit" "17.2.8" + "@nrwl/devkit" "18.0.4" ejs "^3.1.7" enquirer "~2.3.6" ignore "^5.0.4" - semver "7.5.3" + semver "^7.5.3" tmp "~0.2.1" tslib "^2.3.0" + yargs-parser "21.1.1" -"@nx/eslint-plugin@17.2.8": - version "17.2.8" - resolved "https://registry.yarnpkg.com/@nx/eslint-plugin/-/eslint-plugin-17.2.8.tgz#bb190ce2152fc4a1999b7fa3b5a0930b87d22a5d" - integrity sha512-SOF/Q1g9SNZnwPpwcZNCYeYU670s1X1hgwHCWisw3jGPTYHvpAMQVGwPyU28OyY4PBrqEOVqLTWsuWQYpUjLOw== +"@nx/eslint-plugin@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nx/eslint-plugin/-/eslint-plugin-18.0.4.tgz#5c74debdde3966201daa8314d72265c759ed4eed" + integrity sha512-9QdhPO7r8tv6edInHzLSvimOxshZ5swkooqf/K/83RJ+2KfN/GLEIbLWx59xcqyYxc0D0W7y2XbhjL4XZJZPbw== dependencies: - "@nrwl/eslint-plugin-nx" "17.2.8" - "@nx/devkit" "17.2.8" - "@nx/js" "17.2.8" - "@typescript-eslint/type-utils" "^6.9.1" - "@typescript-eslint/utils" "^6.9.1" + "@nrwl/eslint-plugin-nx" "18.0.4" + "@nx/devkit" "18.0.4" + "@nx/js" "18.0.4" + "@typescript-eslint/type-utils" "^6.13.2" + "@typescript-eslint/utils" "^6.13.2" chalk "^4.1.0" confusing-browser-globals "^1.0.9" jsonc-eslint-parser "^2.1.0" - semver "7.5.3" + semver "^7.5.3" tslib "^2.3.0" -"@nx/eslint@17.2.8": - version "17.2.8" - resolved "https://registry.yarnpkg.com/@nx/eslint/-/eslint-17.2.8.tgz#426010f88aa5518454311b2c7d194444a973e662" - integrity sha512-P6s85cIK7LYHixCJFZ+tLCPDxeOt9m2bQQOLxBCLEy5mqaGmjMHzWkLaoQBueCSntE6PSao0MMA+1TeeZjOoDw== +"@nx/eslint@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nx/eslint/-/eslint-18.0.4.tgz#5078d8f1d5ec25726709dd4478da275c9accab54" + integrity sha512-6mjtPjXkS0aUWfF17D+PZI+Hhn+Cvm2yWTiDoVANsqt9rTOmlCa4fr01OcSyuaWFtkUlbKiKdQ1YYFyLD8zm7A== dependencies: - "@nx/devkit" "17.2.8" - "@nx/js" "17.2.8" - "@nx/linter" "17.2.8" + "@nx/devkit" "18.0.4" + "@nx/js" "18.0.4" + "@nx/linter" "18.0.4" + eslint "^8.0.0" tslib "^2.3.0" - typescript "~5.2.2" + typescript "~5.3.2" -"@nx/jest@17.2.8": - version "17.2.8" - resolved "https://registry.yarnpkg.com/@nx/jest/-/jest-17.2.8.tgz#6c0e33b4cbdfdd357230e5a28a093e626bbf01a8" - integrity sha512-FnwwURXmG+uv5ELHjHd9uVbUioCPjefAOtENcasLJMs2WYeu3zePsru5B8GO9BBM5g2eTmw10Y5f0riAikZjcw== +"@nx/jest@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nx/jest/-/jest-18.0.4.tgz#cb294c6a3c17eea63ab828185fd926c5b6390b19" + integrity sha512-A114oLtWCK99CaY/hUR00/1RISf77jqEgduDFsiaoe8fpr74HN3E8Z/NWW6gG9rkB8ymnvJMJGfbrN+2/Vv75Q== dependencies: "@jest/reporters" "^29.4.1" "@jest/test-result" "^29.4.1" - "@nrwl/jest" "17.2.8" - "@nx/devkit" "17.2.8" - "@nx/js" "17.2.8" + "@nrwl/jest" "18.0.4" + "@nx/devkit" "18.0.4" + "@nx/js" "18.0.4" "@phenomnomnominal/tsquery" "~5.0.1" chalk "^4.1.0" identity-obj-proxy "3.0.0" jest-config "^29.4.1" jest-resolve "^29.4.1" jest-util "^29.4.1" + minimatch "9.0.3" resolve.exports "1.1.0" tslib "^2.3.0" -"@nx/js@17.2.8": - version "17.2.8" - resolved "https://registry.yarnpkg.com/@nx/js/-/js-17.2.8.tgz#9f1a620b016ac014125151beacffab18c11952f7" - integrity sha512-M91tw9tfSnkoC8pZaC9wNxrgaFU4MeQcgdT08ievaroo77kH4RheySsU1uNc0J58Jk4X4315wu/X7Bf/35m0Mw== +"@nx/js@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nx/js/-/js-18.0.4.tgz#7df0f30f858c1c9af2326aaeb1f67b8eb54369c5" + integrity sha512-ma8QMTHZm0LzGYZ1xdVfSUONKb1S5qbiI1DHxhztrsSo3jARZfSAMKM3Bm7ag9MBitpDsoUlgy7JCPmGCAcxAw== dependencies: - "@babel/core" "^7.22.9" + "@babel/core" "^7.23.2" "@babel/plugin-proposal-decorators" "^7.22.7" "@babel/plugin-transform-class-properties" "^7.22.5" - "@babel/plugin-transform-runtime" "^7.22.9" - "@babel/preset-env" "^7.22.9" + "@babel/plugin-transform-runtime" "^7.23.2" + "@babel/preset-env" "^7.23.2" "@babel/preset-typescript" "^7.22.5" "@babel/runtime" "^7.22.6" - "@nrwl/js" "17.2.8" - "@nx/devkit" "17.2.8" - "@nx/workspace" "17.2.8" + "@nrwl/js" "18.0.4" + "@nx/devkit" "18.0.4" + "@nx/workspace" "18.0.4" "@phenomnomnominal/tsquery" "~5.0.1" babel-plugin-const-enum "^1.0.1" babel-plugin-macros "^2.8.0" @@ -4566,135 +5013,136 @@ fs-extra "^11.1.0" ignore "^5.0.4" js-tokens "^4.0.0" - minimatch "3.0.5" + minimatch "9.0.3" npm-package-arg "11.0.1" npm-run-path "^4.0.1" ora "5.3.0" - semver "7.5.3" + semver "^7.5.3" source-map-support "0.5.19" ts-node "10.9.1" tsconfig-paths "^4.1.2" tslib "^2.3.0" -"@nx/linter@17.2.8": - version "17.2.8" - resolved "https://registry.yarnpkg.com/@nx/linter/-/linter-17.2.8.tgz#bafc71b40a36b492e538898b254a8932433096b4" - integrity sha512-dwqE742TIw1+/djzlikKakIfComq8nFnhupWjvl7KrU9r8ytcKyQbxHw7KGMUT9HAEG4xSNuwiaELr/8w4MM2Q== +"@nx/linter@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nx/linter/-/linter-18.0.4.tgz#1526321b553ee175357025ccda836788c6411488" + integrity sha512-yCg7H63eWkjReQUagAFAoICD53ByYZDyRqlkarZe9AGRWJM4GYKhJntihsk1mUOO7Sz0a907BMaWk8Wn5HbHEA== dependencies: - "@nx/eslint" "17.2.8" + "@nx/eslint" "18.0.4" -"@nx/nest@17.2.8": - version "17.2.8" - resolved "https://registry.yarnpkg.com/@nx/nest/-/nest-17.2.8.tgz#6e84f2e802f961fa05e04b7a9fff7b55854519de" - integrity sha512-VZ84VBWACcABjU4djWHHVxY83g3VTkg13AjAeZWyvPAMkNqS05e2jj3CpPVd4EAbwqXX3/CLM/bLKRuGWpYCWg== +"@nx/nest@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nx/nest/-/nest-18.0.4.tgz#ecdd7843b38263406d9d916a0a3c700cf24efb44" + integrity sha512-6rUZhDD+q7TYrITphQTovT4YPa5wPpWdnE62A5+FEF+w5Yj4/5w01jNFrH2p/Ix1relfEUP7+vulCb7hxRNLFg== dependencies: "@nestjs/schematics" "^9.1.0" - "@nrwl/nest" "17.2.8" - "@nx/devkit" "17.2.8" - "@nx/eslint" "17.2.8" - "@nx/js" "17.2.8" - "@nx/node" "17.2.8" + "@nrwl/nest" "18.0.4" + "@nx/devkit" "18.0.4" + "@nx/eslint" "18.0.4" + "@nx/js" "18.0.4" + "@nx/node" "18.0.4" "@phenomnomnominal/tsquery" "~5.0.1" tslib "^2.3.0" -"@nx/node@17.2.8": - version "17.2.8" - resolved "https://registry.yarnpkg.com/@nx/node/-/node-17.2.8.tgz#57668ee77197423560971596540ba6c61295bde3" - integrity sha512-MxvJ2MlbpHeB5ZnlSAbSvBXAYoxCre4fsAwwCpysz1OWkf9dDGYzvlV4ovnu6jET7/ZQzzDvaKD9CvVSDk/amg== +"@nx/node@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nx/node/-/node-18.0.4.tgz#00d5890cba68df2f7f317e1ecbc909821f4e9ae7" + integrity sha512-syjRRex+QuNTnDkIBG4z4Osu7vC5eYeb/nBZX6zmo/4H8y//tbBEjYRV2Yw4wpQp/gCA6fc+WFB9JkdfrMOwrA== dependencies: - "@nrwl/node" "17.2.8" - "@nx/devkit" "17.2.8" - "@nx/eslint" "17.2.8" - "@nx/jest" "17.2.8" - "@nx/js" "17.2.8" + "@nrwl/node" "18.0.4" + "@nx/devkit" "18.0.4" + "@nx/eslint" "18.0.4" + "@nx/jest" "18.0.4" + "@nx/js" "18.0.4" tslib "^2.3.0" -"@nx/nx-darwin-arm64@17.2.8": - version "17.2.8" - resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-17.2.8.tgz#26645c9548d5e387b43c06fccfa18e2c1f08055e" - integrity sha512-dMb0uxug4hM7tusISAU1TfkDK3ixYmzc1zhHSZwpR7yKJIyKLtUpBTbryt8nyso37AS1yH+dmfh2Fj2WxfBHTg== - -"@nx/nx-darwin-x64@17.2.8": - version "17.2.8" - resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-17.2.8.tgz#5143d6d01d24e338cb3d39076fe2af95146cb538" - integrity sha512-0cXzp1tGr7/6lJel102QiLA4NkaLCkQJj6VzwbwuvmuCDxPbpmbz7HC1tUteijKBtOcdXit1/MEoEU007To8Bw== - -"@nx/nx-freebsd-x64@17.2.8": - version "17.2.8" - resolved "https://registry.yarnpkg.com/@nx/nx-freebsd-x64/-/nx-freebsd-x64-17.2.8.tgz#82a018a1855170e0243b8fe7b0032af279c3fb83" - integrity sha512-YFMgx5Qpp2btCgvaniDGdu7Ctj56bfFvbbaHQWmOeBPK1krNDp2mqp8HK6ZKOfEuDJGOYAp7HDtCLvdZKvJxzA== - -"@nx/nx-linux-arm-gnueabihf@17.2.8": - version "17.2.8" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-17.2.8.tgz#18b9c324221ff6a30589f3fc272a843aca57b70f" - integrity sha512-iN2my6MrhLRkVDtdivQHugK8YmR7URo1wU9UDuHQ55z3tEcny7LV3W9NSsY9UYPK/FrxdDfevj0r2hgSSdhnzA== - -"@nx/nx-linux-arm64-gnu@17.2.8": - version "17.2.8" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-17.2.8.tgz#54a08640a2babe78bcf3283565b00eb487db595e" - integrity sha512-Iy8BjoW6mOKrSMiTGujUcNdv+xSM1DALTH6y3iLvNDkGbjGK1Re6QNnJAzqcXyDpv32Q4Fc57PmuexyysZxIGg== - -"@nx/nx-linux-arm64-musl@17.2.8": - version "17.2.8" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-17.2.8.tgz#cd7b673bb9f45fec7aa1b6c880a0d23d658e927f" - integrity sha512-9wkAxWzknjpzdofL1xjtU6qPFF1PHlvKCZI3hgEYJDo4mQiatGI+7Ttko+lx/ZMP6v4+Umjtgq7+qWrApeKamQ== - -"@nx/nx-linux-x64-gnu@17.2.8": - version "17.2.8" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-17.2.8.tgz#009eb75c77bf075bc9c13ec4f9caf77821eee639" - integrity sha512-sjG1bwGsjLxToasZ3lShildFsF0eyeGu+pOQZIp9+gjFbeIkd19cTlCnHrOV9hoF364GuKSXQyUlwtFYFR4VTQ== - -"@nx/nx-linux-x64-musl@17.2.8": - version "17.2.8" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-17.2.8.tgz#8ee2324068732a135ca4b01081942d5956885167" - integrity sha512-QiakXZ1xBCIptmkGEouLHQbcM4klQkcr+kEaz2PlNwy/sW3gH1b/1c0Ed5J1AN9xgQxWspriAONpScYBRgxdhA== - -"@nx/nx-win32-arm64-msvc@17.2.8": - version "17.2.8" - resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-17.2.8.tgz#9bdce5b4d1f9cec7ef326eaf43b99e68576398b0" - integrity sha512-XBWUY/F/GU3vKN9CAxeI15gM4kr3GOBqnzFZzoZC4qJt2hKSSUEWsMgeZtsMgeqEClbi4ZyCCkY7YJgU32WUGA== - -"@nx/nx-win32-x64-msvc@17.2.8": - version "17.2.8" - resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-17.2.8.tgz#8a86ff250021ad47686b58f1840b348a209b1158" - integrity sha512-HTqDv+JThlLzbcEm/3f+LbS5/wYQWzb5YDXbP1wi7nlCTihNZOLNqGOkEmwlrR5tAdNHPRpHSmkYg4305W0CtA== - -"@nx/storybook@17.2.8": - version "17.2.8" - resolved "https://registry.yarnpkg.com/@nx/storybook/-/storybook-17.2.8.tgz#b8d3152bdbc95a13414498d0aba0ded532f32038" - integrity sha512-8fQck3mP2i3XWCnq/p5l+Y11TQTr8Gv4L64Rggq6nPuZOk6RbinCPG+VMztqGgQET8q4XTTGt8yw5VOUG0cIyw== - dependencies: - "@nrwl/storybook" "17.2.8" - "@nx/cypress" "17.2.8" - "@nx/devkit" "17.2.8" - "@nx/eslint" "17.2.8" - "@nx/js" "17.2.8" +"@nx/nx-darwin-arm64@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-18.0.4.tgz#c199b44ee21699acb14f6ecbada56ed19af936a3" + integrity sha512-9KJVONxUwdnFHHRNocsg7q5pliOTTfbjlr3rvhLuroV5HeTJFhUipKCQrVEhLy8e4auRdLuSz/HsgpJat3Z2cg== + +"@nx/nx-darwin-x64@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-18.0.4.tgz#859896881930d346afd6397b593f8d436722b80d" + integrity sha512-rFKHjeU0Ngz1R7UJAsbncpqwuFDjUdpcvI783r6s2eP7JoiiwtDBXvDcHiy8Odk0lPYmwDELaFZBhvdENqaDNA== + +"@nx/nx-freebsd-x64@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nx/nx-freebsd-x64/-/nx-freebsd-x64-18.0.4.tgz#2f295ff841e38f720aa9761e2c9eda90e372b380" + integrity sha512-jJx47wgRoUxVpQ+WG5+yLdxtJVuVgjphiTMRc0LOfUwKQaEHWyCA0hMK5fNmo0FAHIhGVCb/j2j9FxnCWTWpkg== + +"@nx/nx-linux-arm-gnueabihf@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-18.0.4.tgz#7ceb5531887996f4cf5e9ebda8dab34421d3a061" + integrity sha512-C3qWbFhEMIdTzvAHlIUHecZN3YBu7bx3S0p3gPNGmEMUMbYHP2zMlimBrZIbAxzntyGqWCqhXiFB21QhJ0t1Dw== + +"@nx/nx-linux-arm64-gnu@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-18.0.4.tgz#cfda70cedab2f3a7c5a9bb11ad4be180993b68c8" + integrity sha512-PxVMh9ikp8Q3hKagb66FAsek8O/08GcMF5dXBH7xc5AiQMaZ6Az/gAXOeHp274nmu3StQEpl9Il/YH6Z9f4V0w== + +"@nx/nx-linux-arm64-musl@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-18.0.4.tgz#1ce43e4803d3d5b3aeefa43ec54df7501b04a0b7" + integrity sha512-Iz7Z4h2/dXJJvBcyeRHa+d3Ncc4Qz+OiGm6iRDXv4zjFm5EyC1tkSZIFNlNiRjmTToNHFr4savrCjCh8wRYejw== + +"@nx/nx-linux-x64-gnu@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-18.0.4.tgz#0981787e067d6dd7e3f4f457eb3e24c9b12dccaa" + integrity sha512-BVLkegIwxHnEB64VBraBxyC01D3C3dVNxq2b4iNaqr4mpWNmos+G/mvcTU3NS7W8ZjpBjlXgdEkpgkl2hMKTEA== + +"@nx/nx-linux-x64-musl@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-18.0.4.tgz#d2857870922ee76ed9f50763ec8bd3c6244c998a" + integrity sha512-WgVy41psjCE9uxjFi4P62UrWyKQ1e2IN2FZaIuwXEB9h8OU/+g9PFpL1Cs1llNoEKnapKXX4+9b5FHF9i7EKQw== + +"@nx/nx-win32-arm64-msvc@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-18.0.4.tgz#92c76b7b0e1616c273a231afc0f23f1a5e68f655" + integrity sha512-YoxhOrVKnS+kcNTnCg9M61cbigzGErYgnlI8kdZzH2ArD7mhv8bfZnSZUInf5Y8oDBVpKusel7AkCSofzSwigA== + +"@nx/nx-win32-x64-msvc@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-18.0.4.tgz#c57cbb5e42b10322cb966270a32a2f7869634186" + integrity sha512-FdAdl5buvtUXp8hZVRkK0AZeiCu35l0u+yHsulNViYdh3OXRT1hYJ0CeqpxlLfvbHqB9JzDPtJtG0dpKHH/O0Q== + +"@nx/storybook@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nx/storybook/-/storybook-18.0.4.tgz#5ffda43c41b1ba2f667463af047b78ae7207676c" + integrity sha512-tmKDAkuoQAxUzw9KLDQW8lnf1PHTo2JIjn+UFBs/MtT4M1YoT7z0ak4VsjxWzLOiGojwtd/cbXbLITxBRRtyaw== + dependencies: + "@nrwl/storybook" "18.0.4" + "@nx/cypress" "18.0.4" + "@nx/devkit" "18.0.4" + "@nx/eslint" "18.0.4" + "@nx/js" "18.0.4" "@phenomnomnominal/tsquery" "~5.0.1" - semver "7.5.3" + semver "^7.5.3" tslib "^2.3.0" -"@nx/web@17.2.8": - version "17.2.8" - resolved "https://registry.yarnpkg.com/@nx/web/-/web-17.2.8.tgz#9fb21757715a7f3f799790541094e81e75f12918" - integrity sha512-ovPvFVJOiB/ZmOxnCOOyT+ibbdgazXjpa4506hLJxRohDZQw/6jwbCWkTBy/ch6Y8NSN6uNUpB5XUdscfrp52A== +"@nx/web@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nx/web/-/web-18.0.4.tgz#cea98618d4e5832e67c8d3aac09715f6e62d3702" + integrity sha512-lcZjFEUjFly/+C4dFMLNEk9mnlolKGPrd4Z5tly0iEZCJ1tSuOYfxPraZZJFeYO88Eh10lW28aGdiHote/PLXQ== dependencies: - "@nrwl/web" "17.2.8" - "@nx/devkit" "17.2.8" - "@nx/js" "17.2.8" + "@nrwl/web" "18.0.4" + "@nx/devkit" "18.0.4" + "@nx/js" "18.0.4" chalk "^4.1.0" detect-port "^1.5.1" http-server "^14.1.0" tslib "^2.3.0" -"@nx/webpack@17.2.8": - version "17.2.8" - resolved "https://registry.yarnpkg.com/@nx/webpack/-/webpack-17.2.8.tgz#ec5f9a7405bbbdffd82fd7194fbb777f52297c44" - integrity sha512-Gud9Z+VO0dlLpVEJLfPxkEV5wG+ebZ1mv0S0cfTBdD24Fj4MAs0W8QWhRQBtLd2SayU9KMfJr+8gJjkNT6D3Kw== +"@nx/webpack@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nx/webpack/-/webpack-18.0.4.tgz#9f0985c4e55736a26aeb26e1cc5bbfc1b4887be2" + integrity sha512-ugac88EiCDtt/WVeuR596FJanN6J4Y8EPNxO/4+Odh6+yumgQdi0Bg6OLsvmZn6M+v+Qwaqyjo5RIFMk/3pDLQ== dependencies: - "@babel/core" "^7.22.9" - "@nrwl/webpack" "17.2.8" - "@nx/devkit" "17.2.8" - "@nx/js" "17.2.8" + "@babel/core" "^7.23.2" + "@nrwl/webpack" "18.0.4" + "@nx/devkit" "18.0.4" + "@nx/js" "18.0.4" + ajv "^8.12.0" autoprefixer "^10.4.9" babel-loader "^9.1.2" browserslist "^4.21.4" @@ -4728,20 +5176,20 @@ webpack-node-externals "^3.0.0" webpack-subresource-integrity "^5.1.0" -"@nx/workspace@17.2.8": - version "17.2.8" - resolved "https://registry.yarnpkg.com/@nx/workspace/-/workspace-17.2.8.tgz#61fdfc7757231c423f8a98713c0df65241721592" - integrity sha512-QCriI4CFCuG+0WTbpu3fHljVR1x6bjNSrbq8nqu8Z/3y+si2/O+7lVNSTkQNr1X2eBPqtIX74APS7ExG8c4vog== +"@nx/workspace@18.0.4": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@nx/workspace/-/workspace-18.0.4.tgz#e7b0b598ce7e60ee125b584135d6b76c8f99616a" + integrity sha512-0w7czYCU6+QczvdRN8HnKRU24xnam5Gf12mfw+uuU6ybslOQuRoKW+oUROwyck5P4I27XzgxcqnMTCxNDcQGWQ== dependencies: - "@nrwl/workspace" "17.2.8" - "@nx/devkit" "17.2.8" + "@nrwl/workspace" "18.0.4" + "@nx/devkit" "18.0.4" chalk "^4.1.0" enquirer "~2.3.6" - nx "17.2.8" + nx "18.0.4" tslib "^2.3.0" yargs-parser "21.1.1" -"@peculiar/asn1-android@^2.3.6": +"@peculiar/asn1-android@^2.3.10": version "2.3.10" resolved "https://registry.yarnpkg.com/@peculiar/asn1-android/-/asn1-android-2.3.10.tgz#a2dde6227fa1ddea33d8ae7835768674e7a0baa6" integrity sha512-z9Rx9cFJv7UUablZISe7uksNbFJCq13hO0yEAOoIpAymALTLlvUOSLnGiQS7okPaM5dP42oTLhezH6XDXRXjGw== @@ -4750,7 +5198,7 @@ asn1js "^3.0.5" tslib "^2.6.2" -"@peculiar/asn1-ecc@^2.3.6": +"@peculiar/asn1-ecc@^2.3.8": version "2.3.8" resolved "https://registry.yarnpkg.com/@peculiar/asn1-ecc/-/asn1-ecc-2.3.8.tgz#6b1a18f64f221ae862c1038bb125fbf4342918a0" integrity sha512-Ah/Q15y3A/CtxbPibiLM/LKcMbnLTdUdLHUgdpB5f60sSvGkXzxJCu5ezGTFHogZXWNX3KSmYqilCrfdmBc6pQ== @@ -4760,7 +5208,7 @@ asn1js "^3.0.5" tslib "^2.6.2" -"@peculiar/asn1-rsa@^2.3.6": +"@peculiar/asn1-rsa@^2.3.8": version "2.3.8" resolved "https://registry.yarnpkg.com/@peculiar/asn1-rsa/-/asn1-rsa-2.3.8.tgz#6a6a0eaafc0aded9a44b679b522cc2417b09a3ba" integrity sha512-ES/RVEHu8VMYXgrg3gjb1m/XG0KJWnV4qyZZ7mAg7rrF3VTmRbLxO8mk+uy0Hme7geSMebp+Wvi2U6RLLEs12Q== @@ -4770,7 +5218,7 @@ asn1js "^3.0.5" tslib "^2.6.2" -"@peculiar/asn1-schema@^2.3.6", "@peculiar/asn1-schema@^2.3.8": +"@peculiar/asn1-schema@^2.3.8": version "2.3.8" resolved "https://registry.yarnpkg.com/@peculiar/asn1-schema/-/asn1-schema-2.3.8.tgz#04b38832a814e25731232dd5be883460a156da3b" integrity sha512-ULB1XqHKx1WBU/tTFIA+uARuRoBVZ4pNdOA878RDrRbBfBGcSzi5HBkdScC6ZbHn8z7L8gmKCgPC1LHRrP46tA== @@ -4779,7 +5227,7 @@ pvtsutils "^1.3.5" tslib "^2.6.2" -"@peculiar/asn1-x509@^2.3.6", "@peculiar/asn1-x509@^2.3.8": +"@peculiar/asn1-x509@^2.3.8": version "2.3.8" resolved "https://registry.yarnpkg.com/@peculiar/asn1-x509/-/asn1-x509-2.3.8.tgz#865896e2b849cc3c55497ca685040ef889d357a3" integrity sha512-voKxGfDU1c6r9mKiN5ZUsZWh3Dy1BABvTM3cimf0tztNwyMJPhiXY94eRTgsMQe6ViLfT6EoXxkWVzcm3mFAFw== @@ -4802,46 +5250,46 @@ resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== -"@prisma/client@5.8.1": - version "5.8.1" - resolved "https://registry.yarnpkg.com/@prisma/client/-/client-5.8.1.tgz#7815ec51c0ca2a6de219c02e7846701ae3baf240" - integrity sha512-xQtMPfbIwLlbm0VVIVQY2yqQVOxPwRQhvIp7Z3m2900g1bu/zRHKhYZJQWELqmjl6d8YwBy0K2NvMqh47v1ubw== +"@prisma/client@5.11.0": + version "5.11.0" + resolved "https://registry.yarnpkg.com/@prisma/client/-/client-5.11.0.tgz#d8e55fab85163415b2245fb408b9106f83c8106d" + integrity sha512-SWshvS5FDXvgJKM/a0y9nDC1rqd7KG0Q6ZVzd+U7ZXK5soe73DJxJJgbNBt2GNXOa+ysWB4suTpdK5zfFPhwiw== -"@prisma/debug@5.8.1": - version "5.8.1" - resolved "https://registry.yarnpkg.com/@prisma/debug/-/debug-5.8.1.tgz#704daa36919b0fc4d227260ecebfa1c94b155b07" - integrity sha512-tjuw7eA0Us3T42jx9AmAgL58rzwzpFGYc3R7Y4Ip75EBYrKMBA1YihuWMcBC92ILmjlQ/u3p8VxcIE0hr+fZfg== +"@prisma/debug@5.11.0": + version "5.11.0" + resolved "https://registry.yarnpkg.com/@prisma/debug/-/debug-5.11.0.tgz#80e3f9d5a8f678c67a8783f7fcdda3cbbb8dd091" + integrity sha512-N6yYr3AbQqaiUg+OgjkdPp3KPW1vMTAgtKX6+BiB/qB2i1TjLYCrweKcUjzOoRM5BriA4idrkTej9A9QqTfl3A== -"@prisma/engines-version@5.8.1-1.78caf6feeaed953168c64e15a249c3e9a033ebe2": - version "5.8.1-1.78caf6feeaed953168c64e15a249c3e9a033ebe2" - resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-5.8.1-1.78caf6feeaed953168c64e15a249c3e9a033ebe2.tgz#f600a45afc4cf0c0356b6ed90add6050fa3f3239" - integrity sha512-f5C3JM3l9yhGr3cr4FMqWloFaSCpNpMi58Om22rjD2DOz3owci2mFdFXMgnAGazFPKrCbbEhcxdsRfspEYRoFQ== +"@prisma/engines-version@5.11.0-15.efd2449663b3d73d637ea1fd226bafbcf45b3102": + version "5.11.0-15.efd2449663b3d73d637ea1fd226bafbcf45b3102" + resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-5.11.0-15.efd2449663b3d73d637ea1fd226bafbcf45b3102.tgz#a7aa218b1ebf1077798c931632461aae8ce6a8f7" + integrity sha512-WXCuyoymvrS4zLz4wQagSsc3/nE6CHy8znyiMv8RKazKymOMd5o9FP5RGwGHAtgoxd+aB/BWqxuP/Ckfu7/3MA== -"@prisma/engines@5.8.1": - version "5.8.1" - resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-5.8.1.tgz#b850751f5bf7d5e570b9fe16cefdc2b1fd2c02c3" - integrity sha512-TJgYLRrZr56uhqcXO4GmP5be+zjCIHtLDK20Cnfg+o9d905hsN065QOL+3Z0zQAy6YD31Ol4u2kzSfRmbJv/uA== +"@prisma/engines@5.11.0": + version "5.11.0" + resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-5.11.0.tgz#96e941c5c81ce68f3a8b4c481007d397564c5d4b" + integrity sha512-gbrpQoBTYWXDRqD+iTYMirDlF9MMlQdxskQXbhARhG6A/uFQjB7DZMYocMQLoiZXO/IskfDOZpPoZE8TBQKtEw== dependencies: - "@prisma/debug" "5.8.1" - "@prisma/engines-version" "5.8.1-1.78caf6feeaed953168c64e15a249c3e9a033ebe2" - "@prisma/fetch-engine" "5.8.1" - "@prisma/get-platform" "5.8.1" + "@prisma/debug" "5.11.0" + "@prisma/engines-version" "5.11.0-15.efd2449663b3d73d637ea1fd226bafbcf45b3102" + "@prisma/fetch-engine" "5.11.0" + "@prisma/get-platform" "5.11.0" -"@prisma/fetch-engine@5.8.1": - version "5.8.1" - resolved "https://registry.yarnpkg.com/@prisma/fetch-engine/-/fetch-engine-5.8.1.tgz#38bb92f1fbd3669340a3cc49fce403ab4df671dd" - integrity sha512-+bgjjoSFa6uYEbAPlklfoVSStOEfcpheOjoBoNsNNSQdSzcwE2nM4Q0prun0+P8/0sCHo18JZ9xqa8gObvgOUw== +"@prisma/fetch-engine@5.11.0": + version "5.11.0" + resolved "https://registry.yarnpkg.com/@prisma/fetch-engine/-/fetch-engine-5.11.0.tgz#cd7a2fa5b5d89f1da0689e329c56fa69223fba7d" + integrity sha512-994viazmHTJ1ymzvWugXod7dZ42T2ROeFuH6zHPcUfp/69+6cl5r9u3NFb6bW8lLdNjwLYEVPeu3hWzxpZeC0w== dependencies: - "@prisma/debug" "5.8.1" - "@prisma/engines-version" "5.8.1-1.78caf6feeaed953168c64e15a249c3e9a033ebe2" - "@prisma/get-platform" "5.8.1" + "@prisma/debug" "5.11.0" + "@prisma/engines-version" "5.11.0-15.efd2449663b3d73d637ea1fd226bafbcf45b3102" + "@prisma/get-platform" "5.11.0" -"@prisma/get-platform@5.8.1": - version "5.8.1" - resolved "https://registry.yarnpkg.com/@prisma/get-platform/-/get-platform-5.8.1.tgz#8cd450b65a52a5a6ed5b2f52457136a492c0f251" - integrity sha512-wnA+6HTFcY+tkykMokix9GiAkaauPC5W/gg0O5JB0J8tCTNWrqpnQ7AsaGRfkYUbeOIioh6woDjQrGTTRf1Zag== +"@prisma/get-platform@5.11.0": + version "5.11.0" + resolved "https://registry.yarnpkg.com/@prisma/get-platform/-/get-platform-5.11.0.tgz#19a768127b1712c27f5dec8a0a79a4c9675829eb" + integrity sha512-rxtHpMLxNTHxqWuGOLzR2QOyQi79rK1u1XYAVLZxDGTLz/A+uoDnjz9veBFlicrpWjwuieM4N6jcnjj/DDoidw== dependencies: - "@prisma/debug" "5.8.1" + "@prisma/debug" "5.11.0" "@radix-ui/number@1.0.1": version "1.0.1" @@ -5133,6 +5581,71 @@ dependencies: "@babel/runtime" "^7.13.10" +"@rollup/rollup-android-arm-eabi@4.10.0": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.10.0.tgz#786eaf6372be2fc209cc957c14aa9d3ff8fefe6a" + integrity sha512-/MeDQmcD96nVoRumKUljsYOLqfv1YFJps+0pTrb2Z9Nl/w5qNUysMaWQsrd1mvAlNT4yza1iVyIu4Q4AgF6V3A== + +"@rollup/rollup-android-arm64@4.10.0": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.10.0.tgz#0114a042fd6396f4f3233e6171fd5b61a36ed539" + integrity sha512-lvu0jK97mZDJdpZKDnZI93I0Om8lSDaiPx3OiCk0RXn3E8CMPJNS/wxjAvSJJzhhZpfjXsjLWL8LnS6qET4VNQ== + +"@rollup/rollup-darwin-arm64@4.10.0": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.10.0.tgz#944d007c1dc71a8c9174d11671c0c34bd74a2c81" + integrity sha512-uFpayx8I8tyOvDkD7X6n0PriDRWxcqEjqgtlxnUA/G9oS93ur9aZ8c8BEpzFmsed1TH5WZNG5IONB8IiW90TQg== + +"@rollup/rollup-darwin-x64@4.10.0": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.10.0.tgz#1d08cb4521a058d7736ab1c7fe988daf034a2598" + integrity sha512-nIdCX03qFKoR/MwQegQBK+qZoSpO3LESurVAC6s6jazLA1Mpmgzo3Nj3H1vydXp/JM29bkCiuF7tDuToj4+U9Q== + +"@rollup/rollup-linux-arm-gnueabihf@4.10.0": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.10.0.tgz#4763eec1591bf0e99a54ad3d1ef39cb268ed7b19" + integrity sha512-Fz7a+y5sYhYZMQFRkOyCs4PLhICAnxRX/GnWYReaAoruUzuRtcf+Qnw+T0CoAWbHCuz2gBUwmWnUgQ67fb3FYw== + +"@rollup/rollup-linux-arm64-gnu@4.10.0": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.10.0.tgz#e6dae70c53ace836973526c41803b877cffc6f7b" + integrity sha512-yPtF9jIix88orwfTi0lJiqINnlWo6p93MtZEoaehZnmCzEmLL0eqjA3eGVeyQhMtxdV+Mlsgfwhh0+M/k1/V7Q== + +"@rollup/rollup-linux-arm64-musl@4.10.0": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.10.0.tgz#5692e1a0feba0cc4a933864961afc3211177d242" + integrity sha512-9GW9yA30ib+vfFiwjX+N7PnjTnCMiUffhWj4vkG4ukYv1kJ4T9gHNg8zw+ChsOccM27G9yXrEtMScf1LaCuoWQ== + +"@rollup/rollup-linux-riscv64-gnu@4.10.0": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.10.0.tgz#fbe3d80f7a7ac54a8847f5bddd1bc6f7b9ccb65f" + integrity sha512-X1ES+V4bMq2ws5fF4zHornxebNxMXye0ZZjUrzOrf7UMx1d6wMQtfcchZ8SqUnQPPHdOyOLW6fTcUiFgHFadRA== + +"@rollup/rollup-linux-x64-gnu@4.10.0": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.10.0.tgz#3f06b55ccf173446d390d0306643dff62ec99807" + integrity sha512-w/5OpT2EnI/Xvypw4FIhV34jmNqU5PZjZue2l2Y3ty1Ootm3SqhI+AmfhlUYGBTd9JnpneZCDnt3uNOiOBkMyw== + +"@rollup/rollup-linux-x64-musl@4.10.0": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.10.0.tgz#e4ac9b27041c83d7faab6205f62763103eb317ba" + integrity sha512-q/meftEe3QlwQiGYxD9rWwB21DoKQ9Q8wA40of/of6yGHhZuGfZO0c3WYkN9dNlopHlNT3mf5BPsUSxoPuVQaw== + +"@rollup/rollup-win32-arm64-msvc@4.10.0": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.10.0.tgz#6ad0d4fb0066f240778ee3f61eecf7aa0357f883" + integrity sha512-NrR6667wlUfP0BHaEIKgYM/2va+Oj+RjZSASbBMnszM9k+1AmliRjHc3lJIiOehtSSjqYiO7R6KLNrWOX+YNSQ== + +"@rollup/rollup-win32-ia32-msvc@4.10.0": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.10.0.tgz#29d50292381311cc8d3623e73b427b7e2e40a653" + integrity sha512-FV0Tpt84LPYDduIDcXvEC7HKtyXxdvhdAOvOeWMWbQNulxViH2O07QXkT/FffX4FqEI02jEbCJbr+YcuKdyyMg== + +"@rollup/rollup-win32-x64-msvc@4.10.0": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.10.0.tgz#4eedd01af3a82c1acb0fe6d837ebf339c4cbf839" + integrity sha512-OZoJd+o5TaTSQeFFQ6WjFCiltiYVjIdsXxwu/XZ8qRpsvMQr4UsVrE5UyT9RIvsnuF47DqkJKhhVZ2Q9YW9IpQ== + "@samverschueren/stream-to-observable@^0.3.0": version "0.3.1" resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.1.tgz#a21117b19ee9be70c379ec1877537ef2e1c63301" @@ -5140,7 +5653,16 @@ dependencies: any-observable "^0.3.0" -"@schematics/angular@17.0.0", "@schematics/angular@^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0": +"@schematics/angular@17.1.3": + version "17.1.3" + resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-17.1.3.tgz#3c3e0f67985ed500d9d3b66fdb63387cc775e9a9" + integrity sha512-hmeasOvzmniy6urtzUKhEqGO67iPuLX/dVtkF4nWp2NTtcEKlvcJobNDMc+CTlX4+ZMPVOvmhDMQqrlfekZ+NQ== + dependencies: + "@angular-devkit/core" "17.1.3" + "@angular-devkit/schematics" "17.1.3" + jsonc-parser "3.2.0" + +"@schematics/angular@^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0": version "17.0.0" resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-17.0.0.tgz#63ddf8bfbb3b117fe7a355bd22b43d2c9ff7f0ee" integrity sha512-9jKU5x/WzaBsfSkUowK1X74FqtMXa6+A60XgW4ACO8i6fwKfPeS+tIrAieeYOX80/njBh7I5CvcpHmWA2SbcXQ== @@ -5149,15 +5671,6 @@ "@angular-devkit/schematics" "17.0.0" jsonc-parser "3.2.0" -"@schematics/angular@17.0.7": - version "17.0.7" - resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-17.0.7.tgz#7e4e411f523413a6a80aad1309b5e278a2baca7b" - integrity sha512-d7QKmcKrM4owb/2bR7Ipf23roiNbvbD/x7reNhQAtKAPLSHJ3Ulkf1+Yv+dj+9f+K7y9SBviEUSrD27BQ9WaxQ== - dependencies: - "@angular-devkit/core" "17.0.7" - "@angular-devkit/schematics" "17.0.7" - jsonc-parser "3.2.0" - "@sigstore/bundle@^2.1.0": version "2.1.0" resolved "https://registry.yarnpkg.com/@sigstore/bundle/-/bundle-2.1.0.tgz#c6140ca97b68815edf7c4fb7bdbf58d656525c39" @@ -5187,37 +5700,32 @@ "@sigstore/protobuf-specs" "^0.2.1" tuf-js "^2.1.0" -"@simplewebauthn/browser@8.3.1": - version "8.3.1" - resolved "https://registry.yarnpkg.com/@simplewebauthn/browser/-/browser-8.3.1.tgz#f5c1aed6313d61944a9e13f16ae4495750bddf93" - integrity sha512-bMW7oOkxX4ydRAkkPtJ1do2k9yOoIGc/hZYebcuEOVdJoC6wwVpu97mYY7Mz8B9hLlcaR5WFgBsLl5tSJVzm8A== +"@simplewebauthn/browser@9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@simplewebauthn/browser/-/browser-9.0.1.tgz#46a12c2bcefcb199f7fcb6a7e883531cd6efde17" + integrity sha512-wD2WpbkaEP4170s13/HUxPcAV5y4ZXaKo1TfNklS5zDefPinIgXOpgz1kpEvobAsaLPa2KeH7AKKX/od1mrBJw== dependencies: - "@simplewebauthn/typescript-types" "^8.0.0" + "@simplewebauthn/types" "^9.0.1" -"@simplewebauthn/server@8.3.2": - version "8.3.2" - resolved "https://registry.yarnpkg.com/@simplewebauthn/server/-/server-8.3.2.tgz#dfdbe7af4c1258e786c4a0b1c83c54743ba7568c" - integrity sha512-ceo8t5gdO5W/JOePQWPDH+rAd8tO6QNalLU56rc9ItdzaTjk+qcYwQg/BKXDDg6117P3HKrRBkZwBrMJl4dOdA== +"@simplewebauthn/server@9.0.3": + version "9.0.3" + resolved "https://registry.yarnpkg.com/@simplewebauthn/server/-/server-9.0.3.tgz#5f73c19ff2420be94cc71a49085879c111d7872d" + integrity sha512-FMZieoBosrVLFxCnxPFD9Enhd1U7D8nidVDT4MsHc6l4fdVcjoeHjDueeXCloO1k5O/fZg1fsSXXPKbY2XTzDA== dependencies: "@hexagon/base64" "^1.1.27" - "@peculiar/asn1-android" "^2.3.6" - "@peculiar/asn1-ecc" "^2.3.6" - "@peculiar/asn1-rsa" "^2.3.6" - "@peculiar/asn1-schema" "^2.3.6" - "@peculiar/asn1-x509" "^2.3.6" - "@simplewebauthn/typescript-types" "^8.0.0" - cbor-x "^1.5.2" + "@levischuck/tiny-cbor" "^0.2.2" + "@peculiar/asn1-android" "^2.3.10" + "@peculiar/asn1-ecc" "^2.3.8" + "@peculiar/asn1-rsa" "^2.3.8" + "@peculiar/asn1-schema" "^2.3.8" + "@peculiar/asn1-x509" "^2.3.8" + "@simplewebauthn/types" "^9.0.1" cross-fetch "^4.0.0" -"@simplewebauthn/typescript-types@8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@simplewebauthn/typescript-types/-/typescript-types-8.0.0.tgz#1698a7228aba880c5c1deba1f13a4f9fd8851cb3" - integrity sha512-d7Izb2H+LZJteXMkS8DmpAarD6mZdpIOu/av/yH4/u/3Pd6DKFLyBM3j8BMmUvUqpzvJvHARNrRfQYto58mtTQ== - -"@simplewebauthn/typescript-types@^8.0.0": - version "8.3.3" - resolved "https://registry.yarnpkg.com/@simplewebauthn/typescript-types/-/typescript-types-8.3.3.tgz#4292656f4fae6c9e9c25e5b94a60fa038a7d11cc" - integrity sha512-YLfmT+HzzUuRtBPp93XgKzQPrFJ1F6f1vl7ltfmm6R9d2SZfr8E15B5CC7hkCwSTioJDCaEw4p3NZt3+nubaxA== +"@simplewebauthn/types@9.0.1", "@simplewebauthn/types@^9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@simplewebauthn/types/-/types-9.0.1.tgz#3a68d50e63d8821cf2067de3324c68d5e8120d0c" + integrity sha512-tGSRP1QvsAvsJmnOlRQyw/mvK9gnPtjEc5fg2+m8n+QUa+D7rvrKkOYyfpy42GTs90X3RDOnqJgfHt+qO67/+w== "@sinclair/typebox@^0.27.8": version "0.27.8" @@ -5243,11 +5751,6 @@ dependencies: "@sinonjs/commons" "^3.0.0" -"@socket.io/component-emitter@~3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz#96116f2a912e0c02817345b3c10751069920d553" - integrity sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg== - "@stencil/core@^2.18.0": version "2.22.3" resolved "https://registry.yarnpkg.com/@stencil/core/-/core-2.22.3.tgz#83987e20bba855c450f6d6780e3a20192603f13f" @@ -6232,6 +6735,18 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== +"@trivago/prettier-plugin-sort-imports@4.3.0": + version "4.3.0" + resolved "https://registry.yarnpkg.com/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-4.3.0.tgz#725f411646b3942193a37041c84e0b2116339789" + integrity sha512-r3n0onD3BTOVUNPhR4lhVK4/pABGpbA7bW3eumZnYdKaHkf1qEC+Mag6DPbGNuuh0eG8AaYj+YqmVHSiGslaTQ== + dependencies: + "@babel/generator" "7.17.7" + "@babel/parser" "^7.20.5" + "@babel/traverse" "7.23.2" + "@babel/types" "7.17.0" + javascript-natural-sort "0.7.1" + lodash "^4.17.21" + "@trysound/sax@0.2.0": version "0.2.0" resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" @@ -6270,6 +6785,17 @@ "@tufjs/canonical-json" "2.0.0" minimatch "^9.0.3" +"@types/babel__core@7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.2.tgz#215db4f4a35d710256579784a548907237728756" + integrity sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + "@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": version "7.20.3" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.3.tgz#d5625a50b6f18244425a1359a858c73d70340778" @@ -6380,18 +6906,6 @@ dependencies: "@types/node" "*" -"@types/cookie@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" - integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== - -"@types/cors@^2.8.12": - version "2.8.16" - resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.16.tgz#a24bf65acd216c078890ca6ceb91e672adb158e7" - integrity sha512-Trx5or1Nyg1Fq138PCuWqoApzvoSLWzZ25ORBiHMbbUT42g578lH1GT4TwYDbiUOLFuDsCkfLneT2105fsFWGg== - dependencies: - "@types/node" "*" - "@types/cross-spawn@^6.0.2": version "6.0.4" resolved "https://registry.yarnpkg.com/@types/cross-spawn/-/cross-spawn-6.0.4.tgz#e658d29e2308a01f48b7b30fd8cdf07aeb2e5a82" @@ -6464,6 +6978,11 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.3.tgz#2be19e759a3dd18c79f9f436bd7363556c1a73dd" integrity sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ== +"@types/estree@1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": version "4.17.39" resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.39.tgz#2107afc0a4b035e6cb00accac3bdf2d76ae408c8" @@ -6497,14 +7016,6 @@ "@types/jsonfile" "*" "@types/node" "*" -"@types/glob@^7.1.1": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" - integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== - dependencies: - "@types/minimatch" "*" - "@types/node" "*" - "@types/glob@^8.0.0": version "8.1.0" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-8.1.0.tgz#b63e70155391b0584dce44e7ea25190bbc38f2fc" @@ -6656,7 +7167,7 @@ resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.4.tgz#a4ed836e069491414bab92c31fdea9e557aca0d9" integrity sha512-1Gjee59G25MrQGk8bsNvC6fxNiRgUlGn2wlhGf95a59DrprnnHk80FIMMFG9XHMdrfsuA119ht06QPDXA1Z7tw== -"@types/minimatch@*", "@types/minimatch@^5.1.2": +"@types/minimatch@^5.1.2": version "5.1.2" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== @@ -6693,13 +7204,6 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.9.tgz#e79416d778a8714597342bb87efb5a6e914f7a73" integrity sha512-IeB32oIV4oGArLrd7znD2rkHQ6EDCM+2Sr76dJnrHwv9OHBTTM6nuDLK9bmikXzPa0ZlWMWtRGo/Uw4mrzQedA== -"@types/node@>=10.0.0": - version "20.9.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.9.0.tgz#bfcdc230583aeb891cf51e73cfdaacdd8deae298" - integrity sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw== - dependencies: - undici-types "~5.26.4" - "@types/node@^16.0.0": version "16.18.59" resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.59.tgz#4cdbd631be6d9be266a96fb17b5d0d7ad6bbe26c" @@ -6942,40 +7446,34 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@5.51.0": - version "5.51.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.51.0.tgz#da3f2819633061ced84bb82c53bba45a6fe9963a" - integrity sha512-wcAwhEWm1RgNd7dxD/o+nnLW8oH+6RK1OGnmbmkj/GGoDPV1WWMVP0FXYQBivKHdwM1pwii3bt//RC62EriIUQ== +"@typescript-eslint/eslint-plugin@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz#30830c1ca81fd5f3c2714e524c4303e0194f9cd3" + integrity sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA== dependencies: - "@typescript-eslint/scope-manager" "5.51.0" - "@typescript-eslint/type-utils" "5.51.0" - "@typescript-eslint/utils" "5.51.0" + "@eslint-community/regexpp" "^4.5.1" + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/type-utils" "6.21.0" + "@typescript-eslint/utils" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" debug "^4.3.4" - grapheme-splitter "^1.0.4" - ignore "^5.2.0" - natural-compare-lite "^1.4.0" - regexpp "^3.2.0" - semver "^7.3.7" - tsutils "^3.21.0" + graphemer "^1.4.0" + ignore "^5.2.4" + natural-compare "^1.4.0" + semver "^7.5.4" + ts-api-utils "^1.0.1" -"@typescript-eslint/parser@5.51.0": - version "5.51.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.51.0.tgz#2d74626652096d966ef107f44b9479f02f51f271" - integrity sha512-fEV0R9gGmfpDeRzJXn+fGQKcl0inIeYobmmUWijZh9zA7bxJ8clPhV9up2ZQzATxAiFAECqPQyMDB4o4B81AaA== +"@typescript-eslint/parser@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.21.0.tgz#af8fcf66feee2edc86bc5d1cf45e33b0630bf35b" + integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ== dependencies: - "@typescript-eslint/scope-manager" "5.51.0" - "@typescript-eslint/types" "5.51.0" - "@typescript-eslint/typescript-estree" "5.51.0" + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/typescript-estree" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.51.0": - version "5.51.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.51.0.tgz#ad3e3c2ecf762d9a4196c0fbfe19b142ac498990" - integrity sha512-gNpxRdlx5qw3yaHA0SFuTjW4rxeYhpHxt491PEcKF8Z6zpq0kMhe0Tolxt0qjlojS+/wArSDlj/LtE69xUJphQ== - dependencies: - "@typescript-eslint/types" "5.51.0" - "@typescript-eslint/visitor-keys" "5.51.0" - "@typescript-eslint/scope-manager@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" @@ -6984,14 +7482,6 @@ "@typescript-eslint/types" "5.62.0" "@typescript-eslint/visitor-keys" "5.62.0" -"@typescript-eslint/scope-manager@6.13.1": - version "6.13.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.13.1.tgz#58c7c37c6a957d3d9f59bc4f64c2888e0cac1d70" - integrity sha512-BW0kJ7ceiKi56GbT2KKzZzN+nDxzQK2DS6x0PiSMPjciPgd/JRQGMibyaN2cPt2cAvuoH0oNvn2fwonHI+4QUQ== - dependencies: - "@typescript-eslint/types" "6.13.1" - "@typescript-eslint/visitor-keys" "6.13.1" - "@typescript-eslint/scope-manager@6.14.0": version "6.14.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.14.0.tgz#53d24363fdb5ee0d1d8cda4ed5e5321272ab3d48" @@ -7000,31 +7490,39 @@ "@typescript-eslint/types" "6.14.0" "@typescript-eslint/visitor-keys" "6.14.0" -"@typescript-eslint/scope-manager@6.15.0": - version "6.15.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.15.0.tgz#40e5214a3e9e048aca55ce33381bc61b6b51c32a" - integrity sha512-+BdvxYBltqrmgCNu4Li+fGDIkW9n//NrruzG9X1vBzaNK+ExVXPoGB71kneaVw/Jp+4rH/vaMAGC6JfMbHstVg== +"@typescript-eslint/scope-manager@6.19.0": + version "6.19.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.19.0.tgz#b6d2abb825b29ab70cb542d220e40c61c1678116" + integrity sha512-dO1XMhV2ehBI6QN8Ufi7I10wmUovmLU0Oru3n5LVlM2JuzB4M+dVphCPLkVpKvGij2j/pHBWuJ9piuXx+BhzxQ== + dependencies: + "@typescript-eslint/types" "6.19.0" + "@typescript-eslint/visitor-keys" "6.19.0" + +"@typescript-eslint/scope-manager@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz#ea8a9bfc8f1504a6ac5d59a6df308d3a0630a2b1" + integrity sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg== dependencies: - "@typescript-eslint/types" "6.15.0" - "@typescript-eslint/visitor-keys" "6.15.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" -"@typescript-eslint/type-utils@5.51.0": - version "5.51.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.51.0.tgz#7af48005531700b62a20963501d47dfb27095988" - integrity sha512-QHC5KKyfV8sNSyHqfNa0UbTbJ6caB8uhcx2hYcWVvJAZYJRBo5HyyZfzMdRx8nvS+GyMg56fugMzzWnojREuQQ== +"@typescript-eslint/type-utils@6.19.0": + version "6.19.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.19.0.tgz#522a494ef0d3e9fdc5e23a7c22c9331bbade0101" + integrity sha512-mcvS6WSWbjiSxKCwBcXtOM5pRkPQ6kcDds/juxcy/727IQr3xMEcwr/YLHW2A2+Fp5ql6khjbKBzOyjuPqGi/w== dependencies: - "@typescript-eslint/typescript-estree" "5.51.0" - "@typescript-eslint/utils" "5.51.0" + "@typescript-eslint/typescript-estree" "6.19.0" + "@typescript-eslint/utils" "6.19.0" debug "^4.3.4" - tsutils "^3.21.0" + ts-api-utils "^1.0.1" -"@typescript-eslint/type-utils@6.13.1": - version "6.13.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.13.1.tgz#e6e5885e387841cae9c38fc0638fd8b7561973d6" - integrity sha512-A2qPlgpxx2v//3meMqQyB1qqTg1h1dJvzca7TugM3Yc2USDY+fsRBiojAEo92HO7f5hW5mjAUF6qobOPzlBCBQ== +"@typescript-eslint/type-utils@6.21.0", "@typescript-eslint/type-utils@^6.13.2": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz#6473281cfed4dacabe8004e8521cee0bd9d4c01e" + integrity sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag== dependencies: - "@typescript-eslint/typescript-estree" "6.13.1" - "@typescript-eslint/utils" "6.13.1" + "@typescript-eslint/typescript-estree" "6.21.0" + "@typescript-eslint/utils" "6.21.0" debug "^4.3.4" ts-api-utils "^1.0.1" @@ -7038,43 +7536,25 @@ debug "^4.3.4" ts-api-utils "^1.0.1" -"@typescript-eslint/types@5.51.0": - version "5.51.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.51.0.tgz#e7c1622f46c7eea7e12bbf1edfb496d4dec37c90" - integrity sha512-SqOn0ANn/v6hFn0kjvLwiDi4AzR++CBZz0NV5AnusT2/3y32jdc0G4woXPWHCumWtUXZKPAS27/9vziSsC9jnw== - "@typescript-eslint/types@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== -"@typescript-eslint/types@6.13.1": - version "6.13.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.13.1.tgz#b56f26130e7eb8fa1e429c75fb969cae6ad7bb5c" - integrity sha512-gjeEskSmiEKKFIbnhDXUyiqVma1gRCQNbVZ1C8q7Zjcxh3WZMbzWVfGE9rHfWd1msQtPS0BVD9Jz9jded44eKg== - "@typescript-eslint/types@6.14.0": version "6.14.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.14.0.tgz#935307f7a931016b7a5eb25d494ea3e1f613e929" integrity sha512-uty9H2K4Xs8E47z3SnXEPRNDfsis8JO27amp2GNCnzGETEW3yTqEIVg5+AI7U276oGF/tw6ZA+UesxeQ104ceA== -"@typescript-eslint/types@6.15.0": - version "6.15.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.15.0.tgz#a9f7b006aee52b0948be6e03f521814bf435ddd5" - integrity sha512-yXjbt//E4T/ee8Ia1b5mGlbNj9fB9lJP4jqLbZualwpP2BCQ5is6BcWwxpIsY4XKAhmdv3hrW92GdtJbatC6dQ== +"@typescript-eslint/types@6.19.0": + version "6.19.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.19.0.tgz#689b0498c436272a6a2059b09f44bcbd90de294a" + integrity sha512-lFviGV/vYhOy3m8BJ/nAKoAyNhInTdXpftonhWle66XHAtT1ouBlkjL496b5H5hb8dWXHwtypTqgtb/DEa+j5A== -"@typescript-eslint/typescript-estree@5.51.0": - version "5.51.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.51.0.tgz#0ec8170d7247a892c2b21845b06c11eb0718f8de" - integrity sha512-TSkNupHvNRkoH9FMA3w7TazVFcBPveAAmb7Sz+kArY6sLT86PA5Vx80cKlYmd8m3Ha2SwofM1KwraF24lM9FvA== - dependencies: - "@typescript-eslint/types" "5.51.0" - "@typescript-eslint/visitor-keys" "5.51.0" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - semver "^7.3.7" - tsutils "^3.21.0" +"@typescript-eslint/types@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.21.0.tgz#205724c5123a8fef7ecd195075fa6e85bac3436d" + integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== "@typescript-eslint/typescript-estree@5.62.0": version "5.62.0" @@ -7089,19 +7569,6 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/typescript-estree@6.13.1": - version "6.13.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.13.1.tgz#d01dda78d2487434d1c503853fa00291c566efa4" - integrity sha512-sBLQsvOC0Q7LGcUHO5qpG1HxRgePbT6wwqOiGLpR8uOJvPJbfs0mW3jPA3ujsDvfiVwVlWUDESNXv44KtINkUQ== - dependencies: - "@typescript-eslint/types" "6.13.1" - "@typescript-eslint/visitor-keys" "6.13.1" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - semver "^7.5.4" - ts-api-utils "^1.0.1" - "@typescript-eslint/typescript-estree@6.14.0": version "6.14.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.14.0.tgz#90c7ddd45cd22139adf3d4577580d04c9189ac13" @@ -7115,45 +7582,33 @@ semver "^7.5.4" ts-api-utils "^1.0.1" -"@typescript-eslint/typescript-estree@6.15.0": - version "6.15.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.15.0.tgz#2f8a513df1ce5e6e1ba8e5c6aa52f392ae023fc5" - integrity sha512-7mVZJN7Hd15OmGuWrp2T9UvqR2Ecg+1j/Bp1jXUEY2GZKV6FXlOIoqVDmLpBiEiq3katvj/2n2mR0SDwtloCew== +"@typescript-eslint/typescript-estree@6.19.0": + version "6.19.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.19.0.tgz#0813ba364a409afb4d62348aec0202600cb468fa" + integrity sha512-o/zefXIbbLBZ8YJ51NlkSAt2BamrK6XOmuxSR3hynMIzzyMY33KuJ9vuMdFSXW+H0tVvdF9qBPTHA91HDb4BIQ== dependencies: - "@typescript-eslint/types" "6.15.0" - "@typescript-eslint/visitor-keys" "6.15.0" + "@typescript-eslint/types" "6.19.0" + "@typescript-eslint/visitor-keys" "6.19.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" + minimatch "9.0.3" semver "^7.5.4" ts-api-utils "^1.0.1" -"@typescript-eslint/utils@5.51.0": - version "5.51.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.51.0.tgz#074f4fabd5b12afe9c8aa6fdee881c050f8b4d47" - integrity sha512-76qs+5KWcaatmwtwsDJvBk4H76RJQBFe+Gext0EfJdC3Vd2kpY2Pf//OHHzHp84Ciw0/rYoGTDnIAr3uWhhJYw== - dependencies: - "@types/json-schema" "^7.0.9" - "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.51.0" - "@typescript-eslint/types" "5.51.0" - "@typescript-eslint/typescript-estree" "5.51.0" - eslint-scope "^5.1.1" - eslint-utils "^3.0.0" - semver "^7.3.7" - -"@typescript-eslint/utils@6.13.1": - version "6.13.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.13.1.tgz#925b3a2453a71ada914ae329b7bb7e7d96634b2f" - integrity sha512-ouPn/zVoan92JgAegesTXDB/oUp6BP1v8WpfYcqh649ejNc9Qv+B4FF2Ff626kO1xg0wWwwG48lAJ4JuesgdOw== +"@typescript-eslint/typescript-estree@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz#c47ae7901db3b8bddc3ecd73daff2d0895688c46" + integrity sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ== dependencies: - "@eslint-community/eslint-utils" "^4.4.0" - "@types/json-schema" "^7.0.12" - "@types/semver" "^7.5.0" - "@typescript-eslint/scope-manager" "6.13.1" - "@typescript-eslint/types" "6.13.1" - "@typescript-eslint/typescript-estree" "6.13.1" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + minimatch "9.0.3" semver "^7.5.4" + ts-api-utils "^1.0.1" "@typescript-eslint/utils@6.14.0": version "6.14.0" @@ -7168,6 +7623,32 @@ "@typescript-eslint/typescript-estree" "6.14.0" semver "^7.5.4" +"@typescript-eslint/utils@6.19.0": + version "6.19.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.19.0.tgz#557b72c3eeb4f73bef8037c85dae57b21beb1a4b" + integrity sha512-QR41YXySiuN++/dC9UArYOg4X86OAYP83OWTewpVx5ct1IZhjjgTLocj7QNxGhWoTqknsgpl7L+hGygCO+sdYw== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.12" + "@types/semver" "^7.5.0" + "@typescript-eslint/scope-manager" "6.19.0" + "@typescript-eslint/types" "6.19.0" + "@typescript-eslint/typescript-estree" "6.19.0" + semver "^7.5.4" + +"@typescript-eslint/utils@6.21.0", "@typescript-eslint/utils@^6.13.2": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.21.0.tgz#4714e7a6b39e773c1c8e97ec587f520840cd8134" + integrity sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.12" + "@types/semver" "^7.5.0" + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/typescript-estree" "6.21.0" + semver "^7.5.4" + "@typescript-eslint/utils@^5.45.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" @@ -7182,27 +7663,6 @@ eslint-scope "^5.1.1" semver "^7.3.7" -"@typescript-eslint/utils@^6.9.1": - version "6.15.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.15.0.tgz#f80dbb79f3b0f569077a8711dd44186a8933fa4c" - integrity sha512-eF82p0Wrrlt8fQSRL0bGXzK5nWPRV2dYQZdajcfzOD9+cQz9O7ugifrJxclB+xVOvWvagXfqS4Es7vpLP4augw== - dependencies: - "@eslint-community/eslint-utils" "^4.4.0" - "@types/json-schema" "^7.0.12" - "@types/semver" "^7.5.0" - "@typescript-eslint/scope-manager" "6.15.0" - "@typescript-eslint/types" "6.15.0" - "@typescript-eslint/typescript-estree" "6.15.0" - semver "^7.5.4" - -"@typescript-eslint/visitor-keys@5.51.0": - version "5.51.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.51.0.tgz#c0147dd9a36c0de758aaebd5b48cae1ec59eba87" - integrity sha512-Oh2+eTdjHjOFjKA27sxESlA87YPSOJafGCR0md5oeMdh1ZcCfAGCIOL216uTBAkAIptvLIfKQhl7lHxMJet4GQ== - dependencies: - "@typescript-eslint/types" "5.51.0" - eslint-visitor-keys "^3.3.0" - "@typescript-eslint/visitor-keys@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" @@ -7211,14 +7671,6 @@ "@typescript-eslint/types" "5.62.0" eslint-visitor-keys "^3.3.0" -"@typescript-eslint/visitor-keys@6.13.1": - version "6.13.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.13.1.tgz#c4b692dcc23a4fc60685b718f10fde789d65a540" - integrity sha512-NDhQUy2tg6XGNBGDRm1XybOHSia8mcXmlbKWoQP+nm1BIIMxa55shyJfZkHpEBN62KNPLrocSM2PdPcaLgDKMQ== - dependencies: - "@typescript-eslint/types" "6.13.1" - eslint-visitor-keys "^3.4.1" - "@typescript-eslint/visitor-keys@6.14.0": version "6.14.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.14.0.tgz#1d1d486581819287de824a56c22f32543561138e" @@ -7227,18 +7679,31 @@ "@typescript-eslint/types" "6.14.0" eslint-visitor-keys "^3.4.1" -"@typescript-eslint/visitor-keys@6.15.0": - version "6.15.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.15.0.tgz#5baf97a7bfeec6f4894d400437055155a46b2330" - integrity sha512-1zvtdC1a9h5Tb5jU9x3ADNXO9yjP8rXlaoChu0DQX40vf5ACVpYIVIZhIMZ6d5sDXH7vq4dsZBT1fEGj8D2n2w== +"@typescript-eslint/visitor-keys@6.19.0": + version "6.19.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.19.0.tgz#4565e0ecd63ca1f81b96f1dd76e49f746c6b2b49" + integrity sha512-hZaUCORLgubBvtGpp1JEFEazcuEdfxta9j4iUwdSAr7mEsYYAp3EAUyCZk3VEEqGj6W+AV4uWyrDGtrlawAsgQ== dependencies: - "@typescript-eslint/types" "6.15.0" + "@typescript-eslint/types" "6.19.0" eslint-visitor-keys "^3.4.1" -"@vitejs/plugin-basic-ssl@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.0.1.tgz#48c46eab21e0730921986ce742563ae83fe7fe34" - integrity sha512-pcub+YbFtFhaGRTo1832FQHQSHvMrlb43974e2eS8EKleR3p1cDdkJFPci1UhwkEf1J9Bz+wKBSzqpKp7nNj2A== +"@typescript-eslint/visitor-keys@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz#87a99d077aa507e20e238b11d56cc26ade45fe47" + integrity sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A== + dependencies: + "@typescript-eslint/types" "6.21.0" + eslint-visitor-keys "^3.4.1" + +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + +"@vitejs/plugin-basic-ssl@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.0.2.tgz#bac6553842b215f17b052d27c82e2b2ef29236dc" + integrity sha512-DKHKVtpI+eA5fvObVgQ3QtTGU70CcCnedalzqmGSR050AzKZMdUzgC8KmlOneHWH8dF2hJ3wkC9+8FDVAaDRCw== "@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": version "1.11.6" @@ -7452,7 +7917,7 @@ acorn-import-assertions@^1.9.0: resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== -acorn-jsx@^5.0.0, acorn-jsx@^5.3.2: +acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== @@ -7462,11 +7927,6 @@ acorn-walk@^8.0.2, acorn-walk@^8.1.1: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== -acorn@^6.0.7: - version "6.4.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" - integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== - acorn@^8.1.0, acorn@^8.10.0, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.1, acorn@^8.8.2, acorn@^8.9.0: version "8.10.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" @@ -7541,7 +8001,7 @@ ajv@8.10.0: require-from-string "^2.0.2" uri-js "^4.2.2" -ajv@8.12.0, ajv@^8.0.0, ajv@^8.9.0: +ajv@8.12.0, ajv@^8.0.0, ajv@^8.12.0, ajv@^8.9.0: version "8.12.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== @@ -7551,7 +8011,7 @@ ajv@8.12.0, ajv@^8.0.0, ajv@^8.9.0: require-from-string "^2.0.2" uri-js "^4.2.2" -ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1: +ajv@^6.12.4, ajv@^6.12.5: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -7580,7 +8040,7 @@ ansi-colors@4.1.3, ansi-colors@^4.1.1: resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== -ansi-escapes@^3.0.0, ansi-escapes@^3.2.0: +ansi-escapes@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== @@ -7607,11 +8067,6 @@ ansi-regex@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== -ansi-regex@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" - integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== - ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" @@ -7627,7 +8082,7 @@ ansi-styles@^2.2.1: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA== -ansi-styles@^3.2.0, ansi-styles@^3.2.1: +ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== @@ -7736,21 +8191,6 @@ aria-query@^3.0.0: ast-types-flow "0.0.7" commander "^2.11.0" -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== - array-buffer-byte-length@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" @@ -7769,7 +8209,7 @@ array-flatten@^2.1.2: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== -array-includes@^3.1.6: +array-includes@^3.1.7: version "3.1.7" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda" integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ== @@ -7785,13 +8225,6 @@ array-timsort@^1.0.3: resolved "https://registry.yarnpkg.com/array-timsort/-/array-timsort-1.0.3.tgz#3c9e4199e54fb2b9c3fe5976396a21614ef0d926" integrity sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ== -array-union@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - integrity sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng== - dependencies: - array-uniq "^1.0.1" - array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" @@ -7802,17 +8235,29 @@ array-union@^3.0.1: resolved "https://registry.yarnpkg.com/array-union/-/array-union-3.0.1.tgz#da52630d327f8b88cfbfb57728e2af5cd9b6b975" integrity sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw== -array-uniq@^1.0.1: +array.prototype.filter@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== + resolved "https://registry.yarnpkg.com/array.prototype.filter/-/array.prototype.filter-1.0.3.tgz#423771edeb417ff5914111fff4277ea0624c0d0e" + integrity sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-array-method-boxes-properly "^1.0.0" + is-string "^1.0.7" -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== +array.prototype.findlastindex@^1.2.3: + version "1.2.4" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.4.tgz#d1c50f0b3a9da191981ff8942a0aedd82794404f" + integrity sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.3.0" + es-shim-unscopables "^1.0.2" -array.prototype.flat@^1.3.1: +array.prototype.flat@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== @@ -7822,7 +8267,7 @@ array.prototype.flat@^1.3.1: es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" -array.prototype.flatmap@^1.3.1: +array.prototype.flatmap@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== @@ -7882,11 +8327,6 @@ assert@^2.0.0, assert@^2.1.0: object.assign "^4.1.4" util "^0.12.5" -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== - ast-types-flow@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" @@ -7906,16 +8346,6 @@ ast-types@^0.16.1: dependencies: tslib "^2.0.1" -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== - -async-each-series@0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/async-each-series/-/async-each-series-0.1.1.tgz#7617c1917401fd8ca4a28aadce3dbae98afeb432" - integrity sha512-p4jj6Fws4Iy2m0iCmI2am2ZNZCgbdgE+P8F/8csmn2vx7ixXrO2zGcuNsD46X5uZSVecmkEy/M06X2vG8KD6dQ== - async-limiter@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" @@ -7926,7 +8356,7 @@ async@3.2.0: resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720" integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw== -async@^2.6.0, async@^2.6.4: +async@^2.6.4: version "2.6.4" resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== @@ -7948,11 +8378,6 @@ at-least-node@^1.0.0: resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - autoprefixer@10.4.16, autoprefixer@^10.4.9: version "10.4.16" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.16.tgz#fad1411024d8670880bdece3970aa72e3572feb8" @@ -7980,19 +8405,19 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== -axios@0.21.4, axios@^0.21.4: +axios@^0.21.4: version "0.21.4" resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== dependencies: follow-redirects "^1.14.0" -axios@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.5.1.tgz#11fbaa11fc35f431193a9564109c88c1f27b585f" - integrity sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A== +axios@^1.6.0: + version "1.6.7" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.7.tgz#7b48c2e27c96f9c68a2f8f31e2ab19f59b06b0a7" + integrity sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA== dependencies: - follow-redirects "^1.15.0" + follow-redirects "^1.15.4" form-data "^4.0.0" proxy-from-env "^1.1.0" @@ -8093,6 +8518,15 @@ babel-plugin-polyfill-corejs2@^0.4.6: "@babel/helper-define-polyfill-provider" "^0.4.3" semver "^6.3.1" +babel-plugin-polyfill-corejs2@^0.4.7, babel-plugin-polyfill-corejs2@^0.4.8: + version "0.4.8" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz#dbcc3c8ca758a290d47c3c6a490d59429b0d2269" + integrity sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg== + dependencies: + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.5.0" + semver "^6.3.1" + babel-plugin-polyfill-corejs3@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz#56ad88237137eade485a71b52f72dbed57c6230a" @@ -8109,6 +8543,22 @@ babel-plugin-polyfill-corejs3@^0.8.5: "@babel/helper-define-polyfill-provider" "^0.4.3" core-js-compat "^3.33.1" +babel-plugin-polyfill-corejs3@^0.8.7: + version "0.8.7" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz#941855aa7fdaac06ed24c730a93450d2b2b76d04" + integrity sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.4.4" + core-js-compat "^3.33.1" + +babel-plugin-polyfill-corejs3@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.9.0.tgz#9eea32349d94556c2ad3ab9b82ebb27d4bf04a81" + integrity sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.5.0" + core-js-compat "^3.34.0" + babel-plugin-polyfill-regenerator@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz#390f91c38d90473592ed43351e801a9d3e0fd747" @@ -8123,6 +8573,13 @@ babel-plugin-polyfill-regenerator@^0.5.3: dependencies: "@babel/helper-define-polyfill-provider" "^0.4.3" +babel-plugin-polyfill-regenerator@^0.5.4, babel-plugin-polyfill-regenerator@^0.5.5: + version "0.5.5" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz#8b0c8fc6434239e5d7b8a9d1f832bb2b0310f06a" + integrity sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.5.0" + babel-plugin-transform-typescript-metadata@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/babel-plugin-transform-typescript-metadata/-/babel-plugin-transform-typescript-metadata-0.3.2.tgz#7a327842d8c36ffe07ee1b5276434e56c297c9b7" @@ -8171,29 +8628,11 @@ base64-js@^1.2.0, base64-js@^1.3.0, base64-js@^1.3.1: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -base64id@2.0.0, base64id@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" - integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== - base64url@3.x.x: version "3.0.1" resolved "https://registry.yarnpkg.com/base64url/-/base64url-3.0.1.tgz#6399d572e2bc3f90a9a8b22d5dbb0a32d33f788d" integrity sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A== -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - basic-auth@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" @@ -8376,22 +8815,6 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" @@ -8404,63 +8827,6 @@ browser-assert@^1.2.1: resolved "https://registry.yarnpkg.com/browser-assert/-/browser-assert-1.2.1.tgz#9aaa5a2a8c74685c2ae05bfe46efd606f068c200" integrity sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ== -browser-sync-client@^2.29.3: - version "2.29.3" - resolved "https://registry.yarnpkg.com/browser-sync-client/-/browser-sync-client-2.29.3.tgz#9300b97f42abc2c4f95ca29b5a9781b5c492f14a" - integrity sha512-4tK5JKCl7v/3aLbmCBMzpufiYLsB1+UI+7tUXCCp5qF0AllHy/jAqYu6k7hUF3hYtlClKpxExWaR+rH+ny07wQ== - dependencies: - etag "1.8.1" - fresh "0.5.2" - mitt "^1.1.3" - -browser-sync-ui@^2.29.3: - version "2.29.3" - resolved "https://registry.yarnpkg.com/browser-sync-ui/-/browser-sync-ui-2.29.3.tgz#35e2ce3b470dce6b7219307cac7278bf324a0f16" - integrity sha512-kBYOIQjU/D/3kYtUIJtj82e797Egk1FB2broqItkr3i4eF1qiHbFCG6srksu9gWhfmuM/TNG76jMfzAdxEPakg== - dependencies: - async-each-series "0.1.1" - chalk "4.1.2" - connect-history-api-fallback "^1" - immutable "^3" - server-destroy "1.0.1" - socket.io-client "^4.4.1" - stream-throttle "^0.1.3" - -browser-sync@2.29.3: - version "2.29.3" - resolved "https://registry.yarnpkg.com/browser-sync/-/browser-sync-2.29.3.tgz#c2a3ff00c659eb87a13cae9d7a427e1b4b580ee1" - integrity sha512-NiM38O6XU84+MN+gzspVmXV2fTOoe+jBqIBx3IBdhZrdeURr6ZgznJr/p+hQ+KzkKEiGH/GcC4SQFSL0jV49bg== - dependencies: - browser-sync-client "^2.29.3" - browser-sync-ui "^2.29.3" - bs-recipes "1.3.4" - chalk "4.1.2" - chokidar "^3.5.1" - connect "3.6.6" - connect-history-api-fallback "^1" - dev-ip "^1.0.1" - easy-extender "^2.3.4" - eazy-logger "^4.0.1" - etag "^1.8.1" - fresh "^0.5.2" - fs-extra "3.0.1" - http-proxy "^1.18.1" - immutable "^3" - localtunnel "^2.0.1" - micromatch "^4.0.2" - opn "5.3.0" - portscanner "2.2.0" - raw-body "^2.3.2" - resp-modifier "6.0.2" - rx "4.1.0" - send "0.16.2" - serve-index "1.9.1" - serve-static "1.13.2" - server-destroy "1.0.1" - socket.io "^4.4.1" - ua-parser-js "^1.0.33" - yargs "^17.3.1" - browserify-zlib@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d" @@ -8495,11 +8861,6 @@ bs-logger@0.x, bs-logger@^0.2.6: dependencies: fast-json-stable-stringify "2.x" -bs-recipes@1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/bs-recipes/-/bs-recipes-1.3.4.tgz#0d2d4d48a718c8c044769fdc4f89592dc8b69585" - integrity sha512-BXvDkqhDNxXEjeGM8LFkSbR+jzmP/CYpCiVKYn+soB1dDldeU15EBNDkwVXndKuX35wnNUaPd0qSoQEAkmQtMw== - bser@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" @@ -8530,11 +8891,6 @@ buffer@^5.5.0: base64-js "^1.3.1" ieee754 "^1.1.13" -builtin-modules@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" - integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== - builtins@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.0.1.tgz#87f6db9ab0458be728564fa81d876d8d74552fa9" @@ -8591,21 +8947,6 @@ cacache@^18.0.0: tar "^6.1.11" unique-filename "^3.0.0" -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - cache-manager-redis-store@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/cache-manager-redis-store/-/cache-manager-redis-store-2.0.0.tgz#25db93656c4ab7b3591bd6ca370e188ef90754c9" @@ -8654,30 +8995,6 @@ call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.4, call-bind@^1.0.5: get-intrinsic "^1.2.1" set-function-length "^1.1.1" -call-me-maybe@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.2.tgz#03f964f19522ba643b1b0693acb9152fe2074baa" - integrity sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ== - -caller-callsite@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" - integrity sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ== - dependencies: - callsites "^2.0.0" - -caller-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" - integrity sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A== - dependencies: - caller-callsite "^2.0.0" - -callsites@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" - integrity sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ== - callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -8691,7 +9008,7 @@ camel-case@^4.1.2: pascal-case "^3.1.2" tslib "^2.0.3" -camelcase@^5.0.0, camelcase@^5.3.1: +camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== @@ -8731,35 +9048,6 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== -cbor-extract@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/cbor-extract/-/cbor-extract-2.1.1.tgz#f154b31529fdb6b7c70fb3ca448f44eda96a1b42" - integrity sha512-1UX977+L+zOJHsp0mWFG13GLwO6ucKgSmSW6JTl8B9GUvACvHeIVpFqhU92299Z6PfD09aTXDell5p+lp1rUFA== - dependencies: - node-gyp-build-optional-packages "5.0.3" - optionalDependencies: - "@cbor-extract/cbor-extract-darwin-arm64" "2.1.1" - "@cbor-extract/cbor-extract-darwin-x64" "2.1.1" - "@cbor-extract/cbor-extract-linux-arm" "2.1.1" - "@cbor-extract/cbor-extract-linux-arm64" "2.1.1" - "@cbor-extract/cbor-extract-linux-x64" "2.1.1" - "@cbor-extract/cbor-extract-win32-x64" "2.1.1" - -cbor-x@^1.5.2: - version "1.5.4" - resolved "https://registry.yarnpkg.com/cbor-x/-/cbor-x-1.5.4.tgz#8f0754fa8589cbd7339b613b2b5717d133508e98" - integrity sha512-PVKILDn+Rf6MRhhcyzGXi5eizn1i0i3F8Fe6UMMxXBnWkalq9+C5+VTmlIjAYM4iF2IYF2N+zToqAfYOp+3rfw== - optionalDependencies: - cbor-extract "^2.1.1" - -chalk@4.1.2, chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - chalk@^1.0.0, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -8771,7 +9059,7 @@ chalk@^1.0.0, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: +chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -8780,6 +9068,14 @@ chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + chalk@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" @@ -8852,7 +9148,7 @@ cheerio@1.0.0-rc.12: parse5 "^7.0.0" parse5-htmlparser2-tree-adapter "^7.0.0" -chokidar@3.5.3, "chokidar@>=3.0.0 <4.0.0", chokidar@^3.0.0, chokidar@^3.5.1, chokidar@^3.5.3: +"chokidar@>=3.0.0 <4.0.0", chokidar@^3.0.0, chokidar@^3.5.3: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== @@ -8902,16 +9198,6 @@ class-transformer@0.5.1: resolved "https://registry.yarnpkg.com/class-transformer/-/class-transformer-0.5.1.tgz#24147d5dffd2a6cea930a3250a677addf96ab336" integrity sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw== -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - class-validator@0.14.0: version "0.14.0" resolved "https://registry.yarnpkg.com/class-validator/-/class-validator-0.14.0.tgz#40ed0ecf3c83b2a8a6a320f4edb607be0f0df159" @@ -8986,11 +9272,6 @@ cli-truncate@^0.2.1: slice-ansi "0.0.4" string-width "^1.0.1" -cli-width@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" - integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== - cli-width@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-4.1.0.tgz#42daac41d3c254ef38ad8ac037672130173691c5" @@ -9005,24 +9286,6 @@ clipboard@^2.0.11: select "^1.1.2" tiny-emitter "^2.0.0" -cliui@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" - integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== - dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - wrap-ansi "^2.0.0" - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - cliui@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" @@ -9093,14 +9356,6 @@ collect-v8-coverage@^1.0.0: resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -9176,7 +9431,7 @@ commander@7, commander@^7.2.0: resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== -commander@^2.11.0, commander@^2.15.0, commander@^2.2.0, commander@^2.20.0: +commander@^2.11.0, commander@^2.15.0, commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -9222,11 +9477,6 @@ commondir@^1.0.1: resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== -component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - compressible@~2.0.16: version "2.0.18" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" @@ -9267,26 +9517,11 @@ confusing-browser-globals@^1.0.9: resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81" integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== -connect-history-api-fallback@^1: - version "1.6.0" - resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" - integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== - connect-history-api-fallback@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== -connect@3.6.6: - version "3.6.6" - resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.6.tgz#09eff6c55af7236e137135a72574858b6786f524" - integrity sha512-OO7axMmPpu/2XuX1+2Yrg0ddju31B6xLZMWkJ5rYBu4YRmRVlOjvlY6kw2FJKiAzyxGwnrDUAG4s1Pf0sbBMCQ== - dependencies: - debug "2.6.9" - finalhandler "1.1.0" - parseurl "~1.3.2" - utils-merge "1.0.1" - consola@^2.15.0: version "2.15.3" resolved "https://registry.yarnpkg.com/consola/-/consola-2.15.3.tgz#2e11f98d6a4be71ff72e0bdf07bd23e12cb61550" @@ -9334,11 +9569,6 @@ cookie@0.5.0: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== -cookie@~0.4.1: - version "0.4.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" - integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== - copy-anything@^2.0.1: version "2.0.6" resolved "https://registry.yarnpkg.com/copy-anything/-/copy-anything-2.0.6.tgz#092454ea9584a7b7ad5573062b2a87f5900fc480" @@ -9346,11 +9576,6 @@ copy-anything@^2.0.1: dependencies: is-what "^3.14.1" -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== - copy-webpack-plugin@11.0.0: version "11.0.0" resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz#96d4dbdb5f73d02dd72d0528d1958721ab72e04a" @@ -9382,6 +9607,13 @@ core-js-compat@^3.25.1, core-js-compat@^3.31.0, core-js-compat@^3.33.1: dependencies: browserslist "^4.22.1" +core-js-compat@^3.34.0: + version "3.35.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.35.1.tgz#215247d7edb9e830efa4218ff719beb2803555e2" + integrity sha512-sftHa5qUJY3rs9Zht1WEnmkvXputCyDBczPnr7QDgL8n3qrF3CMXY4VPSYtOLLiOUJcah2WNXREd48iOl6mQIw== + dependencies: + browserslist "^4.22.2" + core-util-is@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -9392,7 +9624,7 @@ core-util-is@^1.0.3, core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== -cors@2.8.5, cors@~2.8.5: +cors@2.8.5: version "2.8.5" resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== @@ -9419,16 +9651,6 @@ cose-base@^2.2.0: dependencies: layout-base "^2.0.0" -cosmiconfig@^5.0.5: - version "5.2.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" - integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== - dependencies: - import-fresh "^2.0.0" - is-directory "^0.3.1" - js-yaml "^3.13.1" - parse-json "^4.0.0" - cosmiconfig@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" @@ -9451,7 +9673,7 @@ cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: path-type "^4.0.0" yaml "^1.10.0" -cosmiconfig@^8.2.0: +cosmiconfig@^8.3.5: version "8.3.6" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== @@ -9466,10 +9688,10 @@ countries-and-timezones@3.4.1: resolved "https://registry.yarnpkg.com/countries-and-timezones/-/countries-and-timezones-3.4.1.tgz#0ec2540f57e42f0f740eb2acaede786043347fe1" integrity sha512-INeHGCony4XUUR8iGL/lmt9s1Oi+n+gFHeJAMfbV5hJfYeDOB8JG1oxz5xFQu5oBZoRCJe/87k1Vzue9DoIauA== -countries-list@2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/countries-list/-/countries-list-2.6.1.tgz#d479757ac873b1e596ccea0a925962d20396c0cb" - integrity sha512-jXM1Nv3U56dPQ1DsUSsEaGmLHburo4fnB7m+1yhWDUVvx5gXCd1ok/y3gXCjXzhqyawG+igcPYcAl4qjkvopaQ== +countries-list@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/countries-list/-/countries-list-3.1.0.tgz#1cbe32f58659c7d6a1e744917689f24c84333ea8" + integrity sha512-HpTBLZba1VPTZSjUnUwR7SykxV7Z/7/+ZM5x5wi5tO99Qvom6bE2SC+AQ18016ujg3jSlYBbMITrHNnPAHSM9Q== countup.js@2.3.2: version "2.3.2" @@ -9535,17 +9757,6 @@ cross-fetch@^4.0.0: dependencies: node-fetch "^2.6.12" -cross-spawn@^6.0.0, cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -10112,27 +10323,20 @@ dayjs@^1.11.7: resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.10.tgz#68acea85317a6e164457d6d6947564029a6a16a0" integrity sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ== -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: +debug@2.6.9, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2: +debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" -debug@4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" - integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== - dependencies: - ms "2.1.2" - debug@^3.1.0, debug@^3.2.6, debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" @@ -10145,11 +10349,6 @@ debuglog@^1.0.0: resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" integrity sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw== -decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== - decimal.js@^10.4.2: version "10.4.3" resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" @@ -10162,11 +10361,6 @@ decode-named-character-reference@^1.0.0: dependencies: character-entities "^2.0.0" -decode-uri-component@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" - integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== - decompress-response@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" @@ -10230,7 +10424,7 @@ define-lazy-prop@^2.0.0: resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== -define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: +define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0, define-properties@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== @@ -10239,28 +10433,6 @@ define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: has-property-descriptors "^1.0.0" object-keys "^1.1.1" -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - defu@^6.1.2: version "6.1.3" resolved "https://registry.yarnpkg.com/defu/-/defu-6.1.3.tgz#6d7f56bc61668e844f9f593ace66fd67ef1205fd" @@ -10337,21 +10509,11 @@ destroy@1.2.0: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - integrity sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg== - detect-indent@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== -detect-newline@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" - integrity sha512-CwffZFvlJffUg9zZA0uqrjQayUTC8ob94pnr5sFwaVv3IOmkfUHcWH+jXaQK3askE51Cqe8/9Ql/0uXNwqZ8Zg== - detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" @@ -10382,11 +10544,6 @@ detect-port@^1.3.0, detect-port@^1.5.1: address "^1.0.1" debug "4" -dev-ip@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/dev-ip/-/dev-ip-1.0.1.tgz#a76a3ed1855be7a012bb8ac16cb80f3c00dc28f0" - integrity sha512-LmVkry/oDShEgSZPNgqCIp2/TlqtExeGmymru3uCELnfyjY11IzpAproLYs+1X88fXO6DBoYP3ul2Xo2yz2j6A== - diff-sequences@^29.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" @@ -10402,13 +10559,6 @@ diff@^5.0.0: resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== -dir-glob@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" - integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== - dependencies: - path-type "^3.0.0" - dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -10559,20 +10709,6 @@ eastasianwidth@^0.2.0: resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== -easy-extender@^2.3.4: - version "2.3.4" - resolved "https://registry.yarnpkg.com/easy-extender/-/easy-extender-2.3.4.tgz#298789b64f9aaba62169c77a2b3b64b4c9589b8f" - integrity sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q== - dependencies: - lodash "^4.17.10" - -eazy-logger@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/eazy-logger/-/eazy-logger-4.0.1.tgz#2e9fe487fb14ed6ac20d5f01d90dff377d403041" - integrity sha512-2GSFtnnC6U4IEKhEI7+PvdxrmjJ04mdsj3wHZTFiw0tUtG4HCWzTr13ZYTk8XOGnA1xQMaDljoBOYlk3D/MMSw== - dependencies: - chalk "4.1.2" - ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" @@ -10625,11 +10761,6 @@ emittery@^0.13.1: resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== - emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -10650,7 +10781,7 @@ emojis-list@^3.0.0: resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== -encodeurl@~1.0.1, encodeurl@~1.0.2: +encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== @@ -10669,38 +10800,6 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: dependencies: once "^1.4.0" -engine.io-client@~6.5.2: - version "6.5.3" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.5.3.tgz#4cf6fa24845029b238f83c628916d9149c399bc5" - integrity sha512-9Z0qLB0NIisTRt1DZ/8U2k12RJn8yls/nXMZLn+/N8hANT3TcYjKFKcwbw5zFQiN4NTde3TSY9zb79e1ij6j9Q== - dependencies: - "@socket.io/component-emitter" "~3.1.0" - debug "~4.3.1" - engine.io-parser "~5.2.1" - ws "~8.11.0" - xmlhttprequest-ssl "~2.0.0" - -engine.io-parser@~5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.1.tgz#9f213c77512ff1a6cc0c7a86108a7ffceb16fcfb" - integrity sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ== - -engine.io@~6.5.2: - version "6.5.4" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.5.4.tgz#6822debf324e781add2254e912f8568508850cdc" - integrity sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg== - dependencies: - "@types/cookie" "^0.4.1" - "@types/cors" "^2.8.12" - "@types/node" ">=10.0.0" - accepts "~1.3.4" - base64id "2.0.0" - cookie "~0.4.1" - cors "~2.8.5" - debug "~4.3.1" - engine.io-parser "~5.2.1" - ws "~8.11.0" - enhanced-resolve@^5.0.0, enhanced-resolve@^5.15.0, enhanced-resolve@^5.7.0: version "5.15.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" @@ -10762,7 +10861,7 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.22.1: +es-abstract@^1.22.1, es-abstract@^1.22.3: version "1.22.3" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.3.tgz#48e79f5573198de6dee3589195727f4f74bc4f32" integrity sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA== @@ -10807,6 +10906,16 @@ es-abstract@^1.22.1: unbox-primitive "^1.0.2" which-typed-array "^1.1.13" +es-array-method-boxes-properly@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" + integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== + +es-errors@^1.0.0, es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + es-module-lexer@^1.2.1: version "1.3.1" resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.1.tgz#c1b0dd5ada807a3b3155315911f364dc4e909db1" @@ -10826,7 +10935,7 @@ es-set-tostringtag@^2.0.1: has-tostringtag "^1.0.0" hasown "^2.0.0" -es-shim-unscopables@^1.0.0: +es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== @@ -10854,12 +10963,46 @@ esbuild-register@^3.4.0, esbuild-register@^3.5.0: dependencies: debug "^4.3.4" -esbuild-wasm@0.19.5, esbuild-wasm@>=0.13.8: +esbuild-wasm@0.19.11: + version "0.19.11" + resolved "https://registry.yarnpkg.com/esbuild-wasm/-/esbuild-wasm-0.19.11.tgz#4ed96cdd1a289bc08432a25fd38b7331d3eac98d" + integrity sha512-MIhnpc1TxERUHomteO/ZZHp+kUawGEc03D/8vMHGzffLvbFLeDe6mwxqEZwlqBNY7SLWbyp6bBQAcCen8+wpjQ== + +esbuild-wasm@>=0.13.8: version "0.19.5" resolved "https://registry.yarnpkg.com/esbuild-wasm/-/esbuild-wasm-0.19.5.tgz#28f4563d7e3bcbe9462813e376b2fb6024931fd9" integrity sha512-7zmLLn2QCj93XfMmHtzrDJ1UBuOHB2CZz1ghoCEZiRajxjUvHsF40PnbzFIY/pmesqPRaEtEWii0uzsTbnAgrA== -esbuild@0.19.5, esbuild@>=0.13.8: +esbuild@0.19.11: + version "0.19.11" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.11.tgz#4a02dca031e768b5556606e1b468fe72e3325d96" + integrity sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA== + optionalDependencies: + "@esbuild/aix-ppc64" "0.19.11" + "@esbuild/android-arm" "0.19.11" + "@esbuild/android-arm64" "0.19.11" + "@esbuild/android-x64" "0.19.11" + "@esbuild/darwin-arm64" "0.19.11" + "@esbuild/darwin-x64" "0.19.11" + "@esbuild/freebsd-arm64" "0.19.11" + "@esbuild/freebsd-x64" "0.19.11" + "@esbuild/linux-arm" "0.19.11" + "@esbuild/linux-arm64" "0.19.11" + "@esbuild/linux-ia32" "0.19.11" + "@esbuild/linux-loong64" "0.19.11" + "@esbuild/linux-mips64el" "0.19.11" + "@esbuild/linux-ppc64" "0.19.11" + "@esbuild/linux-riscv64" "0.19.11" + "@esbuild/linux-s390x" "0.19.11" + "@esbuild/linux-x64" "0.19.11" + "@esbuild/netbsd-x64" "0.19.11" + "@esbuild/openbsd-x64" "0.19.11" + "@esbuild/sunos-x64" "0.19.11" + "@esbuild/win32-arm64" "0.19.11" + "@esbuild/win32-ia32" "0.19.11" + "@esbuild/win32-x64" "0.19.11" + +esbuild@>=0.13.8: version "0.19.5" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.5.tgz#53a0e19dfbf61ba6c827d51a80813cf071239a8c" integrity sha512-bUxalY7b1g8vNhQKdB24QDmHeY4V4tw/s6Ak5z+jJX9laP5MoQseTOMemAr0gxssjNcH0MCViG8ONI2kksvfFQ== @@ -10915,7 +11058,7 @@ esbuild@^0.17.0: "@esbuild/win32-ia32" "0.17.19" "@esbuild/win32-x64" "0.17.19" -esbuild@^0.18.0, esbuild@^0.18.10: +esbuild@^0.18.0: version "0.18.20" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.18.20.tgz#4709f5a34801b43b799ab7d6d82f7284a9b7a7a6" integrity sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA== @@ -10943,6 +11086,35 @@ esbuild@^0.18.0, esbuild@^0.18.10: "@esbuild/win32-ia32" "0.18.20" "@esbuild/win32-x64" "0.18.20" +esbuild@^0.19.3: + version "0.19.12" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.12.tgz#dc82ee5dc79e82f5a5c3b4323a2a641827db3e04" + integrity sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg== + optionalDependencies: + "@esbuild/aix-ppc64" "0.19.12" + "@esbuild/android-arm" "0.19.12" + "@esbuild/android-arm64" "0.19.12" + "@esbuild/android-x64" "0.19.12" + "@esbuild/darwin-arm64" "0.19.12" + "@esbuild/darwin-x64" "0.19.12" + "@esbuild/freebsd-arm64" "0.19.12" + "@esbuild/freebsd-x64" "0.19.12" + "@esbuild/linux-arm" "0.19.12" + "@esbuild/linux-arm64" "0.19.12" + "@esbuild/linux-ia32" "0.19.12" + "@esbuild/linux-loong64" "0.19.12" + "@esbuild/linux-mips64el" "0.19.12" + "@esbuild/linux-ppc64" "0.19.12" + "@esbuild/linux-riscv64" "0.19.12" + "@esbuild/linux-s390x" "0.19.12" + "@esbuild/linux-x64" "0.19.12" + "@esbuild/netbsd-x64" "0.19.12" + "@esbuild/openbsd-x64" "0.19.12" + "@esbuild/sunos-x64" "0.19.12" + "@esbuild/win32-arm64" "0.19.12" + "@esbuild/win32-ia32" "0.19.12" + "@esbuild/win32-x64" "0.19.12" + escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -11001,7 +11173,7 @@ eslint-config-prettier@9.1.0: resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz#31af3d94578645966c082fcb71a5846d3c94867f" integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw== -eslint-import-resolver-node@^0.3.7: +eslint-import-resolver-node@^0.3.9: version "0.3.9" resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== @@ -11010,45 +11182,47 @@ eslint-import-resolver-node@^0.3.7: is-core-module "^2.13.0" resolve "^1.22.4" -eslint-module-utils@^2.7.4: +eslint-module-utils@^2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== dependencies: debug "^3.2.7" -eslint-plugin-cypress@2.14.0: - version "2.14.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-cypress/-/eslint-plugin-cypress-2.14.0.tgz#c65e1f592680dd25bbd00c86194ee85fecf59bd7" - integrity sha512-eW6tv7iIg7xujleAJX4Ujm649Bf5jweqa4ObPEIuueYRyLZt7qXGWhCY/n4bfeFW/j6nQZwbIBHKZt6EKcL/cg== +eslint-plugin-cypress@2.15.1: + version "2.15.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-cypress/-/eslint-plugin-cypress-2.15.1.tgz#336afa7e8e27451afaf65aa359c9509e0a4f3a7b" + integrity sha512-eLHLWP5Q+I4j2AWepYq0PgFEei9/s5LvjuSqWrxurkg1YZ8ltxdvMNmdSf0drnsNo57CTgYY/NIHHLRSWejR7w== dependencies: globals "^13.20.0" -eslint-plugin-import@2.27.5: - version "2.27.5" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz#876a6d03f52608a3e5bb439c2550588e51dd6c65" - integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== +eslint-plugin-import@2.29.1: + version "2.29.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" + integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== dependencies: - array-includes "^3.1.6" - array.prototype.flat "^1.3.1" - array.prototype.flatmap "^1.3.1" + array-includes "^3.1.7" + array.prototype.findlastindex "^1.2.3" + array.prototype.flat "^1.3.2" + array.prototype.flatmap "^1.3.2" debug "^3.2.7" doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.7" - eslint-module-utils "^2.7.4" - has "^1.0.3" - is-core-module "^2.11.0" + eslint-import-resolver-node "^0.3.9" + eslint-module-utils "^2.8.0" + hasown "^2.0.0" + is-core-module "^2.13.1" is-glob "^4.0.3" minimatch "^3.1.2" - object.values "^1.1.6" - resolve "^1.22.1" - semver "^6.3.0" - tsconfig-paths "^3.14.1" + object.fromentries "^2.0.7" + object.groupby "^1.0.1" + object.values "^1.1.7" + semver "^6.3.1" + tsconfig-paths "^3.15.0" -eslint-plugin-storybook@0.6.12: - version "0.6.12" - resolved "https://registry.yarnpkg.com/eslint-plugin-storybook/-/eslint-plugin-storybook-0.6.12.tgz#7bdb3392bb03bebde40ed19accfd61246e9d6301" - integrity sha512-XbIvrq6hNVG6rpdBr+eBw63QhOMLpZneQVSooEDow8aQCWGCk/5vqtap1yxpVydNfSxi3S/3mBBRLQqKUqQRww== +eslint-plugin-storybook@0.6.15: + version "0.6.15" + resolved "https://registry.yarnpkg.com/eslint-plugin-storybook/-/eslint-plugin-storybook-0.6.15.tgz#8a091605b0a90974ec8e62d8112db6c4bd3a6faa" + integrity sha512-lAGqVAJGob47Griu29KXYowI4G7KwMoJDOkEip8ujikuDLxU+oWJ1l0WL6F2oDO4QiyUFXvtDkEkISMOPzo+7w== dependencies: "@storybook/csf" "^0.0.1" "@typescript-eslint/utils" "^5.45.0" @@ -11063,15 +11237,7 @@ eslint-scope@5.1.1, eslint-scope@^5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-scope@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" - integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-scope@^7.0.0, eslint-scope@^7.1.1: +eslint-scope@^7.2.2: version "7.2.2" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== @@ -11079,132 +11245,64 @@ eslint-scope@^7.0.0, eslint-scope@^7.1.1: esrecurse "^4.3.0" estraverse "^5.2.0" -eslint-utils@^1.3.1: - version "1.4.3" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" - integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" - integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== +eslint-scope@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.0.0.tgz#7b6b067599c436404ce856cd2c47331464603a4a" + integrity sha512-zj3Byw6jX4TcFCJmxOzLt6iol5FAr9xQyZZSQjEzW2UiCJXLwXdRIKCYVFftnpZckaC9Ps9xlC7jB8tSeWWOaw== dependencies: - eslint-visitor-keys "^2.0.0" - -eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== - -eslint-visitor-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + esrecurse "^4.3.0" + estraverse "^5.2.0" -eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: +eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: version "3.4.3" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint@8.33.0: - version "8.33.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.33.0.tgz#02f110f32998cb598c6461f24f4d306e41ca33d7" - integrity sha512-WjOpFQgKK8VrCnAtl8We0SUOy/oVZ5NHykyMiagV1M9r8IFpIJX7DduK6n1mpfhlG7T1NLWm2SuD8QB7KFySaA== +eslint@8.56.0, eslint@^8.0.0: + version "8.56.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.56.0.tgz#4957ce8da409dc0809f99ab07a1b94832ab74b15" + integrity sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ== dependencies: - "@eslint/eslintrc" "^1.4.1" - "@humanwhocodes/config-array" "^0.11.8" + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.56.0" + "@humanwhocodes/config-array" "^0.11.13" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" - ajv "^6.10.0" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" chalk "^4.0.0" cross-spawn "^7.0.2" debug "^4.3.2" doctrine "^3.0.0" escape-string-regexp "^4.0.0" - eslint-scope "^7.1.1" - eslint-utils "^3.0.0" - eslint-visitor-keys "^3.3.0" - espree "^9.4.0" - esquery "^1.4.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" esutils "^2.0.2" fast-deep-equal "^3.1.3" file-entry-cache "^6.0.1" find-up "^5.0.0" glob-parent "^6.0.2" globals "^13.19.0" - grapheme-splitter "^1.0.4" + graphemer "^1.4.0" ignore "^5.2.0" - import-fresh "^3.0.0" imurmurhash "^0.1.4" is-glob "^4.0.0" is-path-inside "^3.0.3" - js-sdsl "^4.1.4" js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" lodash.merge "^4.6.2" minimatch "^3.1.2" natural-compare "^1.4.0" - optionator "^0.9.1" - regexpp "^3.2.0" + optionator "^0.9.3" strip-ansi "^6.0.1" - strip-json-comments "^3.1.0" - text-table "^0.2.0" - -eslint@^5.0.0: - version "5.16.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea" - integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg== - dependencies: - "@babel/code-frame" "^7.0.0" - ajv "^6.9.1" - chalk "^2.1.0" - cross-spawn "^6.0.5" - debug "^4.0.1" - doctrine "^3.0.0" - eslint-scope "^4.0.3" - eslint-utils "^1.3.1" - eslint-visitor-keys "^1.0.0" - espree "^5.0.1" - esquery "^1.0.1" - esutils "^2.0.2" - file-entry-cache "^5.0.1" - functional-red-black-tree "^1.0.1" - glob "^7.1.2" - globals "^11.7.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - inquirer "^6.2.2" - js-yaml "^3.13.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.11" - minimatch "^3.0.4" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - optionator "^0.8.2" - path-is-inside "^1.0.2" - progress "^2.0.0" - regexpp "^2.0.1" - semver "^5.5.1" - strip-ansi "^4.0.0" - strip-json-comments "^2.0.1" - table "^5.2.3" text-table "^0.2.0" -espree@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a" - integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A== - dependencies: - acorn "^6.0.7" - acorn-jsx "^5.0.0" - eslint-visitor-keys "^1.0.0" - -espree@^9.0.0, espree@^9.4.0: +espree@^9.0.0, espree@^9.6.0, espree@^9.6.1: version "9.6.1" resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== @@ -11223,14 +11321,14 @@ esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.0.1, esquery@^1.4.0: +esquery@^1.4.0, esquery@^1.4.2: version "1.5.0" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== dependencies: estraverse "^5.1.0" -esrecurse@^4.1.0, esrecurse@^4.3.0: +esrecurse@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== @@ -11252,7 +11350,7 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -etag@1.8.1, etag@^1.8.1, etag@~1.8.1: +etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== @@ -11262,11 +11360,6 @@ event-target-shim@^5.0.0: resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== -eventemitter-asyncresource@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz#734ff2e44bf448e627f7748f905d6bdd57bdb65b" - integrity sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ== - eventemitter2@^6.4.2: version "6.4.9" resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.9.tgz#41f2750781b4230ed58827bc119d293471ecb125" @@ -11282,19 +11375,6 @@ events@^3.2.0: resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - execa@^4.0.2: version "4.1.0" resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" @@ -11342,19 +11422,6 @@ exit@^0.1.2: resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - expect@^29.0.0, expect@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" @@ -11408,27 +11475,12 @@ express@4.18.2, express@^4.17.3: utils-merge "1.0.1" vary "~1.1.2" -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - extend@^3.0.0, extend@^3.0.2, extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -external-editor@^3.0.3, external-editor@^3.1.0: +external-editor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== @@ -11437,20 +11489,6 @@ external-editor@^3.0.3, external-editor@^3.1.0: iconv-lite "^0.4.24" tmp "^0.0.33" -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - extract-zip@^1.6.6, extract-zip@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.7.0.tgz#556cc3ae9df7f452c493a0cfb51cc30277940927" @@ -11498,17 +11536,16 @@ fast-glob@3.3.1, fast-glob@^3.2.11, fast-glob@^3.2.12, fast-glob@^3.2.7, fast-gl merge2 "^1.3.0" micromatch "^4.0.4" -fast-glob@^2.2.6: - version "2.2.7" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" - integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== +fast-glob@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== dependencies: - "@mrmlnc/readdir-enhanced" "^2.2.1" - "@nodelib/fs.stat" "^1.1.2" - glob-parent "^3.1.0" - is-glob "^4.0.0" - merge2 "^1.2.3" - micromatch "^3.1.10" + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: version "2.1.0" @@ -11598,13 +11635,6 @@ figures@^5.0.0: escape-string-regexp "^5.0.0" is-unicode-supported "^1.2.0" -file-entry-cache@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" - integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== - dependencies: - flat-cache "^2.0.1" - file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -11630,11 +11660,6 @@ file-system-cache@^2.0.0: fs-extra "11.1.1" ramda "0.29.0" -file@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/file/-/file-0.2.2.tgz#c3dfd8f8cf3535ae455c2b423c2e52635d76b4d3" - integrity sha512-gwabMtChzdnpDJdPEpz8Vr/PX0pU85KailuPV71Zw/un5yJVKvzukhB3qf6O3lnTwIe5CxlMYLh3jOK3w5xrLA== - filelist@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" @@ -11642,16 +11667,6 @@ filelist@^1.0.4: dependencies: minimatch "^5.0.1" -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - fill-range@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" @@ -11659,19 +11674,6 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -finalhandler@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5" - integrity sha512-ejnvM9ZXYzp6PUPUyQBMBf0Co5VX2gr5H2VQe2Ui2jWXNlxv+PYZo8wpAymJNJdLsG1R4p+M4aynF8KuoUEwRw== - dependencies: - debug "2.6.9" - encodeurl "~1.0.1" - escape-html "~1.0.3" - on-finished "~2.3.0" - parseurl "~1.3.2" - statuses "~1.3.1" - unpipe "~1.0.0" - finalhandler@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" @@ -11709,17 +11711,7 @@ find-cache-dir@^4.0.0: integrity sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg== dependencies: common-path-prefix "^3.0.0" - pkg-dir "^7.0.0" - -find-line-column@^0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/find-line-column/-/find-line-column-0.5.2.tgz#db00238ff868551a182e74a103416d295a98c8ca" - integrity sha512-eNhNkDt5RbxY4X++JwyDURP62FYhV1bh9LF4dfOiwpVCTk5vvfEANhnui5ypUEELGR02QZSrWFtaTgd4ulW5tw== - -find-root@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" - integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== + pkg-dir "^7.0.0" find-up@^3.0.0: version "3.0.0" @@ -11752,15 +11744,6 @@ find-up@^6.3.0: locate-path "^7.1.0" path-exists "^5.0.0" -flat-cache@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" - integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== - dependencies: - flatted "^2.0.0" - rimraf "2.6.3" - write "1.0.3" - flat-cache@^3.0.4: version "3.1.1" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.1.tgz#a02a15fdec25a8f844ff7cc658f03dd99eb4609b" @@ -11775,11 +11758,6 @@ flat@^5.0.2: resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== -flatted@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" - integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== - flatted@^3.2.9: version "3.2.9" resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" @@ -11790,11 +11768,16 @@ flow-parser@0.*: resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.219.5.tgz#bff08036bd8f2aa7ebfd54a580dc418e37bc9c0e" integrity sha512-lHx/cl2XjopBx/ma9RYhG7FGj2JLKacoBwtI3leOp8AwRDPGwu6bzJoaCMfIl/sq14KdtY5MGzd5q6nKfGzcuQ== -follow-redirects@^1.0.0, follow-redirects@^1.14.0, follow-redirects@^1.15.0: +follow-redirects@^1.0.0, follow-redirects@^1.14.0: version "1.15.3" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a" integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q== +follow-redirects@^1.15.4: + version "1.15.5" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.5.tgz#54d4d6d062c0fa7d9d17feb008461550e3ba8020" + integrity sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw== + for-each@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" @@ -11802,11 +11785,6 @@ for-each@^0.3.3: dependencies: is-callable "^1.1.3" -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== - foreground-child@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" @@ -11884,14 +11862,7 @@ fraction.js@^4.3.6: resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== - dependencies: - map-cache "^0.2.2" - -fresh@0.5.2, fresh@^0.5.2: +fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== @@ -11910,15 +11881,6 @@ fs-extra@11.1.1, fs-extra@^11.1.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291" - integrity sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^3.0.0" - universalify "^0.1.0" - fs-extra@^10.0.0: version "10.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" @@ -11962,7 +11924,7 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@^2.3.2, fsevents@~2.3.2: +fsevents@^2.3.2, fsevents@~2.3.2, fsevents@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== @@ -11982,11 +11944,6 @@ function.prototype.name@^1.1.6: es-abstract "^1.22.1" functions-have-names "^1.2.3" -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== - functions-have-names@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" @@ -12031,11 +11988,6 @@ gensync@^1.0.0-beta.2: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-caller-file@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" - integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== - get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" @@ -12071,13 +12023,6 @@ get-port@^5.1.1: resolved "https://registry.yarnpkg.com/get-port/-/get-port-5.1.1.tgz#0469ed07563479de6efb986baf053dcd7d4e3193" integrity sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ== -get-stream@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - get-stream@^5.0.0, get-stream@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" @@ -12098,11 +12043,6 @@ get-symbol-description@^1.0.0: call-bind "^1.0.2" get-intrinsic "^1.1.1" -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== - getos@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/getos/-/getos-3.2.1.tgz#0134d1f4e00eb46144c5a9c0ac4dc087cbb27dc5" @@ -12135,14 +12075,6 @@ github-slugger@^1.0.0: resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.5.0.tgz#17891bbc73232051474d68bd867a34625c955f7d" integrity sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw== -glob-parent@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - integrity sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA== - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" - glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -12164,28 +12096,11 @@ glob-promise@^6.0.2: dependencies: "@types/glob" "^8.0.0" -glob-to-regexp@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" - integrity sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig== - glob-to-regexp@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@7.1.4: - version "7.1.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" - integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - glob@^10.0.0, glob@^10.2.2, glob@^10.3.10: version "10.3.10" resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" @@ -12197,7 +12112,7 @@ glob@^10.0.0, glob@^10.2.2, glob@^10.3.10: minipass "^5.0.0 || ^6.0.2 || ^7.0.0" 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.0.0, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -12227,7 +12142,7 @@ global-dirs@^2.0.1: dependencies: ini "1.3.7" -globals@^11.1.0, globals@^11.7.0: +globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== @@ -12281,20 +12196,6 @@ globby@^13.1.1: merge2 "^1.4.1" slash "^4.0.0" -globby@^9.0.0: - version "9.2.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" - integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg== - dependencies: - "@types/glob" "^7.1.1" - array-union "^1.0.2" - dir-glob "^2.2.2" - fast-glob "^2.2.6" - glob "^7.1.3" - ignore "^4.0.3" - pify "^4.0.1" - slash "^2.0.0" - good-listener@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50" @@ -12362,10 +12263,10 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== -grapheme-splitter@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" - integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== gtoken@^5.0.4: version "5.3.2" @@ -12466,42 +12367,6 @@ has-unicode@^2.0.1: resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -has@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.4.tgz#2eb2860e000011dae4f1406a86fe80e530fb2ec6" - integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ== - hasown@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" @@ -12812,11 +12677,6 @@ ignore-walk@^6.0.0: dependencies: minimatch "^9.0.0" -ignore@^4.0.3, ignore@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - ignore@^5.0.4, ignore@^5.1.9, ignore@^5.2.0, ignore@^5.2.4: version "5.2.4" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" @@ -12827,25 +12687,12 @@ image-size@~0.5.0: resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" integrity sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ== -immutable@^3: - version "3.8.2" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" - integrity sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg== - immutable@^4.0.0: version "4.3.4" resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.4.tgz#2e07b33837b4bb7662f288c244d1ced1ef65a78f" integrity sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA== -import-fresh@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" - integrity sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg== - dependencies: - caller-path "^2.0.0" - resolve-from "^3.0.0" - -import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1, import-fresh@^3.3.0: +import-fresh@^3.1.0, import-fresh@^3.2.1, import-fresh@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -12861,85 +12708,6 @@ import-local@^3.0.2: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" -import-sort-cli@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/import-sort-cli/-/import-sort-cli-6.0.0.tgz#de2207fc38d9f3acff373bb39e581f52f5b27fc4" - integrity sha512-Et1NeTefZeThtT/npEZnuXDG07oxZoSN29zUm4WPhZ4YFSqv3LFOLFuNE9RpHjFevVWSEog8+CogP7IlG1U3kg== - dependencies: - diff "^4.0.1" - file "^0.2.2" - globby "^9.0.0" - import-sort "^6.0.0" - import-sort-config "^6.0.0" - import-sort-parser "^6.0.0" - import-sort-parser-babylon "^6.0.0" - import-sort-style "^6.0.0" - import-sort-style-eslint "^6.0.0" - mkdirp "^0.5.1" - yargs "^12.0.5" - -import-sort-config@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/import-sort-config/-/import-sort-config-6.0.0.tgz#7313775b761eb479ab2d383945ecb15c008763b8" - integrity sha512-FJpF2F3+30JXqH1rJKeajxoSCHCueai3/0ntDN4y3GJL5pjnLDt/VjCy5FzjH7u0NHnllL/zVEf1wfmsVxJlPQ== - dependencies: - cosmiconfig "^5.0.5" - find-root "^1.0.0" - minimatch "^3.0.4" - resolve-from "^4.0.0" - -import-sort-parser-babylon@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/import-sort-parser-babylon/-/import-sort-parser-babylon-6.0.0.tgz#e1a4c28e0794ad7d9ff36cd045559d8ca8c38be7" - integrity sha512-NyShTiNhTh4Vy7kJUVe6CuvOaQAzzfSIT72wtp3CzGjz8bHjNj59DCAjncuviicmDOgVAgmLuSh1WMcLYAMWGg== - dependencies: - "@babel/core" "^7.2.2" - "@babel/parser" "^7.0.0-beta.54" - "@babel/traverse" "^7.0.0-beta.54" - "@babel/types" "^7.0.0-beta.54" - find-line-column "^0.5.2" - -import-sort-parser-typescript@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/import-sort-parser-typescript/-/import-sort-parser-typescript-6.0.0.tgz#98e73cef9e077d073e798722ed59e215b51c17e2" - integrity sha512-pgxnr3I156DonupQriNsgDb2zJN9TxrqCCIN1rwT/6SDO1rkJb+a0fjqshCjlgacTSA92oPAp1eAwmQUeZi3dw== - dependencies: - typescript "^3.2.4" - -import-sort-parser@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/import-sort-parser/-/import-sort-parser-6.0.0.tgz#0d901f264d98ed7caaae71f66128a686f828f2f4" - integrity sha512-H5L+d6HnqHvThB0GmAA3/43Sv74oCwL0iMk3/ixOv0LRJ69rCyHXeG/+UadMHrD2FefEmgPIWboEPAG7gsQrkA== - -import-sort-style-eslint@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/import-sort-style-eslint/-/import-sort-style-eslint-6.0.0.tgz#37d30104b4b984be5f0eca7b302fb2fe4d0ead35" - integrity sha512-L2SfLHtsvlQ1dCtQHHngmFBQebmhKSI3YRrPdgEKu/nI8eY35GQtkQ+Mf489q3BLdQSiFaKCxwJMVsKlRFSQBA== - dependencies: - eslint "^5.0.0" - lodash "^4.17.10" - -import-sort-style-module@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/import-sort-style-module/-/import-sort-style-module-6.0.0.tgz#3149df4785bae804ed32630634ed49e405fa7cad" - integrity sha512-Oxd256EVt6TAgawhIDuKnNHWumzHMHFWhVncBBvlHVnx69B4GP/Gu4Xo+gjxtqSEKEvam5ajUkNvnsXLDMDjKg== - -import-sort-style@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/import-sort-style/-/import-sort-style-6.0.0.tgz#088523f056e5064c34a6426f4733674d81b42e6a" - integrity sha512-z0H5PKs7YoDeKxNYXv2AA1mjjZFY07fjeNCXUdTM3ymJtWeeEoTm8CQkFm2l+KPZoMczIvdwzJpWkkOamBnsPw== - -import-sort@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/import-sort/-/import-sort-6.0.0.tgz#48ba2a7b53f2566ca1dd004327ea271321ad64ff" - integrity sha512-XUwSQMGAGmcW/wfshFE0gXgb1NPF6ibbQD6wDr3KRDykZf/lZj0jf58Bwa02xNb8EE59oz7etFe9OHnJocUW5Q== - dependencies: - detect-newline "^2.1.0" - import-sort-parser "^6.0.0" - import-sort-style "^6.0.0" - is-builtin-module "^3.0.0" - resolve "^1.8.1" - imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -12983,12 +12751,12 @@ ini@4.1.1: resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.1.tgz#d95b3d843b1e906e56d6747d5447904ff50ce7a1" integrity sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g== -inquirer@9.2.11: - version "9.2.11" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-9.2.11.tgz#e9003755c233a414fceda1891c23bd622cad4a95" - integrity sha512-B2LafrnnhbRzCWfAdOXisUzL89Kg8cVJlYmhqoi3flSiV/TveO+nsXwgKr9h9PIo+J1hz7nBSk6gegRIMBBf7g== +inquirer@9.2.12: + version "9.2.12" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-9.2.12.tgz#0348e9311765b7c93fce143bb1c0ef1ae879b1d7" + integrity sha512-mg3Fh9g2zfuVWJn6lhST0O7x4n03k7G8Tx5nvikJkbq8/CK47WDVm+UznF0G6s5Zi0KcyUisr6DU8T67N5U+1Q== dependencies: - "@ljharb/through" "^2.3.9" + "@ljharb/through" "^2.3.11" ansi-escapes "^4.3.2" chalk "^5.3.0" cli-cursor "^3.1.0" @@ -13004,25 +12772,6 @@ inquirer@9.2.11: strip-ansi "^6.0.1" wrap-ansi "^6.2.0" -inquirer@^6.2.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" - integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== - dependencies: - ansi-escapes "^3.2.0" - chalk "^2.4.2" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^3.0.3" - figures "^2.0.0" - lodash "^4.17.12" - mute-stream "0.0.7" - run-async "^2.2.0" - rxjs "^6.4.0" - string-width "^2.1.0" - strip-ansi "^5.1.0" - through "^2.3.6" - internal-slot@^1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.6.tgz#37e756098c4911c5e912b8edbf71ed3aa116f930" @@ -13054,11 +12803,6 @@ invariant@^2.2.4: dependencies: loose-envify "^1.0.0" -invert-kv@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" - integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== - ionicons@7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/ionicons/-/ionicons-7.1.0.tgz#25daa91345acedcb0f4fb7da670f5aff2e1f266a" @@ -13101,20 +12845,6 @@ is-absolute-url@^3.0.0: resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A== - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.0.0" - is-arguments@^1.0.4: version "1.1.1" resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" @@ -13164,18 +12894,6 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-builtin-module@^3.0.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.2.1.tgz#f03271717d8654cfcaf07ab0463faa3571581169" - integrity sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A== - dependencies: - builtin-modules "^3.3.0" - is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" @@ -13188,27 +12906,13 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" -is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.8.1: +is-core-module@^2.13.0, is-core-module@^2.13.1, is-core-module@^2.8.1: version "2.13.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== dependencies: hasown "^2.0.0" -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg== - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" - is-date-object@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" @@ -13221,47 +12925,12 @@ is-deflate@^1.0.0: resolved "https://registry.yarnpkg.com/is-deflate/-/is-deflate-1.0.0.tgz#c862901c3c161fb09dac7cdc7e784f80e98f2f14" integrity sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ== -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-directory@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" - integrity sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw== - is-docker@^2.0.0, is-docker@^2.1.1: version "2.2.1" resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^2.1.0, is-extglob@^2.1.1: +is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== @@ -13295,13 +12964,6 @@ is-generator-function@^1.0.7: dependencies: has-tostringtag "^1.0.0" -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - integrity sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw== - dependencies: - is-extglob "^2.1.0" - is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" @@ -13345,13 +13007,6 @@ is-negative-zero@^2.0.2: resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== -is-number-like@^1.0.3: - version "1.0.8" - resolved "https://registry.yarnpkg.com/is-number-like/-/is-number-like-1.0.8.tgz#2e129620b50891042e44e9bbbb30593e75cfbbe3" - integrity sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA== - dependencies: - lodash.isfinite "^3.3.2" - is-number-object@^1.0.4: version "1.0.7" resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" @@ -13359,13 +13014,6 @@ is-number-object@^1.0.4: dependencies: has-tostringtag "^1.0.0" -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== - dependencies: - kind-of "^3.0.2" - is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -13393,7 +13041,7 @@ is-plain-obj@^3.0.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== -is-plain-object@^2.0.3, is-plain-object@^2.0.4: +is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== @@ -13483,16 +13131,6 @@ is-what@^3.14.1: resolved "https://registry.yarnpkg.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1" integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA== -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -is-wsl@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" - integrity sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw== - is-wsl@^2.1.1, is-wsl@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" @@ -13500,16 +13138,16 @@ is-wsl@^2.1.1, is-wsl@^2.2.0: dependencies: is-docker "^2.0.0" -isarray@1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - isarray@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -13525,14 +13163,7 @@ iso-url@~0.4.7: resolved "https://registry.yarnpkg.com/iso-url/-/iso-url-0.4.7.tgz#de7e48120dae46921079fe78f325ac9e9217a385" integrity sha512-27fFRDnPAMnHGLq36bWTpKET+eiXct3ENlCcdcMdk+mjXrb2kw3mhBUg1B7ewAC0kVzlOPhADzQgz1SE6Tglog== -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: +isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== @@ -13627,6 +13258,11 @@ jake@^10.8.5: filelist "^1.0.4" minimatch "^3.1.2" +javascript-natural-sort@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz#f9e2303d4507f6d74355a73664d1440fb5a0ef59" + integrity sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw== + jest-changed-files@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" @@ -14036,15 +13672,10 @@ jest@29.4.3: import-local "^3.0.2" jest-cli "^29.4.3" -jiti@^1.18.2: - version "1.20.0" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.20.0.tgz#2d823b5852ee8963585c8dd8b7992ffc1ae83b42" - integrity sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA== - -js-sdsl@^4.1.4: - version "4.4.2" - resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.2.tgz#2e3c031b1f47d3aca8b775532e3ebb0818e7f847" - integrity sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w== +jiti@^1.20.0: + version "1.21.0" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" + integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== js-sha256@0.9.0, js-sha256@^0.9.0: version "0.9.0" @@ -14063,7 +13694,7 @@ js-yaml@4.1.0, js-yaml@^4.1.0: dependencies: argparse "^2.0.1" -js-yaml@^3.10.0, js-yaml@^3.13.0, js-yaml@^3.13.1: +js-yaml@^3.10.0, js-yaml@^3.13.1: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== @@ -14181,11 +13812,6 @@ json-buffer@3.0.1: resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== -json-parse-better-errors@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" @@ -14255,13 +13881,6 @@ jsonc-parser@3.2.0: resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== -jsonfile@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" - integrity sha512-oBko6ZHlubVB5mRFkur5vgYR1UyqX+S6Y/oCfLhqNdcc2fYFlDpIoNc7AfKS1KOGcnNAkvsr0grLck9ANM815w== - optionalDependencies: - graceful-fs "^4.1.6" - jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" @@ -14381,26 +14000,7 @@ khroma@^2.0.0: resolved "https://registry.yarnpkg.com/khroma/-/khroma-2.1.0.tgz#45f2ce94ce231a437cf5b63c2e886e6eb42bbbb1" integrity sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw== -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2: +kind-of@^6.0.2: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== @@ -14452,13 +14052,6 @@ lazy-universal-dotenv@^4.0.0: dotenv "^16.0.0" dotenv-expand "^10.0.0" -lcid@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" - integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== - dependencies: - invert-kv "^2.0.0" - less-loader@11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-11.1.0.tgz#a452384259bdf8e4f6d5fdcc39543609e6313f82" @@ -14505,14 +14098,6 @@ leven@^3.1.0: resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== -levn@^0.3.0, levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -14521,6 +14106,14 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + libphonenumber-js@^1.10.14: version "1.10.48" resolved "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.10.48.tgz#3c426b4aa21dfe3210bfbda47d208acffa3631bf" @@ -14538,11 +14131,6 @@ lilconfig@^2.1.0: resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== -limiter@^1.0.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/limiter/-/limiter-1.1.5.tgz#8f92a25b3b16c6131293a0cc834b4a838a2aa7c2" - integrity sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA== - lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" @@ -14616,16 +14204,6 @@ loader-utils@^2.0.0, loader-utils@^2.0.3: emojis-list "^3.0.0" json5 "^2.1.2" -localtunnel@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/localtunnel/-/localtunnel-2.0.2.tgz#528d50087151c4790f89c2db374fe7b0a48501f0" - integrity sha512-n418Cn5ynvJd7m/N1d9WVJISLJF/ellZnfsLnx8WBWGzxv/ntNcFkJ1o6se5quUhCplfLGBNL5tYHiq5WF3Nug== - dependencies: - axios "0.21.4" - debug "4.3.2" - openurl "1.1.1" - yargs "17.1.1" - locate-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" @@ -14685,11 +14263,6 @@ lodash.isboolean@^3.0.3: resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg== -lodash.isfinite@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz#fb89b65a9a80281833f0b7478b3a5104f898ebb3" - integrity sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA== - lodash.isinteger@^4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" @@ -14730,7 +14303,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== -lodash@4.17.21, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21: +lodash@4.17.21, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -14867,30 +14440,11 @@ makeerror@1.0.12: dependencies: tmpl "1.0.5" -map-age-cleaner@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" - integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== - dependencies: - p-defer "^1.0.0" - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== - map-or-similar@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/map-or-similar/-/map-or-similar-1.5.0.tgz#6de2653174adfb5d9edc33c69d3e92a1b76faf08" integrity sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg== -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== - dependencies: - object-visit "^1.0.0" - markdown-to-jsx@^7.1.8: version "7.3.2" resolved "https://registry.yarnpkg.com/markdown-to-jsx/-/markdown-to-jsx-7.3.2.tgz#f286b4d112dad3028acc1e77dfe1f653b347e131" @@ -14953,15 +14507,6 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== -mem@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" - integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== - dependencies: - map-age-cleaner "^0.1.1" - mimic-fn "^2.0.0" - p-is-promise "^2.0.0" - memfs@^3.4.1, memfs@^3.4.12, memfs@^3.4.3: version "3.6.0" resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.6.0.tgz#d7a2110f86f79dd950a8b6df6d57bc984aa185f6" @@ -14986,7 +14531,7 @@ merge-stream@^2.0.0: resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1: +merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== @@ -15216,25 +14761,6 @@ micromark@^3.0.0: micromark-util-types "^1.0.1" uvu "^0.5.0" -micromatch@^3.1.10: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - micromatch@^4.0.0, micromatch@^4.0.2, micromatch@^4.0.4: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" @@ -15255,11 +14781,6 @@ mime-types@^2.1.12, mime-types@^2.1.25, mime-types@^2.1.27, mime-types@^2.1.31, dependencies: mime-db "1.52.0" -mime@1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" - integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== - mime@1.6.0, mime@^1.4.1, mime@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" @@ -15275,7 +14796,7 @@ mimic-fn@^1.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== -mimic-fn@^2.0.0, mimic-fn@^2.1.0: +mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== @@ -15309,12 +14830,12 @@ minimalistic-assert@^1.0.0: resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimatch@3.0.5: - version "3.0.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.5.tgz#4da8f1290ee0f0f8e83d60ca69f8f134068604a3" - integrity sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw== +minimatch@9.0.3, minimatch@^9.0.0, minimatch@^9.0.1, minimatch@^9.0.3: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== dependencies: - brace-expansion "^1.1.7" + brace-expansion "^2.0.1" minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" @@ -15330,13 +14851,6 @@ minimatch@^5.0.1: dependencies: brace-expansion "^2.0.1" -minimatch@^9.0.0, minimatch@^9.0.1, minimatch@^9.0.3: - version "9.0.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" - integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== - dependencies: - brace-expansion "^2.0.1" - minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5, minimist@^1.2.6: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" @@ -15414,25 +14928,12 @@ minizlib@^2.1.1, minizlib@^2.1.2: minipass "^3.0.0" yallist "^4.0.0" -mitt@^1.1.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mitt/-/mitt-1.2.0.tgz#cb24e6569c806e31bd4e3995787fe38a04fdf90d" - integrity sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw== - -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - mkdirp-classic@^0.5.2: version "0.5.3" resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== -mkdirp@^0.5.1, mkdirp@^0.5.4, mkdirp@^0.5.6: +mkdirp@^0.5.4, mkdirp@^0.5.6: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== @@ -15454,10 +14955,10 @@ mri@^1.1.0, mri@^1.2.0: resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== -mrmime@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.1.tgz#5f90c825fad4bdd41dc914eff5d1a8cfdaf24f27" - integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw== +mrmime@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-2.0.0.tgz#151082a6e06e59a9a39b46b3e14d5cfe92b3abb4" + integrity sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw== ms@2.0.0: version "2.0.0" @@ -15526,11 +15027,6 @@ multicast-dns@^7.2.5: dns-packet "^5.2.2" thunky "^1.0.2" -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - integrity sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ== - mute-stream@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-1.0.0.tgz#e31bd9fe62f0aed23520aa4324ea6671531e013e" @@ -15541,27 +15037,10 @@ nanoid@^3.3.1, nanoid@^3.3.6: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -natural-compare-lite@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" - integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== +nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== natural-compare@^1.4.0: version "1.4.0" @@ -15587,10 +15066,10 @@ neo-async@^2.5.0, neo-async@^2.6.2: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== -ng-extract-i18n-merge@2.9.1: - version "2.9.1" - resolved "https://registry.yarnpkg.com/ng-extract-i18n-merge/-/ng-extract-i18n-merge-2.9.1.tgz#f8e4431a8672d27be6508c72f3cf47a318b1ecab" - integrity sha512-EJAgJrV2ZSRoH1njMI9lLLtLJkwabkk41ZZyV+U+6h8e5vDCM4zPGjm0NNZFy+YP+/ST+nlvi2CxprDXnjS8BQ== +ng-extract-i18n-merge@2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/ng-extract-i18n-merge/-/ng-extract-i18n-merge-2.10.0.tgz#20d2a4a1d21f058773242cbcc8406c4ef0f8fea0" + integrity sha512-mWYRWAUc7kirS3kIQxUR0kGv7Yv5JnV0C05VNvGwHdyMM3vSdJ0WAE/o4RwzW1cRyzXuG9oNOz4gctTzQsTErw== dependencies: "@angular-devkit/architect" "^0.1301.0 || ^0.1401.0 || ^0.1501.0 || ^0.1601.0 || ^0.1700.0" "@angular-devkit/core" "^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" @@ -15641,11 +15120,6 @@ nice-napi@^1.0.2: node-addon-api "^3.0.0" node-gyp-build "^4.2.2" -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - no-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" @@ -15688,11 +15162,6 @@ node-forge@^1, node-forge@^1.3.1: resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== -node-gyp-build-optional-packages@5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.3.tgz#92a89d400352c44ad3975010368072b41ad66c17" - integrity sha512-k75jcVzk5wnnc/FMxsf4udAoTEUv2jY3ycfdSd3yWu6Cnd1oee6/CfZJApyscA4FJOmdoixWwiwOyf16RzD5JA== - node-gyp-build-optional-packages@5.0.7: version "5.0.7" resolved "https://registry.yarnpkg.com/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.7.tgz#5d2632bbde0ab2f6e22f1bbac2199b07244ae0b3" @@ -15845,13 +15314,6 @@ npm-registry-fetch@^16.0.0: npm-package-arg "^11.0.0" proc-log "^3.0.0" -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== - dependencies: - path-key "^2.0.0" - npm-run-path@^4.0.0, npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" @@ -15886,16 +15348,16 @@ nwsapi@^2.2.2: resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== -nx@17.2.8: - version "17.2.8" - resolved "https://registry.yarnpkg.com/nx/-/nx-17.2.8.tgz#09482acd5d9b64c115d5ccf12417f1af2787d4d1" - integrity sha512-rM5zXbuXLEuqQqcjVjClyvHwRJwt+NVImR2A6KFNG40Z60HP6X12wAxxeLHF5kXXTDRU0PFhf/yACibrpbPrAw== +nx@18.0.4: + version "18.0.4" + resolved "https://registry.yarnpkg.com/nx/-/nx-18.0.4.tgz#3a77de6b51869449d849dccab7db74b35ec32a6b" + integrity sha512-Njb1fGppOw/wM7nOA1hYlLduV2aL4PdXSv5QS5cVYicHT5tw5RnG/0z4j9e6QfFj2EydxVeDUtlGR98diZ3/Yw== dependencies: - "@nrwl/tao" "17.2.8" + "@nrwl/tao" "18.0.4" "@yarnpkg/lockfile" "^1.1.0" "@yarnpkg/parsers" "3.0.0-rc.46" "@zkochan/js-yaml" "0.0.6" - axios "^1.5.1" + axios "^1.6.0" chalk "^4.1.0" cli-cursor "3.1.0" cli-spinners "2.6.1" @@ -15906,17 +15368,17 @@ nx@17.2.8: figures "3.2.0" flat "^5.0.2" fs-extra "^11.1.0" - glob "7.1.4" ignore "^5.0.4" jest-diff "^29.4.1" js-yaml "4.1.0" jsonc-parser "3.2.0" lines-and-columns "~2.0.3" - minimatch "3.0.5" + minimatch "9.0.3" node-machine-id "1.1.12" npm-run-path "^4.0.1" open "^8.4.0" - semver "7.5.3" + ora "5.3.0" + semver "^7.5.3" string-width "^4.2.3" strong-log-transformer "^2.1.0" tar-stream "~2.2.0" @@ -15926,16 +15388,16 @@ nx@17.2.8: yargs "^17.6.2" yargs-parser "21.1.1" optionalDependencies: - "@nx/nx-darwin-arm64" "17.2.8" - "@nx/nx-darwin-x64" "17.2.8" - "@nx/nx-freebsd-x64" "17.2.8" - "@nx/nx-linux-arm-gnueabihf" "17.2.8" - "@nx/nx-linux-arm64-gnu" "17.2.8" - "@nx/nx-linux-arm64-musl" "17.2.8" - "@nx/nx-linux-x64-gnu" "17.2.8" - "@nx/nx-linux-x64-musl" "17.2.8" - "@nx/nx-win32-arm64-msvc" "17.2.8" - "@nx/nx-win32-x64-msvc" "17.2.8" + "@nx/nx-darwin-arm64" "18.0.4" + "@nx/nx-darwin-x64" "18.0.4" + "@nx/nx-freebsd-x64" "18.0.4" + "@nx/nx-linux-arm-gnueabihf" "18.0.4" + "@nx/nx-linux-arm64-gnu" "18.0.4" + "@nx/nx-linux-arm64-musl" "18.0.4" + "@nx/nx-linux-x64-gnu" "18.0.4" + "@nx/nx-linux-x64-musl" "18.0.4" + "@nx/nx-win32-arm64-msvc" "18.0.4" + "@nx/nx-win32-x64-msvc" "18.0.4" oauth@0.9.x: version "0.9.15" @@ -15947,15 +15409,6 @@ object-assign@^4, object-assign@^4.1.0, object-assign@^4.1.1: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - object-inspect@^1.13.1, object-inspect@^1.9.0: version "1.13.1" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" @@ -15974,13 +15427,6 @@ object-keys@^1.1.1: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== - dependencies: - isobject "^3.0.0" - object.assign@^4.1.4: version "4.1.4" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" @@ -15991,14 +15437,27 @@ object.assign@^4.1.4: has-symbols "^1.0.3" object-keys "^1.1.1" -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== +object.fromentries@^2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.7.tgz#71e95f441e9a0ea6baf682ecaaf37fa2a8d7e616" + integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +object.groupby@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.2.tgz#494800ff5bab78fd0eff2835ec859066e00192ec" + integrity sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw== dependencies: - isobject "^3.0.1" + array.prototype.filter "^1.0.3" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.0.0" -object.values@^1.1.6: +object.values@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a" integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== @@ -16019,13 +15478,6 @@ on-finished@2.4.1: dependencies: ee-first "1.1.1" -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== - dependencies: - ee-first "1.1.1" - on-headers@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" @@ -16079,19 +15531,7 @@ opener@^1.5.1: resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== -openurl@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/openurl/-/openurl-1.1.1.tgz#3875b4b0ef7a52c156f0db41d4609dbb0f94b387" - integrity sha512-d/gTkTb1i1GKz5k3XE3XFV/PxQ1k45zDqGP2OA7YhgsaLoqm6qRvARAZOFer1fcXritWlGBRCu/UgeS4HAnXAA== - -opn@5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/opn/-/opn-5.3.0.tgz#64871565c863875f052cfdf53d3e3cb5adb53b1c" - integrity sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g== - dependencies: - is-wsl "^1.1.0" - -optionator@^0.8.1, optionator@^0.8.2: +optionator@^0.8.1: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== @@ -16103,7 +15543,7 @@ optionator@^0.8.1, optionator@^0.8.2: type-check "~0.3.2" word-wrap "~1.2.3" -optionator@^0.9.1: +optionator@^0.9.3: version "0.9.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== @@ -16144,15 +15584,6 @@ ora@5.4.1, ora@^5.4.1: strip-ansi "^6.0.0" wcwidth "^1.0.1" -os-locale@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" - integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== - dependencies: - execa "^1.0.0" - lcid "^2.0.0" - mem "^4.0.0" - os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -16168,21 +15599,6 @@ p-cancelable@^2.0.0: resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== -p-defer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" - integrity sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw== - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== - -p-is-promise@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" - integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== - p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -16257,10 +15673,10 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -pacote@17.0.4: - version "17.0.4" - resolved "https://registry.yarnpkg.com/pacote/-/pacote-17.0.4.tgz#4bac6c0745967bde96985ec12fbbfc8dea7140e8" - integrity sha512-eGdLHrV/g5b5MtD5cTPyss+JxOlaOloSMG3UwPMAvL8ywaLJ6beONPF40K4KKl/UI6q5hTKCJq5rCu8tkF+7Dg== +pacote@17.0.5: + version "17.0.5" + resolved "https://registry.yarnpkg.com/pacote/-/pacote-17.0.5.tgz#e9854edee7a073635cdd36b0c07cd4f2ab1757b6" + integrity sha512-TAE0m20zSDMnchPja9vtQjri19X3pZIyRpm2TJVeI+yU42leJBBDTRYhOcWFsPhaMxf+3iwQkFiKz16G9AEeeA== dependencies: "@npmcli/git" "^5.0.0" "@npmcli/installed-package-contents" "^2.0.1" @@ -16311,14 +15727,6 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - parse-json@^5.0.0, parse-json@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" @@ -16383,11 +15791,6 @@ pascal-case@^3.1.2: no-case "^3.0.4" tslib "^2.0.3" -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== - passport-google-oauth20@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/passport-google-oauth20/-/passport-google-oauth20-2.0.0.tgz#0d241b2d21ebd3dc7f2b60669ec4d587e3a674ef" @@ -16433,11 +15836,6 @@ path-browserify@^1.0.1: resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - integrity sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q== - path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -16458,16 +15856,6 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== -path-is-inside@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== - -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== - path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" @@ -16501,13 +15889,6 @@ path-to-regexp@3.2.0: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-3.2.0.tgz#fa7877ecbc495c601907562222453c43cc204a5f" integrity sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA== -path-type@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== - dependencies: - pify "^3.0.0" - path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" @@ -16569,11 +15950,6 @@ pify@^2.2.0, pify@^2.3.0: resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== - pify@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" @@ -16584,17 +15960,23 @@ pirates@^4.0.4, pirates@^4.0.5: resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== -piscina@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/piscina/-/piscina-4.1.0.tgz#809578ee3ab2ecf4cf71c2a062100b4b95a85b96" - integrity sha512-sjbLMi3sokkie+qmtZpkfMCUJTpbxJm/wvaPzU28vmYSsTSW8xk9JcFUsbqGJdtPpIQ9tuj+iDcTtgZjwnOSig== +piscina@4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/piscina/-/piscina-4.2.1.tgz#efb7f009d3a961e02ae08f1909bd24b5423e77fa" + integrity sha512-LShp0+lrO+WIzB9LXO+ZmO4zGHxtTJNZhEO56H9SSu+JPaUQb6oLcTCzWi5IL2DS8/vIkCE88ElahuSSw4TAkA== dependencies: - eventemitter-asyncresource "^1.0.0" hdr-histogram-js "^2.0.1" hdr-histogram-percentiles-obj "^3.0.0" optionalDependencies: nice-napi "^1.0.2" +piscina@^4.2.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/piscina/-/piscina-4.3.1.tgz#eaa59461caa27f07c637e667b14c36a0bd7e7daf" + integrity sha512-MBj0QYm3hJQ/C/wIXTN1OCYC8uQ4BBJ4LVele2P4ZwVQAH04vkk8E1SpDbuemLAL1dZorbuOob9rYqJeWCcCRg== + optionalDependencies: + nice-napi "^1.0.2" + pkg-dir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" @@ -16644,19 +16026,6 @@ portfinder@^1.0.28: debug "^3.2.7" mkdirp "^0.5.6" -portscanner@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/portscanner/-/portscanner-2.2.0.tgz#6059189b3efa0965c9d96a56b958eb9508411cf1" - integrity sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw== - dependencies: - async "^2.6.0" - is-number-like "^1.0.3" - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== - postcss-calc@^9.0.0: version "9.0.1" resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-9.0.1.tgz#a744fd592438a93d6de0f1434c572670361eb6c6" @@ -16712,14 +16081,14 @@ postcss-import@~14.1.0: read-cache "^1.0.0" resolve "^1.1.7" -postcss-loader@7.3.3: - version "7.3.3" - resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-7.3.3.tgz#6da03e71a918ef49df1bb4be4c80401df8e249dd" - integrity sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA== +postcss-loader@7.3.4: + version "7.3.4" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-7.3.4.tgz#aed9b79ce4ed7e9e89e56199d25ad1ec8f606209" + integrity sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A== dependencies: - cosmiconfig "^8.2.0" - jiti "^1.18.2" - semver "^7.3.8" + cosmiconfig "^8.3.5" + jiti "^1.20.0" + semver "^7.5.4" postcss-loader@^6.1.1: version "6.2.1" @@ -16921,7 +16290,16 @@ postcss-value-parser@^4.0.0, postcss-value-parser@^4.1.0, postcss-value-parser@^ resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@8.4.31, postcss@^8.2.14, postcss@^8.4.14, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.24, postcss@^8.4.27: +postcss@8.4.33: + version "8.4.33" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.33.tgz#1378e859c9f69bf6f638b990a0212f43e2aaa742" + integrity sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +postcss@^8.2.14, postcss@^8.4.14, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.24: version "8.4.31" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== @@ -16930,6 +16308,15 @@ postcss@8.4.31, postcss@^8.2.14, postcss@^8.4.14, postcss@^8.4.21, postcss@^8.4. picocolors "^1.0.0" source-map-js "^1.0.2" +postcss@^8.4.32: + version "8.4.35" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.35.tgz#60997775689ce09011edf083a549cea44aabe2f7" + integrity sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.0" + source-map-js "^1.0.2" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -16982,12 +16369,12 @@ pretty-hrtime@^1.0.3: resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" integrity sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A== -prisma@5.8.1: - version "5.8.1" - resolved "https://registry.yarnpkg.com/prisma/-/prisma-5.8.1.tgz#1f101793a8831c0719dfbed5f85a96ea4888c9d3" - integrity sha512-N6CpjzECnUHZ5beeYpDzkt2rYpEdAeqXX2dweu6BoQaeYkNZrC/WJHM+5MO/uidFHTak8QhkPKBWck1o/4MD4A== +prisma@5.11.0: + version "5.11.0" + resolved "https://registry.yarnpkg.com/prisma/-/prisma-5.11.0.tgz#ef3891f79921a2deec6f540eba13a3cc8525f6d2" + integrity sha512-KCLiug2cs0Je7kGkQBN9jDWoZ90ogE/kvZTUTgz2h94FEo8pczCkPH7fPNXkD1sGU7Yh65risGGD1HQ5DF3r3g== dependencies: - "@prisma/engines" "5.8.1" + "@prisma/engines" "5.11.0" prismjs@^1.28.0: version "1.29.0" @@ -17009,7 +16396,7 @@ process@^0.11.10: resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== -progress@^2.0.0, progress@^2.0.1: +progress@^2.0.1: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== @@ -17179,7 +16566,7 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" -range-parser@^1.2.1, range-parser@~1.2.0, range-parser@~1.2.1: +range-parser@^1.2.1, range-parser@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== @@ -17194,7 +16581,7 @@ raw-body@2.5.1: iconv-lite "0.4.24" unpipe "1.0.0" -raw-body@2.5.2, raw-body@^2.3.2: +raw-body@2.5.2: version "2.5.2" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== @@ -17414,14 +16801,6 @@ regenerator-transform@^0.15.2: dependencies: "@babel/runtime" "^7.8.4" -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - regex-parser@^2.2.11: version "2.2.11" resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58" @@ -17436,16 +16815,6 @@ regexp.prototype.flags@^1.5.1: define-properties "^1.2.0" set-function-name "^2.0.0" -regexpp@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" - integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== - -regexpp@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== - regexpu-core@^5.3.1: version "5.3.2" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" @@ -17501,11 +16870,6 @@ renderkid@^3.0.0: lodash "^4.17.21" strip-ansi "^6.0.1" -repeat-element@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" - integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== - repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" @@ -17537,11 +16901,6 @@ require-from-string@^2.0.2: resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== -require-main-filename@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - integrity sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug== - requireindex@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.2.0.tgz#3463cdb22ee151902635aa6c9535d4de9c2ef1ef" @@ -17564,11 +16923,6 @@ resolve-cwd@^3.0.0: dependencies: resolve-from "^5.0.0" -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw== - resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -17590,11 +16944,6 @@ resolve-url-loader@5.0.0: postcss "^8.2.14" source-map "0.6.1" -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== - resolve.exports@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" @@ -17605,7 +16954,7 @@ resolve.exports@^2.0.0: resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== -resolve@1.22.8, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.1, resolve@^1.22.4, resolve@^1.8.1: +resolve@1.22.8, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.4: version "1.22.8" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== @@ -17614,14 +16963,6 @@ resolve@1.22.8, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.12.0 path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resp-modifier@6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/resp-modifier/-/resp-modifier-6.0.2.tgz#b124de5c4fbafcba541f48ffa73970f4aa456b4f" - integrity sha512-U1+0kWC/+4ncRFYqQWTx/3qkfE6a4B/h3XXgmXypfa0SPZ3t7cbbaFk297PjQS/yov24R18h6OZe6iZwj3NSLw== - dependencies: - debug "^2.2.0" - minimatch "^3.0.2" - responselike@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.1.tgz#9a0bc8fdc252f3fb1cca68b016591059ba1422bc" @@ -17653,11 +16994,6 @@ restore-cursor@^3.1.0: onetime "^5.1.0" signal-exit "^3.0.2" -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - retry@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" @@ -17673,13 +17009,6 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rimraf@2.6.3, rimraf@~2.6.2: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" - rimraf@^2.6.1: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" @@ -17694,23 +17023,40 @@ rimraf@^3.0.0, rimraf@^3.0.2: dependencies: glob "^7.1.3" +rimraf@~2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + robust-predicates@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/robust-predicates/-/robust-predicates-3.0.2.tgz#d5b28528c4824d20fc48df1928d41d9efa1ad771" integrity sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg== -rollup@^3.27.1: - version "3.29.4" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.29.4.tgz#4d70c0f9834146df8705bfb69a9a19c9e1109981" - integrity sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw== +rollup@^4.2.0: + version "4.10.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.10.0.tgz#244c2cb54a8de004a949fe6036a0801be9060456" + integrity sha512-t2v9G2AKxcQ8yrG+WGxctBes1AomT0M4ND7jTFBCVPXQ/WFTvNSefIrNSmLKhIKBrvN8SG+CZslimJcT3W2u2g== + dependencies: + "@types/estree" "1.0.5" optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.10.0" + "@rollup/rollup-android-arm64" "4.10.0" + "@rollup/rollup-darwin-arm64" "4.10.0" + "@rollup/rollup-darwin-x64" "4.10.0" + "@rollup/rollup-linux-arm-gnueabihf" "4.10.0" + "@rollup/rollup-linux-arm64-gnu" "4.10.0" + "@rollup/rollup-linux-arm64-musl" "4.10.0" + "@rollup/rollup-linux-riscv64-gnu" "4.10.0" + "@rollup/rollup-linux-x64-gnu" "4.10.0" + "@rollup/rollup-linux-x64-musl" "4.10.0" + "@rollup/rollup-win32-arm64-msvc" "4.10.0" + "@rollup/rollup-win32-ia32-msvc" "4.10.0" + "@rollup/rollup-win32-x64-msvc" "4.10.0" fsevents "~2.3.2" -run-async@^2.2.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== - run-async@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-3.0.0.tgz#42a432f6d76c689522058984384df28be379daad" @@ -17728,12 +17074,7 @@ rw@1: resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ== -rx@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" - integrity sha512-CiaiuN6gapkdl+cZUr67W6I8jquN4lkak3vtIsIWCl4XIPP8ffsoyN6/+PuGXnQy8Cu8W2y9Xxh31Rq4M6wUug== - -rxjs@7.5.6, rxjs@7.8.1, rxjs@^6.3.3, rxjs@^6.4.0, rxjs@^6.5.3, rxjs@^7.8.0, rxjs@^7.8.1: +rxjs@7.5.6, rxjs@7.8.1, rxjs@^6.3.3, rxjs@^6.5.3, rxjs@^7.8.0, rxjs@^7.8.1: version "7.5.6" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.6.tgz#0446577557862afd6903517ce7cae79ecb9662bc" integrity sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw== @@ -17781,13 +17122,6 @@ safe-regex-test@^1.0.0: get-intrinsic "^1.1.3" is-regex "^1.1.4" -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== - dependencies: - ret "~0.1.10" - "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -17798,10 +17132,10 @@ safevalues@^0.3.4: resolved "https://registry.yarnpkg.com/safevalues/-/safevalues-0.3.4.tgz#82e846a02b6956d7d40bf9f41e92e13fce0186db" integrity sha512-LRneZZRXNgjzwG4bDQdOTSbze3fHm1EAKN/8bePxnlEZiBmkYEDggaHbuvHI9/hoqHbGfsEA7tWS9GhYHZBBsw== -sass-loader@13.3.2: - version "13.3.2" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-13.3.2.tgz#460022de27aec772480f03de17f5ba88fa7e18c6" - integrity sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg== +sass-loader@13.3.3: + version "13.3.3" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-13.3.3.tgz#60df5e858788cffb1a3215e5b92e9cba61e7e133" + integrity sha512-mt5YN2F1MOZr3d/wBRcZxeFgwgkH44wVc2zohO2YF6JiOMkiXe4BYRZpSu2sO1g71mo/j16txzUhsKZlqjVGzA== dependencies: neo-async "^2.6.2" @@ -17813,7 +17147,16 @@ sass-loader@^12.2.0: klona "^2.0.4" neo-async "^2.6.2" -sass@1.69.5, sass@^1.42.1: +sass@1.69.7: + version "1.69.7" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.69.7.tgz#6e7e1c8f51e8162faec3e9619babc7da780af3b7" + integrity sha512-rzj2soDeZ8wtE2egyLXgOOHQvaC2iosZrkF6v3EUG+tBwEvhqUCzm0VP3k9gHF9LXbSrRhT5SksoI56Iw8NPnQ== + dependencies: + chokidar ">=3.0.0 <4.0.0" + immutable "^4.0.0" + source-map-js ">=0.6.2 <2.0.0" + +sass@^1.42.1: version "1.69.5" resolved "https://registry.yarnpkg.com/sass/-/sass-1.69.5.tgz#23e18d1c757a35f2e52cc81871060b9ad653dfde" integrity sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ== @@ -17895,18 +17238,11 @@ semver-dsl@^1.0.1: dependencies: semver "^5.3.0" -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.6.0: version "5.7.2" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@7.5.3: - version "7.5.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.3.tgz#161ce8c2c6b4b3bdca6caadc9fa3317a4c4fe88e" - integrity sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ== - dependencies: - lru-cache "^6.0.0" - semver@7.5.4, semver@7.x, semver@^7.0.0, semver@^7.1.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4: version "7.5.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" @@ -17924,25 +17260,6 @@ semver@~7.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -send@0.16.2: - version "0.16.2" - resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" - integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw== - dependencies: - debug "2.6.9" - depd "~1.1.2" - destroy "~1.0.4" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "~1.6.2" - mime "1.4.1" - ms "2.0.0" - on-finished "~2.3.0" - range-parser "~1.2.0" - statuses "~1.4.0" - send@0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" @@ -17980,7 +17297,7 @@ serve-favicon@^2.5.0: parseurl "~1.3.2" safe-buffer "5.1.1" -serve-index@1.9.1, serve-index@^1.9.1: +serve-index@^1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== @@ -17993,16 +17310,6 @@ serve-index@1.9.1, serve-index@^1.9.1: mime-types "~2.1.17" parseurl "~1.3.2" -serve-static@1.13.2: - version "1.13.2" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" - integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.2" - send "0.16.2" - serve-static@1.15.0: version "1.15.0" resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" @@ -18013,11 +17320,6 @@ serve-static@1.15.0: parseurl "~1.3.3" send "0.18.0" -server-destroy@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/server-destroy/-/server-destroy-1.0.1.tgz#f13bf928e42b9c3e79383e61cc3998b5d14e6cdd" - integrity sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ== - set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -18042,16 +17344,6 @@ set-function-name@^2.0.0: functions-have-names "^1.2.3" has-property-descriptors "^1.0.0" -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - setprototypeof@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" @@ -18069,13 +17361,6 @@ shallow-clone@^3.0.0: dependencies: kind-of "^6.0.2" -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== - dependencies: - shebang-regex "^1.0.0" - shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -18083,11 +17368,6 @@ shebang-command@^2.0.0: dependencies: shebang-regex "^3.0.0" -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== - shebang-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" @@ -18175,11 +17455,6 @@ sisteransi@^1.0.5: resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== -slash@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" - integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== - slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -18195,88 +17470,11 @@ slice-ansi@0.0.4: resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" integrity sha512-up04hB2hR92PgjpyU3y/eg91yIBILyjVY26NvvciY3EVVPjybkMszMpXQ9QAkcS3I5rtJBDLoTxxg+qvW8c7rw== -slice-ansi@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" - integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== - dependencies: - ansi-styles "^3.2.0" - astral-regex "^1.0.0" - is-fullwidth-code-point "^2.0.0" - smart-buffer@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -socket.io-adapter@~2.5.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz#5de9477c9182fdc171cd8c8364b9a8894ec75d12" - integrity sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA== - dependencies: - ws "~8.11.0" - -socket.io-client@^4.4.1: - version "4.7.2" - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.7.2.tgz#f2f13f68058bd4e40f94f2a1541f275157ff2c08" - integrity sha512-vtA0uD4ibrYD793SOIAwlo8cj6haOeMHrGvwPxJsxH7CeIksqJ+3Zc06RvWTIFgiSqx4A3sOnTXpfAEE2Zyz6w== - dependencies: - "@socket.io/component-emitter" "~3.1.0" - debug "~4.3.2" - engine.io-client "~6.5.2" - socket.io-parser "~4.2.4" - -socket.io-parser@~4.2.4: - version "4.2.4" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.4.tgz#c806966cf7270601e47469ddeec30fbdfda44c83" - integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew== - dependencies: - "@socket.io/component-emitter" "~3.1.0" - debug "~4.3.1" - -socket.io@^4.4.1: - version "4.7.2" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.7.2.tgz#22557d76c3f3ca48f82e73d68b7add36a22df002" - integrity sha512-bvKVS29/I5fl2FGLNHuXlQaUH/BlzX1IN6S+NKLNZpBsPZIDH+90eQmCs2Railn4YUiww4SzUedJ6+uzwFnKLw== - dependencies: - accepts "~1.3.4" - base64id "~2.0.0" - cors "~2.8.5" - debug "~4.3.2" - engine.io "~6.5.2" - socket.io-adapter "~2.5.2" - socket.io-parser "~4.2.4" - sockjs@^0.3.24: version "0.3.24" resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" @@ -18308,12 +17506,11 @@ socks@^2.7.1: resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== -source-map-loader@4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-4.0.1.tgz#72f00d05f5d1f90f80974eda781cbd7107c125f2" - integrity sha512-oqXpzDIByKONVY8g1NUPOTQhe0UTU5bWUl32GSkqK2LjJj0HmwTMVKxcUip0RgAYhY1mqgOxjbQM48a0mmeNfA== +source-map-loader@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-5.0.0.tgz#f593a916e1cc54471cfc8851b905c8a845fc7e38" + integrity sha512-k2Dur7CbSLcAH73sBcIkV5xjPV4SzqO1NJ7+XaQl8if3VODDUj3FNchNGpqgJSKbvUfJuhVdv8K2Eu8/TNl2eA== dependencies: - abab "^2.0.6" iconv-lite "^0.6.3" source-map-js "^1.0.2" @@ -18326,17 +17523,6 @@ source-map-loader@^3.0.0: iconv-lite "^0.6.3" source-map-js "^1.0.1" -source-map-resolve@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - source-map-support@0.5.13: version "0.5.13" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" @@ -18361,11 +17547,6 @@ source-map-support@0.5.21, source-map-support@^0.5.16, source-map-support@^0.5.5 buffer-from "^1.0.0" source-map "^0.6.0" -source-map-url@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" - integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== - source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" @@ -18376,7 +17557,7 @@ source-map@0.7.4, source-map@^0.7.3, source-map@^0.7.4: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== -source-map@^0.5.6, source-map@^0.5.7: +source-map@^0.5.0, source-map@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== @@ -18435,13 +17616,6 @@ spdy@^4.0.2: select-hose "^2.0.0" spdy-transport "^3.0.0" -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" - sprintf-js@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" @@ -18493,14 +17667,6 @@ static-eval@2.0.2: dependencies: escodegen "^1.8.1" -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - statuses@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" @@ -18511,16 +17677,6 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== -statuses@~1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" - integrity sha512-wuTCPGlJONk/a1kqZ4fQM2+908lC7fa7nPYpTC1EhnvqLX/IICbeP1OZGDtA374trpSq68YubKUMo8oRhN46yg== - -statuses@~1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" - integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== - store2@^2.14.2: version "2.14.2" resolved "https://registry.yarnpkg.com/store2/-/store2-2.14.2.tgz#56138d200f9fe5f582ad63bc2704dbc0e4a45068" @@ -18538,14 +17694,6 @@ stream-shift@^1.0.0: resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== -stream-throttle@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/stream-throttle/-/stream-throttle-0.1.3.tgz#add57c8d7cc73a81630d31cd55d3961cfafba9c3" - integrity sha512-889+B9vN9dq7/vLbGyuHeZ6/ctf5sNuGWsDy89uNxkFTAgzy0eK7+w5fL3KLNRTkLle7EgZGvHUphZW0Q26MnQ== - dependencies: - commander "^2.2.0" - limiter "^1.0.5" - streamsearch@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" @@ -18577,7 +17725,7 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: +string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -18585,15 +17733,6 @@ string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" -string-width@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" @@ -18665,13 +17804,6 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" -strip-ansi@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -18689,22 +17821,12 @@ strip-bom@^4.0.0: resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== - strip-final-newline@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== -strip-json-comments@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== - -strip-json-comments@^3.0.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: +strip-json-comments@^3.0.1, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== @@ -18843,16 +17965,6 @@ synchronous-promise@^2.0.15: resolved "https://registry.yarnpkg.com/synchronous-promise/-/synchronous-promise-2.0.17.tgz#38901319632f946c982152586f2caf8ddc25c032" integrity sha512-AsS729u2RHUfEra9xJrE39peJcc2stq2+poBXX8bcM08Y6g9j/i/PUzwNQqkaJde7Ntg1TO7bSREbR5sdosQ+g== -table@^5.2.3: - version "5.4.6" - resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" - integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== - dependencies: - ajv "^6.10.2" - lodash "^4.17.14" - slice-ansi "^2.1.0" - string-width "^3.0.0" - tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" @@ -18932,10 +18044,10 @@ terser-webpack-plugin@^5.3.1, terser-webpack-plugin@^5.3.3, terser-webpack-plugi serialize-javascript "^6.0.1" terser "^5.16.8" -terser@5.24.0: - version "5.24.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.24.0.tgz#4ae50302977bca4831ccc7b4fef63a3c04228364" - integrity sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw== +terser@5.26.0: + version "5.26.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.26.0.tgz#ee9f05d929f4189a9c28a0feb889d96d50126fe1" + integrity sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -18979,7 +18091,7 @@ through2@^2.0.3: readable-stream "~2.3.6" xtend "~4.0.1" -through@X.X.X, through@^2.3.4, through@^2.3.6: +through@X.X.X, through@^2.3.4: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== @@ -19023,21 +18135,6 @@ to-fast-properties@^2.0.0: resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -19045,16 +18142,6 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - tocbot@^4.20.1: version "4.21.2" resolved "https://registry.yarnpkg.com/tocbot/-/tocbot-4.21.2.tgz#7ae513d73dddb80f126724160bd6f72bf8638edb" @@ -19190,10 +18277,10 @@ tsconfig-paths-webpack-plugin@^4.0.1: enhanced-resolve "^5.7.0" tsconfig-paths "^4.1.2" -tsconfig-paths@^3.14.1: - version "3.14.2" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" - integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== +tsconfig-paths@^3.15.0: + version "3.15.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" + integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== dependencies: "@types/json5" "^0.0.29" json5 "^1.0.2" @@ -19385,20 +18472,10 @@ types-ramda@^0.29.4: dependencies: ts-toolbelt "^9.6.0" -typescript@5.2.2, typescript@~5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78" - integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w== - -typescript@^3.2.4: - version "3.9.10" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.10.tgz#70f3910ac7a51ed6bef79da7800690b19bf778b8" - integrity sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q== - -ua-parser-js@^1.0.33: - version "1.0.37" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.37.tgz#b5dc7b163a5c1f0c510b08446aed4da92c46373f" - integrity sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ== +typescript@5.3.3, typescript@~5.3.2: + version "5.3.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" + integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== uglify-js@^3.1.4: version "3.17.4" @@ -19437,10 +18514,10 @@ undici-types@~5.26.4: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== -undici@5.27.2: - version "5.27.2" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.27.2.tgz#a270c563aea5b46cc0df2550523638c95c5d4411" - integrity sha512-iS857PdOEy/y3wlM3yRp+6SNQQ6xU0mmZcwRSriqk+et/cwWAtwmIGf6WkoDN2EK/AMdCO/dfXzIwi+rFMrjjQ== +undici@6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/undici/-/undici-6.2.1.tgz#554293044619e065d986c37a4c92185c3bc02121" + integrity sha512-7Wa9thEM6/LMnnKtxJHlc8SrTlDmxqJecgz1iy8KlsN0/iskQXOQCuPkrZLXbElPaSw5slFFyKIKXyJ3UtbApw== dependencies: "@fastify/busboy" "^2.0.0" @@ -19472,16 +18549,6 @@ unicode-property-aliases-ecmascript@^2.0.0: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - union@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/union/-/union-0.5.0.tgz#b2c11be84f60538537b846edb9ba266ba0090075" @@ -19539,11 +18606,6 @@ unist-util-visit@^2.0.0: unist-util-is "^4.0.0" unist-util-visit-parents "^3.0.0" -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - universalify@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" @@ -19569,14 +18631,6 @@ unplugin@^1.3.1: webpack-sources "^3.2.3" webpack-virtual-modules "^0.5.0" -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - untildify@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" @@ -19597,11 +18651,6 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== - url-join@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.1.tgz#b642e21a2646808ffa178c4c5fda39844e12cde7" @@ -19645,11 +18694,6 @@ use-sidecar@^1.1.2: detect-node-es "^1.1.0" tslib "^2.0.0" -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -19749,16 +18793,16 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" -vite@4.5.1: - version "4.5.1" - resolved "https://registry.yarnpkg.com/vite/-/vite-4.5.1.tgz#3370986e1ed5dbabbf35a6c2e1fb1e18555b968a" - integrity sha512-AXXFaAJ8yebyqzoNB9fu2pHoo/nWX+xZlaRwoeYUxEqBO+Zj4msE5G+BhGBll9lYEKv9Hfks52PAF2X7qDYXQA== +vite@5.0.12: + version "5.0.12" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.0.12.tgz#8a2ffd4da36c132aec4adafe05d7adde38333c47" + integrity sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w== dependencies: - esbuild "^0.18.10" - postcss "^8.4.27" - rollup "^3.27.1" + esbuild "^0.19.3" + postcss "^8.4.32" + rollup "^4.2.0" optionalDependencies: - fsevents "~2.3.2" + fsevents "~2.3.3" w3c-xmlserializer@^4.0.0: version "4.0.0" @@ -19774,7 +18818,7 @@ walker@^1.0.8: dependencies: makeerror "1.0.12" -watchpack@^2.2.0, watchpack@^2.4.0: +watchpack@2.4.0, watchpack@^2.2.0, watchpack@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== @@ -19992,11 +19036,6 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" -which-module@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" - integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== - which-typed-array@^1.1.11, which-typed-array@^1.1.13, which-typed-array@^1.1.2: version "1.1.13" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.13.tgz#870cd5be06ddb616f504e7b039c4c24898184d36" @@ -20008,13 +19047,6 @@ which-typed-array@^1.1.11, which-typed-array@^1.1.13, which-typed-array@^1.1.2: gopd "^1.0.1" has-tostringtag "^1.0.0" -which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" @@ -20067,14 +19099,6 @@ wordwrap@^1.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - integrity sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw== - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - wrap-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-3.0.1.tgz#288a04d87eda5c286e060dfe8f135ce8d007f8ba" @@ -20123,13 +19147,6 @@ write-file-atomic@^4.0.2: imurmurhash "^0.1.4" signal-exit "^3.0.7" -write@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" - integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== - dependencies: - mkdirp "^0.5.1" - ws@^6.1.0: version "6.2.2" resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" @@ -20142,11 +19159,6 @@ ws@^8.11.0, ws@^8.13.0, ws@^8.2.3: resolved "https://registry.yarnpkg.com/ws/-/ws-8.14.2.tgz#6c249a806eb2db7a20d26d51e7709eab7b2e6c7f" integrity sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g== -ws@~8.11.0: - version "8.11.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" - integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== - xml-name-validator@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" @@ -20164,30 +19176,20 @@ xmldoc@^1.1.2: dependencies: sax "^1.2.4" -xmlhttprequest-ssl@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz#91360c86b914e67f44dce769180027c0da618c67" - integrity sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A== - xtend@^4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== -"y18n@^3.2.1 || ^4.0.0": - version "4.0.3" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" - integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== - y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== -yahoo-finance2@2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/yahoo-finance2/-/yahoo-finance2-2.9.0.tgz#7842580de36606197f7d64897dd2e5e55b9371d3" - integrity sha512-Q1UhB5uA0Uj2bBcSDqsZLt0tCxoHwrWCuvu4NMUgioyN8dlpq8ppbdKhZlzTD9ipIyKSgqG5TT7IlwB1x6eHZA== +yahoo-finance2@2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yahoo-finance2/-/yahoo-finance2-2.10.0.tgz#90a9d7984e3b35a11fff9850c55d1cd322ddbee3" + integrity sha512-yKHjMEnFVkgIvgyxjsNAMLf4xGCKM+HzThorCNuCoE71yoie75lR+WTd0HshdCnb8tpsCclFaP045I+p6Mu6aA== dependencies: "@types/tough-cookie" "^4.0.2" ajv "8.10.0" @@ -20216,32 +19218,6 @@ yargs-parser@21.1.1, yargs-parser@^21.0.1, yargs-parser@^21.1.1: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs-parser@^11.1.1: - version "11.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" - integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs@17.1.1: - version "17.1.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.1.1.tgz#c2a8091564bdb196f7c0a67c1d12e5b85b8067ba" - integrity sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.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" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" @@ -20255,24 +19231,6 @@ yargs@17.7.2, yargs@^17.2.1, yargs@^17.3.1, yargs@^17.6.2, yargs@^17.7.2: y18n "^5.0.5" yargs-parser "^21.1.1" -yargs@^12.0.5: - version "12.0.5" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" - integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== - dependencies: - cliui "^4.0.0" - decamelize "^1.2.0" - find-up "^3.0.0" - get-caller-file "^1.0.1" - os-locale "^3.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1 || ^4.0.0" - yargs-parser "^11.1.1" - yauzl@^2.10.0: version "2.10.0" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" @@ -20296,10 +19254,10 @@ yocto-queue@^1.0.0: resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== -zone.js@0.14.2: - version "0.14.2" - resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.14.2.tgz#91b20b24e8ab9a5a74f319ed5a3000f234ffa3b6" - integrity sha512-X4U7J1isDhoOmHmFWiLhloWc2lzMkdnumtfQ1LXzf/IOZp5NQYuMUTaviVzG/q1ugMBIXzin2AqeVJUoSEkNyQ== +zone.js@0.14.3: + version "0.14.3" + resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.14.3.tgz#ac01000f4eaeec5c06526f6c112ef7d36f426f78" + integrity sha512-jYoNqF046Q+JfcZSItRSt+oXFcpXL88yq7XAZjb/NKTS7w2hHpKjRJ3VlFD1k75wMaRRXNUt5vrZVlygiMyHbA== dependencies: tslib "^2.3.0"