diff --git a/.env b/.env.example similarity index 85% rename from .env rename to .env.example index 4f6dc7cd1..f7bd74856 100644 --- a/.env +++ b/.env.example @@ -12,5 +12,5 @@ POSTGRES_PASSWORD= ACCESS_TOKEN_SALT= ALPHA_VANTAGE_API_KEY= -DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@localhost:5432/${POSTGRES_DB}?sslmode=prefer +DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@localhost:5432/${POSTGRES_DB}?connect_timeout=300&sslmode=prefer JWT_SECRET_KEY= diff --git a/.eslintrc.json b/.eslintrc.json index 6dd74ced7..33e0aafa1 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,12 +1,12 @@ { "root": true, "ignorePatterns": ["**/*"], - "plugins": ["@nrwl/nx"], + "plugins": ["@nx"], "overrides": [ { "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], "rules": { - "@nrwl/nx/enforce-module-boundaries": [ + "@nx/enforce-module-boundaries": [ "error", { "enforceBuildableLibDependency": true, @@ -23,12 +23,12 @@ }, { "files": ["*.ts", "*.tsx"], - "extends": ["plugin:@nrwl/nx/typescript"], + "extends": ["plugin:@nx/typescript"], "rules": {} }, { "files": ["*.js", "*.jsx"], - "extends": ["plugin:@nrwl/nx/javascript"], + "extends": ["plugin:@nx/javascript"], "rules": {} }, { @@ -113,5 +113,6 @@ "radix": "error" } } - ] + ], + "extends": [null, "plugin:storybook/recommended"] } diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index ffee37bee..0d93138f6 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -6,7 +6,7 @@ labels: '' assignees: '' --- -The Issue tracker is **ONLY** used for reporting bugs. New features should be discussed on our [Slack channel](https://ghostfolio.slack.com) or in [Discussions](https://github.com/ghostfolio/ghostfolio/discussions). +The Issue tracker is **ONLY** used for reporting bugs. New features should be discussed in our [Slack](https://join.slack.com/t/ghostfolio/shared_invite/zt-vsaan64h-F_I0fEo5M0P88lP9ibCxFg) community or in [Discussions](https://github.com/ghostfolio/ghostfolio/discussions). **Bug Description** @@ -36,6 +36,7 @@ The Issue tracker is **ONLY** used for reporting bugs. New features should be di +- Cloud or Self-hosted - Ghostfolio Version X.Y.Z - Browser - OS diff --git a/.github/workflows/build-code.yml b/.github/workflows/build-code.yml index c1e950ba7..262729f29 100644 --- a/.github/workflows/build-code.yml +++ b/.github/workflows/build-code.yml @@ -10,7 +10,7 @@ jobs: strategy: matrix: node_version: - - 16 + - 18 steps: - name: Checkout code uses: actions/checkout@v3 diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index 6b85f639b..26ccb9b8d 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -41,7 +41,7 @@ jobs: uses: docker/build-push-action@v3 with: context: . - platforms: linux/amd64,linux/arm64 + platforms: linux/amd64,linux/arm/v7,linux/arm64 push: ${{ github.event_name != 'pull_request' }} tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.output.labels }} diff --git a/.gitignore b/.gitignore index b91474588..307d7e9e2 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ /tmp # dependencies +/.yarn /node_modules # IDEs and editors @@ -24,6 +25,7 @@ # misc /.angular/cache +.env .env.prod /.sass-cache /connect.lock diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 000000000..3f430af82 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +v18 diff --git a/.storybook/main.js b/.storybook/main.js deleted file mode 100644 index 9b1beed01..000000000 --- a/.storybook/main.js +++ /dev/null @@ -1,11 +0,0 @@ -module.exports = { - stories: [], - addons: ['@storybook/addon-essentials'] - // uncomment the property below if you want to apply some webpack config globally - // webpackFinal: async (config, { configType }) => { - // // Make whatever fine-grained changes you need that should apply to all storybook configs - - // // Return the altered config - // return config; - // }, -}; diff --git a/.storybook/tsconfig.json b/.storybook/tsconfig.json deleted file mode 100644 index 4b1101543..000000000 --- a/.storybook/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "../tsconfig.base.json", - "exclude": [ - "../**/*.spec.js", - "../**/*.spec.ts", - "../**/*.spec.tsx", - "../**/*.spec.jsx" - ], - "include": ["../**/*"] -} diff --git a/.vscode/launch.json b/.vscode/launch.json index fa7c688b8..c1f19e7f0 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -2,32 +2,33 @@ "version": "0.2.0", "configurations": [ { - "name": "Debug Jest File", - "type": "node", - "request": "launch", - "program": "${workspaceFolder}/node_modules/@angular/cli/bin/ng", "args": [ "test", "--codeCoverage=false", - "--testFile=${workspaceFolder}/apps/api/src/models/portfolio.spec.ts" + "--testFile=${workspaceFolder}/apps/api/src/app/portfolio/portfolio-calculator-novn-buy-and-sell.spec.ts" ], + "console": "internalConsole", "cwd": "${workspaceFolder}", - "console": "internalConsole" + "name": "Debug Jest", + "program": "${workspaceFolder}/node_modules/@nrwl/cli/bin/nx", + "request": "launch", + "type": "node" }, { + "autoAttachChildProcesses": true, + "console": "integratedTerminal", + "cwd": "${workspaceFolder}/apps/api", "envFile": "${workspaceFolder}/.env", - "type": "node", - "request": "launch", - "name": "Launch Program", + "name": "Debug API", + "outFiles": ["${workspaceFolder}/dist/apps/api/**/*.js"], "program": "${workspaceFolder}/apps/api/src/main.ts", + "request": "launch", "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], - "outFiles": ["${workspaceFolder}/dist/apps/api/**/*.js"], - "autoAttachChildProcesses": true, "skipFiles": [ "${workspaceFolder}/node_modules/**/*.js", "/**/*.js" ], - "console": "integratedTerminal" + "type": "node" } ] } diff --git a/CHANGELOG.md b/CHANGELOG.md index 79169e6a0..273fd9c05 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,12 +7,1141 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +### Changed + +- Improved the loading state during filtering on the allocations page +- Beautified the names with ampersand (`&`) in the asset profile + +## 1.287.0 - 2023-07-09 + +### Changed + +- Hid the average buy price in the position detail chart if there is no holding +- Improved the language localization for French (`fr`) +- Refactored the blog articles to standalone components + +### Fixed + +- Fixed the sorting by currency in the activities table + +## 1.286.0 - 2023-07-03 + +### Fixed + +- Fixed the creation of (wealth) items and liabilities + +## 1.285.0 - 2023-07-01 + +### Added + +- Added a blog post: _Exploring the Path to Financial Independence and Retiring Early (FIRE)_ +- Added pagination to the historical market data table of the admin control panel +- Added the attribute `headers` to the scraper configuration + +### Changed + +- Extended the asset profile details dialog in the admin control panel by the scraper configuration +- Improved the language localization for German (`de`) + +## 1.284.0 - 2023-06-27 + +### Added + +- Added the currency to the cash balance in the create or update account dialog +- Added the ability to add an index for benchmarks as an asset profile in the admin control panel + +### Changed + +- Upgraded the _Internet Identity_ dependencies from version `0.15.1` to `0.15.7` + +### Fixed + +- Fixed an issue with the clone functionality of a transaction caused by the symbol search component + +## 1.283.5 - 2023-06-25 + +### Added + +- Added the caching for current market prices +- Added a loading indicator to the import dividends dialog +- Set up the `helmet` middleware to protect the app from web vulnerabilities by setting HTTP headers + +### Changed + +- Improved the selected item of the holding selector in the import dividends dialog +- Extended the symbol search component by asset sub classes + +## 1.282.0 - 2023-06-19 + +### Added + +- Added an icon to the external links in the footer navigation +- Added the ability to add an asset profile in the admin control panel + +### Changed + +- Harmonized the use of permissions on the about page +- Harmonized the use of permissions on the landing page +- Improved the language localization for German (`de`) +- Improved the language localization for Portuguese (`pt`) +- Updated the binary targets of `linux-arm64-openssl` for `prisma` + +## 1.281.0 - 2023-06-17 + +### Added + +- Extended the feature overview page by liabilities +- Set up the language localization for Portuguese (`pt`) + +### Changed + +- Extracted the symbol search to a dedicated component +- Improved the column headers in the holdings table for mobile +- Upgraded `prisma` from version `4.14.1` to `4.15.0` + +## 1.280.1 - 2023-06-10 + +### Added + +- Added support for liabilities + +## 1.279.0 - 2023-06-10 + +### Added + +- Supported a note for accounts + +### Changed + +- Improved the language localization for French (`fr`) + +### Fixed + +- Fixed an issue with the value nullification related to the investment streaks +- Fixed an issue in the public page related to the impersonation service + +## 1.278.0 - 2023-06-09 + +### Changed + +- Extended the clone functionality of a transaction by the quantity +- Changed the direction of the ellipsis icon in various tables +- Extracted the license to a dedicated tab on the about page +- Displayed the link to the markets overview in the footer based on a permission +- Improved the spacing in the benchmark comparator +- Refreshed the cryptocurrencies list +- Upgraded `Node.js` from version `16` to `18` (`Dockerfile`) + +## 1.277.0 - 2023-06-07 + +### Added + +- Added the investment streaks to the analysis page +- Added support for a unit in the value component +- Added a semantic list structure to the header navigation +- Added a default value for the `includeHistoricalData` attribute in the symbol data endpoint + +### Fixed + +- Fixed an issue with the date format parsing in the activities import + +## 1.276.0 - 2023-06-03 + +### Added + +- Added tabs to the about page +- Added the `changefreq` attribute to the sitemap + +### Changed + +- Improved the routes of the tabs +- Enforced a stricter date format in the activities import: `dd-MM-yyyy` instead of `dd-MM-yy` +- Updated the URL of the Ghostfolio Slack channel +- Removed the _Ghostfolio in Numbers_ section from the about page + +### Fixed + +- Fixed an issue with the price when creating a `Subscription` + +## 1.275.0 - 2023-05-30 + +### Changed + +- Extended the footer navigation by the localized Ghostfolio versions +- Improved the language localization for German (`de`) + +### Fixed + +- Fixed the exchange rate service for a specific date (indirect calculation via base currency) used in activities with a manual currency + +## 1.274.0 - 2023-05-29 + +### Added + +- Extended the footer by a navigation +- Extended the testimonial section on the landing page +- Added localized meta descriptions +- Added support for localized routes in Spanish (`es`) + +### Changed + +- Improved the activities import dialog +- Improved the language localization for German (`de`) + +## 1.273.0 - 2023-05-28 + +### Added + +- Added a stepper to the activities import dialog +- Added a link to manage the benchmarks to the benchmark comparator +- Added support for localized routes + +### Fixed + +- Fixed an issue in the data source transformation + +## 1.272.0 - 2023-05-26 + +### Added + +- Added support to set an asset profile as a benchmark + +### Changed + +- Decreased the density of the `@angular/material` tables +- Improved the portfolio proportion chart component by supporting case insensitive names +- Improved the breadcrumb navigation style in the blog post pages for mobile +- Improved the error handling in the delete user endpoint +- Improved the style of the _Changelog & License_ button on the about page +- Upgraded `ionicons` from version `6.1.2` to `7.1.0` + +## 1.271.0 - 2023-05-20 + +### Added + +- Added the historical data and search functionality for the `FINANCIAL_MODELING_PREP` data source type +- Added a blog post: _Unlock your Financial Potential with Ghostfolio_ + +### Changed + +- Improved the local number formatting in the value component +- Changed the uptime to the last 90 days on the _Open Startup_ (`/open`) page + +### Fixed + +- Fixed the vertical alignment in the toggle component + +## 1.270.1 - 2023-05-19 + +### Added + +- Added the cash balance and the value of equity to the account detail dialog +- Added a check for duplicates to the preview step of the import dividends dialog +- Added an error message for duplicates to the preview step of the activities import +- Added a connection timeout to the environment variable `DATABASE_URL` +- Introduced the _Open Startup_ (`/open`) page with aggregated key metrics including uptime + +### Changed + +- Improved the mobile layout of the portfolio summary tab on the home page +- Improved the language localization for German (`de`) +- Upgraded `prisma` from version `4.13.0` to `4.14.1` + +### Fixed + +- Improved the _Select all_ activities checkbox state after importing activities including a duplicate +- Fixed an issue with the data source transformation in the import dividends dialog +- Fixed the _Storybook_ setup + +## 1.269.0 - 2023-05-11 + +### Added + +- Added `FINANCIAL_MODELING_PREP` as a new data source type + +### Changed + +- Improved the market price on the first buy date in the chart of the position detail dialog +- Restructured the admin control panel with a new settings tab + +### Fixed + +- Fixed an error that occurred while editing an activity caused by the cash balance update + +## 1.268.0 - 2023-05-08 + +### Added + +- Added `depends_on` and `healthcheck` for the _Postgres_ and _Redis_ services to the `docker-compose` files (`docker-compose.yml` and `docker-compose.build.yml`) + +### Changed + +- Improved the preview step of the activities import by unchecking duplicates +- Upgraded `yahoo-finance2` from version `2.3.10` to `2.4.1` + +## 1.267.0 - 2023-05-07 + +### Added + +- Added support for the _Stripe_ checkout to the pricing page + +### Changed + +- Improved the management of platforms in the admin control panel +- Improved the style of the interstitial for the subscription +- Improved the language localization for German (`de`) +- Upgraded `Nx` from version `15.9.2` to `16.0.3` + +## 1.266.0 - 2023-05-06 + +### Added + +- Introduced the option to update the cash balance of an account when adding an activity +- Added support for the management of platforms in the admin control panel +- Added _DEV Community_ to the _As seen in_ section on the landing page + +### Changed + +- Upgraded `class-transformer` from version `0.3.2` to `0.5.1` +- Upgraded `class-validator` from version `0.13.1` to `0.14.0` +- Upgraded `prisma` from version `4.12.0` to `4.13.0` + +### Fixed + +- Added a fallback to use `quoteSummary(symbol)` if `quote(symbols)` fails in the _Yahoo Finance_ service +- Added the missing `dataSource` attribute to the activities import + +## 1.265.0 - 2023-05-01 + +### Changed + +- Improved the tooltip of the portfolio proportion chart component + +### Fixed + +- Fixed the missing platform name in the allocations by platform chart on the allocations page + +## 1.264.0 - 2023-05-01 + +### Added + +- Introduced the allocations by platform chart on the allocations page + +### Changed + +- Deprecated the use of the environment variable `BASE_CURRENCY` +- Cleaned up initial values from the _X-ray_ section + +## 1.263.0 - 2023-04-30 + +### Changed + +- Split the environment variable `DATA_SOURCE_PRIMARY` in `DATA_SOURCE_EXCHANGE_RATES` and `DATA_SOURCE_IMPORT` + +### Fixed + +- Fixed the exception on the accounts page + +## 1.262.0 - 2023-04-29 + +### Added + +- Added the labels to the tabs to increase the usability +- Extended the support of the impersonation mode for local development + +### Changed + +- Improved the queue jobs implementation by adding / updating historical market data in bulk +- Improved the language localization for German (`de`) + +### Fixed + +- Improved the holdings table by showing the cash position also when the filter contains the accounts, so that we can see the total allocation for that account + +## 1.261.0 - 2023-04-25 + +### Added + +- Introduced a new button to delete all activities from the portfolio activities page +- Added `state` to the `MarketData` database schema to distinguish `CLOSE` and `INTRADAY` in the data gathering +- Added the distance to now to the subscription expiration date in the users table of the admin control panel + +## 1.260.0 - 2023-04-23 + +### Added + +- Added `dataSource` as a unique constraint to the `MarketData` database schema + +### Fixed + +- Removed the unnecessary sort header of the comment column in the historical market data table of the admin control panel + +## 1.259.0 - 2023-04-22 + +### Added + +- Added a fallback to historical market data if a data provider does not provide live data +- Added a general health check endpoint +- Added health check endpoints for data providers + +### Changed + +- Persisted today's market data continuously + +### Fixed + +- Fixed the alignment of the performance column header in the holdings table +- Removed the unnecessary sort header of the comment column in the activities table +- Fixed the targets in `proxy.conf.json` from `http://localhost:3333` to `http://0.0.0.0:3333` for local development + +## 1.258.0 - 2023-04-20 + +### Added + +- Introduced a data source mapping + +## 1.257.0 - 2023-04-18 + +### Added + +- Introduced the allocations by ETF provider chart on the allocations page + +### Fixed + +- Fixed an issue in the global heat map component caused by manipulating an input property +- Fixed an issue with the currency inconsistency in the _EOD Historical Data_ service (convert from `GBX` to `GBp`) + +## 1.256.0 - 2023-04-17 + +### Added + +- Added the _Yahoo Finance_ data enhancer for countries, sectors and urls + +### Changed + +- Enabled the configuration to immediately remove queue jobs on complete +- Refactored the implementation of removing queue jobs + +### Fixed + +- Fixed the unique job ids of the gather asset profile process +- Fixed the style of the button to fetch the current market price + +## 1.255.0 - 2023-04-15 + +### Added + +- Made the system message expandable + +### Changed + +- Skipped creating queue jobs for asset profiles with `MANUAL` data source not having a scraper configuration +- Reduced the execution interval of the data gathering to every hour +- Upgraded `prisma` from version `4.11.0` to `4.12.0` + +### Fixed + +- Improved the style of the system message + +## 1.254.0 - 2023-04-14 + +### Changed + +- Improved the queue jobs implementation by adding in bulk +- Improved the queue jobs implementation by introducing unique job ids +- Reverted the execution interval of the data gathering from every 12 hours to every 4 hours + +## 1.253.0 - 2023-04-14 + +### Changed + +- Reduced the execution interval of the data gathering to every 12 hours + +### Fixed + +- Fixed the background color of dialogs in dark mode + +## 1.252.2 - 2023-04-11 + +### Changed + +- Deprecated the `auth` endpoint of the login with _Security Token_ (`GET`) + +## 1.252.1 - 2023-04-10 + +### Changed + +- Changed the slide toggles to checkboxes on the account page +- Changed the slide toggles to checkboxes in the admin control panel +- Increased the density of the theme +- Migrated the style of various components to `@angular/material` `15` (mdc) +- Upgraded `@angular/cdk` and `@angular/material` from version `15.2.5` to `15.2.6` +- Upgraded `bull` from version `4.10.2` to `4.10.4` + +## 1.251.0 - 2023-04-07 + +### Changed + +- Improved the activities import for `csv` files exported by _Interactive Brokers_ +- Improved the rendering of the chart ticks (`0.5K` → `500`) +- Increased the historical market data gathering of currency pairs to 10+ years +- Improved the content of the Frequently Asked Questions (FAQ) page +- Improved the content of the pricing page +- Changed the `auth` endpoint of the login with _Security Token_ from `GET` to `POST` +- Changed the `auth` endpoint of the _Internet Identity_ login provider from `GET` to `POST` +- Migrated the style of the `libs` components to `@angular/material` `15` (mdc) + - `ActivitiesFilterComponent` + - `ActivitiesTableComponent` + - `BenchmarkComponent` + - `HoldingsTableComponent` +- Upgraded `angular` from version `15.1.5` to `15.2.5` +- Upgraded `Nx` from version `15.7.2` to `15.9.2` + +## 1.250.0 - 2023-04-02 + +### Added + +- Added support for multiple subscription offers + +### Changed + +- Improved the portfolio evolution chart (ignore first item) +- Improved the accounts import by handling the platform + +### Fixed + +- Fixed an issue with more than 50 activities in the activities import (`dryRun`) + +## 1.249.0 - 2023-03-27 + +### Added + +- Extended the testimonial section on the landing page + +### Changed + +- Improved the loading state of the value component on the allocations page +- Improved the value component by always showing the label (also while loading) +- Improved the language localization for German (`de`) + +### Fixed + +- Fixed an issue with the algebraic sign in the value component + +## 1.248.0 - 2023-03-25 + +### Added + +- Added a blog post: _Ghostfolio reaches 1’000 Stars on GitHub_ +- Added a breadcrumb navigation to the blog post pages + +### Changed + +- Refactored the calculation of the chart +- Hid the platform selector if no platforms are available in the create or update account dialog +- Upgraded `ng-extract-i18n-merge` from version `2.5.0` to `2.6.0` + +## 1.247.0 - 2023-03-23 + +### Added + +- Added the asset and asset sub class to the search functionality +- Added the subscription expiration date to the users table of the admin control panel + +### Changed + +- Updated the URL of the Ghostfolio Slack channel +- Upgraded `prisma` from version `4.10.1` to `4.11.0` + +### Fixed + +- Fixed the total amount calculation in the portfolio evolution chart + +## 1.246.0 - 2023-03-18 + +### Added + +- Added support for asset and asset sub class to the `EOD_HISTORICAL_DATA` data source type +- Added `isin` to the asset profile model + +### Changed + +- Extended the _Trackinsight_ data enhancer for asset profile data by `isin` +- Improved the language localization for _Gather Data_ + +### Fixed + +- Fixed the border color in the _FIRE_ calculator (dark mode) + +## 1.245.0 - 2023-03-12 + +### Added + +- Added the search functionality for the `EOD_HISTORICAL_DATA` data source type + +### Changed + +- Improved the usability of the _FIRE_ calculator +- Improved the exchange rate service for a specific date used in activities with a manual currency +- Upgraded `ngx-device-detector` from version `3.0.0` to `5.0.1` + +## 1.244.0 - 2023-03-09 + +### Added + +- Extended the _FIRE_ calculator by a retirement date setting + +## 1.243.0 - 2023-03-08 + +### Added + +- Added `COINGECKO` as a default to `DATA_SOURCES` + +### Changed + +- Improved the validation of the manual currency for the activity fee and unit price +- Harmonized the axis style of charts +- Made setting `NODE_ENV: production` optional (to avoid `ENOENT: no such file or directory` errors on startup) +- Removed the environment variable `ENABLE_FEATURE_CUSTOM_SYMBOLS` + +## 1.242.0 - 2023-03-04 + +### Changed + +- Simplified the database seeding +- Upgraded `ngx-skeleton-loader` from version `5.0.0` to `7.0.0` + +### Fixed + +- Downgraded `Node.js` from version `18` to `16` (Dockerfile) to resolve `SIGSEGV` (segmentation fault) during the `prisma` database migrations (see https://github.com/prisma/prisma/issues/10649) + +## 1.241.0 - 2023-03-01 + +### Changed + +- Filtered activities with type `ITEM` from search results +- Considered the user's language in the _Stripe_ checkout +- Upgraded the _Stripe_ dependencies +- Upgraded `twitter-api-v2` from version `1.10.3` to `1.14.2` + +## 1.240.0 - 2023-02-26 + +### Added + +- Supported a manual currency for the activity unit price + +### Fixed + +- Fixed the feature graphic of the _Ghostfolio meets Umbrel_ blog post + +## 1.239.0 - 2023-02-25 + +### Added + +- Added a blog post: _Ghostfolio meets Umbrel_ + +### Changed + +- Removed the dependency `rimraf` + +## 1.238.0 - 2023-02-25 + +### Added + +- Added `COINGECKO` as a new data source type +- Added support for data provider information to the position detail dialog +- Added the configuration to publish a `linux/arm/v7` docker image +- Added _Reddit_ to the _As seen in_ section on the landing page +- Added _Umbrel_ to the _As seen in_ section on the landing page + +### Changed + +- Renamed the example environment variable file from `.env` to `.env.example` +- Upgraded `zone.js` from version `0.11.8` to `0.12.0` + +### Fixed + +- Fixed `RangeError: Maximum call stack size exceeded` for values of type `Big` in the value redaction interceptor for the impersonation mode +- Reset the letter spacing in buttons + +### Todo + +- Ensure that you still have a `.env` file in your project + +## 1.237.0 - 2023-02-19 + +### Added + +- Added the support details to the pricing page + +### Changed + +- Increased the file size limit for the activities import +- Improved the style of the search results for symbols +- Migrated the style of `GfHeaderModule` to `@angular/material` `15` (mdc) +- Upgraded `angular` from version `15.1.2` to `15.1.5` +- Upgraded `Nx` from version `15.6.3` to `15.7.2` + +### Fixed + +- Fixed an issue with exact matches in the activities table filter (`VT` vs. `VTI`) +- Fixed an issue in the data gathering service (do not skip `MANUAL` data source) + +## 1.236.0 - 2023-02-17 + +### Changed + +- Beautified the ETF names in the asset profile +- Removed the data source type `GHOSTFOLIO` + +### Fixed + +- Fixed an issue in the data gathering service (do not skip `MANUAL` data source) +- Fixed the buying power calculation if no emergency fund is set but an activity is tagged as _Emergency Fund_ +- Fixed the url on logout during the local development + +## 1.235.0 - 2023-02-16 + +### Changed + +- Improved the styles on the about page +- Eliminated the `GhostfolioScraperApiService` + +## 1.234.0 - 2023-02-15 + +### Added + +- Added the data import and export feature to the pricing page + +### Changed + +- Copy the logic of `GhostfolioScraperApiService` to `ManualService` +- Improved the content of the landing page +- Improved the content of the Frequently Asked Questions (FAQ) page +- Improved the usability of the _Import Activities..._ action +- Eliminated the permission `enableImport` +- Set the exposed port as an environment variable (`PORT`) in `Dockerfile` +- Migrated the style of `AboutPageModule` to `@angular/material` `15` (mdc) +- Migrated the style of `BlogPageModule` to `@angular/material` `15` (mdc) +- Migrated the style of `ChangelogPageModule` to `@angular/material` `15` (mdc) +- Migrated the style of `ResourcesPageModule` to `@angular/material` `15` (mdc) +- Upgraded `chart.js` from version `4.0.1` to `4.2.0` +- Upgraded `ionicons` from version `6.0.4` to `6.1.2` +- Upgraded `prettier` from version `2.8.1` to `2.8.4` +- Upgraded `prisma` from version `4.9.0` to `4.10.1` + +### Fixed + +- Fixed an issue on the landing page caused by the global heat map of subscribers +- Fixed the links in the interstitial for the subscription + +### Todo + +- Remove the environment variable `ENABLE_FEATURE_IMPORT` +- Rename the `dataSource` from `GHOSTFOLIO` to `MANUAL` +- Eliminate `GhostfolioScraperApiService` + +## 1.233.0 - 2023-02-09 + +### Added + +- Added support to export accounts +- Added support to import accounts + +### Changed + +- Improved the styling in the admin control panel +- Removed the _Google Play_ badge from the landing page +- Upgraded `eslint` dependencies + +## 1.232.0 - 2023-02-05 + +### Changed + +- Improved the language localization for German (`de`) +- Migrated the style of `ActivitiesPageModule` to `@angular/material` `15` (mdc) +- Migrated the style of `GfCreateOrUpdateActivityDialogModule` to `@angular/material` `15` (mdc) +- Migrated the style of `GfMarketDataDetailDialogModule` to `@angular/material` `15` (mdc) +- Upgraded `ng-extract-i18n-merge` from version `2.1.2` to `2.5.0` +- Upgraded `ngx-markdown` from version `14.0.1` to `15.1.0` + +### Fixed + +- Fixed the `Upgrade Plan` button of the interstitial for the subscription + +## 1.231.0 - 2023-02-04 + +### Added + +- Added the dividend and fees to the position detail dialog +- Added support to link a (wealth) item to an account + +### Changed + +- Relaxed the validation rule of the _Redis_ host environment variable (`REDIS_HOST`) +- Improved the language localization for German (`de`) +- Eliminated `angular-material-css-vars` +- Upgraded `angular` from version `14.2.0` to `15.1.2` +- Upgraded `Nx` from version `15.0.13` to `15.6.3` + +## 1.230.0 - 2023-01-29 + +### Added + +- Added an interstitial for the subscription +- Added _SourceForge_ to the _As seen in_ section on the landing page +- Added a quote to the blog post _Ghostfolio auf Sackgeld.com vorgestellt_ + +### Changed + +- Improved the unit format (`%`) in the global heat map component of the public page +- Improved the pricing page +- Upgraded `Node.js` from version `16` to `18` (`Dockerfile`) +- Upgraded `prisma` from version `4.8.0` to `4.9.0` + +### Fixed + +- Fixed the click of unknown accounts in the portfolio proportion chart component +- Fixed an issue with `value` in the value redaction interceptor for the impersonation mode + +## 1.229.0 - 2023-01-21 + +### Added + +- Added a blog post: _Ghostfolio auf Sackgeld.com vorgestellt_ +- Added _Sackgeld.com_ to the _As seen in_ section on the landing page + +### Changed + +- Removed the toggle _Original Shares_ vs. _Current Shares_ on the allocations page +- Hid error messages related to no current investment in the client +- Refactored the value redaction interceptor for the impersonation mode + +### Fixed + +- Fixed the value of the active (emergency fund) filter in percentage on the allocations page + +## 1.228.1 - 2023-01-18 + +### Added + +- Extended the hints in user settings + +### Changed + +- Improved the date formatting in the tooltip of the dividend timeline grouped by month / year +- Improved the date formatting in the tooltip of the investment timeline grouped by month / year +- Reduced the execution interval of the data gathering to every 4 hours +- Removed emergency fund as an asset class + +## 1.227.1 - 2023-01-14 + +### Changed + +- Improved the language localization for German (`de`) + +### Fixed + +- Fixed the create or edit activity dialog + +## 1.227.0 - 2023-01-14 + +### Added + +- Added support for assets other than cash in emergency fund (affecting buying power) +- Added support for translated tags + +### Changed + +- Improved the logo alignment + +### Fixed + +- Fixed the grouping by month / year of the dividend and investment timeline + +## 1.226.0 - 2023-01-11 + +### Added + +- Added the language localization for Français (`fr`) +- Extended the landing page by a global heat map of subscribers +- Added support for the thousand separator in the global heat map component + +### Changed + +- Improved the form of the import dividends dialog (disable while loading) +- Removed the deprecated `~` in _Sass_ imports + +### Fixed + +- Fixed an exception in the _X-ray_ section + +## 1.225.0 - 2023-01-07 + +### Added + +- Added support for importing dividends from a data provider + +### Changed + +- Extended the Frequently Asked Questions (FAQ) page + +## 1.224.0 - 2023-01-04 + +### Added + +- Added support for the dividend timeline grouped by year +- Added support for the investment timeline grouped by year +- Set up the language localization for Français (`fr`) + +### Changed + +- Improved the language localization for Dutch (`nl`) + +## 1.223.0 - 2023-01-01 + +### Added + +- Added a student discount to the pricing page +- Added a prefix to the codes of the coupon system + +### Changed + +- Optimized the page titles in the header for mobile +- Extended the asset profile details dialog in the admin control panel + +## 1.222.0 - 2022-12-29 + +### Added + +- Added support for filtering on the analysis page +- Added the price to the `Subscription` database schema + +### Changed + +- Changed the execution time of the asset profile data gathering to every Sunday at lunch time +- Improved the activities import by providing asset profile details +- Upgraded `@codewithdan/observable-store` from version `2.2.11` to `2.2.15` +- Upgraded `bull` from version `4.8.5` to `4.10.2` +- Upgraded `countup.js` from version `2.0.7` to `2.3.2` +- Upgraded the _Internet Identity_ dependencies from version `0.12.1` to `0.15.1` +- Upgraded `prisma` from version `4.7.1` to `4.8.0` + +### Fixed + +- Fixed the language localization of the account type + +## 1.221.0 - 2022-12-26 + +### Added + +- Added support to manage the tags in the create or edit activity dialog +- Added the tags to the admin control panel +- Added a blog post: _The importance of tracking your personal finances_ +- Resolved the title of the blog post + +### Changed + +- Improved the activities import by a preview step +- Improved the labels based on the type in the create or edit activity dialog +- Refreshed the cryptocurrencies list +- Removed the data source type `RAKUTEN` + +### Fixed + +- Fixed the date conversion for years with only two digits + +## 1.220.0 - 2022-12-23 + +### Added + +- Added the position detail dialog to the _Top 3_ and _Bottom 3_ performers of the analysis page +- Added the `dryRun` option to the import activities endpoint + +### Changed + +- Increased the historical data chart of the _Fear & Greed Index_ (market mood) to 365 days +- Upgraded `color` from version `4.0.1` to `4.2.3` +- Upgraded `prettier` from version `2.7.1` to `2.8.1` + +### Fixed + +- Fixed the rounding of the y-axis ticks in the benchmark comparator + +## 1.219.0 - 2022-12-17 + +### Added + +- Added support to disable user sign up in the admin control panel +- Extended the glossary of the resources page by _Deflation_, _Inflation_ and _Stagflation_ + +### Changed + +- Added the name to the symbol column in the activities table +- Combined the name and symbol column in the holdings table (former positions table) + +## 1.218.0 - 2022-12-12 + +### Added + +- Added the date of the first activity to the positions table +- Added an endpoint to fetch the logo of an asset or a platform + +### Changed + +- Improved the asset profile details dialog in the admin control panel +- Upgraded `chart.js` from version `3.8.0` to `4.0.1` + +## 1.217.0 - 2022-12-10 + +### Added + +- Added the dividend timeline grouped by month + +### Changed + +- Improved the value redaction interceptor (including `comment`) +- Improved the language localization for Español (`es`) +- Upgraded `cheerio` from version `1.0.0-rc.6` to `1.0.0-rc.12` +- Upgraded `prisma` from version `4.6.1` to `4.7.1` + +### Fixed + +- Fixed the activities sorting in the account detail dialog + +## 1.216.0 - 2022-12-03 + +### Added + +- Supported a note for asset profiles +- Supported a manual currency for the activity fee +- Extended the support for column sorting in the accounts table (name, platform, transactions) +- Extended the support for column sorting in the activities table (name, symbol) +- Extended the support for column sorting in the positions table (performance) + +### Changed + +- Upgraded `big.js` from version `6.1.1` to `6.2.1` +- Upgraded `date-fns` from version `2.28.0` to `2.29.3` +- Upgraded `replace-in-file` from version `6.2.0` to `6.3.5` + +### Fixed + +- Fixed the filter by asset sub class for the asset profiles in the admin control + +## 1.215.0 - 2022-11-27 + +### Changed + +- Improved the language selector on the account page +- Improved the wording in the _X-ray_ section (net worth instead of investment) +- Extended the asset profile details dialog in the admin control panel +- Updated the browserslist database +- Upgraded `ionicons` from version `5.5.1` to `6.0.4` +- Upgraded `uuid` from version `8.3.2` to `9.0.0` + +## 1.214.0 - 19.11.2022 + +### Added + +- Added support for sorting in the accounts table + +### Changed + +- Improved the support for the `MANUAL` data source +- Improved the _Activities_ tab icon +- Improved the _Activities_ icons for `BUY`, `DIVIDEND` and `SELL` +- Upgraded `prisma` from version `4.4.0` to `4.6.1` +- Upgraded `yahoo-finance2` from version `2.3.6` to `2.3.10` + +### Fixed + +- Fixed the activities sorting in the position detail dialog +- Fixed the dynamic number of decimal places for cryptocurrencies in the position detail dialog +- Fixed a division by zero error in the cash positions calculation + +## 1.213.0 - 14.11.2022 + +### Added + +- Added an indicator for excluded accounts in the accounts table +- Added a blog post: _Black Friday 2022_ + +### Fixed + +- Fixed an issue with the currency inconsistency in the _Yahoo Finance_ service (convert from `ZAc` to `ZAR`) + +## 1.212.0 - 11.11.2022 + +### Changed + +- Changed the view mode selector to a slide toggle +- Upgraded `Nx` from version `15.0.0` to `15.0.13` + +## 1.211.0 - 11.11.2022 + +### Changed + +- Converted the client into a _Progressive Web App_ (PWA) with `@angular/pwa` +- Removed the bottom margin from the body element +- Improved the pricing page + +## 1.210.0 - 08.11.2022 + +### Added + +- Added tabs to the portfolio page + +### Changed + +- Merged the _FIRE_ calculator and the _X-ray_ section to a single page +- Tightened the validation rule of the base currency environment variable (`BASE_CURRENCY`) + +### Fixed + +- Fixed an issue in the cash positions calculation + +## 1.209.0 - 05.11.2022 + +### Added + +- Added the _Buy me a coffee_ button to the about page + +### Changed + +- Improved the usability of the activities import +- Improved the usage of the premium indicator component +- Removed the intro image in dark mode +- Refactored the `TransactionsPageComponent` to `ActivitiesPageComponent` + +## 1.208.0 - 03.11.2022 + +### Added + +- Added pagination to the activities table + +### Changed + +- Restructured the actions in the admin control panel + +### Fixed + +- Fixed the calculation in the portfolio evolution chart + +## 1.207.0 - 31.10.2022 + ### Added - Added support for translated labels of asset and asset sub class +- Added support for dates in _ISO 8601_ date format (`YYYY-MM-DD`) in the activities import + +### Changed + +- Darkened the background color of the dark mode ### Fixed +- Fixed the public page - Improved the loading indicator of the portfolio evolution chart ## 1.206.2 - 20.10.2022 @@ -43,7 +1172,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added support to change the appearance (dark mode) in user settings - Added the total amount chart to the investment timeline -- Setup the `prettier` plugin `prettier-plugin-organize-attributes` +- Set up the `prettier` plugin `prettier-plugin-organize-attributes` ### Changed @@ -290,7 +1419,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added the alias to the `Access` database schema - Added support for translated time distances -- Added a _GitHub Action_ to create an `arm64` docker image +- Added a _GitHub Action_ to create an `linux/arm64` docker image ### Changed @@ -433,7 +1562,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added -- Support a note for activities +- Supported a note for activities ### Todo @@ -903,7 +2032,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed -- Beautified the ETF names in the symbol profile +- Beautified the ETF names in the asset profile ### Fixed @@ -1328,7 +2457,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Extended the historical data view in the admin control panel -- Upgraded _Stripe_ dependencies +- Upgraded the _Stripe_ dependencies - Upgraded `prisma` from version `3.7.0` to `3.8.1` ### Fixed diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md new file mode 100644 index 000000000..b73831d98 --- /dev/null +++ b/DEVELOPMENT.md @@ -0,0 +1,31 @@ +# Ghostfolio Development Guide + +## Git + +### Rebase + +`git rebase -i --autosquash main` + +## Dependencies + +### Nx + +#### Upgrade + +1. Run `yarn nx migrate latest` +1. Make sure `package.json` changes make sense and then run `yarn install` +1. Run `yarn nx migrate --run-migrations` + +### Prisma + +#### Synchronize schema with database for prototyping + +Run `yarn database:push` + +https://www.prisma.io/docs/concepts/components/prisma-migrate/db-push + +#### Create schema migration + +Run `yarn prisma migrate dev --name added_job_title` + +https://www.prisma.io/docs/concepts/components/prisma-migrate#getting-started-with-prisma-migrate diff --git a/Dockerfile b/Dockerfile index 5bc79b61a..cdebe275d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=$BUILDPLATFORM node:16-slim as builder +FROM --platform=$BUILDPLATFORM node:18-slim as builder # Build application and add additional files WORKDIR /ghostfolio @@ -50,12 +50,12 @@ COPY package.json /ghostfolio/dist/apps/api RUN yarn database:generate-typings # Image to run, copy everything needed from builder -FROM node:16-slim +FROM node:18-slim RUN apt update && apt install -y \ openssl \ && rm -rf /var/lib/apt/lists/* COPY --from=builder /ghostfolio/dist/apps /ghostfolio/apps WORKDIR /ghostfolio/apps/api -EXPOSE 3333 +EXPOSE ${PORT:-3333} CMD [ "yarn", "start:prod" ] diff --git a/README.md b/README.md index 3343ca7b8..3872caac6 100644 --- a/README.md +++ b/README.md @@ -1,32 +1,26 @@
- - Ghostfolio Logo - - -

Ghostfolio

-

- Open Source Wealth Management Software -

-

- Ghostfol.ioLive Demo | Ghostfolio Premium | FAQ | Blog | Slack | Twitter -

-

- - - - License: AGPL v3 -

+ +[Ghostfolio logo](https://ghostfol.io) + +# Ghostfolio + +**Open Source Wealth Management Software** + +[**Ghostfol.io**](https://ghostfol.io) | [**Live Demo**](https://ghostfol.io/en/demo) | [**Ghostfolio Premium**](https://ghostfol.io/en/pricing) | [**FAQ**](https://ghostfol.io/en/faq) | +[**Blog**](https://ghostfol.io/en/blog) | [**Slack**](https://join.slack.com/t/ghostfolio/shared_invite/zt-vsaan64h-F_I0fEo5M0P88lP9ibCxFg) | [**Twitter**](https://twitter.com/ghostfolio_) + +[![Shield: Buy me a coffee](https://img.shields.io/badge/Buy%20me%20a%20coffee-Support-yellow?logo=buymeacoffee)](https://www.buymeacoffee.com/ghostfolio) +[![Shield: Contributions Welcome](https://img.shields.io/badge/Contributions-Welcome-orange.svg)](#contributing) +[![Shield: License: AGPL v3](https://img.shields.io/badge/License-AGPL%20v3-blue.svg)](https://www.gnu.org/licenses/agpl-3.0) +
-**Ghostfolio** is an open source wealth management software built with web technology. The application empowers busy people to keep track of stocks, ETFs or cryptocurrencies and make solid, data-driven investment decisions. +**Ghostfolio** is an open source wealth management software built with web technology. The application empowers busy people to keep track of stocks, ETFs or cryptocurrencies and make solid, data-driven investment decisions. The software is designed for personal use in continuous operation. + +
+ +[Preview image of the Ghostfolio video trailer](https://www.youtube.com/watch?v=yY6ObSQVJZk) -
- -
## Ghostfolio Premium @@ -46,23 +40,25 @@ Ghostfolio is for you if you are... - 🧘 into minimalism - 🧺 caring about diversifying your financial resources - 🆓 interested in financial independence -- 🙅 saying no to spreadsheets in 2022 +- 🙅 saying no to spreadsheets - 😎 still reading this list ## Features - ✅ Create, update and delete transactions - ✅ Multi account management -- ✅ Portfolio performance: Time-weighted rate of return (TWR) for `Today`, `YTD`, `1Y`, `5Y`, `Max` +- ✅ Portfolio performance for `Today`, `YTD`, `1Y`, `5Y`, `Max` - ✅ Various charts - ✅ Static analysis to identify potential risks in your portfolio - ✅ Import and export transactions - ✅ Dark Mode - ✅ Zen Mode -- ✅ Mobile-first design +- ✅ Progressive Web App (PWA) with a mobile-first design + +
+ +Image of a phone showing the Ghostfolio app open -
-
## Technology Stack @@ -79,14 +75,19 @@ The frontend is built with [Angular](https://angular.io) and uses [Angular Mater ## Self-hosting -We provide official container images hosted on [Docker Hub](https://hub.docker.com/r/ghostfolio/ghostfolio) for `linux/amd64` and `linux/arm64`. +We provide official container images hosted on [Docker Hub](https://hub.docker.com/r/ghostfolio/ghostfolio) for `linux/amd64`, `linux/arm/v7` and `linux/arm64`. + +
+ +[Buy me a coffee button](https://www.buymeacoffee.com/ghostfolio) + +
### Supported Environment Variables | Name | Default Value | Description | | ------------------- | ------------- | ----------------------------------------------------------------------------------------------------------------------------------- | | `ACCESS_TOKEN_SALT` | | A random string used as salt for access tokens | -| `BASE_CURRENCY` | `USD` | The base currency of the Ghostfolio application. Caution: This cannot be changed later! | | `DATABASE_URL` | | The database connection URL, e.g. `postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@localhost:5432/${POSTGRES_DB}?sslmode=prefer` | | `HOST` | `0.0.0.0` | The host where the Ghostfolio application will run on | | `JWT_SECRET_KEY` | | A random string used for _JSON Web Tokens_ (JWT) | @@ -104,7 +105,8 @@ We provide official container images hosted on [Docker Hub](https://hub.docker.c - Basic knowledge of Docker - Installation of [Docker](https://www.docker.com/products/docker-desktop) -- Local copy of this Git repository (clone) +- 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`) #### a. Run environment @@ -123,13 +125,10 @@ docker-compose --env-file ./.env -f docker/docker-compose.build.yml build docker-compose --env-file ./.env -f docker/docker-compose.build.yml up -d ``` -#### Fetch Historical Data - -Open http://localhost:3333 in your browser and accomplish these steps: +#### Setup +1. Open http://localhost:3333 in your browser 1. Create a new user via _Get Started_ (this first user will get the role `ADMIN`) -1. Go to the _Admin Control Panel_ and click _Gather All Data_ to fetch historical data -1. Click _Sign out_ and check out the _Live Demo_ #### Upgrade Version @@ -146,31 +145,34 @@ Please follow the instructions of the Ghostfolio [Unraid Community App](https:// ### Prerequisites - [Docker](https://www.docker.com/products/docker-desktop) -- [Node.js](https://nodejs.org/en/download) (version 16+) +- [Node.js](https://nodejs.org/en/download) (version 18+) - [Yarn](https://yarnpkg.com/en/docs/install) -- A local copy of this Git repository (clone) +- 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`) ### Setup 1. Run `yarn install` 1. Run `yarn build:dev` to build the source code including the assets 1. Run `docker-compose --env-file ./.env -f docker/docker-compose.dev.yml up -d` to start [PostgreSQL](https://www.postgresql.org) and [Redis](https://redis.io) -1. Run `yarn database:setup` to initialize the database schema and populate your database with (example) data +1. Run `yarn database:setup` to initialize the database schema 1. Start the server and the client (see [_Development_](#Development)) +1. Open http://localhost:4200/en in your browser 1. Create a new user via _Get Started_ (this first user will get the role `ADMIN`) -1. Go to the _Admin Control Panel_ and click _Gather All Data_ to fetch historical data -1. Click _Sign out_ and check out the _Live Demo_ ### Start Server -
    -
  1. Debug: Run yarn watch:server and click "Launch Program" in Visual Studio Code
  2. -
  3. Serve: Run yarn start:server
  4. -
+#### Debug + +Run `yarn watch:server` and click _Launch Program_ in [Visual Studio Code](https://code.visualstudio.com) + +#### Serve + +Run `yarn start:server` ### Start Client -Run `yarn start:client` +Run `yarn start:client` and open http://localhost:4200/en in your browser ### Start _Storybook_ @@ -190,20 +192,24 @@ Run `yarn test` ## Public API -### Import Activities +### Authorization: Bearer Token -#### Request - -`POST http://localhost:3333/api/v1/import` - -#### Authorization: Bearer Token - -Set the header as follows: +Set the header for each request as follows: ``` "Authorization": "Bearer eyJh..." ``` +You can get the _Bearer Token_ via `POST http://localhost:3333/api/v1/auth/anonymous` (Body: `{ accessToken: }`) + +Deprecated: `GET http://localhost:3333/api/v1/auth/anonymous/` or `curl -s http://localhost:3333/api/v1/auth/anonymous/`. + +### Import Activities + +#### Request + +`POST http://localhost:3333/api/v1/import` + #### Body ``` @@ -215,7 +221,7 @@ Set the header as follows: "date": "2021-09-15T00:00:00.000Z", "fee": 19, "quantity": 5, - "symbol": "MSFT" + "symbol": "MSFT", "type": "BUY", "unitPrice": 298.58 } @@ -226,6 +232,7 @@ Set the header as follows: | Field | Type | Description | | ---------- | ------------------- | -------------------------------------------------- | | accountId | string (`optional`) | Id of the account | +| comment | string (`optional`) | Comment of the activity | | currency | string | `CHF` \| `EUR` \| `USD` etc. | | dataSource | string | `MANUAL` (for type `ITEM`) \| `YAHOO` | | date | string | Date in the format `ISO-8601` | @@ -254,16 +261,20 @@ Set the header as follows: } ``` +## Community Projects + +- [ghostfolio-cli](https://github.com/DerAndereJohannes/ghostfolio-cli): Command-line interface to access your portfolio + ## Contributing Ghostfolio is **100% free** and **open source**. We encourage and support an active and healthy community that accepts contributions from the public - including you. -Not sure what to work on? We have got some ideas. Please join the Ghostfolio [Slack channel](https://join.slack.com/t/ghostfolio/shared_invite/zt-vsaan64h-F_I0fEo5M0P88lP9ibCxFg), tweet to [@ghostfolio\_](https://twitter.com/ghostfolio_) or send an e-mail to hi@ghostfol.io. We would love to hear from you. +Not sure what to work on? We have got some ideas. Please join the Ghostfolio [Slack](https://join.slack.com/t/ghostfolio/shared_invite/zt-vsaan64h-F_I0fEo5M0P88lP9ibCxFg) channel or tweet to [@ghostfolio\_](https://twitter.com/ghostfolio_). We would love to hear from you. -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)**. +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). ## License -© 2022 [Ghostfolio](https://ghostfol.io) +© 2021 - 2023 [Ghostfolio](https://ghostfol.io) Licensed under the [AGPLv3 License](https://www.gnu.org/licenses/agpl-3.0.html). diff --git a/apps/api/jest.config.ts b/apps/api/jest.config.ts index b21073ff3..8152c3f2a 100644 --- a/apps/api/jest.config.ts +++ b/apps/api/jest.config.ts @@ -2,13 +2,14 @@ export default { displayName: 'api', - globals: { - 'ts-jest': { - tsconfig: '/tsconfig.spec.json' - } - }, + globals: {}, transform: { - '^.+\\.[tj]s$': 'ts-jest' + '^.+\\.[tj]s$': [ + 'ts-jest', + { + tsconfig: '/tsconfig.spec.json' + } + ] }, moduleFileExtensions: ['ts', 'js', 'html'], coverageDirectory: '../../coverage/apps/api', diff --git a/apps/api/project.json b/apps/api/project.json index 21474bcb1..208ebdda9 100644 --- a/apps/api/project.json +++ b/apps/api/project.json @@ -1,4 +1,5 @@ { + "name": "api", "$schema": "../../node_modules/nx/schemas/project-schema.json", "sourceRoot": "apps/api/src", "projectType": "application", @@ -32,7 +33,7 @@ "outputs": ["{options.outputPath}"] }, "serve": { - "executor": "@nrwl/node:node", + "executor": "@nx/node:node", "options": { "buildTarget": "api:build" } @@ -44,7 +45,7 @@ } }, "test": { - "executor": "@nrwl/jest:jest", + "executor": "@nx/jest:jest", "options": { "jestConfig": "apps/api/jest.config.ts", "passWithNoTests": true diff --git a/apps/api/src/app/.gitkeep b/apps/api/src/app/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/apps/api/src/app/access/access.module.ts b/apps/api/src/app/access/access.module.ts index d70388038..b9813d173 100644 --- a/apps/api/src/app/access/access.module.ts +++ b/apps/api/src/app/access/access.module.ts @@ -1,4 +1,4 @@ -import { PrismaModule } from '@ghostfolio/api/services/prisma.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 f1dc4c6ec..bbaef5f73 100644 --- a/apps/api/src/app/access/access.service.ts +++ b/apps/api/src/app/access/access.service.ts @@ -1,4 +1,4 @@ -import { PrismaService } from '@ghostfolio/api/services/prisma.service'; +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/account.controller.ts b/apps/api/src/app/account/account.controller.ts index 9e170b7fd..bf15d998f 100644 --- a/apps/api/src/app/account/account.controller.ts +++ b/apps/api/src/app/account/account.controller.ts @@ -1,10 +1,7 @@ import { PortfolioService } from '@ghostfolio/api/app/portfolio/portfolio.service'; -import { UserService } from '@ghostfolio/api/app/user/user.service'; -import { - nullifyValuesInObject, - nullifyValuesInObjects -} from '@ghostfolio/api/helper/object.helper'; -import { ImpersonationService } from '@ghostfolio/api/services/impersonation.service'; +import { RedactValuesInResponseInterceptor } from '@ghostfolio/api/interceptors/redact-values-in-response.interceptor'; +import { ImpersonationService } from '@ghostfolio/api/services/impersonation/impersonation.service'; +import { HEADER_KEY_IMPERSONATION } from '@ghostfolio/common/config'; import { Accounts } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import type { @@ -22,7 +19,8 @@ import { Param, Post, Put, - UseGuards + UseGuards, + UseInterceptors } from '@nestjs/common'; import { REQUEST } from '@nestjs/core'; import { AuthGuard } from '@nestjs/passport'; @@ -39,8 +37,7 @@ export class AccountController { private readonly accountService: AccountService, private readonly impersonationService: ImpersonationService, private readonly portfolioService: PortfolioService, - @Inject(REQUEST) private readonly request: RequestWithUser, - private readonly userService: UserService + @Inject(REQUEST) private readonly request: RequestWithUser ) {} @Delete(':id') @@ -85,87 +82,36 @@ export class AccountController { @Get() @UseGuards(AuthGuard('jwt')) + @UseInterceptors(RedactValuesInResponseInterceptor) public async getAllAccounts( - @Headers('impersonation-id') impersonationId + @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId ): Promise { const impersonationUserId = - await this.impersonationService.validateImpersonationId( - impersonationId, - this.request.user.id - ); - - let accountsWithAggregations = - await this.portfolioService.getAccountsWithAggregations({ - userId: impersonationUserId || this.request.user.id, - withExcludedAccounts: true - }); + await this.impersonationService.validateImpersonationId(impersonationId); - if ( - impersonationUserId || - this.userService.isRestrictedView(this.request.user) - ) { - accountsWithAggregations = { - ...nullifyValuesInObject(accountsWithAggregations, [ - 'totalBalanceInBaseCurrency', - 'totalValueInBaseCurrency' - ]), - accounts: nullifyValuesInObjects(accountsWithAggregations.accounts, [ - 'balance', - 'balanceInBaseCurrency', - 'convertedBalance', - 'fee', - 'quantity', - 'unitPrice', - 'value', - 'valueInBaseCurrency' - ]) - }; - } - - return accountsWithAggregations; + return this.portfolioService.getAccountsWithAggregations({ + userId: impersonationUserId || this.request.user.id, + withExcludedAccounts: true + }); } @Get(':id') @UseGuards(AuthGuard('jwt')) + @UseInterceptors(RedactValuesInResponseInterceptor) public async getAccountById( - @Headers('impersonation-id') impersonationId, + @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId, @Param('id') id: string ): Promise { const impersonationUserId = - await this.impersonationService.validateImpersonationId( - impersonationId, - this.request.user.id - ); + await this.impersonationService.validateImpersonationId(impersonationId); - let accountsWithAggregations = + const accountsWithAggregations = await this.portfolioService.getAccountsWithAggregations({ filters: [{ id, type: 'ACCOUNT' }], userId: impersonationUserId || this.request.user.id, withExcludedAccounts: true }); - if ( - impersonationUserId || - this.userService.isRestrictedView(this.request.user) - ) { - accountsWithAggregations = { - ...nullifyValuesInObject(accountsWithAggregations, [ - 'totalBalanceInBaseCurrency', - 'totalValueInBaseCurrency' - ]), - accounts: nullifyValuesInObjects(accountsWithAggregations.accounts, [ - 'balance', - 'balanceInBaseCurrency', - 'convertedBalance', - 'fee', - 'quantity', - 'unitPrice', - 'value', - 'valueInBaseCurrency' - ]) - }; - } - return accountsWithAggregations.accounts[0]; } diff --git a/apps/api/src/app/account/account.module.ts b/apps/api/src/app/account/account.module.ts index 90bf909fc..f37ed34ee 100644 --- a/apps/api/src/app/account/account.module.ts +++ b/apps/api/src/app/account/account.module.ts @@ -1,11 +1,11 @@ import { PortfolioModule } from '@ghostfolio/api/app/portfolio/portfolio.module'; import { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.module'; import { UserModule } from '@ghostfolio/api/app/user/user.module'; -import { ConfigurationModule } from '@ghostfolio/api/services/configuration.module'; +import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module'; -import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data.module'; -import { ImpersonationModule } from '@ghostfolio/api/services/impersonation.module'; -import { PrismaModule } from '@ghostfolio/api/services/prisma.module'; +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 7c10fc31f..c6da815e4 100644 --- a/apps/api/src/app/account/account.service.ts +++ b/apps/api/src/app/account/account.service.ts @@ -1,5 +1,5 @@ -import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data.service'; -import { PrismaService } from '@ghostfolio/api/services/prisma.service'; +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'; @@ -172,4 +172,47 @@ export class AccountService { where }); } + + public async updateAccountBalance({ + accountId, + amount, + currency, + date, + userId + }: { + accountId: string; + amount: number; + currency: string; + date: Date; + userId: string; + }) { + const { balance, currency: currencyOfAccount } = await this.account({ + id_userId: { + userId, + id: accountId + } + }); + + const amountInCurrencyOfAccount = + await this.exchangeRateDataService.toCurrencyAtDate( + amount, + currency, + currencyOfAccount, + date + ); + + if (amountInCurrencyOfAccount) { + await this.prismaService.account.update({ + data: { + balance: new Big(balance).plus(amountInCurrencyOfAccount).toNumber() + }, + where: { + id_userId: { + userId, + id: accountId + } + } + }); + } + } } diff --git a/apps/api/src/app/account/create-account.dto.ts b/apps/api/src/app/account/create-account.dto.ts index 3ea13e20a..c700e7fa9 100644 --- a/apps/api/src/app/account/create-account.dto.ts +++ b/apps/api/src/app/account/create-account.dto.ts @@ -1,4 +1,5 @@ import { AccountType } from '@prisma/client'; +import { Transform, TransformFnParams } from 'class-transformer'; import { IsBoolean, IsNumber, @@ -6,6 +7,7 @@ import { IsString, ValidateIf } from 'class-validator'; +import { isString } from 'lodash'; export class CreateAccountDto { @IsString() @@ -14,9 +16,20 @@ export class CreateAccountDto { @IsNumber() balance: number; + @IsOptional() + @IsString() + @Transform(({ value }: TransformFnParams) => + isString(value) ? value.trim() : value + ) + comment?: string; + @IsString() currency: string; + @IsOptional() + @IsString() + id?: string; + @IsBoolean() @IsOptional() isExcluded?: boolean; diff --git a/apps/api/src/app/account/update-account.dto.ts b/apps/api/src/app/account/update-account.dto.ts index 0b5737607..d8c62aff7 100644 --- a/apps/api/src/app/account/update-account.dto.ts +++ b/apps/api/src/app/account/update-account.dto.ts @@ -1,4 +1,5 @@ import { AccountType } from '@prisma/client'; +import { Transform, TransformFnParams } from 'class-transformer'; import { IsBoolean, IsNumber, @@ -6,6 +7,7 @@ import { IsString, ValidateIf } from 'class-validator'; +import { isString } from 'lodash'; export class UpdateAccountDto { @IsString() @@ -14,6 +16,13 @@ export class UpdateAccountDto { @IsNumber() balance: number; + @IsOptional() + @IsString() + @Transform(({ value }: TransformFnParams) => + isString(value) ? value.trim() : value + ) + comment?: string; + @IsString() currency: string; diff --git a/apps/api/src/app/admin/admin.controller.ts b/apps/api/src/app/admin/admin.controller.ts index e7209fa01..75b2b2bb9 100644 --- a/apps/api/src/app/admin/admin.controller.ts +++ b/apps/api/src/app/admin/admin.controller.ts @@ -1,7 +1,9 @@ -import { DataGatheringService } from '@ghostfolio/api/services/data-gathering.service'; -import { MarketDataService } from '@ghostfolio/api/services/market-data.service'; +import { TransformDataSourceInRequestInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-request.interceptor'; +import { DataGatheringService } from '@ghostfolio/api/services/data-gathering/data-gathering.service'; +import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; import { PropertyDto } from '@ghostfolio/api/services/property/property.dto'; import { + DEFAULT_PAGE_SIZE, GATHER_ASSET_PROFILE_PROCESS, GATHER_ASSET_PROFILE_PROCESS_OPTIONS } from '@ghostfolio/common/config'; @@ -9,6 +11,7 @@ import { AdminData, AdminMarketData, AdminMarketDataDetails, + EnhancedSymbolProfile, Filter } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; @@ -21,18 +24,21 @@ import { HttpException, Inject, Param, + Patch, Post, Put, Query, - UseGuards + UseGuards, + UseInterceptors } from '@nestjs/common'; import { REQUEST } from '@nestjs/core'; import { AuthGuard } from '@nestjs/passport'; -import { DataSource, MarketData } from '@prisma/client'; +import { DataSource, MarketData, Prisma, SymbolProfile } from '@prisma/client'; import { isDate } from 'date-fns'; import { StatusCodes, getReasonPhrase } from 'http-status-codes'; import { AdminService } from './admin.service'; +import { UpdateAssetProfileDto } from './update-asset-profile.dto'; import { UpdateMarketDataDto } from './update-market-data.dto'; @Controller('admin') @@ -97,16 +103,21 @@ export class AdminController { const uniqueAssets = await this.dataGatheringService.getUniqueAssets(); - for (const { dataSource, symbol } of uniqueAssets) { - await this.dataGatheringService.addJobToQueue( - GATHER_ASSET_PROFILE_PROCESS, - { - dataSource, - symbol - }, - GATHER_ASSET_PROFILE_PROCESS_OPTIONS - ); - } + await this.dataGatheringService.addJobsToQueue( + uniqueAssets.map(({ dataSource, symbol }) => { + return { + data: { + dataSource, + symbol + }, + name: GATHER_ASSET_PROFILE_PROCESS, + opts: { + ...GATHER_ASSET_PROFILE_PROCESS_OPTIONS, + jobId: `${dataSource}-${symbol}` + } + }; + }) + ); this.dataGatheringService.gatherMax(); } @@ -128,16 +139,21 @@ export class AdminController { const uniqueAssets = await this.dataGatheringService.getUniqueAssets(); - for (const { dataSource, symbol } of uniqueAssets) { - await this.dataGatheringService.addJobToQueue( - GATHER_ASSET_PROFILE_PROCESS, - { - dataSource, - symbol - }, - GATHER_ASSET_PROFILE_PROCESS_OPTIONS - ); - } + await this.dataGatheringService.addJobsToQueue( + uniqueAssets.map(({ dataSource, symbol }) => { + return { + data: { + dataSource, + symbol + }, + name: GATHER_ASSET_PROFILE_PROCESS, + opts: { + ...GATHER_ASSET_PROFILE_PROCESS_OPTIONS, + jobId: `${dataSource}-${symbol}` + } + }; + }) + ); } @Post('gather/profile-data/:dataSource/:symbol') @@ -158,14 +174,17 @@ export class AdminController { ); } - await this.dataGatheringService.addJobToQueue( - GATHER_ASSET_PROFILE_PROCESS, - { + await this.dataGatheringService.addJobToQueue({ + data: { dataSource, symbol }, - GATHER_ASSET_PROFILE_PROCESS_OPTIONS - ); + name: GATHER_ASSET_PROFILE_PROCESS, + opts: { + ...GATHER_ASSET_PROFILE_PROCESS_OPTIONS, + jobId: `${dataSource}-${symbol}` + } + }); } @Post('gather/:dataSource/:symbol') @@ -229,7 +248,11 @@ export class AdminController { @Get('market-data') @UseGuards(AuthGuard('jwt')) public async getMarketData( - @Query('assetSubClasses') filterByAssetSubClasses?: string + @Query('assetSubClasses') filterByAssetSubClasses?: string, + @Query('skip') skip?: number, + @Query('sortColumn') sortColumn?: string, + @Query('sortDirection') sortDirection?: Prisma.SortOrder, + @Query('take') take?: number ): Promise { if ( !hasPermission( @@ -254,7 +277,13 @@ export class AdminController { }) ]; - return this.adminService.getMarketData(filters); + return this.adminService.getMarketData({ + filters, + sortColumn, + sortDirection, + skip: isNaN(skip) ? undefined : skip, + take: isNaN(take) ? undefined : take + }); } @Get('market-data/:dataSource/:symbol') @@ -301,9 +330,10 @@ export class AdminController { const date = new Date(dateString); return this.marketDataService.updateMarketData({ - data: { ...data, dataSource }, + data: { marketPrice: data.marketPrice, state: 'CLOSE' }, where: { - date_symbol: { + dataSource_date_symbol: { + dataSource, date, symbol } @@ -311,6 +341,28 @@ export class AdminController { }); } + @Post('profile-data/:dataSource/:symbol') + @UseGuards(AuthGuard('jwt')) + @UseInterceptors(TransformDataSourceInRequestInterceptor) + public async addProfileData( + @Param('dataSource') dataSource: DataSource, + @Param('symbol') symbol: string + ): Promise { + if ( + !hasPermission( + this.request.user.permissions, + permissions.accessAdminControl + ) + ) { + throw new HttpException( + getReasonPhrase(StatusCodes.FORBIDDEN), + StatusCodes.FORBIDDEN + ); + } + + return this.adminService.addAssetProfile({ dataSource, symbol }); + } + @Delete('profile-data/:dataSource/:symbol') @UseGuards(AuthGuard('jwt')) public async deleteProfileData( @@ -332,6 +384,32 @@ export class AdminController { return this.adminService.deleteProfileData({ dataSource, symbol }); } + @Patch('profile-data/:dataSource/:symbol') + @UseGuards(AuthGuard('jwt')) + public async patchAssetProfileData( + @Body() assetProfileData: UpdateAssetProfileDto, + @Param('dataSource') dataSource: DataSource, + @Param('symbol') symbol: string + ): Promise { + if ( + !hasPermission( + this.request.user.permissions, + permissions.accessAdminControl + ) + ) { + throw new HttpException( + getReasonPhrase(StatusCodes.FORBIDDEN), + StatusCodes.FORBIDDEN + ); + } + + return this.adminService.patchAssetProfileData({ + ...assetProfileData, + dataSource, + symbol + }); + } + @Put('settings/:key') @UseGuards(AuthGuard('jwt')) public async updateProperty( diff --git a/apps/api/src/app/admin/admin.module.ts b/apps/api/src/app/admin/admin.module.ts index 464ba7069..500af69db 100644 --- a/apps/api/src/app/admin/admin.module.ts +++ b/apps/api/src/app/admin/admin.module.ts @@ -1,12 +1,12 @@ import { SubscriptionModule } from '@ghostfolio/api/app/subscription/subscription.module'; -import { ConfigurationModule } from '@ghostfolio/api/services/configuration.module'; -import { DataGatheringModule } from '@ghostfolio/api/services/data-gathering.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 { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data.module'; -import { MarketDataModule } from '@ghostfolio/api/services/market-data.module'; -import { PrismaModule } from '@ghostfolio/api/services/prisma.module'; +import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module'; +import { MarketDataModule } from '@ghostfolio/api/services/market-data/market-data.module'; +import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; import { PropertyModule } from '@ghostfolio/api/services/property/property.module'; -import { SymbolProfileModule } from '@ghostfolio/api/services/symbol-profile.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 5c7f8698a..4dce77982 100644 --- a/apps/api/src/app/admin/admin.service.ts +++ b/apps/api/src/app/admin/admin.service.ts @@ -1,21 +1,24 @@ import { SubscriptionService } from '@ghostfolio/api/app/subscription/subscription.service'; -import { ConfigurationService } from '@ghostfolio/api/services/configuration.service'; -import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data.service'; -import { MarketDataService } from '@ghostfolio/api/services/market-data.service'; -import { PrismaService } from '@ghostfolio/api/services/prisma.service'; +import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; +import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; +import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; +import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; +import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { PropertyService } from '@ghostfolio/api/services/property/property.service'; -import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile.service'; -import { PROPERTY_CURRENCIES } from '@ghostfolio/common/config'; +import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; +import { + DEFAULT_PAGE_SIZE, + PROPERTY_CURRENCIES +} from '@ghostfolio/common/config'; import { AdminData, AdminMarketData, AdminMarketDataDetails, - AdminMarketDataItem, Filter, UniqueAsset } from '@ghostfolio/common/interfaces'; -import { Injectable } from '@nestjs/common'; -import { AssetSubClass, Prisma, Property } from '@prisma/client'; +import { BadRequestException, Injectable } from '@nestjs/common'; +import { AssetSubClass, Prisma, Property, SymbolProfile } from '@prisma/client'; import { differenceInDays } from 'date-fns'; import { groupBy } from 'lodash'; @@ -25,6 +28,7 @@ export class AdminService { public constructor( private readonly configurationService: ConfigurationService, + private readonly dataProviderService: DataProviderService, private readonly exchangeRateDataService: ExchangeRateDataService, private readonly marketDataService: MarketDataService, private readonly prismaService: PrismaService, @@ -35,6 +39,38 @@ export class AdminService { this.baseCurrency = this.configurationService.get('BASE_CURRENCY'); } + public async addAssetProfile({ + dataSource, + symbol + }: UniqueAsset): Promise { + try { + const assetProfiles = await this.dataProviderService.getAssetProfiles([ + { dataSource, symbol } + ]); + + if (!assetProfiles[symbol]?.currency) { + throw new BadRequestException( + `Asset profile not found for ${symbol} (${dataSource})` + ); + } + + return await this.symbolProfileService.add( + assetProfiles[symbol] as Prisma.SymbolProfileCreateInput + ); + } catch (error) { + if ( + error instanceof Prisma.PrismaClientKnownRequestError && + error.code === 'P2002' + ) { + throw new BadRequestException( + `Asset profile of ${symbol} (${dataSource}) already exists` + ); + } + + throw error; + } + } + public async deleteProfileData({ dataSource, symbol }: UniqueAsset) { await this.marketDataService.deleteMany({ dataSource, symbol }); await this.symbolProfileService.delete({ dataSource, symbol }); @@ -65,7 +101,21 @@ export class AdminService { }; } - public async getMarketData(filters?: Filter[]): Promise { + public async getMarketData({ + filters, + sortColumn, + sortDirection, + skip, + take = DEFAULT_PAGE_SIZE + }: { + filters?: Filter[]; + skip?: number; + sortColumn?: string; + sortDirection?: Prisma.SortOrder; + take?: number; + }): Promise { + let orderBy: Prisma.Enumerable = + [{ symbol: 'asc' }]; const where: Prisma.SymbolProfileWhereInput = {}; const { ASSET_SUB_CLASS: filtersByAssetSubClass } = groupBy( @@ -75,47 +125,40 @@ export class AdminService { } ); - const marketData = await this.prismaService.marketData.groupBy({ + const marketDataItems = await this.prismaService.marketData.groupBy({ _count: true, by: ['dataSource', 'symbol'] }); - let currencyPairsToGather: AdminMarketDataItem[] = []; - if (filtersByAssetSubClass) { where.assetSubClass = AssetSubClass[filtersByAssetSubClass[0].id]; - } else { - currencyPairsToGather = this.exchangeRateDataService - .getCurrencyPairs() - .map(({ dataSource, symbol }) => { - const marketDataItemCount = - marketData.find((marketDataItem) => { - return ( - marketDataItem.dataSource === dataSource && - marketDataItem.symbol === symbol - ); - })?._count ?? 0; + } - return { - dataSource, - marketDataItemCount, - symbol, - countriesCount: 0, - sectorsCount: 0 - }; - }); + if (sortColumn) { + orderBy = [{ [sortColumn]: sortDirection }]; + + if (sortColumn === 'activitiesCount') { + orderBy = { + Order: { + _count: sortDirection + } + }; + } } - const symbolProfilesToGather: AdminMarketDataItem[] = ( - await this.prismaService.symbolProfile.findMany({ + const [assetProfiles, count] = await Promise.all([ + this.prismaService.symbolProfile.findMany({ + orderBy, + skip, + take, where, - orderBy: [{ symbol: 'asc' }], select: { _count: { select: { Order: true } }, assetClass: true, assetSubClass: true, + comment: true, countries: true, dataSource: true, Order: { @@ -127,37 +170,48 @@ export class AdminService { sectors: true, symbol: true } - }) - ).map((symbolProfile) => { - const countriesCount = symbolProfile.countries - ? Object.keys(symbolProfile.countries).length - : 0; - const marketDataItemCount = - marketData.find((marketDataItem) => { - return ( - marketDataItem.dataSource === symbolProfile.dataSource && - marketDataItem.symbol === symbolProfile.symbol - ); - })?._count ?? 0; - const sectorsCount = symbolProfile.sectors - ? Object.keys(symbolProfile.sectors).length - : 0; - - return { - countriesCount, - marketDataItemCount, - sectorsCount, - activityCount: symbolProfile._count.Order, - assetClass: symbolProfile.assetClass, - assetSubClass: symbolProfile.assetSubClass, - dataSource: symbolProfile.dataSource, - date: symbolProfile.Order?.[0]?.date, - symbol: symbolProfile.symbol - }; - }); + }), + this.prismaService.symbolProfile.count({ where }) + ]); return { - marketData: [...currencyPairsToGather, ...symbolProfilesToGather] + count, + marketData: assetProfiles.map( + ({ + _count, + assetClass, + assetSubClass, + comment, + countries, + dataSource, + Order, + sectors, + symbol + }) => { + const countriesCount = countries ? Object.keys(countries).length : 0; + const marketDataItemCount = + marketDataItems.find((marketDataItem) => { + return ( + marketDataItem.dataSource === dataSource && + marketDataItem.symbol === symbol + ); + })?._count ?? 0; + const sectorsCount = sectors ? Object.keys(sectors).length : 0; + + return { + assetClass, + assetSubClass, + comment, + countriesCount, + dataSource, + symbol, + marketDataItemCount, + sectorsCount, + activitiesCount: _count.Order, + date: Order?.[0]?.date + }; + } + ) }; } @@ -165,8 +219,14 @@ export class AdminService { dataSource, symbol }: UniqueAsset): Promise { - return { - marketData: await this.marketDataService.marketDataItems({ + const [[assetProfile], marketData] = await Promise.all([ + this.symbolProfileService.getSymbolProfiles([ + { + dataSource, + symbol + } + ]), + this.marketDataService.marketDataItems({ orderBy: { date: 'asc' }, @@ -175,9 +235,42 @@ export class AdminService { symbol } }) + ]); + + return { + marketData, + assetProfile: assetProfile ?? { + symbol, + currency: '-' + } }; } + public async patchAssetProfileData({ + comment, + dataSource, + scraperConfiguration, + symbol, + symbolMapping + }: Prisma.SymbolProfileUpdateInput & UniqueAsset) { + await this.symbolProfileService.updateSymbolProfile({ + comment, + dataSource, + scraperConfiguration, + symbol, + symbolMapping + }); + + const [symbolProfile] = await this.symbolProfileService.getSymbolProfiles([ + { + dataSource, + symbol + } + ]); + + return symbolProfile; + } + public async putSetting(key: string, value: string) { let response: Property; @@ -195,12 +288,27 @@ export class AdminService { } private async getUsersWithAnalytics(): Promise { - const usersWithAnalytics = await this.prismaService.user.findMany({ - orderBy: { + let orderBy: any = { + createdAt: 'desc' + }; + let where; + + if (this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) { + orderBy = { Analytics: { updatedAt: 'desc' } - }, + }; + where = { + NOT: { + Analytics: null + } + }; + } + + const usersWithAnalytics = await this.prismaService.user.findMany({ + orderBy, + where, select: { _count: { select: { Account: true, Order: true } @@ -208,6 +316,7 @@ export class AdminService { Analytics: { select: { activityCount: true, + country: true, updatedAt: true } }, @@ -215,19 +324,16 @@ export class AdminService { id: true, Subscription: true }, - take: 30, - where: { - NOT: { - Analytics: null - } - } + take: 30 }); return usersWithAnalytics.map( ({ _count, Analytics, createdAt, id, Subscription }) => { const daysSinceRegistration = differenceInDays(new Date(), createdAt) + 1; - const engagement = Analytics.activityCount / daysSinceRegistration; + const engagement = Analytics + ? Analytics.activityCount / daysSinceRegistration + : undefined; const subscription = this.configurationService.get( 'ENABLE_FEATURE_SUBSCRIPTION' @@ -241,7 +347,8 @@ export class AdminService { id, subscription, accountCount: _count.Account || 0, - lastActivity: Analytics.updatedAt, + country: Analytics?.country, + lastActivity: Analytics?.updatedAt, transactionCount: _count.Order || 0 }; } diff --git a/apps/api/src/app/admin/queue/queue.module.ts b/apps/api/src/app/admin/queue/queue.module.ts index 62091f34b..3c1be5128 100644 --- a/apps/api/src/app/admin/queue/queue.module.ts +++ b/apps/api/src/app/admin/queue/queue.module.ts @@ -1,4 +1,4 @@ -import { DataGatheringModule } from '@ghostfolio/api/services/data-gathering.module'; +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 ebaab6d94..81b32ddbb 100644 --- a/apps/api/src/app/admin/queue/queue.service.ts +++ b/apps/api/src/app/admin/queue/queue.service.ts @@ -4,7 +4,7 @@ import { } from '@ghostfolio/common/config'; import { AdminJobs } from '@ghostfolio/common/interfaces'; import { InjectQueue } from '@nestjs/bull'; -import { Injectable, Logger } from '@nestjs/common'; +import { Injectable } from '@nestjs/common'; import { JobStatus, Queue } from 'bull'; @Injectable() @@ -23,14 +23,11 @@ export class QueueService { }: { status?: JobStatus[]; }) { - const jobs = await this.dataGatheringQueue.getJobs(status); - - for (const job of jobs) { - try { - await job.remove(); - } catch (error) { - Logger.warn(error, 'QueueService'); - } + for (const statusItem of status) { + await this.dataGatheringQueue.clean( + 300, + statusItem === 'waiting' ? 'wait' : statusItem + ); } } @@ -44,18 +41,23 @@ export class QueueService { const jobs = await this.dataGatheringQueue.getJobs(status); const jobsWithState = await Promise.all( - jobs.slice(0, limit).map(async (job) => { - return { - attemptsMade: job.attemptsMade + 1, - data: job.data, - finishedOn: job.finishedOn, - id: job.id, - name: job.name, - stacktrace: job.stacktrace, - state: await job.getState(), - timestamp: job.timestamp - }; - }) + jobs + .filter((job) => { + return job; + }) + .slice(0, limit) + .map(async (job) => { + return { + attemptsMade: job.attemptsMade + 1, + data: job.data, + finishedOn: job.finishedOn, + id: job.id, + name: job.name, + stacktrace: job.stacktrace, + state: await job.getState(), + timestamp: job.timestamp + }; + }) ); return { diff --git a/apps/api/src/app/admin/update-asset-profile.dto.ts b/apps/api/src/app/admin/update-asset-profile.dto.ts new file mode 100644 index 000000000..54f2d8f25 --- /dev/null +++ b/apps/api/src/app/admin/update-asset-profile.dto.ts @@ -0,0 +1,18 @@ +import { Prisma } from '@prisma/client'; +import { IsObject, IsOptional, IsString } from 'class-validator'; + +export class UpdateAssetProfileDto { + @IsString() + @IsOptional() + comment?: string; + + @IsObject() + @IsOptional() + scraperConfiguration?: Prisma.InputJsonObject; + + @IsObject() + @IsOptional() + symbolMapping?: { + [dataProvider: string]: string; + }; +} diff --git a/apps/api/src/app/app.controller.ts b/apps/api/src/app/app.controller.ts index d92a7a3ce..33e9ae56a 100644 --- a/apps/api/src/app/app.controller.ts +++ b/apps/api/src/app/app.controller.ts @@ -1,4 +1,4 @@ -import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data.service'; +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 e41b60b0e..625ee9ded 100644 --- a/apps/api/src/app/app.module.ts +++ b/apps/api/src/app/app.module.ts @@ -1,13 +1,11 @@ import { join } from 'path'; -import { AuthDeviceModule } from '@ghostfolio/api/app/auth-device/auth-device.module'; -import { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.module'; -import { ConfigurationModule } from '@ghostfolio/api/services/configuration.module'; +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.module'; +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.module'; -import { PrismaModule } from '@ghostfolio/api/services/prisma.module'; +import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module'; +import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; import { TwitterBotModule } from '@ghostfolio/api/services/twitter-bot/twitter-bot.module'; import { BullModule } from '@nestjs/bull'; import { MiddlewareConsumer, Module, RequestMethod } from '@nestjs/common'; @@ -19,15 +17,21 @@ import { AccessModule } from './access/access.module'; import { AccountModule } from './account/account.module'; import { AdminModule } from './admin/admin.module'; import { AppController } from './app.controller'; +import { AuthDeviceModule } from './auth-device/auth-device.module'; import { AuthModule } from './auth/auth.module'; import { BenchmarkModule } from './benchmark/benchmark.module'; import { CacheModule } from './cache/cache.module'; +import { ExchangeRateModule } from './exchange-rate/exchange-rate.module'; import { ExportModule } from './export/export.module'; import { FrontendMiddleware } from './frontend.middleware'; +import { HealthModule } from './health/health.module'; import { ImportModule } from './import/import.module'; import { InfoModule } from './info/info.module'; +import { LogoModule } from './logo/logo.module'; import { OrderModule } from './order/order.module'; +import { PlatformModule } from './platform/platform.module'; import { PortfolioModule } from './portfolio/portfolio.module'; +import { RedisCacheModule } from './redis-cache/redis-cache.module'; import { SubscriptionModule } from './subscription/subscription.module'; import { SymbolModule } from './symbol/symbol.module'; import { UserModule } from './user/user.module'; @@ -43,7 +47,7 @@ import { UserModule } from './user/user.module'; BullModule.forRoot({ redis: { host: process.env.REDIS_HOST, - port: parseInt(process.env.REDIS_PORT, 10), + port: parseInt(process.env.REDIS_PORT ?? '6379', 10), password: process.env.REDIS_PASSWORD } }), @@ -52,11 +56,15 @@ import { UserModule } from './user/user.module'; ConfigurationModule, DataGatheringModule, DataProviderModule, + ExchangeRateModule, ExchangeRateDataModule, ExportModule, + HealthModule, ImportModule, InfoModule, + LogoModule, OrderModule, + PlatformModule, PortfolioModule, PrismaModule, RedisCacheModule, 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 de6cd1cbc..11ddd58ec 100644 --- a/apps/api/src/app/auth-device/auth-device.module.ts +++ b/apps/api/src/app/auth-device/auth-device.module.ts @@ -1,7 +1,7 @@ import { AuthDeviceController } from '@ghostfolio/api/app/auth-device/auth-device.controller'; import { AuthDeviceService } from '@ghostfolio/api/app/auth-device/auth-device.service'; -import { ConfigurationModule } from '@ghostfolio/api/services/configuration.module'; -import { PrismaModule } from '@ghostfolio/api/services/prisma.module'; +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 048aca758..19dad8876 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,5 @@ -import { ConfigurationService } from '@ghostfolio/api/services/configuration.service'; -import { PrismaService } from '@ghostfolio/api/services/prisma.service'; +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 749f6f037..0c6b047bf 100644 --- a/apps/api/src/app/auth/auth.controller.ts +++ b/apps/api/src/app/auth/auth.controller.ts @@ -1,5 +1,5 @@ import { WebAuthService } from '@ghostfolio/api/app/auth/web-auth.service'; -import { ConfigurationService } from '@ghostfolio/api/services/configuration.service'; +import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { DEFAULT_LANGUAGE_CODE } from '@ghostfolio/common/config'; import { OAuthResponse } from '@ghostfolio/common/interfaces'; import { @@ -16,6 +16,7 @@ import { Version } from '@nestjs/common'; import { AuthGuard } from '@nestjs/passport'; +import { Request, Response } from 'express'; import { StatusCodes, getReasonPhrase } from 'http-status-codes'; import { AuthService } from './auth.service'; @@ -32,8 +33,11 @@ export class AuthController { private readonly webAuthService: WebAuthService ) {} + /** + * @deprecated + */ @Get('anonymous/:accessToken') - public async accessTokenLogin( + public async accessTokenLoginGet( @Param('accessToken') accessToken: string ): Promise { try { @@ -49,6 +53,23 @@ export class AuthController { } } + @Post('anonymous') + public async accessTokenLogin( + @Body() body: { accessToken: string } + ): Promise { + try { + const authToken = await this.authService.validateAnonymousLogin( + body.accessToken + ); + return { authToken }; + } catch { + throw new HttpException( + getReasonPhrase(StatusCodes.FORBIDDEN), + StatusCodes.FORBIDDEN + ); + } + } + @Get('google') @UseGuards(AuthGuard('google')) public googleLogin() { @@ -58,18 +79,21 @@ export class AuthController { @Get('google/callback') @UseGuards(AuthGuard('google')) @Version(VERSION_NEUTRAL) - public googleLoginCallback(@Req() req, @Res() res) { + public googleLoginCallback( + @Req() request: Request, + @Res() response: Response + ) { // Handles the Google OAuth2 callback - const jwt: string = req.user.jwt; + const jwt: string = (request.user).jwt; if (jwt) { - res.redirect( + response.redirect( `${this.configurationService.get( 'ROOT_URL' )}/${DEFAULT_LANGUAGE_CODE}/auth/${jwt}` ); } else { - res.redirect( + response.redirect( `${this.configurationService.get( 'ROOT_URL' )}/${DEFAULT_LANGUAGE_CODE}/auth` @@ -77,13 +101,13 @@ export class AuthController { } } - @Get('internet-identity/:principalId') + @Post('internet-identity') public async internetIdentityLogin( - @Param('principalId') principalId: string + @Body() body: { principalId: string } ): Promise { try { const authToken = await this.authService.validateInternetIdentityLogin( - principalId + body.principalId ); return { authToken }; } catch { diff --git a/apps/api/src/app/auth/auth.module.ts b/apps/api/src/app/auth/auth.module.ts index b25e4c18b..458493051 100644 --- a/apps/api/src/app/auth/auth.module.ts +++ b/apps/api/src/app/auth/auth.module.ts @@ -2,8 +2,9 @@ import { AuthDeviceService } from '@ghostfolio/api/app/auth-device/auth-device.s import { WebAuthService } from '@ghostfolio/api/app/auth/web-auth.service'; import { SubscriptionModule } from '@ghostfolio/api/app/subscription/subscription.module'; import { UserModule } from '@ghostfolio/api/app/user/user.module'; -import { ConfigurationModule } from '@ghostfolio/api/services/configuration.module'; -import { PrismaModule } from '@ghostfolio/api/services/prisma.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'; @@ -21,6 +22,7 @@ import { JwtStrategy } from './jwt.strategy'; signOptions: { expiresIn: '180 days' } }), PrismaModule, + PropertyModule, SubscriptionModule, UserModule ], diff --git a/apps/api/src/app/auth/auth.service.ts b/apps/api/src/app/auth/auth.service.ts index 3178ce9ac..2f31e722b 100644 --- a/apps/api/src/app/auth/auth.service.ts +++ b/apps/api/src/app/auth/auth.service.ts @@ -1,5 +1,6 @@ import { UserService } from '@ghostfolio/api/app/user/user.service'; -import { ConfigurationService } from '@ghostfolio/api/services/configuration.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'; @@ -11,6 +12,7 @@ export class AuthService { public constructor( private readonly configurationService: ConfigurationService, private readonly jwtService: JwtService, + private readonly propertyService: PropertyService, private readonly userService: UserService ) {} @@ -50,10 +52,19 @@ export class AuthService { }); if (!user) { + const isUserSignupEnabled = + await this.propertyService.isUserSignupEnabled(); + + if (!isUserSignupEnabled) { + throw new Error('Sign up forbidden'); + } + // Create new user if not found user = await this.userService.createUser({ - provider, - thirdPartyId: principalId + data: { + provider, + thirdPartyId: principalId + } }); } @@ -78,10 +89,19 @@ export class AuthService { }); if (!user) { + const isUserSignupEnabled = + await this.propertyService.isUserSignupEnabled(); + + if (!isUserSignupEnabled) { + throw new Error('Sign up forbidden'); + } + // Create new user if not found user = await this.userService.createUser({ - provider, - thirdPartyId + data: { + provider, + thirdPartyId + } }); } diff --git a/apps/api/src/app/auth/google.strategy.ts b/apps/api/src/app/auth/google.strategy.ts index c8fb260b7..7e43f5817 100644 --- a/apps/api/src/app/auth/google.strategy.ts +++ b/apps/api/src/app/auth/google.strategy.ts @@ -1,4 +1,4 @@ -import { ConfigurationService } from '@ghostfolio/api/services/configuration.service'; +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/jwt.strategy.ts b/apps/api/src/app/auth/jwt.strategy.ts index ee50e3b72..6d7e2ecdc 100644 --- a/apps/api/src/app/auth/jwt.strategy.ts +++ b/apps/api/src/app/auth/jwt.strategy.ts @@ -1,33 +1,46 @@ import { UserService } from '@ghostfolio/api/app/user/user.service'; -import { ConfigurationService } from '@ghostfolio/api/services/configuration.service'; -import { PrismaService } from '@ghostfolio/api/services/prisma.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'; import { ExtractJwt, Strategy } from 'passport-jwt'; @Injectable() export class JwtStrategy extends PassportStrategy(Strategy, 'jwt') { public constructor( - readonly configurationService: ConfigurationService, + private readonly configurationService: ConfigurationService, private readonly prismaService: PrismaService, private readonly userService: UserService ) { super({ jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), + passReqToCallback: true, secretOrKey: configurationService.get('JWT_SECRET_KEY') }); } - public async validate({ id }: { id: string }) { + public async validate(request: Request, { id }: { id: string }) { try { + const timezone = request.headers[HEADER_KEY_TIMEZONE.toLowerCase()]; const user = await this.userService.user({ id }); if (user) { - await this.prismaService.analytics.upsert({ - create: { User: { connect: { id: user.id } } }, - update: { activityCount: { increment: 1 }, updatedAt: new Date() }, - where: { userId: user.id } - }); + if (this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) { + const country = + countriesAndTimezones.getCountryForTimezone(timezone)?.id; + + await this.prismaService.analytics.upsert({ + create: { country, User: { connect: { id: user.id } } }, + update: { + country, + activityCount: { increment: 1 }, + updatedAt: new Date() + }, + where: { userId: user.id } + }); + } return user; } else { diff --git a/apps/api/src/app/auth/web-auth.service.ts b/apps/api/src/app/auth/web-auth.service.ts index bbfddb673..471b77709 100644 --- a/apps/api/src/app/auth/web-auth.service.ts +++ b/apps/api/src/app/auth/web-auth.service.ts @@ -1,7 +1,7 @@ import { AuthDeviceDto } from '@ghostfolio/api/app/auth-device/auth-device.dto'; import { AuthDeviceService } from '@ghostfolio/api/app/auth-device/auth-device.service'; import { UserService } from '@ghostfolio/api/app/user/user.service'; -import { ConfigurationService } from '@ghostfolio/api/services/configuration.service'; +import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import type { RequestWithUser } from '@ghostfolio/common/types'; import { Inject, diff --git a/apps/api/src/app/benchmark/benchmark.controller.ts b/apps/api/src/app/benchmark/benchmark.controller.ts index b5562bf86..d59a231ff 100644 --- a/apps/api/src/app/benchmark/benchmark.controller.ts +++ b/apps/api/src/app/benchmark/benchmark.controller.ts @@ -1,24 +1,36 @@ import { TransformDataSourceInRequestInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-request.interceptor'; import { TransformDataSourceInResponseInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-response.interceptor'; -import { +import type { BenchmarkMarketDataDetails, - BenchmarkResponse + BenchmarkResponse, + UniqueAsset } from '@ghostfolio/common/interfaces'; +import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import type { RequestWithUser } from '@ghostfolio/common/types'; import { + Body, Controller, Get, + HttpException, + Inject, Param, + Post, UseGuards, UseInterceptors } from '@nestjs/common'; +import { REQUEST } from '@nestjs/core'; import { AuthGuard } from '@nestjs/passport'; import { DataSource } from '@prisma/client'; +import { StatusCodes, getReasonPhrase } from 'http-status-codes'; import { BenchmarkService } from './benchmark.service'; @Controller('benchmark') export class BenchmarkController { - public constructor(private readonly benchmarkService: BenchmarkService) {} + public constructor( + private readonly benchmarkService: BenchmarkService, + @Inject(REQUEST) private readonly request: RequestWithUser + ) {} @Get() @UseInterceptors(TransformDataSourceInRequestInterceptor) @@ -30,8 +42,8 @@ export class BenchmarkController { } @Get(':dataSource/:symbol/:startDateString') - @UseInterceptors(TransformDataSourceInRequestInterceptor) @UseGuards(AuthGuard('jwt')) + @UseInterceptors(TransformDataSourceInRequestInterceptor) public async getBenchmarkMarketDataBySymbol( @Param('dataSource') dataSource: DataSource, @Param('startDateString') startDateString: string, @@ -45,4 +57,41 @@ export class BenchmarkController { symbol }); } + + @Post() + @UseGuards(AuthGuard('jwt')) + public async addBenchmark(@Body() { dataSource, symbol }: UniqueAsset) { + if ( + !hasPermission( + this.request.user.permissions, + permissions.accessAdminControl + ) + ) { + throw new HttpException( + getReasonPhrase(StatusCodes.FORBIDDEN), + StatusCodes.FORBIDDEN + ); + } + + try { + const benchmark = await this.benchmarkService.addBenchmark({ + dataSource, + symbol + }); + + if (!benchmark) { + throw new HttpException( + getReasonPhrase(StatusCodes.NOT_FOUND), + StatusCodes.NOT_FOUND + ); + } + + return benchmark; + } catch { + throw new HttpException( + getReasonPhrase(StatusCodes.INTERNAL_SERVER_ERROR), + StatusCodes.INTERNAL_SERVER_ERROR + ); + } + } } diff --git a/apps/api/src/app/benchmark/benchmark.module.ts b/apps/api/src/app/benchmark/benchmark.module.ts index 4c20e61aa..c2cc3fbb5 100644 --- a/apps/api/src/app/benchmark/benchmark.module.ts +++ b/apps/api/src/app/benchmark/benchmark.module.ts @@ -1,10 +1,11 @@ import { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.module'; import { SymbolModule } from '@ghostfolio/api/app/symbol/symbol.module'; -import { ConfigurationModule } from '@ghostfolio/api/services/configuration.module'; +import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module'; -import { MarketDataModule } from '@ghostfolio/api/services/market-data.module'; +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 { SymbolProfileModule } from '@ghostfolio/api/services/symbol-profile.module'; +import { SymbolProfileModule } from '@ghostfolio/api/services/symbol-profile/symbol-profile.module'; import { Module } from '@nestjs/common'; import { BenchmarkController } from './benchmark.controller'; @@ -17,6 +18,7 @@ import { BenchmarkService } from './benchmark.service'; ConfigurationModule, DataProviderModule, MarketDataModule, + PrismaModule, PropertyModule, RedisCacheModule, SymbolModule, diff --git a/apps/api/src/app/benchmark/benchmark.service.spec.ts b/apps/api/src/app/benchmark/benchmark.service.spec.ts index 833dbcdfc..5fa2c3e7b 100644 --- a/apps/api/src/app/benchmark/benchmark.service.spec.ts +++ b/apps/api/src/app/benchmark/benchmark.service.spec.ts @@ -4,7 +4,15 @@ describe('BenchmarkService', () => { let benchmarkService: BenchmarkService; beforeAll(async () => { - benchmarkService = new BenchmarkService(null, null, null, null, null, null); + benchmarkService = new BenchmarkService( + null, + null, + null, + null, + null, + null, + null + ); }); it('calculateChangeInPercentage', async () => { diff --git a/apps/api/src/app/benchmark/benchmark.service.ts b/apps/api/src/app/benchmark/benchmark.service.ts index 015fc7ee7..73b48068b 100644 --- a/apps/api/src/app/benchmark/benchmark.service.ts +++ b/apps/api/src/app/benchmark/benchmark.service.ts @@ -1,9 +1,10 @@ import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service'; import { SymbolService } from '@ghostfolio/api/app/symbol/symbol.service'; import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; -import { MarketDataService } from '@ghostfolio/api/services/market-data.service'; +import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; +import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { PropertyService } from '@ghostfolio/api/services/property/property.service'; -import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile.service'; +import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; import { MAX_CHART_ITEMS, PROPERTY_BENCHMARKS @@ -11,6 +12,7 @@ import { import { DATE_FORMAT } from '@ghostfolio/common/helper'; import { BenchmarkMarketDataDetails, + BenchmarkProperty, BenchmarkResponse, UniqueAsset } from '@ghostfolio/common/interfaces'; @@ -18,6 +20,7 @@ import { Injectable } from '@nestjs/common'; import { SymbolProfile } from '@prisma/client'; import Big from 'big.js'; import { format } from 'date-fns'; +import { uniqBy } from 'lodash'; import ms from 'ms'; @Injectable() @@ -27,6 +30,7 @@ export class BenchmarkService { public constructor( private readonly dataProviderService: DataProviderService, private readonly marketDataService: MarketDataService, + private readonly prismaService: PrismaService, private readonly propertyService: PropertyService, private readonly redisCacheService: RedisCacheService, private readonly symbolProfileService: SymbolProfileService, @@ -116,9 +120,9 @@ export class BenchmarkService { public async getBenchmarkAssetProfiles(): Promise[]> { const symbolProfileIds: string[] = ( - ((await this.propertyService.getByKey(PROPERTY_BENCHMARKS)) as { - symbolProfileId: string; - }[]) ?? [] + ((await this.propertyService.getByKey( + PROPERTY_BENCHMARKS + )) as BenchmarkProperty[]) ?? [] ).map(({ symbolProfileId }) => { return symbolProfileId; }); @@ -204,6 +208,43 @@ export class BenchmarkService { return response; } + public async addBenchmark({ + dataSource, + symbol + }: UniqueAsset): Promise> { + const assetProfile = await this.prismaService.symbolProfile.findFirst({ + where: { + dataSource, + symbol + } + }); + + if (!assetProfile) { + return; + } + + let benchmarks = + ((await this.propertyService.getByKey( + PROPERTY_BENCHMARKS + )) as BenchmarkProperty[]) ?? []; + + benchmarks.push({ symbolProfileId: assetProfile.id }); + + benchmarks = uniqBy(benchmarks, 'symbolProfileId'); + + await this.propertyService.put({ + key: PROPERTY_BENCHMARKS, + value: JSON.stringify(benchmarks) + }); + + return { + dataSource, + symbol, + id: assetProfile.id, + name: assetProfile.name + }; + } + private getMarketCondition(aPerformanceInPercent: number) { return aPerformanceInPercent <= -0.2 ? 'BEAR_MARKET' : 'NEUTRAL_MARKET'; } diff --git a/apps/api/src/app/cache/cache.module.ts b/apps/api/src/app/cache/cache.module.ts index c079c7942..23b3ea2bb 100644 --- a/apps/api/src/app/cache/cache.module.ts +++ b/apps/api/src/app/cache/cache.module.ts @@ -1,10 +1,10 @@ import { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.module'; -import { ConfigurationModule } from '@ghostfolio/api/services/configuration.module'; -import { DataGatheringModule } from '@ghostfolio/api/services/data-gathering.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 { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data.module'; -import { PrismaModule } from '@ghostfolio/api/services/prisma.module'; -import { SymbolProfileModule } from '@ghostfolio/api/services/symbol-profile.module'; +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 new file mode 100644 index 000000000..ca9b67ced --- /dev/null +++ b/apps/api/src/app/exchange-rate/exchange-rate.controller.ts @@ -0,0 +1,42 @@ +import { IDataProviderHistoricalResponse } from '@ghostfolio/api/services/interfaces/interfaces'; +import { + Controller, + Get, + HttpException, + Param, + UseGuards +} from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; +import { StatusCodes, getReasonPhrase } from 'http-status-codes'; + +import { ExchangeRateService } from './exchange-rate.service'; + +@Controller('exchange-rate') +export class ExchangeRateController { + public constructor( + private readonly exchangeRateService: ExchangeRateService + ) {} + + @Get(':symbol/:dateString') + @UseGuards(AuthGuard('jwt')) + public async getExchangeRate( + @Param('dateString') dateString: string, + @Param('symbol') symbol: string + ): Promise { + const date = new Date(dateString); + + const exchangeRate = await this.exchangeRateService.getExchangeRate({ + date, + symbol + }); + + if (exchangeRate) { + return { marketPrice: exchangeRate }; + } + + throw new HttpException( + getReasonPhrase(StatusCodes.NOT_FOUND), + StatusCodes.NOT_FOUND + ); + } +} diff --git a/apps/api/src/app/exchange-rate/exchange-rate.module.ts b/apps/api/src/app/exchange-rate/exchange-rate.module.ts new file mode 100644 index 000000000..d94f047f3 --- /dev/null +++ b/apps/api/src/app/exchange-rate/exchange-rate.module.ts @@ -0,0 +1,13 @@ +import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module'; +import { Module } from '@nestjs/common'; + +import { ExchangeRateController } from './exchange-rate.controller'; +import { ExchangeRateService } from './exchange-rate.service'; + +@Module({ + controllers: [ExchangeRateController], + exports: [ExchangeRateService], + imports: [ExchangeRateDataModule], + providers: [ExchangeRateService] +}) +export class ExchangeRateModule {} diff --git a/apps/api/src/app/exchange-rate/exchange-rate.service.ts b/apps/api/src/app/exchange-rate/exchange-rate.service.ts new file mode 100644 index 000000000..44a8d0568 --- /dev/null +++ b/apps/api/src/app/exchange-rate/exchange-rate.service.ts @@ -0,0 +1,26 @@ +import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class ExchangeRateService { + public constructor( + private readonly exchangeRateDataService: ExchangeRateDataService + ) {} + + public async getExchangeRate({ + date, + symbol + }: { + date: Date; + symbol: string; + }): Promise { + const [currency1, currency2] = symbol.split('-'); + + return this.exchangeRateDataService.toCurrencyAtDate( + 1, + currency1, + currency2, + date + ); + } +} diff --git a/apps/api/src/app/export/export.module.ts b/apps/api/src/app/export/export.module.ts index dd273c717..186e8dc59 100644 --- a/apps/api/src/app/export/export.module.ts +++ b/apps/api/src/app/export/export.module.ts @@ -1,8 +1,8 @@ import { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.module'; -import { ConfigurationModule } from '@ghostfolio/api/services/configuration.module'; -import { DataGatheringModule } from '@ghostfolio/api/services/data-gathering.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 { PrismaModule } from '@ghostfolio/api/services/prisma.module'; +import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.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 c4655e7d8..eaeea0f07 100644 --- a/apps/api/src/app/export/export.service.ts +++ b/apps/api/src/app/export/export.service.ts @@ -1,5 +1,5 @@ import { environment } from '@ghostfolio/api/environments/environment'; -import { PrismaService } from '@ghostfolio/api/services/prisma.service'; +import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { Export } from '@ghostfolio/common/interfaces'; import { Injectable } from '@nestjs/common'; @@ -14,6 +14,23 @@ export class ExportService { activityIds?: string[]; userId: string; }): Promise { + const accounts = await this.prismaService.account.findMany({ + orderBy: { + name: 'asc' + }, + select: { + accountType: true, + balance: true, + comment: true, + currency: true, + id: true, + isExcluded: true, + name: true, + platformId: true + }, + where: { userId } + }); + let activities = await this.prismaService.order.findMany({ orderBy: { date: 'desc' }, select: { @@ -38,6 +55,7 @@ export class ExportService { return { meta: { date: new Date().toISOString(), version: environment.version }, + accounts, activities: activities.map( ({ accountId, diff --git a/apps/api/src/app/frontend.middleware.ts b/apps/api/src/app/frontend.middleware.ts index a1ab6452c..baf1953b0 100644 --- a/apps/api/src/app/frontend.middleware.ts +++ b/apps/api/src/app/frontend.middleware.ts @@ -1,10 +1,12 @@ import * as fs from 'fs'; import * as path from 'path'; -import { ConfigurationService } from '@ghostfolio/api/services/configuration.service'; +import { environment } from '@ghostfolio/api/environments/environment'; +import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { DEFAULT_LANGUAGE_CODE } from '@ghostfolio/common/config'; +import { DATE_FORMAT } from '@ghostfolio/common/helper'; import { Injectable, NestMiddleware } from '@nestjs/common'; -import { ConfigService } from '@nestjs/config'; +import { format } from 'date-fns'; import { NextFunction, Request, Response } from 'express'; @Injectable() @@ -12,20 +14,17 @@ export class FrontendMiddleware implements NestMiddleware { public indexHtmlDe = ''; public indexHtmlEn = ''; public indexHtmlEs = ''; + public indexHtmlFr = ''; public indexHtmlIt = ''; public indexHtmlNl = ''; - public isProduction: boolean; + public indexHtmlPt = ''; + + private static readonly DEFAULT_DESCRIPTION = + 'Ghostfolio is a personal finance dashboard to keep track of your assets like stocks, ETFs or cryptocurrencies across multiple platforms.'; public constructor( - private readonly configService: ConfigService, private readonly configurationService: ConfigurationService ) { - const NODE_ENV = - this.configService.get<'development' | 'production'>('NODE_ENV') ?? - 'development'; - - this.isProduction = NODE_ENV === 'production'; - try { this.indexHtmlDe = fs.readFileSync( this.getPathOfIndexHtmlFile('de'), @@ -39,6 +38,10 @@ export class FrontendMiddleware implements NestMiddleware { this.getPathOfIndexHtmlFile('es'), 'utf8' ); + this.indexHtmlFr = fs.readFileSync( + this.getPathOfIndexHtmlFile('fr'), + 'utf8' + ); this.indexHtmlIt = fs.readFileSync( this.getPathOfIndexHtmlFile('it'), 'utf8' @@ -47,73 +50,161 @@ export class FrontendMiddleware implements NestMiddleware { this.getPathOfIndexHtmlFile('nl'), 'utf8' ); + this.indexHtmlPt = fs.readFileSync( + this.getPathOfIndexHtmlFile('pt'), + 'utf8' + ); } catch {} } - public use(req: Request, res: Response, next: NextFunction) { + public use(request: Request, response: Response, next: NextFunction) { + const currentDate = format(new Date(), DATE_FORMAT); let featureGraphicPath = 'assets/cover.png'; + let title = 'Ghostfolio – Open Source Wealth Management Software'; - if ( - req.path === '/en/blog/2022/08/500-stars-on-github' || - req.path === '/en/blog/2022/08/500-stars-on-github/' - ) { + if (request.path.startsWith('/en/blog/2022/08/500-stars-on-github')) { featureGraphicPath = 'assets/images/blog/500-stars-on-github.jpg'; + title = `500 Stars - ${title}`; + } else if (request.path.startsWith('/en/blog/2022/10/hacktoberfest-2022')) { + featureGraphicPath = 'assets/images/blog/hacktoberfest-2022.png'; + title = `Hacktoberfest 2022 - ${title}`; + } else if (request.path.startsWith('/en/blog/2022/11/black-friday-2022')) { + featureGraphicPath = 'assets/images/blog/black-friday-2022.jpg'; + title = `Black Friday 2022 - ${title}`; } else if ( - req.path === '/en/blog/2022/10/hacktoberfest-2022' || - req.path === '/en/blog/2022/10/hacktoberfest-2022/' + request.path.startsWith( + '/en/blog/2022/12/the-importance-of-tracking-your-personal-finances' + ) ) { - featureGraphicPath = 'assets/images/blog/hacktoberfest-2022.png'; + featureGraphicPath = 'assets/images/blog/20221226.jpg'; + title = `The importance of tracking your personal finances - ${title}`; + } else if ( + request.path.startsWith( + '/de/blog/2023/01/ghostfolio-auf-sackgeld-vorgestellt' + ) + ) { + featureGraphicPath = 'assets/images/blog/ghostfolio-x-sackgeld.png'; + title = `Ghostfolio auf Sackgeld.com vorgestellt - ${title}`; + } else if ( + request.path.startsWith('/en/blog/2023/02/ghostfolio-meets-umbrel') + ) { + featureGraphicPath = 'assets/images/blog/ghostfolio-x-umbrel.png'; + title = `Ghostfolio meets Umbrel - ${title}`; + } else if ( + request.path.startsWith( + '/en/blog/2023/03/ghostfolio-reaches-1000-stars-on-github' + ) + ) { + featureGraphicPath = 'assets/images/blog/1000-stars-on-github.jpg'; + title = `Ghostfolio reaches 1’000 Stars on GitHub - ${title}`; + } else if ( + request.path.startsWith( + '/en/blog/2023/05/unlock-your-financial-potential-with-ghostfolio' + ) + ) { + featureGraphicPath = 'assets/images/blog/20230520.jpg'; + title = `Unlock your Financial Potential with Ghostfolio - ${title}`; + } else if ( + request.path.startsWith('/en/blog/2023/07/exploring-the-path-to-fire') + ) { + featureGraphicPath = 'assets/images/blog/20230701.jpg'; + title = `Exploring the Path to FIRE - ${title}`; } if ( - req.path.startsWith('/api/') || - this.isFileRequest(req.url) || - !this.isProduction + request.path.startsWith('/api/') || + this.isFileRequest(request.url) || + !environment.production ) { // Skip next(); - } else if (req.path === '/de' || req.path.startsWith('/de/')) { - res.send( + } else if (request.path === '/de' || request.path.startsWith('/de/')) { + response.send( this.interpolate(this.indexHtmlDe, { + currentDate, featureGraphicPath, + title, + description: + 'Mit dem Finanz-Dashboard Ghostfolio können Sie Ihr Vermögen in Form von Aktien, ETFs oder Kryptowährungen verteilt über mehrere Finanzinstitute überwachen.', languageCode: 'de', - path: req.path, + path: request.path, rootUrl: this.configurationService.get('ROOT_URL') }) ); - } else if (req.path === '/es' || req.path.startsWith('/es/')) { - res.send( + } else if (request.path === '/es' || request.path.startsWith('/es/')) { + response.send( this.interpolate(this.indexHtmlEs, { + currentDate, featureGraphicPath, + title, + description: + 'Ghostfolio es un dashboard de finanzas personales para hacer un seguimiento de tus activos como acciones, ETFs o criptodivisas a través de múltiples plataformas.', languageCode: 'es', - path: req.path, + path: request.path, + rootUrl: this.configurationService.get('ROOT_URL') + }) + ); + } else if (request.path === '/fr' || request.path.startsWith('/fr/')) { + response.send( + this.interpolate(this.indexHtmlFr, { + currentDate, + featureGraphicPath, + title, + description: + 'Ghostfolio est un dashboard de finances personnelles qui permet de suivre vos actifs comme les actions, les ETF ou les crypto-monnaies sur plusieurs plateformes.', + languageCode: 'fr', + path: request.path, rootUrl: this.configurationService.get('ROOT_URL') }) ); - } else if (req.path === '/it' || req.path.startsWith('/it/')) { - res.send( + } else if (request.path === '/it' || request.path.startsWith('/it/')) { + response.send( this.interpolate(this.indexHtmlIt, { + currentDate, featureGraphicPath, + title, + description: + 'Ghostfolio è un dashboard di finanza personale per tenere traccia delle vostre attività come azioni, ETF o criptovalute su più piattaforme.', languageCode: 'it', - path: req.path, + path: request.path, rootUrl: this.configurationService.get('ROOT_URL') }) ); - } else if (req.path === '/nl' || req.path.startsWith('/nl/')) { - res.send( + } else if (request.path === '/nl' || request.path.startsWith('/nl/')) { + response.send( this.interpolate(this.indexHtmlNl, { + currentDate, featureGraphicPath, + title, + description: + 'Ghostfolio is een persoonlijk financieel dashboard om uw activa zoals aandelen, ETF’s of cryptocurrencies over meerdere platforms bij te houden.', languageCode: 'nl', - path: req.path, + path: request.path, + rootUrl: this.configurationService.get('ROOT_URL') + }) + ); + } else if (request.path === '/pt' || request.path.startsWith('/pt/')) { + response.send( + this.interpolate(this.indexHtmlPt, { + currentDate, + featureGraphicPath, + title, + description: + 'Ghostfolio é um dashboard de finanças pessoais para acompanhar os seus activos como acções, ETFs ou criptomoedas em múltiplas plataformas.', + languageCode: 'pt', + path: request.path, rootUrl: this.configurationService.get('ROOT_URL') }) ); } else { - res.send( + response.send( this.interpolate(this.indexHtmlEn, { + currentDate, featureGraphicPath, + title, + description: FrontendMiddleware.DEFAULT_DESCRIPTION, languageCode: DEFAULT_LANGUAGE_CODE, - path: req.path, + path: request.path, rootUrl: this.configurationService.get('ROOT_URL') }) ); diff --git a/apps/api/src/app/health/health.controller.ts b/apps/api/src/app/health/health.controller.ts new file mode 100644 index 000000000..d9af97981 --- /dev/null +++ b/apps/api/src/app/health/health.controller.ts @@ -0,0 +1,44 @@ +import { TransformDataSourceInRequestInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-request.interceptor'; +import { + Controller, + Get, + HttpException, + Param, + UseInterceptors +} from '@nestjs/common'; +import { DataSource } from '@prisma/client'; +import { StatusCodes, getReasonPhrase } from 'http-status-codes'; + +import { HealthService } from './health.service'; + +@Controller('health') +export class HealthController { + public constructor(private readonly healthService: HealthService) {} + + @Get() + public async getHealth() {} + + @Get('data-provider/:dataSource') + @UseInterceptors(TransformDataSourceInRequestInterceptor) + public async getHealthOfDataProvider( + @Param('dataSource') dataSource: DataSource + ) { + if (!DataSource[dataSource]) { + throw new HttpException( + getReasonPhrase(StatusCodes.NOT_FOUND), + StatusCodes.NOT_FOUND + ); + } + + const hasResponse = await this.healthService.hasResponseFromDataProvider( + dataSource + ); + + if (hasResponse !== true) { + throw new HttpException( + getReasonPhrase(StatusCodes.SERVICE_UNAVAILABLE), + StatusCodes.SERVICE_UNAVAILABLE + ); + } + } +} diff --git a/apps/api/src/app/health/health.module.ts b/apps/api/src/app/health/health.module.ts new file mode 100644 index 000000000..1c5292027 --- /dev/null +++ b/apps/api/src/app/health/health.module.ts @@ -0,0 +1,13 @@ +import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; +import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module'; +import { Module } from '@nestjs/common'; + +import { HealthController } from './health.controller'; +import { HealthService } from './health.service'; + +@Module({ + controllers: [HealthController], + imports: [ConfigurationModule, DataProviderModule], + providers: [HealthService] +}) +export class HealthModule {} diff --git a/apps/api/src/app/health/health.service.ts b/apps/api/src/app/health/health.service.ts new file mode 100644 index 000000000..afbcc0a74 --- /dev/null +++ b/apps/api/src/app/health/health.service.ts @@ -0,0 +1,14 @@ +import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; +import { Injectable } from '@nestjs/common'; +import { DataSource } from '@prisma/client'; + +@Injectable() +export class HealthService { + public constructor( + private readonly dataProviderService: DataProviderService + ) {} + + public async hasResponseFromDataProvider(aDataSource: DataSource) { + return this.dataProviderService.checkQuote(aDataSource); + } +} diff --git a/apps/api/src/app/import/import-data.dto.ts b/apps/api/src/app/import/import-data.dto.ts index f3a0ba8fe..fa954a2c9 100644 --- a/apps/api/src/app/import/import-data.dto.ts +++ b/apps/api/src/app/import/import-data.dto.ts @@ -1,8 +1,15 @@ +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, ValidateNested } from 'class-validator'; +import { IsArray, IsOptional, ValidateNested } from 'class-validator'; export class ImportDataDto { + @IsOptional() + @IsArray() + @Type(() => CreateAccountDto) + @ValidateNested({ each: true }) + accounts: CreateAccountDto[]; + @IsArray() @Type(() => CreateOrderDto) @ValidateNested({ each: true }) diff --git a/apps/api/src/app/import/import.controller.ts b/apps/api/src/app/import/import.controller.ts index 422e1cb9f..9fbc8075c 100644 --- a/apps/api/src/app/import/import.controller.ts +++ b/apps/api/src/app/import/import.controller.ts @@ -1,16 +1,25 @@ -import { ConfigurationService } from '@ghostfolio/api/services/configuration.service'; +import { TransformDataSourceInRequestInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-request.interceptor'; +import { TransformDataSourceInResponseInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-response.interceptor'; +import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; +import { ImportResponse } from '@ghostfolio/common/interfaces'; +import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import type { RequestWithUser } from '@ghostfolio/common/types'; import { Body, Controller, + Get, HttpException, Inject, Logger, + Param, Post, - UseGuards + Query, + UseGuards, + UseInterceptors } from '@nestjs/common'; import { REQUEST } from '@nestjs/core'; import { AuthGuard } from '@nestjs/passport'; +import { DataSource } from '@prisma/client'; import { StatusCodes, getReasonPhrase } from 'http-status-codes'; import { ImportDataDto } from './import-data.dto'; @@ -26,8 +35,19 @@ export class ImportController { @Post() @UseGuards(AuthGuard('jwt')) - public async import(@Body() importData: ImportDataDto): Promise { - if (!this.configurationService.get('ENABLE_FEATURE_IMPORT')) { + @UseInterceptors(TransformDataSourceInRequestInterceptor) + @UseInterceptors(TransformDataSourceInResponseInterceptor) + public async import( + @Body() importData: ImportDataDto, + @Query('dryRun') isDryRun?: boolean + ): Promise { + if ( + !hasPermission( + this.request.user.permissions, + permissions.createAccount + ) || + !hasPermission(this.request.user.permissions, permissions.createOrder) + ) { throw new HttpException( getReasonPhrase(StatusCodes.FORBIDDEN), StatusCodes.FORBIDDEN @@ -45,12 +65,19 @@ export class ImportController { maxActivitiesToImport = Number.MAX_SAFE_INTEGER; } + const userCurrency = this.request.user.Settings.settings.baseCurrency; + try { - return await this.importService.import({ + const activities = await this.importService.import({ + isDryRun, maxActivitiesToImport, - activities: importData.activities, + userCurrency, + accountsDto: importData.accounts ?? [], + activitiesDto: importData.activities, userId: this.request.user.id }); + + return { activities }; } catch (error) { Logger.error(error, ImportController); @@ -63,4 +90,23 @@ export class ImportController { ); } } + + @Get('dividends/:dataSource/:symbol') + @UseGuards(AuthGuard('jwt')) + @UseInterceptors(TransformDataSourceInRequestInterceptor) + @UseInterceptors(TransformDataSourceInResponseInterceptor) + public async gatherDividends( + @Param('dataSource') dataSource: DataSource, + @Param('symbol') symbol: string + ): Promise { + const userCurrency = this.request.user.Settings.settings.baseCurrency; + + const activities = await this.importService.getDividends({ + dataSource, + symbol, + userCurrency + }); + + return { activities }; + } } diff --git a/apps/api/src/app/import/import.module.ts b/apps/api/src/app/import/import.module.ts index 62d227bf5..8b5668860 100644 --- a/apps/api/src/app/import/import.module.ts +++ b/apps/api/src/app/import/import.module.ts @@ -1,11 +1,15 @@ import { AccountModule } from '@ghostfolio/api/app/account/account.module'; import { CacheModule } from '@ghostfolio/api/app/cache/cache.module'; import { OrderModule } from '@ghostfolio/api/app/order/order.module'; +import { PlatformModule } from '@ghostfolio/api/app/platform/platform.module'; +import { PortfolioModule } from '@ghostfolio/api/app/portfolio/portfolio.module'; import { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.module'; -import { ConfigurationModule } from '@ghostfolio/api/services/configuration.module'; -import { DataGatheringModule } from '@ghostfolio/api/services/data-gathering.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 { PrismaModule } from '@ghostfolio/api/services/prisma.module'; +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'; @@ -19,9 +23,13 @@ import { ImportService } from './import.service'; ConfigurationModule, DataGatheringModule, DataProviderModule, + ExchangeRateDataModule, OrderModule, + PlatformModule, + PortfolioModule, PrismaModule, - RedisCacheModule + RedisCacheModule, + SymbolProfileModule ], providers: [ImportService] }) diff --git a/apps/api/src/app/import/import.service.ts b/apps/api/src/app/import/import.service.ts index 7617b8cb3..65611ce0d 100644 --- a/apps/api/src/app/import/import.service.ts +++ b/apps/api/src/app/import/import.service.ts @@ -1,149 +1,493 @@ import { AccountService } from '@ghostfolio/api/app/account/account.service'; +import { CreateAccountDto } from '@ghostfolio/api/app/account/create-account.dto'; import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto'; +import { + Activity, + ActivityError +} from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { OrderService } from '@ghostfolio/api/app/order/order.service'; -import { ConfigurationService } from '@ghostfolio/api/services/configuration.service'; +import { PlatformService } from '@ghostfolio/api/app/platform/platform.service'; +import { PortfolioService } from '@ghostfolio/api/app/portfolio/portfolio.service'; import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; +import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; +import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; +import { parseDate } from '@ghostfolio/common/helper'; +import { UniqueAsset } from '@ghostfolio/common/interfaces'; +import { + AccountWithPlatform, + OrderWithAccount +} from '@ghostfolio/common/types'; import { Injectable } from '@nestjs/common'; -import { isSameDay, parseISO } from 'date-fns'; +import { DataSource, Prisma, SymbolProfile } from '@prisma/client'; +import Big from 'big.js'; +import { endOfToday, isAfter, isSameDay, parseISO } from 'date-fns'; +import { v4 as uuidv4 } from 'uuid'; @Injectable() export class ImportService { public constructor( private readonly accountService: AccountService, - private readonly configurationService: ConfigurationService, private readonly dataProviderService: DataProviderService, - private readonly orderService: OrderService + private readonly exchangeRateDataService: ExchangeRateDataService, + private readonly orderService: OrderService, + private readonly platformService: PlatformService, + private readonly portfolioService: PortfolioService, + private readonly symbolProfileService: SymbolProfileService ) {} + public async getDividends({ + dataSource, + symbol, + userCurrency + }: UniqueAsset & { userCurrency: string }): Promise { + try { + const { firstBuyDate, historicalData, orders } = + await this.portfolioService.getPosition(dataSource, undefined, symbol); + + const [[assetProfile], dividends] = await Promise.all([ + this.symbolProfileService.getSymbolProfiles([ + { + dataSource, + symbol + } + ]), + await this.dataProviderService.getDividends({ + dataSource, + symbol, + from: parseDate(firstBuyDate), + granularity: 'day', + to: new Date() + }) + ]); + + const accounts = orders.map((order) => { + return order.Account; + }); + + const Account = this.isUniqueAccount(accounts) ? accounts[0] : undefined; + + return Object.entries(dividends).map(([dateString, { marketPrice }]) => { + const quantity = + historicalData.find((historicalDataItem) => { + return historicalDataItem.date === dateString; + })?.quantity ?? 0; + + const value = new Big(quantity).mul(marketPrice).toNumber(); + + const isDuplicate = orders.some((activity) => { + return ( + activity.SymbolProfile.currency === assetProfile.currency && + activity.SymbolProfile.dataSource === assetProfile.dataSource && + isSameDay(activity.date, parseDate(dateString)) && + activity.quantity === quantity && + activity.SymbolProfile.symbol === assetProfile.symbol && + activity.type === 'DIVIDEND' && + activity.unitPrice === marketPrice + ); + }); + + const error: ActivityError = isDuplicate + ? { code: 'IS_DUPLICATE' } + : undefined; + + return { + Account, + error, + quantity, + value, + accountId: Account?.id, + accountUserId: undefined, + comment: undefined, + createdAt: undefined, + date: parseDate(dateString), + fee: 0, + feeInBaseCurrency: 0, + id: assetProfile.id, + isDraft: false, + SymbolProfile: (assetProfile), + symbolProfileId: assetProfile.id, + type: 'DIVIDEND', + unitPrice: marketPrice, + updatedAt: undefined, + userId: Account?.userId, + valueInBaseCurrency: this.exchangeRateDataService.toCurrency( + value, + assetProfile.currency, + userCurrency + ) + }; + }); + } catch { + return []; + } + } + public async import({ - activities, + accountsDto, + activitiesDto, + isDryRun = false, maxActivitiesToImport, + userCurrency, userId }: { - activities: Partial[]; + accountsDto: Partial[]; + activitiesDto: Partial[]; + isDryRun?: boolean; maxActivitiesToImport: number; + userCurrency: string; userId: string; - }): Promise { - for (const activity of activities) { + }): Promise { + const accountIdMapping: { [oldAccountId: string]: string } = {}; + + if (!isDryRun && accountsDto?.length) { + const [existingAccounts, existingPlatforms] = await Promise.all([ + this.accountService.accounts({ + where: { + id: { + in: accountsDto.map(({ id }) => { + return id; + }) + } + } + }), + this.platformService.getPlatforms() + ]); + + for (const account of accountsDto) { + // Check if there is any existing account with the same ID + const accountWithSameId = existingAccounts.find( + (existingAccount) => existingAccount.id === account.id + ); + + // If there is no account or if the account belongs to a different user then create a new account + if (!accountWithSameId || accountWithSameId.userId !== userId) { + let oldAccountId: string; + const platformId = account.platformId; + + delete account.platformId; + + if (accountWithSameId) { + oldAccountId = account.id; + delete account.id; + } + + let accountObject: Prisma.AccountCreateInput = { + ...account, + User: { connect: { id: userId } } + }; + + if ( + existingPlatforms.some(({ id }) => { + return id === platformId; + }) + ) { + accountObject = { + ...accountObject, + Platform: { connect: { id: platformId } } + }; + } + + const newAccount = await this.accountService.createAccount( + accountObject, + userId + ); + + // Store the new to old account ID mappings for updating activities + if (accountWithSameId && oldAccountId) { + accountIdMapping[oldAccountId] = newAccount.id; + } + } + } + } + + for (const activity of activitiesDto) { if (!activity.dataSource) { - if (activity.type === 'ITEM') { - activity.dataSource = 'MANUAL'; + if (activity.type === 'ITEM' || activity.type === 'LIABILITY') { + activity.dataSource = DataSource.MANUAL; } else { - activity.dataSource = this.dataProviderService.getPrimaryDataSource(); + activity.dataSource = + this.dataProviderService.getDataSourceForImport(); + } + } + + // If a new account is created, then update the accountId in all activities + if (!isDryRun) { + if (Object.keys(accountIdMapping).includes(activity.accountId)) { + activity.accountId = accountIdMapping[activity.accountId]; } } } - await this.validateActivities({ - activities, + const assetProfiles = await this.validateActivities({ + activitiesDto, maxActivitiesToImport, userId }); - const accountIds = (await this.accountService.getAccounts(userId)).map( - (account) => { - return account.id; + const activitiesExtendedWithErrors = await this.extendActivitiesWithErrors({ + activitiesDto, + userId + }); + + const accounts = (await this.accountService.getAccounts(userId)).map( + ({ id, name }) => { + return { id, name }; } ); + if (isDryRun) { + accountsDto.forEach(({ id, name }) => { + accounts.push({ id, name }); + }); + } + + const activities: Activity[] = []; + for (const { accountId, comment, - currency, - dataSource, date, + error, fee, quantity, - symbol, + SymbolProfile: assetProfile, type, unitPrice - } of activities) { - await this.orderService.createOrder({ + } of activitiesExtendedWithErrors) { + const validatedAccount = accounts.find(({ id }) => { + return id === accountId; + }); + + let order: + | OrderWithAccount + | (Omit & { + Account?: { id: string; name: string }; + }); + + if (isDryRun) { + order = { + comment, + date, + fee, + quantity, + type, + unitPrice, + userId, + accountId: validatedAccount?.id, + accountUserId: undefined, + createdAt: new Date(), + id: uuidv4(), + isDraft: isAfter(date, endOfToday()), + SymbolProfile: { + assetClass: assetProfile.assetClass, + assetSubClass: assetProfile.assetSubClass, + comment: assetProfile.comment, + countries: assetProfile.countries, + createdAt: assetProfile.createdAt, + currency: assetProfile.currency, + dataSource: assetProfile.dataSource, + id: assetProfile.id, + isin: assetProfile.isin, + name: assetProfile.name, + scraperConfiguration: assetProfile.scraperConfiguration, + sectors: assetProfile.sectors, + symbol: assetProfile.currency, + symbolMapping: assetProfile.symbolMapping, + updatedAt: assetProfile.updatedAt, + url: assetProfile.url, + ...assetProfiles[assetProfile.symbol] + }, + Account: validatedAccount, + symbolProfileId: undefined, + updatedAt: new Date() + }; + } else { + if (error) { + continue; + } + + order = await this.orderService.createOrder({ + comment, + date, + fee, + quantity, + type, + unitPrice, + userId, + accountId: validatedAccount?.id, + SymbolProfile: { + connectOrCreate: { + create: { + currency: assetProfile.currency, + dataSource: assetProfile.dataSource, + symbol: assetProfile.symbol + }, + where: { + dataSource_symbol: { + dataSource: assetProfile.dataSource, + symbol: assetProfile.symbol + } + } + } + }, + updateAccountBalance: false, + User: { connect: { id: userId } } + }); + } + + const value = new Big(quantity).mul(unitPrice).toNumber(); + + //@ts-ignore + activities.push({ + ...order, + error, + value, + feeInBaseCurrency: this.exchangeRateDataService.toCurrency( + fee, + assetProfile.currency, + userCurrency + ), + valueInBaseCurrency: this.exchangeRateDataService.toCurrency( + value, + assetProfile.currency, + userCurrency + ) + }); + } + + return activities; + } + + private async extendActivitiesWithErrors({ + activitiesDto, + userId + }: { + activitiesDto: Partial[]; + userId: string; + }): Promise[]> { + const existingActivities = await this.orderService.orders({ + include: { SymbolProfile: true }, + orderBy: { date: 'desc' }, + where: { userId } + }); + + return activitiesDto.map( + ({ + accountId, comment, + currency, + dataSource, + date: dateString, fee, quantity, + symbol, type, - unitPrice, - userId, - accountId: accountIds.includes(accountId) ? accountId : undefined, - date: parseISO((date)), - SymbolProfile: { - connectOrCreate: { - create: { - currency, - dataSource, - symbol - }, - where: { - dataSource_symbol: { - dataSource, - symbol - } - } + unitPrice + }) => { + const date = parseISO((dateString)); + const isDuplicate = existingActivities.some((activity) => { + return ( + activity.SymbolProfile.currency === currency && + activity.SymbolProfile.dataSource === dataSource && + isSameDay(activity.date, date) && + activity.fee === fee && + activity.quantity === quantity && + activity.SymbolProfile.symbol === symbol && + activity.type === type && + activity.unitPrice === unitPrice + ); + }); + + const error: ActivityError = isDuplicate + ? { code: 'IS_DUPLICATE' } + : undefined; + + return { + accountId, + comment, + date, + error, + fee, + quantity, + type, + unitPrice, + SymbolProfile: { + currency, + dataSource, + symbol, + assetClass: null, + assetSubClass: null, + comment: null, + countries: null, + createdAt: undefined, + id: undefined, + isin: null, + name: null, + scraperConfiguration: null, + sectors: null, + symbolMapping: null, + updatedAt: undefined, + url: null } - }, - User: { connect: { id: userId } } - }); + }; + } + ); + } + + private isUniqueAccount(accounts: AccountWithPlatform[]) { + const uniqueAccountIds = new Set(); + + for (const account of accounts) { + uniqueAccountIds.add(account.id); } + + return uniqueAccountIds.size === 1; } private async validateActivities({ - activities, + activitiesDto, maxActivitiesToImport, userId }: { - activities: Partial[]; + activitiesDto: Partial[]; maxActivitiesToImport: number; userId: string; }) { - if (activities?.length > maxActivitiesToImport) { + if (activitiesDto?.length > maxActivitiesToImport) { throw new Error(`Too many activities (${maxActivitiesToImport} at most)`); } - const existingActivities = await this.orderService.orders({ - include: { SymbolProfile: true }, - orderBy: { date: 'desc' }, - where: { userId } - }); + const assetProfiles: { + [symbol: string]: Partial; + } = {}; for (const [ index, - { currency, dataSource, date, fee, quantity, symbol, type, unitPrice } - ] of activities.entries()) { - const duplicateActivity = existingActivities.find((activity) => { - return ( - activity.SymbolProfile.currency === currency && - activity.SymbolProfile.dataSource === dataSource && - isSameDay(activity.date, parseISO((date))) && - activity.fee === fee && - activity.quantity === quantity && - activity.SymbolProfile.symbol === symbol && - activity.type === type && - activity.unitPrice === unitPrice - ); - }); - - if (duplicateActivity) { - throw new Error(`activities.${index} is a duplicate activity`); - } - + { currency, dataSource, symbol } + ] of activitiesDto.entries()) { if (dataSource !== 'MANUAL') { - const quotes = await this.dataProviderService.getQuotes([ - { dataSource, symbol } - ]); + const assetProfile = ( + await this.dataProviderService.getAssetProfiles([ + { dataSource, symbol } + ]) + )?.[symbol]; - if (quotes[symbol] === undefined) { + if (assetProfile === undefined) { throw new Error( `activities.${index}.symbol ("${symbol}") is not valid for the specified data source ("${dataSource}")` ); } - if (quotes[symbol].currency !== currency) { + if (assetProfile.currency !== currency) { throw new Error( - `activities.${index}.currency ("${currency}") does not match with "${quotes[symbol].currency}"` + `activities.${index}.currency ("${currency}") does not match with "${assetProfile.currency}"` ); } + + assetProfiles[symbol] = assetProfile; } } + + return assetProfiles; } } diff --git a/apps/api/src/app/info/info.module.ts b/apps/api/src/app/info/info.module.ts index 4c9c9f9d9..75d681b56 100644 --- a/apps/api/src/app/info/info.module.ts +++ b/apps/api/src/app/info/info.module.ts @@ -1,12 +1,13 @@ import { BenchmarkModule } from '@ghostfolio/api/app/benchmark/benchmark.module'; +import { PlatformModule } from '@ghostfolio/api/app/platform/platform.module'; import { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.module'; -import { ConfigurationModule } from '@ghostfolio/api/services/configuration.module'; -import { DataGatheringModule } from '@ghostfolio/api/services/data-gathering.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 { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data.module'; -import { PrismaModule } from '@ghostfolio/api/services/prisma.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 { SymbolProfileModule } from '@ghostfolio/api/services/symbol-profile.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'; @@ -26,6 +27,7 @@ import { InfoService } from './info.service'; secret: process.env.JWT_SECRET_KEY, signOptions: { expiresIn: '30 days' } }), + PlatformModule, PrismaModule, PropertyModule, RedisCacheModule, diff --git a/apps/api/src/app/info/info.service.ts b/apps/api/src/app/info/info.service.ts index 8ed589cb5..187135a35 100644 --- a/apps/api/src/app/info/info.service.ts +++ b/apps/api/src/app/info/info.service.ts @@ -1,12 +1,15 @@ import { BenchmarkService } from '@ghostfolio/api/app/benchmark/benchmark.service'; +import { PlatformService } from '@ghostfolio/api/app/platform/platform.service'; import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service'; -import { ConfigurationService } from '@ghostfolio/api/services/configuration.service'; -import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data.service'; -import { PrismaService } from '@ghostfolio/api/services/prisma.service'; +import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; +import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; +import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { PropertyService } from '@ghostfolio/api/services/property/property.service'; import { TagService } from '@ghostfolio/api/services/tag/tag.service'; import { - DEMO_USER_ID, + PROPERTY_BETTER_UPTIME_MONITOR_ID, + PROPERTY_COUNTRIES_OF_SUBSCRIBERS, + PROPERTY_DEMO_USER_ID, PROPERTY_IS_READ_ONLY_MODE, PROPERTY_SLACK_COMMUNITY_USERS, PROPERTY_STRIPE_CONFIG, @@ -14,18 +17,22 @@ import { ghostfolioFearAndGreedIndexDataSource } from '@ghostfolio/common/config'; import { + DATE_FORMAT, encodeDataSource, extractNumberFromString } from '@ghostfolio/common/helper'; -import { InfoItem } from '@ghostfolio/common/interfaces'; -import { Statistics } from '@ghostfolio/common/interfaces/statistics.interface'; -import { Subscription } from '@ghostfolio/common/interfaces/subscription.interface'; +import { + InfoItem, + Statistics, + Subscription +} 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 bent from 'bent'; import * as cheerio from 'cheerio'; -import { subDays } from 'date-fns'; +import { format, subDays } from 'date-fns'; @Injectable() export class InfoService { @@ -36,6 +43,7 @@ export class InfoService { private readonly configurationService: ConfigurationService, private readonly exchangeRateDataService: ExchangeRateDataService, private readonly jwtService: JwtService, + private readonly platformService: PlatformService, private readonly prismaService: PrismaService, private readonly propertyService: PropertyService, private readonly redisCacheService: RedisCacheService, @@ -45,9 +53,12 @@ export class InfoService { public async get(): Promise { const info: Partial = {}; let isReadOnlyMode: boolean; - const platforms = await this.prismaService.platform.findMany({ - orderBy: { name: 'asc' }, - select: { id: true, name: true } + const platforms = ( + await this.platformService.getPlatforms({ + orderBy: { name: 'asc' } + }) + ).map(({ id, name }) => { + return { id, name }; }); let systemMessage: string; @@ -58,9 +69,7 @@ export class InfoService { } if (this.configurationService.get('ENABLE_FEATURE_FEAR_AND_GREED_INDEX')) { - if ( - this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION') === true - ) { + if (this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) { info.fearAndGreedDataSource = encodeDataSource( ghostfolioFearAndGreedIndexDataSource ); @@ -71,10 +80,6 @@ export class InfoService { globalPermissions.push(permissions.enableFearAndGreedIndex); } - if (this.configurationService.get('ENABLE_FEATURE_IMPORT')) { - globalPermissions.push(permissions.enableImport); - } - if (this.configurationService.get('ENABLE_FEATURE_READ_ONLY_MODE')) { isReadOnlyMode = (await this.propertyService.getByKey( PROPERTY_IS_READ_ONLY_MODE @@ -92,6 +97,10 @@ export class InfoService { if (this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) { globalPermissions.push(permissions.enableSubscription); + info.countriesOfSubscribers = + ((await this.propertyService.getByKey( + PROPERTY_COUNTRIES_OF_SUBSCRIBERS + )) as string[]) ?? []; info.stripePublicKey = this.configurationService.get('STRIPE_PUBLIC_KEY'); } @@ -103,19 +112,35 @@ export class InfoService { )) as string; } + const isUserSignupEnabled = + await this.propertyService.isUserSignupEnabled(); + + if (isUserSignupEnabled) { + globalPermissions.push(permissions.createUserAccount); + } + + const [benchmarks, demoAuthToken, statistics, subscriptions, tags] = + await Promise.all([ + this.benchmarkService.getBenchmarkAssetProfiles(), + this.getDemoAuthToken(), + this.getStatistics(), + this.getSubscriptions(), + this.tagService.get() + ]); + return { ...info, + benchmarks, + demoAuthToken, globalPermissions, isReadOnlyMode, platforms, + statistics, + subscriptions, systemMessage, + tags, baseCurrency: this.configurationService.get('BASE_CURRENCY'), - benchmarks: await this.benchmarkService.getBenchmarkAssetProfiles(), - currencies: this.exchangeRateDataService.getCurrencies(), - demoAuthToken: this.getDemoAuthToken(), - statistics: await this.getStatistics(), - subscriptions: await this.getSubscriptions(), - tags: await this.tagService.get() + currencies: this.exchangeRateDataService.getCurrencies() }; } @@ -240,10 +265,18 @@ export class InfoService { )) as string; } - private getDemoAuthToken() { - return this.jwtService.sign({ - id: DEMO_USER_ID - }); + private async getDemoAuthToken() { + const demoUserId = (await this.propertyService.getByKey( + PROPERTY_DEMO_USER_ID + )) as string; + + if (demoUserId) { + return this.jwtService.sign({ + id: demoUserId + }); + } + + return undefined; } private async getStatistics() { @@ -271,6 +304,7 @@ export class InfoService { const gitHubContributors = await this.countGitHubContributors(); const gitHubStargazers = await this.countGitHubStargazers(); const slackCommunityUsers = await this.countSlackCommunityUsers(); + const uptime = await this.getUptime(); statistics = { activeUsers1d, @@ -279,7 +313,8 @@ export class InfoService { gitHubContributors, gitHubStargazers, newUsers30d, - slackCommunityUsers + slackCommunityUsers, + uptime }; await this.redisCacheService.set( @@ -290,19 +325,49 @@ export class InfoService { return statistics; } - private async getSubscriptions(): Promise { + private async getSubscriptions(): Promise<{ + [offer in SubscriptionOffer]: Subscription; + }> { if (!this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) { return undefined; } - const stripeConfig = await this.prismaService.property.findUnique({ + const stripeConfig = (await this.prismaService.property.findUnique({ where: { key: PROPERTY_STRIPE_CONFIG } - }); + })) ?? { value: '{}' }; - if (stripeConfig) { - return [JSON.parse(stripeConfig.value)]; - } + return JSON.parse(stripeConfig.value); + } - return []; + private async getUptime(): Promise { + { + try { + const monitorId = (await this.propertyService.getByKey( + PROPERTY_BETTER_UPTIME_MONITOR_ID + )) as string; + + const get = bent( + `https://betteruptime.com/api/v2/monitors/${monitorId}/sla?from=${format( + subDays(new Date(), 90), + DATE_FORMAT + )}&to${format(new Date(), DATE_FORMAT)}`, + 'GET', + 'json', + 200, + { + Authorization: `Bearer ${this.configurationService.get( + 'BETTER_UPTIME_API_KEY' + )}` + } + ); + + const { data } = await get(); + return data.attributes.availability / 100; + } catch (error) { + Logger.error(error, 'InfoService'); + + return undefined; + } + } } } diff --git a/apps/api/src/app/logo/logo.controller.ts b/apps/api/src/app/logo/logo.controller.ts new file mode 100644 index 000000000..22bafc061 --- /dev/null +++ b/apps/api/src/app/logo/logo.controller.ts @@ -0,0 +1,54 @@ +import { TransformDataSourceInRequestInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-request.interceptor'; +import { + Controller, + Get, + HttpStatus, + Param, + Query, + Res, + UseInterceptors +} from '@nestjs/common'; +import { DataSource } from '@prisma/client'; +import { Response } from 'express'; + +import { LogoService } from './logo.service'; + +@Controller('logo') +export class LogoController { + public constructor(private readonly logoService: LogoService) {} + + @Get(':dataSource/:symbol') + @UseInterceptors(TransformDataSourceInRequestInterceptor) + public async getLogoByDataSourceAndSymbol( + @Param('dataSource') dataSource: DataSource, + @Param('symbol') symbol: string, + @Res() response: Response + ) { + try { + const buffer = await this.logoService.getLogoByDataSourceAndSymbol({ + dataSource, + symbol + }); + + response.contentType('image/png'); + response.send(buffer); + } catch { + response.status(HttpStatus.NOT_FOUND).send(); + } + } + + @Get() + public async getLogoByUrl( + @Query('url') url: string, + @Res() response: Response + ) { + try { + const buffer = await this.logoService.getLogoByUrl(url); + + response.contentType('image/png'); + response.send(buffer); + } catch { + response.status(HttpStatus.NOT_FOUND).send(); + } + } +} diff --git a/apps/api/src/app/logo/logo.module.ts b/apps/api/src/app/logo/logo.module.ts new file mode 100644 index 000000000..43052a14f --- /dev/null +++ b/apps/api/src/app/logo/logo.module.ts @@ -0,0 +1,13 @@ +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'; +import { LogoService } from './logo.service'; + +@Module({ + controllers: [LogoController], + imports: [ConfigurationModule, SymbolProfileModule], + providers: [LogoService] +}) +export class LogoModule {} diff --git a/apps/api/src/app/logo/logo.service.ts b/apps/api/src/app/logo/logo.service.ts new file mode 100644 index 000000000..d2e377fc0 --- /dev/null +++ b/apps/api/src/app/logo/logo.service.ts @@ -0,0 +1,55 @@ +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 * as bent from 'bent'; +import { StatusCodes, getReasonPhrase } from 'http-status-codes'; + +@Injectable() +export class LogoService { + public constructor( + private readonly symbolProfileService: SymbolProfileService + ) {} + + public async getLogoByDataSourceAndSymbol({ + dataSource, + symbol + }: UniqueAsset) { + if (!DataSource[dataSource]) { + throw new HttpException( + getReasonPhrase(StatusCodes.NOT_FOUND), + StatusCodes.NOT_FOUND + ); + } + + const [assetProfile] = await this.symbolProfileService.getSymbolProfiles([ + { dataSource, symbol } + ]); + + if (!assetProfile) { + throw new HttpException( + getReasonPhrase(StatusCodes.NOT_FOUND), + StatusCodes.NOT_FOUND + ); + } + + return this.getBuffer(assetProfile.url); + } + + public async getLogoByUrl(aUrl: string) { + return this.getBuffer(aUrl); + } + + private getBuffer(aUrl: string) { + const get = bent( + `https://t0.gstatic.com/faviconV2?client=SOCIAL&type=FAVICON&fallback_opts=TYPE,SIZE,URL&url=${aUrl}&size=64`, + 'GET', + 'buffer', + 200, + { + 'User-Agent': 'request' + } + ); + return get(); + } +} diff --git a/apps/api/src/app/order/create-order.dto.ts b/apps/api/src/app/order/create-order.dto.ts index 33e6f9cc8..49b193ca5 100644 --- a/apps/api/src/app/order/create-order.dto.ts +++ b/apps/api/src/app/order/create-order.dto.ts @@ -8,6 +8,7 @@ import { import { Transform, TransformFnParams } from 'class-transformer'; import { IsArray, + IsBoolean, IsEnum, IsISO8601, IsNumber, @@ -64,4 +65,8 @@ export class CreateOrderDto { @IsNumber() unitPrice: number; + + @IsBoolean() + @IsOptional() + updateAccountBalance?: boolean; } diff --git a/apps/api/src/app/order/interfaces/activities.interface.ts b/apps/api/src/app/order/interfaces/activities.interface.ts index e14adce0b..bc2c35a50 100644 --- a/apps/api/src/app/order/interfaces/activities.interface.ts +++ b/apps/api/src/app/order/interfaces/activities.interface.ts @@ -5,6 +5,14 @@ export interface Activities { } export interface Activity extends OrderWithAccount { + error?: ActivityError; feeInBaseCurrency: number; + updateAccountBalance?: boolean; + value: number; valueInBaseCurrency: number; } + +export interface ActivityError { + code: 'IS_DUPLICATE'; + message?: string; +} diff --git a/apps/api/src/app/order/order.controller.ts b/apps/api/src/app/order/order.controller.ts index 5f9e1522d..c478860d2 100644 --- a/apps/api/src/app/order/order.controller.ts +++ b/apps/api/src/app/order/order.controller.ts @@ -1,10 +1,9 @@ -import { UserService } from '@ghostfolio/api/app/user/user.service'; -import { nullifyValuesInObjects } from '@ghostfolio/api/helper/object.helper'; import { RedactValuesInResponseInterceptor } from '@ghostfolio/api/interceptors/redact-values-in-response.interceptor'; import { TransformDataSourceInRequestInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-request.interceptor'; import { TransformDataSourceInResponseInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-response.interceptor'; import { ApiService } from '@ghostfolio/api/services/api/api.service'; -import { ImpersonationService } from '@ghostfolio/api/services/impersonation.service'; +import { ImpersonationService } from '@ghostfolio/api/services/impersonation/impersonation.service'; +import { HEADER_KEY_IMPERSONATION } from '@ghostfolio/common/config'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import type { RequestWithUser } from '@ghostfolio/common/types'; import { @@ -39,10 +38,26 @@ export class OrderController { private readonly apiService: ApiService, private readonly impersonationService: ImpersonationService, private readonly orderService: OrderService, - @Inject(REQUEST) private readonly request: RequestWithUser, - private readonly userService: UserService + @Inject(REQUEST) private readonly request: RequestWithUser ) {} + @Delete() + @UseGuards(AuthGuard('jwt')) + public async deleteOrders(): Promise { + if ( + !hasPermission(this.request.user.permissions, permissions.deleteOrder) + ) { + throw new HttpException( + getReasonPhrase(StatusCodes.FORBIDDEN), + StatusCodes.FORBIDDEN + ); + } + + return this.orderService.deleteOrders({ + userId: this.request.user.id + }); + } + @Delete(':id') @UseGuards(AuthGuard('jwt')) public async deleteOrder(@Param('id') id: string): Promise { @@ -69,7 +84,7 @@ export class OrderController { @UseInterceptors(RedactValuesInResponseInterceptor) @UseInterceptors(TransformDataSourceInResponseInterceptor) public async getAllOrders( - @Headers('impersonation-id') impersonationId, + @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId, @Query('accounts') filterByAccounts?: string, @Query('assetClasses') filterByAssetClasses?: string, @Query('tags') filterByTags?: string @@ -81,13 +96,10 @@ export class OrderController { }); const impersonationUserId = - await this.impersonationService.validateImpersonationId( - impersonationId, - this.request.user.id - ); + await this.impersonationService.validateImpersonationId(impersonationId); const userCurrency = this.request.user.Settings.settings.baseCurrency; - let activities = await this.orderService.getOrders({ + const activities = await this.orderService.getOrders({ filters, userCurrency, includeDrafts: true, @@ -95,20 +107,6 @@ export class OrderController { withExcludedAccounts: true }); - if ( - impersonationUserId || - this.userService.isRestrictedView(this.request.user) - ) { - activities = nullifyValuesInObjects(activities, [ - 'fee', - 'feeInBaseCurrency', - 'quantity', - 'unitPrice', - 'value', - 'valueInBaseCurrency' - ]); - } - return { activities }; } diff --git a/apps/api/src/app/order/order.module.ts b/apps/api/src/app/order/order.module.ts index 7ecc577a5..c8742f9d2 100644 --- a/apps/api/src/app/order/order.module.ts +++ b/apps/api/src/app/order/order.module.ts @@ -3,13 +3,13 @@ import { CacheModule } from '@ghostfolio/api/app/cache/cache.module'; import { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.module'; import { UserModule } from '@ghostfolio/api/app/user/user.module'; import { ApiModule } from '@ghostfolio/api/services/api/api.module'; -import { ConfigurationModule } from '@ghostfolio/api/services/configuration.module'; -import { DataGatheringModule } from '@ghostfolio/api/services/data-gathering.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 { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data.module'; -import { ImpersonationModule } from '@ghostfolio/api/services/impersonation.module'; -import { PrismaModule } from '@ghostfolio/api/services/prisma.module'; -import { SymbolProfileModule } from '@ghostfolio/api/services/symbol-profile.module'; +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 { 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 b95c96975..be5708a90 100644 --- a/apps/api/src/app/order/order.service.ts +++ b/apps/api/src/app/order/order.service.ts @@ -1,8 +1,8 @@ import { AccountService } from '@ghostfolio/api/app/account/account.service'; -import { DataGatheringService } from '@ghostfolio/api/services/data-gathering.service'; -import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data.service'; -import { PrismaService } from '@ghostfolio/api/services/prisma.service'; -import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile.service'; +import { DataGatheringService } from '@ghostfolio/api/services/data-gathering/data-gathering.service'; +import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; +import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; +import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; import { GATHER_ASSET_PROFILE_PROCESS, GATHER_ASSET_PROFILE_PROCESS_OPTIONS @@ -73,35 +73,37 @@ export class OrderService { dataSource?: DataSource; symbol?: string; tags?: Tag[]; + updateAccountBalance?: boolean; userId: string; } ): Promise { - const defaultAccount = ( - await this.accountService.getAccounts(data.userId) - ).find((account) => { - return account.isDefault === true; - }); + let Account; + + if (data.accountId) { + Account = { + connect: { + id_userId: { + userId: data.userId, + id: data.accountId + } + } + }; + } + const accountId = data.accountId; + let currency = data.currency; const tags = data.tags ?? []; + const updateAccountBalance = data.updateAccountBalance ?? false; + const userId = data.userId; - let Account = { - connect: { - id_userId: { - userId: data.userId, - id: data.accountId ?? defaultAccount?.id - } - } - }; - - if (data.type === 'ITEM') { + if (data.type === 'ITEM' || data.type === 'LIABILITY') { const assetClass = data.assetClass; const assetSubClass = data.assetSubClass; - const currency = data.SymbolProfile.connectOrCreate.create.currency; + currency = data.SymbolProfile.connectOrCreate.create.currency; const dataSource: DataSource = 'MANUAL'; const id = uuidv4(); const name = data.SymbolProfile.connectOrCreate.create.symbol; - Account = undefined; data.id = id; data.SymbolProfile.connectOrCreate.create.assetClass = assetClass; data.SymbolProfile.connectOrCreate.create.assetSubClass = assetSubClass; @@ -113,21 +115,24 @@ export class OrderService { dataSource, symbol: id }; - } else { - data.SymbolProfile.connectOrCreate.create.symbol = - data.SymbolProfile.connectOrCreate.create.symbol.toUpperCase(); } - await this.dataGatheringService.addJobToQueue( - GATHER_ASSET_PROFILE_PROCESS, - { + await this.dataGatheringService.addJobToQueue({ + data: { dataSource: data.SymbolProfile.connectOrCreate.create.dataSource, symbol: data.SymbolProfile.connectOrCreate.create.symbol }, - GATHER_ASSET_PROFILE_PROCESS_OPTIONS - ); + name: GATHER_ASSET_PROFILE_PROCESS, + opts: { + ...GATHER_ASSET_PROFILE_PROCESS_OPTIONS, + jobId: `${data.SymbolProfile.connectOrCreate.create.dataSource}-${data.SymbolProfile.connectOrCreate.create.symbol}` + } + }); - const isDraft = isAfter(data.date as Date, endOfToday()); + const isDraft = + data.type === 'LIABILITY' + ? false + : isAfter(data.date as Date, endOfToday()); if (!isDraft) { // Gather symbol data of order in the background, if not draft @@ -152,11 +157,12 @@ export class OrderService { delete data.dataSource; delete data.symbol; delete data.tags; + delete data.updateAccountBalance; delete data.userId; const orderData: Prisma.OrderCreateInput = data; - return this.prismaService.order.create({ + const order = await this.prismaService.order.create({ data: { ...orderData, Account, @@ -168,6 +174,27 @@ export class OrderService { } } }); + + if (updateAccountBalance === true) { + let amount = new Big(data.unitPrice) + .mul(data.quantity) + .plus(data.fee) + .toNumber(); + + if (data.type === 'BUY') { + amount = new Big(amount).mul(-1).toNumber(); + } + + await this.accountService.updateAccountBalance({ + accountId, + amount, + currency, + userId, + date: data.date as Date + }); + } + + return order; } public async deleteOrder( @@ -177,13 +204,21 @@ export class OrderService { where }); - if (order.type === 'ITEM') { + if (order.type === 'ITEM' || order.type === 'LIABILITY') { await this.symbolProfileService.deleteById(order.symbolProfileId); } return order; } + public async deleteOrders(where: Prisma.OrderWhereInput): Promise { + const { count } = await this.prismaService.order.deleteMany({ + where + }); + + return count; + } + public async getOrders({ filters, includeDrafts = false, @@ -288,7 +323,11 @@ export class OrderService { }) ) .filter((order) => { - return withExcludedAccounts || order.Account?.isExcluded === false; + return ( + withExcludedAccounts || + !order.Account || + order.Account?.isExcluded === false + ); }) .map((order) => { const value = new Big(order.quantity).mul(order.unitPrice).toNumber(); @@ -336,7 +375,7 @@ export class OrderService { let isDraft = false; - if (data.type === 'ITEM') { + if (data.type === 'ITEM' || data.type === 'LIABILITY') { delete data.SymbolProfile.connect; } else { delete data.SymbolProfile.update; @@ -362,6 +401,12 @@ export class OrderService { delete data.symbol; delete data.tags; + // Remove existing tags + await this.prismaService.order.update({ + data: { tags: { set: [] } }, + where + }); + return this.prismaService.order.update({ data: { ...data, diff --git a/apps/api/src/app/order/update-order.dto.ts b/apps/api/src/app/order/update-order.dto.ts index 7c709ea7c..a8c33c40e 100644 --- a/apps/api/src/app/order/update-order.dto.ts +++ b/apps/api/src/app/order/update-order.dto.ts @@ -8,6 +8,7 @@ import { import { Transform, TransformFnParams } from 'class-transformer'; import { IsArray, + IsBoolean, IsEnum, IsISO8601, IsNumber, diff --git a/apps/api/src/app/platform/create-platform.dto.ts b/apps/api/src/app/platform/create-platform.dto.ts new file mode 100644 index 000000000..a61f21743 --- /dev/null +++ b/apps/api/src/app/platform/create-platform.dto.ts @@ -0,0 +1,9 @@ +import { IsString } from 'class-validator'; + +export class CreatePlatformDto { + @IsString() + name: string; + + @IsString() + url: string; +} diff --git a/apps/api/src/app/platform/platform.controller.ts b/apps/api/src/app/platform/platform.controller.ts new file mode 100644 index 000000000..8c4d62bd6 --- /dev/null +++ b/apps/api/src/app/platform/platform.controller.ts @@ -0,0 +1,114 @@ +import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import type { RequestWithUser } from '@ghostfolio/common/types'; +import { + Body, + Controller, + Delete, + Get, + HttpException, + Inject, + Param, + Post, + Put, + UseGuards +} from '@nestjs/common'; +import { REQUEST } from '@nestjs/core'; +import { AuthGuard } from '@nestjs/passport'; +import { Platform } from '@prisma/client'; +import { StatusCodes, getReasonPhrase } from 'http-status-codes'; + +import { CreatePlatformDto } from './create-platform.dto'; +import { PlatformService } from './platform.service'; +import { UpdatePlatformDto } from './update-platform.dto'; + +@Controller('platform') +export class PlatformController { + public constructor( + private readonly platformService: PlatformService, + @Inject(REQUEST) private readonly request: RequestWithUser + ) {} + + @Get() + @UseGuards(AuthGuard('jwt')) + public async getPlatforms() { + return this.platformService.getPlatformsWithAccountCount(); + } + + @Post() + @UseGuards(AuthGuard('jwt')) + public async createPlatform( + @Body() data: CreatePlatformDto + ): Promise { + if ( + !hasPermission(this.request.user.permissions, permissions.createPlatform) + ) { + throw new HttpException( + getReasonPhrase(StatusCodes.FORBIDDEN), + StatusCodes.FORBIDDEN + ); + } + return this.platformService.createPlatform(data); + } + + @Put(':id') + @UseGuards(AuthGuard('jwt')) + public async updatePlatform( + @Param('id') id: string, + @Body() data: UpdatePlatformDto + ) { + if ( + !hasPermission(this.request.user.permissions, permissions.updatePlatform) + ) { + throw new HttpException( + getReasonPhrase(StatusCodes.FORBIDDEN), + StatusCodes.FORBIDDEN + ); + } + + const originalPlatform = await this.platformService.getPlatform({ + id + }); + + if (!originalPlatform) { + throw new HttpException( + getReasonPhrase(StatusCodes.FORBIDDEN), + StatusCodes.FORBIDDEN + ); + } + + return this.platformService.updatePlatform({ + data: { + ...data + }, + where: { + id + } + }); + } + + @Delete(':id') + @UseGuards(AuthGuard('jwt')) + public async deletePlatform(@Param('id') id: string) { + if ( + !hasPermission(this.request.user.permissions, permissions.deletePlatform) + ) { + throw new HttpException( + getReasonPhrase(StatusCodes.FORBIDDEN), + StatusCodes.FORBIDDEN + ); + } + + const originalPlatform = await this.platformService.getPlatform({ + id + }); + + if (!originalPlatform) { + throw new HttpException( + getReasonPhrase(StatusCodes.FORBIDDEN), + StatusCodes.FORBIDDEN + ); + } + + return this.platformService.deletePlatform({ id }); + } +} diff --git a/apps/api/src/app/platform/platform.module.ts b/apps/api/src/app/platform/platform.module.ts new file mode 100644 index 000000000..04ccdf4d6 --- /dev/null +++ b/apps/api/src/app/platform/platform.module.ts @@ -0,0 +1,13 @@ +import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; +import { Module } from '@nestjs/common'; + +import { PlatformController } from './platform.controller'; +import { PlatformService } from './platform.service'; + +@Module({ + controllers: [PlatformController], + exports: [PlatformService], + imports: [PrismaModule], + providers: [PlatformService] +}) +export class PlatformModule {} diff --git a/apps/api/src/app/platform/platform.service.ts b/apps/api/src/app/platform/platform.service.ts new file mode 100644 index 000000000..12d107604 --- /dev/null +++ b/apps/api/src/app/platform/platform.service.ts @@ -0,0 +1,83 @@ +import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; +import { Injectable } from '@nestjs/common'; +import { Platform, Prisma } from '@prisma/client'; + +@Injectable() +export class PlatformService { + public constructor(private readonly prismaService: PrismaService) {} + + public async getPlatform( + platformWhereUniqueInput: Prisma.PlatformWhereUniqueInput + ): Promise { + return this.prismaService.platform.findUnique({ + where: platformWhereUniqueInput + }); + } + + public async getPlatforms({ + cursor, + orderBy, + skip, + take, + where + }: { + cursor?: Prisma.PlatformWhereUniqueInput; + orderBy?: Prisma.PlatformOrderByWithRelationInput; + skip?: number; + take?: number; + where?: Prisma.PlatformWhereInput; + } = {}) { + return this.prismaService.platform.findMany({ + cursor, + orderBy, + skip, + take, + where + }); + } + + public async getPlatformsWithAccountCount() { + const platformsWithAccountCount = + await this.prismaService.platform.findMany({ + include: { + _count: { + select: { Account: true } + } + } + }); + + return platformsWithAccountCount.map(({ _count, id, name, url }) => { + return { + id, + name, + url, + accountCount: _count.Account + }; + }); + } + + public async createPlatform(data: Prisma.PlatformCreateInput) { + return this.prismaService.platform.create({ + data + }); + } + + public async updatePlatform({ + data, + where + }: { + data: Prisma.PlatformUpdateInput; + where: Prisma.PlatformWhereUniqueInput; + }): Promise { + return this.prismaService.platform.update({ + data, + where + }); + } + + public async deletePlatform( + where: Prisma.PlatformWhereUniqueInput + ): Promise { + return this.prismaService.platform.delete({ where }); + } +} diff --git a/apps/api/src/app/platform/update-platform.dto.ts b/apps/api/src/app/platform/update-platform.dto.ts new file mode 100644 index 000000000..ec6f2687c --- /dev/null +++ b/apps/api/src/app/platform/update-platform.dto.ts @@ -0,0 +1,12 @@ +import { IsString } from 'class-validator'; + +export class UpdatePlatformDto { + @IsString() + id: string; + + @IsString() + name: string; + + @IsString() + url: string; +} 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 004f642bf..a9dc03acf 100644 --- a/apps/api/src/app/portfolio/current-rate.service.mock.ts +++ b/apps/api/src/app/portfolio/current-rate.service.mock.ts @@ -2,6 +2,7 @@ import { parseDate, resetHours } from '@ghostfolio/common/helper'; import { addDays, endOfDay, isBefore, isSameDay } from 'date-fns'; import { GetValueObject } from './interfaces/get-value-object.interface'; +import { GetValuesObject } from './interfaces/get-values-object.interface'; import { GetValuesParams } from './interfaces/get-values-params.interface'; function mockGetValue(symbol: string, date: Date) { @@ -48,8 +49,9 @@ export const CurrentRateServiceMock = { getValues: ({ dataGatheringItems, dateQuery - }: GetValuesParams): Promise => { - const result: GetValueObject[] = []; + }: GetValuesParams): Promise => { + const values: GetValueObject[] = []; + if (dateQuery.lt) { for ( let date = resetHours(dateQuery.gte); @@ -57,7 +59,7 @@ export const CurrentRateServiceMock = { date = addDays(date, 1) ) { for (const dataGatheringItem of dataGatheringItems) { - result.push({ + values.push({ date, marketPriceInBaseCurrency: mockGetValue( dataGatheringItem.symbol, @@ -70,7 +72,7 @@ export const CurrentRateServiceMock = { } else { for (const date of dateQuery.in) { for (const dataGatheringItem of dataGatheringItems) { - result.push({ + values.push({ date, marketPriceInBaseCurrency: mockGetValue( dataGatheringItem.symbol, @@ -81,6 +83,7 @@ export const CurrentRateServiceMock = { } } } - return Promise.resolve(result); + + return Promise.resolve({ values, dataProviderInfos: [], errors: [] }); } }; 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 2ef8ad5fa..c9711aa7b 100644 --- a/apps/api/src/app/portfolio/current-rate.service.spec.ts +++ b/apps/api/src/app/portfolio/current-rate.service.spec.ts @@ -1,12 +1,13 @@ import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; -import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data.service'; -import { MarketDataService } from '@ghostfolio/api/services/market-data.service'; +import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; +import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; +import { PropertyService } from '@ghostfolio/api/services/property/property.service'; import { DataSource, MarketData } from '@prisma/client'; import { CurrentRateService } from './current-rate.service'; -import { GetValueObject } from './interfaces/get-value-object.interface'; +import { GetValuesObject } from './interfaces/get-values-object.interface'; -jest.mock('@ghostfolio/api/services/market-data.service', () => { +jest.mock('@ghostfolio/api/services/market-data/market-data.service', () => { return { MarketDataService: jest.fn().mockImplementation(() => { return { @@ -17,7 +18,8 @@ jest.mock('@ghostfolio/api/services/market-data.service', () => { createdAt: date, dataSource: DataSource.YAHOO, id: 'aefcbe3a-ee10-4c4f-9f2d-8ffad7b05584', - marketPrice: 1847.839966 + marketPrice: 1847.839966, + state: 'CLOSE' }); }, getRange: ({ @@ -36,6 +38,7 @@ jest.mock('@ghostfolio/api/services/market-data.service', () => { date: dateRangeStart, id: '8fa48fde-f397-4b0d-adbc-fb940e830e6d', marketPrice: 1841.823902, + state: 'CLOSE', symbol: symbols[0] }, { @@ -44,6 +47,7 @@ jest.mock('@ghostfolio/api/services/market-data.service', () => { date: dateRangeEnd, id: '082d6893-df27-4c91-8a5d-092e84315b56', marketPrice: 1847.839966, + state: 'CLOSE', symbol: symbols[0] } ]); @@ -53,14 +57,27 @@ jest.mock('@ghostfolio/api/services/market-data.service', () => { }; }); -jest.mock('@ghostfolio/api/services/exchange-rate-data.service', () => { +jest.mock( + '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service', + () => { + return { + ExchangeRateDataService: jest.fn().mockImplementation(() => { + return { + initialize: () => Promise.resolve(), + toCurrency: (value: number) => { + return 1 * value; + } + }; + }) + }; + } +); + +jest.mock('@ghostfolio/api/services/property/property.service', () => { return { - ExchangeRateDataService: jest.fn().mockImplementation(() => { + PropertyService: jest.fn().mockImplementation(() => { return { - initialize: () => Promise.resolve(), - toCurrency: (value: number) => { - return 1 * value; - } + getByKey: (key: string) => Promise.resolve({}) }; }) }; @@ -71,13 +88,24 @@ describe('CurrentRateService', () => { let dataProviderService: DataProviderService; let exchangeRateDataService: ExchangeRateDataService; let marketDataService: MarketDataService; + let propertyService: PropertyService; beforeAll(async () => { - dataProviderService = new DataProviderService(null, [], null); + propertyService = new PropertyService(null); + + dataProviderService = new DataProviderService( + null, + [], + null, + null, + propertyService, + null + ); exchangeRateDataService = new ExchangeRateDataService( null, null, null, + null, null ); marketDataService = new MarketDataService(null); @@ -102,17 +130,16 @@ describe('CurrentRateService', () => { }, userCurrency: 'CHF' }) - ).toMatchObject([ - { - date: undefined, - marketPriceInBaseCurrency: 1841.823902, - symbol: 'AMZN' - }, - { - date: undefined, - marketPriceInBaseCurrency: 1847.839966, - symbol: 'AMZN' - } - ]); + ).toMatchObject({ + dataProviderInfos: [], + errors: [], + values: [ + { + date: undefined, + marketPriceInBaseCurrency: 1841.823902, + symbol: 'AMZN' + } + ] + }); }); }); diff --git a/apps/api/src/app/portfolio/current-rate.service.ts b/apps/api/src/app/portfolio/current-rate.service.ts index 86020ce2e..6d48573f7 100644 --- a/apps/api/src/app/portfolio/current-rate.service.ts +++ b/apps/api/src/app/portfolio/current-rate.service.ts @@ -1,12 +1,14 @@ import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; -import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data.service'; -import { MarketDataService } from '@ghostfolio/api/services/market-data.service'; +import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; +import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; import { resetHours } from '@ghostfolio/common/helper'; +import { DataProviderInfo, ResponseError } from '@ghostfolio/common/interfaces'; import { Injectable } from '@nestjs/common'; import { isBefore, isToday } from 'date-fns'; -import { flatten } from 'lodash'; +import { flatten, isEmpty, uniqBy } from 'lodash'; import { GetValueObject } from './interfaces/get-value-object.interface'; +import { GetValuesObject } from './interfaces/get-values-object.interface'; import { GetValuesParams } from './interfaces/get-values-params.interface'; @Injectable() @@ -22,34 +24,52 @@ export class CurrentRateService { dataGatheringItems, dateQuery, userCurrency - }: GetValuesParams): Promise { + }: GetValuesParams): Promise { + const dataProviderInfos: DataProviderInfo[] = []; const includeToday = (!dateQuery.lt || isBefore(new Date(), dateQuery.lt)) && (!dateQuery.gte || isBefore(dateQuery.gte, new Date())) && (!dateQuery.in || this.containsToday(dateQuery.in)); const promises: Promise[] = []; + const quoteErrors: ResponseError['errors'] = []; + const today = resetHours(new Date()); if (includeToday) { - const today = resetHours(new Date()); promises.push( this.dataProviderService .getQuotes(dataGatheringItems) .then((dataResultProvider) => { const result: GetValueObject[] = []; for (const dataGatheringItem of dataGatheringItems) { - result.push({ - date: today, - marketPriceInBaseCurrency: - this.exchangeRateDataService.toCurrency( - dataResultProvider?.[dataGatheringItem.symbol] - ?.marketPrice ?? 0, - dataResultProvider?.[dataGatheringItem.symbol]?.currency, - userCurrency - ), - symbol: dataGatheringItem.symbol - }); + if ( + dataResultProvider?.[dataGatheringItem.symbol]?.dataProviderInfo + ) { + dataProviderInfos.push( + dataResultProvider[dataGatheringItem.symbol].dataProviderInfo + ); + } + + if (dataResultProvider?.[dataGatheringItem.symbol]?.marketPrice) { + result.push({ + date: today, + marketPriceInBaseCurrency: + this.exchangeRateDataService.toCurrency( + dataResultProvider?.[dataGatheringItem.symbol] + ?.marketPrice, + dataResultProvider?.[dataGatheringItem.symbol]?.currency, + userCurrency + ), + symbol: dataGatheringItem.symbol + }); + } else { + quoteErrors.push({ + dataSource: dataGatheringItem.dataSource, + symbol: dataGatheringItem.symbol + }); + } } + return result; }) ); @@ -81,7 +101,60 @@ export class CurrentRateService { }) ); - return flatten(await Promise.all(promises)); + const values = flatten(await Promise.all(promises)); + + const response: GetValuesObject = { + dataProviderInfos, + errors: quoteErrors.map(({ dataSource, symbol }) => { + return { dataSource, symbol }; + }), + values: uniqBy(values, ({ date, symbol }) => `${date}-${symbol}`) + }; + + if (!isEmpty(quoteErrors)) { + for (const { symbol } of quoteErrors) { + try { + // If missing quote, fallback to the latest available historical market price + let value: GetValueObject = response.values.find((currentValue) => { + return currentValue.symbol === symbol && isToday(currentValue.date); + }); + + if (!value) { + value = { + symbol, + date: today, + marketPriceInBaseCurrency: 0 + }; + + response.values.push(value); + } + + const [latestValue] = response.values + .filter((currentValue) => { + return ( + currentValue.symbol === symbol && + currentValue.marketPriceInBaseCurrency + ); + }) + .sort((a, b) => { + if (a.date < b.date) { + return 1; + } + + if (a.date > b.date) { + return -1; + } + + return 0; + }); + + value.marketPriceInBaseCurrency = + latestValue.marketPriceInBaseCurrency; + } catch {} + } + } + + return response; } private containsToday(dates: Date[]): boolean { diff --git a/apps/api/src/app/portfolio/interfaces/get-values-object.interface.ts b/apps/api/src/app/portfolio/interfaces/get-values-object.interface.ts new file mode 100644 index 000000000..ef6cb8f96 --- /dev/null +++ b/apps/api/src/app/portfolio/interfaces/get-values-object.interface.ts @@ -0,0 +1,9 @@ +import { DataProviderInfo, ResponseError } from '@ghostfolio/common/interfaces'; + +import { GetValueObject } from './get-value-object.interface'; + +export interface GetValuesObject { + dataProviderInfos: DataProviderInfo[]; + errors: ResponseError['errors']; + values: GetValueObject[]; +} 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 4d13a1ae3..827aa25fe 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 @@ -1,4 +1,5 @@ import { + DataProviderInfo, EnhancedSymbolProfile, HistoricalDataItem } from '@ghostfolio/common/interfaces'; @@ -7,6 +8,9 @@ import { Tag } from '@prisma/client'; export interface PortfolioPositionDetail { averagePrice: number; + dataProviderInfo: DataProviderInfo; + dividendInBaseCurrency: number; + feeInBaseCurrency: number; firstBuyDate: string; grossPerformance: number; grossPerformancePercent: number; 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 d826e1d0e..c66323c72 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 @@ -64,7 +64,8 @@ describe('PortfolioCalculator', () => { const investments = portfolioCalculator.getInvestments(); - const investmentsByMonth = portfolioCalculator.getInvestmentsByMonth(); + const investmentsByMonth = + portfolioCalculator.getInvestmentsByGroup('month'); spy.mockRestore(); @@ -81,6 +82,7 @@ describe('PortfolioCalculator', () => { averagePrice: new Big('0'), currency: 'CHF', dataSource: 'YAHOO', + fee: new Big('3.2'), firstBuyDate: '2021-11-22', grossPerformance: new Big('-12.6'), grossPerformancePercentage: new Big('-0.0440867739678096571'), 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 b8cc6050a..9f49c13e0 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 @@ -53,7 +53,8 @@ describe('PortfolioCalculator', () => { const investments = portfolioCalculator.getInvestments(); - const investmentsByMonth = portfolioCalculator.getInvestmentsByMonth(); + const investmentsByMonth = + portfolioCalculator.getInvestmentsByGroup('month'); spy.mockRestore(); @@ -70,6 +71,7 @@ describe('PortfolioCalculator', () => { averagePrice: new Big('136.6'), currency: 'CHF', dataSource: 'YAHOO', + fee: new Big('1.55'), firstBuyDate: '2021-11-30', grossPerformance: new Big('24.6'), grossPerformancePercentage: new Big('0.09004392386530014641'), 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 ddb46c9a3..e0761ebe5 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 @@ -64,7 +64,8 @@ describe('PortfolioCalculator', () => { const investments = portfolioCalculator.getInvestments(); - const investmentsByMonth = portfolioCalculator.getInvestmentsByMonth(); + const investmentsByMonth = + portfolioCalculator.getInvestmentsByGroup('month'); spy.mockRestore(); @@ -81,6 +82,7 @@ describe('PortfolioCalculator', () => { averagePrice: new Big('320.43'), currency: 'CHF', dataSource: 'YAHOO', + fee: new Big('0'), firstBuyDate: '2015-01-01', grossPerformance: new Big('27172.74'), grossPerformancePercentage: new Big('42.40043067128546016291'), @@ -103,6 +105,40 @@ describe('PortfolioCalculator', () => { expect(investmentsByMonth).toEqual([ { date: '2015-01-01', investment: new Big('640.86') }, + { date: '2015-02-01', investment: new Big('0') }, + { date: '2015-03-01', investment: new Big('0') }, + { date: '2015-04-01', investment: new Big('0') }, + { date: '2015-05-01', investment: new Big('0') }, + { date: '2015-06-01', investment: new Big('0') }, + { date: '2015-07-01', investment: new Big('0') }, + { date: '2015-08-01', investment: new Big('0') }, + { date: '2015-09-01', investment: new Big('0') }, + { date: '2015-10-01', investment: new Big('0') }, + { date: '2015-11-01', investment: new Big('0') }, + { date: '2015-12-01', investment: new Big('0') }, + { date: '2016-01-01', investment: new Big('0') }, + { date: '2016-02-01', investment: new Big('0') }, + { date: '2016-03-01', investment: new Big('0') }, + { date: '2016-04-01', investment: new Big('0') }, + { date: '2016-05-01', investment: new Big('0') }, + { date: '2016-06-01', investment: new Big('0') }, + { date: '2016-07-01', investment: new Big('0') }, + { date: '2016-08-01', investment: new Big('0') }, + { date: '2016-09-01', investment: new Big('0') }, + { date: '2016-10-01', investment: new Big('0') }, + { date: '2016-11-01', investment: new Big('0') }, + { date: '2016-12-01', investment: new Big('0') }, + { date: '2017-01-01', investment: new Big('0') }, + { date: '2017-02-01', investment: new Big('0') }, + { date: '2017-03-01', investment: new Big('0') }, + { date: '2017-04-01', investment: new Big('0') }, + { date: '2017-05-01', investment: new Big('0') }, + { date: '2017-06-01', investment: new Big('0') }, + { date: '2017-07-01', investment: new Big('0') }, + { date: '2017-08-01', investment: new Big('0') }, + { date: '2017-09-01', investment: new Big('0') }, + { date: '2017-10-01', investment: new Big('0') }, + { date: '2017-11-01', investment: new Big('0') }, { date: '2017-12-01', investment: new Big('-14156.4') } ]); }); 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 32935a20e..a26426017 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 @@ -41,7 +41,8 @@ describe('PortfolioCalculator', () => { const investments = portfolioCalculator.getInvestments(); - const investmentsByMonth = portfolioCalculator.getInvestmentsByMonth(); + const investmentsByMonth = + portfolioCalculator.getInvestmentsByGroup('month'); spy.mockRestore(); 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 f3b3e5881..6adfc9347 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 @@ -64,7 +64,8 @@ describe('PortfolioCalculator', () => { const investments = portfolioCalculator.getInvestments(); - const investmentsByMonth = portfolioCalculator.getInvestmentsByMonth(); + const investmentsByMonth = + portfolioCalculator.getInvestmentsByGroup('month'); spy.mockRestore(); @@ -81,6 +82,7 @@ describe('PortfolioCalculator', () => { averagePrice: new Big('75.80'), currency: 'CHF', dataSource: 'YAHOO', + fee: new Big('4.25'), firstBuyDate: '2022-03-07', grossPerformance: new Big('21.93'), grossPerformancePercentage: new Big('0.14465699208443271768'), 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 new file mode 100644 index 000000000..feed5923b --- /dev/null +++ b/apps/api/src/app/portfolio/portfolio-calculator-novn-buy-and-sell.spec.ts @@ -0,0 +1,132 @@ +import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.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; + + beforeEach(() => { + currentRateService = new CurrentRateService(null, null, null); + }); + + describe('get current positions', () => { + it.only('with NOVN.SW buy and sell', async () => { + const portfolioCalculator = new PortfolioCalculator({ + currentRateService, + currency: 'CHF', + orders: [ + { + currency: 'CHF', + date: '2022-03-07', + dataSource: 'YAHOO', + fee: new Big(0), + name: 'Novartis AG', + quantity: new Big(2), + symbol: 'NOVN.SW', + type: 'BUY', + unitPrice: new Big(75.8) + }, + { + currency: 'CHF', + date: '2022-04-08', + dataSource: 'YAHOO', + fee: new Big(0), + name: 'Novartis AG', + quantity: new Big(2), + symbol: 'NOVN.SW', + type: 'SELL', + unitPrice: new Big(85.73) + } + ] + }); + + portfolioCalculator.computeTransactionPoints(); + + const spy = jest + .spyOn(Date, 'now') + .mockImplementation(() => parseDate('2022-04-11').getTime()); + + const chartData = await portfolioCalculator.getChartData( + parseDate('2022-03-07') + ); + + const currentPositions = await portfolioCalculator.getCurrentPositions( + parseDate('2022-03-07') + ); + + const investments = portfolioCalculator.getInvestments(); + + const investmentsByMonth = + portfolioCalculator.getInvestmentsByGroup('month'); + + spy.mockRestore(); + + expect(chartData[0]).toEqual({ + date: '2022-03-07', + netPerformanceInPercentage: 0, + netPerformance: 0, + totalInvestment: 151.6, + value: 151.6 + }); + + expect(chartData[chartData.length - 1]).toEqual({ + date: '2022-04-11', + netPerformanceInPercentage: 13.100263852242744, + netPerformance: 19.86, + totalInvestment: 0, + value: 0 + }); + + expect(currentPositions).toEqual({ + currentValue: new Big('0'), + errors: [], + grossPerformance: new Big('19.86'), + grossPerformancePercentage: new Big('0.13100263852242744063'), + hasErrors: false, + netPerformance: new Big('19.86'), + netPerformancePercentage: new Big('0.13100263852242744063'), + positions: [ + { + averagePrice: new Big('0'), + currency: 'CHF', + dataSource: 'YAHOO', + fee: new Big('0'), + firstBuyDate: '2022-03-07', + grossPerformance: new Big('19.86'), + grossPerformancePercentage: new Big('0.13100263852242744063'), + investment: new Big('0'), + netPerformance: new Big('19.86'), + netPerformancePercentage: new Big('0.13100263852242744063'), + marketPrice: 87.8, + quantity: new Big('0'), + symbol: 'NOVN.SW', + transactionCount: 2 + } + ], + totalInvestment: new Big('0') + }); + + expect(investments).toEqual([ + { date: '2022-03-07', investment: new Big('151.6') }, + { date: '2022-04-08', investment: new Big('0') } + ]); + + expect(investmentsByMonth).toEqual([ + { date: '2022-03-01', investment: new Big('151.6') }, + { date: '2022-04-01', investment: new Big('-171.46') } + ]); + }); + }); +}); diff --git a/apps/api/src/app/portfolio/portfolio-calculator.ts b/apps/api/src/app/portfolio/portfolio-calculator.ts index ea1f8e10c..9addb29dd 100644 --- a/apps/api/src/app/portfolio/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/portfolio-calculator.ts @@ -1,7 +1,12 @@ import { TimelineInfoInterface } from '@ghostfolio/api/app/portfolio/interfaces/timeline-info.interface'; import { IDataGatheringItem } from '@ghostfolio/api/services/interfaces/interfaces'; import { DATE_FORMAT, parseDate, resetHours } from '@ghostfolio/common/helper'; -import { ResponseError, TimelinePosition } from '@ghostfolio/common/interfaces'; +import { + DataProviderInfo, + ResponseError, + 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'; @@ -19,9 +24,10 @@ import { isSameYear, max, min, - set + set, + subDays } from 'date-fns'; -import { first, flatten, isNumber, last, sortBy } from 'lodash'; +import { first, flatten, isNumber, last, sortBy, uniq } from 'lodash'; import { CurrentRateService } from './current-rate.service'; import { CurrentPositions } from './interfaces/current-positions.interface'; @@ -44,6 +50,7 @@ export class PortfolioCalculator { private currency: string; private currentRateService: CurrentRateService; + private dataProviderInfos: DataProviderInfo[]; private orders: PortfolioOrder[]; private transactionPoints: TransactionPoint[]; @@ -176,10 +183,10 @@ export class PortfolioCalculator { return isBefore(parseDate(transactionPoint.date), end); }) ?? []; - const firstIndex = transactionPointsBeforeEndDate.length; + const currencies: { [symbol: string]: string } = {}; const dates: Date[] = []; const dataGatheringItems: IDataGatheringItem[] = []; - const currencies: { [symbol: string]: string } = {}; + const firstIndex = transactionPointsBeforeEndDate.length; let day = start; @@ -201,14 +208,17 @@ export class PortfolioCalculator { symbols[item.symbol] = true; } - const marketSymbols = await this.currentRateService.getValues({ - currencies, - dataGatheringItems, - dateQuery: { - in: dates - }, - userCurrency: this.currency - }); + const { dataProviderInfos, values: marketSymbols } = + await this.currentRateService.getValues({ + currencies, + dataGatheringItems, + dateQuery: { + in: dates + }, + userCurrency: this.currency + }); + + this.dataProviderInfos = dataProviderInfos; const marketSymbolMap: { [date: string]: { [symbol: string]: Big }; @@ -226,19 +236,31 @@ export class PortfolioCalculator { } } - const netPerformanceValuesBySymbol: { - [symbol: string]: { [date: string]: Big }; + const valuesByDate: { + [date: string]: { + maxTotalInvestmentValue: Big; + totalCurrentValue: Big; + totalInvestmentValue: Big; + totalNetPerformanceValue: Big; + }; } = {}; - const investmentValuesBySymbol: { - [symbol: string]: { [date: string]: Big }; + const valuesBySymbol: { + [symbol: string]: { + currentValues: { [date: string]: Big }; + investmentValues: { [date: string]: Big }; + maxInvestmentValues: { [date: string]: Big }; + netPerformanceValues: { [date: string]: Big }; + }; } = {}; - const totalNetPerformanceValues: { [date: string]: Big } = {}; - const totalInvestmentValues: { [date: string]: Big } = {}; - for (const symbol of Object.keys(symbols)) { - const { netPerformanceValues, investmentValues } = this.getSymbolMetrics({ + const { + currentValues, + investmentValues, + maxInvestmentValues, + netPerformanceValues + } = this.getSymbolMetrics({ end, marketSymbolMap, start, @@ -247,50 +269,67 @@ export class PortfolioCalculator { isChartMode: true }); - netPerformanceValuesBySymbol[symbol] = netPerformanceValues; - investmentValuesBySymbol[symbol] = investmentValues; + valuesBySymbol[symbol] = { + currentValues, + investmentValues, + maxInvestmentValues, + netPerformanceValues + }; } for (const currentDate of dates) { const dateString = format(currentDate, DATE_FORMAT); - for (const symbol of Object.keys(netPerformanceValuesBySymbol)) { - totalNetPerformanceValues[dateString] = - totalNetPerformanceValues[dateString] ?? new Big(0); - - if (netPerformanceValuesBySymbol[symbol]?.[dateString]) { - totalNetPerformanceValues[dateString] = totalNetPerformanceValues[ - dateString - ].add(netPerformanceValuesBySymbol[symbol][dateString]); - } - - totalInvestmentValues[dateString] = - totalInvestmentValues[dateString] ?? new Big(0); - - if (investmentValuesBySymbol[symbol]?.[dateString]) { - totalInvestmentValues[dateString] = totalInvestmentValues[ - dateString - ].add(investmentValuesBySymbol[symbol][dateString]); - } + for (const symbol of Object.keys(valuesBySymbol)) { + const symbolValues = valuesBySymbol[symbol]; + + const currentValue = + symbolValues.currentValues?.[dateString] ?? new Big(0); + const investmentValue = + symbolValues.investmentValues?.[dateString] ?? new Big(0); + const maxInvestmentValue = + symbolValues.maxInvestmentValues?.[dateString] ?? new Big(0); + const netPerformanceValue = + symbolValues.netPerformanceValues?.[dateString] ?? new Big(0); + + valuesByDate[dateString] = { + totalCurrentValue: ( + valuesByDate[dateString]?.totalCurrentValue ?? new Big(0) + ).add(currentValue), + totalInvestmentValue: ( + valuesByDate[dateString]?.totalInvestmentValue ?? new Big(0) + ).add(investmentValue), + maxTotalInvestmentValue: ( + valuesByDate[dateString]?.maxTotalInvestmentValue ?? new Big(0) + ).add(maxInvestmentValue), + totalNetPerformanceValue: ( + valuesByDate[dateString]?.totalNetPerformanceValue ?? new Big(0) + ).add(netPerformanceValue) + }; } } - return Object.keys(totalNetPerformanceValues).map((date) => { - const netPerformanceInPercentage = totalInvestmentValues[date].eq(0) + return Object.entries(valuesByDate).map(([date, values]) => { + const { + maxTotalInvestmentValue, + totalCurrentValue, + totalInvestmentValue, + totalNetPerformanceValue + } = values; + + const netPerformanceInPercentage = maxTotalInvestmentValue.eq(0) ? 0 - : totalNetPerformanceValues[date] - .div(totalInvestmentValues[date]) + : totalNetPerformanceValue + .div(maxTotalInvestmentValue) .mul(100) .toNumber(); return { date, netPerformanceInPercentage, - netPerformance: totalNetPerformanceValues[date].toNumber(), - totalInvestment: totalInvestmentValues[date].toNumber(), - value: totalInvestmentValues[date] - .plus(totalNetPerformanceValues[date]) - .toNumber() + netPerformance: totalNetPerformanceValue.toNumber(), + totalInvestment: totalInvestmentValue.toNumber(), + value: totalCurrentValue.toNumber() }; }); } @@ -322,7 +361,7 @@ export class PortfolioCalculator { let firstTransactionPoint: TransactionPoint = null; let firstIndex = transactionPointsBeforeEndDate.length; - const dates = []; + let dates = []; const dataGatheringItems: IDataGatheringItem[] = []; const currencies: { [symbol: string]: string } = {}; @@ -351,7 +390,30 @@ export class PortfolioCalculator { dates.push(resetHours(end)); - const marketSymbols = await this.currentRateService.getValues({ + // Add dates of last week for fallback + dates.push(subDays(resetHours(new Date()), 7)); + dates.push(subDays(resetHours(new Date()), 6)); + dates.push(subDays(resetHours(new Date()), 5)); + dates.push(subDays(resetHours(new Date()), 4)); + dates.push(subDays(resetHours(new Date()), 3)); + dates.push(subDays(resetHours(new Date()), 2)); + dates.push(subDays(resetHours(new Date()), 1)); + dates.push(resetHours(new Date())); + + dates = uniq( + dates.map((date) => { + return date.getTime(); + }) + ).map((timestamp) => { + return new Date(timestamp); + }); + dates.sort((a, b) => a.getTime() - b.getTime()); + + const { + dataProviderInfos, + errors: currentRateErrors, + values: marketSymbols + } = await this.currentRateService.getValues({ currencies, dataGatheringItems, dateQuery: { @@ -360,6 +422,8 @@ export class PortfolioCalculator { userCurrency: this.currency }); + this.dataProviderInfos = dataProviderInfos; + const marketSymbolMap: { [date: string]: { [symbol: string]: Big }; } = {}; @@ -414,6 +478,7 @@ export class PortfolioCalculator { : item.investment.div(item.quantity), currency: item.currency, dataSource: item.dataSource, + fee: item.fee, firstBuyDate: item.firstBuyDate, grossPerformance: !hasErrors ? grossPerformance ?? null : null, grossPerformancePercentage: !hasErrors @@ -430,7 +495,13 @@ export class PortfolioCalculator { transactionCount: item.transactionCount }); - if (hasErrors) { + if ( + (hasErrors || + currentRateErrors.find(({ dataSource, symbol }) => { + return dataSource === item.dataSource && symbol === item.symbol; + })) && + item.investment.gt(0) + ) { errors.push({ dataSource: item.dataSource, symbol: item.symbol }); } } @@ -445,6 +516,10 @@ export class PortfolioCalculator { }; } + public getDataProviderInfos() { + return this.dataProviderInfos; + } + public getInvestments(): { date: string; investment: Big }[] { if (this.transactionPoints.length === 0) { return []; @@ -462,51 +537,95 @@ export class PortfolioCalculator { }); } - public getInvestmentsByMonth(): { date: string; investment: Big }[] { + public getInvestmentsByGroup( + groupBy: GroupBy + ): { date: string; investment: Big }[] { if (this.orders.length === 0) { return []; } - const investments = []; + const investments: { date: string; investment: Big }[] = []; let currentDate: Date; - let investmentByMonth = new Big(0); + let investmentByGroup = new Big(0); for (const [index, order] of this.orders.entries()) { if ( - isSameMonth(parseDate(order.date), currentDate) && - isSameYear(parseDate(order.date), currentDate) + isSameYear(parseDate(order.date), currentDate) && + (groupBy === 'year' || isSameMonth(parseDate(order.date), currentDate)) ) { - // Same month: Add up investments - - investmentByMonth = investmentByMonth.plus( + // Same group: Add up investments + investmentByGroup = investmentByGroup.plus( order.quantity.mul(order.unitPrice).mul(this.getFactor(order.type)) ); } else { - // New month: Store previous month and reset - + // New group: Store previous group and reset if (currentDate) { investments.push({ - date: format(set(currentDate, { date: 1 }), DATE_FORMAT), - investment: investmentByMonth + date: format( + set(currentDate, { + date: 1, + month: groupBy === 'year' ? 0 : currentDate.getMonth() + }), + DATE_FORMAT + ), + investment: investmentByGroup }); } currentDate = parseDate(order.date); - investmentByMonth = order.quantity + investmentByGroup = order.quantity .mul(order.unitPrice) .mul(this.getFactor(order.type)); } if (index === this.orders.length - 1) { - // Store current month (latest order) + // Store current group (latest order) investments.push({ - date: format(set(currentDate, { date: 1 }), DATE_FORMAT), - investment: investmentByMonth + date: format( + set(currentDate, { + date: 1, + month: groupBy === 'year' ? 0 : currentDate.getMonth() + }), + DATE_FORMAT + ), + investment: investmentByGroup }); } } - return investments; + // Fill in the missing dates with investment = 0 + const startDate = parseDate(first(this.orders).date); + const endDate = parseDate(last(this.orders).date); + + const allDates: string[] = []; + currentDate = startDate; + + while (currentDate <= endDate) { + allDates.push( + format( + set(currentDate, { + date: 1, + month: groupBy === 'year' ? 0 : currentDate.getMonth() + }), + DATE_FORMAT + ) + ); + currentDate.setMonth(currentDate.getMonth() + 1); + } + + for (const date of allDates) { + const existingInvestment = investments.find((investment) => { + return investment.date === date; + }); + + if (!existingInvestment) { + investments.push({ date, investment: new Big(0) }); + } + } + + return sortBy(investments, (investment) => { + return investment.date; + }); } public async calculateTimeline( @@ -662,7 +781,7 @@ export class PortfolioCalculator { ); } else if (!currentPosition.quantity.eq(0)) { Logger.warn( - `Missing initial value for symbol ${currentPosition.symbol} at ${currentPosition.firstBuyDate}`, + `Missing historical market data for symbol ${currentPosition.symbol}`, 'PortfolioCalculator' ); hasErrors = true; @@ -716,7 +835,7 @@ export class PortfolioCalculator { let marketSymbols: GetValueObject[] = []; if (dataGatheringItems.length > 0) { try { - marketSymbols = await this.currentRateService.getValues({ + const { values } = await this.currentRateService.getValues({ currencies, dataGatheringItems, dateQuery: { @@ -725,6 +844,7 @@ export class PortfolioCalculator { }, userCurrency: this.currency }); + marketSymbols = values; } catch (error) { Logger.error( `Failed to fetch info for date ${startDate} with exception`, @@ -858,12 +978,16 @@ export class PortfolioCalculator { if (orders.length <= 0) { return { + currentValues: {}, + grossPerformance: new Big(0), + grossPerformancePercentage: new Big(0), hasErrors: false, initialValue: new Big(0), + investmentValues: {}, + maxInvestmentValues: {}, netPerformance: new Big(0), netPerformancePercentage: new Big(0), - grossPerformance: new Big(0), - grossPerformancePercentage: new Big(0) + netPerformanceValues: {} }; } @@ -898,14 +1022,12 @@ export class PortfolioCalculator { let grossPerformanceFromSells = new Big(0); let initialValue: Big; let investmentAtStartDate: Big; + const currentValues: { [date: string]: Big } = {}; const investmentValues: { [date: string]: Big } = {}; + const maxInvestmentValues: { [date: string]: Big } = {}; let lastAveragePrice = new Big(0); - // let lastTransactionInvestment = new Big(0); - // let lastValueOfInvestmentBeforeTransaction = new Big(0); let maxTotalInvestment = new Big(0); const netPerformanceValues: { [date: string]: Big } = {}; - // let timeWeightedGrossPerformancePercentage = new Big(1); - // let timeWeightedNetPerformancePercentage = new Big(1); let totalInvestment = new Big(0); let totalInvestmentWithGrossPerformanceFromSell = new Big(0); let totalUnits = new Big(0); @@ -1036,10 +1158,12 @@ export class PortfolioCalculator { const transactionInvestment = order.type === 'BUY' ? order.quantity.mul(order.unitPrice).mul(this.getFactor(order.type)) - : totalInvestment + : totalUnits.gt(0) + ? totalInvestment .div(totalUnits) .mul(order.quantity) - .mul(this.getFactor(order.type)); + .mul(this.getFactor(order.type)) + : new Big(0); if (PortfolioCalculator.ENABLE_LOGGING) { console.log('totalInvestment', totalInvestment.toNumber()); @@ -1109,66 +1233,21 @@ export class PortfolioCalculator { .minus(totalInvestment) .plus(grossPerformanceFromSells); - // if ( - // i > indexOfStartOrder && - // !lastValueOfInvestmentBeforeTransaction - // .plus(lastTransactionInvestment) - // .eq(0) - // ) { - // const grossHoldingPeriodReturn = valueOfInvestmentBeforeTransaction - // .minus( - // lastValueOfInvestmentBeforeTransaction.plus( - // lastTransactionInvestment - // ) - // ) - // .div( - // lastValueOfInvestmentBeforeTransaction.plus( - // lastTransactionInvestment - // ) - // ); - - // timeWeightedGrossPerformancePercentage = - // timeWeightedGrossPerformancePercentage.mul( - // new Big(1).plus(grossHoldingPeriodReturn) - // ); - - // const netHoldingPeriodReturn = valueOfInvestmentBeforeTransaction - // .minus(fees.minus(feesAtStartDate)) - // .minus( - // lastValueOfInvestmentBeforeTransaction.plus( - // lastTransactionInvestment - // ) - // ) - // .div( - // lastValueOfInvestmentBeforeTransaction.plus( - // lastTransactionInvestment - // ) - // ); - - // timeWeightedNetPerformancePercentage = - // timeWeightedNetPerformancePercentage.mul( - // new Big(1).plus(netHoldingPeriodReturn) - // ); - // } - grossPerformance = newGrossPerformance; - // lastTransactionInvestment = transactionInvestment; - - // lastValueOfInvestmentBeforeTransaction = - // valueOfInvestmentBeforeTransaction; - if (order.itemType === 'start') { feesAtStartDate = fees; grossPerformanceAtStartDate = grossPerformance; } if (isChartMode && i > indexOfStartOrder) { + currentValues[order.date] = valueOfInvestment; netPerformanceValues[order.date] = grossPerformance .minus(grossPerformanceAtStartDate) .minus(fees.minus(feesAtStartDate)); - investmentValues[order.date] = maxTotalInvestment; + investmentValues[order.date] = totalInvestment; + maxInvestmentValues[order.date] = maxTotalInvestment; } if (PortfolioCalculator.ENABLE_LOGGING) { @@ -1184,12 +1263,6 @@ export class PortfolioCalculator { } } - // timeWeightedGrossPerformancePercentage = - // timeWeightedGrossPerformancePercentage.minus(1); - - // timeWeightedNetPerformancePercentage = - // timeWeightedNetPerformancePercentage.minus(1); - const totalGrossPerformance = grossPerformance.minus( grossPerformanceAtStartDate ); @@ -1253,6 +1326,7 @@ export class PortfolioCalculator { Average price: ${averagePriceAtStartDate.toFixed( 2 )} -> ${averagePriceAtEndDate.toFixed(2)} + Total investment: ${totalInvestment.toFixed(2)} Max. total investment: ${maxTotalInvestment.toFixed(2)} Gross performance: ${totalGrossPerformance.toFixed( 2 @@ -1265,14 +1339,16 @@ export class PortfolioCalculator { } return { - initialValue, + currentValues, grossPerformancePercentage, + initialValue, investmentValues, + maxInvestmentValues, netPerformancePercentage, netPerformanceValues, + grossPerformance: totalGrossPerformance, hasErrors: totalUnits.gt(0) && (!initialValue || !unitPriceAtEndDate), - netPerformance: totalNetPerformance, - grossPerformance: totalGrossPerformance + netPerformance: totalNetPerformance }; } diff --git a/apps/api/src/app/portfolio/portfolio.controller.ts b/apps/api/src/app/portfolio/portfolio.controller.ts index ef0b586e5..06f841e12 100644 --- a/apps/api/src/app/portfolio/portfolio.controller.ts +++ b/apps/api/src/app/portfolio/portfolio.controller.ts @@ -8,17 +8,17 @@ import { RedactValuesInResponseInterceptor } from '@ghostfolio/api/interceptors/ import { TransformDataSourceInRequestInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-request.interceptor'; import { TransformDataSourceInResponseInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-response.interceptor'; import { ApiService } from '@ghostfolio/api/services/api/api.service'; -import { ConfigurationService } from '@ghostfolio/api/services/configuration.service'; -import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data.service'; -import { parseDate } from '@ghostfolio/common/helper'; +import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; +import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; +import { HEADER_KEY_IMPERSONATION } from '@ghostfolio/common/config'; import { PortfolioDetails, + PortfolioDividends, PortfolioInvestments, PortfolioPerformanceResponse, PortfolioPublicDetails, PortfolioReport } from '@ghostfolio/common/interfaces'; -import { InvestmentItem } from '@ghostfolio/common/interfaces/investment-item.interface'; import type { DateRange, GroupBy, @@ -66,14 +66,19 @@ export class PortfolioController { @UseInterceptors(RedactValuesInResponseInterceptor) @UseInterceptors(TransformDataSourceInResponseInterceptor) public async getDetails( - @Headers('impersonation-id') impersonationId: string, + @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string, @Query('accounts') filterByAccounts?: string, @Query('assetClasses') filterByAssetClasses?: string, @Query('range') dateRange: DateRange = 'max', @Query('tags') filterByTags?: string ): Promise { + let hasDetails = true; let hasError = false; + if (this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) { + hasDetails = this.request.user.subscription.type === 'Premium'; + } + const filters = this.apiService.buildFiltersFromQueryParams({ filterByAccounts, filterByAssetClasses, @@ -86,6 +91,7 @@ export class PortfolioController { filteredValueInPercentage, hasErrors, holdings, + platforms, summary, totalValueInBaseCurrency } = await this.portfolioService.getDetails({ @@ -127,14 +133,24 @@ export class PortfolioController { portfolioPosition.investment / totalInvestment; portfolioPosition.netPerformance = null; portfolioPosition.quantity = null; - portfolioPosition.value = portfolioPosition.value / totalValue; + portfolioPosition.valueInPercentage = + portfolioPosition.value / totalValue; } - for (const [name, { current, original }] of Object.entries(accounts)) { - accounts[name].current = current / totalValue; - accounts[name].original = original / totalInvestment; + for (const [name, { valueInBaseCurrency }] of Object.entries(accounts)) { + accounts[name].valueInPercentage = valueInBaseCurrency / totalValue; } + for (const [name, { valueInBaseCurrency }] of Object.entries(platforms)) { + platforms[name].valueInPercentage = valueInBaseCurrency / totalValue; + } + } + + if ( + hasDetails === false || + impersonationId || + this.userService.isRestrictedView(this.request.user) + ) { portfolioSummary = nullifyValuesInObject(summary, [ 'cash', 'committedFunds', @@ -146,17 +162,13 @@ export class PortfolioController { 'excludedAccountsAndActivities', 'fees', 'items', + 'liabilities', 'netWorth', 'totalBuy', 'totalSell' ]); } - let hasDetails = true; - if (this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) { - hasDetails = this.request.user.subscription.type === 'Premium'; - } - for (const [symbol, portfolioPosition] of Object.entries(holdings)) { holdings[symbol] = { ...portfolioPosition, @@ -175,43 +187,86 @@ export class PortfolioController { filteredValueInPercentage, hasError, holdings, + platforms, totalValueInBaseCurrency, - summary: hasDetails ? portfolioSummary : undefined + summary: portfolioSummary }; } - @Get('investments') + @Get('dividends') @UseGuards(AuthGuard('jwt')) - public async getInvestments( - @Headers('impersonation-id') impersonationId: string, + public async getDividends( + @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string, + @Query('accounts') filterByAccounts?: string, + @Query('assetClasses') filterByAssetClasses?: string, + @Query('groupBy') groupBy?: GroupBy, @Query('range') dateRange: DateRange = 'max', - @Query('groupBy') groupBy?: GroupBy - ): Promise { + @Query('tags') filterByTags?: string + ): Promise { + const filters = this.apiService.buildFiltersFromQueryParams({ + filterByAccounts, + filterByAssetClasses, + filterByTags + }); + + let dividends = await this.portfolioService.getDividends({ + dateRange, + filters, + groupBy, + impersonationId + }); + if ( - this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION') && - this.request.user.subscription.type === 'Basic' + impersonationId || + this.userService.isRestrictedView(this.request.user) ) { - throw new HttpException( - getReasonPhrase(StatusCodes.FORBIDDEN), - StatusCodes.FORBIDDEN + const maxDividend = dividends.reduce( + (investment, item) => Math.max(investment, item.investment), + 1 ); - } - let investments: InvestmentItem[]; + dividends = dividends.map((item) => ({ + date: item.date, + investment: item.investment / maxDividend + })); + } - if (groupBy === 'month') { - investments = await this.portfolioService.getInvestments({ - dateRange, - impersonationId, - groupBy: 'month' - }); - } else { - investments = await this.portfolioService.getInvestments({ - dateRange, - impersonationId + if ( + this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION') && + this.request.user.subscription.type === 'Basic' + ) { + dividends = dividends.map((item) => { + return nullifyValuesInObject(item, ['investment']); }); } + return { dividends }; + } + + @Get('investments') + @UseGuards(AuthGuard('jwt')) + public async getInvestments( + @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string, + @Query('accounts') filterByAccounts?: string, + @Query('assetClasses') filterByAssetClasses?: string, + @Query('groupBy') groupBy?: GroupBy, + @Query('range') dateRange: DateRange = 'max', + @Query('tags') filterByTags?: string + ): Promise { + const filters = this.apiService.buildFiltersFromQueryParams({ + filterByAccounts, + filterByAssetClasses, + filterByTags + }); + + let { investments, streaks } = await this.portfolioService.getInvestments({ + dateRange, + filters, + groupBy, + impersonationId, + savingsRate: this.request.user?.Settings?.settings.savingsRate + }); + if ( impersonationId || this.userService.isRestrictedView(this.request.user) @@ -225,9 +280,28 @@ export class PortfolioController { date: item.date, investment: item.investment / maxInvestment })); + + streaks = nullifyValuesInObject(streaks, [ + 'currentStreak', + 'longestStreak' + ]); } - return { investments }; + if ( + this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION') && + this.request.user.subscription.type === 'Basic' + ) { + investments = investments.map((item) => { + return nullifyValuesInObject(item, ['investment']); + }); + + streaks = nullifyValuesInObject(streaks, [ + 'currentStreak', + 'longestStreak' + ]); + } + + return { investments, streaks }; } @Get('performance') @@ -235,12 +309,23 @@ export class PortfolioController { @UseInterceptors(TransformDataSourceInResponseInterceptor) @Version('2') public async getPerformanceV2( - @Headers('impersonation-id') impersonationId: string, - @Query('range') dateRange: DateRange = 'max' + @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string, + @Query('accounts') filterByAccounts?: string, + @Query('assetClasses') filterByAssetClasses?: string, + @Query('range') dateRange: DateRange = 'max', + @Query('tags') filterByTags?: string ): Promise { + const filters = this.apiService.buildFiltersFromQueryParams({ + filterByAccounts, + filterByAssetClasses, + filterByTags + }); + const performanceInformation = await this.portfolioService.getPerformance({ dateRange, - impersonationId + filters, + impersonationId, + userId: this.request.user.id }); if ( @@ -256,7 +341,7 @@ export class PortfolioController { totalInvestment: new Big(totalInvestment) .div(performanceInformation.performance.totalInvestment) .toNumber(), - value: new Big(value) + valueInPercentage: new Big(value) .div(performanceInformation.performance.currentValue) .toNumber() }; @@ -274,39 +359,46 @@ export class PortfolioController { ); } + if ( + this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION') && + this.request.user.subscription.type === 'Basic' + ) { + performanceInformation.chart = performanceInformation.chart.map( + (item) => { + return nullifyValuesInObject(item, ['totalInvestment', 'value']); + } + ); + } + return performanceInformation; } @Get('positions') @UseGuards(AuthGuard('jwt')) + @UseInterceptors(RedactValuesInResponseInterceptor) @UseInterceptors(TransformDataSourceInResponseInterceptor) public async getPositions( - @Headers('impersonation-id') impersonationId: string, - @Query('range') dateRange: DateRange = 'max' + @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string, + @Query('accounts') filterByAccounts?: string, + @Query('assetClasses') filterByAssetClasses?: string, + @Query('range') dateRange: DateRange = 'max', + @Query('tags') filterByTags?: string ): Promise { - const result = await this.portfolioService.getPositions( - impersonationId, - dateRange - ); - - if ( - impersonationId || - this.userService.isRestrictedView(this.request.user) - ) { - result.positions = result.positions.map((position) => { - return nullifyValuesInObject(position, [ - 'grossPerformance', - 'investment', - 'netPerformance', - 'quantity' - ]); - }); - } + const filters = this.apiService.buildFiltersFromQueryParams({ + filterByAccounts, + filterByAssetClasses, + filterByTags + }); - return result; + return this.portfolioService.getPositions({ + dateRange, + filters, + impersonationId + }); } @Get('public/:accessId') + @UseInterceptors(TransformDataSourceInResponseInterceptor) public async getPublic( @Param('accessId') accessId ): Promise { @@ -331,7 +423,7 @@ export class PortfolioController { dateRange: 'max', filters: [{ id: 'EQUITY', type: 'ASSET_CLASS' }], impersonationId: access.userId, - userId: access.userId + userId: user.id }); const portfolioPublicDetails: PortfolioPublicDetails = { @@ -353,16 +445,18 @@ export class PortfolioController { for (const [symbol, portfolioPosition] of Object.entries(holdings)) { portfolioPublicDetails.holdings[symbol] = { - allocationCurrent: portfolioPosition.value / totalValue, + allocationInPercentage: portfolioPosition.value / totalValue, countries: hasDetails ? portfolioPosition.countries : [], currency: hasDetails ? portfolioPosition.currency : undefined, + dataSource: portfolioPosition.dataSource, + dateOfFirstActivity: portfolioPosition.dateOfFirstActivity, markets: hasDetails ? portfolioPosition.markets : undefined, name: portfolioPosition.name, netPerformancePercent: portfolioPosition.netPerformancePercent, sectors: hasDetails ? portfolioPosition.sectors : [], symbol: portfolioPosition.symbol, url: portfolioPosition.url, - value: portfolioPosition.value / totalValue + valueInPercentage: portfolioPosition.value / totalValue }; } @@ -370,35 +464,22 @@ export class PortfolioController { } @Get('position/:dataSource/:symbol') + @UseInterceptors(RedactValuesInResponseInterceptor) @UseInterceptors(TransformDataSourceInRequestInterceptor) @UseInterceptors(TransformDataSourceInResponseInterceptor) @UseGuards(AuthGuard('jwt')) public async getPosition( - @Headers('impersonation-id') impersonationId: string, + @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string, @Param('dataSource') dataSource, @Param('symbol') symbol ): Promise { - let position = await this.portfolioService.getPosition( + const position = await this.portfolioService.getPosition( dataSource, impersonationId, symbol ); if (position) { - if ( - impersonationId || - this.userService.isRestrictedView(this.request.user) - ) { - position = nullifyValuesInObject(position, [ - 'grossPerformance', - 'investment', - 'netPerformance', - 'orders', - 'quantity', - 'value' - ]); - } - return position; } @@ -411,18 +492,21 @@ export class PortfolioController { @Get('report') @UseGuards(AuthGuard('jwt')) public async getReport( - @Headers('impersonation-id') impersonationId: string + @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string ): Promise { + const report = await this.portfolioService.getReport(impersonationId); + if ( this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION') && this.request.user.subscription.type === 'Basic' ) { - throw new HttpException( - getReasonPhrase(StatusCodes.FORBIDDEN), - StatusCodes.FORBIDDEN - ); + for (const rule in report.rules) { + if (report.rules[rule]) { + report.rules[rule] = []; + } + } } - return await this.portfolioService.getReport(impersonationId); + return report; } } diff --git a/apps/api/src/app/portfolio/portfolio.module.ts b/apps/api/src/app/portfolio/portfolio.module.ts index bf5829833..fa11476ac 100644 --- a/apps/api/src/app/portfolio/portfolio.module.ts +++ b/apps/api/src/app/portfolio/portfolio.module.ts @@ -3,14 +3,14 @@ import { AccountService } from '@ghostfolio/api/app/account/account.service'; import { OrderModule } from '@ghostfolio/api/app/order/order.module'; import { UserModule } from '@ghostfolio/api/app/user/user.module'; import { ApiModule } from '@ghostfolio/api/services/api/api.module'; -import { ConfigurationModule } from '@ghostfolio/api/services/configuration.module'; -import { DataGatheringModule } from '@ghostfolio/api/services/data-gathering.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 { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data.module'; -import { ImpersonationModule } from '@ghostfolio/api/services/impersonation.module'; -import { MarketDataModule } from '@ghostfolio/api/services/market-data.module'; -import { PrismaModule } from '@ghostfolio/api/services/prisma.module'; -import { SymbolProfileModule } from '@ghostfolio/api/services/symbol-profile.module'; +import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module'; +import { ImpersonationModule } from '@ghostfolio/api/services/impersonation/impersonation.module'; +import { MarketDataModule } from '@ghostfolio/api/services/market-data/market-data.module'; +import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; +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 a34d1e385..66f3841a4 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -1,37 +1,36 @@ import { AccountService } from '@ghostfolio/api/app/account/account.service'; import { CashDetails } from '@ghostfolio/api/app/account/interfaces/cash-details.interface'; +import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { OrderService } from '@ghostfolio/api/app/order/order.service'; import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service'; import { PortfolioOrder } from '@ghostfolio/api/app/portfolio/interfaces/portfolio-order.interface'; -import { TimelineSpecification } from '@ghostfolio/api/app/portfolio/interfaces/timeline-specification.interface'; import { TransactionPoint } from '@ghostfolio/api/app/portfolio/interfaces/transaction-point.interface'; import { UserService } from '@ghostfolio/api/app/user/user.service'; import { AccountClusterRiskCurrentInvestment } from '@ghostfolio/api/models/rules/account-cluster-risk/current-investment'; -import { AccountClusterRiskInitialInvestment } from '@ghostfolio/api/models/rules/account-cluster-risk/initial-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'; -import { CurrencyClusterRiskBaseCurrencyInitialInvestment } from '@ghostfolio/api/models/rules/currency-cluster-risk/base-currency-initial-investment'; import { CurrencyClusterRiskCurrentInvestment } from '@ghostfolio/api/models/rules/currency-cluster-risk/current-investment'; -import { CurrencyClusterRiskInitialInvestment } from '@ghostfolio/api/models/rules/currency-cluster-risk/initial-investment'; import { FeeRatioInitialInvestment } from '@ghostfolio/api/models/rules/fees/fee-ratio-initial-investment'; -import { ConfigurationService } from '@ghostfolio/api/services/configuration.service'; +import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; -import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data.service'; -import { ImpersonationService } from '@ghostfolio/api/services/impersonation.service'; -import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile.service'; +import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; +import { ImpersonationService } from '@ghostfolio/api/services/impersonation/impersonation.service'; +import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; import { - ASSET_SUB_CLASS_EMERGENCY_FUND, + EMERGENCY_FUND_TAG_ID, MAX_CHART_ITEMS, UNKNOWN_KEY } from '@ghostfolio/common/config'; -import { DATE_FORMAT, parseDate } from '@ghostfolio/common/helper'; +import { DATE_FORMAT, getSum, parseDate } from '@ghostfolio/common/helper'; import { Accounts, EnhancedSymbolProfile, Filter, HistoricalDataItem, PortfolioDetails, + PortfolioInvestments, PortfolioPerformanceResponse, + PortfolioPosition, PortfolioReport, PortfolioSummary, Position, @@ -45,7 +44,8 @@ import type { GroupBy, Market, OrderWithAccount, - RequestWithUser + RequestWithUser, + UserWithSettings } from '@ghostfolio/common/types'; import { Inject, Injectable } from '@nestjs/common'; import { REQUEST } from '@nestjs/core'; @@ -66,12 +66,12 @@ import { format, isAfter, isBefore, + isSameMonth, + isSameYear, max, - parse, parseISO, set, setDayOfYear, - startOfDay, subDays, subYears } from 'date-fns'; @@ -130,9 +130,9 @@ export class PortfolioService { }), this.getDetails({ filters, - userId, withExcludedAccounts, - impersonationId: userId + impersonationId: userId, + userId: this.request.user.id }) ]); @@ -147,7 +147,8 @@ export class PortfolioService { } } - const valueInBaseCurrency = details.accounts[account.id]?.current ?? 0; + const valueInBaseCurrency = + details.accounts[account.id]?.valueInBaseCurrency ?? 0; const result = { ...account, @@ -207,19 +208,65 @@ export class PortfolioService { }; } + public async getDividends({ + dateRange, + filters, + groupBy, + impersonationId + }: { + dateRange: DateRange; + filters?: Filter[]; + 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) => { + return { + date: format(dividend.date, DATE_FORMAT), + investment: dividend.valueInBaseCurrency + }; + }); + + if (groupBy) { + dividends = this.getDividendsByGroup({ dividends, groupBy }); + } + + const startDate = this.getStartDate( + dateRange, + parseDate(dividends[0]?.date) + ); + + return dividends.filter(({ date }) => { + return !isBefore(parseDate(date), startDate); + }); + } + public async getInvestments({ dateRange, + filters, + groupBy, impersonationId, - groupBy + savingsRate }: { dateRange: DateRange; - impersonationId: string; + filters?: Filter[]; groupBy?: GroupBy; - }): Promise { + impersonationId: string; + savingsRate: number; + }): Promise { const userId = await this.getUserId(impersonationId, this.request.user.id); const { portfolioOrders, transactionPoints } = await this.getTransactionPoints({ + filters, userId, includeDrafts: true }); @@ -232,31 +279,39 @@ export class PortfolioService { portfolioCalculator.setTransactionPoints(transactionPoints); if (transactionPoints.length === 0) { - return []; + return { + investments: [], + streaks: { currentStreak: 0, longestStreak: 0 } + }; } let investments: InvestmentItem[]; - if (groupBy === 'month') { - investments = portfolioCalculator.getInvestmentsByMonth().map((item) => { - return { - date: item.date, - investment: item.investment.toNumber() - }; - }); + if (groupBy) { + investments = portfolioCalculator + .getInvestmentsByGroup(groupBy) + .map((item) => { + return { + date: item.date, + investment: item.investment.toNumber() + }; + }); - // Add investment of current month - const dateOfCurrentMonth = format( - set(new Date(), { date: 1 }), + // Add investment of current group + const dateOfCurrentGroup = format( + set(new Date(), { + date: 1, + month: groupBy === 'year' ? 0 : new Date().getMonth() + }), DATE_FORMAT ); - const investmentOfCurrentMonth = investments.filter(({ date }) => { - return date === dateOfCurrentMonth; + const investmentOfCurrentGroup = investments.filter(({ date }) => { + return date === dateOfCurrentGroup; }); - if (investmentOfCurrentMonth.length <= 0) { + if (investmentOfCurrentGroup.length <= 0) { investments.push({ - date: dateOfCurrentMonth, + date: dateOfCurrentGroup, investment: 0 }); } @@ -297,27 +352,48 @@ export class PortfolioService { parseDate(investments[0]?.date) ); - return investments.filter(({ date }) => { + investments = investments.filter(({ date }) => { return !isBefore(parseDate(date), startDate); }); + + let streaks: PortfolioInvestments['streaks']; + + if (savingsRate) { + streaks = this.getStreaks({ + investments, + savingsRate: groupBy === 'year' ? 12 * savingsRate : savingsRate + }); + } + + return { + investments, + streaks + }; } public async getChart({ dateRange = 'max', - impersonationId + filters, + impersonationId, + userCurrency, + userId }: { dateRange?: DateRange; + filters?: Filter[]; impersonationId: string; + userCurrency: string; + userId: string; }): Promise { - const userId = await this.getUserId(impersonationId, this.request.user.id); + userId = await this.getUserId(impersonationId, userId); const { portfolioOrders, transactionPoints } = await this.getTransactionPoints({ + filters, userId }); const portfolioCalculator = new PortfolioCalculator({ - currency: this.request.user.Settings.settings.baseCurrency, + currency: userCurrency, currentRateService: this.currentRateService, orders: portfolioOrders }); @@ -354,29 +430,25 @@ export class PortfolioService { } public async getDetails({ - impersonationId, - userId, dateRange = 'max', filters, + impersonationId, + userId, withExcludedAccounts = false }: { - impersonationId: string; - userId: string; dateRange?: DateRange; filters?: Filter[]; + impersonationId: string; + userId: string; withExcludedAccounts?: boolean; }): Promise { - // TODO userId = await this.getUserId(impersonationId, userId); const user = await this.userService.user({ id: userId }); + const userCurrency = this.getUserCurrency(user); const emergencyFund = new Big( (user.Settings?.settings as UserSettings)?.emergencyFund ?? 0 ); - const userCurrency = - user.Settings?.settings.baseCurrency ?? - this.request.user?.Settings?.settings.baseCurrency ?? - this.baseCurrency; const { orders, portfolioOrders, transactionPoints } = await this.getTransactionPoints({ @@ -408,10 +480,18 @@ export class PortfolioService { }); const holdings: PortfolioDetails['holdings'] = {}; - const totalInvestmentInBaseCurrency = currentPositions.totalInvestment.plus( + const totalValueInBaseCurrency = currentPositions.currentValue.plus( cashDetails.balanceInBaseCurrency ); - let filteredValueInBaseCurrency = currentPositions.currentValue; + + const isFilteredByAccount = + filters?.some((filter) => { + return filter.type === 'ACCOUNT'; + }) ?? false; + + let filteredValueInBaseCurrency = isFilteredByAccount + ? totalValueInBaseCurrency + : currentPositions.currentValue; if ( filters?.length === 0 || @@ -430,13 +510,10 @@ export class PortfolioService { symbol: position.symbol }; }); - const symbols = currentPositions.positions.map( - (position) => position.symbol - ); const [dataProviderResponses, symbolProfiles] = await Promise.all([ this.dataProviderService.getQuotes(dataGatheringItems), - this.symbolProfileService.getSymbolProfilesBySymbols(symbols) + this.symbolProfileService.getSymbolProfiles(dataGatheringItems) ]); const symbolProfileMap: { [symbol: string]: EnhancedSymbolProfile } = {}; @@ -483,17 +560,15 @@ export class PortfolioService { holdings[item.symbol] = { markets, - allocationCurrent: filteredValueInBaseCurrency.eq(0) + allocationInPercentage: filteredValueInBaseCurrency.eq(0) ? 0 : value.div(filteredValueInBaseCurrency).toNumber(), - allocationInvestment: item.investment - .div(totalInvestmentInBaseCurrency) - .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, @@ -512,17 +587,14 @@ export class PortfolioService { }; } - if ( - filters?.length === 0 || - (filters?.length === 1 && - filters[0].type === 'ASSET_CLASS' && - filters[0].id === 'CASH') - ) { + 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, - emergencyFund, userCurrency, - investment: totalInvestmentInBaseCurrency, value: filteredValueInBaseCurrency }); @@ -531,7 +603,7 @@ export class PortfolioService { } } - const accounts = await this.getValueOfAccounts({ + const { accounts, platforms } = await this.getValueOfAccountsAndPlatforms({ filters, orders, portfolioItemsNow, @@ -540,11 +612,56 @@ export class PortfolioService { withExcludedAccounts }); - const summary = await this.getSummary({ impersonationId }); + if ( + filters?.length === 1 && + filters[0].id === EMERGENCY_FUND_TAG_ID && + filters[0].type === 'TAG' + ) { + const emergencyFundCashPositions = await this.getCashPositions({ + cashDetails, + userCurrency, + value: filteredValueInBaseCurrency + }); + + const emergencyFundInCash = emergencyFund + .minus( + this.getEmergencyFundPositionsValueInBaseCurrency({ + activities: orders + }) + ) + .toNumber(); + + filteredValueInBaseCurrency = emergencyFund; + + accounts[UNKNOWN_KEY] = { + balance: 0, + currency: userCurrency, + name: UNKNOWN_KEY, + valueInBaseCurrency: emergencyFundInCash + }; + + holdings[userCurrency] = { + ...emergencyFundCashPositions[userCurrency], + investment: emergencyFundInCash, + value: emergencyFundInCash + }; + } + + const summary = await this.getSummary({ + impersonationId, + userCurrency, + userId, + balanceInBaseCurrency: cashDetails.balanceInBaseCurrency, + emergencyFundPositionsValueInBaseCurrency: + this.getEmergencyFundPositionsValueInBaseCurrency({ + activities: orders + }) + }); return { accounts, holdings, + platforms, summary, filteredValueInBaseCurrency: filteredValueInBaseCurrency.toNumber(), filteredValueInPercentage: summary.netWorth @@ -560,8 +677,9 @@ export class PortfolioService { aImpersonationId: string, aSymbol: string ): Promise { - const userCurrency = this.request.user.Settings.settings.baseCurrency; const userId = await this.getUserId(aImpersonationId, this.request.user.id); + const user = await this.userService.user({ id: userId }); + const userCurrency = this.getUserCurrency(user); const orders = ( await this.orderService.getOrders({ @@ -582,6 +700,9 @@ export class PortfolioService { return { tags, averagePrice: undefined, + dataProviderInfo: undefined, + dividendInBaseCurrency: undefined, + feeInBaseCurrency: undefined, firstBuyDate: undefined, grossPerformance: undefined, grossPerformancePercent: undefined, @@ -601,8 +722,9 @@ export class PortfolioService { } const positionCurrency = orders[0].SymbolProfile.currency; - const [SymbolProfile] = - await this.symbolProfileService.getSymbolProfilesBySymbols([aSymbol]); + const [SymbolProfile] = await this.symbolProfileService.getSymbolProfiles([ + { dataSource: aDataSource, symbol: aSymbol } + ]); const portfolioOrders: PortfolioOrder[] = orders .filter((order) => { @@ -647,12 +769,23 @@ export class PortfolioService { averagePrice, currency, dataSource, + fee, firstBuyDate, marketPrice, quantity, transactionCount } = position; + const dividendInBaseCurrency = getSum( + orders + .filter(({ type }) => { + return type === 'DIVIDEND'; + }) + .map(({ valueInBaseCurrency }) => { + return new Big(valueInBaseCurrency); + }) + ); + // Convert investment, gross and net performance to currency of user const investment = this.exchangeRateDataService.toCurrency( position.investment?.toNumber(), @@ -681,15 +814,6 @@ export class PortfolioService { let maxPrice = Math.max(orders[0].unitPrice, marketPrice); let minPrice = Math.min(orders[0].unitPrice, marketPrice); - if (!historicalData?.[aSymbol]?.[firstBuyDate]) { - // Add historical entry for buy date, if no historical data available - historicalDataArray.push({ - averagePrice: orders[0].unitPrice, - date: firstBuyDate, - value: orders[0].unitPrice - }); - } - if (historicalData[aSymbol]) { let j = -1; for (const [date, { marketPrice }] of Object.entries( @@ -701,25 +825,44 @@ export class PortfolioService { ) { j++; } + let currentAveragePrice = 0; + let currentQuantity = 0; + const currentSymbol = transactionPoints[j].items.find( - (item) => item.symbol === aSymbol + ({ symbol }) => { + return symbol === aSymbol; + } ); + if (currentSymbol) { currentAveragePrice = currentSymbol.quantity.eq(0) ? 0 : currentSymbol.investment.div(currentSymbol.quantity).toNumber(); + currentQuantity = currentSymbol.quantity.toNumber(); } historicalDataArray.push({ date, averagePrice: currentAveragePrice, - value: marketPrice + marketPrice: + historicalDataArray.length > 0 + ? marketPrice + : currentAveragePrice, + quantity: currentQuantity }); maxPrice = Math.max(marketPrice ?? 0, maxPrice); minPrice = Math.min(marketPrice ?? Number.MAX_SAFE_INTEGER, minPrice); } + } else { + // Add historical entry for buy date, if no historical data available + historicalDataArray.push({ + averagePrice: orders[0].unitPrice, + date: firstBuyDate, + marketPrice: orders[0].unitPrice, + quantity: orders[0].quantity + }); } return { @@ -735,6 +878,13 @@ export class PortfolioService { tags, transactionCount, averagePrice: averagePrice.toNumber(), + dataProviderInfo: portfolioCalculator.getDataProviderInfos()?.[0], + dividendInBaseCurrency: dividendInBaseCurrency.toNumber(), + feeInBaseCurrency: this.exchangeRateDataService.toCurrency( + fee.toNumber(), + SymbolProfile.currency, + userCurrency + ), grossPerformancePercent: position.grossPerformancePercentage?.toNumber(), historicalData: historicalDataArray, @@ -791,6 +941,9 @@ export class PortfolioService { SymbolProfile, tags, averagePrice: 0, + dataProviderInfo: undefined, + dividendInBaseCurrency: 0, + feeInBaseCurrency: 0, firstBuyDate: undefined, grossPerformance: undefined, grossPerformancePercent: undefined, @@ -805,14 +958,20 @@ export class PortfolioService { } } - public async getPositions( - aImpersonationId: string, - aDateRange: DateRange = 'max' - ): Promise<{ hasErrors: boolean; positions: Position[] }> { - const userId = await this.getUserId(aImpersonationId, this.request.user.id); + public async getPositions({ + dateRange = 'max', + filters, + impersonationId + }: { + dateRange?: DateRange; + filters?: Filter[]; + impersonationId: string; + }): Promise<{ hasErrors: boolean; positions: Position[] }> { + const userId = await this.getUserId(impersonationId, this.request.user.id); const { portfolioOrders, transactionPoints } = await this.getTransactionPoints({ + filters, userId }); @@ -832,7 +991,7 @@ export class PortfolioService { portfolioCalculator.setTransactionPoints(transactionPoints); const portfolioStart = parseDate(transactionPoints[0].date); - const startDate = this.getStartDate(aDateRange, portfolioStart); + const startDate = this.getStartDate(dateRange, portfolioStart); const currentPositions = await portfolioCalculator.getCurrentPositions( startDate ); @@ -840,17 +999,21 @@ export class PortfolioService { const positions = currentPositions.positions.filter( (item) => !item.quantity.eq(0) ); + const dataGatheringItem = positions.map((position) => { return { dataSource: position.dataSource, symbol: position.symbol }; }); - const symbols = positions.map((position) => position.symbol); const [dataProviderResponses, symbolProfiles] = await Promise.all([ this.dataProviderService.getQuotes(dataGatheringItem), - this.symbolProfileService.getSymbolProfilesBySymbols(symbols) + this.symbolProfileService.getSymbolProfiles( + positions.map(({ dataSource, symbol }) => { + return { dataSource, symbol }; + }) + ) ]); const symbolProfileMap: { [symbol: string]: EnhancedSymbolProfile } = {}; @@ -883,20 +1046,27 @@ export class PortfolioService { public async getPerformance({ dateRange = 'max', - impersonationId + filters, + impersonationId, + userId }: { dateRange?: DateRange; + filters?: Filter[]; impersonationId: string; + userId: string; }): Promise { - const userId = await this.getUserId(impersonationId, this.request.user.id); + userId = await this.getUserId(impersonationId, userId); + const user = await this.userService.user({ id: userId }); + const userCurrency = this.getUserCurrency(user); const { portfolioOrders, transactionPoints } = await this.getTransactionPoints({ + filters, userId }); const portfolioCalculator = new PortfolioCalculator({ - currency: this.request.user.Settings.settings.baseCurrency, + currency: userCurrency, currentRateService: this.currentRateService, orders: portfolioOrders }); @@ -921,33 +1091,28 @@ export class PortfolioService { const portfolioStart = parseDate(transactionPoints[0].date); const startDate = this.getStartDate(dateRange, portfolioStart); - const currentPositions = await portfolioCalculator.getCurrentPositions( - startDate - ); - - const hasErrors = currentPositions.hasErrors; - const currentValue = currentPositions.currentValue.toNumber(); - const currentGrossPerformance = currentPositions.grossPerformance; - const currentGrossPerformancePercent = - currentPositions.grossPerformancePercentage; - let currentNetPerformance = currentPositions.netPerformance; - let currentNetPerformancePercent = - currentPositions.netPerformancePercentage; - const totalInvestment = currentPositions.totalInvestment; - - // if (currentGrossPerformance.mul(currentGrossPerformancePercent).lt(0)) { - // // If algebraic sign is different, harmonize it - // currentGrossPerformancePercent = currentGrossPerformancePercent.mul(-1); - // } - - // if (currentNetPerformance.mul(currentNetPerformancePercent).lt(0)) { - // // If algebraic sign is different, harmonize it - // currentNetPerformancePercent = currentNetPerformancePercent.mul(-1); - // } + const { + currentValue, + errors, + grossPerformance, + grossPerformancePercentage, + hasErrors, + netPerformance, + netPerformancePercentage, + totalInvestment + } = await portfolioCalculator.getCurrentPositions(startDate); + + const currentGrossPerformance = grossPerformance; + const currentGrossPerformancePercent = grossPerformancePercentage; + let currentNetPerformance = netPerformance; + let currentNetPerformancePercent = netPerformancePercentage; const historicalDataContainer = await this.getChart({ dateRange, - impersonationId + filters, + impersonationId, + userCurrency, + userId }); const itemOfToday = historicalDataContainer.items.find((item) => { @@ -962,28 +1127,28 @@ export class PortfolioService { } return { + errors, + hasErrors, chart: historicalDataContainer.items.map( ({ date, - netPerformance, + netPerformance: netPerformanceOfItem, netPerformanceInPercentage, - totalInvestment, + totalInvestment: totalInvestmentOfItem, value }) => { return { date, - netPerformance, netPerformanceInPercentage, - totalInvestment, - value + value, + netPerformance: netPerformanceOfItem, + totalInvestment: totalInvestmentOfItem }; } ), - errors: currentPositions.errors, firstOrderDate: parseDate(historicalDataContainer.items[0]?.date), - hasErrors: currentPositions.hasErrors || hasErrors, performance: { - currentValue, + currentValue: currentValue.toNumber(), currentGrossPerformance: currentGrossPerformance.toNumber(), currentGrossPerformancePercent: currentGrossPerformancePercent.toNumber(), @@ -995,8 +1160,9 @@ export class PortfolioService { } public async getReport(impersonationId: string): Promise { - const currency = this.request.user.Settings.settings.baseCurrency; const userId = await this.getUserId(impersonationId, this.request.user.id); + const user = await this.userService.user({ id: userId }); + const userCurrency = this.getUserCurrency(user); const { orders, portfolioOrders, transactionPoints } = await this.getTransactionPoints({ @@ -1010,7 +1176,7 @@ export class PortfolioService { } const portfolioCalculator = new PortfolioCalculator({ - currency, + currency: userCurrency, currentRateService: this.currentRateService, orders: portfolioOrders }); @@ -1022,24 +1188,27 @@ export class PortfolioService { portfolioStart ); + const positions = currentPositions.positions.filter( + (item) => !item.quantity.eq(0) + ); + const portfolioItemsNow: { [symbol: string]: TimelinePosition } = {}; - for (const position of currentPositions.positions) { + + for (const position of positions) { portfolioItemsNow[position.symbol] = position; } - const accounts = await this.getValueOfAccounts({ + + const { accounts } = await this.getValueOfAccountsAndPlatforms({ orders, portfolioItemsNow, - userId, - userCurrency: currency + userCurrency, + userId }); + return { rules: { accountClusterRisk: await this.rulesService.evaluate( [ - new AccountClusterRiskInitialInvestment( - this.exchangeRateDataService, - accounts - ), new AccountClusterRiskCurrentInvestment( this.exchangeRateDataService, accounts @@ -1053,21 +1222,13 @@ export class PortfolioService { ), currencyClusterRisk: await this.rulesService.evaluate( [ - new CurrencyClusterRiskBaseCurrencyInitialInvestment( - this.exchangeRateDataService, - currentPositions - ), new CurrencyClusterRiskBaseCurrencyCurrentInvestment( this.exchangeRateDataService, - currentPositions - ), - new CurrencyClusterRiskInitialInvestment( - this.exchangeRateDataService, - currentPositions + positions ), new CurrencyClusterRiskCurrentInvestment( this.exchangeRateDataService, - currentPositions + positions ) ], this.request.user.Settings.settings @@ -1077,7 +1238,7 @@ export class PortfolioService { new FeeRatioInitialInvestment( this.exchangeRateDataService, currentPositions.totalInvestment.toNumber(), - this.getFees(orders).toNumber() + this.getFees({ userCurrency, activities: orders }).toNumber() ) ], this.request.user.Settings.settings @@ -1088,18 +1249,19 @@ export class PortfolioService { private async getCashPositions({ cashDetails, - emergencyFund, - investment, userCurrency, value }: { cashDetails: CashDetails; - emergencyFund: Big; - investment: Big; - value: Big; userCurrency: string; + value: Big; }) { - const cashPositions: PortfolioDetails['holdings'] = {}; + const cashPositions: PortfolioDetails['holdings'] = { + [userCurrency]: this.getInitialCashPosition({ + balance: 0, + currency: userCurrency + }) + }; for (const account of cashDetails.accounts) { const convertedBalance = this.exchangeRateDataService.toCurrency( @@ -1116,84 +1278,45 @@ export class PortfolioService { cashPositions[account.currency].investment += convertedBalance; cashPositions[account.currency].value += convertedBalance; } else { - cashPositions[account.currency] = { - allocationCurrent: 0, - allocationInvestment: 0, - assetClass: AssetClass.CASH, - assetSubClass: AssetClass.CASH, - countries: [], - currency: account.currency, - dataSource: undefined, - grossPerformance: 0, - grossPerformancePercent: 0, - investment: convertedBalance, - marketPrice: 0, - marketState: 'open', - name: account.currency, - netPerformance: 0, - netPerformancePercent: 0, - quantity: 0, - sectors: [], - symbol: account.currency, - transactionCount: 0, - value: convertedBalance - }; + cashPositions[account.currency] = this.getInitialCashPosition({ + balance: convertedBalance, + currency: account.currency + }); } } - if (emergencyFund.gt(0)) { - cashPositions[ASSET_SUB_CLASS_EMERGENCY_FUND] = { - ...cashPositions[userCurrency], - assetSubClass: ASSET_SUB_CLASS_EMERGENCY_FUND, - investment: emergencyFund.toNumber(), - name: ASSET_SUB_CLASS_EMERGENCY_FUND, - symbol: ASSET_SUB_CLASS_EMERGENCY_FUND, - value: emergencyFund.toNumber() - }; - - cashPositions[userCurrency].investment = new Big( - cashPositions[userCurrency].investment - ) - .minus(emergencyFund) - .toNumber(); - cashPositions[userCurrency].value = new Big( - cashPositions[userCurrency].value - ) - .minus(emergencyFund) - .toNumber(); - } - for (const symbol of Object.keys(cashPositions)) { // Calculate allocations for each currency - cashPositions[symbol].allocationCurrent = new Big( - cashPositions[symbol].value - ) - .div(value) - .toNumber(); - cashPositions[symbol].allocationInvestment = new Big( - cashPositions[symbol].investment - ) - .div(investment) - .toNumber(); + cashPositions[symbol].allocationInPercentage = value.gt(0) + ? new Big(cashPositions[symbol].value).div(value).toNumber() + : 0; } return cashPositions; } - private getDividend(orders: OrderWithAccount[], date = new Date(0)) { - return orders - .filter((order) => { - // Filter out all orders before given date and type dividend + private getDividend({ + activities, + date = new Date(0), + userCurrency + }: { + activities: OrderWithAccount[]; + date?: Date; + userCurrency: string; + }) { + return activities + .filter((activity) => { + // Filter out all activities before given date (drafts) and type dividend return ( - isBefore(date, new Date(order.date)) && - order.type === TypeOfOrder.DIVIDEND + isBefore(date, new Date(activity.date)) && + activity.type === TypeOfOrder.DIVIDEND ); }) - .map((order) => { + .map(({ quantity, SymbolProfile, unitPrice }) => { return this.exchangeRateDataService.toCurrency( - new Big(order.quantity).mul(order.unitPrice).toNumber(), - order.SymbolProfile.currency, - this.request.user.Settings.settings.baseCurrency + new Big(quantity).mul(unitPrice).toNumber(), + SymbolProfile.currency, + userCurrency ); }) .reduce( @@ -1202,17 +1325,119 @@ export class PortfolioService { ); } - private getFees(orders: OrderWithAccount[], date = new Date(0)) { - return orders - .filter((order) => { - // Filter out all orders before given date - return isBefore(date, new Date(order.date)); + private getDividendsByGroup({ + dividends, + groupBy + }: { + dividends: InvestmentItem[]; + groupBy: GroupBy; + }): InvestmentItem[] { + if (dividends.length === 0) { + return []; + } + + const dividendsByGroup: InvestmentItem[] = []; + let currentDate: Date; + let investmentByGroup = new Big(0); + + for (const [index, dividend] of dividends.entries()) { + if ( + isSameYear(parseDate(dividend.date), currentDate) && + (groupBy === 'year' || + isSameMonth(parseDate(dividend.date), currentDate)) + ) { + // Same group: Add up dividends + + investmentByGroup = investmentByGroup.plus(dividend.investment); + } else { + // New group: Store previous group and reset + + if (currentDate) { + dividendsByGroup.push({ + date: format( + set(currentDate, { + date: 1, + month: groupBy === 'year' ? 0 : currentDate.getMonth() + }), + DATE_FORMAT + ), + investment: investmentByGroup.toNumber() + }); + } + + currentDate = parseDate(dividend.date); + investmentByGroup = new Big(dividend.investment); + } + + if (index === dividends.length - 1) { + // Store current month (latest order) + dividendsByGroup.push({ + date: format( + set(currentDate, { + date: 1, + month: groupBy === 'year' ? 0 : currentDate.getMonth() + }), + DATE_FORMAT + ), + investment: investmentByGroup.toNumber() + }); + } + } + + return dividendsByGroup; + } + + private getEmergencyFundPositionsValueInBaseCurrency({ + activities + }: { + activities: Activity[]; + }) { + const emergencyFundOrders = activities.filter((activity) => { + return ( + activity.tags?.some(({ id }) => { + return id === EMERGENCY_FUND_TAG_ID; + }) ?? false + ); + }); + + let valueInBaseCurrencyOfEmergencyFundPositions = new Big(0); + + for (const order of emergencyFundOrders) { + if (order.type === 'BUY') { + valueInBaseCurrencyOfEmergencyFundPositions = + valueInBaseCurrencyOfEmergencyFundPositions.plus( + order.valueInBaseCurrency + ); + } else if (order.type === 'SELL') { + valueInBaseCurrencyOfEmergencyFundPositions = + valueInBaseCurrencyOfEmergencyFundPositions.minus( + order.valueInBaseCurrency + ); + } + } + + return valueInBaseCurrencyOfEmergencyFundPositions.toNumber(); + } + + 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((order) => { + .map(({ fee, SymbolProfile }) => { return this.exchangeRateDataService.toCurrency( - order.fee, - order.SymbolProfile.currency, - this.request.user.Settings.settings.baseCurrency + fee, + SymbolProfile.currency, + userCurrency ); }) .reduce( @@ -1221,19 +1446,68 @@ export class PortfolioService { ); } - private getItems(orders: OrderWithAccount[], date = new Date(0)) { - return orders - .filter((order) => { - // Filter out all orders before given date and type item + private getInitialCashPosition({ + balance, + currency + }: { + balance: number; + currency: string; + }): PortfolioPosition { + return { + currency, + allocationInPercentage: 0, + assetClass: AssetClass.CASH, + assetSubClass: AssetClass.CASH, + countries: [], + dataSource: undefined, + dateOfFirstActivity: undefined, + grossPerformance: 0, + grossPerformancePercent: 0, + investment: balance, + marketPrice: 0, + marketState: 'open', + name: currency, + netPerformance: 0, + netPerformancePercent: 0, + quantity: 0, + sectors: [], + symbol: currency, + transactionCount: 0, + value: balance + }; + } + + private getItems(activities: OrderWithAccount[], date = new Date(0)) { + return activities + .filter((activity) => { + // Filter out all activities before given date (drafts) and type item return ( - isBefore(date, new Date(order.date)) && - order.type === TypeOfOrder.ITEM + isBefore(date, new Date(activity.date)) && + activity.type === TypeOfOrder.ITEM ); }) - .map((order) => { + .map(({ quantity, SymbolProfile, unitPrice }) => { return this.exchangeRateDataService.toCurrency( - new Big(order.quantity).mul(order.unitPrice).toNumber(), - order.SymbolProfile.currency, + new Big(quantity).mul(unitPrice).toNumber(), + SymbolProfile.currency, + this.request.user.Settings.settings.baseCurrency + ); + }) + .reduce( + (previous, current) => new Big(previous).plus(current), + new Big(0) + ); + } + + private getLiabilities(activities: OrderWithAccount[]) { + return activities + .filter(({ type }) => { + return type === TypeOfOrder.LIABILITY; + }) + .map(({ quantity, SymbolProfile, unitPrice }) => { + return this.exchangeRateDataService.toCurrency( + new Big(quantity).mul(unitPrice).toNumber(), + SymbolProfile.currency, this.request.user.Settings.settings.baseCurrency ); }) @@ -1246,39 +1520,77 @@ export class PortfolioService { private getStartDate(aDateRange: DateRange, portfolioStart: Date) { switch (aDateRange) { case '1d': - portfolioStart = max([portfolioStart, subDays(new Date(), 1)]); + portfolioStart = max([ + portfolioStart, + subDays(new Date().setHours(0, 0, 0, 0), 1) + ]); break; case 'ytd': - portfolioStart = max([portfolioStart, setDayOfYear(new Date(), 1)]); + portfolioStart = max([ + portfolioStart, + setDayOfYear(new Date().setHours(0, 0, 0, 0), 1) + ]); break; case '1y': - portfolioStart = max([portfolioStart, subYears(new Date(), 1)]); + portfolioStart = max([ + portfolioStart, + subYears(new Date().setHours(0, 0, 0, 0), 1) + ]); break; case '5y': - portfolioStart = max([portfolioStart, subYears(new Date(), 5)]); + portfolioStart = max([ + portfolioStart, + subYears(new Date().setHours(0, 0, 0, 0), 5) + ]); break; } return portfolioStart; } + private getStreaks({ + investments, + savingsRate + }: { + investments: InvestmentItem[]; + savingsRate: number; + }) { + let currentStreak = 0; + let longestStreak = 0; + + for (const { investment } of investments) { + if (investment >= savingsRate) { + currentStreak++; + longestStreak = Math.max(longestStreak, currentStreak); + } else { + currentStreak = 0; + } + } + + return { currentStreak, longestStreak }; + } + private async getSummary({ - impersonationId + balanceInBaseCurrency, + emergencyFundPositionsValueInBaseCurrency, + impersonationId, + userCurrency, + userId }: { + balanceInBaseCurrency: number; + emergencyFundPositionsValueInBaseCurrency: number; impersonationId: string; + userCurrency: string; + userId: string; }): Promise { - const userCurrency = this.request.user.Settings.settings.baseCurrency; - const userId = await this.getUserId(impersonationId, this.request.user.id); + userId = await this.getUserId(impersonationId, userId); const user = await this.userService.user({ id: userId }); const performanceInformation = await this.getPerformance({ - impersonationId + impersonationId, + userId }); - const { balanceInBaseCurrency } = await this.accountService.getCashDetails({ - userId, - currency: userCurrency - }); - const orders = await this.orderService.getOrders({ + const activities = await this.orderService.getOrders({ userCurrency, userId }); @@ -1293,18 +1605,28 @@ export class PortfolioService { return account?.isExcluded ?? false; }); - const dividend = this.getDividend(orders).toNumber(); + const dividend = this.getDividend({ + activities, + userCurrency + }).toNumber(); const emergencyFund = new Big( - (user.Settings?.settings as UserSettings)?.emergencyFund ?? 0 + Math.max( + emergencyFundPositionsValueInBaseCurrency, + (user.Settings?.settings as UserSettings)?.emergencyFund ?? 0 + ) ); - const fees = this.getFees(orders).toNumber(); - const firstOrderDate = orders[0]?.date; - const items = this.getItems(orders).toNumber(); + const fees = this.getFees({ activities, userCurrency }).toNumber(); + const firstOrderDate = activities[0]?.date; + const items = this.getItems(activities).toNumber(); + const liabilities = this.getLiabilities(activities).toNumber(); - const totalBuy = this.getTotalByType(orders, userCurrency, 'BUY'); - const totalSell = this.getTotalByType(orders, userCurrency, 'SELL'); + const totalBuy = this.getTotalByType(activities, userCurrency, 'BUY'); + const totalSell = this.getTotalByType(activities, userCurrency, 'SELL'); - const cash = new Big(balanceInBaseCurrency).minus(emergencyFund).toNumber(); + const cash = new Big(balanceInBaseCurrency) + .minus(emergencyFund) + .plus(emergencyFundPositionsValueInBaseCurrency) + .toNumber(); const committedFunds = new Big(totalBuy).minus(totalSell); const totalOfExcludedActivities = new Big( this.getTotalByType(excludedActivities, userCurrency, 'BUY') @@ -1329,6 +1651,7 @@ export class PortfolioService { .plus(performanceInformation.performance.currentValue) .plus(items) .plus(excludedAccountsAndActivities) + .minus(liabilities) .toNumber(); const daysInMarket = differenceInDays(new Date(), firstOrderDate); @@ -1355,13 +1678,14 @@ export class PortfolioService { fees, firstOrderDate, items, + liabilities, netWorth, totalBuy, totalSell, committedFunds: committedFunds.toNumber(), emergencyFund: emergencyFund.toNumber(), - ordersCount: orders.filter((order) => { - return order.type === 'BUY' || order.type === 'SELL'; + ordersCount: activities.filter(({ type }) => { + return type === 'BUY' || type === 'SELL'; }).length }; } @@ -1378,7 +1702,7 @@ export class PortfolioService { withExcludedAccounts?: boolean; }): Promise<{ transactionPoints: TransactionPoint[]; - orders: OrderWithAccount[]; + orders: Activity[]; portfolioOrders: PortfolioOrder[]; }> { const userCurrency = @@ -1436,7 +1760,7 @@ export class PortfolioService { }; } - private async getValueOfAccounts({ + private async getValueOfAccountsAndPlatforms({ filters = [], orders, portfolioItemsNow, @@ -1451,7 +1775,16 @@ export class PortfolioService { userId: string; withExcludedAccounts?: boolean; }) { + const ordersOfTypeItem = await this.orderService.getOrders({ + filters, + userCurrency, + userId, + withExcludedAccounts, + types: ['ITEM'] + }); + const accounts: PortfolioDetails['accounts'] = {}; + const platforms: PortfolioDetails['platforms'] = {}; let currentAccounts: (Account & { Order?: Order[]; @@ -1462,6 +1795,7 @@ export class PortfolioService { currentAccounts = await this.accountService.getAccounts(userId); } else if (filters.length === 1 && filters[0].type === 'ACCOUNT') { currentAccounts = await this.accountService.accounts({ + include: { Platform: true }, where: { id: filters[0].id } }); } else { @@ -1472,6 +1806,7 @@ export class PortfolioService { ); currentAccounts = await this.accountService.accounts({ + include: { Platform: true }, where: { id: { in: accountIds } } }); } @@ -1481,70 +1816,91 @@ export class PortfolioService { }); for (const account of currentAccounts) { - const ordersByAccount = orders.filter(({ accountId }) => { + let ordersByAccount = orders.filter(({ accountId }) => { return accountId === account.id; }); + const ordersOfTypeItemByAccount = ordersOfTypeItem.filter( + ({ accountId }) => { + return accountId === account.id; + } + ); + + ordersByAccount = ordersByAccount.concat(ordersOfTypeItemByAccount); + accounts[account.id] = { balance: account.balance, currency: account.currency, - current: this.exchangeRateDataService.toCurrency( - account.balance, - account.currency, - userCurrency - ), name: account.name, - original: this.exchangeRateDataService.toCurrency( + valueInBaseCurrency: this.exchangeRateDataService.toCurrency( account.balance, account.currency, userCurrency ) }; - for (const order of ordersByAccount) { - let currentValueOfSymbolInBaseCurrency = - order.quantity * - portfolioItemsNow[order.SymbolProfile.symbol].marketPrice; - let originalValueOfSymbolInBaseCurrency = + if (platforms[account.Platform?.id || UNKNOWN_KEY]?.valueInBaseCurrency) { + platforms[account.Platform?.id || UNKNOWN_KEY].valueInBaseCurrency += this.exchangeRateDataService.toCurrency( - order.quantity * order.unitPrice, - order.SymbolProfile.currency, + account.balance, + account.currency, userCurrency ); + } else { + platforms[account.Platform?.id || UNKNOWN_KEY] = { + balance: account.balance, + currency: account.currency, + name: account.Platform?.name, + valueInBaseCurrency: this.exchangeRateDataService.toCurrency( + account.balance, + account.currency, + userCurrency + ) + }; + } + + for (const order of ordersByAccount) { + let currentValueOfSymbolInBaseCurrency = + order.quantity * + (portfolioItemsNow[order.SymbolProfile.symbol]?.marketPrice ?? + order.unitPrice ?? + 0); if (order.type === 'SELL') { currentValueOfSymbolInBaseCurrency *= -1; - originalValueOfSymbolInBaseCurrency *= -1; } - if (accounts[order.Account?.id || UNKNOWN_KEY]?.current) { - accounts[order.Account?.id || UNKNOWN_KEY].current += + if (accounts[order.Account?.id || UNKNOWN_KEY]?.valueInBaseCurrency) { + accounts[order.Account?.id || UNKNOWN_KEY].valueInBaseCurrency += currentValueOfSymbolInBaseCurrency; - accounts[order.Account?.id || UNKNOWN_KEY].original += - originalValueOfSymbolInBaseCurrency; } else { accounts[order.Account?.id || UNKNOWN_KEY] = { balance: 0, currency: order.Account?.currency, - current: currentValueOfSymbolInBaseCurrency, name: account.name, - original: originalValueOfSymbolInBaseCurrency + valueInBaseCurrency: currentValueOfSymbolInBaseCurrency + }; + } + + if ( + platforms[order.Account?.Platform?.id || UNKNOWN_KEY] + ?.valueInBaseCurrency + ) { + platforms[ + order.Account?.Platform?.id || UNKNOWN_KEY + ].valueInBaseCurrency += currentValueOfSymbolInBaseCurrency; + } else { + platforms[order.Account?.Platform?.id || UNKNOWN_KEY] = { + balance: 0, + currency: order.Account?.currency, + name: account.Platform?.name, + valueInBaseCurrency: currentValueOfSymbolInBaseCurrency }; } } } - return accounts; - } - - private async getUserId(aImpersonationId: string, aUserId: string) { - const impersonationUserId = - await this.impersonationService.validateImpersonationId( - aImpersonationId, - aUserId - ); - - return impersonationUserId || aUserId; + return { accounts, platforms }; } private getTotalByType( @@ -1565,4 +1921,19 @@ export class PortfolioService { }) .reduce((previous, current) => previous + current, 0); } + + private getUserCurrency(aUser: UserWithSettings) { + return ( + aUser.Settings?.settings.baseCurrency ?? + this.request.user?.Settings?.settings.baseCurrency ?? + this.baseCurrency + ); + } + + private async getUserId(aImpersonationId: string, aUserId: string) { + const impersonationUserId = + await this.impersonationService.validateImpersonationId(aImpersonationId); + + return impersonationUserId || aUserId; + } } 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 299a25bab..41f49c499 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,5 @@ -import { ConfigurationModule } from '@ghostfolio/api/services/configuration.module'; -import { ConfigurationService } from '@ghostfolio/api/services/configuration.service'; +import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; +import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { CacheManagerOptions, CacheModule, Module } from '@nestjs/common'; import * as redisStore from 'cache-manager-redis-store'; 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 f930b3a72..fb75460ed 100644 --- a/apps/api/src/app/redis-cache/redis-cache.service.ts +++ b/apps/api/src/app/redis-cache/redis-cache.service.ts @@ -1,4 +1,5 @@ -import { ConfigurationService } from '@ghostfolio/api/services/configuration.service'; +import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; +import { UniqueAsset } from '@ghostfolio/common/interfaces'; import { CACHE_MANAGER, Inject, Injectable } from '@nestjs/common'; import { Cache } from 'cache-manager'; @@ -13,6 +14,10 @@ export class RedisCacheService { return await this.cache.get(key); } + public getQuoteKey({ dataSource, symbol }: UniqueAsset) { + return `quote-${dataSource}-${symbol}`; + } + public async remove(key: string) { await this.cache.del(key); } diff --git a/apps/api/src/app/subscription/subscription.controller.ts b/apps/api/src/app/subscription/subscription.controller.ts index 70317fe76..e063a8636 100644 --- a/apps/api/src/app/subscription/subscription.controller.ts +++ b/apps/api/src/app/subscription/subscription.controller.ts @@ -1,4 +1,4 @@ -import { ConfigurationService } from '@ghostfolio/api/services/configuration.service'; +import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { PropertyService } from '@ghostfolio/api/services/property/property.service'; import { DEFAULT_LANGUAGE_CODE, @@ -21,6 +21,7 @@ import { } from '@nestjs/common'; import { REQUEST } from '@nestjs/core'; import { AuthGuard } from '@nestjs/passport'; +import { Request, Response } from 'express'; import { StatusCodes, getReasonPhrase } from 'http-status-codes'; import { SubscriptionService } from './subscription.service'; @@ -62,6 +63,7 @@ export class SubscriptionController { await this.subscriptionService.createSubscription({ duration: coupon.duration, + price: 0, userId: this.request.user.id }); @@ -86,9 +88,12 @@ export class SubscriptionController { } @Get('stripe/callback') - public async stripeCallback(@Req() req, @Res() res) { + public async stripeCallback( + @Req() request: Request, + @Res() response: Response + ) { const userId = await this.subscriptionService.createSubscriptionViaStripe( - req.query.checkoutSessionId + request.query.checkoutSessionId ); Logger.log( @@ -96,7 +101,7 @@ export class SubscriptionController { 'SubscriptionController' ); - res.redirect( + response.redirect( `${this.configurationService.get( 'ROOT_URL' )}/${DEFAULT_LANGUAGE_CODE}/account` @@ -112,7 +117,7 @@ export class SubscriptionController { return await this.subscriptionService.createCheckoutSession({ couponId, priceId, - userId: this.request.user.id + user: this.request.user }); } catch (error) { Logger.error(error, 'SubscriptionController'); diff --git a/apps/api/src/app/subscription/subscription.module.ts b/apps/api/src/app/subscription/subscription.module.ts index df0861657..c2c80c135 100644 --- a/apps/api/src/app/subscription/subscription.module.ts +++ b/apps/api/src/app/subscription/subscription.module.ts @@ -1,5 +1,5 @@ -import { ConfigurationModule } from '@ghostfolio/api/services/configuration.module'; -import { PrismaModule } from '@ghostfolio/api/services/prisma.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'; diff --git a/apps/api/src/app/subscription/subscription.service.ts b/apps/api/src/app/subscription/subscription.service.ts index fa061f369..c3e01851d 100644 --- a/apps/api/src/app/subscription/subscription.service.ts +++ b/apps/api/src/app/subscription/subscription.service.ts @@ -1,7 +1,8 @@ -import { ConfigurationService } from '@ghostfolio/api/services/configuration.service'; -import { PrismaService } from '@ghostfolio/api/services/prisma.service'; +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 { SubscriptionType } from '@ghostfolio/common/types/subscription.type'; +import { 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'; @@ -19,7 +20,7 @@ export class SubscriptionService { this.stripe = new Stripe( this.configurationService.get('STRIPE_SECRET_KEY'), { - apiVersion: '2020-08-27' + apiVersion: '2022-11-15' } ); } @@ -27,17 +28,17 @@ export class SubscriptionService { public async createCheckoutSession({ couponId, priceId, - userId + user }: { couponId?: string; priceId: string; - userId: string; + user: UserWithSettings; }) { const checkoutSessionCreateParams: Stripe.Checkout.SessionCreateParams = { - cancel_url: `${this.configurationService.get( - 'ROOT_URL' - )}/${DEFAULT_LANGUAGE_CODE}/account`, - client_reference_id: userId, + cancel_url: `${this.configurationService.get('ROOT_URL')}/${ + user.Settings?.settings?.language ?? DEFAULT_LANGUAGE_CODE + }/account`, + client_reference_id: user.id, line_items: [ { price: priceId, @@ -70,13 +71,16 @@ export class SubscriptionService { public async createSubscription({ duration = '1 year', + price, userId }: { duration?: StringValue; + price: number; userId: string; }) { await this.prismaService.subscription.create({ data: { + price, expiresAt: addMilliseconds(new Date(), ms(duration)), User: { connect: { @@ -93,10 +97,9 @@ export class SubscriptionService { aCheckoutSessionId ); - await this.createSubscription({ userId: session.client_reference_id }); - - await this.stripe.customers.update(session.customer as string, { - description: session.client_reference_id + await this.createSubscription({ + price: session.amount_total / 100, + userId: session.client_reference_id }); return session.client_reference_id; @@ -105,7 +108,9 @@ export class SubscriptionService { } } - public getSubscription(aSubscriptions: Subscription[]) { + public getSubscription( + aSubscriptions: Subscription[] + ): UserWithSettings['subscription'] { if (aSubscriptions.length > 0) { const latestSubscription = aSubscriptions.reduce((a, b) => { return new Date(a.expiresAt) > new Date(b.expiresAt) ? a : b; @@ -113,12 +118,14 @@ export class SubscriptionService { return { expiresAt: latestSubscription.expiresAt, + offer: latestSubscription.price === 0 ? 'default' : 'renewal', type: isBefore(new Date(), latestSubscription.expiresAt) ? SubscriptionType.Premium : SubscriptionType.Basic }; } else { return { + offer: 'default', type: 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 cf45f4c7e..e9c90b0bc 100644 --- a/apps/api/src/app/symbol/interfaces/lookup-item.interface.ts +++ b/apps/api/src/app/symbol/interfaces/lookup-item.interface.ts @@ -1,6 +1,8 @@ -import { DataSource } from '@prisma/client'; +import { AssetClass, AssetSubClass, DataSource } from '@prisma/client'; export interface LookupItem { + assetClass: AssetClass; + assetSubClass: AssetSubClass; currency: string; dataSource: DataSource; name: string; diff --git a/apps/api/src/app/symbol/symbol.controller.ts b/apps/api/src/app/symbol/symbol.controller.ts index dd50e0dee..da73382a6 100644 --- a/apps/api/src/app/symbol/symbol.controller.ts +++ b/apps/api/src/app/symbol/symbol.controller.ts @@ -1,15 +1,18 @@ import { TransformDataSourceInRequestInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-request.interceptor'; 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, HttpException, + Inject, Param, Query, UseGuards, UseInterceptors } from '@nestjs/common'; +import { REQUEST } from '@nestjs/core'; import { AuthGuard } from '@nestjs/passport'; import { DataSource } from '@prisma/client'; import { StatusCodes, getReasonPhrase } from 'http-status-codes'; @@ -21,7 +24,10 @@ import { SymbolService } from './symbol.service'; @Controller('symbol') export class SymbolController { - public constructor(private readonly symbolService: SymbolService) {} + public constructor( + @Inject(REQUEST) private readonly request: RequestWithUser, + private readonly symbolService: SymbolService + ) {} /** * Must be before /:symbol @@ -30,10 +36,15 @@ export class SymbolController { @UseGuards(AuthGuard('jwt')) @UseInterceptors(TransformDataSourceInResponseInterceptor) public async lookupSymbol( - @Query() { query = '' } + @Query('includeIndices') includeIndices: boolean = false, + @Query('query') query = '' ): Promise<{ items: LookupItem[] }> { try { - return this.symbolService.lookup(query.toLowerCase()); + return this.symbolService.lookup({ + includeIndices, + query: query.toLowerCase(), + user: this.request.user + }); } catch { throw new HttpException( getReasonPhrase(StatusCodes.INTERNAL_SERVER_ERROR), @@ -51,7 +62,7 @@ export class SymbolController { public async getSymbolData( @Param('dataSource') dataSource: DataSource, @Param('symbol') symbol: string, - @Query('includeHistoricalData') includeHistoricalData?: number + @Query('includeHistoricalData') includeHistoricalData = 0 ): Promise { if (!DataSource[dataSource]) { throw new HttpException( @@ -91,10 +102,19 @@ export class SymbolController { ); } - return this.symbolService.getForDate({ + const result = await this.symbolService.getForDate({ dataSource, date, symbol }); + + if (!result || isEmpty(result)) { + throw new HttpException( + getReasonPhrase(StatusCodes.NOT_FOUND), + StatusCodes.NOT_FOUND + ); + } + + return result; } } diff --git a/apps/api/src/app/symbol/symbol.module.ts b/apps/api/src/app/symbol/symbol.module.ts index 2b47334a6..4d9f2d5eb 100644 --- a/apps/api/src/app/symbol/symbol.module.ts +++ b/apps/api/src/app/symbol/symbol.module.ts @@ -1,7 +1,7 @@ -import { ConfigurationModule } from '@ghostfolio/api/services/configuration.module'; +import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module'; -import { MarketDataModule } from '@ghostfolio/api/services/market-data.module'; -import { PrismaModule } from '@ghostfolio/api/services/prisma.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 e24aa71b2..bc626a97f 100644 --- a/apps/api/src/app/symbol/symbol.service.ts +++ b/apps/api/src/app/symbol/symbol.service.ts @@ -3,11 +3,11 @@ import { IDataGatheringItem, IDataProviderHistoricalResponse } from '@ghostfolio/api/services/interfaces/interfaces'; -import { MarketDataService } from '@ghostfolio/api/services/market-data.service'; +import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; 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 { DataSource } from '@prisma/client'; import { format, subDays } from 'date-fns'; import { LookupItem } from './interfaces/lookup-item.interface'; @@ -32,7 +32,7 @@ export class SymbolService { ]); const { currency, marketPrice } = quotes[dataGatheringItem.symbol] ?? {}; - if (dataGatheringItem.dataSource && marketPrice) { + if (dataGatheringItem.dataSource && marketPrice >= 0) { let historicalData: HistoricalDataItem[] = []; if (includeHistoricalData > 0) { @@ -65,13 +65,9 @@ export class SymbolService { public async getForDate({ dataSource, - date, + date = new Date(), symbol - }: { - dataSource: DataSource; - date: Date; - symbol: string; - }): Promise { + }: IDataGatheringItem): Promise { const historicalData = await this.dataProviderService.getHistoricalRaw( [{ dataSource, symbol }], date, @@ -84,15 +80,27 @@ export class SymbolService { }; } - public async lookup(aQuery: string): Promise<{ items: LookupItem[] }> { + public async lookup({ + includeIndices = false, + query, + user + }: { + includeIndices?: boolean; + query: string; + user: UserWithSettings; + }): Promise<{ items: LookupItem[] }> { const results: { items: LookupItem[] } = { items: [] }; - if (!aQuery) { + if (!query) { return results; } try { - const { items } = await this.dataProviderService.search(aQuery); + const { items } = await this.dataProviderService.search({ + includeIndices, + query, + user + }); results.items = items; return results; } catch (error) { 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 97062df9d..e510880ed 100644 --- a/apps/api/src/app/user/update-user-setting.dto.ts +++ b/apps/api/src/app/user/update-user-setting.dto.ts @@ -5,6 +5,7 @@ import type { } from '@ghostfolio/common/types'; import { IsBoolean, + IsISO8601, IsIn, IsNumber, IsOptional, @@ -12,6 +13,10 @@ import { } from 'class-validator'; export class UpdateUserSettingDto { + @IsNumber() + @IsOptional() + annualInterestRate?: number; + @IsOptional() @IsString() baseCurrency?: string; @@ -48,6 +53,14 @@ export class UpdateUserSettingDto { @IsOptional() locale?: string; + @IsNumber() + @IsOptional() + projectedTotalAmount?: number; + + @IsISO8601() + @IsOptional() + retirementDate?: string; + @IsNumber() @IsOptional() savingsRate?: number; diff --git a/apps/api/src/app/user/user.controller.ts b/apps/api/src/app/user/user.controller.ts index 2b1f063bf..44d21e9c9 100644 --- a/apps/api/src/app/user/user.controller.ts +++ b/apps/api/src/app/user/user.controller.ts @@ -1,6 +1,4 @@ -import { ConfigurationService } from '@ghostfolio/api/services/configuration.service'; import { PropertyService } from '@ghostfolio/api/services/property/property.service'; -import { PROPERTY_IS_READ_ONLY_MODE } from '@ghostfolio/common/config'; import { User, UserSettings } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import type { RequestWithUser } from '@ghostfolio/common/types'; @@ -31,7 +29,6 @@ import { UserService } from './user.service'; @Controller('user') export class UserController { public constructor( - private readonly configurationService: ConfigurationService, private readonly jwtService: JwtService, private readonly propertyService: PropertyService, @Inject(REQUEST) private readonly request: RequestWithUser, @@ -69,23 +66,20 @@ export class UserController { @Post() public async signupUser(): Promise { - if (this.configurationService.get('ENABLE_FEATURE_READ_ONLY_MODE')) { - const isReadOnlyMode = (await this.propertyService.getByKey( - PROPERTY_IS_READ_ONLY_MODE - )) as boolean; + const isUserSignupEnabled = + await this.propertyService.isUserSignupEnabled(); - if (isReadOnlyMode) { - throw new HttpException( - getReasonPhrase(StatusCodes.FORBIDDEN), - StatusCodes.FORBIDDEN - ); - } + if (!isUserSignupEnabled) { + throw new HttpException( + getReasonPhrase(StatusCodes.FORBIDDEN), + StatusCodes.FORBIDDEN + ); } const hasAdmin = await this.userService.hasAdmin(); const { accessToken, id, role } = await this.userService.createUser({ - role: hasAdmin ? 'USER' : 'ADMIN' + data: { role: hasAdmin ? 'USER' : 'ADMIN' } }); return { diff --git a/apps/api/src/app/user/user.module.ts b/apps/api/src/app/user/user.module.ts index 6a705524f..3df366bc1 100644 --- a/apps/api/src/app/user/user.module.ts +++ b/apps/api/src/app/user/user.module.ts @@ -1,6 +1,6 @@ import { SubscriptionModule } from '@ghostfolio/api/app/subscription/subscription.module'; -import { ConfigurationModule } from '@ghostfolio/api/services/configuration.module'; -import { PrismaModule } from '@ghostfolio/api/services/prisma.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 { TagModule } from '@ghostfolio/api/services/tag/tag.module'; import { Module } from '@nestjs/common'; diff --git a/apps/api/src/app/user/user.service.ts b/apps/api/src/app/user/user.service.ts index 13f82aa47..39c0571b2 100644 --- a/apps/api/src/app/user/user.service.ts +++ b/apps/api/src/app/user/user.service.ts @@ -1,19 +1,17 @@ import { SubscriptionService } from '@ghostfolio/api/app/subscription/subscription.service'; -import { ConfigurationService } from '@ghostfolio/api/services/configuration.service'; -import { PrismaService } from '@ghostfolio/api/services/prisma.service'; +import { environment } from '@ghostfolio/api/environments/environment'; +import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.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 { PROPERTY_IS_READ_ONLY_MODE, locale } from '@ghostfolio/common/config'; -import { - User as IUser, - UserSettings, - UserWithSettings -} from '@ghostfolio/common/interfaces'; +import { User as IUser, UserSettings } from '@ghostfolio/common/interfaces'; import { getPermissions, hasRole, permissions } from '@ghostfolio/common/permissions'; +import { UserWithSettings } from '@ghostfolio/common/types'; import { Injectable } from '@nestjs/common'; import { Prisma, Role, User } from '@prisma/client'; import { sortBy } from 'lodash'; @@ -97,6 +95,7 @@ export class UserService { const { accessToken, Account, + Analytics, authChallenge, createdAt, id, @@ -107,7 +106,12 @@ export class UserService { thirdPartyId, updatedAt } = await this.prismaService.user.findUnique({ - include: { Account: true, Settings: true, Subscription: true }, + include: { + Account: true, + Analytics: true, + Settings: true, + Subscription: true + }, where: userWhereUniqueInput }); @@ -121,7 +125,8 @@ export class UserService { role, Settings, thirdPartyId, - updatedAt + updatedAt, + activityCount: Analytics?.activityCount }; if (user?.Settings) { @@ -154,15 +159,22 @@ export class UserService { (user.Settings.settings as UserSettings).viewMode = 'DEFAULT'; } + let currentPermissions = getPermissions(user.role); + if (this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) { user.subscription = this.subscriptionService.getSubscription(Subscription); - } - let currentPermissions = getPermissions(user.role); + if ( + Analytics?.activityCount % 10 === 0 && + user.subscription?.type === 'Basic' + ) { + currentPermissions.push(permissions.enableSubscriptionInterstitial); + } - if (user.subscription?.type === 'Premium') { - currentPermissions.push(permissions.reportDataGlitch); + if (user.subscription?.type === 'Premium') { + currentPermissions.push(permissions.reportDataGlitch); + } } if (this.configurationService.get('ENABLE_FEATURE_READ_ONLY_MODE')) { @@ -185,6 +197,10 @@ export class UserService { } } + if (!environment.production && role === 'ADMIN') { + currentPermissions.push(permissions.impersonateAllUsers); + } + user.Account = sortBy(user.Account, (account) => { return account.name; }); @@ -217,7 +233,11 @@ export class UserService { return hash.digest('hex'); } - public async createUser(data: Prisma.UserCreateInput): Promise { + public async createUser({ + data + }: { + data: Prisma.UserCreateInput; + }): Promise { if (!data?.provider) { data.provider = 'ANONYMOUS'; } @@ -242,6 +262,14 @@ export class UserService { } }); + if (this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) { + await this.prismaService.analytics.create({ + data: { + User: { connect: { id: user.id } } + } + }); + } + if (data.provider === 'ANONYMOUS') { const accessToken = this.createAccessToken( user.id, @@ -276,21 +304,29 @@ export class UserService { } public async deleteUser(where: Prisma.UserWhereUniqueInput): Promise { - await this.prismaService.access.deleteMany({ - where: { OR: [{ granteeUserId: where.id }, { userId: where.id }] } - }); + try { + await this.prismaService.access.deleteMany({ + where: { OR: [{ granteeUserId: where.id }, { userId: where.id }] } + }); + } catch {} - await this.prismaService.account.deleteMany({ - where: { userId: where.id } - }); + try { + await this.prismaService.account.deleteMany({ + where: { userId: where.id } + }); + } catch {} - await this.prismaService.analytics.delete({ - where: { userId: where.id } - }); + try { + await this.prismaService.analytics.delete({ + where: { userId: where.id } + }); + } catch {} - await this.prismaService.order.deleteMany({ - where: { userId: where.id } - }); + try { + await this.prismaService.order.deleteMany({ + where: { userId: where.id } + }); + } catch {} try { await this.prismaService.settings.delete({ diff --git a/apps/api/src/assets/cryptocurrencies/cryptocurrencies.json b/apps/api/src/assets/cryptocurrencies/cryptocurrencies.json index 93e9521aa..413425f68 100644 --- a/apps/api/src/assets/cryptocurrencies/cryptocurrencies.json +++ b/apps/api/src/assets/cryptocurrencies/cryptocurrencies.json @@ -10,14 +10,11 @@ "1337": "EliteCoin", "1717": "1717 Masonic Commemorative Token", "2015": "2015 coin", - "$ANRX": "AnRKey X", - "$BASED": "Based Money", - "$KIRBYRELOADED": "Kirby Reloaded", "$MAID": "MaidCoin", "$ROPE": "Rope", "$TIME": "Madagascar Token", - "$TRDL": "Strudel Finance", "$TREAM": "World Stream Finance", + "00": "ZER0ZER0", "007": "007 coin", "0XBTC": "0xBitcoin", "0xDIARY": "The 0xDiary Token", @@ -32,6 +29,7 @@ "1IRST": "1irstcoin", "1PECO": "1peco", "1SG": "1SG", + "1SOL": "1Sol", "1ST": "FirstBlood", "1TRC": "1TRONIC", "1UP": "Uptrennd", @@ -40,6 +38,7 @@ "2BACCO": "2BACCO Coin", "2BASED": "2Based Finance", "2CRZ": "2crazyNFT", + "2GCC": "2G Carbon Coin", "2GIVE": "2GiveCoin", "2GT": "2GETHER", "2KEY": "2key.network", @@ -47,6 +46,7 @@ "2TF": "2TF", "300F": "300FIT", "32BIT": "32Bitcoin", + "37C": "37Protocol", "3DES": "3DES", "3FT": "ThreeFold Token", "3ULL": "3ULL Coin", @@ -71,8 +71,10 @@ "AAVE": "Aave", "ABA": "EcoBall", "ABBC": "ABBC Coin", + "ABC": "ABC Chain", "ABCC": "ABCC Token", "ABEY": "Abey", + "ABIC": "Arabic", "ABJ": "Abjcoin", "ABL": "Airbloc", "ABT": "ArcBlock", @@ -94,14 +96,17 @@ "ACH": "Alchemy Pay", "ACHC": "AchieveCoin", "ACID": "AcidCoin", + "ACK": "Arcade Kingdoms", "ACM": "AC Milan Fan Token", "ACN": "AvonCoin", "ACOIN": "ACoin", "ACP": "Anarchists Prime", + "ACS": "Access Protocol", "ACT": "Achain", "ACTIN": "Actinium", "ACTN": "Action Coin", "ACU": "ACU Platform", + "ACX": "Across Protocol", "ACXT": "ACDX Exchange Token", "ACYC": "All Coins Yield Capital", "ADA": "Cardano", @@ -110,6 +115,7 @@ "ADAO": "ADADao", "ADAPAD": "ADAPad", "ADAT": "Adadex Tools", + "ADAX": "ADAX", "ADB": "Adbank", "ADC": "AudioCoin", "ADD": "ADD.xyz", @@ -144,6 +150,7 @@ "AET": "AfterEther", "AETH": "Aave ETH", "AETHC": "Ankr Reward-Bearing Staked ETH", + "AETHERV2": "AetherV2", "AEVO": "Always Evolving", "AFC": "Arsenal Fan Token", "AFCT": "Allforcrypto", @@ -152,7 +159,6 @@ "AFIN": "Asian Fintech", "AFIT": "Actifit", "AFK": "AFKDAO", - "AFN": "AltaFin", "AFO": "AllForOneBusiness", "AFTT": "Africa Trading Chain", "AFX": "Afrix", @@ -161,6 +167,7 @@ "AGEUR": "agEUR", "AGF": "Augmented Finance", "AGI": "SingularityNET", + "AGLA": "Angola", "AGLD": "Adventure Gold", "AGM": "Argoneum", "AGPC": "AGPC", @@ -170,6 +177,7 @@ "AGT": "aGifttoken", "AGV": "Astra Guild Ventures", "AGVC": "AgaveCoin", + "AGX": "Agricoin", "AHOO": "Ahoolee", "AHT": "AhaToken", "AI": "Multiverse", @@ -211,6 +219,7 @@ "ALA": "ALA", "ALBT": "AllianceBlock", "ALC": "Arab League Coin", + "ALCAZAR": "Alcazar", "ALCE": "Alcedo", "ALCH": "Alchemy", "ALCHE": "Alchemist", @@ -221,6 +230,7 @@ "ALF": "AlphaCoin", "ALG": "Algory", "ALGO": "Algorand", + "ALGOBLK": "AlgoBlocks", "ALH": "AlloHash", "ALI": "Alethea Artificial Liquid Intelligence Token", "ALIAS": "Alias", @@ -240,10 +250,12 @@ "ALPACA": "Alpaca Finance", "ALPH": "Alephium", "ALPHA": "Alpha Finance Lab", + "ALPHAC": "Alpha Coin", "ALPHR": "Alphr", "ALPINE": "Alpine F1 Team Fan Token", "ALPS": "Alpenschillling", "ALT": "Alitas", + "ALTA": "Alta Finance", "ALTB": "Altbase", "ALTCOIN": "ALTcoin", "ALTCOM": "AltCommunity Coin", @@ -258,14 +270,16 @@ "AMA": "MrWeb", "AMAL": "AMAL", "AMATEN": "Amaten", - "AMB": "Amber", + "AMB": "AirDAO", "AMBER": "AmberCoin", "AMBT": "AMBT Token", "AMDC": "Allmedi Coin", + "AMDG": "AMDG", "AME": "Amepay", "AMERICANCOIN": "AmericanCoin", "AMIO": "Amino Network", "AMIS": "AMIS", + "AMKT": "Alongside Crypto Market Index", "AMLT": "AMLT", "AMM": "MicroMoney", "AMMO": "Ammo Rewards", @@ -275,11 +289,13 @@ "AMOS": "Amos", "AMP": "Amp", "AMPL": "Ampleforth", + "AMPLIFI": "AmpliFi", "AMS": "Amsterdam Coin", "AMT": "Acumen", "AMX": "Amero", "AMY": "Amygws", "AMZE": "The Amaze World", + "ANA": "Nirvana ANA", "ANAL": "AnalCoin", "ANB": "Angryb", "ANC": "Anchor Protocol", @@ -294,14 +310,17 @@ "ANGLE": "ANGLE", "ANI": "Animecoin", "ANJ": "Aragon Court", + "ANJI": "Anji", "ANK": "AlphaLink", "ANKA.BITCI": "Ankaragücü Fan Token", "ANKORUS": "Ankorus Token", "ANKR": "Ankr Network", + "ANKRETH": "Ankr Staked ETH", "ANML": "Animal Concerts", "ANN": "Annex Finance", "ANON": "ANON", "ANONCOIN": "Anoncoin", + "ANRX": "AnRKey X", "ANS": "ANS Crypto Coin", "ANSR": "Answerly", "ANT": "Aragon", @@ -314,8 +333,8 @@ "ANV": "Aniverse", "ANW": "Anchor Neural World", "ANY": "Anyswap", - "AOA": "Aurora", "AOG": "AgeOfGods", + "AOK": "AOK", "AOP": "Averopay", "AOS": "AOS", "APAD": "Anypad", @@ -323,7 +342,8 @@ "APE": "ApeCoin", "APECOIN": "Asia Pacific Electronic Coin", "APED": "Baddest Alpha Ape Bundle", - "APEX": "ApexCoin", + "APEX": "ApeX Protocol", + "APEXCOIN": "ApexCoin", "APH": "Aphelion", "API": "Application Programming Interface", "API3": "API3", @@ -333,16 +353,19 @@ "APM": "apM Coin", "APN": "Apron", "APOD": "AirPod", + "APOLLO": "Apollo Crypto", "APP": "SappChat", "APPC": "AppCoins", + "APRICOT": "Apricot Finance", "APRIL": "April", "APS": "APRES", - "APT": "Apricot Finance", + "APT": "Aptos", "APTCOIN": "Aptcoin", "APW": "APWine", - "APX": "Apx", + "APX": "ApolloX", "APXP": "APEX Protocol", "APXT": "ApolloX", + "APXVENTURES": "Apx", "APY": "APY.Finance", "APYS": "APYSwap", "APZ": "Alprockz", @@ -357,8 +380,9 @@ "ARA": "Ara Token", "ARATA": "Arata", "ARAW": "Araw", - "ARB": "Arbit Coin", + "ARB": "Arbitrum", "ARBI": "Arbi", + "ARBIT": "Arbit Coin", "ARBT": "ARBITRAGE", "ARC": "ArcticCoin", "ARCA": "Arca", @@ -375,12 +399,15 @@ "ARENA": "Arena", "AREPA": "Arepacoin", "ARES": "Ares Protocol", - "ARG": "Argentum", + "ARG": "Argentine Football Association Fan Token", + "ARGENTUM": "Argentum", "ARGO": "ArGoApp", "ARGON": "Argon", "ARGUS": "ArgusCoin", "ARI": "AriCoin", + "ARIA": "Legends of Aria", "ARIA20": "Arianee", + "ARIX": "Arix", "ARK": "ARK", "ARKER": "Arker", "ARKN": "Ark Rivals", @@ -404,12 +431,14 @@ "ARTE": "Artemine", "ARTEM": "Artem", "ARTEON": "Arteon", + "ARTEQ": "artèQ", "ARTEX": "Artex", "ARTF": "Artfinity Token", "ARTG": "Goya Giant Token", "ARTH": "ARTH", "ARTI": "Arti Project", "ARTII": "ARTII Token", + "ARTL": "ARTL", "ARTM": "ARTM", "ARTP": "ArtPro", "ARTY": "Artyfact", @@ -418,12 +447,14 @@ "ARX": "ARCS", "ARY": "Block Array", "AS": "AmaStar", + "ASA": "ASA Coin", "ASAFE2": "Allsafe", "ASD": "AscendEX Token", "ASG": "Asgard", "ASGC": "ASG", "ASH": "ASH", "ASIA": "Asia Coin", + "ASIMI": "ASIMI", "ASK": "Permission Coin", "ASKO": "Asko", "ASM": "Assemble Protocol", @@ -433,7 +464,8 @@ "ASQT": "ASQ Protocol", "ASR": "AS Roma Fan Token", "ASS": "Australian Safe Shepherd", - "ASSA": "ASSARA", + "ASSA": "AssaPlay", + "ASSARA": "ASSARA", "ASST": "AssetStream", "AST": "AirSwap", "ASTA": "ASTA", @@ -442,6 +474,7 @@ "ASTR": "Astar", "ASTRAL": "Astral", "ASTRO": "AstroSwap", + "ASTROC": "Astroport Classic", "ASTROLION": "AstroLion", "ASTRONAUT": "Astronaut", "ASUNA": "Asuna Hentai", @@ -453,7 +486,7 @@ "ATCC": "ATC Coin", "ATD": "A2DAO", "ATFS": "ATFS Project", - "ATH": "AetherV2", + "ATH": "All Time High Vodka", "ATHE": "Atheios", "ATK": "Attack Wagon", "ATKN": "A-Token", @@ -468,6 +501,7 @@ "ATOLO": "RIZON", "ATOM": "Cosmos", "ATON": "Further Network", + "ATOZ": "Race Kingdom", "ATP": "Atlas Protocol", "ATR": "Ather", "ATRI": "Atari Token", @@ -478,7 +512,8 @@ "AU": "AutoCrypto", "AUA": "ArubaCoin", "AUC": "Auctus", - "AUCTION": "Auction", + "AUCO": "Advanced United Continent", + "AUCTION": "Bounce", "AUDC": "Aussie Digital", "AUDIO": "Audius", "AUDX": "eToro Australian Dollar", @@ -487,6 +522,7 @@ "AUNIT": "Aunit", "AUPC": "Authpaper", "AUR": "AUREO", + "AURO": "Aurora", "AURORA": "Aurora", "AURORAC": "Auroracoin", "AUROS": "AurusGOLD", @@ -504,12 +540,15 @@ "AVA": "Travala", "AVAL": "Avaluse", "AVALON": "Avalon", + "AVAT": "AVATA Network", "AVAX": "Avalanche", "AVAXIOU": "Avalanche IOU", + "AVDO": "AvocadoCoin", "AVE": "Avesta", "AVG": "Avocado DAO", "AVH": "Animation Vision Cash", "AVINOC": "AVINOC", + "AVL": "Aston Villa Fan Token", "AVN": "AVNRich", "AVO": "Avoteo", "AVT": "Aventus", @@ -522,7 +561,7 @@ "AWR": "Award", "AWS": "AurusSILVER", "AWT": "Airdrop World", - "AWX": "AurusDeFi", + "AWX": "AurusX", "AX": "AlphaX", "AXC": "AXIA Coin", "AXE": "Axe", @@ -531,7 +570,8 @@ "AXIAV3": "Axia", "AXIOM": "Axiom Coin", "AXIS": "Axis DeFi", - "AXL": "AXL INU", + "AXL": "Axelar", + "AXLINU": "AXL INU", "AXN": "Axion", "AXNT": "Axentro", "AXPR": "aXpire", @@ -541,10 +581,15 @@ "AXYS": "Axys", "AYA": "Aryacoin", "AZ": "Azbit", + "AZA": "Kaliza", "AZART": "Azart", "AZBI": "AZBI CORE", + "AZERO": "Aleph Zero", "AZU": "Azultec", "AZUKI": "Azuki", + "AZUM": "Azuma Coin", + "AZY": "Amazy", + "B": "BankCoin", "B20": "B20", "B21": "B21", "B26": "B26 Finance", @@ -553,11 +598,9 @@ "B2X": "SegWit2x", "B3": "B3 Coin", "B91": "B91", - "B@": "BankCoin", "BAAS": "BaaSid", "BABL": "Babylon Finance", "BABY": "BabySwap", - "BABYB": "Baby Bali", "BABYCUBAN": "Baby Cuban", "BABYDOGE": "BabyDoge", "BABYELON": "BabyElon", @@ -566,6 +609,7 @@ "BABYSAITAMA": "Baby Saitama", "BABYTK": "Baby Tiger King", "BAC": "Basis Cash", + "BACK": "DollarBack", "BACOIN": "BACoin", "BACON": "BaconDAO (BACON)", "BADGER": "Badger DAO", @@ -583,6 +627,7 @@ "BANC": "Babes and Nerds", "BANCA": "BANCA", "BAND": "Band Protocol", + "BANDEX": "Banana Index", "BANK": "Float Protocol", "BANKETH": "BankEth", "BANNER": "BannerCoin", @@ -593,6 +638,7 @@ "BART": "BarterTrade", "BAS": "Basis Share", "BASE": "Base Protocol", + "BASED": "Based Money", "BASH": "LuckChain", "BASHC": "BashCoin", "BASHOS": "Bashoswap", @@ -607,6 +653,7 @@ "BAX": "BABB", "BAXS": "BoxAxis", "BAY": "BitBay", + "BB": "Baby Bali", "BB1": "Bitbond", "BBADGER": "Badger Sett Badger", "BBANK": "BlockBank", @@ -625,7 +672,7 @@ "BBP": "BiblePay", "BBR": "Boolberry", "BBS": "BBSCoin", - "BBT": "BitBoost", + "BBT": "BitBook", "BBTC": "BlakeBitcoin", "BC": "Bitcoin Confidential", "BCA": "Bitcoin Atom", @@ -649,6 +696,7 @@ "BCMC1": "BeforeCoinMarketCap", "BCN": "ByteCoin", "BCNA": "BitCanna", + "BCNT": "Bincentive", "BCNX": "BCNEX", "BCO": "BridgeCoin", "BCOIN": "Bombcrypto", @@ -656,13 +704,12 @@ "BCPT": "BlockMason Credit Protocol", "BCR": "BitCredit", "BCS": "Business Credit Substitute", - "BCT": "Bitcratic Token", + "BCT": "Toucan Protocol: Base Carbon Tonne", "BCUG": "Blockchain Cuties Universe Governance", "BCV": "BitCapitalVendor", "BCVB": "BCV Blue Chip", "BCX": "BitcoinX", "BCY": "BitCrystals", - "BCZ": "Bitcoin CZ", "BCZERO": "Buggyra Coin Zero", "BDAY": "Birthday Cake", "BDB": "Big Data Block", @@ -676,6 +723,7 @@ "BDPI": "Interest Bearing Defi Pulse Index", "BDR": "BlueDragon", "BDX": "Beldex", + "BDY": "Buddy DAO", "BEACH": "BeachCoin", "BEAM": "Beam", "BEAN": "BeanCash", @@ -684,9 +732,10 @@ "BEC": "Betherchip", "BECH": "Beauty Chain", "BED": "Bankless BED Index", - "BEE": "Bee Token", + "BEE": "Herbee", "BEER": "BEER Coin", - "BEET": "Beetle Coin", + "BEETLE": "Beetle Coin", + "BEETOKEN": "Bee Token", "BEETS": "Beethoven X", "BEL": "Bella Protocol", "BELA": "Bela", @@ -697,6 +746,7 @@ "BENJACOIN": "Benjacoin", "BENJI": "BenjiRolls", "BENT": "Bent Finance", + "BENX": "BlueBenx", "BENZI": "Ben Zi Token", "BEP": "Blucon", "BEPR": "Blockchain Euro Project", @@ -714,6 +764,7 @@ "BETT": "Bettium", "BETU": "Betu", "BEX": "BEX token", + "BEY": "Beyond Finance", "BEYOND": "Beyond Protocol", "BEZ": "Bezop", "BEZOGE": "Bezoge Earth", @@ -722,6 +773,7 @@ "BFCH": "Big Fun Chain", "BFDT": "Befund", "BFEX": "BFEX", + "BFHT": "BeFaster Holder Token", "BFI": "BitDefi", "BFIC": "Bficoin", "BFLOKI": "BurnFloki", @@ -734,25 +786,28 @@ "BGG": "BGG Token", "BGLD": "Based Gold", "BGONE": "BigONE Token", + "BGS": "Battle of Guardians Share", "BHAO": "Bithao", "BHAX": "Bithashex", "BHC": "BillionHappiness", - "BHD": "Bitcoin HD", "BHEROES": "BombHeroes coin", "BHIRE": "BitHIRE", "BHIVE": "Hive", "BHO": "Bholdus Token", "BHP": "Blockchain of Hash Power", "BHPC": "BHPCash", + "BIBL": "Biblecoin", "BIC": "Bikercoins", "BICO": "Biconomy", - "BID": "Bidao", + "BID": "TopBidder", + "BIDAO": "Bidao", "BIDCOM": "Bidcommerce", "BIDI": "Bidipass", "BIDR": "Binance IDR Stable Coin", "BIFI": "Beefy.Finance", "BIFIF": "BiFi", "BIGHAN": "BighanCoin", + "BIGSB": "BigShortBets", "BIGUP": "BigUp", "BIH": "BitHostCoin", "BIHU": "Key", @@ -761,11 +816,13 @@ "BIM": "BitminerCoin", "BIND": "Compendia", "BINEM": "Binemon", + "BINGO": "Tomorrowland", "BINS": "Bitsense", "BINTEX": "Bintex Futures", - "BIO": "Biocoin", + "BIO": "BITONE", "BIOB": "BioBar", "BIOC": "BioCrypt", + "BIOCOIN": "Biocoin", "BIOFI": "Biometric Financial", "BIOS": "BiosCrypto", "BIOT": "Bio Passport", @@ -778,14 +835,18 @@ "BIST": "Bistroo", "BIT": "BitDAO", "BIT16": "16BitCoin", + "BITAIR": "Bitair", "BITASEAN": "BitAsean", + "BITBOOST": "BitBoost", "BITC": "BitCash", "BITCAR": "BitCar", + "BITCCA": "Bitcci Cash", "BITCI": "Bitcicoin", "BITCM": "Bitcomo", "BITCNY": "bitCNY", "BITCOINC": "Bitcoin Classic", "BITCOINV": "BitcoinV", + "BITCRATIC": "Bitcratic Token", "BITF": "Bit Financial", "BITG": "Bitcoin Green", "BITGOLD": "bitGold", @@ -801,6 +862,7 @@ "BITS": "BitstarCoin", "BITSD": "Bits Digit", "BITSILVER": "bitSilver", + "BITSPACE": "Bitspace", "BITSZ": "Bitsz", "BITT": "BiTToken", "BITTO": "BITTO", @@ -809,6 +871,7 @@ "BITX": "BitScreener", "BITZ": "Bitz Coin", "BIUT": "Bit Trust System", + "BIVE": "BIZVERSE", "BIX": "BiboxCoin", "BIXB": "BIXBCOIN", "BIZZ": "BIZZCOIN", @@ -831,12 +894,14 @@ "BLAZR": "BlazerCoin", "BLC": "BlakeCoin", "BLCT": "Bloomzed Loyalty Club Ticket", + "BLD": "Agoric", "BLES": "Blind Boxes", "BLHC": "BlackholeCoin", "BLIN": "Blin Metaverse", "BLINK": "BlockMason Link", "BLINU": "Baby Lambo Inu", "BLITZ": "BlitzCoin", + "BLITZP": "BlitzPredict", "BLK": "BlackCoin", "BLKC": "BlackHat Coin", "BLKD": "Blinked", @@ -864,9 +929,12 @@ "BLU": "BlueCoin", "BLUE": "Ethereum Blue", "BLUESPARROW": "BlueSparrow Token", + "BLUESPARROWOLD": "BlueSparrowToken", + "BLUR": "Blur", "BLURT": "Blurt", "BLUT": "Bluetherium", "BLV": "Blockvest", + "BLV3": "Crypto Legions V3", "BLWA": "BlockWarrior", "BLX": "Balloon-X", "BLXM": "bloXmove Token", @@ -876,6 +944,8 @@ "BM": "BitMoon", "BMARS": "Binamars", "BMC": "Blackmoon Crypto", + "BME": "BitcoMine", + "BMEX": "BitMEX", "BMG": "Borneo", "BMH": "BlockMesh", "BMI": "Bridge Mutual", @@ -893,6 +963,7 @@ "BNBCH": "BNB Cash", "BNBH": "BnbHeroes Token", "BNC": "Bifrost Native Coin", + "BND": "Bened", "BNF": "BonFi", "BNIX": "BNIX Token", "BNK": "Bankera", @@ -902,6 +973,7 @@ "BNR": "BiNeuro", "BNRTX": "BnrtxCoin", "BNS": "BNS token", + "BNSD": "BNSD Finance", "BNSOLD": "BNS token ", "BNT": "Bancor Network Token", "BNTE": "Bountie", @@ -913,7 +985,9 @@ "BOBA": "Boba Network", "BOBC": "Bobcoin", "BOBS": "Bob's Repair", + "BOBT": "BOB Token", "BODHI": "Bodhi Network", + "BODYP": "Body Profile", "BOE": "Bodhi", "BOG": "Bogged Finance", "BOGCOIN": "Bogcoin", @@ -925,15 +999,15 @@ "BOLTT": "BolttCoin", "BOMB": "BOMB", "BOMBC": "BombCoin", + "BOMBM": "Bomb Money", "BON": "Bonpay", "BONA": "Bonafi", "BOND": "BarnBridge", - "BONDED": "Fringe Finance", "BONDLY": "Bondly", - "BONE": "Bone ShibaSwap (BONE)", + "BONE": "Bone ShibaSwap", "BONES": "BonesCoin", "BONIX": "Blockonix", - "BONK": "BONK Token", + "BONK": "Bonk", "BONO": "Bonorum Coin", "BONTE": "Bontecoin", "BONUSCAKE": "Bonus Cake", @@ -978,7 +1052,7 @@ "BPS": "BitcoinPoS", "BPT": "BlackPool Token", "BPTC": "Business Platform Tomato Coin", - "BPX": "BlitzPredict", + "BPX": "Black Phoenix", "BQ": "Bitqy", "BQC": "BQCoin", "BQQQ": "Bitsdaq Token", @@ -1007,6 +1081,7 @@ "BRIK": "BrikBit", "BRISE": "Bitgert", "BRIT": "BritCoin", + "BRITTO": "Britto", "BRIX": "OpenBrix", "BRK": "BreakoutCoin", "BRKL": "Brokoli Token", @@ -1016,7 +1091,7 @@ "BRNX": "Bronix", "BRO": "Bitradio", "BRONZ": "BitBronze", - "BRT": "Britto", + "BRT": "Bikerush", "BRTR": "Barter", "BRTX": "Bertinity", "BRWL": "Blockchain Brawlers", @@ -1038,13 +1113,13 @@ "BSCV": "Bscview", "BSE": "BitSerial", "BSEND": "BitSend", + "BSGG": "Betswap.gg", "BSGS": "Basis Gold Share", "BSI": "Bali Social Integrated", "BSKT": "BasketCoin", "BSL": "BankSocial", "BSOV": "BitcoinSoV", "BSP": "BallSwap", - "BSPARROW": "BlueSparrowToken", "BSPM": "Bitcoin Supreme", "BSR": "BitSoar Coin", "BST": "Beshare Token", @@ -1054,7 +1129,7 @@ "BSTY": "GlobalBoost", "BSV": "Bitcoin SV", "BSW": "Biswap", - "BSX": "Bitspace", + "BSX": "Basilisk", "BSYS": "BSYS", "BT": "BT.Finance", "BT1": "Bitfinex Bitcoin Future", @@ -1062,9 +1137,10 @@ "BTA": "Bata", "BTB": "BitBar", "BTBL": "Bitball", + "BTBS": "BitBase Token", "BTC": "Bitcoin", "BTC2": "Bitcoin 2", - "BTCA": "Bitair", + "BTCA": "BITCOIN ADDITIONAL", "BTCAS": "BitcoinAsia", "BTCB": "Bitcoin BEP2", "BTCBR": "Bitcoin BR", @@ -1075,11 +1151,14 @@ "BTCF": "BitcoinFile", "BTCGO": "BitcoinGo", "BTCH": "Bitcoin Hush", + "BTCHD": "Bitcoin HD", "BTCK": "Bitcoin Turbo Koin", "BTCL": "BTC Lite", "BTCM": "BTCMoon", "BTCN": "BitcoiNote", "BTCP": "Bitcoin Private", + "BTCPAY": "Bitcoin Pay", + "BTCPX": "BTC Proxy", "BTCR": "BitCurrency", "BTCRED": "Bitcoin Red", "BTCRY": "BitCrystal", @@ -1093,6 +1172,7 @@ "BTDX": "Bitcloud 2.0", "BTE": "BTEcoin", "BTF": "Blockchain Traded Fund", + "BTFA": "Banana Task Force Ape", "BTG": "Bitcoin Gold", "BTH": "Bithereum", "BTK": "Bostoken", @@ -1143,16 +1223,21 @@ "BUILDIN": "Buildin Token", "BUILDTEAM": "BuildTeam", "BUK": "CryptoBuk", + "BULL": "Bullieverse", "BULLC": "BuySell", + "BULLION": "BullionFX", "BULLS": "BullshitCoin", + "BULLSH": "Bullshit Inu", "BUMN": "BUMooN", + "BUMP": "Bumper", "BUN": "BunnyCoin", "BUNNY": "Pancake Bunny", "BUNNYROCKET": "BunnyRocket", "BURGER": "Burger Swap", + "BURN": "Bitburn", "BURNDOGE": "BurnDoge", "BURP": "CoinBurp", - "BUSD": "BUSD", + "BUSD": "Binance USD", "BUSDC": "BUSD", "BUSY": "Busy DAO", "BUT": "BitUP Token", @@ -1168,20 +1253,22 @@ "BWF": "Beowulf", "BWK": "Bulwark", "BWN": "BitWings", + "BWO": "Battle World", "BWS": "BitcoinWSpectrum", "BWT": "Bittwatt", "BWT2": "Bitwin 2.0", "BWX": "Blue Whale", + "BX": "BlockXpress", "BXA": "Blockchain Exchange Alliance", "BXC": "BonusCloud", "BXF": "BlackFort Token", "BXH": "BXH", "BXK": "Bitbook Gambling", "BXT": "BitTokens", + "BXTB": "BXTB Foundation", "BXX": "Baanx", "BXY": "Beaxy", "BYC": "ByteCent", - "BYN": "Beyond Finance", "BYTHER": "Bytether ", "BYTS": "Bytus", "BYTZ": "BYTZ", @@ -1190,6 +1277,8 @@ "BZKY": "Bizkey", "BZL": "BZLCoin", "BZNT": "Bezant", + "BZRX": "bZx Protocol", + "BZX": "Bitcoin Zero", "BZZ": "Swarmv", "BZZONE": "Bzzone", "BamitCoin": "BAM", @@ -1204,6 +1293,7 @@ "CABS": "CryptoABS", "CACH": "Cachecoin", "CACHE": "Cache", + "CACHEGOLD": "CACHE Gold", "CADN": "Content and AD Network", "CADX": "eToro Canadian Dollar", "CAG": "Change", @@ -1221,7 +1311,7 @@ "CAMC": "Camcoin", "CAMP": "Camp", "CAN": "Channels", - "CAND": "Canlead", + "CAND": "Canary Dollar", "CANDY": "UnicornGo Candy", "CANN": "CannabisCoin", "CANTI": "Cantina Royale", @@ -1237,23 +1327,27 @@ "CARD": "Cardstack", "CARDS": "Cardstarter", "CARE": "Carebit", + "CARES": "CareCoin", "CARPE": "CarpeDiemCoin", "CARR": "Carnomaly", "CARROT": "CarrotSwap", - "CARRY": "Carry", "CART": "CryptoArt.Ai", "CARTAXI": "CarTaxi", "CARTERCOIN": "CarterCoin", "CAS": "Cashaa", "CASH": "CashCoin", "CASHT": "Cash Tech", + "CASIO": "CasinoXMetaverse", "CASPER": "Casper DeFi", "CAST": "Castello Coin", + "CASTLE": "bitCastle", "CAT": "Cat Token", "CATC": "Catcoin", "CATCOIN": "CatCoin Cash", "CATE": "CateCoin", "CATGIRL": "Catgirl", + "CATHEON": "Catheon Gaming", + "CATS": "CatCoin Token", "CATT": "Catex", "CATX": "CAT.trade Protocol", "CATZ": "CatzCoin", @@ -1267,6 +1361,7 @@ "CBD": "CBD Crystals", "CBDC": "CannaBCoin", "CBE": "The Chain of Business Entertainment", + "CBETH": "Coinbase Wrapped Staked ETH", "CBFT": "CoinBene Future Token", "CBG": "Chainbing", "CBK": "Cobak Token", @@ -1281,10 +1376,10 @@ "CBT": "CommerceBlock Token", "CBUCKS": "CRYPTOBUCKS", "CBUK": "CurveBlock", - "CBX": "CryptoBullion", - "CC": "CyberCoin", + "CBX": "CropBytes", + "CC": "CloudChat", "CC10": "Cryptocurrency Top 10 Tokens Index", - "CCA": "Counos Coin", + "CCA": "CCA", "CCAKE": "CheeseCake Swap", "CCAR": "CryptoCars", "CCC": "CCCoin", @@ -1301,8 +1396,9 @@ "CCOMM": "Crypto Commonwealth", "CCOMP": "cCOMP", "CCOS": "CrowdCoinage", + "CCP": "CryptoCoinPay", "CCRB": "CryptoCarbon", - "CCT": "Crystal Clear Token", + "CCT": "Carbon Credit", "CCTN": "Connectchain", "CCX": "Conceal", "CCXC": "CoolinDarkCoin", @@ -1318,6 +1414,7 @@ "CEDEX": "CEDEX Coin", "CEEK": "CEEK Smart VR Token", "CEFS": "CryptopiaFeeShares", + "CEJI": "Ceji", "CEL": "Celsius Network", "CELEB": "CELEBPLUS", "CELL": "Cellframe", @@ -1330,6 +1427,7 @@ "CENNZ": "Centrality Token", "CENT": "CENTERCOIN", "CENTRA": "Centra", + "CENX": "Centcex", "CERE": "Cere Network", "CESC": "Crypto Escudo", "CET": "CoinEx Token", @@ -1354,8 +1452,10 @@ "CGA": "Cryptographic Anomaly", "CGG": "Chain Guardians", "CGLD": "Celo Gold", + "CGO": "Comtech Gold", + "CGPT": "ChainGPT", "CGS": "Crypto Gladiator Shards", - "CGT": "CACHE Gold", + "CGT": "Coin Gabbar Token", "CGU": "Crypto Gaming United", "CHA": "Charity Coin", "CHADS": "CHADS VC", @@ -1364,6 +1464,7 @@ "CHAL": "Chalice Finance", "CHAMP": "NFT Champions", "CHAN": "ChanCoin", + "CHANGE": "ChangeX", "CHAO": "23 Skidoo", "CHARIZARD": "Charizard Inu", "CHARM": "Charm Coin", @@ -1373,7 +1474,6 @@ "CHAT": "OpenChat", "CHBR": "CryptoHub", "CHC": "ChainCoin", - "CHE": "CherrySwap", "CHECK": "Paycheck", "CHECKR": "CheckerChain", "CHECOIN": "CheCoin", @@ -1382,6 +1482,7 @@ "CHEESUS": "Cheesus", "CHEQ": "CHEQD Network", "CHER": "Cherry Network", + "CHERRY": "CherrySwap", "CHESS": "Tranchess", "CHESSCOIN": "ChessCoin", "CHEX": "Chintai", @@ -1410,6 +1511,7 @@ "CHOW": "Chow Chow Finance", "CHP": "CoinPoker Token", "CHR": "Chroma", + "CHRP": "Chirpley", "CHS": "Chainsquare", "CHSB": "SwissBorg", "CHT": "Countinghouse Fund", @@ -1450,6 +1552,7 @@ "CLD": "Cloud", "CLDX": "Cloverdex", "CLEARPOLL": "ClearPoll", + "CLEG": "Chain of Legends", "CLEVERCOIN": "CleverCoin", "CLH": "ClearDAO", "CLICK": "Clickcoin", @@ -1459,6 +1562,7 @@ "CLINT": "Clinton", "CLIQ": "DefiCliq", "CLIST": "Chainlist", + "CLM": "CoinClaim", "CLN": "Colu Local Network", "CLNY": "Colony", "CLO": "Callisto Network", @@ -1485,11 +1589,13 @@ "CMERGE": "CoinMerge", "CMK": "Credmark", "CMKR": "cMKR", + "CML": "Camelcoin", "CMM": "Commercium", "CMN": "Crypto Media Network", - "CMOS": "Cosmo", - "CMP": "Compcoin", + "CMOS": "CoinMerge OS", + "CMP": "Caduceus", "CMPCO": "CampusCoin", + "CMQ": "Communique", "CMS": "COMSA", "CMSN": "The Commission", "CMT": "CyberMiles", @@ -1502,6 +1608,8 @@ "CNCT": "CONNECT", "CND": "Cindicator", "CNDL": "Candle", + "CNFI": "Connect Financial", + "CNG": "Changer", "CNHT": "Tether CNH", "CNL": "ConcealCoin", "CNMT": "Coinomat", @@ -1520,7 +1628,7 @@ "CO2": "CO2 Token", "COAL": "BitCoal", "COB": "Cobinhood", - "COC": "Community Coin", + "COC": "Coin of the champions", "COCK": "Shibacock", "COCOS": "COCOS BCX", "CODEO": "Codeo Token", @@ -1539,6 +1647,7 @@ "COINDEFI": "Coin", "COING": "Coingrid", "COINLION": "CoinLion", + "COINSCOPE": "Coinscope", "COINSL": "CoinsLoot", "COINVEST": "Coinvest", "COKE": "Cocaine Cowboy Shards", @@ -1546,18 +1655,23 @@ "COLA": "Cola", "COLL": "Collateral Pay", "COLLG": "Collateral Pay Governance", + "COLR": "colR Coin", "COLX": "ColossusCoinXT", "COM": "Coliseum", "COMB": "Combo", "COMBO": "Furucombo", "COMFI": "CompliFi", "COMM": "Community Coin", + "COMMUNITYCOIN": "Community Coin", "COMP": "Compound Governance Token", + "COMPCOIN": "Compcoin", "COMPD": "Compound Coin", "COMT": "Community Token", "CONDENSATE": "Condensate", + "CONG": "The Conglomerate Capital", "CONI": "CoinBene", "CONS": "ConSpiracy Coin", + "CONSENTIUM": "Consentium", "CONT": "Contentos", "CONUN": "CONUN", "CONV": "Convergence", @@ -1569,7 +1683,7 @@ "COPS": "Cops Finance", "COR": "Corion", "CORAL": "CoralPay", - "CORE": "cVault.finance", + "CORE": "Coreum", "COREDAO": "coreDAO", "COREG": "Core Group Asset", "CORGI": "Corgi Inu", @@ -1584,6 +1698,7 @@ "COT": "CoTrader", "COTI": "COTI", "COU": "Couchain", + "COUNOS": "Counos Coin", "COV": "Covesting", "COVA": "COVA", "COVAL": "Circuits of Value", @@ -1616,6 +1731,7 @@ "CPRX": "Crypto Perx", "CPS": "CapriCoin", "CPT": "Cryptaur", + "CPU": "CPUcoin", "CPX": "Apex Token", "CPY": "COPYTRACK", "CQST": "ConquestCoin", @@ -1625,9 +1741,11 @@ "CRA": "Crabada", "CRAB": "CrabCoin", "CRACK": "CrackCoin", + "CRADLE": "Cradle of Sins", "CRAFT": "TaleCraft", "CRAFTCOIN": "Craftcoin", "CRAIG": "CraigsCoin", + "CRAMER": "Cramer Coin", "CRANEPAY": "Cranepay", "CRAVE": "CraveCoin", "CRB": "Creditbit", @@ -1639,11 +1757,14 @@ "CRDS": "Credits", "CRDT": "CRDT", "CRDTS": "Credits", + "CRE": "Carry", "CREA": "CreativeChain", "CREAM": "Cream", + "CREATIVE": "Creative Token", "CRED": "Verify", "CREDI": "Credefi", - "CREDIT": "TerraCredit", + "CREDIT": "Credit", + "CREDITS": "Credits", "CREDO": "Credo", "CREED": "Thecreed", "CREO": "Creo Engine", @@ -1660,9 +1781,11 @@ "CRNK": "CrankCoin", "CRO": "Cronos", "CROAT": "Croat", + "CROGE": "Crogecoin", "CRON": "Cryptocean", "CROPPER": "CropperFinance", "CROWD": "CrowdCoin", + "CROWDWIZ": "Crowdwiz", "CRP": "Crypton", "CRPS": "CryptoPennies", "CRPT": "Crypterium", @@ -1679,15 +1802,17 @@ "CRX": "ChronosCoin", "CRYP": "CrypticCoin", "CRYPT": "CryptCoin", + "CRYPTOBULLION": "CryptoBullion", "CRYPTOE": "Cryptoenter", "CRYPTONITE": "Cryptonite", "CRYPTOPRO": "CryptoProfile", + "CRYSTALCLEAR": "Crystal Clear Token", "CSAC": "Credit Safe Application Chain", "CSAI": "Compound SAI", "CSC": "CasinoCoin", "CSEN": "Consensus", "CSH": "CashOut", - "CSM": "Consentium", + "CSM": "Crust Shadow", "CSMIC": "Cosmic", "CSNO": "BitDice", "CSNP": "CrowdSale Network", @@ -1698,7 +1823,9 @@ "CSQ": "cosquare", "CSR": "Cashera", "CSS": "CoinSwap Token", + "CSTC": "CryptosTribe", "CSTL": "Castle", + "CSTR": "CoreStarter", "CSUSHI": "cSUSHI", "CSWAP": "CardSwap", "CSX": "Coinstox", @@ -1710,28 +1837,31 @@ "CTF": "CyberTime Finance", "CTI": "ClinTex CTi", "CTIC": "Coinmatic", - "CTK": "CertiK", + "CTK": "Shentu", "CTKN": "Curaizon", "CTL": "Citadel", "CTLX": "Cash Telex", + "CTN": "Continuum Finance", "CTO": "Crypto", "CTP": "Captain Planet", "CTPL": "Cultiplan", "CTPT": "Contents Protocol", "CTR": "Creator Platform", + "CTS": "Citrus", "CTSI": "Cartesi", "CTT": "Castweet", "CTW": "Citowise", "CTX": "Cryptex", "CTXC": "Cortex", "CTY": "Connecty", - "CUBE": "Somnium Space CUBEs", + "CUBE": "Cube Network", "CUBEAUTO": "Cube", "CUDOS": "Cudos", "CUE": "CUE Protocol", "CUEX": "Cuex", "CULT": "Cult DAO", "CUMMIES": "CumRocket", + "CUNI": "Compound Uni", "CURA": "Cura Network", "CURE": "Curecoin", "CURI": "Curium", @@ -1748,6 +1878,7 @@ "CV": "CarVertical", "CVA": "Crypto Village Accelerator", "CVAG": "Crypto Village Accelerator CVAG", + "CVAULT": "cVault.finance", "CVC": "Civic", "CVCC": "CryptoVerificationCoin", "CVCOIN": "Crypviser", @@ -1765,6 +1896,7 @@ "CW": "CardWallet", "CWAR": "Cryowar Token", "CWBTC": "Compound Wrapped BTC", + "CWD": "CROWD", "CWEB": "Coinweb", "CWEX": "Crypto Wine Exchange", "CWIS": "Crypto Wisdom Coin", @@ -1784,6 +1916,7 @@ "CXPAD": "CoinxPad", "CXT": "Coinonat", "CYBER": "CyberWay", + "CYBERC": "CyberCoin", "CYBERD": "Cyber Doge", "CYBR": "CYBR", "CYC": "Cyclone Protocol", @@ -1793,6 +1926,7 @@ "CYFI": "cYFI", "CYG": "Cygnus", "CYL": "Crystal Token", + "CYOP": "CyOp Protocol", "CYP": "CypherPunkCoin", "CYRS": "Cyrus Token", "CYS": "BlooCYS", @@ -1802,6 +1936,7 @@ "CZRX": "Compound 0x", "CZZ": "ClassZZ", "D": "Denarius", + "D11": "DeFi11", "D4RK": "DarkPayCoin", "DAB": "DABANKING", "DAC": "Davinci Coin", @@ -1810,6 +1945,7 @@ "DACC2": "DACC2", "DACH": "DACH Coin", "DACS": "Dacsee", + "DACXI": "Dacxi", "DAD": "DAD", "DADDYDOGE": "Daddy Doge", "DADI": "Edge", @@ -1826,6 +1962,7 @@ "DAL": "DAOLaunch", "DALI": "Dalichain", "DAM": "Datamine", + "DAMEX": "DAMEX", "DAMO": "Coinzen", "DAN": "Daneel", "DANA": "Ardana", @@ -1840,6 +1977,7 @@ "DAPPX": "dAppstore", "DAPS": "DAPS Coin", "DAR": "Mines of Dalarnia", + "DARA": "Immutable", "DARB": "Darb Token", "DARC": "Konstellation", "DARCRUS": "Darcrus", @@ -1872,21 +2010,25 @@ "DBET": "Decent.bet", "DBIC": "DubaiCoin", "DBIX": "DubaiCoin", + "DBL": "Doubloon", "DBOX": "DefiBox", "DBR": "Düber", "DBTC": "DebitCoin", "DBTN": "Universa Native token", "DBUND": "DarkBundles", "DBUY": "Doont Buy", - "DBX.CUR": "DropBox", + "DBX": "DBX", "DBY": "Dobuy", "DBZ": "Diamond Boyz Coin", + "DC": "Dogechain", "DCASH": "Diabolo", "DCB": "Decubate", "DCC": "Distributed Credit Chain", "DCCT": "DocuChain", + "DCIP": "Decentralized Community Investment Protocol", "DCK": "DickCoin", "DCN": "Dentacoin", + "DCNT": "Decanect", "DCR": "Decred", "DCRE": "DeltaCredits", "DCS.": "deCLOUDs", @@ -1911,6 +2053,7 @@ "DEAL": "iDealCash", "DEB": "Debitum Token", "DEBASE": "Debase", + "DEBT": "The Debt Box", "DEC": "Decentr", "DEEP": "DeepCloud AI", "DEEPG": "Deep Gold", @@ -1923,13 +2066,15 @@ "DEFLCT": "Deflect", "DEFLY": "Deflyball", "DEFT": "DeFi Factory Token", + "DEFY": "DEFY", "DEG": "Degis", "DEGO": "Dego Finance", "DEGOV": "Degov", "DEHUB": "DeHub", "DEI": "Deimos", "DEK": "DekBox", - "DEL": "DelChain", + "DEL": "Decimal", + "DELCHAIN": "DelChain", "DELFI": "DeltaFi", "DELTA": "Delta Financial", "DELTAC": "DeltaChain", @@ -1968,6 +2113,7 @@ "DFBT": "DentalFix", "DFC": "DeFiScale", "DFD": "DefiDollar DAO", + "DFG": "Defigram", "DFGL": "DeFi Gold", "DFI": "DeFiChain", "DFIAT": "DeFiato", @@ -1995,10 +2141,12 @@ "DGMS": "Digigems", "DGN": "Diagon", "DGORE": "DogeGoreCoin", + "DGP": "DGPayment", "DGPT": "DigiPulse", "DGTX": "Digitex Token", "DGVC": "DegenVC", "DGX": "Digix Gold token", + "DHR": "DeHR Network", "DHS": "Dirham Crypto", "DHT": "dHedge DAO", "DHV": "DeHive", @@ -2010,6 +2158,7 @@ "DICEM": "DICE Money", "DICETRX": "TRONbetDice", "DID": "Didcoin", + "DIE": "Die Protocol", "DIEM": "Facebook Diem", "DIESEL": "Diesel", "DIFX": "Digital Financial Exchange", @@ -2023,12 +2172,14 @@ "DILI": "D Community", "DIM": "DIMCOIN", "DIME": "DimeCoin", + "DIMO": "DIMO", "DIN": "Dinero", "DINGER": "Dinger Token", "DINGO": "Dingocoin", "DINO": "DinoSwap", "DINU": "Dogey-Inu", "DIO": "Decimated", + "DIONE": "Dione", "DIP": "Etherisc", "DIS": "TosDis", "DISCOVERY": "DiscoveryIoT", @@ -2042,9 +2193,11 @@ "DKA": "dKargo", "DKC": "DarkKnightCoin", "DKD": "Dekado", + "DKEY": "DKEY Bank", "DKKT": "DKK Token", + "DKS": "DarkShield", "DLA": "Dolla", - "DLC": "DollarCoin", + "DLC": "Diamond Launch", "DLISK": "Dlisk", "DLO": "Delio", "DLPD": "DLP Duck Token", @@ -2079,6 +2232,7 @@ "DNTX": "DNAtix", "DNXC": "DinoX", "DNZ.BITCI": "Denizlispor Fan Token", + "DOBO": "DogeBonk", "DOC": "Dochain", "DOCC": "Doc Coin", "DOCK": "Dock.io", @@ -2089,16 +2243,20 @@ "DOG": "The Doge NFT", "DOGA": "Dogami", "DOGACOIN": "DogaCoin", + "DOGBOSS": "Dog Boss", "DOGDEFI": "DogDeFiCoin", "DOGE": "Dogecoin", "DOGEBNB": "DogeBNB", "DOGEC": "DogeCash", + "DOGECEO": "Doge CEO", "DOGECOIN": "Buff Doge Coin", "DOGECOLA": "DogeCola", + "DOGECUBE": "DogeCube", "DOGED": "DogeCoinDark", "DOGEDAO": "DogeDao", "DOGEDASH": "Doge Dash", "DOGEGF": "DogeGF", + "DOGEMETA": "Dogemetaverse", "DOGESWAP": "Dogeswap Token (HECO)", "DOGETH": "EtherDoge", "DOGEX": "DogeHouse Capital", @@ -2110,14 +2268,16 @@ "DOGZ": "Dogz", "DOKI": "Doki Doki Finance", "DOLA": "Dola USD Stablecoin", + "DOLLARCOIN": "DollarCoin", "DOLZ": "DOLZ", "DOME": "Everdome", "DOMI": "Domi", - "DON": "Don-key", + "DON": "Donnie Finance", "DONATION": "DonationCoin", + "DONK": "Don-key", + "DONTBUYMEME": "Meme", "DOOH": "Bidooh", "DOOR": "DOOR", - "DOP": "Drops", "DOPE": "DopeCoin", "DOR": "Dorado", "DORA": "Dora Factory", @@ -2125,6 +2285,7 @@ "DOSE": "DOSE", "DOT": "Polkadot", "DOTC": "Dotcoin", + "DOTR": "Cydotori", "DOUGH": "PieDAO v2 (DOUGH)", "DOV": "DOVU", "DOWS": "Shadows", @@ -2142,6 +2303,7 @@ "DPY": "Delphy", "DRA": "DraculaCoin", "DRACO": "DT Token", + "DRACOO": "DracooMaster", "DRAGONMA": "Dragon Mainland Shards", "DRC": "DRC Mobility", "DRCT": "Ally Direct", @@ -2154,12 +2316,15 @@ "DRGN": "Dragonchain", "DRINK": "DrinkChain", "DRIP": "Drip Network", + "DRIV": "DRIVEZ", + "DRIVECRYPTO": "Drive Crypto", "DRKC": "DarkCash", "DRKT": "DarkTron", "DRM": "DoDreamChain", "DRM8": "Dream8Coin", "DRONE": "Drone Coin", "DROP": "Dropil", + "DROPS": "Drops", "DRP": "DCORP", "DRPU": "DRP Utility", "DRS": "Digital Rupees", @@ -2189,7 +2354,7 @@ "DTN": "Datareum", "DTO": "DotOracle", "DTOP": "DTOP Token", - "DTR": "Dynamic Trading Rights", + "DTR": "Dotori", "DTRC": "Datarius", "DTX": "DataBroker DAO", "DUB": "DubCoin", @@ -2207,15 +2372,17 @@ "DUO": "ParallelCoin", "DUOT": "DUO Network", "DUSK": "Dusk Network", + "DUST": "DUST Protocol", "DUX": "DuxCoin", "DV": "Dreamverse", "DVC": "DragonVein", "DVDX": "Derived", - "DVF": "DVF", + "DVF": "Rhino.fi", "DVG": "DAOventures", "DVI": "Dvision Network", "DVP": "Decentralized Vulnerability Platform", "DVPN": "Sentinel", + "DVRS": "DaoVerse", "DVS": "Davies", "DVT": "DeVault", "DVTC": "DivotyCoin", @@ -2237,11 +2404,13 @@ "DYC": "Dycoin", "DYDX": "dYdX", "DYN": "Dynamic", + "DYNAMICTRADING": "Dynamic Trading Rights", "DYNCOIN": "Dyncoin", "DYNMT": "Dynamite", "DYNO": "DYNO", - "DYP": "DeFi Yield Protocol", + "DYP": "Dypius", "DYT": "DoYourTip", + "DZAR": "Digital Rand", "DZCC": "DZCC", "DZI": "DeFinition", "Dow": "DowCoin", @@ -2251,9 +2420,11 @@ "EAC": "Education Assessment Cult", "EAGS": "EagsCoin", "EAI": "Edain", + "EARN": "EarnGuild", "EARTH": "Earth Token", "EARTHCOIN": "EarthCoin", "EASYF": "EasyFeedback", + "EAT": "EDGE Activity Token", "EAURIC": "Eauric", "EB3": "EB3coin", "EBASE": "EURBASE", @@ -2281,8 +2452,10 @@ "ECOC": "ECOcoin", "ECOCH": "ECOChain", "ECOFI": "EcoFi", + "ECOIN": "Ecoin", "ECOM": "Omnitude", "ECOREAL": "Ecoreal Estate", + "ECOX": "ECOx", "ECP": "ECP+ Technology", "ECR": "EcoVerse", "ECT": "SuperEdge", @@ -2320,12 +2493,14 @@ "EGGC": "EggCoin", "EGGP": "Eggplant Finance", "EGI": "eGame", - "EGLD": "Elrond", + "EGLD": "eGold", "EGO": "EGOcoin", "EGR": "Egoras Rights", "EGS": "EdgeSwap", "EGT": "Egretia", + "EGX": "Enegra", "EHASH": "EHash", + "EHIVE": "eHive", "EHRT": "Eight Hours Token", "EIFI": "EIFI FINANCE", "EJAC": "EJA Coin", @@ -2350,6 +2525,7 @@ "ELEN": "Everlens", "ELES": "Elements Estates", "ELF": "aelf", + "ELG": "EscoinToken", "ELI": "GoCrypto", "ELIC": "Elicoin", "ELITE": "EthereumLite", @@ -2360,14 +2536,16 @@ "ELON": "Dogelon Mars", "ELONCAT": "ELON CAT COIN", "ELONGD": "Elongate Deluxe", + "ELONGT": "Elon GOAT", "ELONONE": "AstroElon", "ELP": "Ellerium", "ELS": "Elysium", - "ELT": "Electron", + "ELT": "Element Black", "ELTC2": "eLTC", "ELTCOIN": "ELTCOIN", "ELU": "Elumia", "ELV": "Elvantis", + "ELVN": "11Minutes", "ELX": "Energy Ledger", "ELY": "Elysian", "EM": "Eminer", @@ -2394,6 +2572,7 @@ "EMV": "Ethereum Movie Venture", "EMX": "EMX", "ENC": "Encores Token", + "ENCD": "Encircled", "ENCN": "EndChain", "ENCRYPG": "EncrypGen", "ENCX": "Encrybit", @@ -2421,6 +2600,7 @@ "ENU": "Enumivo", "ENV": "ENVOY", "ENVIENTA": "Envienta", + "ENVION": "Envion", "ENX": "ENEX", "EOC": "EveryonesCoin", "EON": "Exscudo", @@ -2440,7 +2620,7 @@ "EPTT": "Evident Proof Transaction Token", "EPX": "Ellipsis X", "EPY": "Empyrean", - "EQ": "EQUI", + "EQ": "Equilibrium", "EQC": "Ethereum Qchain Token", "EQL": "EQUAL", "EQM": "Equilibrium Coin", @@ -2448,30 +2628,32 @@ "EQT": "EquiTrader", "EQUAD": "Quadrant Protocol", "EQUAL": "EqualCoin", - "EQUI": "EQUI Token", + "EQUI": "EQUI", + "EQUITOKEN": "EQUI Token", "EQX": "EQIFi", "EQZ": "Equalizer", "ERA": "ETHA", "ERA7": "Era Token", "ERB": "ERBCoin", "ERC": "EuropeCoin", - "ERC20": "Index ERC20", + "ERC20": "ERC20", "ERD": "Elrond", "ERE": "Erecoin", "EREAL": "eREAL", "ERG": "Ergo", "ERIS": "Eristica", "ERK": "Eureka Coin", - "ERN": "Ethernity Chain", "ERO": "Eroscoin", "ERON": "ERON", "EROTICA": "Erotica", - "EROWAN": "Sifchain", - "ERR": "ErrorCoin", + "ERR": "Coinerr", "ERROR": "484 Fund", + "ERRORCOIN": "ErrorCoin", "ERSDL": "UnFederalReserve", "ERT": "Esports.com", + "ERTH": "Erth Point", "ERTHA": "Ertha", + "ERW": "ZeLoop Eco Reward", "ERY": "Eryllium", "ES": "Era Swap Token", "ESBC": "ESBC", @@ -2481,6 +2663,7 @@ "ESGC": "ESG Chain", "ESH": "Switch", "ESN": "Ethersocial", + "ESNC": "Galaxy Arena Metaverse", "ESP": "Espers", "ESS": "Essentia", "EST": "ESports Chain", @@ -2503,11 +2686,14 @@ "ETH2": "Eth 2.0 Staking by Pool-X", "ETH2X-FLI": "ETH 2x Flexible Leverage Index", "ETHA": "ETHA Lend", + "ETHAX": "ETHAX", "ETHB": "EtherBTC", "ETHBN": "EtherBone", "ETHD": "Ethereum Dark", "ETHER": "Etherparty", "ETHERDELTA": "EtherDelta", + "ETHERNITY": "Ethernity Chain", + "ETHF": "EthereumFair", "ETHIX": "EthicHub", "ETHM": "Ethereum Meta", "ETHO": "The Etho Protocol", @@ -2515,11 +2701,14 @@ "ETHP": "ETHPlus", "ETHPAD": "ETHPad", "ETHPLO": "ETHplode", + "ETHPOS": "ETHPoS", + "ETHPOW": "ETHPoW", "ETHPR": "Ethereum Premium", "ETHPY": "Etherpay", "ETHS": "EthereumScrypt", "ETHSHIB": "Eth Shiba", "ETHV": "Ethverse", + "ETHW": "Ethereum PoW", "ETHY": "Ethereum Yield", "ETI": "EtherInc", "ETK": "Energi Token", @@ -2545,6 +2734,7 @@ "EUNO": "EUNO", "EURN": "NOKU EUR", "EUROC": "Euro Coin", + "EUROE": "EUROe Stablecoin", "EURS": "STASIS EURS", "EURT": "Euro Tether", "EURU": "Upper Euro", @@ -2554,16 +2744,19 @@ "EVAULT": "EthereumVault", "EVC": "Eventchain", "EVCC": "Eco Value Coin", + "EVCOIN": "EverestCoin", "EVE": "Devery", "EVED": "Evedo", "EVENC": "EvenCoin", "EVENT": "Event Token", "EVER": "Everscale", + "EVEREST": "Everest", "EVERGREEN": "EverGreenCoin", "EVERLIFE": "EverLife.AI", "EVIL": "EvilCoin", "EVMOS": "Evmos", - "EVN": "Envion", + "EVN": "Evn Token", + "EVO": "EvoVerses", "EVOL": "EVOL NETWORK", "EVOS": "EVOS", "EVR": "Everus", @@ -2576,6 +2769,7 @@ "EVZ": "Electric Vehicle Zone", "EWC": "Erugo World Coin", "EWT": "Energy Web Token", + "EWTT": "Ecowatt", "EXB": "ExaByte (EXB)", "EXC": "Eximchain", "EXCC": "ExchangeCoin", @@ -2596,8 +2790,9 @@ "EXTP": "TradePlace", "EXY": "Experty", "EXZO": "ExzoCoin 2.0", - "EYE": "EYE Token", + "EYE": "MEDIA EYE", "EYES": "Eyes Protocol", + "EYETOKEN": "EYE Token", "EZ": "EasyFi V2", "EZC": "EZCoin", "EZM": "EZMarket", @@ -2610,27 +2805,33 @@ "FAB": "FABRK Token", "FABA": "Faba Invest", "FABRIC": "MetaFabric", - "FACE": "Faceter", + "FACE": "FaceDAO", + "FACETER": "Faceter", + "FACTOM": "Factom", "FADO": "FADO Go", "FAG": "PoorFag", "FAI": "Fairum", "FAIR": "FairCoin", "FAIRC": "Faireum Token", "FAIRG": "FairGame", + "FAKT": "Medifakt", "FALCONS": "Falcon Swaps", - "FAME": "Fame", + "FAME": "Fame MMA", "FAMEC": "FameCoin", "FAMILY": "The Bitcoin Family", "FAN": "Fanadise", "FAN360": "Fan360", + "FANC": "fanC", + "FANV": "FanVerse", "FANZ": "FanChain", "FAR": "Farmland Protocol", "FARA": "FaraLand", "FARM": "Harvest Finance", "FARMA": "FarmaTrust", "FARMC": "FARM Coin", - "FAST": "Fastswap", + "FAST": "PodFast", "FASTMOON": "FastMoon", + "FASTSWAP": "Fastswap", "FAT": "Fatcoin", "FATCAKE": "FatCake", "FAYRE": "Fayre", @@ -2639,9 +2840,10 @@ "FBB": "FilmBusinessBuster", "FBN": "Five balance", "FBNB": "ForeverBNB", - "FBX": "ForthBox", + "FBX": "Finance Blocks", "FC": "Facecoin", "FC2": "Fuel2Coin", + "FCD": "FreshCut Diamond", "FCF": "French Connection Finance", "FCH": "Freecash", "FCL": "Fractal", @@ -2650,18 +2852,25 @@ "FCON": "SpaceFalcon", "FCQ": "Fortem Capital", "FCS": "CryptoFocus", - "FCT": "Factom", + "FCT": "FirmaChain", "FCTC": "FaucetCoin", + "FDC": "Fidance", + "FDLS": "FIDELIS", + "FDM": "Fandom", "FDO": "Firdaos", "FDR": "French Digital Reserve", - "FDT": "FIAT DAO Token", + "FDT": "Frutti Dino", "FDX": "fidentiaX", "FDZ": "Friendz", "FEAR": "Fear", "FEED": "Feeder Finance", + "FEENIXV2": "ProjectFeenixv2", "FEG": "FEG Token", "FEI": "Fei Protocol", "FEN": "First Ever NFT", + "FENOMY": "Fenomy", + "FER": "Ferro", + "FERMA": "Ferma", "FESS": "Fesschain", "FET": "Fetch.AI", "FEVR": "RealFevr", @@ -2676,10 +2885,12 @@ "FFN": "Fairy Forest", "FFUEL": "getFIFO", "FFYI": "Fiscus FYI", + "FGD": "Freedom God DAO", "FGZ": "Free Game Zone", "FIBRE": "FIBRE", "FIC": "Filecash", "FIDA": "Bonfida", + "FIDLE": "Fidlecoin", "FIELD": "Fieldcoin", "FIFTY": "FIFTYONEFIFTY", "FIG": "FlowCom", @@ -2695,7 +2906,7 @@ "FIND": "FindCoin", "FINE": "Refinable", "FINOM": "Finom FIN Token", - "FINU": "Fire Inu", + "FINU": "Formula Inu", "FIO": "FIO Protocol", "FIRE": "FireCoin", "FIRO": "Firo", @@ -2705,8 +2916,11 @@ "FIT": "Financial Investment Token", "FITC": "Fitcoin", "FITFI": "Step App", + "FIU": "beFITTER", "FIWA": "Defi Warrior", + "FJB": "Freedom. Jobs. Business.", "FJC": "FujiCoin", + "FJT": "Fuji FJT", "FK": "FK Coin", "FKX": "FortKnoxster", "FL": "Freeliquid", @@ -2723,6 +2937,7 @@ "FLETA": "FLETA", "FLEX": "FLEX Coin", "FLG": "Folgory Coin", + "FLIC": "Skaflic", "FLIK": "FLiK", "FLIP": "BitFlip", "FLIXX": "Flixxo", @@ -2732,12 +2947,13 @@ "FLO": "Flo", "FLOAT": "Float Protocol", "FLOKI": "Floki Inu", + "FLOOR": "FloorDAO", "FLOT": "FireLotto", "FLOVM": "FLOV MARKET", - "FLOW": "Flow - Dapper Labs", + "FLOW": "Flow", "FLOWP": "Flow Protocol", "FLP": "Gameflip", - "FLR": "Spark", + "FLR": "Flare", "FLRS": "Flourish Coin", "FLS": "Flits", "FLT": "FlutterCoin", @@ -2749,7 +2965,7 @@ "FLX": "Reflexer Ungovernance Token", "FLY": "Franklin", "FLYCOIN": "FlyCoin", - "FMCT": "FirmaChain", + "FLZ": "Fellaz", "FME": "FME", "FMEX": "FMex", "FMG": "FM Gallery", @@ -2759,8 +2975,9 @@ "FNB": "FNB protocol", "FNC": "Fancy Games", "FNCY": "Fancy That", - "FND": "FundRequest", + "FND": "Rare FND", "FNDZ": "FNDZ Token", + "FNF": "FunFi", "FNK": "FunKeyPay", "FNL": "Finlocale", "FNO": "Fonero", @@ -2772,6 +2989,7 @@ "FOC": "TheForce Trade", "FOCV": "FOCV", "FODL": "Fodl Finance", + "FOF": "Future Of Fintech", "FOGE": "Fat Doge", "FOIN": "Foin", "FOL": "Folder Protocol", @@ -2796,14 +3014,18 @@ "FORM": "Formation FI", "FORT": "Forta", "FORTH": "Ampleforth Governance Token", + "FORTHB": "ForthBox", + "FORTUNA": "Fortuna", "FORTUNE": "Fortune", - "FOTA": "Fortuna", + "FOTA": "Fight Of The Ages", "FOTO": "Unique Photo", + "FOUNTAIN": "Fountain", "FOUR": "4THPILLAR TECHNOLOGIES", "FOX": "ShapeShift FOX Token", "FOXD": "Foxdcoin", "FOXF": "Fox Finance", "FOXT": "Fox Trading", + "FOXV2": "FoxFinanceV2", "FPC": "Futurepia", "FPIS": "Frax Price Index Share", "FR": "Freedom Reserve", @@ -2820,21 +3042,25 @@ "FRED": "FREDEnergy", "FREE": "FREE coin", "FREEROSS": "FreeRossDAO", + "FREL": "Freela", "FREN": "FREN", "FRIN": "Fringe Finance", "FRK": "Franko", "FRM": "Ferrum Network", "FRN": "Francs", + "FRNT": "Final Frontier", "FROG": "FrogSwap", "FROGE": "Froge Finance", "FRONT": "Frontier", "FROYO": "Froyo Games", - "FRR": "Frontrow ", + "FRP": "Fame Reward Plus", + "FRR": "Frontrow", "FRSP": "Forkspot", "FRST": "FirstCoin", "FRTS": "Fruits", "FRV": "Fitrova", "FRWC": "Frankywillcoin", + "FRZSS": "Frz Solar System", "FSBT": "Forty Seven Bank", "FSC": "FriendshipCoin", "FSHN": "Fashion Coin", @@ -2842,13 +3068,14 @@ "FST": "Futureswap", "FSTC": "FastCoin", "FSW": "Falconswap", + "FT": "Fracton Protocol", "FTB": "Fit&Beat", "FTC": "FeatherCoin", "FTG": "fantomGO", "FTI": "FansTime", "FTK": "FToken", "FTM": "Fantom", - "FTN": "Fountain", + "FTN": "Fasttoken", "FTO": "FuturoCoin", "FTP": "FuturePoints", "FTR": "FactR", @@ -2869,15 +3096,18 @@ "FUND": "Unification", "FUNDC": "FUNDChains", "FUNDP": "Fund Platform", + "FUNDREQUEST": "FundRequest", "FUNDYOUR": "FundYourselfNow", "FUNDZ": "FundFantasy", "FUNK": "Cypherfunks Coin", + "FUR": "Furio", "FURY": "Engines of Fury", "FUS": "Fus", "FUSE": "Fuse Network Token", "FUTC": "FutCoin", "FUTURE": "FutureCoin", "FUZZ": "Fuzzballs", + "FVT": "Finance Vote", "FWB": "Friends With Benefits Pro", "FWC": "Qatar 2022", "FWT": "Freeway Token", @@ -2888,10 +3118,12 @@ "FXP": "FXPay", "FXS": "Frax Share", "FXT": "FuzeX", + "FYN": "Affyn", "FYP": "FlypMe", "FYZ": "Fyooz", "FYZNFT": "Fyooz NFT", "G": "GRN Grid", + "G1X": "GoldFinX", "G50": "G50", "G999": "G999", "GAD": "Green App Development", @@ -2902,9 +3134,10 @@ "GAIN": "Gainfy", "GAINS": "Gains", "GAKH": "GAKHcoin", - "GAL": "Project Galaxy", + "GAL": "Galxe", "GALA": "Gala", "GALATA": "Galatasaray Fan Token", + "GALAX": "Galaxy Finance", "GALAXY": "GalaxyCoin", "GALEON": "Galeon", "GALI": "Galilel", @@ -2918,6 +3151,7 @@ "GAMEIN": "Game Infinity", "GAMESTARS": "Game Stars", "GAMEX": "GameX", + "GAMI": "GAMI World", "GAMINGSHIBA": "GamingShiba", "GAMMA": "Gamma Strategies", "GAN": "Galactic Arena: The NFTverse", @@ -2937,6 +3171,7 @@ "GASTRO": "GastroCoin", "GAT": "GATCOIN", "GATE": "GATENet", + "GATEWAY": "Gateway Protocol", "GAZE": "GazeTV", "GB": "GoldBlocks", "GBA": "Geeba", @@ -2948,6 +3183,7 @@ "GBIT": "GravityBit", "GBK": "Goldblock", "GBO": "Gabro.io", + "GBPT": "poundtoken", "GBRC": "GBR Coin", "GBT": "GameBetCoin", "GBTC": "GigTricks", @@ -2955,14 +3191,17 @@ "GBXT": "Globitex Token", "GBYTE": "Obyte", "GC": "Gric Coin", + "GCAKE": "Pancake Games", "GCC": "GuccioneCoin", "GCN": "gCn Coin", "GCOIN": "Galaxy Fight Club", "GCR": "Global Currency Reserve", "GDAO": "Governor DAO", - "GDC": "GrandCoin", + "GDC": "Global Digital Content", "GDDY": "Giddy", + "GDE": "Golden Eagle", "GDL": "GodlyCoin", + "GDO": "GroupDao", "GDOGE": "Golden Doge", "GDR": "Guider.Travel", "GDS": "Grat Deal Coin", @@ -3008,11 +3247,12 @@ "GFCS": "Global Funeral Care", "GFI": "Goldfinch", "GFN": "Graphene", - "GFT": "Giftcoin", + "GFT": "Gifto", "GFUN": "GoldFund", "GFX": "GamyFi Token", "GGC": "Global Game Coin", "GGG": "Good Games Guild", + "GGM": "Monster Galaxy", "GGOLD": "GramGold Coin", "GGP": "GGPro", "GGR": "GGRocket", @@ -3020,17 +3260,20 @@ "GHC": "Galaxy Heroes Coin", "GHCOLD": "Galaxy Heroes Coin", "GHD": "Giftedhands", + "GHNY": "Grizzly Honey", "GHOST": "GhostbyMcAfee", "GHOSTCOIN": "GhostCoin", "GHOSTM": "GhostMarket", "GHOUL": "Ghoul Coin", "GHST": "Aavegotchi", + "GHT": "Global Human Trust", "GHX": "GamerCoin", "GIB": "Bible Coin", "GIC": "Giant", "GIF": "Gift Token", "GIFT": "GiftNet", "GIG": "GigaCoin", + "GIGA": "GigaSwap", "GIM": "Gimli", "GIMMER": "Gimmer", "GIN": "GINcoin", @@ -3038,7 +3281,6 @@ "GIO": "Graviocoin", "GIOT": "Giotto Coin", "GIVE": "GiveCoin", - "GIX": "GoldFinX", "GIZ": "GIZMOcoin", "GJC": "Global Jobcoin", "GKI": "GKi", @@ -3048,6 +3290,7 @@ "GLD": "Goldario", "GLDR": "Golder Coin", "GLDS": "Gdigit", + "GLDX": "Goldex", "GLDY": "Buzzshow", "GLEEC": "Gleec Coin", "GLM": "Golem Network Token", @@ -3070,11 +3313,12 @@ "GMCN": "GambleCoin", "GMCOIN": "GMCoin", "GMEE": "GAMEE", + "GMEX": "Game Coin", "GMI": "GamiFi", "GML": "GameLeagueCoin", "GMM": "Gamium", "GMMT": "Green Mining Movement Token", - "GMPD": "GamesPad ", + "GMPD": "GamesPad", "GMR": "GAMER", "GMS": "Gemstra", "GMT": "STEPN", @@ -3109,7 +3353,9 @@ "GOFX": "GooseFX", "GOG": "Guild of Guardians", "GOGO": "GOGO Finance", + "GOKU": "Goku", "GOL": "GogolCoin", + "GOLC": "GOLCOIN", "GOLD": "CyberDragon Gold", "GOLDENG": "Golden Goose", "GOLDMIN": "GoldMiner", @@ -3148,6 +3394,8 @@ "GPX": "GPEX", "GQ": "Galactic Quadrant", "GR": "GROM", + "GRAIL": "Camelot Token", + "GRANDCOIN": "GrandCoin", "GRAV": "Graviton", "GRAVITYF": "Gravity Finance", "GRAYLL": "GRAYLL", @@ -3163,6 +3411,7 @@ "GRFT": "Graft Blockchain", "GRID": "Grid+", "GRIDCOIN": "GridCoin", + "GRIDZ": "GridZone.io", "GRIMEX": "SpaceGrime", "GRIN": "Grin", "GRLC": "Garlicoin", @@ -3177,6 +3426,7 @@ "GRS": "Groestlcoin", "GRT": "The Graph", "GRUMPY": "Grumpy Finance", + "GRV": "Grove", "GRVE": "Grave", "GRW": "GrowthCoin", "GRWI": "Growers International", @@ -3189,8 +3439,11 @@ "GSM": "GSM Coin", "GSPI": "GSPI", "GSR": "GeyserCoin", - "GST": "Green Satoshi Token", + "GST": "Green Satoshi Token (SOL)", + "GSTBSC": "Green Satoshi Token (BSC)", "GSTC": "GSTCOIN", + "GSTETH": "Green Satoshi Token (ETH)", + "GSTS": "Gunstar Metaverse", "GSTT": "GSTT", "GSWAP": "Gameswap", "GSX": "Gold Secured Currency", @@ -3203,7 +3456,6 @@ "GTIB": "Global Trust Coin", "GTK": "GoToken", "GTN": "GlitzKoin", - "GTO": "GIFTO", "GTON": "GTON Capital", "GTR": "Gturbo", "GTSE": "Global Tourism Sharing Ecology", @@ -3211,6 +3463,7 @@ "GUAR": "Guarium", "GUE": "GuerillaCoin", "GUESS": "Peerguess", + "GUILD": "BlockchainSpace", "GULF": "GulfCoin", "GUM": "Gourmet Galaxy", "GUN": "GunCoin", @@ -3219,10 +3472,11 @@ "GUSD": "Gemini Dollar", "GUSDT": "Global Utility Smart Digital Token", "GVE": "Globalvillage Ecosystem", - "GVR": "Grove", + "GVR": "Grove [OLD]", "GVT": "Genesis Vision", "GWT": "Galaxy War", "GX": "GameX", + "GXA": "Galaxia", "GXC": "GXChain", "GXT": "Gem Exchange And Trading", "GYEN": "GYEN", @@ -3234,7 +3488,9 @@ "GZIL": "governance ZIL", "GZLR": "Guzzler", "GZONE": "GameZone", + "GZX": "GreenZoneX", "H2O": "H2O Dao", + "H2ON": "H2O Securities", "H3O": "Hydrominer", "HAC": "Hackspace Capital", "HACHIKO": "Hachiko Inu Token", @@ -3246,13 +3502,16 @@ "HALFSHIT": "0.5X Long Shitcoin Index Token", "HALLO": "Halloween Coin", "HALO": "Halo Platform", + "HAM": "Hamster", "HAMS": "HamsterCoin", "HANA": "Hanacoin", "HAND": "ShowHand", + "HANDY": "Handy", "HANU": "Hanu Yokia", + "HAO": "HistoryDAO", "HAPI": "HAPI", "HARAMBE": "Harambe", - "HARD": "Hard Protocol", + "HARD": "Kava Lend", "HART": "HARA", "HASH": "Provenance Blockchain", "HASHT": "HASH Token", @@ -3270,6 +3529,7 @@ "HBE": "healthbank", "HBN": "HoboNickels", "HBO": "Hash Bridge Oracle", + "HBOT": "Hummingbot", "HBRS": "HubrisOne", "HBT": "Habitat", "HBTC": "Huobi BTC", @@ -3284,18 +3544,22 @@ "HDG": "Hedge Token", "HDRN": "Hedron", "HDV": "Hydraverse", + "HDX": "HydraDX", "HE": "Heroes & Empires", "HEAL": "Etheal", "HEART": "Humans", "HEARTBOUT": "HeartBout Pay", + "HEARTR": "Heart Rate", "HEAT": "Heat Ledger", "HEC": "Hector Finance", + "HECTA": "Hectagon", "HEDG": "HedgeTrade", "HEDGE": "Hedgecoin", "HEEL": "HeelCoin", "HEGIC": "Hegic", "HELIOS": "Mission Helios", "HELL": "HELL COIN", + "HELLO": "HELLO", "HELMET": "Helmet Insure", "HELPS": "HelpSeed", "HEP": "Health Potion", @@ -3313,7 +3577,7 @@ "HEZ": "Hermez Network Token", "HFI": "Holder Finance", "HFIL": "Huobi Fil", - "HFT": "Hirefreehands", + "HFT": "Hashflow", "HGET": "Hedget", "HGO": "HireGo", "HGOLD": "HollyGold", @@ -3322,10 +3586,13 @@ "HH": "Holyheld", "HHEM": "Healthureum", "HI": "hi Dollar", + "HIBAYC": "hiBAYC", "HIBIKI": "Hibiki Finance", "HIBS": "Hiblocks", "HID": "Hypersign Identity", "HIDU": "H-Education World", + "HIENS4": "hiENS4", + "HIFI": "Hifi Finance", "HIGH": "Highstreet", "HIH": "HiHealth", "HILL": "President Clinton", @@ -3364,6 +3631,7 @@ "HNS": "Handshake", "HNST": "Honest", "HNT": "Helium", + "HNTR": "Hunter", "HNY": "Honey", "HNZO": "Hanzo Inu", "HOD": "HoDooi.com", @@ -3375,21 +3643,25 @@ "HOMI": "HOMIHELP", "HONEY": "Honey", "HONOR": "HonorLand", + "HOOK": "Hooked Protocol", "HOP": "Hop Protocol", "HOPR": "HOPR", "HORD": "Hord", "HORSE": "Ethorse", "HORUS": "HorusPay", + "HOSKY": "Hosky", "HOT": "Holo", "HOTCROSS": "Hot Cross", "HOTN": "HotNow", "HOTT": "HOT Token", + "HOWL": "Coyote", "HP": "HeroPark", "HPAD": "HarmonyPad", - "HPAY": "HadePay", + "HPAY": "HedgePay", "HPB": "High Performance Blockchain", "HPC": "HappyCoin", "HPL": "HappyLand (HPL)", + "HPN": "HyperonChain", "HPT": "Huobi Pool Token", "HPX": "HUPAYX", "HQT": "HyperQuant", @@ -3399,19 +3671,24 @@ "HRD": "Hoard", "HRDG": "HRDGCOIN", "HRO": "HEROIC.com", + "HRTS": "YellowHeart Protocol", "HSC": "HashCoin", + "HSF": "Hillstone Finance", "HSN": "Hyper Speed Network", "HSP": "Horse Power", "HSS": "Hashshare", "HST": "Decision Token", "HT": "Huobi Token", "HTA": "Historia", + "HTB": "Hotbit", "HTC": "Hitcoin", "HTDF": "Orient Walt", "HTER": "Biogen", "HTML": "HTML Coin", "HTN": "Heart Number", + "HTO": "Heavenland HTO", "HTR": "Hathor", + "HTT": "Hello Art", "HUB": "Hub Token", "HUBII": "Hubii Network", "HUC": "HunterCoin", @@ -3448,13 +3725,15 @@ "HYN": "Hyperion", "HYP": "HyperStake", "HYPE": "Hype", - "HYPER": "HyperCoin", + "HYPER": "HyperChainX", + "HYPERCOIN": "HyperCoin", "HYPERD": "HyperDAO", "HYPERS": "HyperSpace", "HYS": "Heiss Shares", "HYT": "HoryouToken", "HYVE": "Hyve", "HZ": "Horizon", + "HZM": "HZM Coin", "HZN": "Horizon Protocol", "HZT": "HazMatCoin", "I0C": "I0coin", @@ -3464,6 +3743,7 @@ "IAM": "IAME Identity", "IB": "Iron Bank", "IBANK": "iBankCoin", + "IBAT": "Battle Infinity", "IBETH": "Interest Bearing ETH", "IBEUR": "Iron Bank EURO", "IBFR": "iBuffer Token", @@ -3477,22 +3757,24 @@ "ICASH": "ICASH", "ICB": "IceBergCoin", "ICC": "Insta Cash Coin", - "ICE": "Popsicle Finance", + "ICE": "Decentral Games ICE", "ICH": "IdeaChain", "ICHI": "ICHI", "ICHN": "i-chain", "ICHX": "IceChain", "ICN": "Iconomi", "ICOB": "Icobid", + "ICOM": "iCommunity", "ICON": "Iconic", "ICONS": "SportsIcon", "ICOO": "ICO OpenLedger", "ICOS": "ICOBox", "ICP": "Internet Computer", + "ICSA": "Icosa", "ICST": "ICST", "ICT": "Intrachain", "ICX": "ICON Project", - "ID": "Everest", + "ID": "SPACE", "IDAC": "IDAC", "IDAP": "IDAP", "IDC": "IdealCoin", @@ -3507,6 +3789,7 @@ "IDLE": "IDLE", "IDM": "IDM", "IDNA": "Idena", + "IDO": "Idexo", "IDORU": "Vip2Fan", "IDRT": "Rupiah Token", "IDT": "InvestDigital", @@ -3514,6 +3797,7 @@ "IDV": "Idavoll DAO", "IDX": "Index Chain", "IDXM": "IDEX Membership", + "IDXS": "In-Dex Sale", "IEC": "IvugeoEvolutionCoin", "IETH": "iEthereum", "IFC": "Infinite Coin", @@ -3528,18 +3812,22 @@ "IGI": "Igi", "IGNIS": "Ignis", "IGTT": "IGT", + "IGU": "IguVerse", "IHC": "Inflation Hedging Coin", "IHF": "Invictus Hyperion Fund", "IHT": "I-House Token", "IIC": "Intelligent Investment Chain", "IJC": "IjasCoin", + "IJZ": "iinjaz", "ILA": "Infinite Launch", "ILC": "ILCOIN", "ILCT": "ILCoin Token", "ILK": "Inlock", "ILT": "iOlite", "ILV": "Illuvium", + "IMBTC": "The Tokenized Bitcoin", "IMC": "i Money Crypto", + "IME": "Imperium Empires", "IMG": "ImageCoin", "IMGZ": "Imigize", "IMI": "Influencer", @@ -3549,12 +3837,13 @@ "IMPACTXP": "ImpactXP", "IMPCH": "Impeach", "IMPCN": "Brain Space", + "IMPER": "Impermax", "IMPS": "Impulse Coin", "IMPT": "Ether Kingdoms Token", "IMPULSE": "IMPULSE by FDR", "IMS": "Independent Money System", "IMST": "Imsmart", - "IMT": "MoneyToken", + "IMT": "IMOV", "IMU": "imusify", "IMVR": "ImmVRse", "IMX": "Immutable X", @@ -3568,8 +3857,11 @@ "IND": "Indorse", "INDEX": "Index Cooperative", "INDI": "IndiGG", + "INDIA": "Indiacoin", "INDICOIN": "IndiCoin", "INE": "IntelliShare", + "INERY": "Inery", + "INES": "Inescoin", "INET": "Insure Network", "INF": "Infinium", "INFC": "Influence Chain", @@ -3580,8 +3872,8 @@ "INFT": "Infinito", "INFTT": "iNFT Token", "INFX": "Influxcoin", - "ING": "Iungo", - "INJ": "Injective Protocol", + "ING": "Infinity Games", + "INJ": "Injective", "INK": "Ink", "INN": "Innova", "INNBC": "Innovative Bioresearch Coin", @@ -3592,12 +3884,14 @@ "INSANE": "InsaneCoin", "INSN": "Insane Coin", "INST": "Instadapp", + "INSTAMINE": "Instamine Nuggets", "INSTAR": "Insights Network", "INSUR": "InsurAce", "INSURC": "InsurChain Coin", "INT": "Internet Node token", "INTER": "Inter Milan Fan Token", "INTO": "Influ Token", + "INTR": "Interlay", "INU": "INU Token", "INUYASHA": "Inuyasha", "INV": "Inverse Finance", @@ -3607,10 +3901,10 @@ "INVIC": "Invictus", "INVOX": "Invox Finance", "INVX": "Investx", - "INX": "INX Token", + "INX": "Insight Protocol", "INXM": "InMax", - "INXP": "Insight Protocol", "INXT": "Internxt", + "INXTOKEN": "INX Token", "IOC": "IOCoin", "IOEN": "Internet of Energy Network", "IOEX": "ioeX", @@ -3628,6 +3922,7 @@ "IOV": "Starname", "IOVT": "IOV", "IOWN": "iOWN Token", + "IP3": "Cripco", "IPAD": "Infinity Pad", "IPC": "IPChain", "IPDN": "IPDnetwork", @@ -3635,8 +3930,9 @@ "IPSX": "IP Exchange", "IPT": "Crypt-ON", "IPUX": "IPUX", - "IPX": "Tachyon Protocol", - "IQ": "Everipedia", + "IPV": "IPVERSE", + "IPX": "InpulseX", + "IQ": "IQ", "IQC": "IQ.cash", "IQN": "IQeon", "IQQ": "Iqoniq", @@ -3649,17 +3945,23 @@ "ISDT": "ISTARDUST", "ISG": "ISG", "ISH": "Interstellar Holdings", + "ISHND": "StrongHands Finance", "ISIKC": "Isiklar Coin", "ISKY": "Infinity Skies", "ISL": "IslaCoin", + "ISLAMI": "ISLAMICOIN", "ISP": "Ispolink", "ISR": "Insureum", "ISRG.CUR": "Intuitive Surgical, Inc.", "ISTEP": "iSTEP", - "ITA": "Italocoin", + "ITA": "Italian National Football Team Fan Token", + "ITALOCOIN": "Italocoin", "ITAM": "ITAM Games", + "ITAMCUBE": "CUBE", "ITC": "IoT Chain", + "ITEM": "ITEMVERSE", "ITF": "Intelligent Trading", + "ITG": "iTrust Governance", "ITGR": "Integral", "ITL": "Italian Lira", "ITM": "intimate.io", @@ -3667,6 +3969,9 @@ "ITR": "INTRO", "ITU": "iTrue", "ITZ": "Interzone", + "IUNGO": "Iungo", + "IUX": "GeniuX", + "IVAR": "Ivar Coin", "IVC": "Investy Coin", "IVN": "IVN Security", "IVY": "IvyKoin", @@ -3675,12 +3980,14 @@ "IWT": "IwToken", "IX": "X-Block", "IXC": "IXcoin", + "IXP": "IMPACTXPRIME", "IXS": "IX Swap", "IXT": "iXledger", "IZA": "Inzura", "IZE": "IZE", "IZER": "IZEROIUM", - "IZI": "IZIChain", + "IZI": "Izumi Finance", + "IZICHAIN": "IZIChain", "IZX": "IZX", "IZZY": "Izzy", "InBit": "PrepayWay", @@ -3688,6 +3995,7 @@ "J8T": "JET8", "J9BC": "J9CASINO", "JACS": "JACS", + "JACY": "JACY", "JADE": "Jade Protocol", "JADEC": "Jade Currency", "JAM": "Tune.Fm", @@ -3707,13 +4015,14 @@ "JEFF": "Jeff in Space", "JEJUDOGE": "Jejudoge", "JEM": "Jem", - "JET": "Jetcoin", + "JET": "Jet Protocol", + "JETCOIN": "Jetcoin", "JEW": "Shekel", "JEWEL": "DeFi Kingdoms", "JEX": "JEX Token", "JFI": "JackPool.finance", "JFIN": "JFIN Coin", - "JGN": "Juggernaut (JGN)", + "JGN": "Juggernaut", "JIAOZI": "Jiaozi", "JIB": "Jibbit", "JIF": "JiffyCoin", @@ -3735,6 +4044,7 @@ "JOY": "Joycoin", "JOYS": "JOYS", "JOYT": "JoyToken", + "JP": "JP", "JPAW": "Jpaw Inu", "JPEG": "JPEG'd", "JPYC": "JPYC", @@ -3751,6 +4061,7 @@ "JUL": "Joule", "JULB": "JustLiquidity Binance", "JULD": "JulSwap", + "JUMBO": "Jumbo Exchange", "JUMP": "Jumpcoin", "JUN": "Jun \"M\" Coin", "JUNO": "JUNO", @@ -3770,17 +4081,20 @@ "KAL": "Kaleido", "KALA": "Kalata Protocol", "KALAM": "Kalamint", + "KALI": "Kalissa", "KALLY": "Polkally", - "KALM": "Kalmar", + "KALM": "KALM", "KALYCOIN": "KalyCoin", "KAM": "BitKAM", "KAN": "Bitkan", "KAPU": "Kapu", "KAR": "Karura", + "KARATE": "Karate Combat", "KAREN": "KarenCoin", "KARMA": "Karma", "KARMAD": "Karma DAO", "KART": "Dragon Kart", + "KAS": "Kaspa", "KASSIAHOME": "Kassia Home", "KASTA": "Kasta", "KAT": "Kambria", @@ -3818,6 +4132,7 @@ "KEC": "KEYCO", "KED": "Klingon Empire Darsek", "KEEP": "Keep Network", + "KEES": "Korea Entertainment Education & Shopping", "KEI": "Keisuke Inu", "KEK": "KekCoin", "KEL": "KelVPN", @@ -3825,32 +4140,37 @@ "KEN": "Kencoin", "KEP": "Kepler", "KETAN": "Ketan", - "KEX": "KexCoin", + "KEX": "Kira Network", + "KEXCOIN": "KexCoin", "KEY": "SelfKey", "KEYC": "KeyCoin", "KEYFI": "KeyFi", "KFC": "Chicken", "KFI": "Klever Finance", "KFT": "Knit Finance", - "KGC": "KrugerCoin", + "KGC": "Krypton Galaxy Coin", "KGO": "Kiwigo", "KHM": "Kohima", "KIAN": "Porta", "KIBA": "Kiba Inu", "KICK": "Kick", - "KICKS": "SESSIA", + "KICKS": "GetKicks", "KIF": "KittenFinance", + "KILLER": "Fat Cat Killer", "KILT": "KILT Protocol", "KIM": "King Money", "KIMCHI": "KIMCHI.finance", "KIN": "Kin", "KIND": "Kind Ads", "KINE": "Kine Protocol", - "KING": "KingSwap", + "KING": "King Finance", "KING93": "King93", + "KINGDOMQUEST": "Kingdom Quest", "KINGSHIB": "King Shiba", + "KINGSWAP": "KingSwap", "KINT": "Kintsugi", "KIRBY": "Kirby Inu", + "KIRBYRELOADED": "Kirby Reloaded", "KIRO": "Kirobo", "KISC": "Kaiser", "KISHIMOTO": "Kishimoto Inu", @@ -3858,6 +4178,8 @@ "KITSU": "Kitsune Inu", "KITTY": "Kitty Inu", "KKO": "Kineko", + "KKT": "Kingdom Karnage", + "KLAP": "Klap Finance", "KLAY": "Klaytn", "KLC": "KiloCoin", "KLEE": "KleeKai", @@ -3872,13 +4194,17 @@ "KMON": "Kryptomon", "KMX": "KiMex", "KNC": "Kyber Network Crystal v2", + "KNCL": "Kyber Network Crystal Legacy", "KNG": "BetKings", "KNGN": "KingN Coin", + "KNOT": "Karmaverse", "KNOW": "KNOW", "KNT": "Knekted", "KNW": "Knowledge", "KOBE": "Shabu Shabu", "KOBO": "KoboCoin", + "KODACHI": "Kodachi Token", + "KOI": "Koi Network", "KOIN": "Koinos", "KOK": "KOK Coin", "KOKO": "KokoSwap", @@ -3896,6 +4222,7 @@ "KP4R": "Keep4r", "KPAD": "KickPad", "KPC": "KEEPs Coin", + "KPL": "Kepple", "KPOP": "KPOP Coin", "KRAK": "Kraken", "KRATOS": "KRATOS", @@ -3903,6 +4230,7 @@ "KRC": "KRCoin", "KRD": "Krypton DAO", "KREDS": "KREDS", + "KRIPTO": "Kripto", "KRL": "Kryll", "KRM": "Karma", "KRN": "KRYZA Network", @@ -3912,6 +4240,8 @@ "KRP": "Kryptoin", "KRRX": "Kyrrex", "KRT": "TerraKRW", + "KRU": "Kingaru", + "KRUGERCOIN": "KrugerCoin", "KRX": "RAVN Korrax", "KS2": "Kingdomswap", "KSC": "KStarCoin", @@ -3927,11 +4257,13 @@ "KT": "Kuai Token", "KTK": "KryptCoin", "KTN": "Kattana", + "KTO": "Kounotori", "KTON": "Darwinia Commitment Token", "KTS": "Klimatas", "KTT": "K-Tune", "KTX": "KwikTrust", "KUB": "Bitkub Coin", + "KUBE": "KubeCoin", "KUBO": "KUBO", "KUBOS": "KubosCoin", "KUE": "Kuende", @@ -3942,6 +4274,7 @@ "KUSD": "Kowala", "KUSH": "KushCoin", "KUV": "Kuverit", + "KVERSE": "KEEPs Coin", "KVI": "KVI Chain", "KVNT": "KVANT", "KVT": "Kinesis Velocity Token", @@ -3951,6 +4284,7 @@ "KWIK": "KwikSwap", "KWS": "Knight War Spirits", "KXUSD": "kxUSD", + "KYCC": "KYCCOIN", "KYL": "Kylin Network", "KYOKO": "Kyoko", "KYTE": "Kambria Yield Tuning Engine", @@ -3965,6 +4299,7 @@ "LABX": "Stakinglab", "LACCOIN": "LocalAgro", "LACE": "Lovelace World", + "LAEEB": "LaEeb", "LAIKA": "Laika Protocol", "LALA": "LaLa World", "LAMB": "Lambda", @@ -3982,6 +4317,7 @@ "LATX": "Latium", "LAVA": "Lavaswap", "LAVAX": "LavaX Labs", + "LAW": "Law Token", "LAX": "LAPO", "LAYER": "UniLayer", "LAZ": "Lazarus", @@ -3989,6 +4325,7 @@ "LBA": "Cred", "LBC": "LBRY Credits", "LBK": "LBK", + "LBL": "LABEL Foundation", "LBLOCK": "Lucky Block", "LBR": "LaborCrypto", "LBTC": "LiteBitcoin", @@ -4013,6 +4350,7 @@ "LDN": "Ludena Protocol", "LDO": "Lido DAO", "LDOGE": "LiteDoge", + "LDX": "Litedex", "LEA": "LeaCoin", "LEAF": "LeafCoin", "LEAG": "LeagueDAO Governance Token", @@ -4022,6 +4360,7 @@ "LEDU": "Education Ecosystem", "LEGO": "Lego Coin", "LELE": "Lelecoin", + "LEMC": "LemonChain", "LEMD": "Lemond", "LEMO": "LemoChain", "LEMON": "LemonCoin", @@ -4032,25 +4371,30 @@ "LEO": "LEO Token", "LEOPARD": "Leopard", "LEOS": "Leonicorn Swap", + "LEOX": "Galileo", "LEPA": "Lepasa", "LEPEN": "LePenCoin", "LESS": "Less Network", "LET": "LinkEye", "LEU": "CryptoLEU", - "LEV": "Leverj", + "LEV": "Levante U.D. Fan Token", + "LEVER": "LeverFi", + "LEVERJ": "Leverj", "LEVL": "Levolution", "LEX": "Elxis", "LEXI": "LEXIT", + "LEZ": "Peoplez", "LF": "Linkflow", "LFC": "BigLifeCoin", "LFT": "Lend Flare Dao", - "LFW": "Legend of Fantasy War", + "LFW": "Linked Finance World", "LGBTQ": "LGBTQoin", "LGCY": "LGCY Network", "LGD": "Legends Cryptocurrency", "LGO": "Legolas Exchange", "LGOT": "LGO Token", "LGR": "Logarithm", + "LGX": "Legion Network", "LHB": "Lendhub", "LHC": "LHCoin", "LHD": "LitecoinHD", @@ -4059,7 +4403,6 @@ "LIBERA": "Libera Financial", "LIBERO": "Libero Financial", "LIBFX": "Libfx", - "LIBRE": "Libre DeFi", "LIC": "Ligercoin", "LID": "Liquidity Dividends Protocol", "LIDER": "Lider Token", @@ -4077,9 +4420,11 @@ "LINA": "Linear", "LINANET": "Lina", "LINDA": "Metrix", + "LING": "Lingose", "LINK": "Chainlink", "LINKA": "LINKA", "LINKC": "LINKCHAIN", + "LINU": "Luna Inu", "LINX": "Linx", "LION": "Lion Token", "LIPC": "LIpcoin", @@ -4092,6 +4437,7 @@ "LITENETT": "Litenett", "LITH": "Lithium Finance", "LITHIUM": "Lithium", + "LITHO": "Lithosphere", "LITION": "Lition", "LIV": "LiviaCoin", "LIVE": "TRONbetLive", @@ -4100,9 +4446,9 @@ "LK": "Liker", "LK7": "Lucky7Coin", "LKC": "LuckyCoin", + "LKD": "LinkDao", "LKK": "Lykke", "LKN": "LinkCoin Token", - "LKR": "Polkalokr", "LKT": "Locklet", "LKU": "Lukiu", "LKY": "LuckyCoin", @@ -4113,6 +4459,7 @@ "LMAO": "LMAO Finance", "LMC": "LomoCoin", "LMCH": "Latamcash", + "LMCSWAP": "LimoCoin SWAP", "LMR": "Lumerin", "LMT": "Lympo Market Token", "LMXC": "LimonX", @@ -4124,8 +4471,9 @@ "LNKC": "Linker Coin", "LNL": "LunarLink", "LNR": "Lunar", - "LNT": "Launchtok", + "LNT": "Lottonation", "LNX": "Lunox Token", + "LOA": "League of Ancients", "LOAN": "Lendoit", "LOBS": "Lobstex", "LOC": "LockTrip", @@ -4135,8 +4483,11 @@ "LOCK": "Contracto", "LOCO": "Loco", "LOCUS": "Locus Chain", + "LOF": "Land of Fantasy", "LOG": "Wood Coin", + "LOIS": "Lois Token", "LOKA": "League of Kingdoms", + "LOKR": "Polkalokr", "LOL": "EMOGI Network", "LOLC": "LOL Coin", "LON": "Tokenlon", @@ -4167,10 +4518,12 @@ "LPNT": "Luxurious Pro Network Token", "LPOOL": "Launchpool", "LPT": "Livepeer", + "LPY": "LeisurePay", "LQ8": "Liquid8", "LQBTC": "Liquid Bitcoin", "LQD": "Liquid", "LQDN": "Liquidity Network", + "LQDR": "LiquidDriver", "LQR": "Laqira Protocol", "LQTY": "Liquity", "LRC": "Loopring", @@ -4205,6 +4558,7 @@ "LTNM": "Bitcoin Latinum", "LTO": "LTO Network", "LTPC": "Lightpaycoin", + "LTR": "LogiTron", "LTRBT": "Little Rabbit", "LTS": "Litestar Coin", "LTX": "Lattice Token", @@ -4216,22 +4570,28 @@ "LUCKYB": "LuckyBlocks", "LUCY": "Lucy", "LUDO": "Ludo", + "LUFC": "Leeds United Fan Token", "LUFFY": "Luffy", + "LUFFYOLD": "Luffy", "LUM": "Illuminates", "LUMA": "LUMA Token", "LUMI": "LUMI Credits", "LUN": "Lunyr", "LUNA": "Terra", + "LUNAT": "Lunatics", "LUNC": "Terra Classic", "LUNCH": "LunchDAO", "LUNE": "Luneko", "LUNES": "Lunes", + "LUNG": "LunaGens", "LUNR": "Lunr Token", "LUS": "Luna Rush", "LUSD": "Liquity USD", "LUT": "Cinemadrom", "LUTETIUM": "Lutetium Coin", "LUX": "LUXCoin", + "LUXO": "Luxo", + "LUXY": "Luxy", "LVG": "Leverage Coin", "LVIP": "Limitless VIP", "LVN": "LivenPay", @@ -4239,6 +4599,7 @@ "LWF": "Local World Forwarders", "LX": "Moonlight", "LXC": "LibrexCoin", + "LXF": "LuxFi", "LXT": "LITEX", "LXTO": "LuxTTO", "LYB": "LyraBar", @@ -4250,6 +4611,7 @@ "LYN": "LYNCHPIN Token", "LYNK": "Lynked.World", "LYNX": "Lynx", + "LYO": "LYO Credit", "LYQD": "eLYQD", "LYRA": "Scrypta", "LYTX": "LYTIX", @@ -4260,6 +4622,7 @@ "MAC": "MachineCoin", "MADANA": "MADANA", "MADC": "MadCoin", + "MADOG": "MarvelDoge", "MAEP": "Maester Protocol", "MAG": "Magnet", "MAGIC": "Magic", @@ -4273,6 +4636,7 @@ "MANA": "Decentraland", "MANC": "Mancium", "MANDALA": "Mandala Exchange Token", + "MANDOX": "MandoX", "MANGA": "Manga Token", "MANNA": "Manna", "MAP": "MAP Protocol", @@ -4280,8 +4644,10 @@ "MAPE": "Mecha Morphing", "MAPR": "Maya Preferred 223", "MAPS": "MAPS", + "MARGINLESS": "Marginless", "MARI": "MarijuanaCoin", "MARK": "Benchmark Protocol", + "MARLEY": "Marley Token", "MARO": "Maro", "MARS": "MarsCoin", "MARS4": "MARS4", @@ -4309,18 +4675,22 @@ "MAX": "MaxCoin", "MAXR": "Max Revive", "MAY": "Theresa May Coin", + "MAYACOIN": "MayaCoin", "MAZC": "MyMazzu", "MB": "MineBee", "MB8": "MB8 Coin", + "MBASE": "Minebase", "MBCASH": "MBCash", "MBCC": "Blockchain-Based Distributed Super Computing Platform", "MBET": "MoonBet", + "MBF": "MoonBear.Finance", "MBI": "Monster Byte Inc", "MBIT": "Mbitbooks", "MBL": "MovieBloc", "MBLC": "Mont Blanc", "MBM": "MobileBridge Momentum", "MBN": "Mobilian Coin", + "MBONK": "megaBonk", "MBOX": "MOBOX", "MBP": "MobiPad", "MBRS": "Embers", @@ -4328,7 +4698,7 @@ "MBT": "Metablackout", "MBTC": "MicroBitcoin", "MBTX": "MinedBlock", - "MBX": "MobieCoin", + "MBX": "Marblex", "MC": "Merit Circle", "MCAP": "MCAP", "MCAR": "MasterCar", @@ -4337,7 +4707,9 @@ "MCAU": "Meld Gold", "MCB": "MCDEX", "MCC": "Magic Cube Coin", + "MCD": "CDbio", "MCF": "MCFinance", + "MCG": "MicroChains Gov Token", "MCH": "Meconcash", "MCI": "Musiconomi", "MCN": "mCoin", @@ -4359,12 +4731,14 @@ "MDCL": "Medicalchain", "MDF": "MatrixETF", "MDH": "Telemedicoin", + "MDICE": "Multidice", "MDM": "Medium", "MDN": "Modicoin", "MDS": "MediShares", "MDT": "Measurable Data Token", "MDU": "MDUKEY", - "MDX": "Mdex", + "MDX": "Mdex (BSC)", + "MDXH": "Mdex (HECO)", "ME": "All.me", "MEAN": "Meanfi", "MEC": "MegaCoin", @@ -4374,6 +4748,8 @@ "MEDIC": "MedicCoin", "MEDICO": "Mediconnect", "MEDIT": "MediterraneanCoin", + "MEE": "Medieval Empires", + "MEED": "Meeds DAO", "MEET": "CoinMeet", "MEETONE": "MEET.ONE", "MEGA": "MegaFlash", @@ -4381,10 +4757,12 @@ "MELD": "Melodity", "MELI": "Meli Games", "MELLO": "Mello Token", + "MELOS": "Melos Studio", "MELT": "Defrost Finance", "MEM": "Memecoin", - "MEME": "Meme", + "MEME": "Memetic", "MEMEINU": "Meme Inu", + "MEMORYCOIN": "MemoryCoin", "MENGO": "Flamengo Fan Token", "MENLO": "Menlo One", "MEPAD": "MemePad", @@ -4403,28 +4781,38 @@ "METAC": "Metacoin", "METACAT": "MetaCat", "METADOGEV2": "MetaDoge V2", - "METAL": "MetalCoin", + "METAF": "MetaFastest", + "METAG": "MetagamZ", + "METAL": "Metal Blockchain", + "METALCOIN": "MetalCoin", "METAN": "Metan Evolutions", "METAPK": "Metapocket", + "METAS": "Metaseer", + "METAV": "MetaVPad", + "METAVIE": "Metavie", "METAX": "MetaverseX", "METEOR": "Meteorite Network", "METER": "Meter Stable", + "METFI": "MetFi", "METH": "Farming Bad", "METI": "Metis", "METIS": "Metis Token", "METM": "MetaMorph", "METO": "Metafluence", + "METOLD": "Metronome", + "MEV": "MEVerse", "MEVR": "Metaverse VR", "MEWTWO": "Mewtwo Inu", "MEX": "MEX", "MEXC": "MEXC Token", "MEXP": "MOJI Experience Points", + "MF": "MetaFighter", "MF1": "Meta Finance", "MFC": "MFCoin", "MFG": "SyncFab", "MFI": "Marginswap", "MFS": "Moonbase File System", - "MFT": "Hifi Finance", + "MFT": "Hifi Finance (Old)", "MFUND": "Memefund", "MFX": "MFChain", "MG": "MinerGate Token", @@ -4436,6 +4824,7 @@ "MGN": "MagnaCoin", "MGO": "MobileGo", "MGP": "MangoChain", + "MGPT": "MotoGP Fan Token", "MGT": "Megatech", "MGUL": "Mogul Coin", "MGX": "MargiX", @@ -4449,9 +4838,12 @@ "MIB": "Mobile Integrated Blockchain", "MIBO": "miBoodle", "MIC": "Mithril Cash", - "MIDAS": "Midas Dollar Share", + "MIDAS": "Midas", + "MIDASDOLLAR": "Midas Dollar Share", "MIDN": "Midnight", + "MIE": "MIE Network", "MIG": "Migranet", + "MIININGNFT": "MiningNFT", "MIKS": "MIKS COIN", "MIL": "Milllionaire Coin", "MILC": "MIcro Licensing Coin", @@ -4472,7 +4864,7 @@ "MINDEX": "Mindexcoin", "MINDGENE": "Mind Gene", "MINDS": "Minds", - "MINE": "Instamine Nuggets", + "MINE": "SpaceMine", "MINEX": "Minex", "MINI": "Mini", "MINIDOGE": "MiniDOGE", @@ -4496,13 +4888,14 @@ "MISHKA": "Mishka Token", "MISS": "MISS", "MIST": "Mist", - "MIT": "MiMiner", + "MIT": "Galaxy Blitz", "MITC": "MusicLife", "MITH": "Mithril", "MITX": "Morpheus Infrastructure Token", "MIV": "MakeItViral", "MIVRS": "Minionverse", "MIX": "MIXMARVEL", + "MJT": "MojitoSwap", "MKEY": "MEDIKEY", "MKR": "Maker", "ML": "Market Ledger", @@ -4515,9 +4908,12 @@ "MLT": "MultiGames", "MLTC": "MultiWallet Coin", "MM": "Millimeter", - "MMC": "MemoryCoin", + "MMAI": "MetamonkeyAi", + "MMAPS": "MapMetrics", + "MMC": "Monopoly Millionaire Control", "MMETA": "Duckie Land Multi Metaverse", "MMF": "MMFinance", + "MMG": "Monopoly Millionaire Game", "MMNXT": "MMNXT", "MMO": "MMOCoin", "MMPRO": "Market Making Pro", @@ -4531,8 +4927,10 @@ "MNC": "MainCoin", "MND": "Mound Token", "MNDCC": "Mondo Community Coin", + "MNDE": "Marinade", "MNE": "Minereum", "MNET": "MINE Network", + "MNFT": "Marvelous NFTs", "MNG": "Moon Nation Game", "MNGO": "Mango protocol", "MNM": "Mineum", @@ -4540,21 +4938,24 @@ "MNRB": "MoneyRebel", "MNS": "Monnos", "MNST": "MoonStarter", + "MNT": "microNFT", "MNTC": "Manet Coin", "MNTG": "Monetas", + "MNTL": "AssetMantle", "MNTP": "GoldMint", "MNV": "MonetaVerde", "MNVM": "Novam", "MNW": "Morpheus Network", "MNX": "MinexCoin", "MNY": "MoonieNFT", - "MNZ": "Monaize", + "MNZ": "Menzy", "MO": "Morality", "MOAC": "MOAC", "MOAR": "Moar Finance", "MOAT": "Mother Of All Tokens", "MOB": "MobileCoin", "MOBI": "Mobius", + "MOBIE": "MobieCoin", "MOBU": "MOBU", "MOC": "Mossland", "MOCHI": "Mochiswap", @@ -4567,6 +4968,7 @@ "MOFI": "MobiFi", "MOFOLD": "Molecular Future (ERC20)", "MOGU": "Mogu", + "MOGX": "Mogu", "MOI": "MyOwnItem", "MOIN": "MoinCoin", "MOJO": "Mojocoin", @@ -4576,19 +4978,24 @@ "MOLK": "Mobilink Token", "MOM": "Mother of Memes", "MOMA": "Mochi Market", - "MON": "Monstock", + "MON": "Medamon", "MONA": "MonaCoin", + "MONAIZE": "Monaize", "MONARCH": "TRUEMONARCH", "MONAV": "Monavale", "MONETA": "Moneta", "MONEY": "MoneyCoin", + "MONEYBYTE": "MoneyByte", + "MONEYIMT": "MoneyToken", "MONF": "Monfter", + "MONG": "MongCoin", "MONI": "Monsta Infinite", "MONK": "Monkey Project", "MONKEY": "Monkey", "MONO": "MonoX", "MONONOKEINU": "Mononoke Inu", "MONS": "Monsters Clan", + "MONST": "Monstock", "MONT": "Monarch Token", "MOO": "MooMonster", "MOOI": "Moonai", @@ -4598,11 +5005,13 @@ "MOONC": "MoonCoin", "MOOND": "Dark Moon", "MOONDAY": "Moonday Finance", + "MOONER": "CoinMooner", "MOONEY": "Moon DAO", "MOONLIGHT": "Moonlight Token", "MOONSHOT": "Moonshot", "MOOO": "Hashtagger", "MOOV": "dotmoovs", + "MOPS": "Mops", "MORA": "Meliora", "MORE": "More Coin", "MOS": "MOS Coin", @@ -4627,6 +5036,8 @@ "MPH": "Morpher", "MPL": "Maple", "MPLUS": "M+Plus", + "MPLX": "Metaplex", + "MPM": "Monopoly Meta", "MPRO": "MediumProject", "MPT": "Meetple", "MPXT": "Myplacex", @@ -4643,7 +5054,7 @@ "MRN": "Mercoin", "MRNA": "Moderna", "MRP": "MorpheusCoin", - "MRS": "Marginless", + "MRS": "Metars Genesis", "MRSA": "MrsaCoin", "MRT": "MinersReward", "MRV": "Macroverse", @@ -4660,6 +5071,7 @@ "MSQ": "MSquare Global", "MSR": "Masari", "MST": "Idle Mystic", + "MSTO": "Millennium Sapphire", "MSU": "MetaSoccer", "MSWAP": "MoneySwap", "MT": "MyToken", @@ -4668,7 +5080,9 @@ "MTC": "MEDICAL TOKEN CURRENCY", "MTCMN": "MTC Mesh", "MTCN": "Multiven", + "MTD": "Minted", "MTEL": "MEDoctor", + "MTG": "MagnetGold", "MTH": "Monetha", "MTHD": "Method Finance", "MTK": "Moya Token", @@ -4679,6 +5093,8 @@ "MTR": "MasterTraderCoin", "MTRC": "ModulTrade", "MTRG": "Meter", + "MTRM": "Materium", + "MTRX": "Metarix", "MTS": "Metastrike", "MTSH": "Mitoshi", "MTT": "MulTra", @@ -4706,6 +5122,9 @@ "MUU": "MilkCoin", "MV": "GensoKishi Metaverse", "MVC": "MileVerse", + "MVD": "Metavault", + "MVDG": "MetaVerse Dog", + "MVEDA": "MedicalVeda", "MVI": "Metaverse Index", "MVL": "MVL", "MVP": "MVP Coin", @@ -4723,7 +5142,7 @@ "MXW": "Maxonrow", "MXX": "Multiplier", "MYB": "MyBit", - "MYC": "MayaCoin", + "MYC": "Mycelium", "MYCE": "MY Ceremonial Event", "MYCELIUM": "Mycelium Token", "MYDFS": "MyDFS", @@ -4734,7 +5153,9 @@ "MYOBU": "Myōbu", "MYRA": "Mytheria", "MYST": "Mysterium", - "MYTH": "Myth Token", + "MYT": "Mytrade", + "MYTH": "Mythos", + "MYTHT": "Myth Token", "MYTV": "MyTVchain", "MZC": "MazaCoin", "MZG": "Moozicore", @@ -4764,11 +5185,13 @@ "NAS2": "Nas2Coin", "NASADOGE": "Nasa Doge", "NASH": "NeoWorld Cash", + "NASSR": "Alnassr FC Fan Token", "NAT": "Natmin", "NATION": "Nation3", "NAUSICAA": "Nausicaa-Inu", "NAUT": "Nautilus Coin", "NAV": "NavCoin", + "NAVC": "NavC token", "NAVI": "NaviAddress", "NAVIB": "Navibration", "NAWA": "Narwhale.finance", @@ -4788,6 +5211,7 @@ "NC": "Nayuta Coin", "NCASH": "Nucleus Vision", "NCC": "NeuroChain", + "NCDT": "Nuco.Cloud", "NCOV": "CoronaCoin", "NCP": "Newton Coin", "NCR": "Neos Credits", @@ -4804,10 +5228,12 @@ "NEBL": "Neblio", "NEBU": "Nebuchadnezzar", "NEC": "Nectar", + "NEER": "Metaverse.Network Pioneer", "NEET": "NEET Finance", "NEETCOIN": "Neetcoin", "NEF": "NefariousCoin", "NEFTIPEDIA": "NEFTiPEDiA", + "NEKI": "Neki Token", "NEKO": "The Neko", "NEO": "NEO", "NEOG": "NEO Gold", @@ -4821,6 +5247,8 @@ "NETCOIN": "Netcoincapital", "NETKO": "Netko", "NEU": "Neumark", + "NEURALINK": "Neuralink", + "NEUTRO": "Neutro Protocol", "NEVA": "NevaCoin", "NEW": "Newton", "NEWB": "Newbium", @@ -4840,9 +5268,11 @@ "NFT": "APENFT", "NFTART": "NFT Art Finance", "NFTB": "NFTb", + "NFTD": "NFTrade", "NFTI": "NFT Index", "NFTL": "NFTLaunch", "NFTP": "NFT", + "NFTT": "NFT", "NFTX": "NFTX", "NFTXHI": "NFTX Hashmasks Index", "NFTY": "NFTY Token", @@ -4854,12 +5284,12 @@ "NGIN": "Ngin", "NGL": "Gold Fever", "NGM": "e-Money", - "NHBTC": "NEST Protocol", "NHCT": "Nano Healthcare Token", "NIC": "NewInvestCoin", "NICE": "Nice", "NICEC": "NiceCoin", "NIF": "Unifty", + "NIFT": "Niftify", "NIFTSY": "Envelop", "NII": "nahmii", "NIIFI": "NiiFi", @@ -4867,8 +5297,11 @@ "NIMFA": "Nimfamoney", "NIN": "Next Innovation", "NINKY": "Ninky", + "NINO": "Ninneko", + "NIOX": "Autonio", "NIT": "Nesten", "NITRO": "Nitro League", + "NITROG": "Nitro", "NIX": "NIX", "NKA": "IncaKoin", "NKC": "Nukecoinz", @@ -4890,12 +5323,14 @@ "NNB": "NNB Token", "NNC": "NEO Name Credit", "NNI": "NeoNomad Exchange", + "NNN": "Novem Gold", "NOA": "NOA PLAY", "NOAH": "NOAHCOIN", "NOBL": "NobleCoin", "NOBS": "No BS Crypto", "NODE": "Whole Network", "NODIS": "Nodis", + "NODL": "Nodle Network", "NOIA": "Syntropy", "NOIZ": "NOIZ", "NOKU": "NOKU Master token", @@ -4907,9 +5342,11 @@ "NOS": "Nosana", "NOSN": "nOS", "NOTE": "Notional Finance", + "NOVA": "Nova Finance", "NOW": "NOW Token", "NOX": "NITRO", "NOXB": "Noxbox", + "NPAS": "New Paradigm Assets Solution", "NPC": "NPCcoin", "NPER": "NPER", "NPLC": "Plus Coin", @@ -4939,6 +5376,8 @@ "NSP": "NOMAD.space", "NSR": "NuShares", "NSS": "NSS Coin", + "NSTE": "NewSolution 2.0", + "NSUR": "NSUR Coin", "NSURE": "Nsure Network", "NT": "NEXTYPE Finance", "NTB": "TokenAsset", @@ -4947,7 +5386,7 @@ "NTCC": "NeptuneClassic", "NTK": "Neurotoken", "NTM": "NetM", - "NTO": "Neutro Protocol", + "NTO": "Neton", "NTR": "Nether", "NTRN": "Neutron", "NTS": "Notarised", @@ -4962,6 +5401,7 @@ "NULS": "Nuls", "NUM": "Numbers Protocol", "NUMBERS": "NumbersCoin", + "NUMI": "Numitor", "NUNET": "NuNet", "NUSD": "Nomin USD", "NUT": "Native Utility Token", @@ -4985,9 +5425,11 @@ "NXE": "NXEcoin", "NXM": "Nexus Mutual", "NXMC": "NextMindCoin", + "NXRA": "AllianceBlock Nexera", "NXS": "Nexus", "NXT": "Nxt", "NXTI": "NXTI", + "NXTT": "Next Earth", "NXTTY": "NXTTY", "NYAN": "NyanCoin", "NYANTE": "Nyantereum International", @@ -5011,6 +5453,7 @@ "OATH": "OATH Protocol", "OAX": "Oax", "OBITS": "Obits Coin", + "OBOT": "Obortech", "OBROK": "OBRok", "OBS": "One Basis Cash", "OBSCURE": "Obscurebay", @@ -5025,6 +5468,7 @@ "OCL": "Oceanlab", "OCN": "Odyssey", "OCT": "Octopus Network", + "OCTA": "OctaSpace", "OCTAX": "OctaX", "OCTI": "Oction", "OCTO": "OctoFi", @@ -5048,6 +5492,7 @@ "OGOD": "GOTOGOD", "OGSP": "OriginSport", "OGT": "One Game", + "OGV": "Origin Dollar Governance", "OH": "Oh! Finance", "OHM": "Olympus", "OHMV2": "Olympus v2", @@ -5056,24 +5501,29 @@ "OILD": "OilWellCoin", "OIN": "OIN Finance", "OIO": "Online", + "OJA": "Ojamu", "OJX": "Ojooo", "OK": "OKCash", - "OKB": "OKX", + "OKB": "OKB", + "OKG": "Ookeenga", "OKOIN": "OKOIN", "OKS": "Oikos", - "OKT": "OKC Token", + "OKSE": "Okse", + "OKT": "OKT Chain", "OLAND": "Oceanland", "OLDSF": "OldSafeCoin", - "OLE": "Olive", + "OLE": "OpenLeverage", + "OLIVE": "Olive", "OLOID": "OLOID", "OLT": "OneLedger", "OLV": "OldV", "OLXA": "OLXA", "OLY": "Olyseum", "OLYMP": "OlympCoin", - "OM": "MANTRA DAO", + "OM": "MANTRA", "OMA": "OmegaCoin", - "OMC": "OmniCron", + "OMAX": "Omax", + "OMC": "Omchain", "OMEGA": "OMEGA", "OMG": "OMG Network", "OMGC": "OmiseGO Classic", @@ -5081,6 +5531,7 @@ "OMIC": "Omicron", "OMNI": "Omni", "OMNIA": "OmniaVerse", + "OMNICRON": "OmniCron", "OMT": "Mars Token", "OMX": "Project Shivom", "ON": "OFIN Token", @@ -5101,6 +5552,7 @@ "ONS": "One Share", "ONSTON": "Onston", "ONT": "Ontology", + "ONUS": "ONUS", "ONX": "Onix", "OOE": "OpenOcean", "OOGI": "OOGI", @@ -5112,8 +5564,8 @@ "OPC": "OP Coin", "OPCT": "Opacity", "OPEN": "Open Platform", - "OPENDAO": "OPEN Governance Token", - "OPENDAOSOS": "OpenDAO", + "OPENDAO": "OpenDAO", + "OPENGO": "OPEN Governance Token", "OPENRI": "Open Rights Exchange", "OPES": "Opes", "OPET": "ÕpetFoundation", @@ -5165,8 +5617,9 @@ "OSF": "One Solution", "OSMO": "Osmosis", "OSQTH": "Opyn Squeeth", - "OST": "Simple Token", + "OST": "OST", "OSWAP": "OpenSwap", + "OTHR": "OtherDAO", "OTN": "Open Trading Network", "OTO": "OTOCASH", "OTX": "Octanox", @@ -5183,6 +5636,7 @@ "OWN": "Ownly", "OWNDATA": "OWNDATA", "OX": "betbox", + "OXB": "Oxbull Tech", "OXD": "0xDAO", "OXEN": "Oxen", "OXT": "Orchid Protocol", @@ -5192,8 +5646,9 @@ "OYS": "Oyster Platform", "OZG": "Ozagold", "OZP": "OZAPHYRE", + "P202": "Project 202", "P2PS": "P2P Solutions Foundation", - "PAC": "PAC Global", + "PAC": "PAC Protocol", "PACOCA": "Pacoca", "PAD": "NearPad", "PAF": "Pacific", @@ -5202,10 +5657,14 @@ "PAINT": "MurAll", "PAK": "Pakcoin", "PAL": "PolicyPal Network", + "PALLA": "Pallapay", + "PALM": "PalmPay", "PAMP": "PAMP Network", "PAN": "Pantos", "PAND": "Panda Finance", + "PANDA": "PandaDAO", "PANDO": "Pando", + "PANDOP": "PandoProject", "PANGEA": "PANGEA", "PAPADOGE": "Papa Doge", "PAPER": "Dope Wars Paper", @@ -5214,10 +5673,13 @@ "PARA": "Paralink Network", "PARAB": "Parabolic", "PARAL": "Parallel", + "PARALL": "Parallel Finance", "PARANOIA": "ParanoiaCoin", + "PARAW": "Para", "PARETO": "Pareto Network Token", "PARKGENE": "PARKGENE", "PARLAY": "Parlay", + "PARMA": "PARMA Fan Token", "PARQ": "PARQ", "PART": "Particl", "PAS": "Passive Coin", @@ -5225,12 +5687,15 @@ "PASL": "Pascal Lite", "PASS": "Blockpass", "PAT": "PATRON", + "PATH": "PathDAO", "PAVO": "Pavocoin", "PAXEX": "PAXEX", "PAXG": "PAX Gold", + "PAXW": "pax.world", "PAY": "TenX", "PAYCON": "Paycon", "PAYP": "PayPeer", + "PAYT": "PayAccept", "PAZZI": "Paparazzi", "PBASE": "Polkabase", "PBC": "PabyosiCoin", @@ -5240,10 +5705,12 @@ "PBQ": "PUBLIQ", "PBR": "PolkaBridge", "PBT": "Primalbase", + "PBTC35A": "pBTC35A", "PBX": "Paribus", "PC": "Promotion Coin", "PCC": "PCORE", "PCCM": "Poseidon Chain", + "PCE": "PEACE COIN", "PCH": "POPCHAIN", "PCHS": "Peaches.Finance", "PCI": "PayProtocol Paycoin", @@ -5268,6 +5735,7 @@ "PEAK": "PEAKDEFI", "PEARL": "Pearl Finance", "PEC": "PeaceCoin", + "PEEL": "Meta Apes", "PEEPS": "The People’s Coin", "PEG": "PegNet", "PEGS": "PegShares", @@ -5279,7 +5747,7 @@ "PENTA": "Penta", "PEOPLE": "ConstitutionDAO", "PEOS": "pEOS", - "PEPE": "Memetic", + "PEPE": "Pepe", "PEPECASH": "Pepe Cash", "PEPPER": "Pepper Token", "PEPS": "PEPS Coin", @@ -5293,17 +5761,19 @@ "PERX": "PeerEx Network", "PESA": "Credible", "PESOBIT": "PesoBit", - "PET": "Battle Pets", + "PET": "Hello Pets", "PETG": "Pet Games", "PETL": "Petlife", "PETN": "Pylon Eco Token", "PETO": "Petoverse", + "PETT": "Pett Network", "PEX": "Pexcoin", "PFID": "Pofid Dao", "PFL": "Professional Fighters League Fan Token", "PFR": "PayFair", "PFT": "Pitch Finance Token", "PFY": "Portify", + "PGALA": "pGALA", "PGC": "Pegascoin", "PGF7T": "PGF500", "PGL": "Prospectors", @@ -5311,7 +5781,7 @@ "PGT": "Polyient Games Governance Token", "PGTS": "Puregold token", "PGU": "Polyient Games Unity", - "PGX": "PhiGold Coin", + "PGX": "Pegaxy Stone", "PHA": "Phala Network", "PHAE": "Phaeton", "PHALA": "Phalanx", @@ -5321,6 +5791,7 @@ "PHCR": "PhotoChromic", "PHI": "PHI Token", "PHIBA": "Papa Shiba", + "PHIGOLD": "PhiGold Coin", "PHL": "Philcoin", "PHM": "Phomeum", "PHN": "Phayny", @@ -5334,10 +5805,12 @@ "PHT": "Photon Token", "PHTC": "Photochain", "PHV": "PATHHIVE", - "PI": "PCHAIN", + "PI": "Plian", + "PIAS": "PIAS", "PIB": "Pibble", "PICA": "PicaArtMoney", "PICKLE": "Pickle Finance", + "PICO": "PicoGo", "PIE": "Persistent Information Exchange", "PIG": "Pig Finance", "PIGGY": "Piggy", @@ -5372,7 +5845,7 @@ "PKD": "PetKingdom", "PKF": "PolkaFoundry", "PKN": "Poken", - "PKR": "Polker", + "PKOIN": "Pocketcoin", "PKT": "PKT", "PLA": "PlayDapp", "PLAAS": "PLAAS FARMERS TOKEN", @@ -5383,15 +5856,18 @@ "PLANET": "PlanetCoin", "PLANETS": "PlanetWatch", "PLASTIK": "Plastiks", - "PLAT": "Platinum", + "PLAT": "BitGuild PLAT", "PLATC": "PlatinCoin", + "PLATINUM": "Platinum", "PLATO": "Plato Game", "PLAY": "HEROcoin", "PLAYC": "PlayChip", + "PLAYCOIN": "PlayCoin", "PLAYKEY": "Playkey", "PLBT": "Polybius", "PLC": "PlusCoin", "PLCU": "PLC Ultima", + "PLD": "Plutonian DAO", "PLE": "Plethori", "PLEO": "Empleos", "PLEX": "PLEX", @@ -5404,7 +5880,9 @@ "PLNC": "PLNCoin", "PLNX": "Planumex", "PLOT": "PlotX", + "PLQ": "Planq", "PLR": "Pillar", + "PLS": "Pulsechain", "PLSD": "PulseDogecoin", "PLSPAD": "PulsePad", "PLT": "Poollotto.finance", @@ -5416,8 +5894,9 @@ "PLUGCN": "Plug Chain", "PLURA": "PluraCoin", "PLUS1": "PlusOneCoin", + "PLUTUS": "PlutusDAO", "PLX": "PlexCoin", - "PLY": "PlayCoin", + "PLY": "Aurigami", "PMA": "PumaPay", "PMEER": "Qitmeer", "PMGT": "Perth Mint Gold Token", @@ -5426,6 +5905,7 @@ "PMTN": "Peer Mountain", "PNC": "PlatiniumCoin", "PND": "PandaCoin", + "PNFT": "Pawn My NFT", "PNG": "Pangolin", "PNGN": "SpacePenguin", "PNK": "Kleros", @@ -5457,30 +5937,39 @@ "POLIS": "Star Atlas DAO", "POLISPLAY": "PolisPay", "POLK": "Polkamarkets", + "POLKER": "Polker", "POLL": "Pollchain", "POLNX": "eToro Polish Zloty", "POLS": "Polkastarter", + "POLVEN": "Polka Ventures", "POLX": "Polylastic", "POLY": "Polymath Network", "POLYDOGE": "PolyDoge", "POLYPAD": "PolyPad", + "POLYX": "Polymesh", "PON": "Ponder", "POND": "Marlin", "PONYO": "Ponyo Impact", "PONZU": "Ponzu Inu", + "POO": "POOMOON", "POODL": "Poodl", "POOL": "PoolTogether", "POOLZ": "Poolz Finance", "POP": "PopularCoin", "POP!": "POP", "POPC": "PopChest", + "POPK": "POPKON", + "POPSICLE": "Popsicle Finance", + "POR": "Portugal National Team Fan Token", "PORT": "Port Finance", "PORTAL": "Portal", "PORTO": "FC Porto", + "PORTU": "Portuma", "POS": "PoSToken", "POSEX": "PosEx", "POSI": "Position Token", "POSQ": "Poseidon Quark", + "POSS": "Posschain", "POST": "InterPlanetary Search Engine", "POSTC": "PostCoin", "POT": "PotCoin", @@ -5489,7 +5978,7 @@ "POWR": "Power Ledger", "PP": "ProducePay Chain", "PPAD": "PlayPad", - "PPALPHA": "PP ALPHA DAO", + "PPALPHA": "Phoenix Protocol", "PPAY": "Plasma Finance", "PPBLZ": "Pepemon Pepeballs", "PPC": "PeerCoin", @@ -5514,16 +6003,20 @@ "PRES": "President Trump", "PRFT": "Proof Suite Token", "PRG": "Paragon", + "PRI": "PRIVATEUM INITIATIVE", "PRIA": "PRIA", "PRIDE": "Nomad Exiles", "PRIMATE": "Primate", - "PRIME": "PrimeChain", + "PRIME": "Echelon Prime", + "PRIMECHAIN": "PrimeChain", "PRINT": "Printer.Finance", "PRINTS": "FingerprintsDAO", "PRISM": "Prism", "PRIX": "Privatix", "PRL": "Oyster Pearl", "PRM": "PrismChain", + "PRMX": "PREMA", + "PRNT": "Prime Numbers", "PRO": "Propy", "PROB": "ProBit Token", "PROBIN": "Probinex", @@ -5536,6 +6029,7 @@ "PROPS": "Props", "PROS": "Prosper", "PROT": "PROT", + "PROTO": "Protocon", "PROTON": "Proton", "PROUD": "PROUD Money", "PROXI": "PROXI", @@ -5545,9 +6039,11 @@ "PRQ": "PARSIQ", "PRS": "PressOne", "PRT": "Parrot Protocol", + "PRTG": "Pre-Retogeum", "PRV": "PrivacySwap", "PRVS": "Previse", "PRX": "Printerium", + "PRXY": "Proxy", "PRY": "PRIMARY", "PSB": "Planet Sandbox", "PSC": "PSC Token", @@ -5558,8 +6054,10 @@ "PSI": "PSIcoin", "PSILOC": "Psilocybin", "PSK": "Pool of Stake", + "PSL": "Pastel", "PSLIP": "Pinkslip Finance", "PSM": "Prasm", + "PSOL": "Parasol Finance", "PSP": "ParaSwap", "PST": "Primas", "PSTAKE": "pSTAKE Finance", @@ -5584,11 +6082,13 @@ "PUGL": "PugLife", "PULI": "Puli", "PULSE": "Pulse", + "PUMLX": "PUMLx", "PUNDIX": "Pundi X", "PUNK": "SteamPunk", "PUPA": "PupaCoin", "PURA": "Pura", - "PURE": "Pure", + "PURE": "Puriever", + "PUREALT": "Pure", "PUSD": "PegsUSD", "PUSH": "Ethereum Push Notification Service", "PUSHI": "Pushi", @@ -5612,6 +6112,7 @@ "PYE": "CreamPYE", "PYLNT": "Pylon Network", "PYLON": "Pylon Finance", + "PYM": "Playermon", "PYN": "Paycent", "PYP": "PayPro", "PYQ": "PolyQuity", @@ -5633,7 +6134,8 @@ "QBIT": "Project Quantum", "QBK": "QuBuck Coin", "QBT": "Cubits", - "QBX": "qiibee", + "QBU": "Quannabu", + "QBX": "qiibee foundation", "QBZ": "QUEENBEE", "QC": "Qcash", "QCH": "QChi", @@ -5643,9 +6145,11 @@ "QDX": "Quidax", "QFI": "QFinance", "QI": "BENQI", + "QIE": "QI Blockchain", "QISWAP": "QiSwap", "QKC": "QuarkChain", - "QLC": "QLC Chain", + "QLC": "Kepple [OLD]", + "QLINDO": "QLINDO", "QMALL": "QMALL TOKEN", "QNT": "Quant", "QNTR": "Quantor", @@ -5681,6 +6185,7 @@ "QUBE": "Qube", "QUBITICA": "Qubitica", "QUICK": "Quickswap", + "QUICKOLD": "Quickswap", "QUIDD": "Quidd", "QUINT": "Quint", "QUIZ": "Quizando", @@ -5699,8 +6204,10 @@ "RAD": "Radicle", "RADAR": "DappRadar", "RADI": "RadicalCoin", + "RADIO": "RadioShack", "RADR": "CoinRadr", "RAI": "Rai Reflex Index", + "RAIDER": "Crypto Raiders", "RAIF": "RAI Finance", "RAIL": "Railgun", "RAIN": "Rainmaker Games", @@ -5717,17 +6224,21 @@ "RAPDOGE": "RapDoge", "RARE": "SuperRare", "RARI": "Rarible", + "RATECOIN": "Ratecoin", "RATING": "DPRating", "RATIO": "Ratio", "RAVE": "Ravendex", "RAVELOUS": "Ravelous", "RAVEN": "Raven Protocol", + "RAVENCOINC": "Ravencoin Classic", "RAWG": "RAWG", "RAY": "Raydium", "RAYS": "Rays Network", "RAZE": "Raze Network", "RAZOR": "Razor Network", + "RB": "REBorn", "RBC": "Rubic", + "RBD": "Rubidium", "RBDT": "RoBust Defense Token", "RBIES": "Rubies", "RBIF": "Robo Inu Finance", @@ -5741,10 +6252,13 @@ "RBUNNY": "Rocket Bunny", "RBW": "Crypto Unicorns Rainbow", "RBX": "RiptoBuX", + "RBXS": "RBXSamurai", "RBY": "RubyCoin", "RC": "Russiacoin", "RC20": "RoboCalls", "RCC": "Reality Clash", + "RCCC": "RCCC", + "RCG": "Recharge", "RCH": "Rich", "RCN": "Ripio", "RCOIN": "RCoin", @@ -5754,10 +6268,12 @@ "RDC": "Ordocoin", "RDD": "Reddcoin", "RDN": "Raiden Network Token", + "RDNT": "Radiant Capital", "RDPX": "Dopex Rebate Token", "RDR": "Rise of Defenders", "RDS": "Reger Diamond", "RDT": "Ridotto", + "RDX": "Redux Protocol", "REA": "Realisto", "REAL": "RealLink", "REALM": "Realm", @@ -5766,17 +6282,21 @@ "REAP": "ReapChain", "REBL": "REBL", "REC": "Rec Token (REC)", + "RECKOON": "Reckoon", "RECOM": "Recom", - "RED": "RED", + "RED": "RED TOKEN", "REDC": "RedCab", "REDCO": "Redcoin", "REDI": "REDi", + "REDLANG": "RED", + "REDLC": "Redlight Chain", "REDN": "Reden", "REE": "ReeCoin", "REEF": "Reef", - "REF": "RefToken", + "REF": "Ref Finance", "REFI": "Realfinance Network", "REFLECTO": "Reflecto", + "REFTOKEN": "RefToken", "REGALCOIN": "Regalcoin", "REHAB": "NFT Rehab", "REI": "REI Network", @@ -5794,6 +6314,7 @@ "RENBTC": "renBTC", "RENC": "RENC", "RENDOGE": "renDOGE", + "RENS": "Rens", "RENTBE": "Rentberry", "REP": "Augur", "REPO": "Repo Coin", @@ -5803,6 +6324,7 @@ "REST": "Restore", "RET": "RealTract", "RETAIL": "Retail.Global", + "RETH": "Realms of Ethernity", "RETH2": "rETH2", "RETIRE": "Retire Token", "REU": "REUCOIN", @@ -5836,7 +6358,8 @@ "RICECOIN": "RiceCoin", "RICH": "Richie", "RICKMORTY": "Rick And Morty", - "RIDE": "Ride My Car", + "RIDE": "Holoride", + "RIDEMY": "Ride My Car", "RIF": "RIF Token", "RIFI": "Rikkei Finance", "RIGEL": "Rigel Finance", @@ -5892,20 +6415,20 @@ "ROG": "ROGin AI", "ROI": "ROIcoin", "ROK": "Rockchain", - "RON": "Ronin", "RONCOIN": "RON", + "RONIN": "Ronin", "ROOBEE": "ROOBEE", "ROOK": "KeeperDAO", "ROOM": "OptionRoom", "ROOT": "RootCoin", "ROOTS": "RootProject", - "ROPE": "Rope Token", "ROS": "ROS Coin", "ROSE": "Oasis Labs", "ROSN": "Roseon Finance", "ROT": "Rotten", "ROUND": "RoundCoin", "ROUTE": "Router Protocol", + "ROWAN": "Sifchain", "ROX": "Robotina", "ROYA": "Royale", "ROYAL": "RoyalCoin", @@ -5925,11 +6448,13 @@ "RSF": "Royal Sting", "RSIN": "Roketsin", "RSR": "Reserve Rights", + "RSS3": "RSS3", "RST": "REGA Risk Sharing Token", "RSUN": "RisingSun", "RSV": "Reserve", "RT2": "RotoCoin", "RTB": "AB-CHAIN", + "RTC": "Reltime", "RTE": "Rate3", "RTH": "Rotharium", "RTM": "Raptoreum", @@ -5950,8 +6475,10 @@ "RUST": "RustCoin", "RUSTBITS": "Rustbits", "RUX": "Gacrux NFT", - "RVC": "Ravencoin Classic", - "RVF": "Rocket Vault", + "RVC": "Revenue Coin", + "RVF": "RocketX exchange", + "RVLNG": "RevolutionGames", + "RVLT": "Revolt 2 Earn", "RVN": "Ravencoin", "RVO": "AhrvoDEEX", "RVP": "Revolution Populi", @@ -5963,12 +6490,15 @@ "RWE": "Real-World Evidence", "RWN": "Rowan Token", "RWS": "Robonomics Web Services", + "RXT": "RIMAUNANGIS", "RYC": "RoyalCoin", "RYCN": "RoyalCoin 2.0", "RYO": "Ryo", + "RYOMA": "Ryoma", "RYOSHI": "Ryoshis Vision", "RYZ": "Anryze", "RZR": "RazorCoin", + "S2K": "Sports 2K75", "S4F": "S4FE", "S8C": "S88 Coin", "SABR": "SABR Coin", @@ -5987,6 +6517,8 @@ "SAGA": "SagaCoin", "SAI": "SAI", "SAITAMA": "Saitama Inu", + "SAITAMAV1": "Saitama v1", + "SAITANOBI": "Saitanobi", "SAITO": "Saito", "SAK": "SharkCoin", "SAKATA": "Sakata Inu", @@ -6007,6 +6539,7 @@ "SAP": "SwapAll", "SAPP": "Sapphire", "SAR": "Saren", + "SARCO": "Sarcophagus", "SAS": "Stand Share", "SASHIMI": "Sashimi", "SAT": "Satisfaction Token", @@ -6022,7 +6555,6 @@ "SBA": "simplyBrand", "SBC": "StableCoin", "SBCC": "Smart Block Chain City", - "SBD": "Steem Dollars", "SBE": "Sombe", "SBGO": "Bingo Share", "SBR": "Saber", @@ -6064,6 +6596,7 @@ "SCT": "ScryptToken", "SCTK": "SharesChain", "SCY": "Synchrony", + "SD": "Stader", "SDA": "SDChain", "SDAO": "SingularityDAO", "SDC": "ShadowCash", @@ -6074,6 +6607,7 @@ "SDRN": "Senderon", "SDS": "Alchemint Standards", "SDT": "TerraSDT", + "SDUSD": "SDUSD", "SDX": "SwapDEX", "SEA": "Second Exchange Alliance", "SEAL": "Seal Finance", @@ -6088,6 +6622,7 @@ "SEELE": "Seele", "SEEN": "SEEN", "SEER": "SEER", + "SEI": "Sei", "SEL": "SelenCoin", "SEM": "Semux", "SEN": "Sentaro", @@ -6099,11 +6634,15 @@ "SENSO": "SENSO", "SENT": "Sentinel", "SEON": "Seedon", + "SEOR": "SEOR Network", "SEOS": "Smart Eye Operating System", "SEPA": "Secure Pad", "SEQ": "Sequence", + "SERG": "Seiren Games Network", "SERO": "Super Zero", "SERV": "Serve", + "SESSIA": "SESSIA", + "SETH": "sETH", "SETH2": "sETH2", "SETHER": "Sether", "SETS": "Sensitrust", @@ -6120,6 +6659,7 @@ "SFUEL": "SparkPoint Fuel", "SFUND": "Seedify.fund", "SFX": "SUBX FINANCE LAB", + "SG": "SocialGood", "SGB": "Songbird", "SGDX": "eToro Singapore Dollar", "SGE": "Society of Galactic Exploration", @@ -6148,6 +6688,7 @@ "SHFT": "Shyft Network", "SHI": "Shirtum", "SHIB": "Shiba Inu", + "SHIB05": "Half Shiba Inu", "SHIBACASH": "ShibaCash", "SHIBAMOM": "Shiba Mom", "SHIBDOGE": "ShibaDoge", @@ -6185,9 +6726,11 @@ "SIDUS": "Sidus", "SIERRA": "Sierracoin", "SIFT": "Smart Investment Fund Token", + "SIFU": "SIFU", "SIG": "Signal", - "SIGN": "SignatureChain", + "SIGN": "Signin", "SIGNA": "Signa", + "SIGNAT": "SignatureChain", "SIGT": "Signatum", "SIGU": "Singular", "SIL": "SIL Finance Token V2", @@ -6197,6 +6740,7 @@ "SILO": "Silo Finance", "SILVERWAY": "Silverway", "SIMPLE": "SimpleChain", + "SIN": "Sinverse", "SINE": "Sinelock", "SINGLE": "Single Finance", "SINS": "SafeInsure", @@ -6210,6 +6754,7 @@ "SJCX": "StorjCoin", "SKB": "SkullBuzz", "SKC": "Skeincoin", + "SKEB": "Skeb", "SKET": "Sketch coin", "SKEY": "SmartKey", "SKI": "Skillchain", @@ -6234,7 +6779,7 @@ "SLC": "Solice", "SLEEP": "Sleep Ecosystem", "SLEEPEE": "SleepFuture", - "SLG": "SterlingCoin", + "SLG": "Land Of Conquest", "SLICE": "Tranche Finance", "SLICEC": "SLICE", "SLIM": "Solanium", @@ -6246,6 +6791,7 @@ "SLOKI": "Super Floki", "SLP": "Smooth Love Potion", "SLR": "SolarCoin", + "SLRR": "Solarr", "SLRS": "Solrise Finance", "SLS": "SaluS", "SLST": "SmartLands", @@ -6257,26 +6803,38 @@ "SMARTCREDIT": "SmartCredit Token", "SMARTLOX": "SmartLOX", "SMARTNFT": "SmartNFT", + "SMARTSHARE": "Smartshare", "SMARTUP": "Smartup", "SMAT": "Smathium", + "SMBR": "Sombra", "SMBSWAP": "SimbCoin Swap", "SMC": "SmartCoin", + "SMCW": "Space Misfits", "SMD": "SMD Coin", + "SMETA": "StarkMeta", "SMF": "SmurfCoin", "SMG": "Smaugs NFT", "SMI": "SafeMoon Inu", "SMILE": "Smile Token", + "SML": "Saltmarble", "SMLY": "SmileyCoin", "SMOKE": "Smoke", "SMON": "StarMon", + "SMOON": "SaylorMoon", "SMPL": "SMPL Foundation", + "SMR": "Shimmer", "SMRAT": "Secured MoonRat", "SMSR": "Samsara Coin", "SMT": "SmartMesh", + "SMTF": "SmartFi", "SMTY": "Smoothy", + "SNACK": "Crypto Snack", + "SNAP": "SnapEx", "SNB": "SynchroBitcoin", "SNC": "SunContract", "SND": "Sandcoin", + "SNE": "StrongNode", + "SNEK": "Snek", "SNET": "Snetwork", "SNFT.BITCI": "Spanish National Team Fan Token", "SNGLS": "SingularDTV", @@ -6317,16 +6875,20 @@ "SOLO": "Sologenic", "SOLR": "SolRazr", "SOLVE": "SOLVE", + "SOM": "Souls of Meta", "SOMA": "Soma", + "SOMNIUM": "Somnium Space CUBEs", "SON": "Simone", "SONAR": "SonarWatch", "SONG": "Song Coin", - "SOON": "SoonCoin", + "SOON": "Soonaverse", + "SOONCOIN": "SoonCoin", "SOP": "SoPay", "SORA": "Sora Validator Token", "SOSNOVKINO": "Sosnovkino", "SOTA": "SOTA Finance", "SOUL": "Phantasma", + "SOULS": "Soulsaver", "SOUND": "Sound Coin", "SOURCE": "ReSource Protocol", "SOV": "Sovryn", @@ -6340,6 +6902,7 @@ "SPAIN": "SpainCoin", "SPANK": "SpankChain", "SPARTA": "Spartan Protocol Token", + "SPAT": "Meta Spatial", "SPAY": "SpaceY 2025", "SPC": "SpaceChain ERC20", "SPC.QRC": "SpaceChain (QRC-20)", @@ -6383,21 +6946,28 @@ "SPRTZ": "SpritzCoin", "SPS": "Splinterlands", "SPT": "SPECTRUM", + "SPUME": "Spume", "SPWN": "Bitspawn", "SPX": "Sp8de", + "SPXC": "SpaceXCoin", + "SPY": "Smarty Pay", + "SQAT": "Syndiqate", "SQG": "Squid Token", "SQL": "Squall Coin", "SQR": "Squeezer", "SQUAWK": "Squawk", "SQUID": "Squid Game", + "SQUIDGROW": "SquidGrow", "SRC": "SecureCoin", "SRCOIN": "SRCoin", "SREUR": "SocialRemit", "SRK": "SparkPoint", + "SRLTY": "SaitaRealty", "SRM": "Serum", "SRN": "SirinLabs", "SRNT": "Serenity", "SRP": "Starpunk", + "SRT": "Smart Reward Token", "SRWD": "ShibRWD", "SRX": "StorX", "SS": "Sharder", @@ -6406,7 +6976,6 @@ "SSG": "Surviving Soldiers", "SSGT": "Safeswap", "SSH": "StreamSpace", - "SSP": "Smartshare", "SSS": "StarSharks", "SST": "SIMBA Storage Token", "SSTC": "SunShotCoin", @@ -6428,33 +6997,41 @@ "STARBASE": "Starbase", "STARC": "StarChain", "STARL": "StarLink", + "STARLAUNCH": "StarLaunch", "STARLY": "Starly", "STARP": "Star Pacific Coin", - "STARS": "StarLaunch", + "STARS": "Mogul Productions", "STARSH": "StarShip Token", "START": "StartCoin", "STARTA": "Starta", "STASH": "BitStash", + "STAT": "STAT", + "STATER": "Stater", "STATERA": "Statera", "STAX": "Staxcoin", "STBU": "Stobox Token", - "STC": "Student Coin", + "STC": "Satoshi Island", "STCN": "Stakecoin", "STEEM": "Steem", + "STEEMD": "Steem Dollars", "STEEP": "SteepCoin", "STEN": "Steneum Coin", "STEP": "Step Finance", "STEPH": "Step Hero", "STEPS": "Steps", + "STERLINGCOIN": "SterlingCoin", "STETH": "Staked Ether", "STEX": "STEX", "STF": "Structure Finance", + "STFX": "STFX", "STG": "Stargate Finance", "STHR": "Stakerush", + "STI": "Seek Tiger", "STING": "Sting", "STK": "STK Token", "STKAAVE": "Staked Aave", "STKATOM": "pSTAKE Staked ATOM", + "STKK": "Streakk", "STKXPRT": "pSTAKE Staked XPRT", "STMAN": "Stickman Battleground", "STMX": "StormX", @@ -6475,26 +7052,33 @@ "STPL": "Stream Protocol", "STPT": "STP Network", "STQ": "Storiqa Token", + "STR": "Sourceless", "STRAKS": "Straks", "STRAX": "Stratis", "STRAY": "Animal Token", "STREAM": "STREAMIT COIN", + "STRIP": "Stripto", "STRK": "Strike", "STRM": "StreamCoin", "STRNGR": "Stronger", "STRONG": "Strong", "STRP": "Strips Finance", "STRS": "STARS", + "STRX": "StrikeX", "STS": "SBank", "STSOL": "Lido Staked SOL", + "STSR": "SatelStar", "STU": "BitJob", + "STUDENTC": "Student Coin", "STV": "Sativa Coin", "STX": "Stacks", "STZ": "99Starz", "STZEN": "StakedZEN", "SUB": "Substratum Network", "SUCR": "Sucre", + "SUDO": "sudoswap", "SUGAR": "Sugar Exchange", + "SUI": "Sui", "SUKU": "SUKU", "SUM": "SumSwap", "SUMO": "Sumokoin", @@ -6507,7 +7091,7 @@ "SUP": "Supcoin", "SUP8EME": "SUP8EME Token", "SUPE": "Supe Infinity", - "SUPER": "SuperFarm", + "SUPER": "SuperVerse", "SUPERBID": "SuperBid", "SUPERC": "SuperCoin", "SUPERTX": "SuperTX", @@ -6518,6 +7102,7 @@ "SUSD": "sUSD", "SUSHI": "Sushi", "SUTER": "Suterusu", + "SUZUME": "Shita-kiri Suzume", "SVD": "savedroid", "SVS": "GivingToServices SVS", "SVT": "Solvent", @@ -6534,6 +7119,7 @@ "SWC": "Scanetchain Token", "SWD": "SW DAO", "SWDAO": "Super Whale DAO", + "SWEAT": "Sweat Economy", "SWEET": "SweetStake", "SWFL": "Swapfolio", "SWFTC": "SWFTCoin", @@ -6546,14 +7132,15 @@ "SWP": "Kava Swap", "SWRV": "Swerve", "SWT": "Swarm City Token", - "SWTH": "Switcheo", + "SWTH": "Carbon", "SWYFTT": "SWYFT", "SX": "SX Network", "SXC": "SexCoin", "SXDT": "SPECTRE Dividend Token", - "SXP": "Swipe", + "SXP": "SXP", "SXUT": "SPECTRE Utility Token", "SYBC": "SYB Coin", + "SYBTC": "sBTC", "SYC": "SynchroCoin", "SYL": "XSL Labs", "SYLO": "Sylo", @@ -6565,12 +7152,16 @@ "SYNLEV": "SynLev", "SYNR": "MOBLAND", "SYNX": "Syndicate", + "SYPOOL": "Sypool", "SYS": "SysCoin", "T": "Threshold Network Token", "TAAS": "Token as a Service", "TAB": "MollyCoin", "TABOO": "Taboo Token", "TAC": "Traceability Chain", + "TACHYON": "Tachyon Protocol", + "TAD": "Tadpole Finance", + "TAF": "TAF", "TAGR": "Think And Get Rich Coin", "TAI": "tBridge Token", "TAIYO": "Taiyo", @@ -6579,12 +7170,18 @@ "TAKI": "Taki", "TALAO": "Talao", "TALK": "Talken", + "TAMA": "Tamadoge", "TAN": "Taklimakan", "TANGO": "keyTango", "TANK": "CryptoTanks", - "TAP": "TappingCoin", + "TAO": "Fusotao", + "TAP": "TAP FANTASY", "TAPC": "Tap Coin", + "TAPPINGCOIN": "TappingCoin", + "TAPT": "Tortuga Staked Aptos", "TARA": "Taraxa", + "TARI": "Tari World", + "TAROT": "Tarot", "TARP": "Totally A Rug Pull", "TAS": "TARUSH", "TASH": "Smart Trip Platform", @@ -6592,11 +7189,13 @@ "TAT": "Tatcoin", "TAU": "Lamden Tau", "TAUC": "Taurus Coin", + "TAUM": "Orbitau Taureum", "TAUR": "Marnotaur", + "TAVA": "ALTAVA", "TBAC": "BlockAura", "TBAR": "Titanium BAR", "TBB": "Trade Butler Bot", - "TBC": "Trecento Blockchain Capital", + "TBC": "Ten Best Coins", "TBCC": "TBCC", "TBCX": "TrashBurn", "TBE": "TrustBase", @@ -6608,6 +7207,7 @@ "TCANDY": "TripCandy", "TCAP": "Total Crypto Market Cap", "TCC": "The ChampCoin", + "TCG2": "TCG Coin 2.0", "TCH": "Thorecash", "TCHAIN": "Tchain", "TCHB": "Teachers Blockchain", @@ -6622,14 +7222,17 @@ "TD": "Trade Chain", "TDE": "Trade Ecology Token", "TDFB": "TDFB", + "TDFY": "Tidefi", "TDP": "TrueDeck", "TDROP": "ThetaDrop", "TDS": "TokenDesk", + "TDX": "Tidex Token", "TEAM": "TeamUP", "TEC": "TeCoin", "TECH": "TechCoin", "TECRA": "TecraCoin", "TEDDY": "Teddy Doge", + "TEER": "Integritee", "TEK": "TekCoin", "TEL": "Telcoin", "TELE": "Miracle Tele", @@ -6660,6 +7263,7 @@ "TFC": "The Freedom Coin", "TFI": "TrustFi Network Token", "TFL": "True Flip Lottery", + "TFLOW": "TradeFlow", "TFS": "TFS Token", "TFT": "The Famous Token", "TFUEL": "Theta Fuel", @@ -6668,10 +7272,13 @@ "TGCC": "TheGCCcoin", "TGR": "Tegro", "TGT": "TargetCoin", + "THALES": "Thales", "THC": "The Hempcoin", + "THECITADEL": "The Citadel", "THEDAO": "The DAO", "THEMIS": "Themis", - "THETA": "Theta", + "THEOS": "Theos", + "THETA": "Theta Network", "THEX": "Thore Exchange", "THG": "Thetan Arena", "THN": "Throne", @@ -6692,12 +7299,15 @@ "TIE": "Ties Network", "TIFI": "TiFi Token", "TIG": "Tigereum", + "TIGER": "JungleKing TigerCoin", "TIIM": "TriipMiles", "TIKI": "Tiki Token", + "TIKTOKEN": "TikToken", "TIME": "Chrono.tech", "TIMI": "Timicoin", "TINC": "Tiny Coin", "TINKU": "TinkuCoin", + "TINU": "Telegram Inu", "TIOX": "TIOx", "TIP": "Tip Blockchain", "TIPS": "FedoraCoin", @@ -6715,6 +7325,7 @@ "TKMN": "Tokemon", "TKN": "Monolith", "TKO": "Tokocrypto", + "TKP": "TOKPIE", "TKR": "CryptoInsight", "TKS": "Tokes", "TKT": "Crypto Tickets", @@ -6726,6 +7337,7 @@ "TME": "Timereum", "TMED": "MDsquare", "TMN": "TranslateMe", + "TMON": "Two Monkey Juice Bar", "TMT": "Tamy Token", "TMTG": "The Midas Touch Gold", "TN": "TurtleNetwork", @@ -6742,20 +7354,26 @@ "TOKE": "Tokemak", "TOKEN": "Chainswap", "TOKENSTARS": "TokenStars", + "TOKKI": "CRYPTOKKI", "TOKO": "ToKoin", "TOKU": "TokugawaCoin", "TOL": "Tolar", - "TOM": "Tomahawkcoin", + "TOM": "TOM Finance", + "TOMAHAWKCOIN": "Tomahawkcoin", "TOMB": "Tomb", "TOMO": "TomoChain", "TOMOE": "TomoChain ERC20", + "TOMS": "TomTomCoin", "TON": "Tokamak Network", "TONCOIN": "The Open Network", "TONE": "TE-FOOD", "TONIC": "Tectonic", "TONTOKEN": "TONToken", + "TOOB": "Toobcoin", "TOOLS": "TOOLS", + "TOON": "Pontoon", "TOPC": "Topchain", + "TOPG": "Tate Token", "TOPN": "TOP Network", "TOR": "TOR", "TORG": "TORG", @@ -6768,6 +7386,7 @@ "TOWER": "Tower", "TOWN": "Town Star", "TOZ": "Tozex", + "TP": "Token Swap", "TPAD": "TrustPad", "TPAY": "TokenPay", "TPC": "Techpay", @@ -6785,6 +7404,7 @@ "TRAT": "Tratok", "TRAVA": "Trava Finance", "TRAXIA": "Traxia Membership Token", + "TRAXX": "Traxx", "TRB": "Tellor", "TRBT": "Tribute", "TRC": "TerraCoin", @@ -6792,8 +7412,10 @@ "TRCL": "Treecle", "TRCT": "Tracto", "TRDC": "Traders Coin", + "TRDL": "Strudel Finance", "TRDS": "Traders Token", "TRDT": "Trident", + "TRECENTO": "Trecento Blockchain Capital", "TREE": "HyperionX", "TREEB": "Retreeb", "TRET": "Tourist Review", @@ -6803,7 +7425,9 @@ "TRIAS": "Trias", "TRIBE": "Tribe", "TRIBETOKEN": "TribeToken", + "TRIBL": "Tribal Token", "TRICK": "TrickyCoin", + "TRICKLE": "Trickle", "TRIG": "Trigger", "TRINI": "Trinity Network Credit", "TRIO": "Tripio", @@ -6811,6 +7435,7 @@ "TRIX": "TriumphX", "TRK": "TruckCoin", "TRL": "Triall", + "TRNDZ": "Trendsy", "TROLL": "Trollcoin", "TRONPAD": "TRONPAD", "TROP": "Interop", @@ -6844,6 +7469,7 @@ "TSHP": "12Ships", "TSL": "Energo", "TSR": "Tesra", + "TSUKA": "Dejitaru Tsuka", "TSX": "TradeStars", "TT": "ThunderCore", "TTC": "TTC PROTOCOL", @@ -6865,6 +7491,7 @@ "TWC": "Twilight", "TWD": "Terra World Token", "TWEE": "TWEEBAA", + "TWEP": "The Web3 Project", "TWIN": "Twinci", "TWIST": "TwisterCoin", "TWLV": "Twelve Coin", @@ -6875,10 +7502,11 @@ "TYC": "Tycoon", "TYCOON": "CryptoTycoon", "TYPE": "Typerium", + "TYRANT": "Fable Of The Dragon", "TYT": "Tianya Token", "TZC": "TrezarCoin", "TZKI": "Tsuzuki Inu", - "U": "Ucoin", + "U": "Unidef", "U8D": "Universal Dollar", "UAEC": "United Arab Emirates Coin", "UAT": "UltrAlpha", @@ -6895,15 +7523,19 @@ "UBXT": "UpBots", "UC": "YouLive Coin", "UCA": "UCA Coin", + "UCAP": "Unicap.finance", "UCASH": "U.CASH", + "UCG": "Universe Crystal Gene", "UCH": "UChain", "UCN": "UC Coin", "UCO": "Uniris", + "UCOIN": "Ucoin", "UCT": "UnitedCrowd", "UDO": "Unido", - "UDOO": "Howdoo", + "UDOO": "Hyprr", "UDT": "Unlock Protocol", "UEC": "United Emirates Coin", + "UEDC": "United Emirate Decentralized Coin", "UENC": "UniversalEnergyChain", "UET": "Useless Ethereum Token", "UETL": "Useless Eth Token Lite", @@ -6930,6 +7562,7 @@ "UM": "UncleMine", "UMA": "UMA", "UMAD": "MADworld", + "UMAMI": "Umami", "UMB": "Umbrella Network", "UMBR": "Umbria Network", "UMC": "Umbrella Coin", @@ -6955,13 +7588,13 @@ "UNIC": "Unicly", "UNICORN": "UNICORN Token", "UNIDX": "UniDex", - "UNIFI": "Unifi", "UNIFY": "Unify", "UNIM": "Unicorn Milk", "UNIQ": "Uniqredit", "UNIQUE": "Unique One", "UNISTAKE": "Unistake", "UNIT": "Universal Currency", + "UNITED": "UnitedCoins", "UNITRADE": "UniTrade", "UNITS": "GameUnits", "UNITY": "SuperNET", @@ -6972,11 +7605,13 @@ "UNORE": "UnoRe", "UNQ": "UNQ", "UNQT": "Unique Utility Token", + "UNR": "Unirealchain", "UNRC": "UniversalRoyalCoin", "UNW": "UniWorld", "UOP": "Utopia Genesis Foundation", "UOS": "UOS", "UP": "UpToken", + "UPCG": "Upcomings", "UPCO2": "Universal Carbon", "UPCOIN": "UPcoin", "UPEUR": "Universal Euro", @@ -6985,6 +7620,7 @@ "UPP": "Sentinel Protocol", "UPR": "Upfire", "UPT": "Universal Protocol Token", + "UPUNK": "Unicly CryptoPunks Collection", "UPUSD": "Universal US Dollar", "UPX": "uPlexa", "UQC": "Uquid Coin", @@ -6992,6 +7628,7 @@ "URAC": "Uranus", "URALS": "Urals Coin", "URO": "UroCoin", + "URQA": "UREEQA", "URUS": "Urus Token", "URX": "URANIUMX", "USAT": "USAT", @@ -7007,6 +7644,7 @@ "USDFL": "USDFreeLiquidity", "USDG": "USDG", "USDH": "HonestCoin", + "USDI": "Interest Protocol USDi", "USDJ": "USDJ", "USDK": "USDK", "USDN": "Neutrino USD", @@ -7017,6 +7655,7 @@ "USDT": "Tether", "USDU": "Upper Dollar", "USDX": "USDX Stablecoin", + "USDZ": "Zedxion USDZ", "USE": "Usechain Token", "USG": "USGold", "USHIBA": "American Shiba", @@ -7048,6 +7687,8 @@ "VANY": "Vanywhere", "VAPOR": "Vaporcoin", "VARIUS": "Varius", + "VBG": "Vibing", + "VBIT": "Valobit", "VBK": "VeriBlock", "VBSC": "Votechain", "VBT": "VB Token", @@ -7067,6 +7708,7 @@ "VEG": "BitVegan", "VEGA": "Vega Protocol", "VEIL": "VEIL", + "VELA": "Vela Token", "VELO": "Velo", "VELOX": "Velox", "VELOXPROJECT": "Velox", @@ -7077,9 +7719,11 @@ "VENTION": "Vention", "VENUS": "VenusEnergy", "VEO": "Amoveo", + "VER": "VersalNFT", "VERA": "Vera", "VERI": "Veritaseum", "VERSA": "Versa Token", + "VERSE": "Verse", "VERTEX": "Vertex", "VEST": "VestChain", "VESTA": "Vestarin", @@ -7088,12 +7732,14 @@ "VFOX": "VFOX", "VGO": "Vagabond", "VGX": "Voyager Token", + "VHC": "Vault Hill City", "VI": "Vid", "VIA": "ViaCoin", "VIB": "Viberate", "VIBE": "VIBEHub", "VIBLO": "VIBLO", "VIC": "Victorium", + "VICA": "ViCA Token", "VICEX": "ViceToken", "VID": "VideoCoin", "VIDT": "VIDT Datalink", @@ -7125,11 +7771,14 @@ "VLT": "Veltor", "VLTC": "VaultCoin", "VLTX": "Volentix", + "VLTY": "Vaulty", "VLX": "Velas", "VLXPAD": "VelasPad", "VMC": "VirtualMining Coin", "VME": "TrueVett", "VNDC": "VNDC", + "VNES": "Vanesse", + "VNM": "Venom", "VNT": "VNT Chain", "VNTW": "Value Network Token", "VNX": "VisionX", @@ -7139,7 +7788,9 @@ "VOISE": "Voise", "VOL": "Volume Network", "VOLLAR": "Vollar", + "VOLR": "Volare Network", "VOLT": "Volt Inu", + "VOLTOLD": "Volt Inu (Old)", "VOOT": "VootCoin", "VOT": "Votecoin", "VOW": "Vow", @@ -7153,8 +7804,10 @@ "VR": "Victoria", "VRA": "Verasity", "VRC": "VeriCoin", + "VRGW": "Virtual Reality Game World", "VRM": "Verium", "VRN": "Varen", + "VRO": "VeraOne", "VRP": "Prosense.tv", "VRS": "Veros", "VRSC": "Verus Coin", @@ -7196,9 +7849,12 @@ "WAG": "WagyuSwap", "WAGE": "Digiwage", "WAGG": "Waggle Network", + "WAGMIGAMES": "WAGMI Game", "WAI": "Wanaka Farm WAIRERE Token", "WAIF": "Waifu Token", + "WAL": "The Wasted Lands", "WALLET": "Ambire Wallet", + "WALV": "Alvey Chain", "WAM": "Wam", "WAMPL": "Wrapped Ampleforth", "WAN": "Wanchain", @@ -7213,6 +7869,7 @@ "WASH": "WashingtonCoin", "WAVES": "Waves", "WAXE": "WAXE", + "WAXL": "Wrapped Axelar", "WAXP": "Worldwide Asset eXchange", "WAY": "WayCoin", "WBB": "Wild Beast Coin", @@ -7220,6 +7877,7 @@ "WBET": "Wavesbet", "WBIND": "Wrapped BIND", "WBNB": "Wrapped BNB", + "WBT": "WhiteBIT Token", "WBTC": "Wrapped Bitcoin", "WBX": "WiBX", "WCC": "Wincash Coin", @@ -7229,11 +7887,13 @@ "WCG": "World Crypto Gold", "WCOIN": "WCoin", "WCS": "Weecoins", + "WCSOV": "Wrapped CrownSterling", "WCT": "Waves Community Token", "WCUSD": "Wrapped Celo Dollar", "WDC": "WorldCoin", "WDR": "Wider Coin", "WDX": "WeiDex", + "WE": "WeBuy", "WEALTH": "WealthCoin", "WEAR": "MetaWear", "WEB": "Webcoin", @@ -7245,7 +7905,7 @@ "WELL": "Well", "WELT": "Fabwelt", "WELUPS": "Welups Blockchain", - "WEMIX": "Wemix Token", + "WEMIX": "WEMIX", "WENLAMBO": "Wenlambo", "WEST": "Waves Enterprise", "WET": "WeShow Token", @@ -7274,7 +7934,7 @@ "WICC": "WaykiChain", "WIFEDOGE": "Wifedoge", "WIFI": "Wifi Coin", - "WIKEN": "WITH", + "WIKEN": "Project WITH", "WIKI": "Wiki Token", "WILC": "Wrapped ILCOIN", "WILD": "Wilder World", @@ -7285,6 +7945,7 @@ "WINGS": "Wings DAO", "WINK": "Wink", "WINR": "JustBet", + "WINRY": "Winry Inu", "WINT": "WinToken", "WIRTUAL": "Wirtual", "WIS": "Experty Wisdom Token", @@ -7292,21 +7953,28 @@ "WISE": "Wise Token", "WISH": "MyWish", "WIT": "Witnet", + "WITCH": "Witch", "WITCOIN": "Witcoin", "WIX": "Wixlar", - "WIZ": "Crowdwiz", + "WIZ": "WIZ Protocol", "WKD": "Wakanda Inu", "WLF": "Wolfs Group", "WLITI": "wLITI", "WLK": "Wolk", + "WLKN": "Walken", "WLO": "WOLLO", "WLUNA": "Wrapped LUNA Token", + "WLXT": "Wallex Token", "WMATIC": "Wrapped Matic", "WMB": "WatermelonBlock", "WMC": "WMCoin", + "WMEMO": "Wonderful Memories", + "WMF": "Whale Maker Fund", + "WMINIMA": "Wrapped Minima", "WMT": "World Mobile Token", "WNCG": "Wrapped NCG", "WND": "WonderHero", + "WNDR": "Wonderman Nation", "WNET": "Wavesnode.net", "WNK": "The Winkyverse", "WNRZ": "WinPlay", @@ -7321,6 +7989,8 @@ "WOLFY": "WOLFY", "WOLVERINU": "WOLVERINU", "WOM": "WOM", + "WOMB": "Wombat Exchange", + "WOMBAT": "Wombat", "WOMEN": "WomenCoin", "WOMI": "Wrapped ECOMI", "WON": "WeBlock", @@ -7350,21 +8020,27 @@ "WRX": "WazirX", "WRZ": "Weriz", "WSB": "WallStreetBets DApp", + "WSBABY": "Wall Street Baby", "WSCRT": "Secret ERC20", "WSDOGE": "Doge of Woof Street", "WSG": "Wall Street Games", + "WSI": "WeSendit", "WSIENNA": "Sienna ERC20", "WSTETH": "Lido wstETH", + "WSTR": "Wrapped Star", "WSX": "WeAreSatoshi", "WT": "WeToken", "WTC": "Waltonchain", - "WTF": "WTF Token", + "WTF": "Waterfall Governance", + "WTFT": "WTF Token", "WTK": "WadzPay Token", "WTL": "Welltrado", + "WTN": "Wateenswap", "WTON": "Wrapped TON Crystal", "WTT": "Giga Watt", "WUST": "Wrapped UST Token", "WWB": "Wowbit", + "WWDOGE": "Wrapped WDOGE", "WWY": "WeWay", "WXDAI": "Wrapped XDAI", "WXT": "WXT", @@ -7376,7 +8052,10 @@ "X2": "X2Coin", "X2Y2": "X2Y2", "X42": "X42 Protocol", + "X7DAO": "X7DAO", + "X7R": "X7R", "X8X": "X8Currency", + "XACT": "XactToken", "XAEAXII": "XAEA-Xii Token", "XAI": "SideShift Token", "XAMP": "Antiample", @@ -7401,6 +8080,7 @@ "XBOT": "SocialXbotCoin", "XBP": "Black Pearl Coin", "XBS": "Bitstake", + "XBT": "Xbit", "XBTS": "Beats", "XBX": "BiteX", "XBY": "XTRABYTES", @@ -7418,6 +8098,7 @@ "XCM": "CoinMetro", "XCN": "Chain", "XCO": "XCoin", + "XCONSOL": "X-Consoles", "XCP": "CounterParty", "XCPO": "Copico", "XCR": "Crypti", @@ -7428,9 +8109,11 @@ "XCXT": "CoinonatX", "XD": "Data Transaction Token", "XDAG": "Dagger", + "XDAI": "XDAI", "XDATA": "Streamr XDATA", "XDB": "DragonSphere", "XDC": "Xinfin Network", + "XDCE": "XinFin Coin", "XDEF2": "Xdef Finance", "XDEFI": "XDEFI", "XDEN": "Xiden", @@ -7446,12 +8129,14 @@ "XEL": "Xel", "XELS": "XELS Coin", "XEM": "NEM", - "XEN": "XenixCoin", + "XEN": "XEN Crypto", "XEND": "Xend Finance", + "XENIX": "XenixCoin", "XENO": "Xenoverse", "XEP": "Electra Protocol", "XES": "Proxeus", "XET": "Xfinite Entertainment Token", + "XETA": "Xana", "XETH": "Xplosive Ethereum", "XFC": "Football Coin", "XFI": "Xfinance", @@ -7462,18 +8147,20 @@ "XFYI": "XCredit", "XG": "XG Sports", "XGB": "GoldenBird", + "XGLI": "Glitter Finance", "XGOX": "Go!", "XGR": "GoldReserve", "XGT": "Xion Finance", "XHI": "HiCoin", "XHT": "HollaEx", "XHV": "Haven Protocol", + "XI": "Xi", "XIASI": "Xiasi Inu", "XID": "Sphre AIR", "XIDO": "Xido Finance", - "XIL": "ProjectX", + "XIL": "Xillion", "XIN": "Mixin", - "XIO": "XIO", + "XIO": "Blockzero Labs", "XIOS": "Xios", "XIOT": "Xiotri", "XIV": "Project Inverse", @@ -7488,15 +8175,18 @@ "XLQ": "Alqo", "XLR": "Solaris", "XLT": "Nexalt", + "XMARK": "xMARK", "XMC": "Monero Classic", "XMCC": "Monoeci", "XMG": "Coin Magi", "XMN": "Motion", "XMO": "Monero Original", "XMON": "XMON", + "XMP": "Mapt.Coin", "XMR": "Monero", "XMRG": "Monero Gold", "XMS": "Megastake", + "XMT": "MetalSwap", "XMV": "MoneroV", "XMX": "XMax", "XMY": "MyriadCoin", @@ -7512,7 +8202,9 @@ "XNS": "Insolar", "XNT": "Exenium", "XNX": "XanaxCoin", + "XODEX": "Xodex", "XOR": "Sora", + "XOT": "Okuru", "XOV": "XOVBank", "XP": "Experience Points", "XPAT": "Bitnation Pangea", @@ -7522,6 +8214,7 @@ "XPD": "PetroDollar", "XPH": "PharmaCoin", "XPL": "Exclusive Platform", + "XPLA": "XPLA", "XPM": "PrimeCoin", "XPN": "PANTHEON X", "XPNET": "XP Network", @@ -7541,7 +8234,7 @@ "XQC": "Quras Token", "XQN": "Quotient", "XQR": "Qredit", - "XRA": "Ratecoin", + "XRA": "Xriba", "XRC": "xRhodium", "XRD": "Radix", "XRE": "RevolverCoin", @@ -7560,6 +8253,7 @@ "XSP": "XSwap", "XSPC": "SpectreSecurityCoin", "XSPEC": "Spectre", + "XSPECTAR": "xSPECTAR", "XSPT": "PoolStamp", "XSR": "Xensor", "XST": "StealthCoin", @@ -7569,6 +8263,7 @@ "XT": "XT.com Token", "XT3": "Xt3ch", "XTAG": "xHashtag", + "XTAL": "XTAL", "XTC": "TileCoin", "XTK": "xToken", "XTM": "TORUM", @@ -7576,6 +8271,7 @@ "XTP": "Tap", "XTRA": "ExtraCredit", "XTREME": "ExtremeCoin", + "XTUSD": "XT Stablecoin XTUSD", "XTX": "Xtock", "XTZ": "Tezos", "XUC": "Exchange Union", @@ -7593,6 +8289,7 @@ "XWT": "World Trade Funds", "XXA": "Ixinium", "XXX": "XXXCoin", + "XY": "XY Finance", "XYM": "Symbol", "XYO": "XY Oracle", "XYZ": "Universe.XYZ", @@ -7610,13 +8307,18 @@ "YBC": "YbCoin", "YCC": "Yuan Chain Coin", "YCE": "MYCE", + "YCO": "Y Coin", + "YCT": "Youclout", + "YDF": "Yieldification", "YDR": "YDragon", "YEC": "Ycash", "YEE": "Yeeco", "YEED": "Yggdrash", "YEFI": "YeFi", "YEL": "Yel.Finance", - "YES": "YesCoin", + "YEON": "Yeon", + "YES": "Yes World", + "YESCOIN": "YesCoin", "YETI": "Yeti Finance", "YETU": "Yetucoin", "YFARM": "YFARM Token", @@ -7678,6 +8380,7 @@ "ZANO": "Zano", "ZAP": "Zap", "ZARX": "eToro South African Rand", + "ZASH": "ZIMBOCASH", "ZAT": "ZatGo", "ZB": "ZB", "ZBC": "Zebec Protocol", @@ -7686,7 +8389,7 @@ "ZCG": "ZCashGOLD", "ZCHN": "Zichain", "ZCL": "ZClassic", - "ZCN": "0chain", + "ZCN": "Züs", "ZCO": "Zebi Coin", "ZCON": "Zcon Protocol", "ZCOR": "Zrocor", @@ -7697,6 +8400,8 @@ "ZEC": "ZCash", "ZECD": "ZCashDarkCoin", "ZED": "ZedCoins", + "ZEDTOKEN": "Zed Token", + "ZEDXION": "Zedxion", "ZEE": "ZeroSwap", "ZEFU": "Zenfuse", "ZEIT": "ZeitCoin", @@ -7717,7 +8422,10 @@ "ZET2": "Zeta2Coin", "ZEUM": "Colizeum", "ZFL": "Zuflo Coin", + "ZFM": "ZFMCOIN", + "ZGD": "ZambesiGold", "ZIG": "Zignaly", + "ZIK": "Ziktalk", "ZIL": "Zilliqa", "ZILBERCOIN": "Zilbercoin", "ZINC": "ZINC", @@ -7727,6 +8435,7 @@ "ZIRVE": "Zirve Coin", "ZIX": "ZIX Token", "ZJLT": "ZJLT Distributed Factoring Network", + "ZKBOB": "BOB", "ZKP": "Panther Protocol", "ZKS": "ZKSpace", "ZKT": "zkTube", @@ -7742,6 +8451,7 @@ "ZND": "Zenad", "ZNE": "ZoneCoin", "ZNN": "Zenon", + "ZNT": "Zenith Finance", "ZNY": "BitZeny", "ZNZ": "ZENZO", "ZOC": "01coin", @@ -7754,9 +8464,11 @@ "ZOOM": "ZoomCoin", "ZOON": "CryptoZoon", "ZOOT": "Zoo Token", + "ZORA": "Zoracles", "ZORT": "Zort", "ZP": "Zen Protocol", "ZPAE": "ZelaaPayAE", + "ZPAY": "ZoidPay", "ZPR": "ZPER", "ZPT": "Zeepin", "ZPTC": "Zeptacoin", @@ -7771,6 +8483,7 @@ "ZUM": "ZumCoin", "ZUNA": "ZUNA", "ZUR": "Zurcoin", + "ZURR": "ZURRENCY", "ZUSD": "ZUSD", "ZUT": "Zero Utility Token", "ZVC": "ZVCHAIN", @@ -7782,11 +8495,12 @@ "ZYR": "Zyrri", "ZYRO": "Zyro", "ZYTARA": "Zytara dollar", + "ZZ": "ZigZag", + "ZZC": "ZudgeZury", "ZZZ": "zzz.finance", "eFIC": "FIC Network", "ePRX": "eProxy", "gOHM": "Governance OHM", - "pBTC35A": "pBTC35A", "redBUX": "redBUX", "sOHM": "Staked Olympus", "wsOHM": "Wrapped Staked Olympus" diff --git a/apps/api/src/helper/object.helper.ts b/apps/api/src/helper/object.helper.ts index 2f389352f..50a4f2b12 100644 --- a/apps/api/src/helper/object.helper.ts +++ b/apps/api/src/helper/object.helper.ts @@ -1,4 +1,5 @@ -import { cloneDeep, isObject } from 'lodash'; +import Big from 'big.js'; +import { cloneDeep, isArray, isObject } from 'lodash'; export function hasNotDefinedValuesInObject(aObject: Object): boolean { for (const key in aObject) { @@ -15,9 +16,11 @@ export function hasNotDefinedValuesInObject(aObject: Object): boolean { export function nullifyValuesInObject(aObject: T, keys: string[]): T { const object = cloneDeep(aObject); - keys.forEach((key) => { - object[key] = null; - }); + if (object) { + keys.forEach((key) => { + object[key] = null; + }); + } return object; } @@ -27,3 +30,51 @@ export function nullifyValuesInObjects(aObjects: T[], keys: string[]): T[] { return nullifyValuesInObject(object, keys); }); } + +export function redactAttributes({ + object, + options +}: { + object: any; + options: { attribute: string; valueMap: { [key: string]: any } }[]; +}): any { + if (!object || !options || !options.length) { + return object; + } + + const redactedObject = cloneDeep(object); + + for (const option of options) { + if (redactedObject.hasOwnProperty(option.attribute)) { + if (option.valueMap['*'] || option.valueMap['*'] === null) { + redactedObject[option.attribute] = option.valueMap['*']; + } else if (option.valueMap[redactedObject[option.attribute]]) { + redactedObject[option.attribute] = + option.valueMap[redactedObject[option.attribute]]; + } + } else { + // If the attribute is not present on the current object, + // check if it exists on any nested objects + for (const property in redactedObject) { + if (isArray(redactedObject[property])) { + redactedObject[property] = redactedObject[property].map( + (currentObject) => { + return redactAttributes({ options, object: currentObject }); + } + ); + } else if ( + isObject(redactedObject[property]) && + !(redactedObject[property] instanceof Big) + ) { + // Recursively call the function on the nested object + redactedObject[property] = redactAttributes({ + options, + object: redactedObject[property] + }); + } + } + } + } + + return redactedObject; +} 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 4a9c5bef2..6b10a4ebb 100644 --- a/apps/api/src/interceptors/redact-values-in-response.interceptor.ts +++ b/apps/api/src/interceptors/redact-values-in-response.interceptor.ts @@ -1,4 +1,6 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; +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 { CallHandler, ExecutionContext, @@ -12,7 +14,7 @@ import { map } from 'rxjs/operators'; export class RedactValuesInResponseInterceptor implements NestInterceptor { - public constructor() {} + public constructor(private userService: UserService) {} public intercept( context: ExecutionContext, @@ -21,34 +23,43 @@ export class RedactValuesInResponseInterceptor return next.handle().pipe( map((data: any) => { const request = context.switchToHttp().getRequest(); - const hasImpersonationId = !!request.headers?.['impersonation-id']; + const hasImpersonationId = + !!request.headers?.[HEADER_KEY_IMPERSONATION.toLowerCase()]; - if (hasImpersonationId) { - if (data.accounts) { - for (const accountId of Object.keys(data.accounts)) { - if (data.accounts[accountId]?.balance !== undefined) { - data.accounts[accountId].balance = null; - } - } - } - - if (data.activities) { - data.activities = data.activities.map((activity: Activity) => { - if (activity.Account?.balance !== undefined) { - activity.Account.balance = null; - } - - return activity; - }); - } - - if (data.filteredValueInBaseCurrency) { - data.filteredValueInBaseCurrency = null; - } - - if (data.totalValueInBaseCurrency) { - data.totalValueInBaseCurrency = null; - } + if ( + hasImpersonationId || + this.userService.isRestrictedView(request.user) + ) { + data = redactAttributes({ + object: data, + options: [ + 'balance', + 'balanceInBaseCurrency', + 'comment', + 'convertedBalance', + 'dividendInBaseCurrency', + 'fee', + 'feeInBaseCurrency', + 'filteredValueInBaseCurrency', + 'grossPerformance', + 'investment', + 'netPerformance', + 'quantity', + 'symbolMapping', + 'totalBalanceInBaseCurrency', + 'totalValueInBaseCurrency', + 'unitPrice', + 'value', + 'valueInBaseCurrency' + ].map((attribute) => { + return { + attribute, + valueMap: { + '*': null + } + }; + }) + }); } return data; 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 aa9952473..ad2579638 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,3 +1,4 @@ +import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { decodeDataSource } from '@ghostfolio/common/helper'; import { CallHandler, @@ -5,10 +6,9 @@ import { Injectable, NestInterceptor } from '@nestjs/common'; +import { DataSource } from '@prisma/client'; import { Observable } from 'rxjs'; -import { ConfigurationService } from '../services/configuration.service'; - @Injectable() export class TransformDataSourceInRequestInterceptor implements NestInterceptor @@ -24,12 +24,25 @@ export class TransformDataSourceInRequestInterceptor const http = context.switchToHttp(); const request = http.getRequest(); - if (this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION') === true) { - if (request.body.dataSource) { + if (this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) { + if (request.body.activities) { + request.body.activities = request.body.activities.map((activity) => { + if (DataSource[activity.dataSource]) { + return activity; + } else { + return { + ...activity, + dataSource: decodeDataSource(activity.dataSource) + }; + } + }); + } + + if (request.body.dataSource && !DataSource[request.body.dataSource]) { request.body.dataSource = decodeDataSource(request.body.dataSource); } - if (request.params.dataSource) { + if (request.params.dataSource && !DataSource[request.params.dataSource]) { request.params.dataSource = decodeDataSource(request.params.dataSource); } } 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 4b80038f5..6968a0f0f 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,3 +1,5 @@ +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, @@ -5,12 +7,10 @@ import { Injectable, NestInterceptor } from '@nestjs/common'; -import { isArray } from 'lodash'; +import { DataSource } from '@prisma/client'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; -import { ConfigurationService } from '../services/configuration.service'; - @Injectable() export class TransformDataSourceInResponseInterceptor implements NestInterceptor @@ -25,66 +25,24 @@ export class TransformDataSourceInResponseInterceptor ): Observable { return next.handle().pipe( map((data: any) => { - if ( - this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION') === true - ) { - if (data.activities) { - data.activities.map((activity) => { - activity.SymbolProfile.dataSource = encodeDataSource( - activity.SymbolProfile.dataSource - ); - return activity; - }); - } - - if (isArray(data.benchmarks)) { - data.benchmarks.map((benchmark) => { - benchmark.dataSource = encodeDataSource(benchmark.dataSource); - return benchmark; - }); - } - - if (data.dataSource) { - data.dataSource = encodeDataSource(data.dataSource); - } - - if (data.errors) { - for (const error of data.errors) { - if (error.dataSource) { - error.dataSource = encodeDataSource(error.dataSource); + if (this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) { + data = redactAttributes({ + options: [ + { + attribute: 'dataSource', + valueMap: Object.keys(DataSource).reduce( + (valueMap, dataSource) => { + valueMap[dataSource] = encodeDataSource( + DataSource[dataSource] + ); + return valueMap; + }, + {} + ) } - } - } - - if (data.holdings) { - for (const symbol of Object.keys(data.holdings)) { - if (data.holdings[symbol].dataSource) { - data.holdings[symbol].dataSource = encodeDataSource( - data.holdings[symbol].dataSource - ); - } - } - } - - if (data.items) { - data.items.map((item) => { - item.dataSource = encodeDataSource(item.dataSource); - return item; - }); - } - - if (data.positions) { - data.positions.map((position) => { - position.dataSource = encodeDataSource(position.dataSource); - return position; - }); - } - - if (data.SymbolProfile) { - data.SymbolProfile.dataSource = encodeDataSource( - data.SymbolProfile.dataSource - ); - } + ], + object: data + }); } return data; diff --git a/apps/api/src/main.ts b/apps/api/src/main.ts index b8bfb81de..45e7a987d 100644 --- a/apps/api/src/main.ts +++ b/apps/api/src/main.ts @@ -1,6 +1,9 @@ import { Logger, ValidationPipe, VersioningType } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; import { NestFactory } from '@nestjs/core'; +import type { NestExpressApplication } from '@nestjs/platform-express'; +import * as bodyParser from 'body-parser'; +import helmet from 'helmet'; import { AppModule } from './app/app.module'; import { environment } from './environments/environment'; @@ -9,16 +12,12 @@ async function bootstrap() { const configApp = await NestFactory.create(AppModule); const configService = configApp.get(ConfigService); - const NODE_ENV = - configService.get<'development' | 'production'>('NODE_ENV') ?? - 'development'; - - const app = await NestFactory.create(AppModule, { - logger: - NODE_ENV === 'production' - ? ['error', 'log', 'warn'] - : ['debug', 'error', 'log', 'verbose', 'warn'] + const app = await NestFactory.create(AppModule, { + logger: environment.production + ? ['error', 'log', 'warn'] + : ['debug', 'error', 'log', 'verbose', 'warn'] }); + app.enableCors(); app.enableVersioning({ defaultVersion: '1', @@ -33,12 +32,42 @@ async function bootstrap() { }) ); + // Support 10mb csv/json files for importing activities + app.use(bodyParser.json({ limit: '10mb' })); + + if (configService.get('ENABLE_FEATURE_SUBSCRIPTION') === 'true') { + app.use( + helmet({ + contentSecurityPolicy: { + directives: { + frameSrc: ["'self'", 'https://js.stripe.com'], // Allow loading frames from Stripe + scriptSrc: ["'self'", "'unsafe-inline'", 'https://js.stripe.com'], // Allow inline scripts and scripts from Stripe + scriptSrcAttr: ["'self'", "'unsafe-inline'"], // Allow inline event handlers + styleSrc: ["'self'", "'unsafe-inline'"] // Allow inline styles + } + }, + crossOriginOpenerPolicy: false // Disable Cross-Origin-Opener-Policy header (for Internet Identity) + }) + ); + } + + const BASE_CURRENCY = configService.get('BASE_CURRENCY'); const HOST = configService.get('HOST') || '0.0.0.0'; const PORT = configService.get('PORT') || 3333; + await app.listen(PORT, HOST, () => { logLogo(); Logger.log(`Listening at http://${HOST}:${PORT}`); Logger.log(''); + + if (BASE_CURRENCY) { + Logger.warn( + `The environment variable "BASE_CURRENCY" is deprecated and will be removed in Ghostfolio 2.0.` + ); + Logger.warn( + 'Please use the currency converter in the activity dialog instead.' + ); + } }); } diff --git a/apps/api/src/models/order.ts b/apps/api/src/models/order.ts index 8882ebe37..f24f4455d 100644 --- a/apps/api/src/models/order.ts +++ b/apps/api/src/models/order.ts @@ -1,8 +1,7 @@ +import { IOrder } from '@ghostfolio/api/services/interfaces/interfaces'; import { Account, SymbolProfile, Type as TypeOfOrder } from '@prisma/client'; import { v4 as uuidv4 } from 'uuid'; -import { IOrder } from '../services/interfaces/interfaces'; - export class Order { private account: Account; private currency: string; diff --git a/apps/api/src/models/rule.ts b/apps/api/src/models/rule.ts index ad1629ac3..171da810d 100644 --- a/apps/api/src/models/rule.ts +++ b/apps/api/src/models/rule.ts @@ -1,5 +1,5 @@ import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface'; -import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data.service'; +import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { groupBy } from '@ghostfolio/common/helper'; import { TimelinePosition, UserSettings } from '@ghostfolio/common/interfaces'; 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 078123743..d0cdbb58c 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 @@ -1,5 +1,5 @@ import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface'; -import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data.service'; +import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { PortfolioDetails, PortfolioPosition, @@ -14,7 +14,7 @@ export class AccountClusterRiskCurrentInvestment extends Rule { private accounts: PortfolioDetails['accounts'] ) { super(exchangeRateDataService, { - name: 'Current Investment' + name: 'Investment' }); } @@ -28,7 +28,7 @@ export class AccountClusterRiskCurrentInvestment extends Rule { for (const [accountId, account] of Object.entries(this.accounts)) { accounts[accountId] = { name: account.name, - investment: account.current + investment: account.valueInBaseCurrency }; } diff --git a/apps/api/src/models/rules/account-cluster-risk/initial-investment.ts b/apps/api/src/models/rules/account-cluster-risk/initial-investment.ts deleted file mode 100644 index f490b0d6d..000000000 --- a/apps/api/src/models/rules/account-cluster-risk/initial-investment.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface'; -import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data.service'; -import { - PortfolioDetails, - PortfolioPosition, - UserSettings -} from '@ghostfolio/common/interfaces'; - -import { Rule } from '../../rule'; - -export class AccountClusterRiskInitialInvestment extends Rule { - public constructor( - protected exchangeRateDataService: ExchangeRateDataService, - private accounts: PortfolioDetails['accounts'] - ) { - super(exchangeRateDataService, { - name: 'Initial Investment' - }); - } - - public evaluate(ruleSettings?: Settings) { - const accounts: { - [symbol: string]: Pick & { - investment: number; - }; - } = {}; - - for (const [accountId, account] of Object.entries(this.accounts)) { - accounts[accountId] = { - name: account.name, - investment: account.original - }; - } - - let maxItem; - let totalInvestment = 0; - - for (const account of Object.values(accounts)) { - if (!maxItem) { - maxItem = account; - } - - // Calculate total investment - totalInvestment += account.investment; - - // Find maximum - if (account.investment > maxItem?.investment) { - maxItem = account; - } - } - - const maxInvestmentRatio = maxItem.investment / totalInvestment; - - if (maxInvestmentRatio > ruleSettings.threshold) { - return { - evaluation: `Over ${ - ruleSettings.threshold * 100 - }% of your initial investment is at ${maxItem.name} (${( - maxInvestmentRatio * 100 - ).toPrecision(3)}%)`, - value: false - }; - } - - return { - evaluation: `The major part of your initial investment is at ${ - maxItem.name - } (${(maxInvestmentRatio * 100).toPrecision(3)}%) and does not exceed ${ - ruleSettings.threshold * 100 - }%`, - value: true - }; - } - - public getSettings(aUserSettings: UserSettings): Settings { - return { - baseCurrency: aUserSettings.baseCurrency, - isActive: true, - threshold: 0.5 - }; - } -} - -interface Settings extends RuleSettings { - baseCurrency: string; - isActive: boolean; - threshold: number; -} diff --git a/apps/api/src/models/rules/account-cluster-risk/single-account.ts b/apps/api/src/models/rules/account-cluster-risk/single-account.ts index c9bd0b35f..3be323d7c 100644 --- a/apps/api/src/models/rules/account-cluster-risk/single-account.ts +++ b/apps/api/src/models/rules/account-cluster-risk/single-account.ts @@ -1,5 +1,5 @@ import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface'; -import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data.service'; +import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { PortfolioDetails, UserSettings } from '@ghostfolio/common/interfaces'; import { Rule } from '../../rule'; @@ -19,13 +19,13 @@ export class AccountClusterRiskSingleAccount extends Rule { if (accounts.length === 1) { return { - evaluation: `All your investment is managed by a single account`, + evaluation: `Your net worth is managed by a single account`, value: false }; } return { - evaluation: `Your investment is managed by ${accounts.length} accounts`, + evaluation: `Your net worth is managed by ${accounts.length} accounts`, value: true }; } 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 5f1f4cf93..2facb8803 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 @@ -1,23 +1,22 @@ -import { CurrentPositions } from '@ghostfolio/api/app/portfolio/interfaces/current-positions.interface'; import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface'; -import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data.service'; -import { UserSettings } from '@ghostfolio/common/interfaces'; +import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; +import { TimelinePosition, UserSettings } from '@ghostfolio/common/interfaces'; import { Rule } from '../../rule'; export class CurrencyClusterRiskBaseCurrencyCurrentInvestment extends Rule { public constructor( protected exchangeRateDataService: ExchangeRateDataService, - private currentPositions: CurrentPositions + private positions: TimelinePosition[] ) { super(exchangeRateDataService, { - name: 'Current Investment: Base Currency' + name: 'Investment: Base Currency' }); } public evaluate(ruleSettings: Settings) { const positionsGroupedByCurrency = this.groupCurrentPositionsByAttribute( - this.currentPositions.positions, + this.positions, 'currency', ruleSettings.baseCurrency ); diff --git a/apps/api/src/models/rules/currency-cluster-risk/base-currency-initial-investment.ts b/apps/api/src/models/rules/currency-cluster-risk/base-currency-initial-investment.ts deleted file mode 100644 index 1d43f5619..000000000 --- a/apps/api/src/models/rules/currency-cluster-risk/base-currency-initial-investment.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { CurrentPositions } from '@ghostfolio/api/app/portfolio/interfaces/current-positions.interface'; -import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface'; -import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data.service'; -import { UserSettings } from '@ghostfolio/common/interfaces'; - -import { Rule } from '../../rule'; - -export class CurrencyClusterRiskBaseCurrencyInitialInvestment extends Rule { - public constructor( - protected exchangeRateDataService: ExchangeRateDataService, - private currentPositions: CurrentPositions - ) { - super(exchangeRateDataService, { - name: 'Initial Investment: Base Currency' - }); - } - - public evaluate(ruleSettings: Settings) { - const positionsGroupedByCurrency = this.groupCurrentPositionsByAttribute( - this.currentPositions.positions, - 'currency', - ruleSettings.baseCurrency - ); - - let maxItem = positionsGroupedByCurrency[0]; - let totalInvestment = 0; - - positionsGroupedByCurrency.forEach((groupItem) => { - // Calculate total investment - totalInvestment += groupItem.investment; - - // Find maximum - if (groupItem.investment > maxItem.investment) { - maxItem = groupItem; - } - }); - - const baseCurrencyItem = positionsGroupedByCurrency.find((item) => { - return item.groupKey === ruleSettings.baseCurrency; - }); - - const baseCurrencyInvestmentRatio = - baseCurrencyItem?.investment / totalInvestment || 0; - - if (maxItem.groupKey !== ruleSettings.baseCurrency) { - return { - evaluation: `The major part of your initial investment is not in your base currency (${( - baseCurrencyInvestmentRatio * 100 - ).toPrecision(3)}% in ${ruleSettings.baseCurrency})`, - value: false - }; - } - - return { - evaluation: `The major part of your initial investment is in your base currency (${( - baseCurrencyInvestmentRatio * 100 - ).toPrecision(3)}% in ${ruleSettings.baseCurrency})`, - value: true - }; - } - - public getSettings(aUserSettings: UserSettings): Settings { - return { - baseCurrency: aUserSettings.baseCurrency, - isActive: true - }; - } -} - -interface Settings extends RuleSettings { - baseCurrency: string; -} diff --git a/apps/api/src/models/rules/currency-cluster-risk/current-investment.ts b/apps/api/src/models/rules/currency-cluster-risk/current-investment.ts index c233ffc9c..2d69865f5 100644 --- a/apps/api/src/models/rules/currency-cluster-risk/current-investment.ts +++ b/apps/api/src/models/rules/currency-cluster-risk/current-investment.ts @@ -1,23 +1,22 @@ -import { CurrentPositions } from '@ghostfolio/api/app/portfolio/interfaces/current-positions.interface'; import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface'; -import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data.service'; -import { UserSettings } from '@ghostfolio/common/interfaces'; +import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; +import { TimelinePosition, UserSettings } from '@ghostfolio/common/interfaces'; import { Rule } from '../../rule'; export class CurrencyClusterRiskCurrentInvestment extends Rule { public constructor( - public exchangeRateDataService: ExchangeRateDataService, - private currentPositions: CurrentPositions + protected exchangeRateDataService: ExchangeRateDataService, + private positions: TimelinePosition[] ) { super(exchangeRateDataService, { - name: 'Current Investment' + name: 'Investment' }); } public evaluate(ruleSettings: Settings) { const positionsGroupedByCurrency = this.groupCurrentPositionsByAttribute( - this.currentPositions.positions, + this.positions, 'currency', ruleSettings.baseCurrency ); diff --git a/apps/api/src/models/rules/currency-cluster-risk/initial-investment.ts b/apps/api/src/models/rules/currency-cluster-risk/initial-investment.ts deleted file mode 100644 index 331074f16..000000000 --- a/apps/api/src/models/rules/currency-cluster-risk/initial-investment.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { CurrentPositions } from '@ghostfolio/api/app/portfolio/interfaces/current-positions.interface'; -import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface'; -import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data.service'; -import { UserSettings } from '@ghostfolio/common/interfaces'; - -import { Rule } from '../../rule'; - -export class CurrencyClusterRiskInitialInvestment extends Rule { - public constructor( - protected exchangeRateDataService: ExchangeRateDataService, - private currentPositions: CurrentPositions - ) { - super(exchangeRateDataService, { - name: 'Initial Investment' - }); - } - - public evaluate(ruleSettings: Settings) { - const positionsGroupedByCurrency = this.groupCurrentPositionsByAttribute( - this.currentPositions.positions, - 'currency', - ruleSettings.baseCurrency - ); - - let maxItem = positionsGroupedByCurrency[0]; - let totalInvestment = 0; - - positionsGroupedByCurrency.forEach((groupItem) => { - // Calculate total investment - totalInvestment += groupItem.investment; - - // Find maximum - if (groupItem.investment > maxItem.investment) { - maxItem = groupItem; - } - }); - - const maxInvestmentRatio = maxItem.investment / totalInvestment; - - if (maxInvestmentRatio > ruleSettings.threshold) { - return { - evaluation: `Over ${ - ruleSettings.threshold * 100 - }% of your initial investment is in ${maxItem.groupKey} (${( - maxInvestmentRatio * 100 - ).toPrecision(3)}%)`, - value: false - }; - } - - return { - evaluation: `The major part of your initial investment is in ${ - maxItem.groupKey - } (${(maxInvestmentRatio * 100).toPrecision(3)}%) and does not exceed ${ - ruleSettings.threshold * 100 - }%`, - value: true - }; - } - - public getSettings(aUserSettings: UserSettings): Settings { - return { - baseCurrency: aUserSettings.baseCurrency, - isActive: true, - threshold: 0.5 - }; - } -} - -interface Settings extends RuleSettings { - baseCurrency: string; - threshold: number; -} diff --git a/apps/api/src/models/rules/fees/fee-ratio-initial-investment.ts b/apps/api/src/models/rules/fees/fee-ratio-initial-investment.ts index d3e4ea827..dfe375c43 100644 --- a/apps/api/src/models/rules/fees/fee-ratio-initial-investment.ts +++ b/apps/api/src/models/rules/fees/fee-ratio-initial-investment.ts @@ -1,5 +1,5 @@ import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface'; -import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data.service'; +import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { UserSettings } from '@ghostfolio/common/interfaces'; import { Rule } from '../../rule'; @@ -11,7 +11,7 @@ export class FeeRatioInitialInvestment extends Rule { private fees: number ) { super(exchangeRateDataService, { - name: 'Initial Investment' + name: 'Investment' }); } diff --git a/apps/api/src/services/configuration.module.ts b/apps/api/src/services/configuration/configuration.module.ts similarity index 85% rename from apps/api/src/services/configuration.module.ts rename to apps/api/src/services/configuration/configuration.module.ts index b91475941..61b8bb4af 100644 --- a/apps/api/src/services/configuration.module.ts +++ b/apps/api/src/services/configuration/configuration.module.ts @@ -1,4 +1,4 @@ -import { ConfigurationService } from '@ghostfolio/api/services/configuration.service'; +import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { Module } from '@nestjs/common'; @Module({ diff --git a/apps/api/src/services/configuration.service.ts b/apps/api/src/services/configuration/configuration.service.ts similarity index 77% rename from apps/api/src/services/configuration.service.ts rename to apps/api/src/services/configuration/configuration.service.ts index 9cddec1f0..e522aeccd 100644 --- a/apps/api/src/services/configuration.service.ts +++ b/apps/api/src/services/configuration/configuration.service.ts @@ -1,9 +1,8 @@ +import { Environment } from '@ghostfolio/api/services/interfaces/environment.interface'; import { Injectable } from '@nestjs/common'; import { DataSource } from '@prisma/client'; import { bool, cleanEnv, host, json, num, port, str } from 'envalid'; -import { Environment } from './interfaces/environment.interface'; - @Injectable() export class ConfigurationService { private readonly environmentConfiguration: Environment; @@ -12,22 +11,27 @@ export class ConfigurationService { this.environmentConfiguration = cleanEnv(process.env, { ACCESS_TOKEN_SALT: str(), ALPHA_VANTAGE_API_KEY: str({ default: '' }), - BASE_CURRENCY: str({ default: 'USD' }), + BASE_CURRENCY: str({ + choices: ['AUD', 'CAD', 'CNY', 'EUR', 'GBP', 'JPY', 'RUB', 'USD'], + default: 'USD' + }), + BETTER_UPTIME_API_KEY: str({ default: '' }), + CACHE_QUOTES_TTL: num({ default: 1 }), CACHE_TTL: num({ default: 1 }), - DATA_SOURCE_PRIMARY: str({ default: DataSource.YAHOO }), + DATA_SOURCE_EXCHANGE_RATES: str({ default: DataSource.YAHOO }), + DATA_SOURCE_IMPORT: str({ default: DataSource.YAHOO }), DATA_SOURCES: json({ - default: [DataSource.GHOSTFOLIO, DataSource.YAHOO] + default: [DataSource.COINGECKO, DataSource.MANUAL, DataSource.YAHOO] }), ENABLE_FEATURE_BLOG: bool({ default: false }), - ENABLE_FEATURE_CUSTOM_SYMBOLS: bool({ default: false }), ENABLE_FEATURE_FEAR_AND_GREED_INDEX: bool({ default: false }), - ENABLE_FEATURE_IMPORT: bool({ default: true }), 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: '' }), @@ -39,7 +43,7 @@ export class ConfigurationService { MAX_ITEM_IN_CACHE: num({ default: 9999 }), PORT: port({ default: 3333 }), RAPID_API_API_KEY: str({ default: '' }), - REDIS_HOST: host({ default: 'localhost' }), + REDIS_HOST: str({ default: 'localhost' }), REDIS_PASSWORD: str({ default: '' }), REDIS_PORT: port({ default: 6379 }), ROOT_URL: str({ default: 'http://localhost:4200' }), diff --git a/apps/api/src/services/cron.service.ts b/apps/api/src/services/cron.service.ts index 727ff0998..72043b36b 100644 --- a/apps/api/src/services/cron.service.ts +++ b/apps/api/src/services/cron.service.ts @@ -5,12 +5,14 @@ import { import { Injectable } from '@nestjs/common'; import { Cron, CronExpression } from '@nestjs/schedule'; -import { DataGatheringService } from './data-gathering.service'; -import { ExchangeRateDataService } from './exchange-rate-data.service'; +import { DataGatheringService } from './data-gathering/data-gathering.service'; +import { ExchangeRateDataService } from './exchange-rate-data/exchange-rate-data.service'; import { TwitterBotService } from './twitter-bot/twitter-bot.service'; @Injectable() export class CronService { + private static readonly EVERY_SUNDAY_AT_LUNCH_TIME = '0 12 * * 0'; + public constructor( private readonly dataGatheringService: DataGatheringService, private readonly exchangeRateDataService: ExchangeRateDataService, @@ -28,23 +30,28 @@ export class CronService { } @Cron(CronExpression.EVERY_DAY_AT_5PM) - public async runEveryDayAtFivePM() { + public async runEveryDayAtFivePm() { this.twitterBotService.tweetFearAndGreedIndex(); } - @Cron(CronExpression.EVERY_WEEKEND) - public async runEveryWeekend() { + @Cron(CronService.EVERY_SUNDAY_AT_LUNCH_TIME) + public async runEverySundayAtTwelvePm() { const uniqueAssets = await this.dataGatheringService.getUniqueAssets(); - for (const { dataSource, symbol } of uniqueAssets) { - await this.dataGatheringService.addJobToQueue( - GATHER_ASSET_PROFILE_PROCESS, - { - dataSource, - symbol - }, - GATHER_ASSET_PROFILE_PROCESS_OPTIONS - ); - } + await this.dataGatheringService.addJobsToQueue( + uniqueAssets.map(({ dataSource, symbol }) => { + return { + data: { + dataSource, + symbol + }, + name: GATHER_ASSET_PROFILE_PROCESS, + opts: { + ...GATHER_ASSET_PROFILE_PROCESS_OPTIONS, + jobId: `${dataSource}-${symbol}` + } + }; + }) + ); } } diff --git a/apps/api/src/services/data-gathering.module.ts b/apps/api/src/services/data-gathering/data-gathering.module.ts similarity index 70% rename from apps/api/src/services/data-gathering.module.ts rename to apps/api/src/services/data-gathering/data-gathering.module.ts index 0083a8d75..50131bbe8 100644 --- a/apps/api/src/services/data-gathering.module.ts +++ b/apps/api/src/services/data-gathering/data-gathering.module.ts @@ -1,17 +1,17 @@ -import { ConfigurationModule } from '@ghostfolio/api/services/configuration.module'; -import { DataGatheringService } from '@ghostfolio/api/services/data-gathering.service'; +import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; +import { DataGatheringService } from '@ghostfolio/api/services/data-gathering/data-gathering.service'; 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 { PrismaModule } from '@ghostfolio/api/services/prisma.module'; +import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module'; +import { MarketDataModule } from '@ghostfolio/api/services/market-data/market-data.module'; +import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; +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'; import { DataGatheringProcessor } from './data-gathering.processor'; -import { ExchangeRateDataModule } from './exchange-rate-data.module'; -import { MarketDataModule } from './market-data.module'; -import { SymbolProfileModule } from './symbol-profile.module'; @Module({ imports: [ diff --git a/apps/api/src/services/data-gathering.processor.ts b/apps/api/src/services/data-gathering/data-gathering.processor.ts similarity index 66% rename from apps/api/src/services/data-gathering.processor.ts rename to apps/api/src/services/data-gathering/data-gathering.processor.ts index 7e2a27642..c517e0f15 100644 --- a/apps/api/src/services/data-gathering.processor.ts +++ b/apps/api/src/services/data-gathering/data-gathering.processor.ts @@ -1,12 +1,16 @@ +import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; +import { IDataGatheringItem } from '@ghostfolio/api/services/interfaces/interfaces'; +import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; import { DATA_GATHERING_QUEUE, GATHER_ASSET_PROFILE_PROCESS, GATHER_HISTORICAL_MARKET_DATA_PROCESS } from '@ghostfolio/common/config'; -import { DATE_FORMAT } from '@ghostfolio/common/helper'; +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'; import { Job } from 'bull'; import { format, @@ -18,9 +22,6 @@ import { } from 'date-fns'; import { DataGatheringService } from './data-gathering.service'; -import { DataProviderService } from './data-provider/data-provider.service'; -import { IDataGatheringItem } from './interfaces/interfaces'; -import { PrismaService } from './prisma.service'; @Injectable() @Processor(DATA_GATHERING_QUEUE) @@ -28,10 +29,10 @@ export class DataGatheringProcessor { public constructor( private readonly dataGatheringService: DataGatheringService, private readonly dataProviderService: DataProviderService, - private readonly prismaService: PrismaService + private readonly marketDataService: MarketDataService ) {} - @Process(GATHER_ASSET_PROFILE_PROCESS) + @Process({ concurrency: 1, name: GATHER_ASSET_PROFILE_PROCESS }) public async gatherAssetProfile(job: Job) { try { await this.dataGatheringService.gatherAssetProfiles([job.data]); @@ -45,18 +46,27 @@ export class DataGatheringProcessor { } } - @Process(GATHER_HISTORICAL_MARKET_DATA_PROCESS) + @Process({ concurrency: 1, name: GATHER_HISTORICAL_MARKET_DATA_PROCESS }) public async gatherHistoricalMarketData(job: Job) { try { const { dataSource, date, symbol } = job.data; + let currentDate = parseISO((date)); + + Logger.log( + `Historical market data gathering has been started for ${symbol} (${dataSource}) at ${format( + currentDate, + DATE_FORMAT + )}`, + `DataGatheringProcessor (${GATHER_HISTORICAL_MARKET_DATA_PROCESS})` + ); const historicalData = await this.dataProviderService.getHistoricalRaw( [{ dataSource, symbol }], - parseISO((date)), + currentDate, new Date() ); - let currentDate = parseISO((date)); + const data: Prisma.MarketDataUpdateInput[] = []; let lastMarketPrice: number; while ( @@ -82,23 +92,13 @@ export class DataGatheringProcessor { } if (lastMarketPrice) { - try { - await this.prismaService.marketData.create({ - data: { - dataSource, - symbol, - date: new Date( - Date.UTC( - getYear(currentDate), - getMonth(currentDate), - getDate(currentDate), - 0 - ) - ), - marketPrice: lastMarketPrice - } - }); - } catch {} + data.push({ + dataSource, + symbol, + date: getStartOfUtcDate(currentDate), + marketPrice: lastMarketPrice, + state: 'CLOSE' + }); } // Count month one up for iteration @@ -112,8 +112,13 @@ export class DataGatheringProcessor { ); } + await this.marketDataService.updateMany({ data }); + Logger.log( - `Historical market data gathering has been completed for ${symbol} (${dataSource}).`, + `Historical market data gathering has been completed for ${symbol} (${dataSource}) at ${format( + currentDate, + DATE_FORMAT + )}`, `DataGatheringProcessor (${GATHER_HISTORICAL_MARKET_DATA_PROCESS})` ); } catch (error) { diff --git a/apps/api/src/services/data-gathering.service.ts b/apps/api/src/services/data-gathering/data-gathering.service.ts similarity index 71% rename from apps/api/src/services/data-gathering.service.ts rename to apps/api/src/services/data-gathering/data-gathering.service.ts index e977c9c07..fc77bdc60 100644 --- a/apps/api/src/services/data-gathering.service.ts +++ b/apps/api/src/services/data-gathering/data-gathering.service.ts @@ -1,9 +1,14 @@ -import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile.service'; +import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; +import { DataEnhancerInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-enhancer.interface'; +import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; +import { IDataGatheringItem } from '@ghostfolio/api/services/interfaces/interfaces'; +import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; +import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; +import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; import { DATA_GATHERING_QUEUE, GATHER_HISTORICAL_MARKET_DATA_PROCESS, - GATHER_HISTORICAL_MARKET_DATA_PROCESS_OPTIONS, - QUEUE_JOB_STATUS_LIST + GATHER_HISTORICAL_MARKET_DATA_PROCESS_OPTIONS } from '@ghostfolio/common/config'; import { DATE_FORMAT, resetHours } from '@ghostfolio/common/helper'; import { UniqueAsset } from '@ghostfolio/common/interfaces'; @@ -11,14 +16,8 @@ import { InjectQueue } from '@nestjs/bull'; import { Inject, Injectable, Logger } from '@nestjs/common'; import { DataSource } from '@prisma/client'; import { JobOptions, Queue } from 'bull'; -import { format, subDays } from 'date-fns'; - -import { DataProviderService } from './data-provider/data-provider.service'; -import { DataEnhancerInterface } from './data-provider/interfaces/data-enhancer.interface'; -import { ExchangeRateDataService } from './exchange-rate-data.service'; -import { IDataGatheringItem } from './interfaces/interfaces'; -import { MarketDataService } from './market-data.service'; -import { PrismaService } from './prisma.service'; +import { format, min, subDays, subYears } from 'date-fns'; +import { isEmpty } from 'lodash'; @Injectable() export class DataGatheringService { @@ -34,17 +33,22 @@ export class DataGatheringService { private readonly symbolProfileService: SymbolProfileService ) {} - public async addJobToQueue(name: string, data: any, options?: JobOptions) { - const hasJob = await this.hasJob(name, data); + public async addJobToQueue({ + data, + name, + opts + }: { + data: any; + name: string; + opts?: JobOptions; + }) { + return this.dataGatheringQueue.add(name, data, opts); + } - if (hasJob) { - Logger.log( - `Job ${name} with data ${JSON.stringify(data)} already exists.`, - 'DataGatheringService' - ); - } else { - return this.dataGatheringQueue.add(name, data, options); - } + public async addJobsToQueue( + jobs: { data: any; name: string; opts?: JobOptions }[] + ) { + return this.dataGatheringQueue.addBulk(jobs); } public async gather7Days() { @@ -97,7 +101,7 @@ export class DataGatheringService { symbol }, update: { marketPrice }, - where: { date_symbol: { date, symbol } } + where: { dataSource_date_symbol: { dataSource, date, symbol } } }); } } catch (error) { @@ -119,12 +123,9 @@ export class DataGatheringService { const assetProfiles = await this.dataProviderService.getAssetProfiles( uniqueAssets ); - const symbolProfiles = - await this.symbolProfileService.getSymbolProfilesBySymbols( - uniqueAssets.map(({ symbol }) => { - return symbol; - }) - ); + const symbolProfiles = await this.symbolProfileService.getSymbolProfiles( + uniqueAssets + ); for (const [symbol, assetProfile] of Object.entries(assetProfiles)) { const symbolMapping = symbolProfiles.find((symbolProfile) => { @@ -152,10 +153,11 @@ export class DataGatheringService { countries, currency, dataSource, + isin, name, sectors, url - } = assetProfiles[symbol]; + } = assetProfile; try { await this.prismaService.symbolProfile.upsert({ @@ -165,6 +167,7 @@ export class DataGatheringService { countries, currency, dataSource, + isin, name, sectors, symbol, @@ -175,6 +178,7 @@ export class DataGatheringService { assetSubClass, countries, currency, + isin, name, sectors, url @@ -206,68 +210,22 @@ export class DataGatheringService { } public async gatherSymbols(aSymbolsWithStartDate: IDataGatheringItem[]) { - for (const { dataSource, date, symbol } of aSymbolsWithStartDate) { - if (dataSource === 'MANUAL') { - continue; - } - - await this.addJobToQueue( - GATHER_HISTORICAL_MARKET_DATA_PROCESS, - { - dataSource, - date, - symbol - }, - GATHER_HISTORICAL_MARKET_DATA_PROCESS_OPTIONS - ); - } - } - - public async getSymbolsMax(): Promise { - const startDate = - ( - await this.prismaService.order.findFirst({ - orderBy: [{ date: 'asc' }] - }) - )?.date ?? new Date(); - - const currencyPairsToGather = this.exchangeRateDataService - .getCurrencyPairs() - .map(({ dataSource, symbol }) => { + await this.addJobsToQueue( + aSymbolsWithStartDate.map(({ dataSource, date, symbol }) => { return { - dataSource, - symbol, - date: startDate - }; - }); - - const symbolProfilesToGather = ( - await this.prismaService.symbolProfile.findMany({ - orderBy: [{ symbol: 'asc' }], - select: { - dataSource: true, - Order: { - orderBy: [{ date: 'asc' }], - select: { date: true }, - take: 1 + data: { + dataSource, + date, + symbol }, - scraperConfiguration: true, - symbol: true - }, - where: { - dataSource: { - not: 'MANUAL' + name: GATHER_HISTORICAL_MARKET_DATA_PROCESS, + opts: { + ...GATHER_HISTORICAL_MARKET_DATA_PROCESS_OPTIONS, + jobId: `${dataSource}-${symbol}-${format(date, DATE_FORMAT)}` } - } + }; }) - ).map((symbolProfile) => { - return { - ...symbolProfile, - date: symbolProfile.Order?.[0]?.date ?? startDate - }; - }); - - return [...currencyPairsToGather, ...symbolProfilesToGather]; + ); } public async getUniqueAssets(): Promise { @@ -278,7 +236,6 @@ export class DataGatheringService { return symbolProfiles .filter(({ dataSource }) => { return ( - dataSource !== DataSource.GHOSTFOLIO && dataSource !== DataSource.MANUAL && dataSource !== DataSource.RAPID_API ); @@ -300,23 +257,19 @@ export class DataGatheringService { dataSource: true, scraperConfiguration: true, symbol: true - }, - where: { - dataSource: { - not: 'MANUAL' - } } }); // Only consider symbols with incomplete market data for the last // 7 days - const symbolsNotToGather = ( + const symbolsWithCompleteMarketData = ( await this.prismaService.marketData.groupBy({ _count: true, by: ['symbol'], orderBy: [{ symbol: 'asc' }], where: { - date: { gt: startDate } + date: { gt: startDate }, + state: 'CLOSE' } }) ) @@ -328,8 +281,14 @@ export class DataGatheringService { }); const symbolProfilesToGather = symbolProfiles - .filter(({ symbol }) => { - return !symbolsNotToGather.includes(symbol); + .filter(({ dataSource, scraperConfiguration, symbol }) => { + const manualDataSourceWithScraperConfiguration = + dataSource === 'MANUAL' && !isEmpty(scraperConfiguration); + + return ( + !symbolsWithCompleteMarketData.includes(symbol) && + (dataSource !== 'MANUAL' || manualDataSourceWithScraperConfiguration) + ); }) .map((symbolProfile) => { return { @@ -341,7 +300,7 @@ export class DataGatheringService { const currencyPairsToGather = this.exchangeRateDataService .getCurrencyPairs() .filter(({ symbol }) => { - return !symbolsNotToGather.includes(symbol); + return !symbolsWithCompleteMarketData.includes(symbol); }) .map(({ dataSource, symbol }) => { return { @@ -354,17 +313,56 @@ export class DataGatheringService { return [...currencyPairsToGather, ...symbolProfilesToGather]; } - private async hasJob(name: string, data: any) { - const jobs = await this.dataGatheringQueue.getJobs( - QUEUE_JOB_STATUS_LIST.filter((status) => { - return status !== 'completed'; + private async getSymbolsMax(): Promise { + const startDate = + ( + await this.prismaService.order.findFirst({ + orderBy: [{ date: 'asc' }] + }) + )?.date ?? new Date(); + + const currencyPairsToGather = this.exchangeRateDataService + .getCurrencyPairs() + .map(({ dataSource, symbol }) => { + return { + dataSource, + symbol, + date: min([startDate, subYears(new Date(), 10)]) + }; + }); + + const symbolProfilesToGather = ( + await this.prismaService.symbolProfile.findMany({ + orderBy: [{ symbol: 'asc' }], + select: { + dataSource: true, + Order: { + orderBy: [{ date: 'asc' }], + select: { date: true }, + take: 1 + }, + scraperConfiguration: true, + symbol: true + } + }) + ) + .filter((symbolProfile) => { + const manualDataSourceWithScraperConfiguration = + symbolProfile.dataSource === 'MANUAL' && + !isEmpty(symbolProfile.scraperConfiguration); + + return ( + symbolProfile.dataSource !== 'MANUAL' || + manualDataSourceWithScraperConfiguration + ); }) - ); + .map((symbolProfile) => { + return { + ...symbolProfile, + date: symbolProfile.Order?.[0]?.date ?? startDate + }; + }); - return jobs.some((job) => { - return ( - job.name === name && JSON.stringify(job.data) === JSON.stringify(data) - ); - }); + return [...currencyPairsToGather, ...symbolProfilesToGather]; } } 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 41bd715b1..4713a4c5f 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 @@ -1,5 +1,5 @@ import { LookupItem } from '@ghostfolio/api/app/symbol/interfaces/lookup-item.interface'; -import { ConfigurationService } from '@ghostfolio/api/services/configuration.service'; +import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { DataProviderInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; import { IDataProviderHistoricalResponse, @@ -7,7 +7,7 @@ import { } from '@ghostfolio/api/services/interfaces/interfaces'; import { DATE_FORMAT } from '@ghostfolio/common/helper'; import { Granularity } from '@ghostfolio/common/types'; -import { Injectable, Logger } from '@nestjs/common'; +import { Injectable } from '@nestjs/common'; import { DataSource, SymbolProfile } from '@prisma/client'; import { format, isAfter, isBefore, parse } from 'date-fns'; @@ -33,10 +33,25 @@ export class AlphaVantageService implements DataProviderInterface { aSymbol: string ): Promise> { return { - dataSource: this.getName() + dataSource: this.getName(), + symbol: aSymbol }; } + public async getDividends({ + from, + granularity = 'day', + symbol, + to + }: { + from: Date; + granularity: Granularity; + symbol: string; + to: Date; + }) { + return {}; + } + public async getHistorical( aSymbol: string, aGranularity: Granularity = 'day', @@ -95,8 +110,18 @@ export class AlphaVantageService implements DataProviderInterface { return {}; } - public async search(aQuery: string): Promise<{ items: LookupItem[] }> { - const result = await this.alphaVantage.data.search(aQuery); + public getTestSymbol() { + return undefined; + } + + public async search({ + includeIndices = false, + query + }: { + includeIndices?: boolean; + query: string; + }): Promise<{ items: LookupItem[] }> { + const result = await this.alphaVantage.data.search(query); return { items: result?.bestMatches?.map((bestMatch) => { diff --git a/apps/api/src/services/data-provider/coingecko/coingecko.service.ts b/apps/api/src/services/data-provider/coingecko/coingecko.service.ts new file mode 100644 index 000000000..35083e810 --- /dev/null +++ b/apps/api/src/services/data-provider/coingecko/coingecko.service.ts @@ -0,0 +1,203 @@ +import { LookupItem } from '@ghostfolio/api/app/symbol/interfaces/lookup-item.interface'; +import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; +import { DataProviderInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; +import { + IDataProviderHistoricalResponse, + IDataProviderResponse +} from '@ghostfolio/api/services/interfaces/interfaces'; +import { DATE_FORMAT } from '@ghostfolio/common/helper'; +import { DataProviderInfo } from '@ghostfolio/common/interfaces'; +import { Granularity } from '@ghostfolio/common/types'; +import { Injectable, Logger } from '@nestjs/common'; +import { + AssetClass, + AssetSubClass, + DataSource, + SymbolProfile +} from '@prisma/client'; +import bent from 'bent'; +import { format, fromUnixTime, getUnixTime } from 'date-fns'; + +@Injectable() +export class CoinGeckoService implements DataProviderInterface { + private baseCurrency: string; + private readonly URL = 'https://api.coingecko.com/api/v3'; + + public constructor( + private readonly configurationService: ConfigurationService + ) { + this.baseCurrency = this.configurationService.get('BASE_CURRENCY'); + } + + public canHandle(symbol: string) { + return true; + } + + public async getAssetProfile( + aSymbol: string + ): Promise> { + const response: Partial = { + assetClass: AssetClass.CASH, + assetSubClass: AssetSubClass.CRYPTOCURRENCY, + currency: this.baseCurrency, + dataSource: this.getName(), + symbol: aSymbol + }; + + try { + const get = bent(`${this.URL}/coins/${aSymbol}`, 'GET', 'json', 200); + const { name } = await get(); + + response.name = name; + } catch (error) { + Logger.error(error, 'CoinGeckoService'); + } + + return response; + } + + public async getDividends({ + from, + granularity = 'day', + symbol, + to + }: { + from: Date; + granularity: Granularity; + symbol: string; + to: Date; + }) { + return {}; + } + + public async getHistorical( + aSymbol: string, + aGranularity: Granularity = 'day', + from: Date, + to: Date + ): Promise<{ + [symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; + }> { + try { + const get = bent( + `${ + this.URL + }/coins/${aSymbol}/market_chart/range?vs_currency=${this.baseCurrency.toLowerCase()}&from=${getUnixTime( + from + )}&to=${getUnixTime(to)}`, + 'GET', + 'json', + 200 + ); + const { prices } = await get(); + + const result: { + [symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; + } = { + [aSymbol]: {} + }; + + for (const [timestamp, marketPrice] of prices) { + result[aSymbol][format(fromUnixTime(timestamp / 1000), DATE_FORMAT)] = { + marketPrice + }; + } + + return result; + } catch (error) { + throw new Error( + `Could not get historical market data for ${aSymbol} (${this.getName()}) from ${format( + from, + DATE_FORMAT + )} to ${format(to, DATE_FORMAT)}: [${error.name}] ${error.message}` + ); + } + } + + public getMaxNumberOfSymbolsPerRequest() { + return 50; + } + + public getName(): DataSource { + return DataSource.COINGECKO; + } + + public async getQuotes( + aSymbols: string[] + ): Promise<{ [symbol: string]: IDataProviderResponse }> { + const results: { [symbol: string]: IDataProviderResponse } = {}; + + if (aSymbols.length <= 0) { + return {}; + } + + try { + const get = bent( + `${this.URL}/simple/price?ids=${aSymbols.join( + ',' + )}&vs_currencies=${this.baseCurrency.toLowerCase()}`, + 'GET', + 'json', + 200 + ); + const response = await get(); + + for (const symbol in response) { + if (Object.prototype.hasOwnProperty.call(response, symbol)) { + results[symbol] = { + currency: this.baseCurrency, + dataProviderInfo: this.getDataProviderInfo(), + dataSource: DataSource.COINGECKO, + marketPrice: response[symbol][this.baseCurrency.toLowerCase()], + marketState: 'open' + }; + } + } + } catch (error) { + Logger.error(error, 'CoinGeckoService'); + } + + return results; + } + + public getTestSymbol() { + return 'bitcoin'; + } + + public async search({ + includeIndices = false, + query + }: { + includeIndices?: boolean; + query: string; + }): Promise<{ items: LookupItem[] }> { + let items: LookupItem[] = []; + + try { + const get = bent(`${this.URL}/search?query=${query}`, 'GET', 'json', 200); + const { coins } = await get(); + + items = coins.map(({ id: symbol, name }) => { + return { + name, + symbol, + assetClass: AssetClass.CASH, + assetSubClass: AssetSubClass.CRYPTOCURRENCY, + currency: this.baseCurrency, + dataSource: this.getName() + }; + }); + } catch (error) { + Logger.error(error, 'CoinGeckoService'); + } + + return { items }; + } + + private getDataProviderInfo(): DataProviderInfo { + return { + name: 'CoinGecko', + url: 'https://coingecko.com' + }; + } +} 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 9d4c0704d..a658ef448 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 @@ -1,15 +1,27 @@ +import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; +import { CryptocurrencyModule } from '@ghostfolio/api/services/cryptocurrency/cryptocurrency.module'; 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'; @Module({ - exports: ['DataEnhancers', TrackinsightDataEnhancerService], + exports: [ + 'DataEnhancers', + TrackinsightDataEnhancerService, + YahooFinanceDataEnhancerService + ], + imports: [ConfigurationModule, CryptocurrencyModule], providers: [ + TrackinsightDataEnhancerService, + YahooFinanceDataEnhancerService, { - inject: [TrackinsightDataEnhancerService], + inject: [ + TrackinsightDataEnhancerService, + YahooFinanceDataEnhancerService + ], provide: 'DataEnhancers', - useFactory: (trackinsight) => [trackinsight] - }, - TrackinsightDataEnhancerService + useFactory: (trackinsight, yahooFinance) => [trackinsight, yahooFinance] + } ] }) export class DataEnhancerModule {} 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 8ebdb1dba..ec68dd2eb 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 @@ -1,13 +1,15 @@ 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 bent from 'bent'; const getJSON = bent('json'); +@Injectable() export class TrackinsightDataEnhancerService implements DataEnhancerInterface { - private static baseUrl = 'https://data.trackinsight.com/holdings'; + private static baseUrl = 'https://data.trackinsight.com'; private static countries = require('countries-list/dist/countries.json'); private static countriesMapping = { 'Russian Federation': 'Russia' @@ -32,17 +34,29 @@ export class TrackinsightDataEnhancerService implements DataEnhancerInterface { return response; } - const result = await getJSON( - `${TrackinsightDataEnhancerService.baseUrl}/${symbol}.json` + const profile = await getJSON( + `${TrackinsightDataEnhancerService.baseUrl}/data-api/funds/${symbol}.json` + ).catch(() => { + return {}; + }); + + const isin = profile.isin?.split(';')?.[0]; + + if (isin) { + response.isin = isin; + } + + const holdings = await getJSON( + `${TrackinsightDataEnhancerService.baseUrl}/holdings/${symbol}.json` ).catch(() => { return getJSON( - `${TrackinsightDataEnhancerService.baseUrl}/${ - symbol.split('.')[0] + `${TrackinsightDataEnhancerService.baseUrl}/holdings/${ + symbol.split('.')?.[0] }.json` ); }); - if (result.weight < 0.95) { + if (holdings?.weight < 0.95) { // Skip if data is inaccurate return response; } @@ -52,7 +66,9 @@ export class TrackinsightDataEnhancerService implements DataEnhancerInterface { (response.countries as unknown as Country[]).length === 0 ) { response.countries = []; - for (const [name, value] of Object.entries(result.countries)) { + for (const [name, value] of Object.entries( + holdings?.countries ?? {} + )) { let countryCode: string; for (const [key, country] of Object.entries( @@ -80,7 +96,9 @@ export class TrackinsightDataEnhancerService implements DataEnhancerInterface { (response.sectors as unknown as Sector[]).length === 0 ) { response.sectors = []; - for (const [name, value] of Object.entries(result.sectors)) { + for (const [name, value] of Object.entries( + holdings?.sectors ?? {} + )) { response.sectors.push({ name: TrackinsightDataEnhancerService.sectorsMapping[name] ?? name, weight: value.weight diff --git a/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.spec.ts b/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.spec.ts similarity index 59% rename from apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.spec.ts rename to apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.spec.ts index e18b6b583..951a623d0 100644 --- a/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.spec.ts +++ b/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.spec.ts @@ -1,7 +1,7 @@ -import { ConfigurationService } from '@ghostfolio/api/services/configuration.service'; +import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { CryptocurrencyService } from '@ghostfolio/api/services/cryptocurrency/cryptocurrency.service'; -import { YahooFinanceService } from './yahoo-finance.service'; +import { YahooFinanceDataEnhancerService } from './yahoo-finance.service'; jest.mock( '@ghostfolio/api/services/cryptocurrency/cryptocurrency.service', @@ -25,16 +25,16 @@ jest.mock( } ); -describe('YahooFinanceService', () => { +describe('YahooFinanceDataEnhancerService', () => { let configurationService: ConfigurationService; let cryptocurrencyService: CryptocurrencyService; - let yahooFinanceService: YahooFinanceService; + let yahooFinanceDataEnhancerService: YahooFinanceDataEnhancerService; beforeAll(async () => { configurationService = new ConfigurationService(); cryptocurrencyService = new CryptocurrencyService(); - yahooFinanceService = new YahooFinanceService( + yahooFinanceDataEnhancerService = new YahooFinanceDataEnhancerService( configurationService, cryptocurrencyService ); @@ -42,25 +42,37 @@ describe('YahooFinanceService', () => { it('convertFromYahooFinanceSymbol', async () => { expect( - await yahooFinanceService.convertFromYahooFinanceSymbol('BRK-B') + await yahooFinanceDataEnhancerService.convertFromYahooFinanceSymbol( + 'BRK-B' + ) ).toEqual('BRK-B'); expect( - await yahooFinanceService.convertFromYahooFinanceSymbol('BTC-USD') + await yahooFinanceDataEnhancerService.convertFromYahooFinanceSymbol( + 'BTC-USD' + ) ).toEqual('BTCUSD'); expect( - await yahooFinanceService.convertFromYahooFinanceSymbol('EURUSD=X') + await yahooFinanceDataEnhancerService.convertFromYahooFinanceSymbol( + 'EURUSD=X' + ) ).toEqual('EURUSD'); }); it('convertToYahooFinanceSymbol', async () => { expect( - await yahooFinanceService.convertToYahooFinanceSymbol('BTCUSD') + await yahooFinanceDataEnhancerService.convertToYahooFinanceSymbol( + 'BTCUSD' + ) ).toEqual('BTC-USD'); expect( - await yahooFinanceService.convertToYahooFinanceSymbol('DOGEUSD') + await yahooFinanceDataEnhancerService.convertToYahooFinanceSymbol( + 'DOGEUSD' + ) ).toEqual('DOGE-USD'); expect( - await yahooFinanceService.convertToYahooFinanceSymbol('USDCHF') + await yahooFinanceDataEnhancerService.convertToYahooFinanceSymbol( + 'USDCHF' + ) ).toEqual('USDCHF=X'); }); }); 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 new file mode 100644 index 000000000..3ad69646b --- /dev/null +++ b/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.ts @@ -0,0 +1,327 @@ +import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; +import { CryptocurrencyService } from '@ghostfolio/api/services/cryptocurrency/cryptocurrency.service'; +import { DataEnhancerInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-enhancer.interface'; +import { UNKNOWN_KEY } from '@ghostfolio/common/config'; +import { isCurrency } from '@ghostfolio/common/helper'; +import { Injectable, Logger } from '@nestjs/common'; +import { + AssetClass, + AssetSubClass, + DataSource, + SymbolProfile +} from '@prisma/client'; +import { countries } from 'countries-list'; +import yahooFinance from 'yahoo-finance2'; +import type { Price } from 'yahoo-finance2/dist/esm/src/modules/quoteSummary-iface'; + +@Injectable() +export class YahooFinanceDataEnhancerService implements DataEnhancerInterface { + private baseCurrency: string; + + public constructor( + private readonly configurationService: ConfigurationService, + private readonly cryptocurrencyService: CryptocurrencyService + ) { + this.baseCurrency = this.configurationService.get('BASE_CURRENCY'); + } + + public convertFromYahooFinanceSymbol(aYahooFinanceSymbol: string) { + let symbol = aYahooFinanceSymbol.replace( + new RegExp(`-${this.baseCurrency}$`), + this.baseCurrency + ); + + if (symbol.includes('=X') && !symbol.includes(this.baseCurrency)) { + symbol = `${this.baseCurrency}${symbol}`; + } + + return symbol.replace('=X', ''); + } + + /** + * Converts a symbol to a Yahoo Finance symbol + * + * Currency: USDCHF -> USDCHF=X + * Cryptocurrency: BTCUSD -> BTC-USD + * DOGEUSD -> DOGE-USD + */ + public convertToYahooFinanceSymbol(aSymbol: string) { + if ( + aSymbol.includes(this.baseCurrency) && + aSymbol.length > this.baseCurrency.length + ) { + if ( + isCurrency( + aSymbol.substring(0, aSymbol.length - this.baseCurrency.length) + ) + ) { + return `${aSymbol}=X`; + } else if ( + this.cryptocurrencyService.isCryptocurrency( + aSymbol.replace( + new RegExp(`-${this.baseCurrency}$`), + this.baseCurrency + ) + ) + ) { + // Add a dash before the last three characters + // BTCUSD -> BTC-USD + // DOGEUSD -> DOGE-USD + // SOL1USD -> SOL1-USD + return aSymbol.replace( + new RegExp(`-?${this.baseCurrency}$`), + `-${this.baseCurrency}` + ); + } + } + + return aSymbol; + } + + public async enhance({ + response, + symbol + }: { + response: Partial; + symbol: string; + }): Promise> { + if (response.dataSource !== 'YAHOO' && !response.isin) { + return response; + } + + try { + let yahooSymbol: string; + + if (response.dataSource === 'YAHOO') { + yahooSymbol = symbol; + } else { + const { quotes } = await yahooFinance.search(response.isin); + yahooSymbol = quotes[0].symbol; + } + + const { countries, sectors, url } = await this.getAssetProfile( + yahooSymbol + ); + + if (countries) { + response.countries = countries; + } + + if (sectors) { + response.sectors = sectors; + } + + if (url) { + response.url = url; + } + } catch (error) { + Logger.error(error, 'YahooFinanceDataEnhancerService'); + } + + return response; + } + + public formatName({ + longName, + quoteType, + shortName, + symbol + }: { + longName: Price['longName']; + quoteType: Price['quoteType']; + shortName: Price['shortName']; + symbol: Price['symbol']; + }) { + let name = longName; + + if (name) { + name = name.replace('&', '&'); + + name = name.replace('Amundi Index Solutions - ', ''); + name = name.replace('iShares ETF (CH) - ', ''); + name = name.replace('iShares III Public Limited Company - ', ''); + name = name.replace('iShares V PLC - ', ''); + name = name.replace('iShares VI Public Limited Company - ', ''); + name = name.replace('iShares VII PLC - ', ''); + name = name.replace('Multi Units Luxembourg - ', ''); + name = name.replace('VanEck ETFs N.V. - ', ''); + name = name.replace('Vaneck Vectors Ucits Etfs Plc - ', ''); + name = name.replace('Vanguard Funds Public Limited Company - ', ''); + name = name.replace('Vanguard Index Funds - ', ''); + name = name.replace('Xtrackers (IE) Plc - ', ''); + } + + if (quoteType === 'FUTURE') { + // "Gold Jun 22" -> "Gold" + name = shortName?.slice(0, -7); + } + + return name || shortName || symbol; + } + + public async getAssetProfile( + aSymbol: string + ): Promise> { + const response: Partial = {}; + + try { + const symbol = this.convertToYahooFinanceSymbol(aSymbol); + const assetProfile = await yahooFinance.quoteSummary(symbol, { + modules: ['price', 'summaryProfile', 'topHoldings'] + }); + + const { assetClass, assetSubClass } = this.parseAssetClass({ + quoteType: assetProfile.price.quoteType, + shortName: assetProfile.price.shortName + }); + + response.assetClass = assetClass; + response.assetSubClass = assetSubClass; + response.currency = assetProfile.price.currency; + response.dataSource = this.getName(); + response.name = this.formatName({ + longName: assetProfile.price.longName, + quoteType: assetProfile.price.quoteType, + shortName: assetProfile.price.shortName, + symbol: assetProfile.price.symbol + }); + response.symbol = aSymbol; + + if (assetSubClass === AssetSubClass.MUTUALFUND) { + response.sectors = []; + + for (const sectorWeighting of assetProfile.topHoldings + ?.sectorWeightings ?? []) { + for (const [sector, weight] of Object.entries(sectorWeighting)) { + response.sectors.push({ weight, name: this.parseSector(sector) }); + } + } + } else if ( + assetSubClass === AssetSubClass.STOCK && + assetProfile.summaryProfile?.country + ) { + // Add country if asset is stock and country available + + try { + const [code] = Object.entries(countries).find(([, country]) => { + return country.name === assetProfile.summaryProfile?.country; + }); + + if (code) { + response.countries = [{ code, weight: 1 }]; + } + } catch {} + + if (assetProfile.summaryProfile?.sector) { + response.sectors = [ + { name: assetProfile.summaryProfile?.sector, weight: 1 } + ]; + } + } + + const url = assetProfile.summaryProfile?.website; + if (url) { + response.url = url; + } + } catch (error) { + Logger.error(error, 'YahooFinanceService'); + } + + return response; + } + + public getName() { + return DataSource.YAHOO; + } + + public parseAssetClass({ + quoteType, + shortName + }: { + quoteType: string; + shortName: string; + }): { + assetClass: AssetClass; + assetSubClass: AssetSubClass; + } { + let assetClass: AssetClass; + let assetSubClass: AssetSubClass; + + switch (quoteType?.toLowerCase()) { + case 'cryptocurrency': + assetClass = AssetClass.CASH; + assetSubClass = AssetSubClass.CRYPTOCURRENCY; + break; + case 'equity': + assetClass = AssetClass.EQUITY; + assetSubClass = AssetSubClass.STOCK; + break; + case 'etf': + assetClass = AssetClass.EQUITY; + assetSubClass = AssetSubClass.ETF; + break; + case 'future': + assetClass = AssetClass.COMMODITY; + assetSubClass = AssetSubClass.COMMODITY; + + if ( + shortName?.toLowerCase()?.startsWith('gold') || + shortName?.toLowerCase()?.startsWith('palladium') || + shortName?.toLowerCase()?.startsWith('platinum') || + shortName?.toLowerCase()?.startsWith('silver') + ) { + assetSubClass = AssetSubClass.PRECIOUS_METAL; + } + + break; + case 'mutualfund': + assetClass = AssetClass.EQUITY; + assetSubClass = AssetSubClass.MUTUALFUND; + break; + } + + return { assetClass, assetSubClass }; + } + + private parseSector(aString: string): string { + let sector = UNKNOWN_KEY; + + switch (aString) { + case 'basic_materials': + sector = 'Basic Materials'; + break; + case 'communication_services': + sector = 'Communication Services'; + break; + case 'consumer_cyclical': + sector = 'Consumer Cyclical'; + break; + case 'consumer_defensive': + sector = 'Consumer Staples'; + break; + case 'energy': + sector = 'Energy'; + break; + case 'financial_services': + sector = 'Financial Services'; + break; + case 'healthcare': + sector = 'Healthcare'; + break; + case 'industrials': + sector = 'Industrials'; + break; + case 'realestate': + sector = 'Real Estate'; + break; + case 'technology': + sector = 'Technology'; + break; + case 'utilities': + sector = 'Utilities'; + break; + } + + return sector; + } +} 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 3fa56e06c..b3a219a50 100644 --- a/apps/api/src/services/data-provider/data-provider.module.ts +++ b/apps/api/src/services/data-provider/data-provider.module.ts @@ -1,30 +1,41 @@ -import { ConfigurationModule } from '@ghostfolio/api/services/configuration.module'; +import { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.module'; +import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; import { CryptocurrencyModule } from '@ghostfolio/api/services/cryptocurrency/cryptocurrency.module'; import { AlphaVantageService } from '@ghostfolio/api/services/data-provider/alpha-vantage/alpha-vantage.service'; +import { CoinGeckoService } from '@ghostfolio/api/services/data-provider/coingecko/coingecko.service'; import { EodHistoricalDataService } from '@ghostfolio/api/services/data-provider/eod-historical-data/eod-historical-data.service'; -import { GhostfolioScraperApiService } from '@ghostfolio/api/services/data-provider/ghostfolio-scraper-api/ghostfolio-scraper-api.service'; +import { FinancialModelingPrepService } from '@ghostfolio/api/services/data-provider/financial-modeling-prep/financial-modeling-prep.service'; import { GoogleSheetsService } from '@ghostfolio/api/services/data-provider/google-sheets/google-sheets.service'; import { ManualService } from '@ghostfolio/api/services/data-provider/manual/manual.service'; import { RapidApiService } from '@ghostfolio/api/services/data-provider/rapid-api/rapid-api.service'; import { YahooFinanceService } from '@ghostfolio/api/services/data-provider/yahoo-finance/yahoo-finance.service'; -import { PrismaModule } from '@ghostfolio/api/services/prisma.module'; -import { SymbolProfileModule } from '@ghostfolio/api/services/symbol-profile.module'; +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 { SymbolProfileModule } from '@ghostfolio/api/services/symbol-profile/symbol-profile.module'; import { Module } from '@nestjs/common'; +import { DataEnhancerModule } from './data-enhancer/data-enhancer.module'; +import { YahooFinanceDataEnhancerService } from './data-enhancer/yahoo-finance/yahoo-finance.service'; import { DataProviderService } from './data-provider.service'; @Module({ imports: [ ConfigurationModule, CryptocurrencyModule, + DataEnhancerModule, + MarketDataModule, PrismaModule, + PropertyModule, + RedisCacheModule, SymbolProfileModule ], providers: [ AlphaVantageService, + CoinGeckoService, DataProviderService, EodHistoricalDataService, - GhostfolioScraperApiService, + FinancialModelingPrepService, GoogleSheetsService, ManualService, RapidApiService, @@ -32,8 +43,9 @@ import { DataProviderService } from './data-provider.service'; { inject: [ AlphaVantageService, + CoinGeckoService, EodHistoricalDataService, - GhostfolioScraperApiService, + FinancialModelingPrepService, GoogleSheetsService, ManualService, RapidApiService, @@ -42,23 +54,26 @@ import { DataProviderService } from './data-provider.service'; provide: 'DataProviderInterfaces', useFactory: ( alphaVantageService, + coinGeckoService, eodHistoricalDataService, - ghostfolioScraperApiService, + financialModelingPrepService, googleSheetsService, manualService, rapidApiService, yahooFinanceService ) => [ alphaVantageService, + coinGeckoService, eodHistoricalDataService, - ghostfolioScraperApiService, + financialModelingPrepService, googleSheetsService, manualService, rapidApiService, yahooFinanceService ] - } + }, + YahooFinanceDataEnhancerService ], - exports: [DataProviderService, GhostfolioScraperApiService] + exports: [DataProviderService, YahooFinanceService] }) export class DataProviderModule {} 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 7f10dc3a0..b4f4e10b5 100644 --- a/apps/api/src/services/data-provider/data-provider.service.ts +++ b/apps/api/src/services/data-provider/data-provider.service.ts @@ -1,27 +1,130 @@ +import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service'; import { LookupItem } from '@ghostfolio/api/app/symbol/interfaces/lookup-item.interface'; -import { ConfigurationService } from '@ghostfolio/api/services/configuration.service'; +import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { DataProviderInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; import { IDataGatheringItem, IDataProviderHistoricalResponse, IDataProviderResponse } from '@ghostfolio/api/services/interfaces/interfaces'; -import { PrismaService } from '@ghostfolio/api/services/prisma.service'; -import { DATE_FORMAT } from '@ghostfolio/common/helper'; -import { Granularity } from '@ghostfolio/common/types'; +import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; +import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; +import { PropertyService } from '@ghostfolio/api/services/property/property.service'; +import { PROPERTY_DATA_SOURCE_MAPPING } from '@ghostfolio/common/config'; +import { DATE_FORMAT, getStartOfUtcDate } from '@ghostfolio/common/helper'; +import type { Granularity, UserWithSettings } from '@ghostfolio/common/types'; import { Inject, Injectable, Logger } from '@nestjs/common'; import { DataSource, MarketData, SymbolProfile } from '@prisma/client'; import { format, isValid } from 'date-fns'; -import { groupBy, isEmpty } from 'lodash'; +import { groupBy, isEmpty, isNumber } from 'lodash'; @Injectable() export class DataProviderService { + private dataProviderMapping: { [dataProviderName: string]: string }; + public constructor( private readonly configurationService: ConfigurationService, @Inject('DataProviderInterfaces') private readonly dataProviderInterfaces: DataProviderInterface[], - private readonly prismaService: PrismaService - ) {} + private readonly marketDataService: MarketDataService, + private readonly prismaService: PrismaService, + private readonly propertyService: PropertyService, + private readonly redisCacheService: RedisCacheService + ) { + this.initialize(); + } + + public async initialize() { + this.dataProviderMapping = + ((await this.propertyService.getByKey(PROPERTY_DATA_SOURCE_MAPPING)) as { + [dataProviderName: string]: string; + }) ?? {}; + } + + public async checkQuote(dataSource: DataSource) { + const dataProvider = this.getDataProvider(dataSource); + const symbol = dataProvider.getTestSymbol(); + + const quotes = await this.getQuotes([ + { + dataSource, + symbol + } + ]); + + if (quotes[symbol]?.marketPrice > 0) { + return true; + } + + return false; + } + + public async getAssetProfiles(items: IDataGatheringItem[]): Promise<{ + [symbol: string]: Partial; + }> { + const response: { + [symbol: string]: Partial; + } = {}; + + const itemsGroupedByDataSource = groupBy(items, (item) => item.dataSource); + + const promises = []; + + for (const [dataSource, dataGatheringItems] of Object.entries( + itemsGroupedByDataSource + )) { + const symbols = dataGatheringItems.map((dataGatheringItem) => { + return dataGatheringItem.symbol; + }); + + for (const symbol of symbols) { + const promise = Promise.resolve( + this.getDataProvider(DataSource[dataSource]).getAssetProfile(symbol) + ); + + promises.push( + promise.then((symbolProfile) => { + response[symbol] = symbolProfile; + }) + ); + } + } + + await Promise.all(promises); + + return response; + } + + public getDataSourceForExchangeRates(): DataSource { + return DataSource[ + this.configurationService.get('DATA_SOURCE_EXCHANGE_RATES') + ]; + } + + public getDataSourceForImport(): DataSource { + return DataSource[this.configurationService.get('DATA_SOURCE_IMPORT')]; + } + + public async getDividends({ + dataSource, + from, + granularity = 'day', + symbol, + to + }: { + dataSource: DataSource; + from: Date; + granularity: Granularity; + symbol: string; + to: Date; + }) { + return this.getDataProvider(DataSource[dataSource]).getDividends({ + from, + granularity, + symbol, + to + }); + } public async getHistorical( aItems: IDataGatheringItem[], @@ -114,65 +217,63 @@ export class DataProviderService { } } - const allData = await Promise.all(promises); - for (const { data, symbol } of allData) { - result[symbol] = data; + try { + const allData = await Promise.all(promises); + for (const { data, symbol } of allData) { + result[symbol] = data; + } + } catch (error) { + Logger.error(error, 'DataProviderService'); } return result; } - public getPrimaryDataSource(): DataSource { - return DataSource[this.configurationService.get('DATA_SOURCE_PRIMARY')]; - } - - public async getAssetProfiles(items: IDataGatheringItem[]): Promise<{ - [symbol: string]: Partial; + public async getQuotes(items: IDataGatheringItem[]): Promise<{ + [symbol: string]: IDataProviderResponse; }> { const response: { - [symbol: string]: Partial; + [symbol: string]: IDataProviderResponse; } = {}; + const startTimeTotal = performance.now(); - const itemsGroupedByDataSource = groupBy(items, (item) => item.dataSource); + // Get items from cache + const itemsToFetch: IDataGatheringItem[] = []; - const promises = []; - - for (const [dataSource, dataGatheringItems] of Object.entries( - itemsGroupedByDataSource - )) { - const symbols = dataGatheringItems.map((dataGatheringItem) => { - return dataGatheringItem.symbol; - }); + for (const { dataSource, symbol } of items) { + const quoteString = await this.redisCacheService.get( + this.redisCacheService.getQuoteKey({ dataSource, symbol }) + ); - for (const symbol of symbols) { - const promise = Promise.resolve( - this.getDataProvider(DataSource[dataSource]).getAssetProfile(symbol) - ); + if (quoteString) { + try { + const cachedDataProviderResponse = JSON.parse(quoteString); + response[symbol] = cachedDataProviderResponse; + } catch {} + } - promises.push( - promise.then((symbolProfile) => { - response[symbol] = symbolProfile; - }) - ); + if (!quoteString) { + itemsToFetch.push({ dataSource, symbol }); } } - await Promise.all(promises); - - return response; - } + const numberOfItemsInCache = Object.keys(response)?.length; - public async getQuotes(items: IDataGatheringItem[]): Promise<{ - [symbol: string]: IDataProviderResponse; - }> { - const response: { - [symbol: string]: IDataProviderResponse; - } = {}; - const startTimeTotal = performance.now(); + if (numberOfItemsInCache) { + Logger.debug( + `Fetched ${numberOfItemsInCache} quote${ + numberOfItemsInCache > 1 ? 's' : '' + } from cache in ${((performance.now() - startTimeTotal) / 1000).toFixed( + 3 + )} seconds` + ); + } - const itemsGroupedByDataSource = groupBy(items, (item) => item.dataSource); + const itemsGroupedByDataSource = groupBy(itemsToFetch, ({ dataSource }) => { + return dataSource; + }); - const promises = []; + const promises: Promise[] = []; for (const [dataSource, dataGatheringItems] of Object.entries( itemsGroupedByDataSource @@ -201,19 +302,51 @@ export class DataProviderService { const promise = Promise.resolve(dataProvider.getQuotes(symbolsChunk)); promises.push( - promise.then((result) => { + promise.then(async (result) => { for (const [symbol, dataProviderResponse] of Object.entries( result )) { response[symbol] = dataProviderResponse; + + this.redisCacheService.set( + this.redisCacheService.getQuoteKey({ + dataSource: DataSource[dataSource], + symbol + }), + JSON.stringify(dataProviderResponse), + this.configurationService.get('CACHE_QUOTES_TTL') + ); } Logger.debug( - `Fetched ${symbolsChunk.length} quotes from ${dataSource} in ${( + `Fetched ${symbolsChunk.length} quote${ + symbolsChunk.length > 1 ? 's' : '' + } from ${dataSource} in ${( (performance.now() - startTimeDataSource) / 1000 ).toFixed(3)} seconds` ); + + try { + this.marketDataService.updateMany({ + data: Object.keys(response) + .filter((symbol) => { + return ( + isNumber(response[symbol].marketPrice) && + response[symbol].marketPrice > 0 + ); + }) + .map((symbol) => { + return { + symbol, + dataSource: response[symbol].dataSource, + date: getStartOfUtcDate(new Date()), + marketPrice: response[symbol].marketPrice, + state: 'INTRADAY' + }; + }) + }); + } catch {} }) ); } @@ -223,7 +356,7 @@ export class DataProviderService { Logger.debug('------------------------------------------------'); Logger.debug( - `Fetched ${items.length} quotes in ${( + `Fetched ${items.length} quote${items.length > 1 ? 's' : ''} in ${( (performance.now() - startTimeTotal) / 1000 ).toFixed(3)} seconds` @@ -233,26 +366,58 @@ export class DataProviderService { return response; } - public async search(aQuery: string): Promise<{ items: LookupItem[] }> { + public async search({ + includeIndices = false, + query, + user + }: { + includeIndices?: boolean; + query: string; + user: UserWithSettings; + }): Promise<{ items: LookupItem[] }> { const promises: Promise<{ items: LookupItem[] }>[] = []; let lookupItems: LookupItem[] = []; - for (const dataSource of this.configurationService.get('DATA_SOURCES')) { + if (query?.length < 2) { + return { items: lookupItems }; + } + + let dataSources = this.configurationService.get('DATA_SOURCES'); + + if ( + this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION') && + user.subscription.type === 'Basic' + ) { + dataSources = dataSources.filter((dataSource) => { + return !this.isPremiumDataSource(DataSource[dataSource]); + }); + } + + for (const dataSource of dataSources) { promises.push( - this.getDataProvider(DataSource[dataSource]).search(aQuery) + this.getDataProvider(DataSource[dataSource]).search({ + includeIndices, + query + }) ); } const searchResults = await Promise.all(promises); - searchResults.forEach((searchResult) => { - lookupItems = lookupItems.concat(searchResult.items); + searchResults.forEach(({ items }) => { + if (items?.length > 0) { + lookupItems = lookupItems.concat(items); + } }); - const filteredItems = lookupItems.filter((lookupItem) => { - // Only allow symbols with supported currency - return lookupItem.currency ? true : false; - }); + const filteredItems = lookupItems + .filter((lookupItem) => { + // Only allow symbols with supported currency + return lookupItem.currency ? true : false; + }) + .sort(({ name: name1 }, { name: name2 }) => { + return name1?.toLowerCase().localeCompare(name2?.toLowerCase()); + }); return { items: filteredItems @@ -261,6 +426,21 @@ export class DataProviderService { private getDataProvider(providerName: DataSource) { for (const dataProviderInterface of this.dataProviderInterfaces) { + if (this.dataProviderMapping[dataProviderInterface.getName()]) { + const mappedDataProviderInterface = this.dataProviderInterfaces.find( + (currentDataProviderInterface) => { + return ( + currentDataProviderInterface.getName() === + this.dataProviderMapping[dataProviderInterface.getName()] + ); + } + ); + + if (mappedDataProviderInterface) { + return mappedDataProviderInterface; + } + } + if (dataProviderInterface.getName() === providerName) { return dataProviderInterface; } @@ -268,4 +448,12 @@ export class DataProviderService { throw new Error('No data provider has been found.'); } + + private isPremiumDataSource(aDataSource: DataSource) { + const premiumDataSources: DataSource[] = [ + DataSource.EOD_HISTORICAL_DATA, + DataSource.FINANCIAL_MODELING_PREP + ]; + return premiumDataSources.includes(aDataSource); + } } 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 c87c6ec3e..961f960da 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 @@ -1,28 +1,34 @@ import { LookupItem } from '@ghostfolio/api/app/symbol/interfaces/lookup-item.interface'; -import { ConfigurationService } from '@ghostfolio/api/services/configuration.service'; +import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { DataProviderInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; import { IDataProviderHistoricalResponse, IDataProviderResponse } from '@ghostfolio/api/services/interfaces/interfaces'; -import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile.service'; -import { DATE_FORMAT } from '@ghostfolio/common/helper'; +import { DATE_FORMAT, isCurrency } from '@ghostfolio/common/helper'; import { Granularity } from '@ghostfolio/common/types'; import { Injectable, Logger } from '@nestjs/common'; -import { DataSource, SymbolProfile } from '@prisma/client'; +import { + AssetClass, + AssetSubClass, + DataSource, + SymbolProfile +} from '@prisma/client'; import bent from 'bent'; -import { format } from 'date-fns'; +import Big from 'big.js'; +import { format, isToday } from 'date-fns'; @Injectable() export class EodHistoricalDataService implements DataProviderInterface { private apiKey: string; + private baseCurrency: string; private readonly URL = 'https://eodhistoricaldata.com/api'; public constructor( - private readonly configurationService: ConfigurationService, - private readonly symbolProfileService: SymbolProfileService + private readonly configurationService: ConfigurationService ) { this.apiKey = this.configurationService.get('EOD_HISTORICAL_DATA_API_KEY'); + this.baseCurrency = this.configurationService.get('BASE_CURRENCY'); } public canHandle(symbol: string) { @@ -32,11 +38,33 @@ export class EodHistoricalDataService implements DataProviderInterface { public async getAssetProfile( aSymbol: string ): Promise> { + const [searchResult] = await this.getSearchResult(aSymbol); + return { - dataSource: this.getName() + assetClass: searchResult?.assetClass, + assetSubClass: searchResult?.assetSubClass, + currency: this.convertCurrency(searchResult?.currency), + dataSource: this.getName(), + isin: searchResult?.isin, + name: searchResult?.name, + symbol: aSymbol }; } + public async getDividends({ + from, + granularity = 'day', + symbol, + to + }: { + from: Date; + granularity: Granularity; + symbol: string; + to: Date; + }) { + return {}; + } + public async getHistorical( aSymbol: string, aGranularity: Granularity = 'day', @@ -45,9 +73,11 @@ export class EodHistoricalDataService implements DataProviderInterface { ): Promise<{ [symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; }> { + const symbol = this.convertToEodSymbol(aSymbol); + try { const get = bent( - `${this.URL}/eod/${aSymbol}?api_token=${ + `${this.URL}/eod/${symbol}?api_token=${ this.apiKey }&fmt=json&from=${format(from, DATE_FORMAT)}&to=${format( to, @@ -62,14 +92,17 @@ export class EodHistoricalDataService implements DataProviderInterface { return response.reduce( (result, historicalItem, index, array) => { - result[aSymbol][historicalItem.date] = { - marketPrice: historicalItem.close, + result[this.convertFromEodSymbol(symbol)][historicalItem.date] = { + marketPrice: this.getConvertedValue({ + symbol: aSymbol, + value: historicalItem.close + }), performance: historicalItem.open - historicalItem.close }; return result; }, - { [aSymbol]: {} } + { [this.convertFromEodSymbol(symbol)]: {} } ); } catch (error) { throw new Error( @@ -94,54 +127,273 @@ export class EodHistoricalDataService implements DataProviderInterface { public async getQuotes( aSymbols: string[] ): Promise<{ [symbol: string]: IDataProviderResponse }> { - if (aSymbols.length <= 0) { + const symbols = aSymbols.map((symbol) => { + return this.convertToEodSymbol(symbol); + }); + + if (symbols.length <= 0) { return {}; } try { const get = bent( - `${this.URL}/real-time/${aSymbols[0]}?api_token=${ + `${this.URL}/real-time/${symbols[0]}?api_token=${ this.apiKey - }&fmt=json&s=${aSymbols.join(',')}`, + }&fmt=json&s=${symbols.join(',')}`, 'GET', 'json', 200 ); - const [response, symbolProfiles] = await Promise.all([ - get(), - this.symbolProfileService.getSymbolProfiles( - aSymbols.map((symbol) => { + const realTimeResponse = await get(); + + const quotes = + symbols.length === 1 ? [realTimeResponse] : realTimeResponse; + + const searchResponse = await Promise.all( + symbols + .filter((symbol) => { + return !symbol.endsWith('.FOREX'); + }) + .map((symbol) => { + return this.search({ query: symbol }); + }) + ); + + const lookupItems = searchResponse.flat().map(({ items }) => { + return items[0]; + }); + + const response = quotes.reduce( + ( + result: { [symbol: string]: IDataProviderResponse }, + { close, code, timestamp } + ) => { + const currency = lookupItems.find((lookupItem) => { + return lookupItem.symbol === code; + })?.currency; + + result[this.convertFromEodSymbol(code)] = { + currency: currency ?? this.baseCurrency, + dataSource: DataSource.EOD_HISTORICAL_DATA, + marketPrice: close, + marketState: isToday(new Date(timestamp * 1000)) ? 'open' : 'closed' + }; + + return result; + }, + {} + ); + + if (response[`${this.baseCurrency}GBP`]) { + response[`${this.baseCurrency}GBp`] = { + ...response[`${this.baseCurrency}GBP`], + currency: `${this.baseCurrency}GBp`, + marketPrice: this.getConvertedValue({ + symbol: `${this.baseCurrency}GBp`, + value: response[`${this.baseCurrency}GBP`].marketPrice + }) + }; + } + + if (response[`${this.baseCurrency}ILS`]) { + response[`${this.baseCurrency}ILA`] = { + ...response[`${this.baseCurrency}ILS`], + currency: `${this.baseCurrency}ILA`, + marketPrice: this.getConvertedValue({ + symbol: `${this.baseCurrency}ILA`, + value: response[`${this.baseCurrency}ILS`].marketPrice + }) + }; + } + + return response; + } catch (error) { + Logger.error(error, 'EodHistoricalDataService'); + } + + return {}; + } + + public getTestSymbol() { + return 'AAPL.US'; + } + + public async search({ + includeIndices = false, + query + }: { + includeIndices?: boolean; + query: string; + }): Promise<{ items: LookupItem[] }> { + const searchResult = await this.getSearchResult(query); + + return { + items: searchResult + .filter(({ symbol }) => { + return !symbol.endsWith('.FOREX'); + }) + .map( + ({ + assetClass, + assetSubClass, + currency, + dataSource, + name, + symbol + }) => { return { + assetClass, + assetSubClass, + dataSource, + name, symbol, - dataSource: DataSource.EOD_HISTORICAL_DATA + currency: this.convertCurrency(currency) }; - }) + } ) - ]); - - const quotes = aSymbols.length === 1 ? [response] : response; - - return quotes.reduce((result, item, index, array) => { - result[item.code] = { - currency: symbolProfiles.find((symbolProfile) => { - return symbolProfile.symbol === item.code; - })?.currency, - dataSource: DataSource.EOD_HISTORICAL_DATA, - marketPrice: item.close, - marketState: 'delayed' - }; + }; + } + + private convertCurrency(aCurrency: string) { + let currency = aCurrency; + + if (currency === 'GBX') { + currency = 'GBp'; + } + + return currency; + } + + private convertFromEodSymbol(aEodSymbol: string) { + let symbol = aEodSymbol; + + if (symbol.endsWith('.FOREX')) { + symbol = symbol.replace('GBX', 'GBp'); + symbol = symbol.replace('.FOREX', ''); + symbol = `${this.baseCurrency}${symbol}`; + } - return result; - }, {}); + return symbol; + } + + /** + * Converts a symbol to a EOD symbol + * + * Currency: USDCHF -> CHF.FOREX + */ + private convertToEodSymbol(aSymbol: string) { + if ( + aSymbol.startsWith(this.baseCurrency) && + aSymbol.length > this.baseCurrency.length + ) { + if ( + isCurrency( + aSymbol.substring(0, aSymbol.length - this.baseCurrency.length) + ) + ) { + return `${aSymbol + .replace('GBp', 'GBX') + .replace(this.baseCurrency, '')}.FOREX`; + } + } + + return aSymbol; + } + + private getConvertedValue({ + symbol, + value + }: { + symbol: string; + value: number; + }) { + if (symbol === `${this.baseCurrency}GBp`) { + // Convert GPB to GBp (pence) + return new Big(value).mul(100).toNumber(); + } else if (symbol === `${this.baseCurrency}ILA`) { + // Convert ILS to ILA + return new Big(value).mul(100).toNumber(); + } + + return value; + } + + private async getSearchResult(aQuery: string): Promise< + (LookupItem & { + assetClass: AssetClass; + assetSubClass: AssetSubClass; + isin: string; + })[] + > { + let searchResult = []; + + try { + const get = bent( + `${this.URL}/search/${aQuery}?api_token=${this.apiKey}`, + 'GET', + 'json', + 200 + ); + const response = await get(); + + searchResult = response.map( + ({ Code, Currency, Exchange, ISIN: isin, Name: name, Type }) => { + const { assetClass, assetSubClass } = this.parseAssetClass({ + Exchange, + Type + }); + + return { + assetClass, + assetSubClass, + isin, + name, + currency: this.convertCurrency(Currency), + dataSource: this.getName(), + symbol: `${Code}.${Exchange}` + }; + } + ); } catch (error) { Logger.error(error, 'EodHistoricalDataService'); } - return {}; + return searchResult; } - public async search(aQuery: string): Promise<{ items: LookupItem[] }> { - return { items: [] }; + private parseAssetClass({ + Exchange, + Type + }: { + Exchange: string; + Type: string; + }): { + assetClass: AssetClass; + assetSubClass: AssetSubClass; + } { + let assetClass: AssetClass; + let assetSubClass: AssetSubClass; + + switch (Type?.toLowerCase()) { + case 'common stock': + assetClass = AssetClass.EQUITY; + assetSubClass = AssetSubClass.STOCK; + break; + case 'currency': + assetClass = AssetClass.CASH; + + if (Exchange?.toLowerCase() === 'cc') { + assetSubClass = AssetSubClass.CRYPTOCURRENCY; + } + + break; + case 'etf': + assetClass = AssetClass.EQUITY; + assetSubClass = AssetSubClass.ETF; + break; + } + + return { assetClass, assetSubClass }; } } 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 new file mode 100644 index 000000000..ed65c3f65 --- /dev/null +++ b/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts @@ -0,0 +1,187 @@ +import { LookupItem } from '@ghostfolio/api/app/symbol/interfaces/lookup-item.interface'; +import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; +import { DataProviderInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; +import { + IDataProviderHistoricalResponse, + IDataProviderResponse +} from '@ghostfolio/api/services/interfaces/interfaces'; +import { DATE_FORMAT, parseDate } from '@ghostfolio/common/helper'; +import { DataProviderInfo } from '@ghostfolio/common/interfaces'; +import { Granularity } from '@ghostfolio/common/types'; +import { Injectable, Logger } from '@nestjs/common'; +import { DataSource, SymbolProfile } from '@prisma/client'; +import bent from 'bent'; +import { format, isAfter, isBefore, isSameDay } from 'date-fns'; + +@Injectable() +export class FinancialModelingPrepService implements DataProviderInterface { + private apiKey: string; + private baseCurrency: string; + private readonly URL = 'https://financialmodelingprep.com/api/v3'; + + public constructor( + private readonly configurationService: ConfigurationService + ) { + this.apiKey = this.configurationService.get( + 'FINANCIAL_MODELING_PREP_API_KEY' + ); + this.baseCurrency = this.configurationService.get('BASE_CURRENCY'); + } + + public canHandle(symbol: string) { + return true; + } + + public async getAssetProfile( + aSymbol: string + ): Promise> { + return { + dataSource: this.getName(), + symbol: aSymbol + }; + } + + public async getDividends({ + from, + granularity = 'day', + symbol, + to + }: { + from: Date; + granularity: Granularity; + symbol: string; + to: Date; + }) { + return {}; + } + + public async getHistorical( + aSymbol: string, + aGranularity: Granularity = 'day', + from: Date, + to: Date + ): Promise<{ + [symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; + }> { + try { + const get = bent( + `${this.URL}/historical-price-full/${aSymbol}?apikey=${this.apiKey}`, + 'GET', + 'json', + 200 + ); + const { historical } = await get(); + + const result: { + [symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; + } = { + [aSymbol]: {} + }; + + for (const { close, date } of historical) { + if ( + (isSameDay(parseDate(date), from) || + isAfter(parseDate(date), from)) && + isBefore(parseDate(date), to) + ) { + result[aSymbol][date] = { + marketPrice: close + }; + } + } + + return result; + } catch (error) { + throw new Error( + `Could not get historical market data for ${aSymbol} (${this.getName()}) from ${format( + from, + DATE_FORMAT + )} to ${format(to, DATE_FORMAT)}: [${error.name}] ${error.message}` + ); + } + } + + public getName(): DataSource { + return DataSource.FINANCIAL_MODELING_PREP; + } + + public async getQuotes( + aSymbols: string[] + ): Promise<{ [symbol: string]: IDataProviderResponse }> { + const results: { [symbol: string]: IDataProviderResponse } = {}; + + if (aSymbols.length <= 0) { + return {}; + } + + try { + const get = bent( + `${this.URL}/quote/${aSymbols.join(',')}?apikey=${this.apiKey}`, + 'GET', + 'json', + 200 + ); + const response = await get(); + + for (const { price, symbol } of response) { + results[symbol] = { + currency: this.baseCurrency, + dataProviderInfo: this.getDataProviderInfo(), + dataSource: DataSource.FINANCIAL_MODELING_PREP, + marketPrice: price, + marketState: 'delayed' + }; + } + } catch (error) { + Logger.error(error, 'FinancialModelingPrepService'); + } + + return results; + } + + public getTestSymbol() { + return 'AAPL'; + } + + public async search({ + includeIndices = false, + query + }: { + includeIndices?: boolean; + query: string; + }): Promise<{ items: LookupItem[] }> { + let items: LookupItem[] = []; + + try { + const get = bent( + `${this.URL}/search?query=${query}&apikey=${this.apiKey}`, + 'GET', + 'json', + 200 + ); + const result = await get(); + + items = result.map(({ currency, name, symbol }) => { + return { + // TODO: Add assetClass + // TODO: Add assetSubClass + currency, + name, + symbol, + dataSource: this.getName() + }; + }); + } catch (error) { + Logger.error(error, 'FinancialModelingPrepService'); + } + + return { items }; + } + + private getDataProviderInfo(): DataProviderInfo { + return { + name: 'Financial Modeling Prep', + url: 'https://financialmodelingprep.com/developer/docs' + }; + } +} diff --git a/apps/api/src/services/data-provider/ghostfolio-scraper-api/ghostfolio-scraper-api.service.ts b/apps/api/src/services/data-provider/ghostfolio-scraper-api/ghostfolio-scraper-api.service.ts deleted file mode 100644 index 8da34410f..000000000 --- a/apps/api/src/services/data-provider/ghostfolio-scraper-api/ghostfolio-scraper-api.service.ts +++ /dev/null @@ -1,180 +0,0 @@ -import { LookupItem } from '@ghostfolio/api/app/symbol/interfaces/lookup-item.interface'; -import { DataProviderInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; -import { - IDataProviderHistoricalResponse, - IDataProviderResponse -} from '@ghostfolio/api/services/interfaces/interfaces'; -import { PrismaService } from '@ghostfolio/api/services/prisma.service'; -import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile.service'; -import { - DATE_FORMAT, - extractNumberFromString, - getYesterday -} from '@ghostfolio/common/helper'; -import { Granularity } from '@ghostfolio/common/types'; -import { Injectable, Logger } from '@nestjs/common'; -import { DataSource, SymbolProfile } from '@prisma/client'; -import bent from 'bent'; -import * as cheerio from 'cheerio'; -import { addDays, format, isBefore } from 'date-fns'; - -@Injectable() -export class GhostfolioScraperApiService implements DataProviderInterface { - public constructor( - private readonly prismaService: PrismaService, - private readonly symbolProfileService: SymbolProfileService - ) {} - - public canHandle(symbol: string) { - return true; - } - - public async getAssetProfile( - aSymbol: string - ): Promise> { - return { - dataSource: this.getName() - }; - } - - public async getHistorical( - aSymbol: string, - aGranularity: Granularity = 'day', - from: Date, - to: Date - ): Promise<{ - [symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; - }> { - try { - const symbol = aSymbol; - - const [symbolProfile] = - await this.symbolProfileService.getSymbolProfilesBySymbols([symbol]); - const { defaultMarketPrice, selector, url } = - symbolProfile.scraperConfiguration; - - if (defaultMarketPrice) { - const historical: { - [symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; - } = { - [symbol]: {} - }; - let date = from; - - while (isBefore(date, to)) { - historical[symbol][format(date, DATE_FORMAT)] = { - marketPrice: defaultMarketPrice - }; - - date = addDays(date, 1); - } - - return historical; - } else if (selector === undefined || url === undefined) { - return {}; - } - - const get = bent(url, 'GET', 'string', 200, {}); - - const html = await get(); - const $ = cheerio.load(html); - - const value = extractNumberFromString($(selector).text()); - - return { - [symbol]: { - [format(getYesterday(), DATE_FORMAT)]: { - marketPrice: value - } - } - }; - } catch (error) { - throw new Error( - `Could not get historical market data for ${aSymbol} (${this.getName()}) from ${format( - from, - DATE_FORMAT - )} to ${format(to, DATE_FORMAT)}: [${error.name}] ${error.message}` - ); - } - } - - public getName(): DataSource { - return DataSource.GHOSTFOLIO; - } - - public async getQuotes( - aSymbols: string[] - ): Promise<{ [symbol: string]: IDataProviderResponse }> { - const response: { [symbol: string]: IDataProviderResponse } = {}; - - if (aSymbols.length <= 0) { - return response; - } - - try { - const symbolProfiles = - await this.symbolProfileService.getSymbolProfilesBySymbols(aSymbols); - - const marketData = await this.prismaService.marketData.findMany({ - distinct: ['symbol'], - orderBy: { - date: 'desc' - }, - take: aSymbols.length, - where: { - symbol: { - in: aSymbols - } - } - }); - - for (const symbolProfile of symbolProfiles) { - response[symbolProfile.symbol] = { - currency: symbolProfile.currency, - dataSource: this.getName(), - marketPrice: marketData.find((marketDataItem) => { - return marketDataItem.symbol === symbolProfile.symbol; - }).marketPrice, - marketState: 'delayed' - }; - } - - return response; - } catch (error) { - Logger.error(error, 'GhostfolioScraperApiService'); - } - - return {}; - } - - public async search(aQuery: string): Promise<{ items: LookupItem[] }> { - const items = await this.prismaService.symbolProfile.findMany({ - select: { - currency: true, - dataSource: true, - name: true, - symbol: true - }, - where: { - OR: [ - { - dataSource: this.getName(), - name: { - mode: 'insensitive', - startsWith: aQuery - } - }, - { - dataSource: this.getName(), - symbol: { - mode: 'insensitive', - startsWith: aQuery - } - } - ] - } - }); - - return { items }; - } -} 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 cc6af5241..f4b592371 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 @@ -1,12 +1,12 @@ import { LookupItem } from '@ghostfolio/api/app/symbol/interfaces/lookup-item.interface'; -import { ConfigurationService } from '@ghostfolio/api/services/configuration.service'; +import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { DataProviderInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; import { IDataProviderHistoricalResponse, IDataProviderResponse } from '@ghostfolio/api/services/interfaces/interfaces'; -import { PrismaService } from '@ghostfolio/api/services/prisma.service'; -import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile.service'; +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 { Granularity } from '@ghostfolio/common/types'; import { Injectable, Logger } from '@nestjs/common'; @@ -30,10 +30,25 @@ export class GoogleSheetsService implements DataProviderInterface { aSymbol: string ): Promise> { return { - dataSource: this.getName() + dataSource: this.getName(), + symbol: aSymbol }; } + public async getDividends({ + from, + granularity = 'day', + symbol, + to + }: { + from: Date; + granularity: Granularity; + symbol: string; + to: Date; + }) { + return {}; + } + public async getHistorical( aSymbol: string, aGranularity: Granularity = 'day', @@ -94,8 +109,14 @@ export class GoogleSheetsService implements DataProviderInterface { try { const response: { [symbol: string]: IDataProviderResponse } = {}; - const symbolProfiles = - await this.symbolProfileService.getSymbolProfilesBySymbols(aSymbols); + const symbolProfiles = await this.symbolProfileService.getSymbolProfiles( + aSymbols.map((symbol) => { + return { + symbol, + dataSource: this.getName() + }; + }) + ); const sheet = await this.getSheet({ sheetId: this.configurationService.get('GOOGLE_SHEETS_ID'), @@ -128,9 +149,21 @@ export class GoogleSheetsService implements DataProviderInterface { return {}; } - public async search(aQuery: string): Promise<{ items: LookupItem[] }> { + public getTestSymbol() { + return 'INDEXSP:.INX'; + } + + public async search({ + includeIndices = false, + query + }: { + includeIndices?: boolean; + query: string; + }): Promise<{ items: LookupItem[] }> { const items = await this.prismaService.symbolProfile.findMany({ select: { + assetClass: true, + assetSubClass: true, currency: true, dataSource: true, name: true, @@ -142,14 +175,14 @@ export class GoogleSheetsService implements DataProviderInterface { dataSource: this.getName(), name: { mode: 'insensitive', - startsWith: aQuery + startsWith: query } }, { dataSource: this.getName(), symbol: { mode: 'insensitive', - startsWith: aQuery + startsWith: query } } ] 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 6719f3099..2a16cc24c 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 @@ -11,6 +11,18 @@ export interface DataProviderInterface { getAssetProfile(aSymbol: string): Promise>; + getDividends({ + from, + granularity, + symbol, + to + }: { + from: Date; + granularity: Granularity; + symbol: string; + to: Date; + }): Promise<{ [date: string]: IDataProviderHistoricalResponse }>; + getHistorical( aSymbol: string, aGranularity: Granularity, @@ -28,5 +40,13 @@ export interface DataProviderInterface { aSymbols: string[] ): Promise<{ [symbol: string]: IDataProviderResponse }>; - search(aQuery: string): Promise<{ items: LookupItem[] }>; + getTestSymbol(): string; + + search({ + includeIndices, + query + }: { + includeIndices?: boolean; + query: string; + }): Promise<{ items: LookupItem[] }>; } 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 edcdd2cde..7b3933532 100644 --- a/apps/api/src/services/data-provider/manual/manual.service.ts +++ b/apps/api/src/services/data-provider/manual/manual.service.ts @@ -4,26 +4,55 @@ import { IDataProviderHistoricalResponse, IDataProviderResponse } from '@ghostfolio/api/services/interfaces/interfaces'; +import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; +import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; +import { + DATE_FORMAT, + extractNumberFromString, + getYesterday +} from '@ghostfolio/common/helper'; import { Granularity } from '@ghostfolio/common/types'; -import { Injectable } from '@nestjs/common'; +import { Injectable, Logger } from '@nestjs/common'; import { DataSource, SymbolProfile } from '@prisma/client'; +import bent from 'bent'; +import * as cheerio from 'cheerio'; +import { isUUID } from 'class-validator'; +import { addDays, format, isBefore } from 'date-fns'; @Injectable() export class ManualService implements DataProviderInterface { - public constructor() {} + public constructor( + private readonly prismaService: PrismaService, + private readonly symbolProfileService: SymbolProfileService + ) {} public canHandle(symbol: string) { - return false; + return true; } public async getAssetProfile( aSymbol: string ): Promise> { return { - dataSource: this.getName() + dataSource: this.getName(), + symbol: aSymbol }; } + public async getDividends({ + from, + granularity = 'day', + symbol, + to + }: { + from: Date; + granularity: Granularity; + symbol: string; + to: Date; + }) { + return {}; + } + public async getHistorical( aSymbol: string, aGranularity: Granularity = 'day', @@ -32,7 +61,62 @@ export class ManualService implements DataProviderInterface { ): Promise<{ [symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; }> { - return {}; + try { + const symbol = aSymbol; + + const [symbolProfile] = await this.symbolProfileService.getSymbolProfiles( + [{ symbol, dataSource: this.getName() }] + ); + const { + defaultMarketPrice, + headers = {}, + selector, + url + } = symbolProfile.scraperConfiguration ?? {}; + + if (defaultMarketPrice) { + const historical: { + [symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; + } = { + [symbol]: {} + }; + let date = from; + + while (isBefore(date, to)) { + historical[symbol][format(date, DATE_FORMAT)] = { + marketPrice: defaultMarketPrice + }; + + date = addDays(date, 1); + } + + return historical; + } else if (selector === undefined || url === undefined) { + return {}; + } + + const get = bent(url, 'GET', 'string', 200, headers); + + const html = await get(); + const $ = cheerio.load(html); + + const value = extractNumberFromString($(selector).text()); + + return { + [symbol]: { + [format(getYesterday(), DATE_FORMAT)]: { + marketPrice: value + } + } + }; + } catch (error) { + throw new Error( + `Could not get historical market data for ${aSymbol} (${this.getName()}) from ${format( + from, + DATE_FORMAT + )} to ${format(to, DATE_FORMAT)}: [${error.name}] ${error.message}` + ); + } } public getName(): DataSource { @@ -42,10 +126,96 @@ export class ManualService implements DataProviderInterface { public async getQuotes( aSymbols: string[] ): Promise<{ [symbol: string]: IDataProviderResponse }> { + const response: { [symbol: string]: IDataProviderResponse } = {}; + + if (aSymbols.length <= 0) { + return response; + } + + try { + const symbolProfiles = await this.symbolProfileService.getSymbolProfiles( + aSymbols.map((symbol) => { + return { symbol, dataSource: this.getName() }; + }) + ); + + const marketData = await this.prismaService.marketData.findMany({ + distinct: ['symbol'], + orderBy: { + date: 'desc' + }, + take: aSymbols.length, + where: { + symbol: { + in: aSymbols + } + } + }); + + for (const symbolProfile of symbolProfiles) { + response[symbolProfile.symbol] = { + currency: symbolProfile.currency, + dataSource: this.getName(), + marketPrice: marketData.find((marketDataItem) => { + return marketDataItem.symbol === symbolProfile.symbol; + })?.marketPrice, + marketState: 'delayed' + }; + } + + return response; + } catch (error) { + Logger.error(error, 'ManualService'); + } + return {}; } - public async search(aQuery: string): Promise<{ items: LookupItem[] }> { - return { items: [] }; + public getTestSymbol() { + return undefined; + } + + public async search({ + includeIndices = false, + query + }: { + includeIndices?: boolean; + query: string; + }): Promise<{ items: LookupItem[] }> { + let items = await this.prismaService.symbolProfile.findMany({ + select: { + assetClass: true, + assetSubClass: true, + currency: true, + dataSource: true, + name: true, + symbol: true + }, + where: { + OR: [ + { + dataSource: this.getName(), + name: { + mode: 'insensitive', + startsWith: query + } + }, + { + dataSource: this.getName(), + symbol: { + mode: 'insensitive', + startsWith: query + } + } + ] + } + }); + + items = items.filter(({ symbol }) => { + // Remove UUID symbols (activities of type ITEM) + return !isUUID(symbol); + }); + + return { items }; } } 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 5aace3d24..053391a8a 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 @@ -1,24 +1,22 @@ import { LookupItem } from '@ghostfolio/api/app/symbol/interfaces/lookup-item.interface'; -import { ConfigurationService } from '@ghostfolio/api/services/configuration.service'; +import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { DataProviderInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; import { IDataProviderHistoricalResponse, IDataProviderResponse } from '@ghostfolio/api/services/interfaces/interfaces'; -import { PrismaService } from '@ghostfolio/api/services/prisma.service'; import { ghostfolioFearAndGreedIndexSymbol } from '@ghostfolio/common/config'; -import { DATE_FORMAT, getToday, getYesterday } from '@ghostfolio/common/helper'; +import { DATE_FORMAT, getYesterday } from '@ghostfolio/common/helper'; import { Granularity } from '@ghostfolio/common/types'; import { Injectable, Logger } from '@nestjs/common'; import { DataSource, SymbolProfile } from '@prisma/client'; import bent from 'bent'; -import { format, subMonths, subWeeks, subYears } from 'date-fns'; +import { format } from 'date-fns'; @Injectable() export class RapidApiService implements DataProviderInterface { public constructor( - private readonly configurationService: ConfigurationService, - private readonly prismaService: PrismaService + private readonly configurationService: ConfigurationService ) {} public canHandle(symbol: string) { @@ -29,10 +27,25 @@ export class RapidApiService implements DataProviderInterface { aSymbol: string ): Promise> { return { - dataSource: this.getName() + dataSource: this.getName(), + symbol: aSymbol }; } + public async getDividends({ + from, + granularity = 'day', + symbol, + to + }: { + from: Date; + granularity: Granularity; + symbol: string; + to: Date; + }) { + return {}; + } + public async getHistorical( aSymbol: string, aGranularity: Granularity = 'day', @@ -47,41 +60,6 @@ export class RapidApiService implements DataProviderInterface { if (symbol === ghostfolioFearAndGreedIndexSymbol) { const fgi = await this.getFearAndGreedIndex(); - try { - // Rebuild historical data - // TODO: can be removed after all data from the last year has been gathered - // (introduced on 27.03.2021) - - await this.prismaService.marketData.create({ - data: { - symbol, - dataSource: this.getName(), - date: subWeeks(getToday(), 1), - marketPrice: fgi.oneWeekAgo.value - } - }); - - await this.prismaService.marketData.create({ - data: { - symbol, - dataSource: this.getName(), - date: subMonths(getToday(), 1), - marketPrice: fgi.oneMonthAgo.value - } - }); - - await this.prismaService.marketData.create({ - data: { - symbol, - dataSource: this.getName(), - date: subYears(getToday(), 1), - marketPrice: fgi.oneYearAgo.value - } - }); - - /////////////////////////////////////////////////////////////////////////// - } catch {} - return { [ghostfolioFearAndGreedIndexSymbol]: { [format(getYesterday(), DATE_FORMAT)]: { @@ -135,7 +113,17 @@ export class RapidApiService implements DataProviderInterface { return {}; } - public async search(aQuery: string): Promise<{ items: LookupItem[] }> { + public getTestSymbol() { + return undefined; + } + + public async search({ + includeIndices = false, + query + }: { + includeIndices?: boolean; + query: string; + }): Promise<{ items: LookupItem[] }> { return { items: [] }; } 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 64d318ac8..a525b4685 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 @@ -1,26 +1,20 @@ import { LookupItem } from '@ghostfolio/api/app/symbol/interfaces/lookup-item.interface'; -import { ConfigurationService } from '@ghostfolio/api/services/configuration.service'; +import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { CryptocurrencyService } from '@ghostfolio/api/services/cryptocurrency/cryptocurrency.service'; +import { YahooFinanceDataEnhancerService } from '@ghostfolio/api/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service'; import { DataProviderInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; import { IDataProviderHistoricalResponse, IDataProviderResponse } from '@ghostfolio/api/services/interfaces/interfaces'; -import { UNKNOWN_KEY } from '@ghostfolio/common/config'; -import { DATE_FORMAT, isCurrency } from '@ghostfolio/common/helper'; +import { DATE_FORMAT } from '@ghostfolio/common/helper'; import { Granularity } from '@ghostfolio/common/types'; import { Injectable, Logger } from '@nestjs/common'; -import { - AssetClass, - AssetSubClass, - DataSource, - SymbolProfile -} from '@prisma/client'; +import { DataSource, SymbolProfile } from '@prisma/client'; import Big from 'big.js'; -import { countries } from 'countries-list'; import { addDays, format, isSameDay } from 'date-fns'; import yahooFinance from 'yahoo-finance2'; -import type { Price } from 'yahoo-finance2/dist/esm/src/modules/quoteSummary-iface'; +import { Quote } from 'yahoo-finance2/dist/esm/src/modules/quote'; @Injectable() export class YahooFinanceService implements DataProviderInterface { @@ -28,7 +22,8 @@ export class YahooFinanceService implements DataProviderInterface { public constructor( private readonly configurationService: ConfigurationService, - private readonly cryptocurrencyService: CryptocurrencyService + private readonly cryptocurrencyService: CryptocurrencyService, + private readonly yahooFinanceDataEnhancerService: YahooFinanceDataEnhancerService ) { this.baseCurrency = this.configurationService.get('BASE_CURRENCY'); } @@ -37,131 +32,75 @@ export class YahooFinanceService implements DataProviderInterface { return true; } - public convertFromYahooFinanceSymbol(aYahooFinanceSymbol: string) { - let symbol = aYahooFinanceSymbol.replace( - new RegExp(`-${this.baseCurrency}$`), - this.baseCurrency - ); - - if (symbol.includes('=X') && !symbol.includes(this.baseCurrency)) { - symbol = `${this.baseCurrency}${symbol}`; - } - - return symbol.replace('=X', ''); - } - - /** - * Converts a symbol to a Yahoo Finance symbol - * - * Currency: USDCHF -> USDCHF=X - * Cryptocurrency: BTCUSD -> BTC-USD - * DOGEUSD -> DOGE-USD - */ - public convertToYahooFinanceSymbol(aSymbol: string) { - if ( - aSymbol.includes(this.baseCurrency) && - aSymbol.length > this.baseCurrency.length - ) { - if ( - isCurrency( - aSymbol.substring(0, aSymbol.length - this.baseCurrency.length) - ) - ) { - return `${aSymbol}=X`; - } else if ( - this.cryptocurrencyService.isCryptocurrency( - aSymbol.replace( - new RegExp(`-${this.baseCurrency}$`), - this.baseCurrency - ) - ) - ) { - // Add a dash before the last three characters - // BTCUSD -> BTC-USD - // DOGEUSD -> DOGE-USD - // SOL1USD -> SOL1-USD - return aSymbol.replace( - new RegExp(`-?${this.baseCurrency}$`), - `-${this.baseCurrency}` - ); - } - } - - return aSymbol; - } - public async getAssetProfile( aSymbol: string ): Promise> { - const response: Partial = {}; - - try { - const symbol = this.convertToYahooFinanceSymbol(aSymbol); - const assetProfile = await yahooFinance.quoteSummary(symbol, { - modules: ['price', 'summaryProfile', 'topHoldings'] - }); - - const { assetClass, assetSubClass } = this.parseAssetClass( - assetProfile.price - ); - - response.assetClass = assetClass; - response.assetSubClass = assetSubClass; - response.currency = assetProfile.price.currency; - response.dataSource = this.getName(); - response.name = this.formatName({ - longName: assetProfile.price.longName, - quoteType: assetProfile.price.quoteType, - shortName: assetProfile.price.shortName, - symbol: assetProfile.price.symbol - }); - response.symbol = aSymbol; + const { assetClass, assetSubClass, currency, name } = + await this.yahooFinanceDataEnhancerService.getAssetProfile(aSymbol); + + return { + assetClass, + assetSubClass, + currency, + name, + dataSource: this.getName(), + symbol: aSymbol + }; + } - if (assetSubClass === AssetSubClass.MUTUALFUND) { - response.sectors = []; + public async getDividends({ + from, + granularity = 'day', + symbol, + to + }: { + from: Date; + granularity: Granularity; + symbol: string; + to: Date; + }) { + if (isSameDay(from, to)) { + to = addDays(to, 1); + } - for (const sectorWeighting of assetProfile.topHoldings - ?.sectorWeightings ?? []) { - for (const [sector, weight] of Object.entries(sectorWeighting)) { - response.sectors.push({ weight, name: this.parseSector(sector) }); - } + try { + const historicalResult = await yahooFinance.historical( + this.yahooFinanceDataEnhancerService.convertToYahooFinanceSymbol( + symbol + ), + { + events: 'dividends', + interval: granularity === 'month' ? '1mo' : '1d', + period1: format(from, DATE_FORMAT), + period2: format(to, DATE_FORMAT) } - } else if ( - assetSubClass === AssetSubClass.STOCK && - assetProfile.summaryProfile?.country - ) { - // Add country if asset is stock and country available - - try { - const [code] = Object.entries(countries).find(([, country]) => { - return country.name === assetProfile.summaryProfile?.country; - }); + ); - if (code) { - response.countries = [{ code, weight: 1 }]; - } - } catch {} + const response: { + [date: string]: IDataProviderHistoricalResponse; + } = {}; - if (assetProfile.summaryProfile?.sector) { - response.sectors = [ - { name: assetProfile.summaryProfile?.sector, weight: 1 } - ]; - } + for (const historicalItem of historicalResult) { + response[format(historicalItem.date, DATE_FORMAT)] = { + marketPrice: this.getConvertedValue({ + symbol, + value: historicalItem.dividends + }) + }; } - const url = assetProfile.summaryProfile?.website; - if (url) { - response.url = url; - } + return response; } catch (error) { - throw new Error( - `Could not get asset profile for ${aSymbol} (${this.getName()}): [${ - error.name - }] ${error.message}` + Logger.error( + `Could not get dividends for ${symbol} (${this.getName()}) from ${format( + from, + DATE_FORMAT + )} to ${format(to, DATE_FORMAT)}: [${error.name}] ${error.message}`, + 'YahooFinanceService' ); - } - return response; + return {}; + } } public async getHistorical( @@ -176,11 +115,11 @@ export class YahooFinanceService implements DataProviderInterface { to = addDays(to, 1); } - const yahooFinanceSymbol = this.convertToYahooFinanceSymbol(aSymbol); - try { const historicalResult = await yahooFinance.historical( - yahooFinanceSymbol, + this.yahooFinanceDataEnhancerService.convertToYahooFinanceSymbol( + aSymbol + ), { interval: '1d', period1: format(from, DATE_FORMAT), @@ -192,25 +131,14 @@ export class YahooFinanceService implements DataProviderInterface { [symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; } = {}; - // Convert symbol back - const symbol = this.convertFromYahooFinanceSymbol(yahooFinanceSymbol); - - response[symbol] = {}; + response[aSymbol] = {}; for (const historicalItem of historicalResult) { - let marketPrice = historicalItem.close; - - if (symbol === `${this.baseCurrency}GBp`) { - // Convert GPB to GBp (pence) - marketPrice = new Big(marketPrice).mul(100).toNumber(); - } else if (symbol === `${this.baseCurrency}ILA`) { - // Convert ILS to ILA - marketPrice = new Big(marketPrice).mul(100).toNumber(); - } - - response[symbol][format(historicalItem.date, DATE_FORMAT)] = { - marketPrice, - performance: historicalItem.open - historicalItem.close + response[aSymbol][format(historicalItem.date, DATE_FORMAT)] = { + marketPrice: this.getConvertedValue({ + symbol: aSymbol, + value: historicalItem.close + }) }; } @@ -239,18 +167,38 @@ export class YahooFinanceService implements DataProviderInterface { if (aSymbols.length <= 0) { return {}; } + const yahooFinanceSymbols = aSymbols.map((symbol) => - this.convertToYahooFinanceSymbol(symbol) + this.yahooFinanceDataEnhancerService.convertToYahooFinanceSymbol(symbol) ); try { const response: { [symbol: string]: IDataProviderResponse } = {}; - const quotes = await yahooFinance.quote(yahooFinanceSymbols); + let quotes: Pick< + Quote, + 'currency' | 'marketState' | 'regularMarketPrice' | 'symbol' + >[] = []; + + try { + quotes = await yahooFinance.quote(yahooFinanceSymbols); + } catch (error) { + Logger.error(error, 'YahooFinanceService'); + + Logger.warn( + 'Fallback to yahooFinance.quoteSummary()', + 'YahooFinanceService' + ); + + quotes = await this.getQuotesWithQuoteSummary(yahooFinanceSymbols); + } for (const quote of quotes) { // Convert symbols back - const symbol = this.convertFromYahooFinanceSymbol(quote.symbol); + const symbol = + this.yahooFinanceDataEnhancerService.convertFromYahooFinanceSymbol( + quote.symbol + ); response[symbol] = { currency: quote.currency, @@ -271,9 +219,10 @@ export class YahooFinanceService implements DataProviderInterface { response[`${this.baseCurrency}GBp`] = { ...response[symbol], currency: 'GBp', - marketPrice: new Big(response[symbol].marketPrice) - .mul(100) - .toNumber() + marketPrice: this.getConvertedValue({ + symbol: `${this.baseCurrency}GBp`, + value: response[symbol].marketPrice + }) }; } else if ( symbol === `${this.baseCurrency}ILS` && @@ -283,9 +232,23 @@ export class YahooFinanceService implements DataProviderInterface { response[`${this.baseCurrency}ILA`] = { ...response[symbol], currency: 'ILA', - marketPrice: new Big(response[symbol].marketPrice) - .mul(100) - .toNumber() + marketPrice: this.getConvertedValue({ + symbol: `${this.baseCurrency}ILA`, + value: response[symbol].marketPrice + }) + }; + } else if ( + symbol === `${this.baseCurrency}ZAR` && + yahooFinanceSymbols.includes(`${this.baseCurrency}ZAc=X`) + ) { + // Convert ZAR to ZAc (cents) + response[`${this.baseCurrency}ZAc`] = { + ...response[symbol], + currency: 'ZAc', + marketPrice: this.getConvertedValue({ + symbol: `${this.baseCurrency}ZAc`, + value: response[symbol].marketPrice + }) }; } } @@ -308,11 +271,27 @@ export class YahooFinanceService implements DataProviderInterface { } } - public async search(aQuery: string): Promise<{ items: LookupItem[] }> { + public getTestSymbol() { + return 'AAPL'; + } + + public async search({ + includeIndices = false, + query + }: { + includeIndices?: boolean; + query: string; + }): Promise<{ items: LookupItem[] }> { const items: LookupItem[] = []; try { - const searchResult = await yahooFinance.search(aQuery); + const quoteTypes = ['EQUITY', 'ETF', 'FUTURE', 'MUTUALFUND']; + + if (includeIndices) { + quoteTypes.push('INDEX'); + } + + const searchResult = await yahooFinance.search(query); const quotes = searchResult.quotes .filter((quote) => { @@ -328,7 +307,7 @@ export class YahooFinanceService implements DataProviderInterface { this.baseCurrency ) )) || - ['EQUITY', 'ETF', 'FUTURE', 'MUTUALFUND'].includes(quoteType) + quoteTypes.includes(quoteType) ); }) .filter(({ quoteType, symbol }) => { @@ -355,15 +334,24 @@ export class YahooFinanceService implements DataProviderInterface { return currentQuote.symbol === marketDataItem.symbol; }); - const symbol = this.convertFromYahooFinanceSymbol( - marketDataItem.symbol - ); + const symbol = + this.yahooFinanceDataEnhancerService.convertFromYahooFinanceSymbol( + marketDataItem.symbol + ); + + const { assetClass, assetSubClass } = + this.yahooFinanceDataEnhancerService.parseAssetClass({ + quoteType: quote.quoteType, + shortName: quote.shortname + }); items.push({ + assetClass, + assetSubClass, symbol, currency: marketDataItem.currency, dataSource: this.getName(), - name: this.formatName({ + name: this.yahooFinanceDataEnhancerService.formatName({ longName: quote.longname, quoteType: quote.quoteType, shortName: quote.shortname, @@ -378,122 +366,46 @@ export class YahooFinanceService implements DataProviderInterface { return { items }; } - private formatName({ - longName, - quoteType, - shortName, - symbol + private getConvertedValue({ + symbol, + value }: { - longName: Price['longName']; - quoteType: Price['quoteType']; - shortName: Price['shortName']; - symbol: Price['symbol']; + symbol: string; + value: number; }) { - let name = longName; - - if (name) { - name = name.replace('iShares ETF (CH) - ', ''); - name = name.replace('iShares III Public Limited Company - ', ''); - name = name.replace('iShares VI Public Limited Company - ', ''); - name = name.replace('iShares VII PLC - ', ''); - name = name.replace('Multi Units Luxembourg - ', ''); - name = name.replace('VanEck ETFs N.V. - ', ''); - name = name.replace('Vaneck Vectors Ucits Etfs Plc - ', ''); - name = name.replace('Vanguard Funds Public Limited Company - ', ''); - name = name.replace('Vanguard Index Funds - ', ''); - name = name.replace('Xtrackers (IE) Plc - ', ''); + if (symbol === `${this.baseCurrency}GBp`) { + // Convert GPB to GBp (pence) + return new Big(value).mul(100).toNumber(); + } else if (symbol === `${this.baseCurrency}ILA`) { + // Convert ILS to ILA + return new Big(value).mul(100).toNumber(); + } else if (symbol === `${this.baseCurrency}ZAc`) { + // Convert ZAR to ZAc (cents) + return new Big(value).mul(100).toNumber(); } - if (quoteType === 'FUTURE') { - // "Gold Jun 22" -> "Gold" - name = shortName?.slice(0, -6); - } - - return name || shortName || symbol; + return value; } - private parseAssetClass(aPrice: Price): { - assetClass: AssetClass; - assetSubClass: AssetSubClass; - } { - let assetClass: AssetClass; - let assetSubClass: AssetSubClass; - - switch (aPrice?.quoteType?.toLowerCase()) { - case 'cryptocurrency': - assetClass = AssetClass.CASH; - assetSubClass = AssetSubClass.CRYPTOCURRENCY; - break; - case 'equity': - assetClass = AssetClass.EQUITY; - assetSubClass = AssetSubClass.STOCK; - break; - case 'etf': - assetClass = AssetClass.EQUITY; - assetSubClass = AssetSubClass.ETF; - break; - case 'future': - assetClass = AssetClass.COMMODITY; - assetSubClass = AssetSubClass.COMMODITY; - - if ( - aPrice?.shortName?.toLowerCase()?.startsWith('gold') || - aPrice?.shortName?.toLowerCase()?.startsWith('palladium') || - aPrice?.shortName?.toLowerCase()?.startsWith('platinum') || - aPrice?.shortName?.toLowerCase()?.startsWith('silver') - ) { - assetSubClass = AssetSubClass.PRECIOUS_METAL; - } - - break; - case 'mutualfund': - assetClass = AssetClass.EQUITY; - assetSubClass = AssetSubClass.MUTUALFUND; - break; - } - - return { assetClass, assetSubClass }; - } + private async getQuotesWithQuoteSummary(aYahooFinanceSymbols: string[]) { + const quoteSummaryPromises = aYahooFinanceSymbols.map((symbol) => { + return yahooFinance.quoteSummary(symbol).catch(() => { + Logger.error( + `Could not get quote summary for ${symbol}`, + 'YahooFinanceService' + ); + return null; + }); + }); - private parseSector(aString: string): string { - let sector = UNKNOWN_KEY; - - switch (aString) { - case 'basic_materials': - sector = 'Basic Materials'; - break; - case 'communication_services': - sector = 'Communication Services'; - break; - case 'consumer_cyclical': - sector = 'Consumer Cyclical'; - break; - case 'consumer_defensive': - sector = 'Consumer Staples'; - break; - case 'energy': - sector = 'Energy'; - break; - case 'financial_services': - sector = 'Financial Services'; - break; - case 'healthcare': - sector = 'Healthcare'; - break; - case 'industrials': - sector = 'Industrials'; - break; - case 'realestate': - sector = 'Real Estate'; - break; - case 'technology': - sector = 'Technology'; - break; - case 'utilities': - sector = 'Utilities'; - break; - } + const quoteSummaryItems = await Promise.all(quoteSummaryPromises); - return sector; + return quoteSummaryItems + .filter((item) => { + return item !== null; + }) + .map(({ price }) => { + return price; + }); } } diff --git a/apps/api/src/services/exchange-rate-data.module.ts b/apps/api/src/services/exchange-rate-data/exchange-rate-data.module.ts similarity index 58% rename from apps/api/src/services/exchange-rate-data.module.ts rename to apps/api/src/services/exchange-rate-data/exchange-rate-data.module.ts index 8b8eeee28..89b0158db 100644 --- a/apps/api/src/services/exchange-rate-data.module.ts +++ b/apps/api/src/services/exchange-rate-data/exchange-rate-data.module.ts @@ -1,19 +1,20 @@ -import { ConfigurationModule } from '@ghostfolio/api/services/configuration.module'; +import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module'; -import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data.service'; +import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; +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'; -import { PrismaModule } from './prisma.module'; - @Module({ + exports: [ExchangeRateDataService], imports: [ ConfigurationModule, DataProviderModule, + MarketDataModule, PrismaModule, PropertyModule ], - providers: [ExchangeRateDataService], - exports: [ExchangeRateDataService] + providers: [ExchangeRateDataService] }) export class ExchangeRateDataModule {} diff --git a/apps/api/src/services/exchange-rate-data.service.ts b/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts similarity index 59% rename from apps/api/src/services/exchange-rate-data.service.ts rename to apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts index 60a7e0e56..448933b42 100644 --- a/apps/api/src/services/exchange-rate-data.service.ts +++ b/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts @@ -1,15 +1,15 @@ +import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; +import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; +import { IDataGatheringItem } from '@ghostfolio/api/services/interfaces/interfaces'; +import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; +import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; +import { PropertyService } from '@ghostfolio/api/services/property/property.service'; import { PROPERTY_CURRENCIES } from '@ghostfolio/common/config'; import { DATE_FORMAT, getYesterday } from '@ghostfolio/common/helper'; import { Injectable, Logger } from '@nestjs/common'; -import { format } from 'date-fns'; +import { format, isToday } from 'date-fns'; import { isNumber, uniq } from 'lodash'; -import { ConfigurationService } from './configuration.service'; -import { DataProviderService } from './data-provider/data-provider.service'; -import { IDataGatheringItem } from './interfaces/interfaces'; -import { PrismaService } from './prisma.service'; -import { PropertyService } from './property/property.service'; - @Injectable() export class ExchangeRateDataService { private baseCurrency: string; @@ -20,6 +20,7 @@ export class ExchangeRateDataService { public constructor( private readonly configurationService: ConfigurationService, private readonly dataProviderService: DataProviderService, + private readonly marketDataService: MarketDataService, private readonly prismaService: PrismaService, private readonly propertyService: PropertyService ) {} @@ -63,36 +64,38 @@ export class ExchangeRateDataService { if (Object.keys(result).length !== this.currencyPairs.length) { // Load currencies directly from data provider as a fallback // if historical data is not fully available - const historicalData = await this.dataProviderService.getQuotes( + const quotes = await this.dataProviderService.getQuotes( this.currencyPairs.map(({ dataSource, symbol }) => { return { dataSource, symbol }; }) ); - Object.keys(historicalData).forEach((key) => { - result[key] = { - [format(getYesterday(), DATE_FORMAT)]: { - marketPrice: historicalData[key].marketPrice - } - }; - }); + for (const symbol of Object.keys(quotes)) { + if (isNumber(quotes[symbol].marketPrice)) { + result[symbol] = { + [format(getYesterday(), DATE_FORMAT)]: { + marketPrice: quotes[symbol].marketPrice + } + }; + } + } } const resultExtended = result; - Object.keys(result).forEach((pair) => { - const [currency1, currency2] = pair.match(/.{1,3}/g); - const [date] = Object.keys(result[pair]); + for (const symbol of Object.keys(result)) { + const [currency1, currency2] = symbol.match(/.{1,3}/g); + const [date] = Object.keys(result[symbol]); // Calculate the opposite direction resultExtended[`${currency2}${currency1}`] = { [date]: { - marketPrice: 1 / result[pair][date].marketPrice + marketPrice: 1 / result[symbol][date].marketPrice } }; - }); + } - Object.keys(resultExtended).forEach((symbol) => { + for (const symbol of Object.keys(resultExtended)) { const [currency1, currency2] = symbol.match(/.{1,3}/g); const date = format(getYesterday(), DATE_FORMAT); @@ -110,7 +113,7 @@ export class ExchangeRateDataService { this.exchangeRates[`${currency2}${currency1}`] = 1 / this.exchangeRates[symbol]; } - }); + } } public toCurrency( @@ -152,6 +155,91 @@ export class ExchangeRateDataService { return aValue; } + public async toCurrencyAtDate( + aValue: number, + aFromCurrency: string, + aToCurrency: string, + aDate: Date + ) { + if (aValue === 0) { + return 0; + } + + if (isToday(aDate)) { + return this.toCurrency(aValue, aFromCurrency, aToCurrency); + } + + let factor: number; + + if (aFromCurrency !== aToCurrency) { + const dataSource = + this.dataProviderService.getDataSourceForExchangeRates(); + const symbol = `${aFromCurrency}${aToCurrency}`; + + const marketData = await this.marketDataService.get({ + dataSource, + symbol, + date: aDate + }); + + if (marketData?.marketPrice) { + factor = marketData?.marketPrice; + } else { + // Calculate indirectly via base currency + + let marketPriceBaseCurrencyFromCurrency: number; + let marketPriceBaseCurrencyToCurrency: number; + + try { + if (this.baseCurrency === aFromCurrency) { + marketPriceBaseCurrencyFromCurrency = 1; + } else { + marketPriceBaseCurrencyFromCurrency = ( + await this.marketDataService.get({ + dataSource, + date: aDate, + symbol: `${this.baseCurrency}${aFromCurrency}` + }) + )?.marketPrice; + } + } catch {} + + try { + if (this.baseCurrency === aToCurrency) { + marketPriceBaseCurrencyToCurrency = 1; + } else { + marketPriceBaseCurrencyToCurrency = ( + await this.marketDataService.get({ + dataSource, + date: aDate, + symbol: `${this.baseCurrency}${aToCurrency}` + }) + )?.marketPrice; + } + } catch {} + + // Calculate the opposite direction + factor = + (1 / marketPriceBaseCurrencyFromCurrency) * + marketPriceBaseCurrencyToCurrency; + } + } + + if (isNumber(factor) && !isNaN(factor)) { + return factor * aValue; + } + + Logger.error( + `No exchange rate has been found for ${aFromCurrency}${aToCurrency} at ${format( + aDate, + DATE_FORMAT + )}`, + 'ExchangeRateDataService' + ); + + return undefined; + } + private async prepareCurrencies(): Promise { let currencies: string[] = []; @@ -200,7 +288,7 @@ export class ExchangeRateDataService { return { currency1: this.baseCurrency, currency2: currency, - dataSource: this.dataProviderService.getPrimaryDataSource(), + dataSource: this.dataProviderService.getDataSourceForExchangeRates(), symbol: `${this.baseCurrency}${currency}` }; }); diff --git a/apps/api/src/services/impersonation.service.ts b/apps/api/src/services/impersonation.service.ts deleted file mode 100644 index 8082a8198..000000000 --- a/apps/api/src/services/impersonation.service.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Injectable } from '@nestjs/common'; - -import { PrismaService } from './prisma.service'; - -@Injectable() -export class ImpersonationService { - public constructor(private readonly prismaService: PrismaService) {} - - public async validateImpersonationId(aId = '', aUserId: string) { - const accessObject = await this.prismaService.access.findFirst({ - where: { GranteeUser: { id: aUserId }, id: aId } - }); - - return accessObject?.userId; - } -} diff --git a/apps/api/src/services/impersonation.module.ts b/apps/api/src/services/impersonation/impersonation.module.ts similarity index 68% rename from apps/api/src/services/impersonation.module.ts rename to apps/api/src/services/impersonation/impersonation.module.ts index 00be6e68f..506fb7f91 100644 --- a/apps/api/src/services/impersonation.module.ts +++ b/apps/api/src/services/impersonation/impersonation.module.ts @@ -1,5 +1,5 @@ -import { ImpersonationService } from '@ghostfolio/api/services/impersonation.service'; -import { PrismaModule } from '@ghostfolio/api/services/prisma.module'; +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 new file mode 100644 index 000000000..e678356cb --- /dev/null +++ b/apps/api/src/services/impersonation/impersonation.service.ts @@ -0,0 +1,49 @@ +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'; + +@Injectable() +export class ImpersonationService { + public constructor( + private readonly prismaService: PrismaService, + @Inject(REQUEST) private readonly request: RequestWithUser + ) {} + + public async validateImpersonationId(aId = '') { + if (this.request.user) { + const accessObject = await this.prismaService.access.findFirst({ + where: { + GranteeUser: { id: this.request.user.id }, + id: aId + } + }); + + if (accessObject?.userId) { + return accessObject.userId; + } else if ( + hasPermission( + this.request.user.permissions, + permissions.impersonateAllUsers + ) + ) { + return aId; + } + } else { + // Public access + const accessObject = await this.prismaService.access.findFirst({ + where: { + GranteeUser: null, + User: { id: aId } + } + }); + + if (accessObject?.userId) { + return accessObject.userId; + } + } + + return null; + } +} diff --git a/apps/api/src/services/interfaces/environment.interface.ts b/apps/api/src/services/interfaces/environment.interface.ts index 5ac20b55e..88fa4c3f5 100644 --- a/apps/api/src/services/interfaces/environment.interface.ts +++ b/apps/api/src/services/interfaces/environment.interface.ts @@ -4,19 +4,21 @@ export interface Environment extends CleanedEnvAccessors { ACCESS_TOKEN_SALT: string; ALPHA_VANTAGE_API_KEY: string; BASE_CURRENCY: string; + BETTER_UPTIME_API_KEY: string; + CACHE_QUOTES_TTL: number; CACHE_TTL: number; - DATA_SOURCE_PRIMARY: string; + DATA_SOURCE_EXCHANGE_RATES: string; + DATA_SOURCE_IMPORT: string; DATA_SOURCES: string[]; ENABLE_FEATURE_BLOG: boolean; - ENABLE_FEATURE_CUSTOM_SYMBOLS: boolean; ENABLE_FEATURE_FEAR_AND_GREED_INDEX: boolean; - ENABLE_FEATURE_IMPORT: 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; diff --git a/apps/api/src/services/interfaces/interfaces.ts b/apps/api/src/services/interfaces/interfaces.ts index 1148dd6af..15505db63 100644 --- a/apps/api/src/services/interfaces/interfaces.ts +++ b/apps/api/src/services/interfaces/interfaces.ts @@ -1,4 +1,4 @@ -import { UniqueAsset } from '@ghostfolio/common/interfaces'; +import { DataProviderInfo, UniqueAsset } from '@ghostfolio/common/interfaces'; import { MarketState } from '@ghostfolio/common/types'; import { Account, @@ -23,11 +23,11 @@ export interface IOrder { export interface IDataProviderHistoricalResponse { marketPrice: number; - performance?: number; } export interface IDataProviderResponse { currency: string; + dataProviderInfo?: DataProviderInfo; dataSource: DataSource; marketPrice: number; marketState: MarketState; diff --git a/apps/api/src/services/market-data.module.ts b/apps/api/src/services/market-data/market-data.module.ts similarity index 75% rename from apps/api/src/services/market-data.module.ts rename to apps/api/src/services/market-data/market-data.module.ts index b1a09fa91..32367d5c0 100644 --- a/apps/api/src/services/market-data.module.ts +++ b/apps/api/src/services/market-data/market-data.module.ts @@ -1,4 +1,4 @@ -import { PrismaModule } from '@ghostfolio/api/services/prisma.module'; +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.service.ts b/apps/api/src/services/market-data/market-data.service.ts similarity index 57% rename from apps/api/src/services/market-data.service.ts rename to apps/api/src/services/market-data/market-data.service.ts index 9dd3e4773..414c247aa 100644 --- a/apps/api/src/services/market-data.service.ts +++ b/apps/api/src/services/market-data/market-data.service.ts @@ -1,10 +1,16 @@ import { UpdateMarketDataDto } from '@ghostfolio/api/app/admin/update-market-data.dto'; import { DateQuery } from '@ghostfolio/api/app/portfolio/interfaces/date-query.interface'; -import { PrismaService } from '@ghostfolio/api/services/prisma.service'; +import { IDataGatheringItem } from '@ghostfolio/api/services/interfaces/interfaces'; +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, MarketData, Prisma } from '@prisma/client'; +import { + DataSource, + MarketData, + MarketDataState, + Prisma +} from '@prisma/client'; @Injectable() export class MarketDataService { @@ -20,14 +26,13 @@ export class MarketDataService { } public async get({ - date, + dataSource, + date = new Date(), symbol - }: { - date: Date; - symbol: string; - }): Promise { + }: IDataGatheringItem): Promise { return await this.prismaService.marketData.findFirst({ where: { + dataSource, symbol, date: resetHours(date) } @@ -92,7 +97,9 @@ export class MarketDataService { } public async updateMarketData(params: { - data: { dataSource: DataSource } & UpdateMarketDataDto; + data: { + state: MarketDataState; + } & UpdateMarketDataDto; where: Prisma.MarketDataWhereUniqueInput; }): Promise { const { data, where } = params; @@ -100,12 +107,50 @@ export class MarketDataService { return this.prismaService.marketData.upsert({ where, create: { - dataSource: data.dataSource, - date: where.date_symbol.date, + dataSource: where.dataSource_date_symbol.dataSource, + date: where.dataSource_date_symbol.date, marketPrice: data.marketPrice, - symbol: where.date_symbol.symbol + state: data.state, + symbol: where.dataSource_date_symbol.symbol }, - update: { marketPrice: data.marketPrice } + update: { marketPrice: data.marketPrice, state: data.state } }); } + + /** + * Upsert market data by imitating missing upsertMany functionality + * with $transaction + */ + public async updateMany({ + data + }: { + data: Prisma.MarketDataUpdateInput[]; + }): Promise { + const upsertPromises = data.map( + ({ dataSource, date, marketPrice, symbol, state }) => { + return this.prismaService.marketData.upsert({ + create: { + dataSource: dataSource, + date: date, + marketPrice: marketPrice, + state: state, + symbol: symbol + }, + update: { + marketPrice: marketPrice, + state: state + }, + where: { + dataSource_date_symbol: { + dataSource: dataSource, + date: date, + symbol: symbol + } + } + }); + } + ); + + return this.prismaService.$transaction(upsertPromises); + } } diff --git a/apps/api/src/services/prisma.module.ts b/apps/api/src/services/prisma/prisma.module.ts similarity index 63% rename from apps/api/src/services/prisma.module.ts rename to apps/api/src/services/prisma/prisma.module.ts index ee8c8b8c5..7cd76d314 100644 --- a/apps/api/src/services/prisma.module.ts +++ b/apps/api/src/services/prisma/prisma.module.ts @@ -1,4 +1,4 @@ -import { PrismaService } from '@ghostfolio/api/services/prisma.service'; +import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { Module } from '@nestjs/common'; @Module({ diff --git a/apps/api/src/services/prisma.service.ts b/apps/api/src/services/prisma/prisma.service.ts similarity index 100% rename from apps/api/src/services/prisma.service.ts rename to apps/api/src/services/prisma/prisma.service.ts diff --git a/apps/api/src/services/property/property.module.ts b/apps/api/src/services/property/property.module.ts index fcd89de40..50fba955d 100644 --- a/apps/api/src/services/property/property.module.ts +++ b/apps/api/src/services/property/property.module.ts @@ -1,4 +1,4 @@ -import { PrismaModule } from '@ghostfolio/api/services/prisma.module'; +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 4760c3a94..cb5902cd5 100644 --- a/apps/api/src/services/property/property.service.ts +++ b/apps/api/src/services/property/property.service.ts @@ -1,5 +1,8 @@ -import { PrismaService } from '@ghostfolio/api/services/prisma.service'; -import { PROPERTY_CURRENCIES } from '@ghostfolio/common/config'; +import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; +import { + PROPERTY_CURRENCIES, + PROPERTY_IS_USER_SIGNUP_ENABLED +} from '@ghostfolio/common/config'; import { Injectable } from '@nestjs/common'; @Injectable() @@ -39,6 +42,13 @@ export class PropertyService { return properties?.[aKey]; } + public async isUserSignupEnabled() { + return ( + ((await this.getByKey(PROPERTY_IS_USER_SIGNUP_ENABLED)) as boolean) ?? + true + ); + } + public async put({ key, value }: { key: string; value: string }) { return this.prismaService.property.upsert({ create: { key, value }, diff --git a/apps/api/src/services/symbol-profile.module.ts b/apps/api/src/services/symbol-profile/symbol-profile.module.ts similarity index 76% rename from apps/api/src/services/symbol-profile.module.ts rename to apps/api/src/services/symbol-profile/symbol-profile.module.ts index ac1337e87..fb3fc4d62 100644 --- a/apps/api/src/services/symbol-profile.module.ts +++ b/apps/api/src/services/symbol-profile/symbol-profile.module.ts @@ -1,4 +1,4 @@ -import { PrismaModule } from '@ghostfolio/api/services/prisma.module'; +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.service.ts b/apps/api/src/services/symbol-profile/symbol-profile.service.ts similarity index 75% rename from apps/api/src/services/symbol-profile.service.ts rename to apps/api/src/services/symbol-profile/symbol-profile.service.ts index 62bc38aab..99244c352 100644 --- a/apps/api/src/services/symbol-profile.service.ts +++ b/apps/api/src/services/symbol-profile/symbol-profile.service.ts @@ -1,4 +1,4 @@ -import { PrismaService } from '@ghostfolio/api/services/prisma.service'; +import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { UNKNOWN_KEY } from '@ghostfolio/common/config'; import { EnhancedSymbolProfile, @@ -8,25 +8,20 @@ import { import { Country } from '@ghostfolio/common/interfaces/country.interface'; import { Sector } from '@ghostfolio/common/interfaces/sector.interface'; import { Injectable } from '@nestjs/common'; -import { - DataSource, - Prisma, - SymbolProfile, - SymbolProfileOverrides -} from '@prisma/client'; +import { Prisma, SymbolProfile, SymbolProfileOverrides } from '@prisma/client'; import { continents, countries } from 'countries-list'; @Injectable() export class SymbolProfileService { public constructor(private readonly prismaService: PrismaService) {} - public async delete({ - dataSource, - symbol - }: { - dataSource: DataSource; - symbol: string; - }) { + public async add( + assetProfile: Prisma.SymbolProfileCreateInput + ): Promise { + return this.prismaService.symbolProfile.create({ data: assetProfile }); + } + + public async delete({ dataSource, symbol }: UniqueAsset) { return this.prismaService.symbolProfile.delete({ where: { dataSource_symbol: { dataSource, symbol } } }); @@ -43,7 +38,19 @@ export class SymbolProfileService { ): Promise { return this.prismaService.symbolProfile .findMany({ - include: { SymbolProfileOverrides: true }, + include: { + _count: { + select: { Order: true } + }, + Order: { + orderBy: { + date: 'asc' + }, + select: { date: true }, + take: 1 + }, + SymbolProfileOverrides: true + }, where: { AND: [ { @@ -69,7 +76,12 @@ export class SymbolProfileService { ): Promise { return this.prismaService.symbolProfile .findMany({ - include: { SymbolProfileOverrides: true }, + include: { + _count: { + select: { Order: true } + }, + SymbolProfileOverrides: true + }, where: { id: { in: symbolProfileIds.map((symbolProfileId) => { @@ -81,40 +93,47 @@ export class SymbolProfileService { .then((symbolProfiles) => this.getSymbols(symbolProfiles)); } - /** - * @deprecated - */ - public async getSymbolProfilesBySymbols( - symbols: string[] - ): Promise { - return this.prismaService.symbolProfile - .findMany({ - include: { SymbolProfileOverrides: true }, - where: { - symbol: { - in: symbols - } - } - }) - .then((symbolProfiles) => this.getSymbols(symbolProfiles)); + public updateSymbolProfile({ + comment, + dataSource, + scraperConfiguration, + symbol, + symbolMapping + }: Prisma.SymbolProfileUpdateInput & UniqueAsset) { + return this.prismaService.symbolProfile.update({ + data: { comment, scraperConfiguration, symbolMapping }, + where: { dataSource_symbol: { dataSource, symbol } } + }); } private getSymbols( symbolProfiles: (SymbolProfile & { + _count: { Order: number }; + Order?: { + date: Date; + }[]; SymbolProfileOverrides: SymbolProfileOverrides; })[] ): EnhancedSymbolProfile[] { return symbolProfiles.map((symbolProfile) => { const item = { ...symbolProfile, + activitiesCount: 0, countries: this.getCountries( symbolProfile?.countries as unknown as Prisma.JsonArray ), + dateOfFirstActivity: undefined, scraperConfiguration: this.getScraperConfiguration(symbolProfile), sectors: this.getSectors(symbolProfile), symbolMapping: this.getSymbolMapping(symbolProfile) }; + item.activitiesCount = symbolProfile._count.Order; + delete item._count; + + item.dateOfFirstActivity = symbolProfile.Order?.[0]?.date; + delete item.Order; + if (item.SymbolProfileOverrides) { item.assetClass = item.SymbolProfileOverrides.assetClass ?? item.assetClass; @@ -177,6 +196,8 @@ export class SymbolProfileService { if (scraperConfiguration) { return { defaultMarketPrice: scraperConfiguration.defaultMarketPrice as number, + headers: + scraperConfiguration.headers as ScraperConfiguration['headers'], selector: scraperConfiguration.selector as string, url: scraperConfiguration.url as string }; diff --git a/apps/api/src/services/tag/tag.module.ts b/apps/api/src/services/tag/tag.module.ts index 32d905884..76ed9fcd6 100644 --- a/apps/api/src/services/tag/tag.module.ts +++ b/apps/api/src/services/tag/tag.module.ts @@ -1,4 +1,4 @@ -import { PrismaModule } from '@ghostfolio/api/services/prisma.module'; +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 534a6e73d..c02345784 100644 --- a/apps/api/src/services/tag/tag.service.ts +++ b/apps/api/src/services/tag/tag.service.ts @@ -1,4 +1,4 @@ -import { PrismaService } from '@ghostfolio/api/services/prisma.service'; +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 c810dad4a..d4d565cb1 100644 --- a/apps/api/src/services/twitter-bot/twitter-bot.module.ts +++ b/apps/api/src/services/twitter-bot/twitter-bot.module.ts @@ -1,6 +1,6 @@ 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.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'; 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 40e9c9cf2..218dd291f 100644 --- a/apps/api/src/services/twitter-bot/twitter-bot.service.ts +++ b/apps/api/src/services/twitter-bot/twitter-bot.service.ts @@ -1,6 +1,6 @@ import { BenchmarkService } from '@ghostfolio/api/app/benchmark/benchmark.service'; import { SymbolService } from '@ghostfolio/api/app/symbol/symbol.service'; -import { ConfigurationService } from '@ghostfolio/api/services/configuration.service'; +import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { ghostfolioFearAndGreedIndexDataSource, ghostfolioFearAndGreedIndexSymbol diff --git a/apps/client-e2e/project.json b/apps/client-e2e/project.json index 94276384e..16d13e012 100644 --- a/apps/client-e2e/project.json +++ b/apps/client-e2e/project.json @@ -1,10 +1,11 @@ { + "name": "client-e2e", "$schema": "../../node_modules/nx/schemas/project-schema.json", "sourceRoot": "apps/client-e2e/src", "projectType": "application", "targets": { "e2e": { - "executor": "@nrwl/cypress:cypress", + "executor": "@nx/cypress:cypress", "options": { "cypressConfig": "apps/client-e2e/cypress.json", "tsConfig": "apps/client-e2e/tsconfig.e2e.json", diff --git a/apps/client-e2e/src/plugins/index.js b/apps/client-e2e/src/plugins/index.js index 9067e75a2..63aa33cbe 100644 --- a/apps/client-e2e/src/plugins/index.js +++ b/apps/client-e2e/src/plugins/index.js @@ -11,7 +11,7 @@ // This function is called when a project is opened or re-opened (e.g. due to // the project's config changing) -const { preprocessTypescript } = require('@nrwl/cypress/plugins/preprocessor'); +const { preprocessTypescript } = require('@nx/cypress/plugins/preprocessor'); module.exports = (on, config) => { // `on` is used to hook into various events Cypress emits diff --git a/apps/client/.browserslistrc b/apps/client/.browserslistrc deleted file mode 100644 index 0ccadaf32..000000000 --- a/apps/client/.browserslistrc +++ /dev/null @@ -1,18 +0,0 @@ -# This file is used by the build system to adjust CSS and JS output to support the specified browsers below. -# For additional information regarding the format and rule options, please see: -# https://github.com/browserslist/browserslist#queries - -# For the full list of supported browsers by the Angular framework, please see: -# https://angular.io/guide/browser-support - -# You can see what browsers were selected by your queries by running: -# npx browserslist - -last 1 Chrome version -last 1 Firefox version -last 2 Edge major versions -last 2 Safari major versions -last 2 iOS major versions -Firefox ESR -not IE 9-10 # Angular support for IE 9-10 has been deprecated and will be removed as of Angular v11. To opt-in, remove the 'not' prefix on this line. -not IE 11 # Angular supports IE 11 only as an opt-in. To opt-in, remove the 'not' prefix on this line. diff --git a/apps/client/jest.config.ts b/apps/client/jest.config.ts index d248ed8e4..04378bdbd 100644 --- a/apps/client/jest.config.ts +++ b/apps/client/jest.config.ts @@ -3,12 +3,7 @@ export default { displayName: 'client', setupFilesAfterEnv: ['/src/test-setup.ts'], - globals: { - 'ts-jest': { - tsconfig: '/tsconfig.spec.json', - stringifyContentPathRegex: '\\.(html|svg)$' - } - }, + globals: {}, coverageDirectory: '../../coverage/apps/client', snapshotSerializers: [ 'jest-preset-angular/build/serializers/no-ng-attributes', @@ -16,7 +11,13 @@ export default { 'jest-preset-angular/build/serializers/html-comment' ], transform: { - '^.+.(ts|mjs|js|html)$': 'jest-preset-angular' + '^.+.(ts|mjs|js|html)$': [ + 'jest-preset-angular', + { + tsconfig: '/tsconfig.spec.json', + stringifyContentPathRegex: '\\.(html|svg)$' + } + ] }, transformIgnorePatterns: ['node_modules/(?!.*.mjs$)'], preset: '../../jest.preset.js' diff --git a/apps/client/ngsw-config.json b/apps/client/ngsw-config.json new file mode 100644 index 000000000..c0f03a135 --- /dev/null +++ b/apps/client/ngsw-config.json @@ -0,0 +1,30 @@ +{ + "$schema": "../../node_modules/@angular/service-worker/config/schema.json", + "index": "/index.html", + "assetGroups": [ + { + "name": "app", + "installMode": "prefetch", + "resources": { + "files": [ + "/favicon.ico", + "/index.html", + "/assets/site.webmanifest", + "/*.css", + "/*.js" + ] + } + }, + { + "name": "assets", + "installMode": "lazy", + "updateMode": "prefetch", + "resources": { + "files": [ + "/assets/**", + "/*.(svg|cur|jpg|jpeg|png|apng|webp|avif|gif|otf|ttf|woff|woff2)" + ] + } + } + ] +} diff --git a/apps/client/project.json b/apps/client/project.json index dc9a17fed..a4c8830a7 100644 --- a/apps/client/project.json +++ b/apps/client/project.json @@ -1,4 +1,5 @@ { + "name": "client", "$schema": "../../node_modules/nx/schemas/project-schema.json", "projectType": "application", "generators": { @@ -43,6 +44,11 @@ "input": "apps/client/src/assets", "output": "./../" }, + { + "glob": "site.webmanifest", + "input": "apps/client/src/assets", + "output": "./../" + }, { "glob": "**/*", "input": "node_modules/ionicons/dist/ionicons", @@ -59,14 +65,19 @@ "output": "./../assets/" } ], - "styles": ["apps/client/src/styles.scss"], + "styles": [ + "apps/client/src/styles/theme.scss", + "apps/client/src/styles.scss" + ], "scripts": ["node_modules/marked/marked.min.js"], "vendorChunk": true, "extractLicenses": false, "buildOptimizer": false, "sourceMap": true, "optimization": false, - "namedChunks": true + "namedChunks": true, + "serviceWorker": true, + "ngswConfigPath": "apps/client/ngsw-config.json" }, "configurations": { "development-de": { @@ -81,6 +92,10 @@ "baseHref": "/es/", "localize": ["es"] }, + "development-fr": { + "baseHref": "/fr/", + "localize": ["fr"] + }, "development-it": { "baseHref": "/it/", "localize": ["it"] @@ -89,6 +104,10 @@ "baseHref": "/nl/", "localize": ["nl"] }, + "development-pt": { + "baseHref": "/pt/", + "localize": ["pt"] + }, "production": { "fileReplacements": [ { @@ -136,12 +155,18 @@ "development-es": { "browserTarget": "client:build:development-es" }, + "development-fr": { + "browserTarget": "client:build:development-fr" + }, "development-it": { "browserTarget": "client:build:development-it" }, "development-nl": { "browserTarget": "client:build:development-nl" }, + "development-pt": { + "browserTarget": "client:build:development-pt" + }, "production": { "browserTarget": "client:build:production" } @@ -156,8 +181,10 @@ "targetFiles": [ "messages.de.xlf", "messages.es.xlf", + "messages.fr.xlf", "messages.it.xlf", - "messages.nl.xlf" + "messages.nl.xlf", + "messages.pt.xlf" ] } }, @@ -168,7 +195,7 @@ } }, "test": { - "executor": "@nrwl/jest:jest", + "executor": "@nx/jest:jest", "options": { "jestConfig": "apps/client/jest.config.ts", "passWithNoTests": true @@ -186,6 +213,10 @@ "baseHref": "/es/", "translation": "apps/client/src/locales/messages.es.xlf" }, + "fr": { + "baseHref": "/fr/", + "translation": "apps/client/src/locales/messages.fr.xlf" + }, "it": { "baseHref": "/it/", "translation": "apps/client/src/locales/messages.it.xlf" @@ -193,6 +224,10 @@ "nl": { "baseHref": "/nl/", "translation": "apps/client/src/locales/messages.nl.xlf" + }, + "pt": { + "baseHref": "/pt/", + "translation": "apps/client/src/locales/messages.pt.xlf" } }, "sourceLocale": "en" diff --git a/apps/client/proxy.conf.json b/apps/client/proxy.conf.json index 9ad19ddba..94a448238 100644 --- a/apps/client/proxy.conf.json +++ b/apps/client/proxy.conf.json @@ -1,14 +1,14 @@ { "/api": { - "target": "http://localhost:3333", + "target": "http://0.0.0.0:3333", "secure": false }, "/assets": { - "target": "http://localhost:3333", + "target": "http://0.0.0.0:3333", "secure": false }, "/ionicons": { - "target": "http://localhost:3333", + "target": "http://0.0.0.0:3333", "secure": false } } diff --git a/apps/client/src/app/adapter/custom-date-adapter.ts b/apps/client/src/app/adapter/custom-date-adapter.ts index af57c567a..663c91b72 100644 --- a/apps/client/src/app/adapter/custom-date-adapter.ts +++ b/apps/client/src/app/adapter/custom-date-adapter.ts @@ -2,7 +2,7 @@ import { Platform } from '@angular/cdk/platform'; import { Inject, forwardRef } from '@angular/core'; import { MAT_DATE_LOCALE, NativeDateAdapter } from '@angular/material/core'; import { getDateFormatString } from '@ghostfolio/common/helper'; -import { format, parse } from 'date-fns'; +import { addYears, format, getYear, parse } from 'date-fns'; export class CustomDateAdapter extends NativeDateAdapter { public constructor( @@ -31,6 +31,16 @@ export class CustomDateAdapter extends NativeDateAdapter { * Parses a date from a provided value */ public parse(aValue: string): Date { - return parse(aValue, getDateFormatString(this.locale), new Date()); + let date = parse(aValue, getDateFormatString(this.locale), new Date()); + + if (getYear(date) < 1900) { + if (getYear(date) > Number(format(new Date(), 'yy')) + 1) { + date = addYears(date, 1900); + } else { + date = addYears(date, 2000); + } + } + + return date; } } diff --git a/apps/client/src/app/app-routing.module.ts b/apps/client/src/app/app-routing.module.ts index 856230eb6..e9eed48a2 100644 --- a/apps/client/src/app/app-routing.module.ts +++ b/apps/client/src/app/app-routing.module.ts @@ -5,25 +5,19 @@ import { PageTitleStrategy } from '@ghostfolio/client/services/page-title.strate import { ModulePreloadService } from './core/module-preload.service'; const routes: Routes = [ - { - path: 'about', + ...[ + 'about', + ///// + 'a-propos', + 'informazioni-su', + 'over', + 'sobre', + 'ueber-uns' + ].map((path) => ({ + path, loadChildren: () => import('./pages/about/about-page.module').then((m) => m.AboutPageModule) - }, - { - path: 'about/changelog', - loadChildren: () => - import('./pages/about/changelog/changelog-page.module').then( - (m) => m.ChangelogPageModule - ) - }, - { - path: 'about/privacy-policy', - loadChildren: () => - import('./pages/about/privacy-policy/privacy-policy-page.module').then( - (m) => m.PrivacyPolicyPageModule - ) - }, + })), { path: 'account', loadChildren: () => @@ -48,88 +42,68 @@ const routes: Routes = [ loadChildren: () => import('./pages/auth/auth-page.module').then((m) => m.AuthPageModule) }, - { - path: 'blog', + ...['blog'].map((path) => ({ + path, loadChildren: () => import('./pages/blog/blog-page.module').then((m) => m.BlogPageModule) - }, - { - path: 'blog/2021/07/hallo-ghostfolio', - loadChildren: () => - import( - './pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.module' - ).then((m) => m.HalloGhostfolioPageModule) - }, - { - path: 'blog/2021/07/hello-ghostfolio', - loadChildren: () => - import( - './pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.module' - ).then((m) => m.HelloGhostfolioPageModule) - }, - { - path: 'blog/2022/01/ghostfolio-first-months-in-open-source', - loadChildren: () => - import( - './pages/blog/2022/01/first-months-in-open-source/first-months-in-open-source-page.module' - ).then((m) => m.FirstMonthsInOpenSourcePageModule) - }, - { - path: 'blog/2022/07/ghostfolio-meets-internet-identity', - loadChildren: () => - import( - './pages/blog/2022/07/ghostfolio-meets-internet-identity/ghostfolio-meets-internet-identity-page.module' - ).then((m) => m.GhostfolioMeetsInternetIdentityPageModule) - }, - { - path: 'blog/2022/07/how-do-i-get-my-finances-in-order', - loadChildren: () => - import( - './pages/blog/2022/07/how-do-i-get-my-finances-in-order/how-do-i-get-my-finances-in-order-page.module' - ).then((m) => m.HowDoIGetMyFinancesInOrderPageModule) - }, - { - path: 'blog/2022/08/500-stars-on-github', - loadChildren: () => - import( - './pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.module' - ).then((m) => m.FiveHundredStarsOnGitHubPageModule) - }, - { - path: 'blog/2022/10/hacktoberfest-2022', - loadChildren: () => - import( - './pages/blog/2022/10/hacktoberfest-2022/hacktoberfest-2022-page.module' - ).then((m) => m.Hacktoberfest2022PageModule) - }, + })), { path: 'demo', loadChildren: () => import('./pages/demo/demo-page.module').then((m) => m.DemoPageModule) }, - { - path: 'faq', + ...[ + 'faq', + ///// + 'domande-piu-frequenti', + 'foire-aux-questions', + 'haeufig-gestellte-fragen', + 'perguntas-mais-frequentes', + 'preguntas-mas-frecuentes', + 'vaak-gestelde-vragen' + ].map((path) => ({ + path, loadChildren: () => import('./pages/faq/faq-page.module').then((m) => m.FaqPageModule) - }, - { - path: 'features', + })), + ...[ + 'features', + ///// + 'fonctionnalites', + 'funcionalidades', + 'funzionalita', + 'kenmerken' + ].map((path) => ({ + path, loadChildren: () => import('./pages/features/features-page.module').then( (m) => m.FeaturesPageModule ) - }, + })), { path: 'home', loadChildren: () => import('./pages/home/home-page.module').then((m) => m.HomePageModule) }, - { - path: 'markets', + ...[ + 'markets', + ///// + 'maerkte', + 'marches', + 'markten', + 'mercados', + 'mercati' + ].map((path) => ({ + path, loadChildren: () => import('./pages/markets/markets-page.module').then( (m) => m.MarketsPageModule ) + })), + { + path: 'open', + loadChildren: () => + import('./pages/open/open-page.module').then((m) => m.OpenPageModule) }, { path: 'p', @@ -145,69 +119,53 @@ const routes: Routes = [ (m) => m.PortfolioPageModule ) }, - { - path: 'portfolio/activities', - loadChildren: () => - import('./pages/portfolio/transactions/transactions-page.module').then( - (m) => m.TransactionsPageModule - ) - }, - { - path: 'portfolio/allocations', - loadChildren: () => - import('./pages/portfolio/allocations/allocations-page.module').then( - (m) => m.AllocationsPageModule - ) - }, - { - path: 'portfolio/analysis', - loadChildren: () => - import('./pages/portfolio/analysis/analysis-page.module').then( - (m) => m.AnalysisPageModule - ) - }, - { - path: 'portfolio/fire', - loadChildren: () => - import('./pages/portfolio/fire/fire-page.module').then( - (m) => m.FirePageModule - ) - }, - { - path: 'portfolio/holdings', - loadChildren: () => - import('./pages/portfolio/holdings/holdings-page.module').then( - (m) => m.HoldingsPageModule - ) - }, - { - path: 'portfolio/report', - loadChildren: () => - import('./pages/portfolio/report/report-page.module').then( - (m) => m.ReportPageModule - ) - }, - { - path: 'pricing', + ...[ + 'pricing', + ///// + 'precios', + 'precos', + 'preise', + 'prezzi', + 'prijzen', + 'prix' + ].map((path) => ({ + path, loadChildren: () => import('./pages/pricing/pricing-page.module').then( (m) => m.PricingPageModule ) - }, - { - path: 'register', + })), + ...[ + 'register', + ///// + 'enregistrement', + 'iscrizione', + 'registo', + 'registratie', + 'registrierung', + 'registro' + ].map((path) => ({ + path, loadChildren: () => import('./pages/register/register-page.module').then( (m) => m.RegisterPageModule ) - }, - { - path: 'resources', + })), + ...[ + 'resources', + ///// + 'bronnen', + 'recursos', + 'ressourcen', + 'ressources', + 'risorse' + ].map((path) => ({ + path, loadChildren: () => import('./pages/resources/resources-page.module').then( (m) => m.ResourcesPageModule ) - }, + })), { path: 'start', loadChildren: () => @@ -243,9 +201,8 @@ const routes: Routes = [ // Preload all lazy loaded modules with the attribute preload === true { anchorScrolling: 'enabled', - preloadingStrategy: ModulePreloadService, + preloadingStrategy: ModulePreloadService // enableTracing: true // <-- debugging purposes only - relativeLinkResolution: 'legacy' } ) ], diff --git a/apps/client/src/app/app.component.html b/apps/client/src/app/app.component.html index 4525930cf..3eafe89ad 100644 --- a/apps/client/src/app/app.component.html +++ b/apps/client/src/app/app.component.html @@ -3,6 +3,7 @@ class="position-fixed w-100" [currentRoute]="currentRoute" [info]="info" + [pageTitle]="pageTitle" [user]="user" (signOut)="onSignOut()" > @@ -30,7 +31,8 @@ >
{{ info.systemMessage }}
@@ -42,19 +44,143 @@ diff --git a/apps/client/src/app/app.component.scss b/apps/client/src/app/app.component.scss index ab7878d73..0c0828880 100644 --- a/apps/client/src/app/app.component.scss +++ b/apps/client/src/app/app.component.scss @@ -1,9 +1,14 @@ -@import '~apps/client/src/styles/ghostfolio-style'; +@import 'apps/client/src/styles/ghostfolio-style'; :host { display: block; min-height: 100vh; + footer { + background-color: rgba(var(--palette-foreground-text), 0.05); + font-size: 90%; + } + main { min-height: 100vh; padding-top: 5rem; @@ -13,9 +18,10 @@ margin-top: -0.5rem; .info-message { - background-color: rgba(0, 0, 0, $alpha-hover); + background-color: rgba(var(--palette-foreground-text), 0.05); border-radius: 2rem; font-size: 80%; + max-width: 100%; .a { color: rgba(var(--palette-primary-500), 1); @@ -24,9 +30,18 @@ } } } +} + +:host-context(.is-dark-theme) { + footer { + background-color: rgba(var(--palette-foreground-text-dark), 0.05); + } - .footer { - height: 5rem; - line-height: 1; + main { + .info-message-container { + .info-message { + background-color: rgba(var(--palette-foreground-text-dark), 0.05); + } + } } } diff --git a/apps/client/src/app/app.component.ts b/apps/client/src/app/app.component.ts index 957dc8f5a..6a8a3a64d 100644 --- a/apps/client/src/app/app.component.ts +++ b/apps/client/src/app/app.component.ts @@ -1,20 +1,17 @@ +import { DOCUMENT } from '@angular/common'; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, + Inject, OnDestroy, OnInit } from '@angular/core'; +import { Title } from '@angular/platform-browser'; import { NavigationEnd, PRIMARY_OUTLET, Router } from '@angular/router'; -import { - primaryColorHex, - secondaryColorHex, - warnColorHex -} from '@ghostfolio/common/config'; import { InfoItem, User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { ColorScheme } from '@ghostfolio/common/types'; -import { MaterialCssVarsService } from 'angular-material-css-vars'; import { DeviceDetectorService } from 'ngx-device-detector'; import { Subject } from 'rxjs'; import { filter, takeUntil } from 'rxjs/operators'; @@ -35,7 +32,12 @@ export class AppComponent implements OnDestroy, OnInit { public currentRoute: string; public currentYear = new Date().getFullYear(); public deviceType: string; + public hasPermissionForBlog: boolean; + public hasPermissionForStatistics: boolean; + public hasPermissionForSubscription: boolean; + public hasPermissionToAccessFearAndGreedIndex: boolean; public info: InfoItem; + public pageTitle: string; public user: User; public version = environment.version; @@ -45,8 +47,9 @@ export class AppComponent implements OnDestroy, OnInit { private changeDetectorRef: ChangeDetectorRef, private dataService: DataService, private deviceService: DeviceDetectorService, - private materialCssVarsService: MaterialCssVarsService, + @Inject(DOCUMENT) private document: Document, private router: Router, + private title: Title, private tokenStorageService: TokenStorageService, private userService: UserService ) { @@ -56,6 +59,27 @@ export class AppComponent implements OnDestroy, OnInit { public ngOnInit() { 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 + ); + + this.hasPermissionForStatistics = hasPermission( + this.info?.globalPermissions, + permissions.enableStatistics + ); + + this.hasPermissionToAccessFearAndGreedIndex = hasPermission( + this.info?.globalPermissions, + permissions.enableFearAndGreedIndex + ); this.router.events .pipe(filter((event) => event instanceof NavigationEnd)) @@ -65,7 +89,18 @@ export class AppComponent implements OnDestroy, OnInit { const urlSegments = urlSegmentGroup.segments; this.currentRoute = urlSegments[0].path; - this.info = this.dataService.fetchInfo(); + if (this.deviceType === 'mobile') { + setTimeout(() => { + const index = this.title.getTitle().indexOf('–'); + const title = + index === -1 + ? '' + : this.title.getTitle().substring(0, index).trim(); + this.pageTitle = title.length <= 15 ? title : 'Ghostfolio'; + + this.changeDetectorRef.markForCheck(); + }); + } }); this.userService.stateChanged @@ -88,11 +123,15 @@ export class AppComponent implements OnDestroy, OnInit { this.tokenStorageService.signOut(); } + public onShowSystemMessage() { + alert(this.info.systemMessage); + } + public onSignOut() { this.tokenStorageService.signOut(); this.userService.remove(); - document.location.href = '/'; + document.location.href = `/${document.documentElement.lang}`; } public ngOnDestroy() { @@ -105,16 +144,20 @@ export class AppComponent implements OnDestroy, OnInit { ? userPreferredColorScheme === 'DARK' : window.matchMedia('(prefers-color-scheme: dark)').matches; - this.materialCssVarsService.setDarkTheme(isDarkTheme); + this.toggleThemeStyleClass(isDarkTheme); window.matchMedia('(prefers-color-scheme: dark)').addListener((event) => { if (!this.user?.settings.colorScheme) { - this.materialCssVarsService.setDarkTheme(event.matches); + this.toggleThemeStyleClass(event.matches); } }); + } - this.materialCssVarsService.setPrimaryColor(primaryColorHex); - this.materialCssVarsService.setAccentColor(secondaryColorHex); - this.materialCssVarsService.setWarnColor(warnColorHex); + private toggleThemeStyleClass(isDarkTheme: boolean) { + if (isDarkTheme) { + this.document.body.classList.add('is-dark-theme'); + } else { + this.document.body.classList.remove('is-dark-theme'); + } } } diff --git a/apps/client/src/app/app.module.ts b/apps/client/src/app/app.module.ts index 695612864..a5f0d755c 100644 --- a/apps/client/src/app/app.module.ts +++ b/apps/client/src/app/app.module.ts @@ -10,9 +10,11 @@ import { MatNativeDateModule } from '@angular/material/core'; import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { MatTooltipModule } from '@angular/material/tooltip'; import { BrowserModule } from '@angular/platform-browser'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { MaterialCssVarsModule } from 'angular-material-css-vars'; +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'; @@ -23,6 +25,7 @@ import { DateFormats } from './adapter/date-formats'; import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; import { GfHeaderModule } from './components/header/header.module'; +import { GfSubscriptionInterstitialDialogModule } from './components/subscription-interstitial-dialog/subscription-interstitial-dialog.module'; import { authInterceptorProviders } from './core/auth.interceptor'; import { httpResponseInterceptorProviders } from './core/http-response.interceptor'; import { LanguageService } from './core/language.service'; @@ -38,19 +41,21 @@ export function NgxStripeFactory(): string { BrowserAnimationsModule, BrowserModule, GfHeaderModule, + GfLogoModule, + GfSubscriptionInterstitialDialogModule, HttpClientModule, MarkdownModule.forRoot(), MatAutocompleteModule, MatChipsModule, - MaterialCssVarsModule.forRoot({ - darkThemeClass: 'is-dark-theme', - isAutoContrast: true, - lightThemeClass: 'is-light-theme' - }), MatNativeDateModule, MatSnackBarModule, + MatTooltipModule, NgxSkeletonLoaderModule, - NgxStripeModule.forRoot(environment.stripePublicKey) + NgxStripeModule.forRoot(environment.stripePublicKey), + ServiceWorkerModule.register('ngsw-worker.js', { + enabled: environment.production, + registrationStrategy: 'registerImmediately' + }) ], providers: [ authInterceptorProviders, diff --git a/apps/client/src/app/components/access-table/access-table.component.html b/apps/client/src/app/components/access-table/access-table.component.html index 5b54156ce..589c67e1f 100644 --- a/apps/client/src/app/components/access-table/access-table.component.html +++ b/apps/client/src/app/components/access-table/access-table.component.html @@ -47,7 +47,7 @@ [matMenuTriggerFor]="transactionMenu" (click)="$event.stopPropagation()" > - +
+
+ Cash Balance +
+
+ Equity +
Account Type
-
+
Activities
+ + + + + + + - + - + - @@ -70,8 +105,9 @@ @@ -104,8 +140,9 @@ @@ -140,6 +177,7 @@ *matHeaderCellDef class="d-lg-none d-xl-none px-1 text-right" mat-header-cell + mat-sort-header > Value @@ -169,6 +207,30 @@ + + + + + + - - + +
+
+ +
+
Name + Name + (Default) TotalTotal + Currency @@ -31,7 +56,12 @@ - + Platform @@ -53,7 +83,12 @@ - + # Activities Cash Balance Value + + @@ -178,7 +240,7 @@ [matMenuTriggerFor]="accountMenu" (click)="$event.stopPropagation()" > - + @@ -35,7 +24,21 @@ - + @@ -102,12 +105,12 @@ - + diff --git a/apps/client/src/app/components/admin-jobs/admin-jobs.scss b/apps/client/src/app/components/admin-jobs/admin-jobs.scss index b97d286cc..b5b58f67e 100644 --- a/apps/client/src/app/components/admin-jobs/admin-jobs.scss +++ b/apps/client/src/app/components/admin-jobs/admin-jobs.scss @@ -1,4 +1,4 @@ -@import '~apps/client/src/styles/ghostfolio-style'; +@import 'apps/client/src/styles/ghostfolio-style'; :host { display: block; diff --git a/apps/client/src/app/components/admin-market-data-detail/admin-market-data-detail.component.html b/apps/client/src/app/components/admin-market-data-detail/admin-market-data-detail.component.html index f7204d02f..dc64ed120 100644 --- a/apps/client/src/app/components/admin-market-data-detail/admin-market-data-detail.component.html +++ b/apps/client/src/app/components/admin-market-data-detail/admin-market-data-detail.component.html @@ -1,6 +1,7 @@
-

Details for {{ data.symbol }}

-
+

Details for {{ data.symbol }}

+
Date @@ -11,7 +11,7 @@ [matDatepicker]="date" [(ngModel)]="data.date" /> - +
-
+
Market Price - + {{ data.currency }} +
diff --git a/apps/client/src/app/components/admin-market-data-detail/market-data-detail-dialog/market-data-detail-dialog.scss b/apps/client/src/app/components/admin-market-data-detail/market-data-detail-dialog/market-data-detail-dialog.scss index 91922978c..b63df0134 100644 --- a/apps/client/src/app/components/admin-market-data-detail/market-data-detail-dialog/market-data-detail-dialog.scss +++ b/apps/client/src/app/components/admin-market-data-detail/market-data-detail-dialog/market-data-detail-dialog.scss @@ -1,23 +1,7 @@ :host { display: block; - .mat-dialog-content { + .mat-mdc-dialog-content { max-height: unset; - - .mat-form-field-appearance-outline { - ::ng-deep { - .mat-form-field-suffix { - top: -0.3rem; - } - - .mat-form-field-wrapper { - padding-bottom: 0; - } - } - - ion-icon { - font-size: 130%; - } - } } } diff --git a/apps/client/src/app/components/admin-market-data/admin-market-data.component.ts b/apps/client/src/app/components/admin-market-data/admin-market-data.component.ts index d5f2e90c9..37c7a666a 100644 --- a/apps/client/src/app/components/admin-market-data/admin-market-data.component.ts +++ b/apps/client/src/app/components/admin-market-data/admin-market-data.component.ts @@ -1,4 +1,5 @@ import { + AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, @@ -7,23 +8,26 @@ import { ViewChild } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; -import { MatSort } from '@angular/material/sort'; +import { MatPaginator, PageEvent } from '@angular/material/paginator'; +import { MatSort, Sort } from '@angular/material/sort'; import { MatTableDataSource } from '@angular/material/table'; import { ActivatedRoute, Router } from '@angular/router'; import { AdminService } from '@ghostfolio/client/services/admin.service'; -import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; -import { DATE_FORMAT, getDateFormatString } from '@ghostfolio/common/helper'; +import { DEFAULT_PAGE_SIZE } from '@ghostfolio/common/config'; +import { getDateFormatString } from '@ghostfolio/common/helper'; import { Filter, UniqueAsset, User } from '@ghostfolio/common/interfaces'; import { AdminMarketDataItem } from '@ghostfolio/common/interfaces/admin-market-data.interface'; -import { AssetSubClass, DataSource } from '@prisma/client'; -import { format, parseISO } from 'date-fns'; +import { translate } from '@ghostfolio/ui/i18n'; +import { AssetSubClass, DataSource, Prisma } from '@prisma/client'; import { DeviceDetectorService } from 'ngx-device-detector'; import { Subject } from 'rxjs'; import { distinctUntilChanged, switchMap, takeUntil } from 'rxjs/operators'; import { AssetProfileDialog } from './asset-profile-dialog/asset-profile-dialog.component'; import { AssetProfileDialogParams } from './asset-profile-dialog/interfaces/interfaces'; +import { CreateAssetProfileDialog } from './create-asset-profile-dialog/create-asset-profile-dialog.component'; +import { CreateAssetProfileDialogParams } from './create-asset-profile-dialog/interfaces/interfaces'; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, @@ -31,7 +35,10 @@ import { AssetProfileDialogParams } from './asset-profile-dialog/interfaces/inte styleUrls: ['./admin-market-data.scss'], templateUrl: './admin-market-data.html' }) -export class AdminMarketDataComponent implements OnDestroy, OnInit { +export class AdminMarketDataComponent + implements AfterViewInit, OnDestroy, OnInit +{ + @ViewChild(MatPaginator) paginator: MatPaginator; @ViewChild(MatSort) sort: MatSort; public activeFilters: Filter[] = []; @@ -44,10 +51,10 @@ export class AdminMarketDataComponent implements OnDestroy, OnInit { AssetSubClass.PRECIOUS_METAL, AssetSubClass.PRIVATE_EQUITY, AssetSubClass.STOCK - ].map((id) => { + ].map((assetSubClass) => { return { - id, - label: id, + id: assetSubClass, + label: translate(assetSubClass), type: 'ASSET_SUB_CLASS' }; }); @@ -63,15 +70,18 @@ export class AdminMarketDataComponent implements OnDestroy, OnInit { 'assetClass', 'assetSubClass', 'date', - 'activityCount', + 'activitiesCount', 'marketDataItemCount', - 'countriesCount', 'sectorsCount', + 'countriesCount', + 'comment', 'actions' ]; public filters$ = new Subject(); public isLoading = false; public placeholder = ''; + public pageSize = DEFAULT_PAGE_SIZE; + public totalItems = 0; public user: User; private unsubscribeSubject = new Subject(); @@ -79,7 +89,6 @@ export class AdminMarketDataComponent implements OnDestroy, OnInit { public constructor( private adminService: AdminService, private changeDetectorRef: ChangeDetectorRef, - private dataService: DataService, private deviceService: DeviceDetectorService, private dialog: MatDialog, private route: ActivatedRoute, @@ -96,9 +105,10 @@ export class AdminMarketDataComponent implements OnDestroy, OnInit { ) { this.openAssetProfileDialog({ dataSource: params['dataSource'], - dateOfFirstActivity: params['dateOfFirstActivity'], symbol: params['symbol'] }); + } else if (params['createAssetProfileDialog']) { + this.openCreateAssetProfileDialog(); } }); @@ -113,39 +123,74 @@ export class AdminMarketDataComponent implements OnDestroy, OnInit { ); } }); + + this.filters$ + .pipe(distinctUntilChanged(), takeUntil(this.unsubscribeSubject)) + .subscribe((filters) => { + this.activeFilters = filters; + + this.loadData(); + }); + } + + public ngAfterViewInit() { + this.sort.sortChange.subscribe( + ({ active: sortColumn, direction }: Sort) => { + this.paginator.pageIndex = 0; + + this.loadData({ + sortColumn, + sortDirection: direction, + pageIndex: this.paginator.pageIndex + }); + } + ); } public ngOnInit() { this.deviceType = this.deviceService.getDeviceInfo().deviceType; + } - this.filters$ - .pipe( - distinctUntilChanged(), - switchMap((filters) => { - this.isLoading = true; - this.activeFilters = filters; - this.placeholder = - this.activeFilters.length <= 0 ? $localize`Filter by...` : ''; - - return this.dataService.fetchAdminMarketData({ - filters: this.activeFilters - }); - }), - takeUntil(this.unsubscribeSubject) - ) - .subscribe(({ marketData }) => { - this.dataSource = new MatTableDataSource(marketData); - this.dataSource.sort = this.sort; + public onChangePage(page: PageEvent) { + this.loadData({ + pageIndex: page.pageIndex, + sortColumn: this.sort.active, + sortDirection: this.sort.direction + }); + } - this.isLoading = false; + public onDeleteProfileData({ dataSource, symbol }: UniqueAsset) { + this.adminService + .deleteProfileData({ dataSource, symbol }) + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe(() => {}); + } - this.changeDetectorRef.markForCheck(); + public onGather7Days() { + this.adminService + .gather7Days() + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe(() => { + setTimeout(() => { + window.location.reload(); + }, 300); }); } - public onDeleteProfileData({ dataSource, symbol }: UniqueAsset) { + public onGatherMax() { this.adminService - .deleteProfileData({ dataSource, symbol }) + .gatherMax() + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe(() => { + setTimeout(() => { + window.location.reload(); + }, 300); + }); + } + + public onGatherProfileData() { + this.adminService + .gatherProfileData() .pipe(takeUntil(this.unsubscribeSubject)) .subscribe(() => {}); } @@ -164,18 +209,9 @@ export class AdminMarketDataComponent implements OnDestroy, OnInit { .subscribe(() => {}); } - public onOpenAssetProfileDialog({ - dataSource, - dateOfFirstActivity, - symbol - }: UniqueAsset & { dateOfFirstActivity: string }) { - try { - dateOfFirstActivity = format(parseISO(dateOfFirstActivity), DATE_FORMAT); - } catch {} - + public onOpenAssetProfileDialog({ dataSource, symbol }: UniqueAsset) { this.router.navigate([], { queryParams: { - dateOfFirstActivity, dataSource, symbol, assetProfileDialog: true @@ -188,13 +224,52 @@ export class AdminMarketDataComponent implements OnDestroy, OnInit { this.unsubscribeSubject.complete(); } + private loadData( + { + pageIndex, + sortColumn, + sortDirection + }: { + pageIndex: number; + sortColumn?: string; + sortDirection?: Prisma.SortOrder; + } = { pageIndex: 0 } + ) { + this.isLoading = true; + + if (pageIndex === 0 && this.paginator) { + this.paginator.pageIndex = 0; + } + + this.placeholder = + this.activeFilters.length <= 0 ? $localize`Filter by...` : ''; + + this.adminService + .fetchAdminMarketData({ + sortColumn, + sortDirection, + filters: this.activeFilters, + skip: pageIndex * this.pageSize, + take: this.pageSize + }) + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe(({ count, marketData }) => { + this.totalItems = count; + + this.dataSource = new MatTableDataSource(marketData); + this.dataSource.sort = this.sort; + + this.isLoading = false; + + this.changeDetectorRef.markForCheck(); + }); + } + private openAssetProfileDialog({ dataSource, - dateOfFirstActivity, symbol }: { dataSource: DataSource; - dateOfFirstActivity: string; symbol: string; }) { this.userService @@ -207,7 +282,6 @@ export class AdminMarketDataComponent implements OnDestroy, OnInit { autoFocus: false, data: { dataSource, - dateOfFirstActivity, symbol, deviceType: this.deviceType, locale: this.user?.settings?.locale @@ -224,4 +298,53 @@ export class AdminMarketDataComponent implements OnDestroy, OnInit { }); }); } + + private openCreateAssetProfileDialog() { + this.userService + .get() + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe((user) => { + this.user = user; + + const dialogRef = this.dialog.open(CreateAssetProfileDialog, { + autoFocus: false, + data: { + deviceType: this.deviceType, + locale: this.user?.settings?.locale + }, + width: this.deviceType === 'mobile' ? '100vw' : '50rem' + }); + + dialogRef + .afterClosed() + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe(({ dataSource, symbol }) => { + if (dataSource && symbol) { + this.adminService + .addAssetProfile({ dataSource, symbol }) + .pipe( + switchMap(() => { + this.isLoading = true; + this.changeDetectorRef.markForCheck(); + + return this.adminService.fetchAdminMarketData({ + filters: this.activeFilters, + take: this.pageSize + }); + }), + takeUntil(this.unsubscribeSubject) + ) + .subscribe(({ marketData }) => { + this.dataSource = new MatTableDataSource(marketData); + this.dataSource.sort = this.sort; + this.isLoading = false; + + this.changeDetectorRef.markForCheck(); + }); + } + + this.router.navigate(['.'], { relativeTo: this.route }); + }); + }); + } } diff --git a/apps/client/src/app/components/admin-market-data/admin-market-data.html b/apps/client/src/app/components/admin-market-data/admin-market-data.html index 5ae602b3c..80ba30a2a 100644 --- a/apps/client/src/app/components/admin-market-data/admin-market-data.html +++ b/apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -13,10 +13,10 @@
Created Finished Status + + + + +
@@ -56,7 +56,7 @@ - - + - + + + + + - - - - + - - +
+ First Activity @@ -64,17 +64,17 @@ - Activity Count + Activities Count - {{ element.activityCount }} + {{ element.activitiesCount }} + Historical Data @@ -82,8 +82,17 @@ + Sectors Count + + {{ element.sectorsCount }} + + Countries Count @@ -91,42 +100,52 @@ - Sectors Count - - {{ element.sectorsCount }} + + + + - - - + + + + +
+ + + + + +
+ + + +
diff --git a/apps/client/src/app/components/admin-market-data/admin-market-data.module.ts b/apps/client/src/app/components/admin-market-data/admin-market-data.module.ts index 3aa4a0f46..060e8a6b0 100644 --- a/apps/client/src/app/components/admin-market-data/admin-market-data.module.ts +++ b/apps/client/src/app/components/admin-market-data/admin-market-data.module.ts @@ -2,12 +2,16 @@ import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; import { MatMenuModule } from '@angular/material/menu'; +import { MatPaginatorModule } from '@angular/material/paginator'; import { MatSortModule } from '@angular/material/sort'; import { MatTableModule } from '@angular/material/table'; +import { RouterModule } from '@angular/router'; import { GfActivitiesFilterModule } from '@ghostfolio/ui/activities-filter/activities-filter.module'; +import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { AdminMarketDataComponent } from './admin-market-data.component'; -import { GfAssetProfileDialogModule } from './asset-profile-dialog/assset-profile-dialog.module'; +import { GfAssetProfileDialogModule } from './asset-profile-dialog/asset-profile-dialog.module'; +import { GfCreateAssetProfileDialogModule } from './create-asset-profile-dialog/create-asset-profile-dialog.module'; @NgModule({ declarations: [AdminMarketDataComponent], @@ -15,10 +19,14 @@ import { GfAssetProfileDialogModule } from './asset-profile-dialog/assset-profil CommonModule, GfActivitiesFilterModule, GfAssetProfileDialogModule, + GfCreateAssetProfileDialogModule, MatButtonModule, MatMenuModule, + MatPaginatorModule, MatSortModule, - MatTableModule + MatTableModule, + NgxSkeletonLoaderModule, + RouterModule ], schemas: [CUSTOM_ELEMENTS_SCHEMA] }) diff --git a/apps/client/src/app/components/admin-market-data/admin-market-data.scss b/apps/client/src/app/components/admin-market-data/admin-market-data.scss index b97d286cc..50901445b 100644 --- a/apps/client/src/app/components/admin-market-data/admin-market-data.scss +++ b/apps/client/src/app/components/admin-market-data/admin-market-data.scss @@ -1,5 +1,12 @@ -@import '~apps/client/src/styles/ghostfolio-style'; +@import 'apps/client/src/styles/ghostfolio-style'; :host { display: block; + + .fab-container { + bottom: 2rem; + position: fixed; + right: 2rem; + z-index: 999; + } } diff --git a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.scss b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.scss index ce1c7d599..b63df0134 100644 --- a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.scss +++ b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.scss @@ -1,7 +1,7 @@ :host { display: block; - .mat-dialog-content { + .mat-mdc-dialog-content { max-height: unset; } } diff --git a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts index 3d718cd96..be1892e91 100644 --- a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts +++ b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts @@ -6,10 +6,18 @@ import { OnDestroy, OnInit } from '@angular/core'; +import { FormBuilder } from '@angular/forms'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { UpdateAssetProfileDto } from '@ghostfolio/api/app/admin/update-asset-profile.dto'; import { AdminService } from '@ghostfolio/client/services/admin.service'; -import { UniqueAsset } from '@ghostfolio/common/interfaces'; -import { MarketData } from '@prisma/client'; +import { DataService } from '@ghostfolio/client/services/data.service'; +import { + AdminMarketDataDetails, + ScraperConfiguration, + UniqueAsset +} from '@ghostfolio/common/interfaces'; +import { translate } from '@ghostfolio/ui/i18n'; +import { MarketData, SymbolProfile } from '@prisma/client'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; @@ -23,51 +31,162 @@ import { AssetProfileDialogParams } from './interfaces/interfaces'; styleUrls: ['./asset-profile-dialog.component.scss'] }) export class AssetProfileDialog implements OnDestroy, OnInit { + public assetClass: string; + public assetProfile: AdminMarketDataDetails['assetProfile']; + public assetProfileForm = this.formBuilder.group({ + comment: '', + scraperConfiguration: '', + symbolMapping: '' + }); + public assetSubClass: string; + public benchmarks: Partial[]; + public countries: { + [code: string]: { name: string; value: number }; + }; + public isBenchmark = false; public marketDataDetails: MarketData[] = []; + public sectors: { + [name: string]: { name: string; value: number }; + }; private unsubscribeSubject = new Subject(); public constructor( private adminService: AdminService, private changeDetectorRef: ChangeDetectorRef, + @Inject(MAT_DIALOG_DATA) public data: AssetProfileDialogParams, + private dataService: DataService, public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: AssetProfileDialogParams + private formBuilder: FormBuilder ) {} public ngOnInit(): void { + this.benchmarks = this.dataService.fetchInfo().benchmarks; + this.initialize(); } + public initialize() { + this.adminService + .fetchAdminMarketDataBySymbol({ + dataSource: this.data.dataSource, + symbol: this.data.symbol + }) + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe(({ assetProfile, marketData }) => { + this.assetProfile = assetProfile; + + this.assetClass = translate(this.assetProfile?.assetClass); + this.assetSubClass = translate(this.assetProfile?.assetSubClass); + this.countries = {}; + this.isBenchmark = this.benchmarks.some(({ id }) => { + return id === this.assetProfile.id; + }); + this.marketDataDetails = marketData; + this.sectors = {}; + + if (assetProfile?.countries?.length > 0) { + for (const country of assetProfile.countries) { + this.countries[country.code] = { + name: country.name, + value: country.weight + }; + } + } + + if (assetProfile?.sectors?.length > 0) { + for (const sector of assetProfile.sectors) { + this.sectors[sector.name] = { + name: sector.name, + value: sector.weight + }; + } + } + + this.assetProfileForm.setValue({ + comment: this.assetProfile?.comment ?? '', + scraperConfiguration: JSON.stringify( + this.assetProfile?.scraperConfiguration ?? {} + ), + symbolMapping: JSON.stringify(this.assetProfile?.symbolMapping ?? {}) + }); + + this.assetProfileForm.markAsPristine(); + + this.changeDetectorRef.markForCheck(); + }); + } + public onClose(): void { this.dialogRef.close(); } + public onGatherProfileDataBySymbol({ dataSource, symbol }: UniqueAsset) { + this.adminService + .gatherProfileDataBySymbol({ dataSource, symbol }) + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe(() => {}); + } + + public onGatherSymbol({ dataSource, symbol }: UniqueAsset) { + this.adminService + .gatherSymbol({ dataSource, symbol }) + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe(() => {}); + } + public onMarketDataChanged(withRefresh: boolean = false) { if (withRefresh) { this.initialize(); } } - public ngOnDestroy() { - this.unsubscribeSubject.next(); - this.unsubscribeSubject.complete(); + public onSetBenchmark({ dataSource, symbol }: UniqueAsset) { + this.dataService + .postBenchmark({ dataSource, symbol }) + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe(() => { + setTimeout(() => { + window.location.reload(); + }, 300); + }); } - private fetchAdminMarketDataBySymbol({ dataSource, symbol }: UniqueAsset) { - this.adminService - .fetchAdminMarketDataBySymbol({ dataSource, symbol }) - .pipe(takeUntil(this.unsubscribeSubject)) - .subscribe(({ marketData }) => { - this.marketDataDetails = marketData; + public onSubmit() { + let scraperConfiguration = {}; + let symbolMapping = {}; - this.changeDetectorRef.markForCheck(); + try { + scraperConfiguration = JSON.parse( + this.assetProfileForm.controls['scraperConfiguration'].value + ); + } catch {} + + try { + symbolMapping = JSON.parse( + this.assetProfileForm.controls['symbolMapping'].value + ); + } catch {} + + const assetProfileData: UpdateAssetProfileDto = { + scraperConfiguration, + symbolMapping, + comment: this.assetProfileForm.controls['comment'].value ?? null + }; + + this.adminService + .patchAssetProfile({ + ...assetProfileData, + dataSource: this.data.dataSource, + symbol: this.data.symbol + }) + .subscribe(() => { + this.initialize(); }); } - private initialize() { - this.fetchAdminMarketDataBySymbol({ - dataSource: this.data.dataSource, - symbol: this.data.symbol - }); + public ngOnDestroy() { + this.unsubscribeSubject.next(); + this.unsubscribeSubject.complete(); } } diff --git a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html index f5f7a632d..be99df7cb 100644 --- a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html +++ b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1,24 +1,201 @@ - +
+
+

+ {{ assetProfile?.name ?? data.symbol }} +

+ + + + + + + +
-
- -
+
+ +
+
+ Symbol +
+
+ Currency +
+
+ First Activity +
+
+ Activities +
+
+ Asset Class +
+
+ Asset Sub Class +
+ + +
+ Sector +
+
+ Country +
+
+ +
+
Sectors
+ +
+
+
Countries
+ +
+
+
+
+
+ + Symbol Mapping + + +
+
+ + Scraper Configuration + + +
+
+ + Note + + +
+
- +
+ + +
+
diff --git a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/assset-profile-dialog.module.ts b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.module.ts similarity index 52% rename from apps/client/src/app/components/admin-market-data/asset-profile-dialog/assset-profile-dialog.module.ts rename to apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.module.ts index 7ec657efc..8672342b0 100644 --- a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/assset-profile-dialog.module.ts +++ b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.module.ts @@ -1,10 +1,14 @@ +import { TextFieldModule } from '@angular/cdk/text-field'; import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { MatButtonModule } from '@angular/material/button'; import { MatDialogModule } from '@angular/material/dialog'; +import { MatInputModule } from '@angular/material/input'; +import { MatMenuModule } from '@angular/material/menu'; import { GfAdminMarketDataDetailModule } from '@ghostfolio/client/components/admin-market-data-detail/admin-market-data-detail.module'; -import { GfDialogFooterModule } from '@ghostfolio/client/components/dialog-footer/dialog-footer.module'; -import { GfDialogHeaderModule } from '@ghostfolio/client/components/dialog-header/dialog-header.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'; @@ -12,11 +16,16 @@ import { AssetProfileDialog } from './asset-profile-dialog.component'; declarations: [AssetProfileDialog], imports: [ CommonModule, + FormsModule, GfAdminMarketDataDetailModule, - GfDialogFooterModule, - GfDialogHeaderModule, + GfPortfolioProportionChartModule, + GfValueModule, MatButtonModule, - MatDialogModule + MatDialogModule, + MatInputModule, + MatMenuModule, + ReactiveFormsModule, + TextFieldModule ], schemas: [CUSTOM_ELEMENTS_SCHEMA] }) diff --git a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/interfaces/interfaces.ts b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/interfaces/interfaces.ts index 05c70f749..c230a39ee 100644 --- a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/interfaces/interfaces.ts +++ b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/interfaces/interfaces.ts @@ -1,7 +1,6 @@ import { DataSource } from '@prisma/client'; export interface AssetProfileDialogParams { - dateOfFirstActivity: string; dataSource: DataSource; deviceType: string; locale: string; 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 new file mode 100644 index 000000000..c3c2fb2eb --- /dev/null +++ b/apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.component.ts @@ -0,0 +1,53 @@ +import { + ChangeDetectionStrategy, + ChangeDetectorRef, + Component, + Inject, + OnDestroy, + OnInit +} from '@angular/core'; +import { + FormBuilder, + FormControl, + FormGroup, + Validators +} from '@angular/forms'; +import { MatDialogRef } from '@angular/material/dialog'; +import { AdminService } from '@ghostfolio/client/services/admin.service'; + +@Component({ + changeDetection: ChangeDetectionStrategy.OnPush, + host: { class: 'h-100' }, + selector: 'gf-create-asset-profile-dialog', + templateUrl: 'create-asset-profile-dialog.html' +}) +export class CreateAssetProfileDialog implements OnInit, OnDestroy { + public createAssetProfileForm: FormGroup; + + public constructor( + public readonly adminService: AdminService, + public readonly changeDetectorRef: ChangeDetectorRef, + public readonly dialogRef: MatDialogRef, + public readonly formBuilder: FormBuilder + ) {} + + public ngOnInit() { + this.createAssetProfileForm = this.formBuilder.group({ + searchSymbol: new FormControl(null, [Validators.required]) + }); + } + + public onCancel() { + this.dialogRef.close(); + } + + public onSubmit() { + this.dialogRef.close({ + dataSource: + this.createAssetProfileForm.controls['searchSymbol'].value.dataSource, + symbol: this.createAssetProfileForm.controls['searchSymbol'].value.symbol + }); + } + + public ngOnDestroy() {} +} 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 new file mode 100644 index 000000000..43eadf93e --- /dev/null +++ b/apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -0,0 +1,28 @@ +
+

Add Asset Profile

+
+ + Name, symbol or ISIN + + +
+
+ + +
+
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 new file mode 100644 index 000000000..e99d8f788 --- /dev/null +++ b/apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.module.ts @@ -0,0 +1,24 @@ +import { CommonModule } from '@angular/common'; +import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatDialogModule } from '@angular/material/dialog'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { GfSymbolAutocompleteModule } from '@ghostfolio/ui/symbol-autocomplete'; + +import { CreateAssetProfileDialog } from './create-asset-profile-dialog.component'; + +@NgModule({ + declarations: [CreateAssetProfileDialog], + imports: [ + CommonModule, + FormsModule, + GfSymbolAutocompleteModule, + MatDialogModule, + MatButtonModule, + MatFormFieldModule, + ReactiveFormsModule + ], + schemas: [CUSTOM_ELEMENTS_SCHEMA] +}) +export class GfCreateAssetProfileDialogModule {} diff --git a/apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/interfaces/interfaces.ts b/apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/interfaces/interfaces.ts new file mode 100644 index 000000000..16be906c9 --- /dev/null +++ b/apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/interfaces/interfaces.ts @@ -0,0 +1,4 @@ +export interface CreateAssetProfileDialogParams { + deviceType: string; + locale: string; +} 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 d80d409b3..2053c4298 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,5 @@ import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; -import { MatSlideToggleChange } from '@angular/material/slide-toggle'; +import { MatCheckboxChange } from '@angular/material/checkbox'; import { AdminService } from '@ghostfolio/client/services/admin.service'; import { CacheService } from '@ghostfolio/client/services/cache.service'; import { DataService } from '@ghostfolio/client/services/data.service'; @@ -8,7 +8,9 @@ import { PROPERTY_COUPONS, PROPERTY_CURRENCIES, PROPERTY_IS_READ_ONLY_MODE, - PROPERTY_SYSTEM_MESSAGE + PROPERTY_IS_USER_SIGNUP_ENABLED, + PROPERTY_SYSTEM_MESSAGE, + ghostfolioPrefix } from '@ghostfolio/common/config'; import { Coupon, InfoItem, User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; @@ -28,7 +30,7 @@ import { takeUntil } from 'rxjs/operators'; templateUrl: './admin-overview.html' }) export class AdminOverviewComponent implements OnDestroy, OnInit { - public couponDuration: StringValue = '30 days'; + public couponDuration: StringValue = '14 days'; public coupons: Coupon[]; public customCurrencies: string[]; public exchangeRates: { label1: string; label2: string; value: number }[]; @@ -36,6 +38,7 @@ export class AdminOverviewComponent implements OnDestroy, OnInit { public hasPermissionForSystemMessage: boolean; public hasPermissionToToggleReadOnlyMode: boolean; public info: InfoItem; + public permissions = permissions; public transactionCount: number; public userCount: number; public user: User; @@ -97,7 +100,10 @@ export class AdminOverviewComponent implements OnDestroy, OnInit { public onAddCoupon() { const coupons = [ ...this.coupons, - { code: this.generateCouponCode(16), duration: this.couponDuration } + { + code: `${ghostfolioPrefix}${this.generateCouponCode(14)}`, + duration: this.couponDuration + } ]; this.putAdminSetting({ key: PROPERTY_COUPONS, value: coupons }); } @@ -162,42 +168,20 @@ export class AdminOverviewComponent implements OnDestroy, OnInit { } } - public onGather7Days() { - this.adminService - .gather7Days() - .pipe(takeUntil(this.unsubscribeSubject)) - .subscribe(() => { - setTimeout(() => { - window.location.reload(); - }, 300); - }); - } - - public onGatherMax() { - this.adminService - .gatherMax() - .pipe(takeUntil(this.unsubscribeSubject)) - .subscribe(() => { - setTimeout(() => { - window.location.reload(); - }, 300); - }); - } - - public onGatherProfileData() { - this.adminService - .gatherProfileData() - .pipe(takeUntil(this.unsubscribeSubject)) - .subscribe(() => {}); - } - - public onReadOnlyModeChange(aEvent: MatSlideToggleChange) { + public onReadOnlyModeChange(aEvent: MatCheckboxChange) { this.putAdminSetting({ key: PROPERTY_IS_READ_ONLY_MODE, value: aEvent.checked ? true : undefined }); } + public onEnableUserSignupModeChange(aEvent: MatCheckboxChange) { + this.putAdminSetting({ + key: PROPERTY_IS_USER_SIGNUP_ENABLED, + value: aEvent.checked ? undefined : false + }); + } + public onSetSystemMessage() { const systemMessage = prompt($localize`Please set your system message:`); @@ -215,7 +199,7 @@ export class AdminOverviewComponent implements OnDestroy, OnInit { } private fetchAdminData() { - this.dataService + this.adminService .fetchAdminData() .pipe(takeUntil(this.unsubscribeSubject)) .subscribe(({ exchangeRates, settings, transactionCount, userCount }) => { @@ -245,7 +229,7 @@ export class AdminOverviewComponent implements OnDestroy, OnInit { private putAdminSetting({ key, value }: { key: string; value: any }) { this.dataService .putAdminSetting(key, { - value: value ? JSON.stringify(value) : undefined + value: value || value === false ? JSON.stringify(value) : undefined }) .pipe(takeUntil(this.unsubscribeSubject)) .subscribe(() => { 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 798afa139..0f4127e51 100644 --- a/apps/client/src/app/components/admin-overview/admin-overview.html +++ b/apps/client/src/app/components/admin-overview/admin-overview.html @@ -1,7 +1,7 @@
-
+
- +
User Count
@@ -27,53 +27,6 @@
-
-
Data Management
-
-
-
- -
-
- -
-
- -
-
-
-
Exchange Rates
@@ -98,7 +51,7 @@
-
-
Read-only Mode
-
- -
-
Coupons
-
- {{ coupon.code }} ({{ coupon.duration }}) - -
+ + + + + + +
{{ coupon.code }} + {{ coupon.duration }} + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
+ Name + + + {{ element.name }} + + Url + + {{ element.url }} + + Accounts + + {{ element.accountCount }} + + + + + + +
+
+
+
diff --git a/apps/client/src/app/components/admin-platform/admin-platform.component.scss b/apps/client/src/app/components/admin-platform/admin-platform.component.scss new file mode 100644 index 000000000..b5b58f67e --- /dev/null +++ b/apps/client/src/app/components/admin-platform/admin-platform.component.scss @@ -0,0 +1,5 @@ +@import 'apps/client/src/styles/ghostfolio-style'; + +:host { + display: block; +} diff --git a/apps/client/src/app/components/admin-platform/admin-platform.component.ts b/apps/client/src/app/components/admin-platform/admin-platform.component.ts new file mode 100644 index 000000000..f3fbb348d --- /dev/null +++ b/apps/client/src/app/components/admin-platform/admin-platform.component.ts @@ -0,0 +1,203 @@ +import { + ChangeDetectionStrategy, + ChangeDetectorRef, + Component, + OnDestroy, + OnInit, + ViewChild +} from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; +import { MatSort } from '@angular/material/sort'; +import { MatTableDataSource } from '@angular/material/table'; +import { ActivatedRoute, Router } from '@angular/router'; +import { CreatePlatformDto } from '@ghostfolio/api/app/platform/create-platform.dto'; +import { UpdatePlatformDto } from '@ghostfolio/api/app/platform/update-platform.dto'; +import { AdminService } from '@ghostfolio/client/services/admin.service'; +import { UserService } from '@ghostfolio/client/services/user/user.service'; +import { Platform } from '@prisma/client'; +import { get } from 'lodash'; +import { DeviceDetectorService } from 'ngx-device-detector'; +import { Subject, takeUntil } from 'rxjs'; + +import { CreateOrUpdatePlatformDialog } from './create-or-update-platform-dialog/create-or-update-account-platform.component'; + +@Component({ + changeDetection: ChangeDetectionStrategy.OnPush, + selector: 'gf-admin-platform', + styleUrls: ['./admin-platform.component.scss'], + templateUrl: './admin-platform.component.html' +}) +export class AdminPlatformComponent implements OnInit, OnDestroy { + @ViewChild(MatSort) sort: MatSort; + + public dataSource: MatTableDataSource = new MatTableDataSource(); + public deviceType: string; + public displayedColumns = ['name', 'url', 'accounts', 'actions']; + public platforms: Platform[]; + + private unsubscribeSubject = new Subject(); + + public constructor( + private adminService: AdminService, + private changeDetectorRef: ChangeDetectorRef, + private deviceService: DeviceDetectorService, + private dialog: MatDialog, + private route: ActivatedRoute, + private router: Router, + private userService: UserService + ) { + this.route.queryParams + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe((params) => { + if (params['createPlatformDialog']) { + this.openCreatePlatformDialog(); + } else if (params['editPlatformDialog']) { + if (this.platforms) { + const platform = this.platforms.find(({ id }) => { + return id === params['platformId']; + }); + + this.openUpdatePlatformDialog(platform); + } else { + this.router.navigate(['.'], { relativeTo: this.route }); + } + } + }); + } + + public ngOnInit() { + this.deviceType = this.deviceService.getDeviceInfo().deviceType; + + this.fetchPlatforms(); + } + + public onDeletePlatform(aId: string) { + const confirmation = confirm( + $localize`Do you really want to delete this platform?` + ); + + if (confirmation) { + this.deletePlatform(aId); + } + } + + public onUpdatePlatform({ id }: Platform) { + this.router.navigate([], { + queryParams: { editPlatformDialog: true, platformId: id } + }); + } + + public ngOnDestroy() { + this.unsubscribeSubject.next(); + this.unsubscribeSubject.complete(); + } + + private deletePlatform(aId: string) { + this.adminService + .deletePlatform(aId) + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe({ + next: () => { + this.userService + .get(true) + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe(); + + this.fetchPlatforms(); + } + }); + } + + private fetchPlatforms() { + this.adminService + .fetchPlatforms() + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe((platforms) => { + this.platforms = platforms; + this.dataSource = new MatTableDataSource(platforms); + this.dataSource.sort = this.sort; + this.dataSource.sortingDataAccessor = get; + + this.changeDetectorRef.markForCheck(); + }); + } + + private openCreatePlatformDialog() { + const dialogRef = this.dialog.open(CreateOrUpdatePlatformDialog, { + data: { + platform: { + name: null, + url: null + } + }, + + height: this.deviceType === 'mobile' ? '97.5vh' : '80vh', + width: this.deviceType === 'mobile' ? '100vw' : '50rem' + }); + + dialogRef + .afterClosed() + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe((data) => { + const platform: CreatePlatformDto = data?.platform; + + if (platform) { + this.adminService + .postPlatform(platform) + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe({ + next: () => { + this.userService + .get(true) + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe(); + + this.fetchPlatforms(); + } + }); + } + + this.router.navigate(['.'], { relativeTo: this.route }); + }); + } + + private openUpdatePlatformDialog({ id, name, url }) { + const dialogRef = this.dialog.open(CreateOrUpdatePlatformDialog, { + data: { + platform: { + id, + name, + url + } + }, + + height: this.deviceType === 'mobile' ? '97.5vh' : '80vh', + width: this.deviceType === 'mobile' ? '100vw' : '50rem' + }); + + dialogRef + .afterClosed() + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe((data) => { + const platform: UpdatePlatformDto = data?.platform; + + if (platform) { + this.adminService + .putPlatform(platform) + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe({ + next: () => { + this.userService + .get(true) + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe(); + + this.fetchPlatforms(); + } + }); + } + + this.router.navigate(['.'], { relativeTo: this.route }); + }); + } +} diff --git a/apps/client/src/app/components/admin-platform/admin-platform.module.ts b/apps/client/src/app/components/admin-platform/admin-platform.module.ts new file mode 100644 index 000000000..cec98c5ac --- /dev/null +++ b/apps/client/src/app/components/admin-platform/admin-platform.module.ts @@ -0,0 +1,28 @@ +import { CommonModule } from '@angular/common'; +import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatSortModule } from '@angular/material/sort'; +import { MatTableModule } from '@angular/material/table'; +import { RouterModule } from '@angular/router'; +import { GfSymbolIconModule } from '@ghostfolio/client/components/symbol-icon/symbol-icon.module'; + +import { AdminPlatformComponent } from './admin-platform.component'; +import { GfCreateOrUpdatePlatformDialogModule } from './create-or-update-platform-dialog/create-or-update-platform-dialog.module'; + +@NgModule({ + declarations: [AdminPlatformComponent], + exports: [AdminPlatformComponent], + imports: [ + CommonModule, + GfCreateOrUpdatePlatformDialogModule, + GfSymbolIconModule, + MatButtonModule, + MatMenuModule, + MatSortModule, + MatTableModule, + RouterModule + ], + schemas: [CUSTOM_ELEMENTS_SCHEMA] +}) +export class GfAdminPlatformModule {} diff --git a/apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-account-platform.component.ts b/apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-account-platform.component.ts new file mode 100644 index 000000000..55d466a9a --- /dev/null +++ b/apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-account-platform.component.ts @@ -0,0 +1,30 @@ +import { ChangeDetectionStrategy, Component, Inject } from '@angular/core'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { Subject } from 'rxjs'; + +import { CreateOrUpdatePlatformDialogParams } from './interfaces/interfaces'; + +@Component({ + changeDetection: ChangeDetectionStrategy.OnPush, + host: { class: 'h-100' }, + selector: 'gf-create-or-update-platform-dialog', + styleUrls: ['./create-or-update-platform-dialog.scss'], + templateUrl: 'create-or-update-platform-dialog.html' +}) +export class CreateOrUpdatePlatformDialog { + private unsubscribeSubject = new Subject(); + + public constructor( + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: CreateOrUpdatePlatformDialogParams + ) {} + + public onCancel() { + this.dialogRef.close(); + } + + public ngOnDestroy() { + this.unsubscribeSubject.next(); + this.unsubscribeSubject.complete(); + } +} diff --git a/apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html b/apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html new file mode 100644 index 000000000..06f6ab72e --- /dev/null +++ b/apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -0,0 +1,29 @@ + +

Update platform

+

Add platform

+
+
+ + Name + + +
+
+ + Url + + +
+
+
+ + +
+ diff --git a/apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.module.ts b/apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.module.ts new file mode 100644 index 000000000..cbc74b9cf --- /dev/null +++ b/apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.module.ts @@ -0,0 +1,23 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatDialogModule } from '@angular/material/dialog'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; + +import { CreateOrUpdatePlatformDialog } from './create-or-update-account-platform.component'; + +@NgModule({ + declarations: [CreateOrUpdatePlatformDialog], + imports: [ + CommonModule, + FormsModule, + MatButtonModule, + MatDialogModule, + MatFormFieldModule, + MatInputModule, + ReactiveFormsModule + ] +}) +export class GfCreateOrUpdatePlatformDialogModule {} diff --git a/apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.scss b/apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.scss new file mode 100644 index 000000000..b63df0134 --- /dev/null +++ b/apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.scss @@ -0,0 +1,7 @@ +:host { + display: block; + + .mat-mdc-dialog-content { + max-height: unset; + } +} diff --git a/apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/interfaces/interfaces.ts b/apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/interfaces/interfaces.ts new file mode 100644 index 000000000..be4af5407 --- /dev/null +++ b/apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/interfaces/interfaces.ts @@ -0,0 +1,5 @@ +import { Platform } from '@prisma/client'; + +export interface CreateOrUpdatePlatformDialogParams { + platform: Platform; +} diff --git a/apps/client/src/app/components/admin-settings/admin-settings.component.html b/apps/client/src/app/components/admin-settings/admin-settings.component.html new file mode 100644 index 000000000..aa4395b27 --- /dev/null +++ b/apps/client/src/app/components/admin-settings/admin-settings.component.html @@ -0,0 +1,15 @@ +
+
+
+

Platforms

+ +
+
+ +
diff --git a/apps/client/src/app/components/admin-settings/admin-settings.component.scss b/apps/client/src/app/components/admin-settings/admin-settings.component.scss new file mode 100644 index 000000000..b5b58f67e --- /dev/null +++ b/apps/client/src/app/components/admin-settings/admin-settings.component.scss @@ -0,0 +1,5 @@ +@import 'apps/client/src/styles/ghostfolio-style'; + +:host { + display: block; +} diff --git a/apps/client/src/app/components/admin-settings/admin-settings.component.ts b/apps/client/src/app/components/admin-settings/admin-settings.component.ts new file mode 100644 index 000000000..97066d533 --- /dev/null +++ b/apps/client/src/app/components/admin-settings/admin-settings.component.ts @@ -0,0 +1,27 @@ +import { + ChangeDetectionStrategy, + Component, + OnDestroy, + OnInit +} from '@angular/core'; +import { Subject } from 'rxjs'; + +@Component({ + changeDetection: ChangeDetectionStrategy.OnPush, + host: { class: 'page' }, + selector: 'gf-admin-settings', + styleUrls: ['./admin-settings.component.scss'], + templateUrl: './admin-settings.component.html' +}) +export class AdminSettingsComponent implements OnInit, OnDestroy { + private unsubscribeSubject = new Subject(); + + public constructor() {} + + public ngOnInit() {} + + public ngOnDestroy() { + this.unsubscribeSubject.next(); + this.unsubscribeSubject.complete(); + } +} diff --git a/apps/client/src/app/components/admin-settings/admin-settings.module.ts b/apps/client/src/app/components/admin-settings/admin-settings.module.ts new file mode 100644 index 000000000..aaa16651f --- /dev/null +++ b/apps/client/src/app/components/admin-settings/admin-settings.module.ts @@ -0,0 +1,13 @@ +import { CommonModule } from '@angular/common'; +import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { GfAdminPlatformModule } from '@ghostfolio/client/components/admin-platform/admin-platform.module'; + +import { AdminSettingsComponent } from './admin-settings.component'; + +@NgModule({ + declarations: [AdminSettingsComponent], + imports: [CommonModule, GfAdminPlatformModule, RouterModule], + schemas: [CUSTOM_ELEMENTS_SCHEMA] +}) +export class GfAdminSettingsModule {} diff --git a/apps/client/src/app/components/admin-users/admin-users.component.ts b/apps/client/src/app/components/admin-users/admin-users.component.ts index 7f2a34d2b..48783c91b 100644 --- a/apps/client/src/app/components/admin-users/admin-users.component.ts +++ b/apps/client/src/app/components/admin-users/admin-users.component.ts @@ -1,7 +1,11 @@ import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; +import { AdminService } from '@ghostfolio/client/services/admin.service'; 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 { AdminData, User } from '@ghostfolio/common/interfaces'; +import { getDateFormatString, getEmojiFlag } from '@ghostfolio/common/helper'; +import { AdminData, InfoItem, User } from '@ghostfolio/common/interfaces'; +import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { differenceInSeconds, formatDistanceToNowStrict, @@ -16,21 +20,44 @@ import { takeUntil } from 'rxjs/operators'; templateUrl: './admin-users.html' }) export class AdminUsersComponent implements OnDestroy, OnInit { + public defaultDateFormat: string; + public getEmojiFlag = getEmojiFlag; + public hasPermissionForSubscription: boolean; + public hasPermissionToImpersonateAllUsers: boolean; + public info: InfoItem; public user: User; public users: AdminData['users']; private unsubscribeSubject = new Subject(); public constructor( + private adminService: AdminService, private changeDetectorRef: ChangeDetectorRef, private dataService: DataService, + private impersonationStorageService: ImpersonationStorageService, private userService: UserService ) { + this.info = this.dataService.fetchInfo(); + + this.hasPermissionForSubscription = hasPermission( + this.info?.globalPermissions, + permissions.enableSubscription + ); + this.userService.stateChanged .pipe(takeUntil(this.unsubscribeSubject)) .subscribe((state) => { if (state?.user) { this.user = state.user; + + this.defaultDateFormat = getDateFormatString( + this.user.settings.locale + ); + + this.hasPermissionToImpersonateAllUsers = hasPermission( + this.user.permissions, + permissions.impersonateAllUsers + ); } }); } @@ -71,13 +98,23 @@ export class AdminUsersComponent implements OnDestroy, OnInit { } } + public onImpersonateUser(aId: string) { + if (aId) { + this.impersonationStorageService.setId(aId); + } else { + this.impersonationStorageService.removeId(); + } + + window.location.reload(); + } + public ngOnDestroy() { this.unsubscribeSubject.next(); this.unsubscribeSubject.complete(); } private fetchAdminData() { - this.dataService + this.adminService .fetchAdminData() .pipe(takeUntil(this.unsubscribeSubject)) .subscribe(({ users }) => { diff --git a/apps/client/src/app/components/admin-users/admin-users.html b/apps/client/src/app/components/admin-users/admin-users.html index d9a9dba9d..71166a6e1 100644 --- a/apps/client/src/app/components/admin-users/admin-users.html +++ b/apps/client/src/app/components/admin-users/admin-users.html @@ -4,60 +4,91 @@
- - - - + + + + - - - - - + + - - - + + - + - - - - - diff --git a/apps/client/src/app/components/admin-users/admin-users.scss b/apps/client/src/app/components/admin-users/admin-users.scss index a3916f727..f06a9d825 100644 --- a/apps/client/src/app/components/admin-users/admin-users.scss +++ b/apps/client/src/app/components/admin-users/admin-users.scss @@ -1,4 +1,4 @@ -@import '~apps/client/src/styles/ghostfolio-style'; +@import 'apps/client/src/styles/ghostfolio-style'; :host { display: block; @@ -9,8 +9,8 @@ table { min-width: 100%; - .mat-row, - .mat-header-row { + .mat-mdc-row, + .mat-mdc-header-row { width: 100%; } } diff --git a/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.html b/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.html index 95b7e272f..0db0f92fd 100644 --- a/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.html +++ b/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.html @@ -1,6 +1,8 @@
-
+
Performance Compare with... @@ -27,6 +29,12 @@ [value]="symbolProfile.id" >{{ symbolProfile.name }} + Manage Benchmarks
diff --git a/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts b/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts index ff3a5169a..9a6bd1d30 100644 --- a/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts +++ b/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -23,10 +23,12 @@ import { parseDate } from '@ghostfolio/common/helper'; import { LineChartItem, User } from '@ghostfolio/common/interfaces'; +import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { ColorScheme } from '@ghostfolio/common/types'; import { SymbolProfile } from '@prisma/client'; import { Chart, + ChartData, LineController, LineElement, LinearScale, @@ -57,7 +59,8 @@ export class BenchmarkComparatorComponent implements OnChanges, OnDestroy { @ViewChild('chartCanvas') chartCanvas; - public chart: Chart; + public chart: Chart<'line'>; + public hasPermissionToAccessAdminControl: boolean; public constructor() { Chart.register( @@ -75,6 +78,11 @@ export class BenchmarkComparatorComponent implements OnChanges, OnDestroy { } public ngOnChanges() { + this.hasPermissionToAccessAdminControl = hasPermission( + this.user?.permissions, + permissions.accessAdminControl + ); + if (this.performanceDataItems) { this.initialize(); } @@ -89,14 +97,14 @@ export class BenchmarkComparatorComponent implements OnChanges, OnDestroy { } private initialize() { - const data = { + const data: ChartData<'line'> = { datasets: [ { backgroundColor: `rgb(${primaryColorRgb.r}, ${primaryColorRgb.g}, ${primaryColorRgb.b})`, borderColor: `rgb(${primaryColorRgb.r}, ${primaryColorRgb.g}, ${primaryColorRgb.b})`, borderWidth: 2, data: this.performanceDataItems.map(({ date, value }) => { - return { x: parseDate(date), y: value }; + return { x: parseDate(date).getTime(), y: value }; }), label: $localize`Portfolio` }, @@ -105,7 +113,7 @@ export class BenchmarkComparatorComponent implements OnChanges, OnDestroy { borderColor: `rgb(${secondaryColorRgb.r}, ${secondaryColorRgb.g}, ${secondaryColorRgb.b})`, borderWidth: 2, data: this.benchmarkDataItems.map(({ date, value }) => { - return { x: parseDate(date), y: value }; + return { x: parseDate(date).getTime(), y: value }; }), label: $localize`Benchmark` } @@ -159,11 +167,12 @@ export class BenchmarkComparatorComponent implements OnChanges, OnDestroy { responsive: true, scales: { x: { + border: { + color: `rgba(${getTextColor(this.colorScheme)}, 0.1)`, + width: 1 + }, display: true, grid: { - borderColor: `rgba(${getTextColor(this.colorScheme)}, 0.1)`, - borderWidth: 1, - color: `rgba(${getTextColor(this.colorScheme)}, 0.8)`, display: false }, type: 'time', @@ -173,17 +182,27 @@ export class BenchmarkComparatorComponent implements OnChanges, OnDestroy { } }, y: { + border: { + width: 0 + }, display: true, grid: { - borderColor: `rgba(${getTextColor(this.colorScheme)}, 0.1)`, - color: `rgba(${getTextColor(this.colorScheme)}, 0.8)`, - display: false, - drawBorder: false + color: ({ scale, tick }) => { + if ( + tick.value === 0 || + tick.value === scale.max || + tick.value === scale.min + ) { + return `rgba(${getTextColor(this.colorScheme)}, 0.1)`; + } + + return 'transparent'; + } }, position: 'right', ticks: { callback: (value: number) => { - return `${value} %`; + return `${value.toFixed(2)} %`; }, display: true, mirror: true, diff --git a/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.module.ts b/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.module.ts index 16440d3a3..5280404dd 100644 --- a/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.module.ts +++ b/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.module.ts @@ -2,6 +2,8 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { MatSelectModule } from '@angular/material/select'; +import { RouterModule } from '@angular/router'; +import { GfPremiumIndicatorModule } from '@ghostfolio/ui/premium-indicator'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { BenchmarkComparatorComponent } from './benchmark-comparator.component'; @@ -12,9 +14,11 @@ import { BenchmarkComparatorComponent } from './benchmark-comparator.component'; imports: [ CommonModule, FormsModule, + GfPremiumIndicatorModule, MatSelectModule, NgxSkeletonLoaderModule, - ReactiveFormsModule + ReactiveFormsModule, + RouterModule ] }) export class GfBenchmarkComparatorModule {} diff --git a/apps/client/src/app/components/dialog-footer/dialog-footer.component.scss b/apps/client/src/app/components/dialog-footer/dialog-footer.component.scss index d0b820035..087f82daa 100644 --- a/apps/client/src/app/components/dialog-footer/dialog-footer.component.scss +++ b/apps/client/src/app/components/dialog-footer/dialog-footer.component.scss @@ -3,5 +3,5 @@ flex: 0 0 auto; margin-bottom: 0; min-height: 0; - padding: 0; + padding: 0 !important; } diff --git a/apps/client/src/app/components/header/header.component.html b/apps/client/src/app/components/header/header.component.html index 336bc6d24..16ee7f62c 100644 --- a/apps/client/src/app/components/header/header.component.html +++ b/apps/client/src/app/components/header/header.component.html @@ -1,229 +1,245 @@ - + - Overview - Portfolio - Accounts - Admin Control - Resources - Pricing - About - - - + - + - Features - About - Pricing - Markets - - - Get started - + diff --git a/apps/client/src/app/components/header/header.component.scss b/apps/client/src/app/components/header/header.component.scss index 32d125703..bab302d91 100644 --- a/apps/client/src/app/components/header/header.component.scss +++ b/apps/client/src/app/components/header/header.component.scss @@ -1,4 +1,4 @@ -@import '~apps/client/src/styles/ghostfolio-style'; +@import 'apps/client/src/styles/ghostfolio-style'; :host { display: block; @@ -11,7 +11,9 @@ flex: 1 1 auto; } - .mat-flat-button { + .mdc-button { + height: unset; + &:not(.mat-primary) { background-color: transparent; text-decoration-color: rgba(var(--palette-primary-500), 1) !important; diff --git a/apps/client/src/app/components/header/header.component.ts b/apps/client/src/app/components/header/header.component.ts index 9e17b59ad..d109ed5cf 100644 --- a/apps/client/src/app/components/header/header.component.ts +++ b/apps/client/src/app/components/header/header.component.ts @@ -30,6 +30,7 @@ import { catchError, takeUntil } from 'rxjs/operators'; export class HeaderComponent implements OnChanges { @Input() currentRoute: string; @Input() info: InfoItem; + @Input() pageTitle: string; @Input() user: User; @Output() signOut = new EventEmitter(); @@ -38,6 +39,7 @@ export class HeaderComponent implements OnChanges { public hasPermissionForSubscription: boolean; public hasPermissionToAccessAdminControl: boolean; public hasPermissionToAccessFearAndGreedIndex: boolean; + public hasPermissionToCreateUser: boolean; public impersonationId: string; public isMenuOpen: boolean; @@ -54,8 +56,8 @@ export class HeaderComponent implements OnChanges { this.impersonationStorageService .onChangeHasImpersonation() .pipe(takeUntil(this.unsubscribeSubject)) - .subscribe((id) => { - this.impersonationId = id; + .subscribe((impersonationId) => { + this.impersonationId = impersonationId; }); } @@ -79,6 +81,11 @@ export class HeaderComponent implements OnChanges { this.info?.globalPermissions, permissions.enableFearAndGreedIndex ); + + this.hasPermissionToCreateUser = hasPermission( + this.info?.globalPermissions, + permissions.createUserAccount + ); } public impersonateAccount(aId: string) { diff --git a/apps/client/src/app/components/home-holdings/home-holdings.component.ts b/apps/client/src/app/components/home-holdings/home-holdings.component.ts index 4125ef614..a83e71e88 100644 --- a/apps/client/src/app/components/home-holdings/home-holdings.component.ts +++ b/apps/client/src/app/components/home-holdings/home-holdings.component.ts @@ -78,8 +78,8 @@ export class HomeHoldingsComponent implements OnDestroy, OnInit { this.impersonationStorageService .onChangeHasImpersonation() .pipe(takeUntil(this.unsubscribeSubject)) - .subscribe((aId) => { - this.hasImpersonationId = !!aId; + .subscribe((impersonationId) => { + this.hasImpersonationId = !!impersonationId; }); this.update(); diff --git a/apps/client/src/app/components/home-holdings/home-holdings.html b/apps/client/src/app/components/home-holdings/home-holdings.html index 3740f0c6b..5cac8cb3f 100644 --- a/apps/client/src/app/components/home-holdings/home-holdings.html +++ b/apps/client/src/app/components/home-holdings/home-holdings.html @@ -9,8 +9,8 @@
- - + + (); diff --git a/apps/client/src/app/components/home-market/home-market.html b/apps/client/src/app/components/home-market/home-market.html index 331d6f83c..cf6603be2 100644 --- a/apps/client/src/app/components/home-market/home-market.html +++ b/apps/client/src/app/components/home-market/home-market.html @@ -1,5 +1,5 @@
-

Markets

+

Markets

@@ -10,6 +10,7 @@ symbol="Fear & Greed Index" yMax="100" yMin="0" + [colorScheme]="user?.settings?.colorScheme" [historicalDataItems]="historicalDataItems" [isAnimated]="true" [locale]="user?.settings?.locale" diff --git a/apps/client/src/app/components/home-market/home-market.scss b/apps/client/src/app/components/home-market/home-market.scss index 2d7ffa0dd..f9e5e6275 100644 --- a/apps/client/src/app/components/home-market/home-market.scss +++ b/apps/client/src/app/components/home-market/home-market.scss @@ -1,4 +1,4 @@ -@import '~apps/client/src/styles/ghostfolio-style'; +@import 'apps/client/src/styles/ghostfolio-style'; :host { display: block; diff --git a/apps/client/src/app/components/home-overview/home-overview.component.ts b/apps/client/src/app/components/home-overview/home-overview.component.ts index eb8f0c81c..2e3f1269f 100644 --- a/apps/client/src/app/components/home-overview/home-overview.component.ts +++ b/apps/client/src/app/components/home-overview/home-overview.component.ts @@ -66,8 +66,8 @@ export class HomeOverviewComponent implements OnDestroy, OnInit { this.impersonationStorageService .onChangeHasImpersonation() .pipe(takeUntil(this.unsubscribeSubject)) - .subscribe((aId) => { - this.hasImpersonationId = !!aId; + .subscribe((impersonationId) => { + this.hasImpersonationId = !!impersonationId; this.changeDetectorRef.markForCheck(); }); @@ -110,13 +110,12 @@ export class HomeOverviewComponent implements OnDestroy, OnInit { range: this.user?.settings?.dateRange }) .pipe(takeUntil(this.unsubscribeSubject)) - .subscribe((response) => { - this.errors = response.errors; - this.hasError = response.hasErrors; - this.performance = response.performance; + .subscribe(({ chart, errors, performance }) => { + this.errors = errors; + this.performance = performance; this.isLoadingPerformance = false; - this.historicalDataItems = response.chart.map( + this.historicalDataItems = chart.map( ({ date, netPerformanceInPercentage }) => { return { date, diff --git a/apps/client/src/app/components/home-overview/home-overview.html b/apps/client/src/app/components/home-overview/home-overview.html index 9a0cbb54c..6c0644021 100644 --- a/apps/client/src/app/components/home-overview/home-overview.html +++ b/apps/client/src/app/components/home-overview/home-overview.html @@ -37,7 +37,6 @@ [baseCurrency]="user?.settings?.baseCurrency" [deviceType]="deviceType" [errors]="errors" - [hasError]="hasError" [isAllTimeHigh]="isAllTimeHigh" [isAllTimeLow]="isAllTimeLow" [isLoading]="isLoadingPerformance" diff --git a/apps/client/src/app/components/home-overview/home-overview.scss b/apps/client/src/app/components/home-overview/home-overview.scss index ac86f6909..92f086c5f 100644 --- a/apps/client/src/app/components/home-overview/home-overview.scss +++ b/apps/client/src/app/components/home-overview/home-overview.scss @@ -1,7 +1,8 @@ -@import '~apps/client/src/styles/ghostfolio-style'; +@import 'apps/client/src/styles/ghostfolio-style'; :host { display: block; + height: 100%; .chart-container { aspect-ratio: 16 / 9; diff --git a/apps/client/src/app/components/home-summary/home-summary.component.ts b/apps/client/src/app/components/home-summary/home-summary.component.ts index f10f09fe3..6ea7b8847 100644 --- a/apps/client/src/app/components/home-summary/home-summary.component.ts +++ b/apps/client/src/app/components/home-summary/home-summary.component.ts @@ -69,8 +69,8 @@ export class HomeSummaryComponent implements OnDestroy, OnInit { this.impersonationStorageService .onChangeHasImpersonation() .pipe(takeUntil(this.unsubscribeSubject)) - .subscribe((aId) => { - this.hasImpersonationId = !!aId; + .subscribe((impersonationId) => { + this.hasImpersonationId = !!impersonationId; }); } diff --git a/apps/client/src/app/components/home-summary/home-summary.html b/apps/client/src/app/components/home-summary/home-summary.html index 9401db451..cb6050992 100644 --- a/apps/client/src/app/components/home-summary/home-summary.html +++ b/apps/client/src/app/components/home-summary/home-summary.html @@ -1,10 +1,8 @@
+

Summary

- - - Summary - + ; - private data: InvestmentItem[]; + public chart: Chart<'bar' | 'line'>; + private investments: InvestmentItem[]; + private values: LineChartItem[]; public constructor() { Chart.register( @@ -92,34 +96,54 @@ export class InvestmentChartComponent implements OnChanges, OnDestroy { private initialize() { // Create a clone - this.data = this.benchmarkDataItems.map((item) => Object.assign({}, item)); + this.investments = this.benchmarkDataItems.map((item) => + Object.assign({}, item) + ); + this.values = this.historicalDataItems.map((item) => + Object.assign({}, item) + ); + + if (!this.groupBy && this.investments?.length > 0) { + let date: string; - if (!this.groupBy && this.data?.length > 0) { if (this.range === 'max') { // Extend chart by 5% of days in market (before) - const firstItem = this.data[0]; - this.data.unshift({ - ...firstItem, - date: format( - subDays(parseISO(firstItem.date), this.daysInMarket * 0.05 || 90), - DATE_FORMAT + date = format( + subDays( + parseISO(this.investments[0].date), + this.daysInMarket * 0.05 || 90 ), + DATE_FORMAT + ); + this.investments.unshift({ + date, investment: 0 }); + this.values.unshift({ + date, + value: 0 + }); } // Extend chart by 5% of days in market (after) - const lastItem = this.data[this.data.length - 1]; - this.data.push({ - ...lastItem, - date: format( - addDays(parseDate(lastItem.date), this.daysInMarket * 0.05 || 90), - DATE_FORMAT - ) + date = format( + addDays( + parseDate(last(this.investments).date), + this.daysInMarket * 0.05 || 90 + ), + DATE_FORMAT + ); + this.investments.push({ + date, + investment: last(this.investments).investment + }); + this.values.push({ + date, + value: last(this.values).value }); } - const data = { + const chartData: ChartData<'line'> = { labels: this.historicalDataItems.map(({ date }) => { return parseDate(date); }), @@ -128,13 +152,13 @@ export class InvestmentChartComponent implements OnChanges, OnDestroy { backgroundColor: `rgb(${secondaryColorRgb.r}, ${secondaryColorRgb.g}, ${secondaryColorRgb.b})`, borderColor: `rgb(${secondaryColorRgb.r}, ${secondaryColorRgb.g}, ${secondaryColorRgb.b})`, borderWidth: this.groupBy ? 0 : 1, - data: this.data.map(({ date, investment }) => { + data: this.investments.map(({ date, investment }) => { return { - x: parseDate(date), + x: parseDate(date).getTime(), y: this.isInPercent ? investment * 100 : investment }; }), - label: $localize`Deposit`, + label: this.benchmarkDataLabel, segment: { borderColor: (context: unknown) => this.isInFuture( @@ -148,29 +172,54 @@ export class InvestmentChartComponent implements OnChanges, OnDestroy { { borderColor: `rgb(${primaryColorRgb.r}, ${primaryColorRgb.g}, ${primaryColorRgb.b})`, borderWidth: 2, - data: this.historicalDataItems.map(({ date, value }) => { + data: this.values.map(({ date, value }) => { return { - x: parseDate(date), + x: parseDate(date).getTime(), y: this.isInPercent ? value * 100 : value }; }), fill: false, label: $localize`Total Amount`, - pointRadius: 0 + pointRadius: 0, + segment: { + borderColor: (context: unknown) => + this.isInFuture( + context, + `rgba(${primaryColorRgb.r}, ${primaryColorRgb.g}, ${primaryColorRgb.b}, 0.67)` + ), + borderDash: (context: unknown) => this.isInFuture(context, [2, 2]) + } } ] }; if (this.chartCanvas) { if (this.chart) { - this.chart.data = data; + this.chart.data = chartData; this.chart.options.plugins.tooltip = ( this.getTooltipPluginConfiguration() ); + this.chart.options.scales.x.min = this.daysInMarket + ? subDays( + new Date().setHours(0, 0, 0, 0), + this.daysInMarket + ).toISOString() + : undefined; + + if ( + this.savingsRate && + // @ts-ignore + this.chart.options.plugins.annotation.annotations.savingsRate + ) { + // @ts-ignore + this.chart.options.plugins.annotation.annotations.savingsRate.value = + this.savingsRate; + } + this.chart.update(); } else { this.chart = new Chart(this.chartCanvas.nativeElement, { - data, + data: chartData, options: { animation: false, elements: { @@ -230,13 +279,18 @@ export class InvestmentChartComponent implements OnChanges, OnDestroy { responsive: true, scales: { x: { + border: { + color: `rgba(${getTextColor(this.colorScheme)}, 0.1)`, + width: this.groupBy ? 0 : 1 + }, display: true, grid: { - borderColor: `rgba(${getTextColor(this.colorScheme)}, 0.1)`, - borderWidth: this.groupBy ? 0 : 1, - color: `rgba(${getTextColor(this.colorScheme)}, 0.8)`, display: false }, + min: this.daysInMarket + ? subDays(new Date(), this.daysInMarket).toISOString() + : undefined, + suggestedMax: new Date().toISOString(), type: 'time', time: { tooltipFormat: getDateFormatString(this.locale), @@ -244,12 +298,22 @@ export class InvestmentChartComponent implements OnChanges, OnDestroy { } }, y: { + border: { + display: false + }, display: !this.isInPercent, grid: { - borderColor: `rgba(${getTextColor(this.colorScheme)}, 0.1)`, - color: `rgba(${getTextColor(this.colorScheme)}, 0.8)`, - display: false, - drawBorder: false + color: ({ scale, tick }) => { + if ( + tick.value === 0 || + tick.value === scale.max || + tick.value === scale.min + ) { + return `rgba(${getTextColor(this.colorScheme)}, 0.1)`; + } + + return 'transparent'; + } }, position: 'right', ticks: { @@ -277,6 +341,7 @@ export class InvestmentChartComponent implements OnChanges, OnDestroy { ...getTooltipOptions({ colorScheme: this.colorScheme, currency: this.isInPercent ? undefined : this.currency, + groupBy: this.groupBy, locale: this.isInPercent ? undefined : this.locale, unit: this.isInPercent ? '%' : undefined }), diff --git a/apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html b/apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html index 31f48b4d5..5dfc84a02 100644 --- a/apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html +++ b/apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -4,9 +4,9 @@ (closeButtonClicked)="onClose()" > -
+
- + Security Token + +
(); @@ -22,7 +24,35 @@ export class AdminPageComponent implements OnDestroy, OnInit { this.hasMessage = !!systemMessage; } - public ngOnInit() {} + public ngOnInit() { + this.tabs = [ + { + iconName: 'reader-outline', + label: $localize`Overview`, + path: ['/admin'] + }, + { + iconName: 'settings-outline', + label: $localize`Settings`, + path: ['/admin', 'settings'] + }, + { + iconName: 'server-outline', + label: $localize`Market Data`, + path: ['/admin', 'market-data'] + }, + { + iconName: 'flash-outline', + label: $localize`Jobs`, + path: ['/admin', 'jobs'] + }, + { + iconName: 'people-outline', + label: $localize`Users`, + path: ['/admin', 'users'] + } + ]; + } public ngOnDestroy() { this.unsubscribeSubject.next(); diff --git a/apps/client/src/app/pages/admin/admin-page.html b/apps/client/src/app/pages/admin/admin-page.html index 9ecc38dc2..ce1d84851 100644 --- a/apps/client/src/app/pages/admin/admin-page.html +++ b/apps/client/src/app/pages/admin/admin-page.html @@ -1,19 +1,21 @@ - + + + -
diff --git a/apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.module.ts b/apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.module.ts deleted file mode 100644 index 75eef2a55..000000000 --- a/apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; -import { RouterModule } from '@angular/router'; - -import { HalloGhostfolioPageRoutingModule } from './hallo-ghostfolio-page-routing.module'; -import { HalloGhostfolioPageComponent } from './hallo-ghostfolio-page.component'; - -@NgModule({ - declarations: [HalloGhostfolioPageComponent], - imports: [CommonModule, HalloGhostfolioPageRoutingModule, RouterModule], - schemas: [CUSTOM_ELEMENTS_SCHEMA] -}) -export class HalloGhostfolioPageModule {} diff --git a/apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.scss b/apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.scss deleted file mode 100644 index 5d4e87f30..000000000 --- a/apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.scss +++ /dev/null @@ -1,3 +0,0 @@ -:host { - display: block; -} diff --git a/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.component.ts b/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.component.ts index e9a0a7382..a0537b018 100644 --- a/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.component.ts +++ b/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.component.ts @@ -1,9 +1,12 @@ import { Component } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { RouterModule } from '@angular/router'; @Component({ host: { class: 'page' }, + imports: [MatButtonModule, RouterModule], selector: 'gf-hello-ghostfolio-page', - styleUrls: ['./hello-ghostfolio-page.scss'], + standalone: true, templateUrl: './hello-ghostfolio-page.html' }) export class HelloGhostfolioPageComponent {} diff --git a/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.html b/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.html index 0833edb03..e10e75b79 100644 --- a/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.html +++ b/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.html @@ -125,7 +125,7 @@ feedback, bug reports, feature requests and of course contributions!

- You can reach me by email at + You can reach me by e-mail at hi@ghostfol.io or on Twitter @ghostfolio_.

@@ -177,6 +177,19 @@ +
diff --git a/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.module.ts b/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.module.ts deleted file mode 100644 index a885ef14f..000000000 --- a/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; -import { RouterModule } from '@angular/router'; - -import { HelloGhostfolioPageRoutingModule } from './hello-ghostfolio-page-routing.module'; -import { HelloGhostfolioPageComponent } from './hello-ghostfolio-page.component'; - -@NgModule({ - declarations: [HelloGhostfolioPageComponent], - imports: [CommonModule, HelloGhostfolioPageRoutingModule, RouterModule], - schemas: [CUSTOM_ELEMENTS_SCHEMA] -}) -export class HelloGhostfolioPageModule {} diff --git a/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.scss b/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.scss deleted file mode 100644 index 5d4e87f30..000000000 --- a/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.scss +++ /dev/null @@ -1,3 +0,0 @@ -:host { - display: block; -} diff --git a/apps/client/src/app/pages/blog/2022/01/first-months-in-open-source/first-months-in-open-source-page-routing.module.ts b/apps/client/src/app/pages/blog/2022/01/first-months-in-open-source/first-months-in-open-source-page-routing.module.ts deleted file mode 100644 index 39364ffe7..000000000 --- a/apps/client/src/app/pages/blog/2022/01/first-months-in-open-source/first-months-in-open-source-page-routing.module.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; -import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; - -import { FirstMonthsInOpenSourcePageComponent } from './first-months-in-open-source-page.component'; - -const routes: Routes = [ - { - canActivate: [AuthGuard], - component: FirstMonthsInOpenSourcePageComponent, - path: '', - title: 'First months in Open Source' - } -]; - -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule] -}) -export class FirstMonthsInOpenSourceRoutingModule {} diff --git a/apps/client/src/app/pages/blog/2022/01/first-months-in-open-source/first-months-in-open-source-page.component.ts b/apps/client/src/app/pages/blog/2022/01/first-months-in-open-source/first-months-in-open-source-page.component.ts index 1fe69b79c..b6176e0a0 100644 --- a/apps/client/src/app/pages/blog/2022/01/first-months-in-open-source/first-months-in-open-source-page.component.ts +++ b/apps/client/src/app/pages/blog/2022/01/first-months-in-open-source/first-months-in-open-source-page.component.ts @@ -1,9 +1,12 @@ import { Component } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { RouterModule } from '@angular/router'; @Component({ host: { class: 'page' }, + imports: [MatButtonModule, RouterModule], selector: 'gf-first-months-in-open-source-page', - styleUrls: ['./first-months-in-open-source-page.scss'], + standalone: true, templateUrl: './first-months-in-open-source-page.html' }) export class FirstMonthsInOpenSourcePageComponent {} diff --git a/apps/client/src/app/pages/blog/2022/01/first-months-in-open-source/first-months-in-open-source-page.html b/apps/client/src/app/pages/blog/2022/01/first-months-in-open-source/first-months-in-open-source-page.html index c91c91638..147a30ca5 100644 --- a/apps/client/src/app/pages/blog/2022/01/first-months-in-open-source/first-months-in-open-source-page.html +++ b/apps/client/src/app/pages/blog/2022/01/first-months-in-open-source/first-months-in-open-source-page.html @@ -99,7 +99,7 @@ > of users. In the future, I would like to involve more contributors to further extend the functionality of Ghostfolio (e.g. with new - reports). Get in touch with me by email at + reports). Get in touch with me by e-mail at hi@ghostfol.io or on Twitter @ghostfolio_ if you are interested, I’m happy to discuss ideas. @@ -177,6 +177,19 @@ +
diff --git a/apps/client/src/app/pages/blog/2022/01/first-months-in-open-source/first-months-in-open-source-page.module.ts b/apps/client/src/app/pages/blog/2022/01/first-months-in-open-source/first-months-in-open-source-page.module.ts deleted file mode 100644 index e44bd0ddb..000000000 --- a/apps/client/src/app/pages/blog/2022/01/first-months-in-open-source/first-months-in-open-source-page.module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; -import { RouterModule } from '@angular/router'; - -import { FirstMonthsInOpenSourceRoutingModule } from './first-months-in-open-source-page-routing.module'; -import { FirstMonthsInOpenSourcePageComponent } from './first-months-in-open-source-page.component'; - -@NgModule({ - declarations: [FirstMonthsInOpenSourcePageComponent], - imports: [CommonModule, FirstMonthsInOpenSourceRoutingModule, RouterModule], - schemas: [CUSTOM_ELEMENTS_SCHEMA] -}) -export class FirstMonthsInOpenSourcePageModule {} diff --git a/apps/client/src/app/pages/blog/2022/01/first-months-in-open-source/first-months-in-open-source-page.scss b/apps/client/src/app/pages/blog/2022/01/first-months-in-open-source/first-months-in-open-source-page.scss deleted file mode 100644 index 5d4e87f30..000000000 --- a/apps/client/src/app/pages/blog/2022/01/first-months-in-open-source/first-months-in-open-source-page.scss +++ /dev/null @@ -1,3 +0,0 @@ -:host { - display: block; -} diff --git a/apps/client/src/app/pages/blog/2022/07/ghostfolio-meets-internet-identity/ghostfolio-meets-internet-identity-page-routing.module.ts b/apps/client/src/app/pages/blog/2022/07/ghostfolio-meets-internet-identity/ghostfolio-meets-internet-identity-page-routing.module.ts deleted file mode 100644 index 999d79c3e..000000000 --- a/apps/client/src/app/pages/blog/2022/07/ghostfolio-meets-internet-identity/ghostfolio-meets-internet-identity-page-routing.module.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; -import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; - -import { GhostfolioMeetsInternetIdentityPageComponent } from './ghostfolio-meets-internet-identity-page.component'; - -const routes: Routes = [ - { - canActivate: [AuthGuard], - component: GhostfolioMeetsInternetIdentityPageComponent, - path: '', - title: 'Ghostfolio meets Internet Identity' - } -]; - -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule] -}) -export class GhostfolioMeetsInternetIdentityRoutingModule {} diff --git a/apps/client/src/app/pages/blog/2022/07/ghostfolio-meets-internet-identity/ghostfolio-meets-internet-identity-page.component.ts b/apps/client/src/app/pages/blog/2022/07/ghostfolio-meets-internet-identity/ghostfolio-meets-internet-identity-page.component.ts index 6a83a8f4b..4c451f445 100644 --- a/apps/client/src/app/pages/blog/2022/07/ghostfolio-meets-internet-identity/ghostfolio-meets-internet-identity-page.component.ts +++ b/apps/client/src/app/pages/blog/2022/07/ghostfolio-meets-internet-identity/ghostfolio-meets-internet-identity-page.component.ts @@ -1,9 +1,12 @@ import { Component } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { RouterModule } from '@angular/router'; @Component({ host: { class: 'page' }, + imports: [MatButtonModule, RouterModule], selector: 'gf-ghostfolio-meets-internet-identity-page', - styleUrls: ['./ghostfolio-meets-internet-identity-page.scss'], + standalone: true, templateUrl: './ghostfolio-meets-internet-identity-page.html' }) export class GhostfolioMeetsInternetIdentityPageComponent {} diff --git a/apps/client/src/app/pages/blog/2022/07/ghostfolio-meets-internet-identity/ghostfolio-meets-internet-identity-page.html b/apps/client/src/app/pages/blog/2022/07/ghostfolio-meets-internet-identity/ghostfolio-meets-internet-identity-page.html index 19a6a2577..b78010dd4 100644 --- a/apps/client/src/app/pages/blog/2022/07/ghostfolio-meets-internet-identity/ghostfolio-meets-internet-identity-page.html +++ b/apps/client/src/app/pages/blog/2022/07/ghostfolio-meets-internet-identity/ghostfolio-meets-internet-identity-page.html @@ -7,7 +7,7 @@
2022-07-23
Ghostfolio meets Internet Identity Teaser @@ -64,15 +64,15 @@

When you authenticate with Internet Identity, the service only gets a dedicated pseudonym rather than sensitive user data like - the email address or phone number. This preserves your anonymity and - prevents you being tracked on the Internet. + the e-mail address or phone number. This preserves your anonymity + and prevents you being tracked on the Internet.

The key benefits in a nutshell

  • - Authenticate yourself securely without the need of an email + Authenticate yourself securely without the need of an e-mail address, username, or a password: all you need is your device to log in.
  • @@ -89,7 +89,7 @@

    If you would like to provide feedback or get involved in further - development of Ghostfolio, please get in touch by email via + development of Ghostfolio, please get in touch by e-mail via hi@ghostfol.io or on Twitter @ghostfolio_.

    @@ -177,6 +177,19 @@
+
diff --git a/apps/client/src/app/pages/blog/2022/07/ghostfolio-meets-internet-identity/ghostfolio-meets-internet-identity-page.module.ts b/apps/client/src/app/pages/blog/2022/07/ghostfolio-meets-internet-identity/ghostfolio-meets-internet-identity-page.module.ts deleted file mode 100644 index acdeb9f4a..000000000 --- a/apps/client/src/app/pages/blog/2022/07/ghostfolio-meets-internet-identity/ghostfolio-meets-internet-identity-page.module.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; -import { RouterModule } from '@angular/router'; - -import { GhostfolioMeetsInternetIdentityRoutingModule } from './ghostfolio-meets-internet-identity-page-routing.module'; -import { GhostfolioMeetsInternetIdentityPageComponent } from './ghostfolio-meets-internet-identity-page.component'; - -@NgModule({ - declarations: [GhostfolioMeetsInternetIdentityPageComponent], - imports: [ - CommonModule, - GhostfolioMeetsInternetIdentityRoutingModule, - RouterModule - ], - schemas: [CUSTOM_ELEMENTS_SCHEMA] -}) -export class GhostfolioMeetsInternetIdentityPageModule {} diff --git a/apps/client/src/app/pages/blog/2022/07/ghostfolio-meets-internet-identity/ghostfolio-meets-internet-identity-page.scss b/apps/client/src/app/pages/blog/2022/07/ghostfolio-meets-internet-identity/ghostfolio-meets-internet-identity-page.scss deleted file mode 100644 index 5d4e87f30..000000000 --- a/apps/client/src/app/pages/blog/2022/07/ghostfolio-meets-internet-identity/ghostfolio-meets-internet-identity-page.scss +++ /dev/null @@ -1,3 +0,0 @@ -:host { - display: block; -} diff --git a/apps/client/src/app/pages/blog/2022/07/how-do-i-get-my-finances-in-order/how-do-i-get-my-finances-in-order-page-routing.module.ts b/apps/client/src/app/pages/blog/2022/07/how-do-i-get-my-finances-in-order/how-do-i-get-my-finances-in-order-page-routing.module.ts deleted file mode 100644 index 93dbcb57e..000000000 --- a/apps/client/src/app/pages/blog/2022/07/how-do-i-get-my-finances-in-order/how-do-i-get-my-finances-in-order-page-routing.module.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; -import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; - -import { HowDoIGetMyFinancesInOrderPageComponent } from './how-do-i-get-my-finances-in-order-page.component'; - -const routes: Routes = [ - { - canActivate: [AuthGuard], - component: HowDoIGetMyFinancesInOrderPageComponent, - path: '', - title: 'How do I get my finances in order?' - } -]; - -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule] -}) -export class HowDoIGetMyFinancesInOrderRoutingModule {} diff --git a/apps/client/src/app/pages/blog/2022/07/how-do-i-get-my-finances-in-order/how-do-i-get-my-finances-in-order-page.component.ts b/apps/client/src/app/pages/blog/2022/07/how-do-i-get-my-finances-in-order/how-do-i-get-my-finances-in-order-page.component.ts index 12bd168e6..0f25ca72e 100644 --- a/apps/client/src/app/pages/blog/2022/07/how-do-i-get-my-finances-in-order/how-do-i-get-my-finances-in-order-page.component.ts +++ b/apps/client/src/app/pages/blog/2022/07/how-do-i-get-my-finances-in-order/how-do-i-get-my-finances-in-order-page.component.ts @@ -1,9 +1,12 @@ import { Component } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { RouterModule } from '@angular/router'; @Component({ host: { class: 'page' }, + imports: [MatButtonModule, RouterModule], selector: 'gf-how-do-i-get-my-finances-in-order-page', - styleUrls: ['./how-do-i-get-my-finances-in-order-page.scss'], + standalone: true, templateUrl: './how-do-i-get-my-finances-in-order-page.html' }) export class HowDoIGetMyFinancesInOrderPageComponent {} diff --git a/apps/client/src/app/pages/blog/2022/07/how-do-i-get-my-finances-in-order/how-do-i-get-my-finances-in-order-page.html b/apps/client/src/app/pages/blog/2022/07/how-do-i-get-my-finances-in-order/how-do-i-get-my-finances-in-order-page.html index 63f475380..a9c0085fe 100644 --- a/apps/client/src/app/pages/blog/2022/07/how-do-i-get-my-finances-in-order/how-do-i-get-my-finances-in-order-page.html +++ b/apps/client/src/app/pages/blog/2022/07/how-do-i-get-my-finances-in-order/how-do-i-get-my-finances-in-order-page.html @@ -203,6 +203,19 @@ +
diff --git a/apps/client/src/app/pages/blog/2022/07/how-do-i-get-my-finances-in-order/how-do-i-get-my-finances-in-order-page.module.ts b/apps/client/src/app/pages/blog/2022/07/how-do-i-get-my-finances-in-order/how-do-i-get-my-finances-in-order-page.module.ts deleted file mode 100644 index 9e0b9a4b9..000000000 --- a/apps/client/src/app/pages/blog/2022/07/how-do-i-get-my-finances-in-order/how-do-i-get-my-finances-in-order-page.module.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; -import { RouterModule } from '@angular/router'; - -import { HowDoIGetMyFinancesInOrderRoutingModule } from './how-do-i-get-my-finances-in-order-page-routing.module'; -import { HowDoIGetMyFinancesInOrderPageComponent } from './how-do-i-get-my-finances-in-order-page.component'; - -@NgModule({ - declarations: [HowDoIGetMyFinancesInOrderPageComponent], - imports: [ - CommonModule, - HowDoIGetMyFinancesInOrderRoutingModule, - RouterModule - ], - schemas: [CUSTOM_ELEMENTS_SCHEMA] -}) -export class HowDoIGetMyFinancesInOrderPageModule {} diff --git a/apps/client/src/app/pages/blog/2022/07/how-do-i-get-my-finances-in-order/how-do-i-get-my-finances-in-order-page.scss b/apps/client/src/app/pages/blog/2022/07/how-do-i-get-my-finances-in-order/how-do-i-get-my-finances-in-order-page.scss deleted file mode 100644 index 5d4e87f30..000000000 --- a/apps/client/src/app/pages/blog/2022/07/how-do-i-get-my-finances-in-order/how-do-i-get-my-finances-in-order-page.scss +++ /dev/null @@ -1,3 +0,0 @@ -:host { - display: block; -} diff --git a/apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page-routing.module.ts b/apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page-routing.module.ts deleted file mode 100644 index c64edfab2..000000000 --- a/apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page-routing.module.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; -import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; - -import { FiveHundredStarsOnGitHubPageComponent } from './500-stars-on-github-page.component'; - -const routes: Routes = [ - { - canActivate: [AuthGuard], - component: FiveHundredStarsOnGitHubPageComponent, - path: '', - title: '500 Stars on GitHub' - } -]; - -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule] -}) -export class FiveHundredStarsOnGitHubRoutingModule {} diff --git a/apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.component.ts b/apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.component.ts index de177d9c2..99842efb8 100644 --- a/apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.component.ts +++ b/apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.component.ts @@ -1,9 +1,12 @@ import { Component } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { RouterModule } from '@angular/router'; @Component({ host: { class: 'page' }, + imports: [MatButtonModule, RouterModule], selector: 'gf-500-stars-on-github-page', - styleUrls: ['./500-stars-on-github-page.scss'], + standalone: true, templateUrl: './500-stars-on-github-page.html' }) export class FiveHundredStarsOnGitHubPageComponent {} diff --git a/apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.html b/apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.html index 993755fdd..ba38219c9 100644 --- a/apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.html +++ b/apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.html @@ -62,7 +62,7 @@ new and better Internet based on decentralized blockchains to give power back to the users. Internet Identity created by the Dfinity Foundation enables you to - sign in securely and anonymously to Ghostfolio without an email + sign in securely and anonymously to Ghostfolio without an e-mail address, username, or a password. All you need is your device with built-in biometric authentication.

@@ -90,7 +90,7 @@ onboard more contributors who are actively involved in software engineering to realize the full potential of open source software. If you are a web developer and interested in personal finance, - please get in touch by email via + please get in touch by e-mail via hi@ghostfol.io or on Twitter @ghostfolio_. We are happy to discuss ideas. @@ -189,6 +189,19 @@ +
diff --git a/apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.module.ts b/apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.module.ts deleted file mode 100644 index ffc072ac9..000000000 --- a/apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; -import { RouterModule } from '@angular/router'; - -import { FiveHundredStarsOnGitHubRoutingModule } from './500-stars-on-github-page-routing.module'; -import { FiveHundredStarsOnGitHubPageComponent } from './500-stars-on-github-page.component'; - -@NgModule({ - declarations: [FiveHundredStarsOnGitHubPageComponent], - imports: [CommonModule, FiveHundredStarsOnGitHubRoutingModule, RouterModule], - schemas: [CUSTOM_ELEMENTS_SCHEMA] -}) -export class FiveHundredStarsOnGitHubPageModule {} diff --git a/apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.scss b/apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.scss deleted file mode 100644 index 5d4e87f30..000000000 --- a/apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.scss +++ /dev/null @@ -1,3 +0,0 @@ -:host { - display: block; -} diff --git a/apps/client/src/app/pages/blog/2022/10/hacktoberfest-2022/hacktoberfest-2022-page-routing.module.ts b/apps/client/src/app/pages/blog/2022/10/hacktoberfest-2022/hacktoberfest-2022-page-routing.module.ts deleted file mode 100644 index 7ee6a0cff..000000000 --- a/apps/client/src/app/pages/blog/2022/10/hacktoberfest-2022/hacktoberfest-2022-page-routing.module.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; -import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; - -import { Hacktoberfest2022PageComponent } from './hacktoberfest-2022-page.component'; - -const routes: Routes = [ - { - canActivate: [AuthGuard], - component: Hacktoberfest2022PageComponent, - path: '', - title: 'Hacktoberfest 2022' - } -]; - -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule] -}) -export class Hacktoberfest2022RoutingModule {} diff --git a/apps/client/src/app/pages/blog/2022/10/hacktoberfest-2022/hacktoberfest-2022-page.component.ts b/apps/client/src/app/pages/blog/2022/10/hacktoberfest-2022/hacktoberfest-2022-page.component.ts index 7417a09bf..c84fadddc 100644 --- a/apps/client/src/app/pages/blog/2022/10/hacktoberfest-2022/hacktoberfest-2022-page.component.ts +++ b/apps/client/src/app/pages/blog/2022/10/hacktoberfest-2022/hacktoberfest-2022-page.component.ts @@ -1,9 +1,12 @@ import { Component } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { RouterModule } from '@angular/router'; @Component({ host: { class: 'page' }, + imports: [MatButtonModule, RouterModule], selector: 'gf-hacktoberfest-2022-page', - styleUrls: ['./hacktoberfest-2022-page.scss'], + standalone: true, templateUrl: './hacktoberfest-2022-page.html' }) export class Hacktoberfest2022PageComponent {} diff --git a/apps/client/src/app/pages/blog/2022/10/hacktoberfest-2022/hacktoberfest-2022-page.html b/apps/client/src/app/pages/blog/2022/10/hacktoberfest-2022/hacktoberfest-2022-page.html index f2d9e90b4..a6a4abd40 100644 --- a/apps/client/src/app/pages/blog/2022/10/hacktoberfest-2022/hacktoberfest-2022-page.html +++ b/apps/client/src/app/pages/blog/2022/10/hacktoberfest-2022/hacktoberfest-2022-page.html @@ -80,10 +80,13 @@

Get support

If you have further questions or ideas, please join our growing - Slack community or get in - touch on Twitter + Slack + community or get in touch on Twitter @ghostfolio_ or by - email via hi@ghostfol.io. + e-mail via hi@ghostfol.io.

We look forward to hearing from you.
@@ -172,6 +175,19 @@ +

diff --git a/apps/client/src/app/pages/blog/2022/10/hacktoberfest-2022/hacktoberfest-2022-page.module.ts b/apps/client/src/app/pages/blog/2022/10/hacktoberfest-2022/hacktoberfest-2022-page.module.ts deleted file mode 100644 index fba8a359d..000000000 --- a/apps/client/src/app/pages/blog/2022/10/hacktoberfest-2022/hacktoberfest-2022-page.module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; -import { RouterModule } from '@angular/router'; - -import { Hacktoberfest2022RoutingModule } from './hacktoberfest-2022-page-routing.module'; -import { Hacktoberfest2022PageComponent } from './hacktoberfest-2022-page.component'; - -@NgModule({ - declarations: [Hacktoberfest2022PageComponent], - imports: [CommonModule, Hacktoberfest2022RoutingModule, RouterModule], - schemas: [CUSTOM_ELEMENTS_SCHEMA] -}) -export class Hacktoberfest2022PageModule {} diff --git a/apps/client/src/app/pages/blog/2022/10/hacktoberfest-2022/hacktoberfest-2022-page.scss b/apps/client/src/app/pages/blog/2022/10/hacktoberfest-2022/hacktoberfest-2022-page.scss deleted file mode 100644 index 5d4e87f30..000000000 --- a/apps/client/src/app/pages/blog/2022/10/hacktoberfest-2022/hacktoberfest-2022-page.scss +++ /dev/null @@ -1,3 +0,0 @@ -:host { - display: block; -} 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 new file mode 100644 index 000000000..0284a11f0 --- /dev/null +++ b/apps/client/src/app/pages/blog/2022/11/black-friday-2022/black-friday-2022-page.component.ts @@ -0,0 +1,15 @@ +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' }, + imports: [GfPremiumIndicatorModule, MatButtonModule, RouterModule], + selector: 'gf-black-friday-2022-page', + standalone: true, + templateUrl: './black-friday-2022-page.html' +}) +export class BlackFriday2022PageComponent { + public constructor() {} +} diff --git a/apps/client/src/app/pages/blog/2022/11/black-friday-2022/black-friday-2022-page.html b/apps/client/src/app/pages/blog/2022/11/black-friday-2022/black-friday-2022-page.html new file mode 100644 index 000000000..50476e70e --- /dev/null +++ b/apps/client/src/app/pages/blog/2022/11/black-friday-2022/black-friday-2022-page.html @@ -0,0 +1,151 @@ +
+
+
+
+
+

Black Friday 2022

+
2022-11-13
+ Black Friday 2022 Teaser +
+
+

+ Get 75% off on our + Ghostfolio Premium + + annual plan for ambitious investors who need the full picture of + their financial assets. +

+
+
+

+ Ghostfolio + is a modern web application to manage your personal finance. The + software presents the current assets (stocks, ETFs, + cryptocurrencies, commodities etc.) in real time to make solid, + data-driven investment decisions. Check out the numerous + features to manage your wealth. +

+
+
+

+ Snap the limited Black Friday 2022 deal before it’s gone. For + detailed information on plans and pricing, please visit our + pricing page. +

+

+ Get the Deal +

+
+
+
    +
  • + 2022 +
  • +
  • + Black Friday +
  • +
  • + Cloud +
  • +
  • + Cryptocurrency +
  • +
  • + Deal +
  • +
  • + ETF +
  • +
  • + Finance +
  • +
  • + Fintech +
  • +
  • + Ghostfolio +
  • +
  • + Ghostfolio Premium +
  • +
  • + Hosting +
  • +
  • + Investment +
  • +
  • + Open Source +
  • +
  • + OSS +
  • +
  • + Personal Finance +
  • +
  • + Portfolio +
  • +
  • + Portfolio Tracker +
  • +
  • + Pricing +
  • +
  • + SaaS +
  • +
  • + Software +
  • +
  • + Stock +
  • +
  • + Subscription +
  • +
  • + Wealth +
  • +
  • + Wealth Management +
  • +
  • + Web3 +
  • +
  • + Web 3.0 +
  • +
+
+ +
+
+
+
diff --git a/apps/client/src/app/pages/blog/2022/12/the-importance-of-tracking-your-personal-finances/the-importance-of-tracking-your-personal-finances-page.component.ts b/apps/client/src/app/pages/blog/2022/12/the-importance-of-tracking-your-personal-finances/the-importance-of-tracking-your-personal-finances-page.component.ts new file mode 100644 index 000000000..91e3a3052 --- /dev/null +++ b/apps/client/src/app/pages/blog/2022/12/the-importance-of-tracking-your-personal-finances/the-importance-of-tracking-your-personal-finances-page.component.ts @@ -0,0 +1,12 @@ +import { Component } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { RouterModule } from '@angular/router'; + +@Component({ + host: { class: 'page' }, + imports: [MatButtonModule, RouterModule], + selector: 'gf-the-importance-of-tracking-your-personal-finances-page', + standalone: true, + templateUrl: './the-importance-of-tracking-your-personal-finances-page.html' +}) +export class TheImportanceOfTrackingYourPersonalFinancesPageComponent {} diff --git a/apps/client/src/app/pages/blog/2022/12/the-importance-of-tracking-your-personal-finances/the-importance-of-tracking-your-personal-finances-page.html b/apps/client/src/app/pages/blog/2022/12/the-importance-of-tracking-your-personal-finances/the-importance-of-tracking-your-personal-finances-page.html new file mode 100644 index 000000000..ed87c7913 --- /dev/null +++ b/apps/client/src/app/pages/blog/2022/12/the-importance-of-tracking-your-personal-finances/the-importance-of-tracking-your-personal-finances-page.html @@ -0,0 +1,181 @@ +
+
+
+
+
+

+ The importance of tracking your personal finances +

+
2022-12-26
+ The importance of tracking your personal finances Teaser +
+
+

+ Once again, the end of the year is peak season for making + resolutions, whether in the area of personal fitness, relationships + or career. For sustainable changes, it’s important to track your + progress and celebrate even small successes. Not surprisingly, these + same principles apply to personal finances as well. +

+

+ Tracking your assets is an important part of achieving your + financial goals. By regularly reviewing and monitoring your assets, + you can get a clear picture of your financial situation and identify + areas where action is required to reach your financial ambitions. +

+
+
+

Understanding your net worth

+

+ One of the main benefits of monitoring wealth is that it helps you + understand the value of your assets. By keeping track of your + assets, you can see how much money you have invested, where it is + invested, and how well it is performing. This allows you to see how + your assets are performing over time, and you can adjust your + strategy if necessary. +

+
+
+

Identifying opportunities

+

+ Tracking your wealth can also help you identify financial + opportunities for growth and improvement. By reviewing your assets + regularly, you may be able to identify new investment opportunities + or strategies that can help you grow your wealth and reach your + financial objectives faster. +

+
+
+

Managing the risk and making informed decisions

+

+ Monitoring your assets not only helps you understand the value of + your assets and identify potential for growth, but also helps you + manage your risk. By understanding the different types of your + assets and their performance, you can make informed decisions about + how to allocate your assets to minimize risk and maximize the + potential return on investment. +

+
+
+

Tracking personal finances with Ghostfolio

+

+ In summary, monitoring your assets is an important aspect of + achieving your financial goals. It helps you understand the value of + your assets, identify growth opportunities and manage your risk. By + regularly reviewing and monitoring your assets, you can make + informed decisions about your financial strategy and work toward + your financial success. +

+

+ Instead of manually recording your assets and net worth in a + spreadsheet, you can use + Ghostfolio, a web-based software + to manage your personal finances. +

+
+
+

+ Would you like to refine your + personal investment strategy? +

+

+ Ghostfolio empowers you to keep track of your wealth. +

+ +
+
+
    +
  • + App +
  • +
  • + Assets +
  • +
  • + Decision +
  • +
  • + Finance +
  • +
  • + Fintech +
  • +
  • + Ghostfolio +
  • +
  • + Goal +
  • +
  • + Investment +
  • +
  • + Management +
  • +
  • + Monitoring +
  • +
  • + Net Worth +
  • +
  • + Opportunity +
  • +
  • + Performance +
  • +
  • + Personal Finance +
  • +
  • + Portfolio Tracker +
  • +
  • + Progress +
  • +
  • + Risk +
  • +
  • + Software +
  • +
  • + Spreadsheet +
  • +
  • + Strategy +
  • +
  • + Success +
  • +
  • + Wealth +
  • +
+
+ +
+
+
+
diff --git a/apps/client/src/app/pages/blog/2023/01/ghostfolio-auf-sackgeld-vorgestellt/ghostfolio-auf-sackgeld-vorgestellt-page.component.ts b/apps/client/src/app/pages/blog/2023/01/ghostfolio-auf-sackgeld-vorgestellt/ghostfolio-auf-sackgeld-vorgestellt-page.component.ts new file mode 100644 index 000000000..8366e81dc --- /dev/null +++ b/apps/client/src/app/pages/blog/2023/01/ghostfolio-auf-sackgeld-vorgestellt/ghostfolio-auf-sackgeld-vorgestellt-page.component.ts @@ -0,0 +1,12 @@ +import { Component } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { RouterModule } from '@angular/router'; + +@Component({ + host: { class: 'page' }, + imports: [MatButtonModule, RouterModule], + selector: 'gf-ghostfolio-auf-sackgeld-vorgestellt-page', + standalone: true, + templateUrl: './ghostfolio-auf-sackgeld-vorgestellt-page.html' +}) +export class GhostfolioAufSackgeldVorgestelltPageComponent {} diff --git a/apps/client/src/app/pages/blog/2023/01/ghostfolio-auf-sackgeld-vorgestellt/ghostfolio-auf-sackgeld-vorgestellt-page.html b/apps/client/src/app/pages/blog/2023/01/ghostfolio-auf-sackgeld-vorgestellt/ghostfolio-auf-sackgeld-vorgestellt-page.html new file mode 100644 index 000000000..4da21fafa --- /dev/null +++ b/apps/client/src/app/pages/blog/2023/01/ghostfolio-auf-sackgeld-vorgestellt/ghostfolio-auf-sackgeld-vorgestellt-page.html @@ -0,0 +1,191 @@ +
+
+
+
+
+

Ghostfolio auf Sackgeld.com vorgestellt

+
2023-01-21
+ Ghostfolio auf Sackgeld.com vorgestellt Teaser +
+
+

+ Wir freuen uns darüber, dass unsere Open Source Portfolio Tracking + Software Ghostfolio auf dem + FinTech Newsportal Sackgeld.com vorgestellt wurde. +

+
+
+
+
+

+ «Ghostfolio ist ein umfassender Portfolio Performance + Tracker der einfach zu bedienen ist, mit einigen sehr + innovativen Features aufwartet und echten Mehrwert für den + Investor bringt.» +

+
+
+
+
+

+ Im ausführlichen Bericht wird die Funktionsweise von Ghostfolio + erläutert, die unterstützten Assets aufgeführt sowie die + Preisstruktur im Vergleich zu anderen Anbietern dargelegt. +

+
+
+

+ Ghostfolio – Open Source Wealth Management Software +

+

+ Ghostfolio ermöglicht es dir, dein Portfolio einfach zu verfolgen + und zu analysieren. Es bietet dir detaillierte Informationen über + deine Positionen, historische Entwicklung, Performance und die + Zusammenstellung deines Portfolios. Durch die Open Source-Lizenz (GNU Affero General Public License v3.0) wird die Software ständig weiterentwickelt, verbessert und du + hast sogar selbst die Möglichkeit, dich daran zu beteiligen. Wir + sind davon überzeugt, mit diesem Open-Source-Ansatz von Ghostfolio + das Finanzwissen und Investieren für alle zugänglicher zu machen. +

+
+
+

Sackgeld.com – App für ein höheres Sackgeld

+

+ Das Schweizer FinTech Nachrichtenportal + Sackgeld.com + informiert über die neuesten Entwicklungen und Innovationen im + Bereich FinTech. Dazu gehören News, Artikel und persönliche + Erfahrungen aus der Welt der digitalen Finanz Apps, Säule 3a, P2P + und Immobilien. +

+
+
+

+ Wenn du mehr über Ghostfolio erfahren möchtest, kannst du hier den + ganzen Artikel nachlesen: + Was taugt Ghostfolio als Portfolio Performance Tracking-Tool? +

+
+
+
    +
  • + AGPL-3.0 +
  • +
  • + Aktie +
  • +
  • + Altersvorsorge +
  • +
  • + Anlage +
  • +
  • + App +
  • +
  • + Asset +
  • +
  • + Feedback +
  • +
  • + Finanzwissen +
  • +
  • + Fintech +
  • +
  • + Ghostfolio +
  • +
  • + Immobilien +
  • +
  • + Innovation +
  • +
  • + Investieren +
  • +
  • + Lizenz +
  • +
  • + Media +
  • +
  • + Open Source +
  • +
  • + OSS +
  • +
  • + P2P +
  • +
  • + Performance +
  • +
  • + Portfolio +
  • +
  • + Presse +
  • +
  • + Sackgeld +
  • +
  • + Säule 3a +
  • +
  • + Schweiz +
  • +
  • + Software +
  • +
  • + Taschengeld +
  • +
  • + Tool +
  • +
  • + Vermögen +
  • +
  • + Vorsorge +
  • +
  • + Wealth Management +
  • +
+
+ +
+
+
+
diff --git a/apps/client/src/app/pages/blog/2023/02/ghostfolio-meets-umbrel/ghostfolio-meets-umbrel-page.component.ts b/apps/client/src/app/pages/blog/2023/02/ghostfolio-meets-umbrel/ghostfolio-meets-umbrel-page.component.ts new file mode 100644 index 000000000..643f47041 --- /dev/null +++ b/apps/client/src/app/pages/blog/2023/02/ghostfolio-meets-umbrel/ghostfolio-meets-umbrel-page.component.ts @@ -0,0 +1,12 @@ +import { Component } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { RouterModule } from '@angular/router'; + +@Component({ + host: { class: 'page' }, + imports: [MatButtonModule, RouterModule], + selector: 'gf-ghostfolio-meets-umbrel-page', + standalone: true, + templateUrl: './ghostfolio-meets-umbrel-page.html' +}) +export class GhostfolioMeetsUmbrelPageComponent {} diff --git a/apps/client/src/app/pages/blog/2023/02/ghostfolio-meets-umbrel/ghostfolio-meets-umbrel-page.html b/apps/client/src/app/pages/blog/2023/02/ghostfolio-meets-umbrel/ghostfolio-meets-umbrel-page.html new file mode 100644 index 000000000..97668ebb8 --- /dev/null +++ b/apps/client/src/app/pages/blog/2023/02/ghostfolio-meets-umbrel/ghostfolio-meets-umbrel-page.html @@ -0,0 +1,215 @@ +
+
+
+
+
+

Ghostfolio meets Umbrel

+
2023-02-25
+ Ghostfolio meets Umbrel Teaser +
+
+

+ We are happy to announce that + Ghostfolio, the web-based personal + finance management software, is now available in the + Umbrel App Store, a + home server OS for self-hosting. +

+

+ In recent years, we have seen an increasing number of individuals + and organizations moving their data to the cloud. While cloud + computing has its benefits, such as accessibility and scalability, + it also comes with some concerns regarding data privacy and + security. However, there is an alternative to cloud computing that + provides the convenience of the cloud while giving you ownership and + control of your data: personal servers. +

+
+
+

Umbrel – A personal server OS for self-hosting

+

+ Umbrel + is an operating system based on + Docker that + allows you to run a personal server in your home. With it, you can + self-host open source apps directly from an integrated app store. + This means that you can discover self-hosted apps directly in the + Umbrel App Store + and install them in one click. You can get up and running Umbrel on + a Raspberry Pi 4, any Ubuntu / Debian system, or a VPS in only 5 + minutes. +

+

+ Umbrel offers numerous advantages for running a personal server in + your home, such as enhanced data privacy and security, ownership and + control of your data, and access to a diverse selection of + self-hosted apps. +

+
+
+

+ Ghostfolio – Track your portfolio without being tracked +

+

+ Keeping track of multiple assets can make managing your personal + finance a challenging task. However, there are tools available + beyond spreadsheets that can help you streamline the process and + make well-informed investment decisions based on data. +

+

+ Ghostfolio + is a modern open source web application designed to manage your + personal finance with ease and confidence. It presents your current + assets in real-time, including stocks, ETFs, cryptocurrencies, + commodities, and more. It allows you to track and analyze your + investments in one place. +

+

+ The application has a range of features such as real-time asset + tracking, data import and export and advanced portfolio analytics + tools. +

+
+
+

+ To participate in the ongoing development of Ghostfolio, please feel + free to contact us in the + Slack + community or via Twitter + @ghostfolio_. We look forward to hearing from you! +

+
+
+
    +
  • + Announcement +
  • +
  • + App Store +
  • +
  • + Assets +
  • +
  • + Cloud +
  • +
  • + Commodity +
  • +
  • + Cryptocurrency +
  • +
  • + Debian +
  • +
  • + Development +
  • +
  • + Docker +
  • +
  • + ETF +
  • +
  • + Fintech +
  • +
  • + Ghostfolio +
  • +
  • + Home Server +
  • +
  • + Investing +
  • +
  • + Linux +
  • +
  • + Open Source +
  • +
  • + Operating System +
  • +
  • + OS +
  • +
  • + OSS +
  • +
  • + Personal Finance +
  • +
  • + Personal Server +
  • +
  • + Portfolio +
  • +
  • + Privacy +
  • +
  • + Raspberry Pi +
  • +
  • + Security +
  • +
  • + Software +
  • +
  • + Spreadsheet +
  • +
  • + Stocks +
  • +
  • + Ubuntu +
  • +
  • + Umbrel +
  • +
  • + VPS +
  • +
  • + Wealth Management +
  • +
+
+ +
+
+
+
diff --git a/apps/client/src/app/pages/blog/2023/03/1000-stars-on-github/1000-stars-on-github-page.component.ts b/apps/client/src/app/pages/blog/2023/03/1000-stars-on-github/1000-stars-on-github-page.component.ts new file mode 100644 index 000000000..5e6ce6c08 --- /dev/null +++ b/apps/client/src/app/pages/blog/2023/03/1000-stars-on-github/1000-stars-on-github-page.component.ts @@ -0,0 +1,12 @@ +import { Component } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { RouterModule } from '@angular/router'; + +@Component({ + host: { class: 'page' }, + imports: [MatButtonModule, RouterModule], + selector: 'gf-1000-stars-on-github-page', + standalone: true, + templateUrl: './1000-stars-on-github-page.html' +}) +export class ThousandStarsOnGitHubPageComponent {} diff --git a/apps/client/src/app/pages/blog/2023/03/1000-stars-on-github/1000-stars-on-github-page.html b/apps/client/src/app/pages/blog/2023/03/1000-stars-on-github/1000-stars-on-github-page.html new file mode 100644 index 000000000..b6aacd1bd --- /dev/null +++ b/apps/client/src/app/pages/blog/2023/03/1000-stars-on-github/1000-stars-on-github-page.html @@ -0,0 +1,265 @@ +
+
+
+
+
+

Ghostfolio reaches 1’000 Stars on GitHub

+
2023-03-25
+ 1000 Stars on GitHub Teaser +
+
+

+ Ghostfolio, the open-source + personal finance management software, has hit a + major milestone + by reaching 1’000 stars on + GitHub. This + blog post reflects on Ghostfolio’s recent achievements, highlighting + its open-source community collaboration, platform expansions, and + future developments. +

+
+
+

Open Source community collaboration

+

+ Since its launch in 2021, the project with the clean and intuitive + graphical user interface has accumulated over 100’000 pulls from + Docker Hub + and received contributions from 38 developers and counting. These + efforts have resulted in a robust and user-friendly platform that + empowers busy people to take control of their personal finances. In + addition, Ghostfolio has attracted over 250 members from around the + world to its + Slack + community, where they can connect and share ideas about investing. +

+

+

+ + Screenshot of the Ghostfolio’s Star History + +
+ Screenshot of the Ghostfolio’s Star History +
+
+

+

+ The adoption of Ghostfolio highlights the power of open-source + software and the value of community-driven development, which has + definitely exceeded all our expectations. The open-source code + allows anyone to contribute to its development, review its progress, + and suggest further improvements. +

+
+
+

Platform integrations and internationalization

+

+ Thanks to the work and dedication of the community, Ghostfolio has + expanded onto platforms like + Umbrel and + Unraid. +

+

+

+ + Screenshot of the Ghostfolio App in the Umbrel App Store + +
+ Screenshot of the Ghostfolio App in the Umbrel App Store +
+
+

+

+ These self-hosting platforms allow users to run applications on + their own hardware rather than rely on a + SaaS offering. As a result, + Ghostfolio has become accessible to an even wider range of users who + would like to take control of their wealth management. +

+

+ Additionally, the application has been translated into Dutch, + French, German, Italian and Spanish for investors who prefer to use + Ghostfolio in their native language. +

+
+
+

What’s next for Ghostfolio?

+

+ As the project continues to evolve, we can expect to see even more + exciting developments and innovations around Ghostfolio which guides + users through the process of + tracking their assets, such as + stocks, ETFs, or cryptocurrencies. Especially in the areas of data + import and portfolio analysis. +

+

+ We are honored to be a part of this vibrant and growing community, + and we look forward to collaborating and learning together. If you + are a web developer and interested in personal finance, please join + our + Slack + community or connect with + @ghostfolio_ on + Twitter. We are happy to discuss ideas and get you involved. +

+

Thank you for all your feedback and support.

+

+ Here’s to many more stars!
+ Thomas from Ghostfolio +

+
+
+
    +
  • + Achievement +
  • +
  • + Analysis +
  • +
  • + Asset +
  • +
  • + BuildInPublic +
  • +
  • + Collaboration +
  • +
  • + Community +
  • +
  • + Cryptocurrency +
  • +
  • + Development +
  • +
  • + ETF +
  • +
  • + Finance +
  • +
  • + Fintech +
  • +
  • + Ghostfolio +
  • +
  • + GitHub +
  • +
  • + GUI +
  • +
  • + i18n +
  • +
  • + Import +
  • +
  • + Innovation +
  • +
  • + Internationalization +
  • +
  • + Investment +
  • +
  • + Investor +
  • +
  • + Milestone +
  • +
  • + Open Source +
  • +
  • + OSS +
  • +
  • + Personal Finance +
  • +
  • + Platform +
  • +
  • + Portfolio +
  • +
  • + Progress +
  • +
  • + SaaS +
  • +
  • + Software +
  • +
  • + Stock +
  • +
  • + Tool +
  • +
  • + Translation +
  • +
  • + Umbrel +
  • +
  • + Unraid +
  • +
  • + Wealth +
  • +
  • + Wealth Management +
  • +
  • + Web3 +
  • +
+
+ +
+
+
+
diff --git a/apps/client/src/app/pages/blog/2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page.component.ts b/apps/client/src/app/pages/blog/2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page.component.ts new file mode 100644 index 000000000..c694ba8fb --- /dev/null +++ b/apps/client/src/app/pages/blog/2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page.component.ts @@ -0,0 +1,12 @@ +import { Component } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { RouterModule } from '@angular/router'; + +@Component({ + host: { class: 'page' }, + imports: [MatButtonModule, RouterModule], + selector: 'gf-unlock-your-financial-potential-with-ghostfolio-page', + standalone: true, + templateUrl: './unlock-your-financial-potential-with-ghostfolio-page.html' +}) +export class UnlockYourFinancialPotentialWithGhostfolioPageComponent {} diff --git a/apps/client/src/app/pages/blog/2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page.html b/apps/client/src/app/pages/blog/2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page.html new file mode 100644 index 000000000..7a515794f --- /dev/null +++ b/apps/client/src/app/pages/blog/2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page.html @@ -0,0 +1,246 @@ +
+
+
+
+
+

Unlock your Financial Potential with Ghostfolio

+
2023-05-20
+ Unlock your financial potential with Ghostfolio Teaser +
+
+

+ Managing personal finances effectively is crucial for those striving + for a secure future and financial independence. In today’s digital + age, having a reliable wealth management software can greatly + simplify the process. Ghostfolio is a powerful + open source solution + for individuals trading stocks, ETFs, or cryptocurrencies on + multiple platforms. This article explores the key reasons why + Ghostfolio is the ideal choice for those embracing diversification, + pursuing a buy & hold strategy, and seeking portfolio insights while + valuing privacy. +

+
+
+

Effortless Management for Multi-Platform Investors

+

+ Ghostfolio offers a holistic solution to efficiently monitor and + manage investment portfolios across multiple platforms. By + consolidating data from various accounts, Ghostfolio eliminates the + need to switch between platforms, saving users valuable time and + effort. +

+
+
+

Empowering Buy & Hold Strategies

+

+ For those committed to a + buy & hold strategy, Ghostfolio + provides an intuitive interface to monitor long-term investments. + Users can track performance over time, gaining insights into + portfolio growth and stability. With strong visualizations and + reporting features, Ghostfolio + equips users to make well-informed decisions aligned with their + long-term investment goals. +

+
+
+

Deep Portfolio Insights

+

+ Understanding portfolio composition is vital for making informed + financial decisions. Ghostfolio provides comprehensive insights into + asset allocation, sector exposure, geographical diversification, and + individual asset performance. These detailed analytics empower users + to assess portfolio strengths and weaknesses, making necessary + adjustments to optimize their allocation. +

+
+
+

Privacy and Data Ownership

+

+ In the age of growing data security concerns, Ghostfolio sets itself + apart by giving the highest priority to privacy and data ownership. + As an open-source software, Ghostfolio ensures that users retain + complete control over their financial data. By eliminating the need + to trust third-party platforms with sensitive information, + Ghostfolio offers peace of mind to those who value privacy and data + security. +

+
+
+

Streamlined Minimalism for Financial Efficiency

+

+ Ghostfolio embraces a lightweight approach to personal finance + management, focusing on essential features without overwhelming + users. Its streamlined user interface and clean design provide a + seamless and clutter-free experience. This minimalist approach + enhances user satisfaction and boosts efficiency by eliminating + distractions and simplifying the financial management process. +

+
+
+

Driving Financial Independence (FIRE)

+

+ Achieving + financial independence + including early retirement (FIRE) requires careful planning, monitoring, and forecasting. + Ghostfolio’s robust features equip individuals with tools to + analyze, optimize and simulate investment strategies. By providing + insights, performance tracking, and portfolio analysis, Ghostfolio + serves as a valuable companion in the pursuit of financial freedom. +

+
+
+

Farewell to Spreadsheet Hassles

+

+ While spreadsheets have traditionally been used to manage personal + finances, they can be time-consuming and prone to errors. Ghostfolio + offers a user-friendly alternative by automating data aggregation, + analysis, and reporting. Users can bid farewell to manual data entry + and complex formulas, relying instead on Ghostfolio’s user-friendly + and intuitive interface to efficiently manage their finances. +

+
+
+

Your Path to Financial Success with Ghostfolio

+

+ Ghostfolio, the open-source personal finance software, provides a + wide range of benefits for individuals involved in trading stocks, + ETFs, or cryptocurrencies. Whether you are pursuing a buy & hold + strategy, seeking valuable portfolio insights, or diversifying + financial resources while prioritizing privacy and data ownership, + Ghostfolio proves to be an invaluable tool on your journey towards + unlocking your financial potential. Say goodbye to spreadsheets and + embrace the power of Ghostfolio for simplified, secure, and + successful financial management. +

+
+
+

+ Would you like to unlock your + financial potential? +

+

+ Ghostfolio empowers you to manage your personal finances + effectively. +

+ +
+
+
    +
  • + App +
  • +
  • + Analysis +
  • +
  • + Assets +
  • +
  • + Budgeting +
  • +
  • + Buy & Hold +
  • +
  • + Cryptocurrencies +
  • +
  • + Diversification +
  • +
  • + ETFs +
  • +
  • + Finance +
  • +
  • + Fintech +
  • +
  • + FIRE +
  • +
  • + Ghostfolio +
  • +
  • + Investment +
  • +
  • + Management +
  • +
  • + Minimalism +
  • +
  • + Monitoring +
  • +
  • + Open Source +
  • +
  • + Personal Finance +
  • +
  • + Planning +
  • +
  • + Portfolio Tracker +
  • +
  • + Privacy +
  • +
  • + Retirement +
  • +
  • + Software +
  • +
  • + Spreadsheet +
  • +
  • + Stock +
  • +
  • + Strategy +
  • +
  • + Wealth +
  • +
+
+ +
+
+
+
diff --git a/apps/client/src/app/pages/blog/2023/07/exploring-the-path-to-fire/exploring-the-path-to-fire-page.component.ts b/apps/client/src/app/pages/blog/2023/07/exploring-the-path-to-fire/exploring-the-path-to-fire-page.component.ts new file mode 100644 index 000000000..16f0d8155 --- /dev/null +++ b/apps/client/src/app/pages/blog/2023/07/exploring-the-path-to-fire/exploring-the-path-to-fire-page.component.ts @@ -0,0 +1,12 @@ +import { Component } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { RouterModule } from '@angular/router'; + +@Component({ + host: { class: 'page' }, + imports: [MatButtonModule, RouterModule], + selector: 'gf-exploring-the-path-to-fire-page-page', + standalone: true, + templateUrl: './exploring-the-path-to-fire-page.html' +}) +export class ExploringThePathToFirePageComponent {} diff --git a/apps/client/src/app/pages/blog/2023/07/exploring-the-path-to-fire/exploring-the-path-to-fire-page.html b/apps/client/src/app/pages/blog/2023/07/exploring-the-path-to-fire/exploring-the-path-to-fire-page.html new file mode 100644 index 000000000..8b3359b0b --- /dev/null +++ b/apps/client/src/app/pages/blog/2023/07/exploring-the-path-to-fire/exploring-the-path-to-fire-page.html @@ -0,0 +1,257 @@ +
+
+
+
+
+

+ Exploring the Path to Financial Independence and Retiring Early + (FIRE) +

+
2023-07-01
+ Exploring the Path to Financial Independence and Retiring Early (FIRE) Teaser +
+
+

+ In this article, we will explore the concept behind FIRE and + thoroughly discuss the pros and cons of this increasingly popular + movement. +

+
+
+

The Idea behind FIRE

+

+ FIRE, short for Financial Independence and Retiring Early, is + a movement that promotes the idea of saving and investing a + significant portion of one’s income in order to achieve financial + independence and retire at a young age. The core principle of FIRE + is not unconditionally quitting work, but rather attaining the + freedom to pursue meaningful activities and experiences without + relying on traditional employment. +

+

+ At the heart of FIRE lies the famous 4% rule, originated in the + Trinity study. This rule suggests that if you withdraw 4% of your investment + portfolio (usually based on low-cost index funds) in the first year + of retirement and adjust that amount for inflation in subsequent + years, your savings have a high likelihood of lasting for a 30-year + retirement period. The 4% rule serves as a guide to determine the + amount that can be safely withdrawn from a retirement portfolio each + year without depleting savings prematurely, allowing individuals to + sustain their desired lifestyle throughout retirement. +

+

+ By multiplying your anticipated annual expenses by 25, you obtain an + estimate of the total retirement savings required to sustain your + lifestyle, assuming a 4% withdrawal rate. +

+
+
+

The power of FIRE

+

+ FIRE grants individuals the freedom to make choices based on their + personal values, liberated from financial constraints. By achieving + financial independence, individuals gain control over their time and + resources, enabling them to live life on their terms. +

+

+ One of the primary benefits of FIRE is the ability to retire early, + affording individuals the opportunity to pursue their passions, + spend quality time with loved ones, engage in meaningful projects, + and prioritize personal growth. Early retirement promotes a more + balanced lifestyle and allows individuals to savor life while they + are still young and full of energy. +

+

+ FIRE encourages adopting a frugal mindset and intentional spending, + resulting in reduced financial stress. By living within their means + and focusing on what truly brings them joy, individuals experience + greater peace of mind, improved well-being, and a stronger sense of + financial security. +

+

+ FIRE grants individuals a higher level of autonomy and empowerment + over their schedules and the activities they choose to pursue. + Whether it involves exploring new career paths, starting a business, + or undertaking adventurous travels, FIRE provides the flexibility to + determine how time is spent and how life is shaped. +

+
+
+

The challenges of FIRE

+

+ Achieving FIRE often demands strict budgeting, aggressive saving, + and making sacrifices for years to secure a financially independent + future. This may involve cutting back on discretionary expenses, + deferring major purchases, or adopting a simpler lifestyle to + achieve long-term goals. +

+

+ FIRE heavily relies on investments and the performance of financial + markets. Economic downturns or unexpected market fluctuations can + impact investment portfolios and potentially delay or jeopardize + early retirement plans. Developing a robust financial plan, + diversifying investments, and periodically reassessing your + withdrawal strategy is crucial. +

+

+ This particular aspect of FIRE requires thoughtful deliberation and + strategic planning to ensure a consistent and reliable stream of + retirement income throughout one’s lifespan. +

+

+ Retiring early often means stepping away from a career and + potentially losing the professional identity and social connections + associated with it. Giving careful thought to how early retirement + might influence one’s sense of purpose is crucial, as it prompts the + exploration of alternative avenues to stay engaged and fulfilled. +

+
+
+

Achieving FIRE for a fulfilling future

+

+ Financial Independence and Retiring Early (FIRE) is a fascinating + concept that has gained significant traction in recent years. It + offers individuals the opportunity to break free from financial + constraints, pursue their passions, and gain control over their time + and resources. While FIRE comes with its own set of challenges, the + potential benefits are substantial. Whether you choose to fully + embrace FIRE or adapt its principles to suit your personal goals, + it’s crucial to approach it with careful planning and a clear + understanding of the advantages and disadvantages. +

+

+ Knowing your financial situation and consistently monitoring it is + vital on your journey to FIRE. This is where the strength of + Ghostfolio, a comprehensive open + source wealth management software, comes into play. By leveraging + Ghostfolio, you can gain deep insights into your financial health, + track your investments, and make informed decisions to accelerate + your progress towards financial independence. Ghostfolio also + provides a dedicated + FIRE calculator, allowing you to + simulate your customized plan to achieve FIRE. You get the tools to + optimize your financial journey and confidently strive for a future + that is both personally fulfilling and financially secure. +

+
+
+

+ Are you ready for your journey towards + FIRE? +

+

+ Ghostfolio accompanies you on your path to financial independence. +

+ +
+
+
    +
  • + App +
  • +
  • + Budgeting +
  • +
  • + Calculator +
  • +
  • + FIRE +
  • +
  • + Frugality +
  • +
  • + Ghostfolio +
  • +
  • + Health +
  • +
  • + Independence +
  • +
  • + Index Fund +
  • +
  • + Investment +
  • +
  • + Lifestyle +
  • +
  • + Management +
  • +
  • + Movement +
  • +
  • + Open Source +
  • +
  • + Personal Finance +
  • +
  • + Planning +
  • +
  • + Portfolio +
  • +
  • + Retirement +
  • +
  • + Savings +
  • +
  • + Simulation +
  • +
  • + Software +
  • +
  • + Strategy +
  • +
  • + Trinity Study +
  • +
  • + Wealth +
  • +
  • + Withdrawal +
  • +
  • + Work-Life Balance +
  • +
+
+ +
+
+
+
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 b65a7bd8c..4c41b423e 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 @@ -10,6 +10,132 @@ const routes: Routes = [ component: BlogPageComponent, path: '', title: $localize`Blog` + }, + { + canActivate: [AuthGuard], + path: '2021/07/hallo-ghostfolio', + loadComponent: () => + import('./2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component').then( + (c) => c.HalloGhostfolioPageComponent + ), + title: 'Hallo Ghostfolio' + }, + { + canActivate: [AuthGuard], + path: '2021/07/hello-ghostfolio', + loadComponent: () => + import('./2021/07/hello-ghostfolio/hello-ghostfolio-page.component').then( + (c) => c.HelloGhostfolioPageComponent + ), + title: 'Hello Ghostfolio' + }, + { + canActivate: [AuthGuard], + path: '2022/01/ghostfolio-first-months-in-open-source', + loadComponent: () => + import( + './2022/01/first-months-in-open-source/first-months-in-open-source-page.component' + ).then((c) => c.FirstMonthsInOpenSourcePageComponent), + title: 'First months in Open Source' + }, + { + canActivate: [AuthGuard], + path: '2022/07/ghostfolio-meets-internet-identity', + loadComponent: () => + import( + './2022/07/ghostfolio-meets-internet-identity/ghostfolio-meets-internet-identity-page.component' + ).then((c) => c.GhostfolioMeetsInternetIdentityPageComponent), + title: 'Ghostfolio meets Internet Identity' + }, + { + canActivate: [AuthGuard], + path: '2022/07/how-do-i-get-my-finances-in-order', + loadComponent: () => + import( + './2022/07/how-do-i-get-my-finances-in-order/how-do-i-get-my-finances-in-order-page.component' + ).then((c) => c.HowDoIGetMyFinancesInOrderPageComponent), + title: 'How do I get my finances in order?' + }, + { + canActivate: [AuthGuard], + path: '2022/08/500-stars-on-github', + loadComponent: () => + import( + './2022/08/500-stars-on-github/500-stars-on-github-page.component' + ).then((c) => c.FiveHundredStarsOnGitHubPageComponent), + title: '500 Stars on GitHub' + }, + { + canActivate: [AuthGuard], + path: '2022/10/hacktoberfest-2022', + loadComponent: () => + import( + './2022/10/hacktoberfest-2022/hacktoberfest-2022-page.component' + ).then((c) => c.Hacktoberfest2022PageComponent), + title: 'Hacktoberfest 2022' + }, + { + canActivate: [AuthGuard], + path: '2022/11/black-friday-2022', + loadComponent: () => + import( + './2022/11/black-friday-2022/black-friday-2022-page.component' + ).then((c) => c.BlackFriday2022PageComponent), + title: 'Black Friday 2022' + }, + { + canActivate: [AuthGuard], + path: '2022/12/the-importance-of-tracking-your-personal-finances', + loadComponent: () => + import( + './2022/12/the-importance-of-tracking-your-personal-finances/the-importance-of-tracking-your-personal-finances-page.component' + ).then((c) => c.TheImportanceOfTrackingYourPersonalFinancesPageComponent), + title: 'The importance of tracking your personal finances' + }, + { + canActivate: [AuthGuard], + path: '2023/01/ghostfolio-auf-sackgeld-vorgestellt', + loadComponent: () => + import( + './2023/01/ghostfolio-auf-sackgeld-vorgestellt/ghostfolio-auf-sackgeld-vorgestellt-page.component' + ).then((c) => c.GhostfolioAufSackgeldVorgestelltPageComponent), + title: 'Ghostfolio auf Sackgeld.com vorgestellt' + }, + { + canActivate: [AuthGuard], + path: '2023/02/ghostfolio-meets-umbrel', + loadComponent: () => + import( + './2023/02/ghostfolio-meets-umbrel/ghostfolio-meets-umbrel-page.component' + ).then((c) => c.GhostfolioMeetsUmbrelPageComponent), + title: 'Ghostfolio meets Umbrel' + }, + { + canActivate: [AuthGuard], + path: '2023/03/ghostfolio-reaches-1000-stars-on-github', + loadComponent: () => + import( + './2023/03/1000-stars-on-github/1000-stars-on-github-page.component' + ).then((c) => c.ThousandStarsOnGitHubPageComponent), + title: 'Ghostfolio reaches 1’000 Stars on GitHub' + }, + { + canActivate: [AuthGuard], + path: '2023/05/unlock-your-financial-potential-with-ghostfolio', + loadComponent: () => + import( + './2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page.component' + ).then((c) => c.UnlockYourFinancialPotentialWithGhostfolioPageComponent), + title: 'Unlock your Financial Potential with Ghostfolio' + }, + { + canActivate: [AuthGuard], + path: '2023/07/exploring-the-path-to-fire', + loadComponent: () => + import( + './2023/07/exploring-the-path-to-fire/exploring-the-path-to-fire-page.component' + ).then((c) => c.ExploringThePathToFirePageComponent), + title: 'Exploring the Path to FIRE' } ]; 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 2df3dbc7a..db5454fbf 100644 --- a/apps/client/src/app/pages/blog/blog-page.component.ts +++ b/apps/client/src/app/pages/blog/blog-page.component.ts @@ -1,4 +1,6 @@ import { Component, OnDestroy } from '@angular/core'; +import { DataService } from '@ghostfolio/client/services/data.service'; +import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { Subject } from 'rxjs'; @Component({ @@ -8,9 +10,18 @@ import { Subject } from 'rxjs'; templateUrl: './blog-page.html' }) export class BlogPageComponent implements OnDestroy { + public hasPermissionForSubscription: boolean; + private unsubscribeSubject = new Subject(); - public constructor() {} + public constructor(private dataService: DataService) { + const info = this.dataService.fetchInfo(); + + this.hasPermissionForSubscription = hasPermission( + info?.globalPermissions, + permissions.enableSubscription + ); + } public ngOnDestroy() { this.unsubscribeSubject.next(); diff --git a/apps/client/src/app/pages/blog/blog-page.html b/apps/client/src/app/pages/blog/blog-page.html index f2d1de322..6314e62ce 100644 --- a/apps/client/src/app/pages/blog/blog-page.html +++ b/apps/client/src/app/pages/blog/blog-page.html @@ -1,16 +1,201 @@
-

Blog

- +

Blog

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ -
+
Hacktoberfest 2022
2022-10-01
@@ -26,15 +211,15 @@
- +
-
+
500 Stars on GitHub
2022-08-18
@@ -50,15 +235,15 @@
- +
-
+
Ghostfolio meets Internet Identity
@@ -76,15 +261,15 @@
- +
-
+
How do I get my finances in order?
@@ -102,15 +287,15 @@
- +
-
+
First months in Open Source
@@ -128,15 +313,15 @@
- +
-
+
Hello Ghostfolio
2021-07-31
@@ -152,15 +337,15 @@
- +
-
+
Hallo Ghostfolio
2021-07-31
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 52deddb27..11a3a9127 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 @@ -9,7 +9,7 @@ const routes: Routes = [ canActivate: [AuthGuard], component: FaqPageComponent, path: '', - title: $localize`FAQ` + 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 c7e2b436d..b93004337 100644 --- a/apps/client/src/app/pages/faq/faq-page.component.ts +++ b/apps/client/src/app/pages/faq/faq-page.component.ts @@ -1,5 +1,7 @@ -import { Component, OnDestroy } from '@angular/core'; -import { Subject } from 'rxjs'; +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'; @Component({ host: { class: 'page' }, @@ -8,9 +10,26 @@ import { Subject } from 'rxjs'; templateUrl: './faq-page.html' }) export class FaqPageComponent implements OnDestroy { + public user: User; + private unsubscribeSubject = new Subject(); - public constructor() {} + 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(); diff --git a/apps/client/src/app/pages/faq/faq-page.html b/apps/client/src/app/pages/faq/faq-page.html index 459d8987d..c906a8e98 100644 --- a/apps/client/src/app/pages/faq/faq-page.html +++ b/apps/client/src/app/pages/faq/faq-page.html @@ -1,33 +1,45 @@
-

Frequently Asked Questions (FAQ)

- - What is Ghostfolio? +

+ Frequently Asked Questions (FAQ) +

+ + + 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? + + + What assets can I track with Ghostfolio? + With Ghostfolio, you can keep track of various assets like stocks, ETFs or cryptocurrencies. - - What else is included in Ghostfolio? + + + What else is included in Ghostfolio? Please find a feature overview to manage your wealth
here. - - How do I start? + + + How do I start? You can sign up via the “Get StartedGoogle Sign. We will guide you to set up your portfolio. - - Can I use Ghostfolio anonymously? + + + Can I use Ghostfolio anonymously? Yes, the authentication systems (via security token or Internet Identity) enable you to sign in securely and anonymously to Ghostfolio. There - is no need for an email address, phone number, or a username. + is no need for an e-mail address, phone number, or a username. - - How can Ghostfolio be free? + + + 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). Our + fully available as open source software (OSS). Thanks to our generous Ghostfolio Premium users and - sponsors allow - us to run a free, limited plan for new investors.sponsors we have + the ability to run a free, limited plan for novice + investors. - - Is it really free? + + + Is it really free? Yes, it is! Our pricing page details everything you get for free. - - What is Ghostfolio Premium? + + + What is Ghostfolio Premium? Ghostfolio Premium is a fully managed Ghostfolio cloud offering for ambitious investors. The revenue - is used to cover the hosting infrastructure. It is the Open Source - code base with some extras like the market overview.markets overview and a professional + data provider. - - Can I start with a trial version? + + + 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’s + 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. - - Which devices are supported? + + + How can I get a student discount for Ghostfolio + Premium? + + Request your student discount + here with + your university e-mail address. + + + + Which devices are supported? + Ghostfolio works in every modern web browser on smartphones, tablets - and desktop computers (where you have even more analysis options and - statistics). For Android users, there is a dedicated Ghostfolio app - available in the + and desktop computers. For Android users, there is a dedicated + Ghostfolio app available in the Google Play Store. - - Ghostfolio sounds cool, how can I get involved? + + + 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, a positive rating in the + 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 by email at - hi@ghostfol.io or on Twitter - @ghostfolio_Slack + community, + @ghostfolio_, + hi@ghostfol.io + or + GitHub. - - Got any other questions? + + + Got any other questions? + Join the Ghostfolio + >Please join the Ghostfolio Slack community, tweet to - @ghostfolio_ or send an - e-mail to - hi@ghostfol.io.Slack community, tweet to + @ghostfolio_, send an e-mail to + hi@ghostfol.io + or start a discussion at + GitHub.
diff --git a/apps/client/src/app/pages/features/features-page.html b/apps/client/src/app/pages/features/features-page.html index 8dc184326..9f5d2a29d 100644 --- a/apps/client/src/app/pages/features/features-page.html +++ b/apps/client/src/app/pages/features/features-page.html @@ -1,7 +1,7 @@
-

Features

+

Features

Check out the numerous features of Ghostfolio to @@ -10,230 +10,284 @@

- -
-

Stocks

-

Keep track of your stock purchases and sales.

-
+ + +
+

Stocks

+

Keep track of your stock purchases and sales.

+
+
- -
-

ETFs

-

- Are you into ETFs (Exchange Traded Funds)? Track your ETF - investments. -

-
+ + +
+

ETFs

+

+ Are you into ETFs (Exchange Traded Funds)? Track your ETF + investments. +

+
+
- -
-

Bonds

-

- Manage your investment in bonds and other assets with fixed - income. -

-
+ + +
+

Bonds

+

+ Manage your investment in bonds and other assets with fixed + income. +

+
+
- -
-

Cryptocurrencies

-

- Keep track of your Bitcoin and Altcoin holdings. -

-
+ + +
+

Cryptocurrencies

+

+ Keep track of your Bitcoin and Altcoin holdings. +

+
+
- -
-

Dividend

-

- Are you building a dividend portfolio? Track your dividend in - Ghostfolio. -

-
+ + +
+

Dividend

+

+ Are you building a dividend portfolio? Track your dividend in + Ghostfolio. +

+
+
- -
-

Wealth Items

-

- Track all your treasuries, be it your luxury watch or rare - trading cards. -

-
+ + +
+

Wealth Items

+

+ Track all your treasuries, be it your luxury watch or rare + trading cards. +

+
+
- -
-

Emergency Fund

-

- Define your emergency fund you are comfortable with for - difficult times. -

-
+ + +
+

Emergency Fund

+

+ Define your emergency fund you are comfortable with for + difficult times. +

+
+
- -
-

Import and Export

-

Import and export your investment activities.

-
+ + +
+

Liabilities

+

+ Manage your financial liabilities, such as your student loan, + to stay ahead of your financial obligations. +

+
+
- -
-

Multi-Accounts

-

- Keep an eye on all your accounts across multiple platforms - (multi-banking). -

-
+ + +
+

+ Import and Export +

+

Import and export your investment activities.

+
+
- -
-

- Portfolio Calculations - -

-

- Check the rate of return of your portfolio for - Today, YTD, 1Y, - 5Y, and Max. -

-
+ + +
+

Multi-Accounts

+

+ Keep an eye on all your accounts across multiple platforms + (multi-banking). +

+
+
- -
-

- Portfolio Allocations - -

-

- Check the allocations of your portfolio by account, asset class, - currency, region, and sector. -

-
+ + +
+

+ Portfolio Calculations + +

+

+ Check the rate of return of your portfolio for + Today, YTD, 1Y, + 5Y, and Max. +

+
+
- -
-

Dark Mode

-

- Ghostfolio automatically switches to a dark color theme based on - your operating system's preferences. -

-
+ + +
+

+ Portfolio Allocations + +

+

+ Check the allocations of your portfolio by account, asset + class, currency, region, and sector. +

+
+
- -
-

Zen Mode

-

- Keep calm and activate Zen Mode if the markets are going crazy. -

-
+ + +
+

Dark Mode

+

+ Ghostfolio automatically switches to a dark color theme based + on your operating system's preferences. +

+
+
+
+
+
+ + +
+

Zen Mode

+

+ Keep calm and activate Zen Mode if the markets are going + crazy. +

+
+
- -
-

- Market Mood - -

-

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

-
-
-
-
- -
-

- Static Analysis - -

-

- Identify potential risks in your portfolio with Ghostfolio - X-ray, the static portfolio analysis. -

-
-
-
-
- -
-

Multi-Language

-

- Use Ghostfolio in multiple languages: English, Dutch, German, - Italian and Spanish are currently supported. -

-
-
-
-
- -
-

Community

-

- Join the Ghostfolio - Slack channel - full of enthusiastic investors and discuss the latest market - trends. -

-
-
-
-
- -
-

Open Source Software

-

- The source code is fully available as - open source software - (OSS) and licensed under the AGPLv3 License. -

-
+ + +
+

+ Market Mood + +

+

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

+
+
+
+
+
+ + +
+

+ Static Analysis + +

+

+ Identify potential risks in your portfolio with Ghostfolio + X-ray, the static portfolio analysis. +

+
+
+
+
+
+ + +
+

Multi-Language

+

+ Use Ghostfolio in multiple languages: English, Dutch, French, + German, Italian, Portuguese and Spanish are currently + supported. +

+
+
+
+
+
+ + +
+

Community

+

+ Join the Ghostfolio + Slack + community full of enthusiastic investors and discuss the + latest market trends. +

+
+
+
+
+
+ + +
+

Open Source Software

+

+ The source code is fully available as + open source software + (OSS) and licensed under the AGPLv3 License. +

+
+
@@ -241,9 +295,9 @@
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 c0e64715d..347bfc567 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 @@ -12,15 +12,28 @@ const routes: Routes = [ { canActivate: [AuthGuard], children: [ - { path: '', redirectTo: 'overview', pathMatch: 'full' }, - { path: 'overview', component: HomeOverviewComponent }, - { path: 'holdings', component: HomeHoldingsComponent }, - { path: 'summary', component: HomeSummaryComponent }, - { path: 'market', component: HomeMarketComponent } + { + path: '', + component: HomeOverviewComponent + }, + { + path: 'holdings', + component: HomeHoldingsComponent, + title: $localize`Holdings` + }, + { + path: 'summary', + component: HomeSummaryComponent, + title: $localize`Summary` + }, + { + path: 'market', + component: HomeMarketComponent, + title: $localize`Markets` + } ], component: HomePageComponent, - path: '', - title: $localize`Overview` + path: '' } ]; 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 67e38f671..77c318395 100644 --- a/apps/client/src/app/pages/home/home-page.component.ts +++ b/apps/client/src/app/pages/home/home-page.component.ts @@ -7,7 +7,7 @@ import { } 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 { TabConfiguration, User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; @@ -24,8 +24,7 @@ export class HomePageComponent implements OnDestroy, OnInit { public hasMessage: boolean; public hasPermissionToAccessFearAndGreedIndex: boolean; - public info: InfoItem; - public tabs: { iconName: string; path: string }[] = []; + public tabs: TabConfiguration[] = []; public user: User; private unsubscribeSubject = new Subject(); @@ -35,16 +34,39 @@ export class HomePageComponent implements OnDestroy, OnInit { private dataService: DataService, private userService: UserService ) { - this.info = this.dataService.fetchInfo(); + const { globalPermissions, systemMessage } = this.dataService.fetchInfo(); + + this.hasPermissionToAccessFearAndGreedIndex = hasPermission( + globalPermissions, + permissions.enableFearAndGreedIndex + ); this.userService.stateChanged .pipe(takeUntil(this.unsubscribeSubject)) .subscribe((state) => { if (state?.user) { this.tabs = [ - { iconName: 'analytics-outline', path: 'overview' }, - { iconName: 'wallet-outline', path: 'holdings' }, - { iconName: 'reader-outline', path: 'summary' } + { + iconName: 'analytics-outline', + label: $localize`Overview`, + path: ['/home'] + }, + { + iconName: 'wallet-outline', + label: $localize`Holdings`, + path: ['/home', 'holdings'] + }, + { + iconName: 'reader-outline', + label: $localize`Summary`, + path: ['/home', 'summary'] + }, + { + iconName: 'newspaper-outline', + label: $localize`Markets`, + path: ['/home', 'market'], + showCondition: this.hasPermissionToAccessFearAndGreedIndex + } ]; this.user = state.user; @@ -52,16 +74,7 @@ export class HomePageComponent implements OnDestroy, OnInit { hasPermission( this.user?.permissions, permissions.createUserAccount - ) || !!this.info.systemMessage; - - this.hasPermissionToAccessFearAndGreedIndex = hasPermission( - this.info?.globalPermissions, - permissions.enableFearAndGreedIndex - ); - - if (this.hasPermissionToAccessFearAndGreedIndex) { - this.tabs.push({ iconName: 'newspaper-outline', path: 'market' }); - } + ) || !!systemMessage; this.changeDetectorRef.markForCheck(); } diff --git a/apps/client/src/app/pages/home/home-page.html b/apps/client/src/app/pages/home/home-page.html index 38b7ccdb6..ce1d84851 100644 --- a/apps/client/src/app/pages/home/home-page.html +++ b/apps/client/src/app/pages/home/home-page.html @@ -1,14 +1,21 @@ - + + + -
#User +
#User + Country + Registration + Accounts + Activities + Engagement per Day Last Request + Last Request +
{{ i + 1 }} +
{{ i + 1 }}
- {{ userItem.id }} - {{ (userItem.id | slice:0:5) + '...' }}
+ + {{ getEmojiFlag(userItem.country) }} + {{ formatDistanceToNow(userItem.createdAt) }} + + + + {{ formatDistanceToNow(userItem.lastActivity) }} + - + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Ghostfolio + {{ product2.name }} +
{{ product1.slogan }}{{ product2.slogan }}
Founded{{ product1.founded }}{{ product2.founded }}
Origin{{ product1.origin }}{{ product2.origin }}
Region{{ product1.region }}{{ product2.region }}
+ Available in + + {{ language }}{{ isLast ? '' : ', ' }} + + {{ language }}{{ isLast ? '' : ', ' }} +
+ Open Source Software + + ✅ Yes❌ No + + ✅ Yes❌ No + +
+ Self-Hosting + + ✅ Yes❌ No + + ✅ Yes❌ No +
+ Use anonymously + + ✅ Yes❌ No + + ✅ Yes❌ No +
+ Free Plan + + ✅ Yes❌ No + + ✅ Yes❌ No +
Pricing + Starting from {{ product1.pricingPerYear }} / year + + Starting from {{ product2.pricingPerYear }} / + year +
Notes{{ product1.note }}{{ product2.note }}
+ +
+

+ Please note that the information provided is based on our + independent research and analysis. This website is not affiliated + with {{ product2.name }} or any other product mentioned in the + comparison. As the landscape of personal finance tools evolves, it + is essential to verify any specific details or changes directly from + the respective product page. Data needs a refresh? Help us maintain + accurate data on + GitHub. +

+
+
+

+ Ready to take your investments to the + next level? +

+

+ Effortlessly track, analyze, and visualize your wealth with + Ghostfolio. +

+ +
+
+
    +
  • + {{ product1.name }} +
  • +
  • + {{ product2.name }} +
  • +
  • + Alternative +
  • +
  • + App +
  • +
  • + Community +
  • +
  • + Fintech +
  • +
  • + Investment +
  • +
  • + Investor +
  • +
  • + Open Source +
  • +
  • + OSS +
  • +
  • + Personal Finance +
  • +
  • + Privacy +
  • +
  • + Portfolio +
  • +
  • + Software +
  • +
  • + Tool +
  • +
  • + User Experience +
  • +
  • + Wealth +
  • +
  • + Wealth Management +
  • +
+
+ + +
+
+
diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.scss b/apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.scss new file mode 100644 index 000000000..9726e095f --- /dev/null +++ b/apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.scss @@ -0,0 +1,25 @@ +:host { + color: rgb(var(--dark-primary-text)); + display: block; + + a { + color: rgba(var(--palette-primary-500), 1); + font-weight: 500; + + &:hover { + color: rgba(var(--palette-primary-300), 1); + } + } + + .call-to-action { + background-color: rgba(var(--palette-foreground-text), 0.02); + } +} + +:host-context(.is-dark-theme) { + color: rgb(var(--light-primary-text)); + + .call-to-action { + background-color: rgba(var(--palette-foreground-text-dark), 0.02); + } +} diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/products.ts b/apps/client/src/app/pages/resources/personal-finance-tools/products.ts new file mode 100644 index 000000000..2dc29ee1e --- /dev/null +++ b/apps/client/src/app/pages/resources/personal-finance-tools/products.ts @@ -0,0 +1,338 @@ +import { Product } from '@ghostfolio/common/interfaces'; + +import { AltooPageComponent } from './products/altoo-page.component'; +import { CopilotMoneyPageComponent } from './products/copilot-money-page.component'; +import { DeltaPageComponent } from './products/delta-page.component'; +import { DivvyDiaryPageComponent } from './products/divvydiary-page.component'; +import { ExirioPageComponent } from './products/exirio-page.component'; +import { FolisharePageComponent } from './products/folishare-page.component'; +import { GetquinPageComponent } from './products/getquin-page.component'; +import { GoSpatzPageComponent } from './products/gospatz-page.component'; +import { JustEtfPageComponent } from './products/justetf-page.component'; +import { KuberaPageComponent } from './products/kubera-page.component'; +import { MaybeFinancePageComponent } from './products/maybe-finance-page.component'; +import { MonsePageComponent } from './products/monse-page.component'; +import { ParqetPageComponent } from './products/parqet-page.component'; +import { PlannixPageComponent } from './products/plannix-page.component'; +import { PortfolioDividendTrackerPageComponent } from './products/portfolio-dividend-tracker-page.component'; +import { PortseidoPageComponent } from './products/portseido-page.component'; +import { ProjectionLabPageComponent } from './products/projectionlab-page.component'; +import { SeekingAlphaPageComponent } from './products/seeking-alpha-page.component'; +import { SharesightPageComponent } from './products/sharesight-page.component'; +import { SimplePortfolioPageComponent } from './products/simple-portfolio-page.component'; +import { SnowballAnalyticsPageComponent } from './products/snowball-analytics-page.component'; +import { SumioPageComponent } from './products/sumio-page.component'; +import { UtlunaPageComponent } from './products/utluna-page.component'; +import { YeekateePageComponent } from './products/yeekatee-page.component'; + +export const products: Product[] = [ + { + component: undefined, + founded: 2021, + hasFreePlan: true, + hasSelfHostingAbility: true, + isOpenSource: true, + key: 'ghostfolio', + languages: [ + 'Dutch', + 'English', + 'French', + 'German', + 'Italian', + 'Portuguese', + 'Spanish' + ], + name: 'Ghostfolio', + origin: 'Switzerland', + pricingPerYear: '$19', + region: 'Global', + slogan: 'Open Source Wealth Management', + useAnonymously: true + }, + { + component: AltooPageComponent, + founded: 2017, + hasSelfHostingAbility: false, + isOpenSource: false, + key: 'altoo', + name: 'Altoo Wealth Platform', + origin: 'Switzerland', + slogan: 'Simplicity for Complex Wealth' + }, + { + component: CopilotMoneyPageComponent, + founded: 2019, + hasFreePlan: false, + hasSelfHostingAbility: false, + isOpenSource: false, + key: 'copilot-money', + name: 'Copilot Money', + origin: 'United States', + pricingPerYear: '$70', + slogan: 'Do money better with Copilot' + }, + { + component: DeltaPageComponent, + founded: 2017, + hasFreePlan: true, + hasSelfHostingAbility: false, + isOpenSource: false, + key: 'delta', + name: 'Delta Investment Tracker', + note: 'Acquired by eToro', + origin: 'Belgium', + slogan: 'The app to track all your investments. Make smart moves only.' + }, + { + component: DivvyDiaryPageComponent, + founded: 2019, + hasFreePlan: true, + hasSelfHostingAbility: false, + isOpenSource: false, + key: 'divvydiary', + languages: ['English', 'German'], + name: 'DivvyDiary', + origin: 'Germany', + pricingPerYear: '€65', + slogan: 'Your personal Dividend Calendar' + }, + { + component: ExirioPageComponent, + founded: 2020, + hasFreePlan: true, + hasSelfHostingAbility: false, + isOpenSource: false, + key: 'exirio', + name: 'Exirio', + origin: 'United States', + pricingPerYear: '$100', + slogan: 'All your wealth, in one place.' + }, + { + component: FolisharePageComponent, + hasFreePlan: true, + hasSelfHostingAbility: false, + isOpenSource: false, + key: 'folishare', + languages: ['English', 'German'], + name: 'folishare', + origin: 'Austria', + pricingPerYear: '$65', + slogan: 'Take control over your investments' + }, + { + component: GetquinPageComponent, + founded: 2020, + hasFreePlan: true, + hasSelfHostingAbility: false, + isOpenSource: false, + key: 'getquin', + languages: ['English', 'German'], + name: 'getquin', + origin: 'Germany', + pricingPerYear: '€48', + slogan: 'Portfolio Tracker, Analysis & Community' + }, + { + component: GoSpatzPageComponent, + hasFreePlan: true, + hasSelfHostingAbility: false, + isOpenSource: false, + key: 'gospatz', + name: 'goSPATZ', + origin: 'Germany', + slogan: 'Volle Kontrolle über deine Investitionen' + }, + { + component: JustEtfPageComponent, + founded: 2011, + hasFreePlan: true, + hasSelfHostingAbility: false, + isOpenSource: false, + key: 'justetf', + name: 'justETF', + origin: 'Germany', + pricingPerYear: '€119', + slogan: 'ETF portfolios made simple' + }, + { + component: KuberaPageComponent, + founded: 2019, + hasFreePlan: false, + hasSelfHostingAbility: false, + isOpenSource: false, + key: 'kubera', + name: 'Kubera®', + origin: 'United States', + pricingPerYear: '$150', + slogan: 'The Time Machine for your Net Worth' + }, + { + component: MaybeFinancePageComponent, + founded: 2021, + hasSelfHostingAbility: false, + isOpenSource: false, + key: 'maybe-finance', + languages: ['English'], + name: 'Maybe Finance', + note: 'Sunset in 2023', + origin: 'United States', + pricingPerYear: '$145', + region: 'United States', + slogan: 'Your financial future, in your control' + }, + { + component: MonsePageComponent, + hasFreePlan: false, + hasSelfHostingAbility: false, + isOpenSource: false, + key: 'monse', + name: 'Monse', + pricingPerYear: '$60', + slogan: 'Gain financial control and keep your data private.' + }, + { + component: ParqetPageComponent, + founded: 2020, + hasSelfHostingAbility: false, + hasFreePlan: true, + isOpenSource: false, + key: 'parqet', + name: 'Parqet', + note: 'Originally named as Tresor One', + origin: 'Germany', + pricingPerYear: '€88', + region: 'Austria, Germany, Switzerland', + slogan: 'Dein Vermögen immer im Blick' + }, + { + component: PlannixPageComponent, + founded: 2023, + hasSelfHostingAbility: false, + isOpenSource: false, + key: 'plannix', + name: 'Plannix', + origin: 'Italy', + slogan: 'Your Personal Finance Hub' + }, + { + component: PortfolioDividendTrackerPageComponent, + hasFreePlan: false, + hasSelfHostingAbility: false, + isOpenSource: false, + key: 'portfolio-dividend-tracker', + languages: ['English', 'Dutch'], + name: 'Portfolio Dividend Tracker', + origin: 'Netherlands', + pricingPerYear: '€60', + slogan: 'Manage all your portfolios' + }, + { + component: PortseidoPageComponent, + founded: 2021, + hasFreePlan: true, + hasSelfHostingAbility: false, + isOpenSource: false, + key: 'portseido', + languages: ['Dutch', 'English', 'French', 'German'], + name: 'Portseido', + origin: 'Thailand', + pricingPerYear: '$96', + slogan: 'Portfolio Performance and Dividend Tracker' + }, + { + component: ProjectionLabPageComponent, + founded: 2021, + hasFreePlan: true, + hasSelfHostingAbility: true, + isOpenSource: false, + key: 'projectionlab', + name: 'ProjectionLab', + origin: 'United States', + pricingPerYear: '$108', + slogan: 'Build Financial Plans You Love.' + }, + { + component: SeekingAlphaPageComponent, + founded: 2004, + hasFreePlan: false, + hasSelfHostingAbility: false, + isOpenSource: false, + key: 'seeking-alpha', + name: 'Seeking Alpha', + origin: 'United States', + pricingPerYear: '$239', + slogan: 'Stock Market Analysis & Tools for Investors' + }, + { + component: SharesightPageComponent, + founded: 2007, + hasFreePlan: true, + hasSelfHostingAbility: false, + isOpenSource: false, + key: 'sharesight', + name: 'Sharesight', + origin: 'New Zealand', + pricingPerYear: '$135', + region: 'Global', + slogan: 'Stock Portfolio Tracker' + }, + { + component: SimplePortfolioPageComponent, + hasFreePlan: true, + hasSelfHostingAbility: false, + isOpenSource: false, + key: 'simple-portfolio', + name: 'Simple Portfolio', + origin: 'Czech Republic', + pricingPerYear: '€80', + slogan: 'Stock Portfolio Tracker' + }, + { + component: SnowballAnalyticsPageComponent, + founded: 2021, + hasFreePlan: true, + hasSelfHostingAbility: false, + isOpenSource: false, + key: 'snowball-analytics', + name: 'Snowball Analytics', + origin: 'France', + pricingPerYear: '$80', + slogan: 'Simple and powerful portfolio tracker' + }, + { + component: SumioPageComponent, + hasFreePlan: true, + hasSelfHostingAbility: false, + isOpenSource: false, + key: 'sumio', + name: 'Sumio', + origin: 'Czech Republic', + pricingPerYear: '$20', + slogan: 'Sum up and build your wealth.' + }, + { + component: UtlunaPageComponent, + hasFreePlan: true, + hasSelfHostingAbility: false, + isOpenSource: false, + key: 'utluna', + languages: ['English', 'French', 'German'], + name: 'Utluna', + origin: 'Switzerland', + pricingPerYear: '$300', + slogan: 'Your Portfolio. Revealed.', + useAnonymously: true + }, + { + component: YeekateePageComponent, + founded: 2021, + hasSelfHostingAbility: false, + isOpenSource: false, + key: 'yeekatee', + name: 'yeekatee', + origin: 'Switzerland', + region: 'Switzerland', + slogan: 'Connect. Share. Invest.' + } +]; diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/products/altoo-page.component.ts b/apps/client/src/app/pages/resources/personal-finance-tools/products/altoo-page.component.ts new file mode 100644 index 000000000..c810298f1 --- /dev/null +++ b/apps/client/src/app/pages/resources/personal-finance-tools/products/altoo-page.component.ts @@ -0,0 +1,24 @@ +import { CommonModule } from '@angular/common'; +import { Component } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { RouterModule } from '@angular/router'; + +import { products } from '../products'; + +@Component({ + host: { class: 'page' }, + imports: [CommonModule, MatButtonModule, RouterModule], + selector: 'gf-altoo-page', + standalone: true, + styleUrls: ['../product-page-template.scss'], + templateUrl: '../product-page-template.html' +}) +export class AltooPageComponent { + public product1 = products.find(({ key }) => { + return key === 'ghostfolio'; + }); + + public product2 = products.find(({ key }) => { + return key === 'altoo'; + }); +} diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/products/copilot-money-page.component.ts b/apps/client/src/app/pages/resources/personal-finance-tools/products/copilot-money-page.component.ts new file mode 100644 index 000000000..ed941ab61 --- /dev/null +++ b/apps/client/src/app/pages/resources/personal-finance-tools/products/copilot-money-page.component.ts @@ -0,0 +1,24 @@ +import { CommonModule } from '@angular/common'; +import { Component } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { RouterModule } from '@angular/router'; + +import { products } from '../products'; + +@Component({ + host: { class: 'page' }, + imports: [CommonModule, MatButtonModule, RouterModule], + selector: 'gf-copilot-money-page', + standalone: true, + styleUrls: ['../product-page-template.scss'], + templateUrl: '../product-page-template.html' +}) +export class CopilotMoneyPageComponent { + public product1 = products.find(({ key }) => { + return key === 'ghostfolio'; + }); + + public product2 = products.find(({ key }) => { + return key === 'copilot-money'; + }); +} diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/products/delta-page.component.ts b/apps/client/src/app/pages/resources/personal-finance-tools/products/delta-page.component.ts new file mode 100644 index 000000000..cf8f402d9 --- /dev/null +++ b/apps/client/src/app/pages/resources/personal-finance-tools/products/delta-page.component.ts @@ -0,0 +1,24 @@ +import { CommonModule } from '@angular/common'; +import { Component } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { RouterModule } from '@angular/router'; + +import { products } from '../products'; + +@Component({ + host: { class: 'page' }, + imports: [CommonModule, MatButtonModule, RouterModule], + selector: 'gf-delta-page', + standalone: true, + styleUrls: ['../product-page-template.scss'], + templateUrl: '../product-page-template.html' +}) +export class DeltaPageComponent { + public product1 = products.find(({ key }) => { + return key === 'ghostfolio'; + }); + + public product2 = products.find(({ key }) => { + return key === 'delta'; + }); +} diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/products/divvydiary-page.component.ts b/apps/client/src/app/pages/resources/personal-finance-tools/products/divvydiary-page.component.ts new file mode 100644 index 000000000..86d57377b --- /dev/null +++ b/apps/client/src/app/pages/resources/personal-finance-tools/products/divvydiary-page.component.ts @@ -0,0 +1,24 @@ +import { CommonModule } from '@angular/common'; +import { Component } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { RouterModule } from '@angular/router'; + +import { products } from '../products'; + +@Component({ + host: { class: 'page' }, + imports: [CommonModule, MatButtonModule, RouterModule], + selector: 'gf-divvy-diary-page', + standalone: true, + styleUrls: ['../product-page-template.scss'], + templateUrl: '../product-page-template.html' +}) +export class DivvyDiaryPageComponent { + public product1 = products.find(({ key }) => { + return key === 'ghostfolio'; + }); + + public product2 = products.find(({ key }) => { + return key === 'divvydiary'; + }); +} diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/products/exirio-page.component.ts b/apps/client/src/app/pages/resources/personal-finance-tools/products/exirio-page.component.ts new file mode 100644 index 000000000..488794e5f --- /dev/null +++ b/apps/client/src/app/pages/resources/personal-finance-tools/products/exirio-page.component.ts @@ -0,0 +1,24 @@ +import { CommonModule } from '@angular/common'; +import { Component } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { RouterModule } from '@angular/router'; + +import { products } from '../products'; + +@Component({ + host: { class: 'page' }, + imports: [CommonModule, MatButtonModule, RouterModule], + selector: 'gf-exirio-page', + standalone: true, + styleUrls: ['../product-page-template.scss'], + templateUrl: '../product-page-template.html' +}) +export class ExirioPageComponent { + public product1 = products.find(({ key }) => { + return key === 'ghostfolio'; + }); + + public product2 = products.find(({ key }) => { + return key === 'exirio'; + }); +} diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/products/folishare-page.component.ts b/apps/client/src/app/pages/resources/personal-finance-tools/products/folishare-page.component.ts new file mode 100644 index 000000000..64cd60b31 --- /dev/null +++ b/apps/client/src/app/pages/resources/personal-finance-tools/products/folishare-page.component.ts @@ -0,0 +1,24 @@ +import { CommonModule } from '@angular/common'; +import { Component } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { RouterModule } from '@angular/router'; + +import { products } from '../products'; + +@Component({ + host: { class: 'page' }, + imports: [CommonModule, MatButtonModule, RouterModule], + selector: 'gf-folishare-page', + standalone: true, + styleUrls: ['../product-page-template.scss'], + templateUrl: '../product-page-template.html' +}) +export class FolisharePageComponent { + public product1 = products.find(({ key }) => { + return key === 'ghostfolio'; + }); + + public product2 = products.find(({ key }) => { + return key === 'folishare'; + }); +} diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/products/getquin-page.component.ts b/apps/client/src/app/pages/resources/personal-finance-tools/products/getquin-page.component.ts new file mode 100644 index 000000000..dcd7ae402 --- /dev/null +++ b/apps/client/src/app/pages/resources/personal-finance-tools/products/getquin-page.component.ts @@ -0,0 +1,24 @@ +import { CommonModule } from '@angular/common'; +import { Component } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { RouterModule } from '@angular/router'; + +import { products } from '../products'; + +@Component({ + host: { class: 'page' }, + imports: [CommonModule, MatButtonModule, RouterModule], + selector: 'gf-getquin-page', + standalone: true, + styleUrls: ['../product-page-template.scss'], + templateUrl: '../product-page-template.html' +}) +export class GetquinPageComponent { + public product1 = products.find(({ key }) => { + return key === 'ghostfolio'; + }); + + public product2 = products.find(({ key }) => { + return key === 'getquin'; + }); +} diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/products/gospatz-page.component.ts b/apps/client/src/app/pages/resources/personal-finance-tools/products/gospatz-page.component.ts new file mode 100644 index 000000000..f14ab1575 --- /dev/null +++ b/apps/client/src/app/pages/resources/personal-finance-tools/products/gospatz-page.component.ts @@ -0,0 +1,24 @@ +import { CommonModule } from '@angular/common'; +import { Component } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { RouterModule } from '@angular/router'; + +import { products } from '../products'; + +@Component({ + host: { class: 'page' }, + imports: [CommonModule, MatButtonModule, RouterModule], + selector: 'gf-gospatz-page', + standalone: true, + styleUrls: ['../product-page-template.scss'], + templateUrl: '../product-page-template.html' +}) +export class GoSpatzPageComponent { + public product1 = products.find(({ key }) => { + return key === 'ghostfolio'; + }); + + public product2 = products.find(({ key }) => { + return key === 'gospatz'; + }); +} diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/products/justetf-page.component.ts b/apps/client/src/app/pages/resources/personal-finance-tools/products/justetf-page.component.ts new file mode 100644 index 000000000..f5b282b06 --- /dev/null +++ b/apps/client/src/app/pages/resources/personal-finance-tools/products/justetf-page.component.ts @@ -0,0 +1,24 @@ +import { CommonModule } from '@angular/common'; +import { Component } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { RouterModule } from '@angular/router'; + +import { products } from '../products'; + +@Component({ + host: { class: 'page' }, + imports: [CommonModule, MatButtonModule, RouterModule], + selector: 'gf-justetf-page', + standalone: true, + styleUrls: ['../product-page-template.scss'], + templateUrl: '../product-page-template.html' +}) +export class JustEtfPageComponent { + public product1 = products.find(({ key }) => { + return key === 'ghostfolio'; + }); + + public product2 = products.find(({ key }) => { + return key === 'justetf'; + }); +} diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/products/kubera-page.component.ts b/apps/client/src/app/pages/resources/personal-finance-tools/products/kubera-page.component.ts new file mode 100644 index 000000000..0071012c2 --- /dev/null +++ b/apps/client/src/app/pages/resources/personal-finance-tools/products/kubera-page.component.ts @@ -0,0 +1,24 @@ +import { CommonModule } from '@angular/common'; +import { Component } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { RouterModule } from '@angular/router'; + +import { products } from '../products'; + +@Component({ + host: { class: 'page' }, + imports: [CommonModule, MatButtonModule, RouterModule], + selector: 'gf-kubera-page', + standalone: true, + styleUrls: ['../product-page-template.scss'], + templateUrl: '../product-page-template.html' +}) +export class KuberaPageComponent { + public product1 = products.find(({ key }) => { + return key === 'ghostfolio'; + }); + + public product2 = products.find(({ key }) => { + return key === 'kubera'; + }); +} diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/products/maybe-finance-page.component.ts b/apps/client/src/app/pages/resources/personal-finance-tools/products/maybe-finance-page.component.ts new file mode 100644 index 000000000..5bda6a813 --- /dev/null +++ b/apps/client/src/app/pages/resources/personal-finance-tools/products/maybe-finance-page.component.ts @@ -0,0 +1,24 @@ +import { CommonModule } from '@angular/common'; +import { Component } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { RouterModule } from '@angular/router'; + +import { products } from '../products'; + +@Component({ + host: { class: 'page' }, + imports: [CommonModule, MatButtonModule, RouterModule], + selector: 'gf-maybe-finance-page', + standalone: true, + styleUrls: ['../product-page-template.scss'], + templateUrl: '../product-page-template.html' +}) +export class MaybeFinancePageComponent { + public product1 = products.find(({ key }) => { + return key === 'ghostfolio'; + }); + + public product2 = products.find(({ key }) => { + return key === 'maybe-finance'; + }); +} diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/products/monse-page.component.ts b/apps/client/src/app/pages/resources/personal-finance-tools/products/monse-page.component.ts new file mode 100644 index 000000000..8457d38e6 --- /dev/null +++ b/apps/client/src/app/pages/resources/personal-finance-tools/products/monse-page.component.ts @@ -0,0 +1,24 @@ +import { CommonModule } from '@angular/common'; +import { Component } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { RouterModule } from '@angular/router'; + +import { products } from '../products'; + +@Component({ + host: { class: 'page' }, + imports: [CommonModule, MatButtonModule, RouterModule], + selector: 'gf-monse-page', + standalone: true, + styleUrls: ['../product-page-template.scss'], + templateUrl: '../product-page-template.html' +}) +export class MonsePageComponent { + public product1 = products.find(({ key }) => { + return key === 'ghostfolio'; + }); + + public product2 = products.find(({ key }) => { + return key === 'monse'; + }); +} diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/products/parqet-page.component.ts b/apps/client/src/app/pages/resources/personal-finance-tools/products/parqet-page.component.ts new file mode 100644 index 000000000..bdc615951 --- /dev/null +++ b/apps/client/src/app/pages/resources/personal-finance-tools/products/parqet-page.component.ts @@ -0,0 +1,24 @@ +import { CommonModule } from '@angular/common'; +import { Component } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { RouterModule } from '@angular/router'; + +import { products } from '../products'; + +@Component({ + host: { class: 'page' }, + imports: [CommonModule, MatButtonModule, RouterModule], + selector: 'gf-parqet-page', + standalone: true, + styleUrls: ['../product-page-template.scss'], + templateUrl: '../product-page-template.html' +}) +export class ParqetPageComponent { + public product1 = products.find(({ key }) => { + return key === 'ghostfolio'; + }); + + public product2 = products.find(({ key }) => { + return key === 'parqet'; + }); +} diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/products/plannix-page.component.ts b/apps/client/src/app/pages/resources/personal-finance-tools/products/plannix-page.component.ts new file mode 100644 index 000000000..249d5956e --- /dev/null +++ b/apps/client/src/app/pages/resources/personal-finance-tools/products/plannix-page.component.ts @@ -0,0 +1,24 @@ +import { CommonModule } from '@angular/common'; +import { Component } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { RouterModule } from '@angular/router'; + +import { products } from '../products'; + +@Component({ + host: { class: 'page' }, + imports: [CommonModule, MatButtonModule, RouterModule], + selector: 'gf-plannix-page', + standalone: true, + styleUrls: ['../product-page-template.scss'], + templateUrl: '../product-page-template.html' +}) +export class PlannixPageComponent { + public product1 = products.find(({ key }) => { + return key === 'ghostfolio'; + }); + + public product2 = products.find(({ key }) => { + return key === 'plannix'; + }); +} diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/products/portfolio-dividend-tracker-page.component.ts b/apps/client/src/app/pages/resources/personal-finance-tools/products/portfolio-dividend-tracker-page.component.ts new file mode 100644 index 000000000..9d885f2d8 --- /dev/null +++ b/apps/client/src/app/pages/resources/personal-finance-tools/products/portfolio-dividend-tracker-page.component.ts @@ -0,0 +1,24 @@ +import { CommonModule } from '@angular/common'; +import { Component } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { RouterModule } from '@angular/router'; + +import { products } from '../products'; + +@Component({ + host: { class: 'page' }, + imports: [CommonModule, MatButtonModule, RouterModule], + selector: 'gf-portfolio-dividend-tracker-page', + standalone: true, + styleUrls: ['../product-page-template.scss'], + templateUrl: '../product-page-template.html' +}) +export class PortfolioDividendTrackerPageComponent { + public product1 = products.find(({ key }) => { + return key === 'ghostfolio'; + }); + + public product2 = products.find(({ key }) => { + return key === 'portfolio-dividend-tracker'; + }); +} diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/products/portseido-page.component.ts b/apps/client/src/app/pages/resources/personal-finance-tools/products/portseido-page.component.ts new file mode 100644 index 000000000..e0ba2b39b --- /dev/null +++ b/apps/client/src/app/pages/resources/personal-finance-tools/products/portseido-page.component.ts @@ -0,0 +1,24 @@ +import { CommonModule } from '@angular/common'; +import { Component } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { RouterModule } from '@angular/router'; + +import { products } from '../products'; + +@Component({ + host: { class: 'page' }, + imports: [CommonModule, MatButtonModule, RouterModule], + selector: 'gf-portseido-page', + standalone: true, + styleUrls: ['../product-page-template.scss'], + templateUrl: '../product-page-template.html' +}) +export class PortseidoPageComponent { + public product1 = products.find(({ key }) => { + return key === 'ghostfolio'; + }); + + public product2 = products.find(({ key }) => { + return key === 'portseido'; + }); +} diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/products/projectionlab-page.component.ts b/apps/client/src/app/pages/resources/personal-finance-tools/products/projectionlab-page.component.ts new file mode 100644 index 000000000..1d3d799fc --- /dev/null +++ b/apps/client/src/app/pages/resources/personal-finance-tools/products/projectionlab-page.component.ts @@ -0,0 +1,24 @@ +import { CommonModule } from '@angular/common'; +import { Component } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { RouterModule } from '@angular/router'; + +import { products } from '../products'; + +@Component({ + host: { class: 'page' }, + imports: [CommonModule, MatButtonModule, RouterModule], + selector: 'gf-projection-lab-page', + standalone: true, + styleUrls: ['../product-page-template.scss'], + templateUrl: '../product-page-template.html' +}) +export class ProjectionLabPageComponent { + public product1 = products.find(({ key }) => { + return key === 'ghostfolio'; + }); + + public product2 = products.find(({ key }) => { + return key === 'projectionlab'; + }); +} diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/products/seeking-alpha-page.component.ts b/apps/client/src/app/pages/resources/personal-finance-tools/products/seeking-alpha-page.component.ts new file mode 100644 index 000000000..caee77534 --- /dev/null +++ b/apps/client/src/app/pages/resources/personal-finance-tools/products/seeking-alpha-page.component.ts @@ -0,0 +1,24 @@ +import { CommonModule } from '@angular/common'; +import { Component } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { RouterModule } from '@angular/router'; + +import { products } from '../products'; + +@Component({ + host: { class: 'page' }, + imports: [CommonModule, MatButtonModule, RouterModule], + selector: 'gf-seeking-alpha-page', + standalone: true, + styleUrls: ['../product-page-template.scss'], + templateUrl: '../product-page-template.html' +}) +export class SeekingAlphaPageComponent { + public product1 = products.find(({ key }) => { + return key === 'ghostfolio'; + }); + + public product2 = products.find(({ key }) => { + return key === 'seeking-alpha'; + }); +} diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/products/sharesight-page.component.ts b/apps/client/src/app/pages/resources/personal-finance-tools/products/sharesight-page.component.ts new file mode 100644 index 000000000..9ce49a51c --- /dev/null +++ b/apps/client/src/app/pages/resources/personal-finance-tools/products/sharesight-page.component.ts @@ -0,0 +1,24 @@ +import { CommonModule } from '@angular/common'; +import { Component } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { RouterModule } from '@angular/router'; + +import { products } from '../products'; + +@Component({ + host: { class: 'page' }, + imports: [CommonModule, MatButtonModule, RouterModule], + selector: 'gf-sharesight-page', + standalone: true, + styleUrls: ['../product-page-template.scss'], + templateUrl: '../product-page-template.html' +}) +export class SharesightPageComponent { + public product1 = products.find(({ key }) => { + return key === 'ghostfolio'; + }); + + public product2 = products.find(({ key }) => { + return key === 'sharesight'; + }); +} diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/products/simple-portfolio-page.component.ts b/apps/client/src/app/pages/resources/personal-finance-tools/products/simple-portfolio-page.component.ts new file mode 100644 index 000000000..f06f3790f --- /dev/null +++ b/apps/client/src/app/pages/resources/personal-finance-tools/products/simple-portfolio-page.component.ts @@ -0,0 +1,24 @@ +import { CommonModule } from '@angular/common'; +import { Component } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { RouterModule } from '@angular/router'; + +import { products } from '../products'; + +@Component({ + host: { class: 'page' }, + imports: [CommonModule, MatButtonModule, RouterModule], + selector: 'gf-simple-portfolio-page', + standalone: true, + styleUrls: ['../product-page-template.scss'], + templateUrl: '../product-page-template.html' +}) +export class SimplePortfolioPageComponent { + public product1 = products.find(({ key }) => { + return key === 'ghostfolio'; + }); + + public product2 = products.find(({ key }) => { + return key === 'simple-portfolio'; + }); +} diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/products/snowball-analytics-page.component.ts b/apps/client/src/app/pages/resources/personal-finance-tools/products/snowball-analytics-page.component.ts new file mode 100644 index 000000000..379b6f7f8 --- /dev/null +++ b/apps/client/src/app/pages/resources/personal-finance-tools/products/snowball-analytics-page.component.ts @@ -0,0 +1,24 @@ +import { CommonModule } from '@angular/common'; +import { Component } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { RouterModule } from '@angular/router'; + +import { products } from '../products'; + +@Component({ + host: { class: 'page' }, + imports: [CommonModule, MatButtonModule, RouterModule], + selector: 'gf-snowball-analytics-page', + standalone: true, + styleUrls: ['../product-page-template.scss'], + templateUrl: '../product-page-template.html' +}) +export class SnowballAnalyticsPageComponent { + public product1 = products.find(({ key }) => { + return key === 'ghostfolio'; + }); + + public product2 = products.find(({ key }) => { + return key === 'snowball-analytics'; + }); +} diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/products/sumio-page.component.ts b/apps/client/src/app/pages/resources/personal-finance-tools/products/sumio-page.component.ts new file mode 100644 index 000000000..0a27eed49 --- /dev/null +++ b/apps/client/src/app/pages/resources/personal-finance-tools/products/sumio-page.component.ts @@ -0,0 +1,24 @@ +import { CommonModule } from '@angular/common'; +import { Component } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { RouterModule } from '@angular/router'; + +import { products } from '../products'; + +@Component({ + host: { class: 'page' }, + imports: [CommonModule, MatButtonModule, RouterModule], + selector: 'gf-sumio-page', + standalone: true, + styleUrls: ['../product-page-template.scss'], + templateUrl: '../product-page-template.html' +}) +export class SumioPageComponent { + public product1 = products.find(({ key }) => { + return key === 'ghostfolio'; + }); + + public product2 = products.find(({ key }) => { + return key === 'sumio'; + }); +} diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/products/utluna-page.component.ts b/apps/client/src/app/pages/resources/personal-finance-tools/products/utluna-page.component.ts new file mode 100644 index 000000000..7c80584b3 --- /dev/null +++ b/apps/client/src/app/pages/resources/personal-finance-tools/products/utluna-page.component.ts @@ -0,0 +1,24 @@ +import { CommonModule } from '@angular/common'; +import { Component } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { RouterModule } from '@angular/router'; + +import { products } from '../products'; + +@Component({ + host: { class: 'page' }, + imports: [CommonModule, MatButtonModule, RouterModule], + selector: 'gf-utluna-page', + standalone: true, + styleUrls: ['../product-page-template.scss'], + templateUrl: '../product-page-template.html' +}) +export class UtlunaPageComponent { + public product1 = products.find(({ key }) => { + return key === 'ghostfolio'; + }); + + public product2 = products.find(({ key }) => { + return key === 'utluna'; + }); +} diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/products/yeekatee-page.component.ts b/apps/client/src/app/pages/resources/personal-finance-tools/products/yeekatee-page.component.ts new file mode 100644 index 000000000..c85397808 --- /dev/null +++ b/apps/client/src/app/pages/resources/personal-finance-tools/products/yeekatee-page.component.ts @@ -0,0 +1,24 @@ +import { CommonModule } from '@angular/common'; +import { Component } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { RouterModule } from '@angular/router'; + +import { products } from '../products'; + +@Component({ + host: { class: 'page' }, + imports: [CommonModule, MatButtonModule, RouterModule], + selector: 'gf-yeekatee-page', + standalone: true, + styleUrls: ['../product-page-template.scss'], + templateUrl: '../product-page-template.html' +}) +export class YeekateePageComponent { + public product1 = products.find(({ key }) => { + return key === 'ghostfolio'; + }); + + public product2 = products.find(({ key }) => { + return key === 'yeekatee'; + }); +} diff --git a/apps/client/src/app/pages/resources/resources-page-routing.module.ts b/apps/client/src/app/pages/resources/resources-page-routing.module.ts index d0f385e10..7b00fcaae 100644 --- a/apps/client/src/app/pages/resources/resources-page-routing.module.ts +++ b/apps/client/src/app/pages/resources/resources-page-routing.module.ts @@ -10,7 +10,14 @@ const routes: Routes = [ component: ResourcesPageComponent, path: '', title: $localize`Resources` - } + }, + ...['personal-finance-tools'].map((path) => ({ + path, + loadChildren: () => + import( + './personal-finance-tools/personal-finance-tools-page.module' + ).then((m) => m.PersonalFinanceToolsPageModule) + })) ]; @NgModule({ diff --git a/apps/client/src/app/pages/resources/resources-page.html b/apps/client/src/app/pages/resources/resources-page.html index a32d21585..53484b270 100644 --- a/apps/client/src/app/pages/resources/resources-page.html +++ b/apps/client/src/app/pages/resources/resources-page.html @@ -1,8 +1,8 @@
-

Resources

-

Guides

+

Resources

+

Guides

@@ -36,7 +36,7 @@
-

Market

+

Markets

@@ -72,7 +72,7 @@
-

Glossary

+

Glossary

@@ -91,6 +91,22 @@
+
+
+

Deflation

+
+ Deflation is a decrease of the general price level for goods and + services in an economy over a period of time. +
+ +
+

Dollar-Cost Averaging (DCA)

@@ -109,7 +125,7 @@
-
+

Financial Independence

@@ -126,6 +142,65 @@
+
+
+

FIRE

+
+ FIRE is a movement that promotes saving and investing to achieve + financial independence and early retirement. +
+
+ FIRE → +
+
+
+
+
+

Inflation

+
+ Inflation is an increase of the general price level for goods and + services in an economy over a period of time. +
+ +
+
+
+
+

Personal Finance Tools

+
+ Personal finance tools are software applications that help + individuals manage their money, track expenses, set budgets, + monitor investments, and make informed financial decisions. +
+ +
+
+
+
+

Stagflation

+
+ Stagflation describes a situation in which there is a stagnant + economy with high unemployment and high inflation. +
+ +
+
diff --git a/apps/client/src/app/pages/resources/resources-page.module.ts b/apps/client/src/app/pages/resources/resources-page.module.ts index 084205886..10845a517 100644 --- a/apps/client/src/app/pages/resources/resources-page.module.ts +++ b/apps/client/src/app/pages/resources/resources-page.module.ts @@ -1,13 +1,12 @@ import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; -import { MatCardModule } from '@angular/material/card'; import { ResourcesPageRoutingModule } from './resources-page-routing.module'; import { ResourcesPageComponent } from './resources-page.component'; @NgModule({ declarations: [ResourcesPageComponent], - imports: [CommonModule, MatCardModule, ResourcesPageRoutingModule], + imports: [CommonModule, ResourcesPageRoutingModule], schemas: [CUSTOM_ELEMENTS_SCHEMA] }) export class ResourcesPageModule {} diff --git a/apps/client/src/app/pages/zen/zen-page-routing.module.ts b/apps/client/src/app/pages/zen/zen-page-routing.module.ts index 70cf4e84d..26b468aef 100644 --- a/apps/client/src/app/pages/zen/zen-page-routing.module.ts +++ b/apps/client/src/app/pages/zen/zen-page-routing.module.ts @@ -10,8 +10,7 @@ const routes: Routes = [ { canActivate: [AuthGuard], children: [ - { path: '', redirectTo: 'overview', pathMatch: 'full' }, - { path: 'overview', component: HomeOverviewComponent }, + { path: '', component: HomeOverviewComponent }, { path: 'holdings', component: HomeHoldingsComponent } ], component: ZenPageComponent, diff --git a/apps/client/src/app/pages/zen/zen-page.component.ts b/apps/client/src/app/pages/zen/zen-page.component.ts index 1a364097c..9f769e281 100644 --- a/apps/client/src/app/pages/zen/zen-page.component.ts +++ b/apps/client/src/app/pages/zen/zen-page.component.ts @@ -8,7 +8,7 @@ import { } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { UserService } from '@ghostfolio/client/services/user/user.service'; -import { User } from '@ghostfolio/common/interfaces'; +import { TabConfiguration, User } from '@ghostfolio/common/interfaces'; import { Subject } from 'rxjs'; import { first, takeUntil } from 'rxjs/operators'; @@ -18,7 +18,7 @@ import { first, takeUntil } from 'rxjs/operators'; styleUrls: ['./zen-page.scss'] }) export class ZenPageComponent implements AfterViewInit, OnDestroy, OnInit { - public tabs: { iconName: string; path: string }[] = []; + public tabs: TabConfiguration[] = []; public user: User; private unsubscribeSubject = new Subject(); @@ -34,8 +34,16 @@ export class ZenPageComponent implements AfterViewInit, OnDestroy, OnInit { .subscribe((state) => { if (state?.user) { this.tabs = [ - { iconName: 'analytics-outline', path: 'overview' }, - { iconName: 'wallet-outline', path: 'holdings' } + { + iconName: 'analytics-outline', + label: $localize`Overview`, + path: ['/zen'] + }, + { + iconName: 'wallet-outline', + label: $localize`Holdings`, + path: ['/zen', 'holdings'] + } ]; this.user = state.user; diff --git a/apps/client/src/app/pages/zen/zen-page.html b/apps/client/src/app/pages/zen/zen-page.html index 38b7ccdb6..ce1d84851 100644 --- a/apps/client/src/app/pages/zen/zen-page.html +++ b/apps/client/src/app/pages/zen/zen-page.html @@ -1,14 +1,21 @@ - + + + -
diff --git a/libs/ui/src/lib/data-provider-credits/data-provider-credits.component.html b/libs/ui/src/lib/data-provider-credits/data-provider-credits.component.html new file mode 100644 index 000000000..fb9f2c13b --- /dev/null +++ b/libs/ui/src/lib/data-provider-credits/data-provider-credits.component.html @@ -0,0 +1,9 @@ + + Market data provided by {{ + dataProviderInfo.name + }}, . + diff --git a/libs/ui/src/lib/data-provider-credits/data-provider-credits.component.scss b/libs/ui/src/lib/data-provider-credits/data-provider-credits.component.scss new file mode 100644 index 000000000..d732e2f02 --- /dev/null +++ b/libs/ui/src/lib/data-provider-credits/data-provider-credits.component.scss @@ -0,0 +1,7 @@ +:host { + display: block; + + a { + color: rgba(var(--palette-primary-500), 1); + } +} diff --git a/libs/ui/src/lib/data-provider-credits/data-provider-credits.component.ts b/libs/ui/src/lib/data-provider-credits/data-provider-credits.component.ts new file mode 100644 index 000000000..1da2fcfc9 --- /dev/null +++ b/libs/ui/src/lib/data-provider-credits/data-provider-credits.component.ts @@ -0,0 +1,14 @@ +import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; +import { DataProviderInfo } from '@ghostfolio/common/interfaces'; + +@Component({ + changeDetection: ChangeDetectionStrategy.OnPush, + selector: 'gf-data-provider-credits', + styleUrls: ['./data-provider-credits.component.scss'], + templateUrl: './data-provider-credits.component.html' +}) +export class DataProviderCreditsComponent { + @Input() dataProviderInfos: DataProviderInfo[]; + + public constructor() {} +} diff --git a/libs/ui/src/lib/data-provider-credits/data-provider-credits.module.ts b/libs/ui/src/lib/data-provider-credits/data-provider-credits.module.ts new file mode 100644 index 000000000..e5dd9d3b9 --- /dev/null +++ b/libs/ui/src/lib/data-provider-credits/data-provider-credits.module.ts @@ -0,0 +1,12 @@ +import { CommonModule } from '@angular/common'; +import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; + +import { DataProviderCreditsComponent } from './data-provider-credits.component'; + +@NgModule({ + declarations: [DataProviderCreditsComponent], + exports: [DataProviderCreditsComponent], + imports: [CommonModule], + schemas: [CUSTOM_ELEMENTS_SCHEMA] +}) +export class GfDataProviderCreditsModule {} diff --git a/libs/ui/src/lib/data-provider-credits/index.ts b/libs/ui/src/lib/data-provider-credits/index.ts new file mode 100644 index 000000000..5d3759577 --- /dev/null +++ b/libs/ui/src/lib/data-provider-credits/index.ts @@ -0,0 +1 @@ +export * from './data-provider-credits.module'; diff --git a/libs/ui/src/lib/fire-calculator/fire-calculator.component.html b/libs/ui/src/lib/fire-calculator/fire-calculator.component.html index 499f437e1..8037c9ad9 100644 --- a/libs/ui/src/lib/fire-calculator/fire-calculator.component.html +++ b/libs/ui/src/lib/fire-calculator/fire-calculator.component.html @@ -7,20 +7,14 @@ --> - Savings Rate + Savings Rate per Month - {{ currency }} per month - - - - Investment Horizon - - years + {{ currency }} @@ -31,18 +25,47 @@ step="0.25" type="number" /> - % +
%
+
+ + + Retirement Date +
+ {{ + calculatorForm.controls['retirementDate'].value + | date : 'MMMM YYYY' + }} +
+ + + +
- Projected Total Amount + + Projected Total Amount + + {{ currency }} +
diff --git a/libs/ui/src/lib/fire-calculator/fire-calculator.component.scss b/libs/ui/src/lib/fire-calculator/fire-calculator.component.scss index e02c91e3d..92ad6fe88 100644 --- a/libs/ui/src/lib/fire-calculator/fire-calculator.component.scss +++ b/libs/ui/src/lib/fire-calculator/fire-calculator.component.scss @@ -8,4 +8,31 @@ height: 100%; } } + + ::ng-deep { + .mdc-text-field--disabled { + .mdc-floating-label, + .mdc-text-field__input { + color: inherit; + } + + .mdc-notched-outline__leading, + .mdc-notched-outline__notch, + .mdc-notched-outline__trailing { + border-color: rgba(var(--dark-disabled-text)); + } + } + } +} + +:host-context(.is-dark-theme) { + ::ng-deep { + .mdc-text-field--disabled { + .mdc-notched-outline__leading, + .mdc-notched-outline__notch, + .mdc-notched-outline__trailing { + border-color: rgba(var(--light-disabled-text)); + } + } + } } diff --git a/libs/ui/src/lib/fire-calculator/fire-calculator.component.ts b/libs/ui/src/lib/fire-calculator/fire-calculator.component.ts index ed187672f..c9f82671c 100644 --- a/libs/ui/src/lib/fire-calculator/fire-calculator.component.ts +++ b/libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -1,7 +1,6 @@ import 'chartjs-adapter-date-fns'; import { - AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, @@ -13,9 +12,12 @@ import { ViewChild } from '@angular/core'; import { FormBuilder, FormControl } from '@angular/forms'; -import { getTooltipOptions } from '@ghostfolio/common/chart-helper'; +import { MatDatepicker } from '@angular/material/datepicker'; +import { + getTooltipOptions, + transformTickToAbbreviation +} from '@ghostfolio/common/chart-helper'; import { primaryColorRgb } from '@ghostfolio/common/config'; -import { transformTickToAbbreviation } from '@ghostfolio/common/helper'; import { ColorScheme } from '@ghostfolio/common/types'; import { BarController, @@ -26,29 +28,41 @@ import { Tooltip } from 'chart.js'; import * as Color from 'color'; -import { getMonth } from 'date-fns'; +import { + add, + addYears, + getMonth, + setMonth, + setYear, + startOfMonth, + sub +} from 'date-fns'; import { isNumber } from 'lodash'; -import { Subject, takeUntil } from 'rxjs'; +import { Subject, debounceTime, takeUntil } from 'rxjs'; import { FireCalculatorService } from './fire-calculator.service'; @Component({ - selector: 'gf-fire-calculator', changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './fire-calculator.component.html', - styleUrls: ['./fire-calculator.component.scss'] + selector: 'gf-fire-calculator', + styleUrls: ['./fire-calculator.component.scss'], + templateUrl: './fire-calculator.component.html' }) -export class FireCalculatorComponent - implements AfterViewInit, OnChanges, OnDestroy -{ +export class FireCalculatorComponent implements OnChanges, OnDestroy { + @Input() annualInterestRate = 5; @Input() colorScheme: ColorScheme; @Input() currency: string; @Input() deviceType: string; @Input() fireWealth: number; @Input() hasPermissionToUpdateUserSettings: boolean; @Input() locale: string; + @Input() projectedTotalAmount = 0; + @Input() retirementDate: Date; @Input() savingsRate = 0; + @Output() annualInterestRateChanged = new EventEmitter(); + @Output() projectedTotalAmountChanged = new EventEmitter(); + @Output() retirementDateChanged = new EventEmitter(); @Output() savingsRateChanged = new EventEmitter(); @ViewChild('chartCanvas') chartCanvas; @@ -57,13 +71,17 @@ export class FireCalculatorComponent annualInterestRate: new FormControl(undefined), paymentPerPeriod: new FormControl(undefined), principalInvestmentAmount: new FormControl(undefined), - time: new FormControl(undefined) + projectedTotalAmount: new FormControl(undefined), + retirementDate: new FormControl(undefined) }); - public chart: Chart; + public chart: Chart<'bar'>; public isLoading = true; - public projectedTotalAmount: number; + public periodsToRetire = 0; private readonly CONTRIBUTION_PERIOD = 12; + private readonly DEFAULT_RETIREMENT_DATE = startOfMonth( + addYears(new Date(), 10) + ); private unsubscribeSubject = new Subject(); public constructor( @@ -81,10 +99,11 @@ export class FireCalculatorComponent this.calculatorForm.setValue( { - annualInterestRate: 5, + annualInterestRate: this.annualInterestRate, paymentPerPeriod: this.savingsRate, principalInvestmentAmount: 0, - time: 10 + projectedTotalAmount: this.projectedTotalAmount, + retirementDate: this.retirementDate ?? this.DEFAULT_RETIREMENT_DATE }, { emitEvent: false @@ -97,48 +116,47 @@ export class FireCalculatorComponent this.initialize(); }); + this.calculatorForm + .get('annualInterestRate') + .valueChanges.pipe(debounceTime(500), takeUntil(this.unsubscribeSubject)) + .subscribe((annualInterestRate) => { + this.annualInterestRateChanged.emit(annualInterestRate); + }); this.calculatorForm .get('paymentPerPeriod') - .valueChanges.pipe(takeUntil(this.unsubscribeSubject)) + .valueChanges.pipe(debounceTime(500), takeUntil(this.unsubscribeSubject)) .subscribe((savingsRate) => { this.savingsRateChanged.emit(savingsRate); }); - } - - public ngAfterViewInit() { - if (isNumber(this.fireWealth) && this.fireWealth >= 0) { - setTimeout(() => { - // Wait for the chartCanvas - this.calculatorForm.patchValue( - { - principalInvestmentAmount: this.fireWealth, - paymentPerPeriod: this.savingsRate ?? 0 - }, - { - emitEvent: false - } - ); - this.calculatorForm.get('principalInvestmentAmount').disable(); - - this.changeDetectorRef.markForCheck(); + this.calculatorForm + .get('projectedTotalAmount') + .valueChanges.pipe(debounceTime(500), takeUntil(this.unsubscribeSubject)) + .subscribe((projectedTotalAmount) => { + this.projectedTotalAmountChanged.emit(projectedTotalAmount); + }); + this.calculatorForm + .get('retirementDate') + .valueChanges.pipe(debounceTime(500), takeUntil(this.unsubscribeSubject)) + .subscribe((retirementDate) => { + this.retirementDateChanged.emit(retirementDate); }); - } - - if (this.hasPermissionToUpdateUserSettings === true) { - this.calculatorForm.get('paymentPerPeriod').enable({ emitEvent: false }); - } else { - this.calculatorForm.get('paymentPerPeriod').disable({ emitEvent: false }); - } } public ngOnChanges() { + this.periodsToRetire = this.getPeriodsToRetire(); + if (isNumber(this.fireWealth) && this.fireWealth >= 0) { setTimeout(() => { // Wait for the chartCanvas this.calculatorForm.patchValue( { + annualInterestRate: this.annualInterestRate, principalInvestmentAmount: this.fireWealth, - paymentPerPeriod: this.savingsRate ?? 0 + paymentPerPeriod: this.savingsRate ?? 0, + projectedTotalAmount: + Number(this.getProjectedTotalAmount().toFixed(0)) ?? 0, + retirementDate: + this.getRetirementDate() ?? this.DEFAULT_RETIREMENT_DATE }, { emitEvent: false @@ -151,10 +169,37 @@ export class FireCalculatorComponent } if (this.hasPermissionToUpdateUserSettings === true) { + this.calculatorForm + .get('annualInterestRate') + .enable({ emitEvent: false }); this.calculatorForm.get('paymentPerPeriod').enable({ emitEvent: false }); + this.calculatorForm + .get('projectedTotalAmount') + .enable({ emitEvent: false }); } else { + this.calculatorForm + .get('annualInterestRate') + .disable({ emitEvent: false }); this.calculatorForm.get('paymentPerPeriod').disable({ emitEvent: false }); + this.calculatorForm + .get('projectedTotalAmount') + .disable({ emitEvent: false }); } + + this.calculatorForm.get('retirementDate').disable({ emitEvent: false }); + } + + public setMonthAndYear( + normalizedMonthAndYear: Date, + datepicker: MatDatepicker + ) { + const retirementDate = this.calculatorForm.get('retirementDate').value; + const newRetirementDate = setMonth( + setYear(retirementDate, normalizedMonthAndYear.getFullYear()), + normalizedMonthAndYear.getMonth() + ); + this.calculatorForm.get('retirementDate').setValue(newRetirementDate); + datepicker.close(); } public ngOnDestroy() { @@ -259,17 +304,22 @@ export class FireCalculatorComponent const labels = []; // Principal investment amount - const P: number = - this.calculatorForm.get('principalInvestmentAmount').value || 0; + const P: number = this.getP(); // Payment per period - const PMT = this.calculatorForm.get('paymentPerPeriod').value; + const PMT = this.getPMT(); // Annual interest rate - const r: number = this.calculatorForm.get('annualInterestRate').value / 100; + const r: number = this.getR(); + + // Calculate retirement date + // if we want to retire at month x, we need the projectedTotalAmount at month x-1 + const lastPeriodDate = sub(this.getRetirementDate(), { months: 1 }); + const yearsToRetire = lastPeriodDate.getFullYear() - currentYear; // Time - const t = this.calculatorForm.get('time').value; + // +1 to take into account the current year + const t = yearsToRetire + 1; for (let year = currentYear; year < currentYear + t; year++) { labels.push(year); @@ -306,7 +356,7 @@ export class FireCalculatorComponent for (let period = 1; period <= t; period++) { const periodInMonths = period * this.CONTRIBUTION_PERIOD - monthsPassedInCurrentYear; - const { interest, principal, totalAmount } = + const { interest, principal } = this.fireCalculatorService.calculateCompoundInterest({ P, periodInMonths, @@ -317,10 +367,6 @@ export class FireCalculatorComponent datasetDeposit.data.push(this.fireWealth); datasetInterest.data.push(interest.toNumber()); datasetSavings.data.push(principal.minus(this.fireWealth).toNumber()); - - if (period === t) { - this.projectedTotalAmount = totalAmount.toNumber(); - } } return { @@ -328,4 +374,67 @@ export class FireCalculatorComponent datasets: [datasetDeposit, datasetSavings, datasetInterest] }; } + + private getP() { + return this.fireWealth || 0; + } + + private getPeriodsToRetire(): number { + if (this.projectedTotalAmount) { + const periods = this.fireCalculatorService.calculatePeriodsToRetire({ + P: this.getP(), + totalAmount: this.projectedTotalAmount, + PMT: this.getPMT(), + r: this.getR() + }); + + return periods; + } else { + const today = new Date(); + const retirementDate = + this.retirementDate ?? this.DEFAULT_RETIREMENT_DATE; + + return ( + 12 * (retirementDate.getFullYear() - today.getFullYear()) + + retirementDate.getMonth() - + today.getMonth() + ); + } + } + + private getPMT() { + return this.savingsRate ?? 0; + } + + private getProjectedTotalAmount() { + if (this.projectedTotalAmount) { + return this.projectedTotalAmount || 0; + } else { + const { totalAmount } = + this.fireCalculatorService.calculateCompoundInterest({ + P: this.getP(), + periodInMonths: this.periodsToRetire, + PMT: this.getPMT(), + r: this.getR() + }); + + return totalAmount.toNumber(); + } + } + + private getR() { + return this.calculatorForm.get('annualInterestRate').value / 100; + } + + private getRetirementDate(): Date { + const monthsToRetire = this.periodsToRetire % 12; + const yearsToRetire = Math.floor(this.periodsToRetire / 12); + + return startOfMonth( + add(new Date(), { + months: monthsToRetire, + years: yearsToRetire + }) + ); + } } diff --git a/libs/ui/src/lib/fire-calculator/fire-calculator.module.ts b/libs/ui/src/lib/fire-calculator/fire-calculator.module.ts index 44fd48c2e..02b59dc27 100644 --- a/libs/ui/src/lib/fire-calculator/fire-calculator.module.ts +++ b/libs/ui/src/lib/fire-calculator/fire-calculator.module.ts @@ -2,11 +2,11 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { MatButtonModule } from '@angular/material/button'; +import { MatDatepickerModule } from '@angular/material/datepicker'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatInputModule } from '@angular/material/input'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; -import { GfValueModule } from '../value'; import { FireCalculatorComponent } from './fire-calculator.component'; import { FireCalculatorService } from './fire-calculator.service'; @@ -16,8 +16,8 @@ import { FireCalculatorService } from './fire-calculator.service'; imports: [ CommonModule, FormsModule, - GfValueModule, MatButtonModule, + MatDatepickerModule, MatFormFieldModule, MatInputModule, NgxSkeletonLoaderModule, diff --git a/libs/ui/src/lib/fire-calculator/fire-calculator.service.spec.ts b/libs/ui/src/lib/fire-calculator/fire-calculator.service.spec.ts new file mode 100644 index 000000000..492834366 --- /dev/null +++ b/libs/ui/src/lib/fire-calculator/fire-calculator.service.spec.ts @@ -0,0 +1,69 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import Big from 'big.js'; + +import { FireCalculatorService } from './fire-calculator.service'; + +describe('FireCalculatorService', () => { + let fireCalculatorService: FireCalculatorService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [FireCalculatorService] + }).compile(); + + fireCalculatorService = module.get( + FireCalculatorService + ); + }); + + describe('Test periods to retire', () => { + it('should return the correct amount of periods to retire with no interst rate', async () => { + const r = 0; + const P = 1000; + const totalAmount = 1900; + const PMT = 100; + + const periodsToRetire = fireCalculatorService.calculatePeriodsToRetire({ + P, + r, + PMT, + totalAmount + }); + + expect(periodsToRetire).toBe(9); + }); + + it('should return the 0 when total amount is 0', async () => { + const r = 0.05; + const P = 100000; + const totalAmount = 0; + const PMT = 10000; + + const periodsToRetire = fireCalculatorService.calculatePeriodsToRetire({ + P, + r, + PMT, + totalAmount + }); + + expect(periodsToRetire).toBe(0); + }); + + it('should return the correct amount of periods to retire with interst rate', async () => { + const r = 0.05; + const P = 598478.96; + const totalAmount = 812399.66; + const PMT = 6000; + const expectedPeriods = 24; + + const periodsToRetire = fireCalculatorService.calculatePeriodsToRetire({ + P, + r, + PMT, + totalAmount + }); + + expect(Math.round(periodsToRetire)).toBe(expectedPeriods); + }); + }); +}); diff --git a/libs/ui/src/lib/fire-calculator/fire-calculator.service.ts b/libs/ui/src/lib/fire-calculator/fire-calculator.service.ts index c19fdca68..44ea1eb98 100644 --- a/libs/ui/src/lib/fire-calculator/fire-calculator.service.ts +++ b/libs/ui/src/lib/fire-calculator/fire-calculator.service.ts @@ -40,4 +40,36 @@ export class FireCalculatorService { totalAmount }; } + + public calculatePeriodsToRetire({ + P, + PMT, + r, + totalAmount + }: { + P: number; + PMT: number; + r: number; + totalAmount: number; + }) { + if (r == 0) { + // No compound interest + return (totalAmount - P) / PMT; + } else if (totalAmount <= P) { + return 0; + } + + const periodInterest = new Big(r).div(this.COMPOUND_PERIOD); + const numerator1: number = Math.log10( + new Big(totalAmount).plus(new Big(PMT).div(periodInterest)).toNumber() + ); + const numerator2: number = Math.log10( + new Big(P).plus(new Big(PMT).div(periodInterest)).toNumber() + ); + const denominator: number = Math.log10( + new Big(1).plus(periodInterest).toNumber() + ); + + return (numerator1 - numerator2) / denominator; + } } diff --git a/libs/ui/src/lib/holdings-table/holdings-table.component.html b/libs/ui/src/lib/holdings-table/holdings-table.component.html new file mode 100644 index 000000000..5be58e663 --- /dev/null +++ b/libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -0,0 +1,182 @@ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + Name + +
+ {{ element.name }} +
+
+ {{ element.symbol }} +
+
+ First Activity + +
+ +
+
+ Value + +
+ +
+
+ Allocation + % + +
+ +
+
+ Performance + ± + +
+ +
+
+
+ + + + + +
+ +
+ +
+ +
diff --git a/libs/ui/src/lib/holdings-table/holdings-table.component.scss b/libs/ui/src/lib/holdings-table/holdings-table.component.scss new file mode 100644 index 000000000..e96a64f63 --- /dev/null +++ b/libs/ui/src/lib/holdings-table/holdings-table.component.scss @@ -0,0 +1,25 @@ +@import 'apps/client/src/styles/ghostfolio-style'; + +:host { + display: block; + + .holdings { + overflow-x: auto; + + .mat-mdc-table { + th { + ::ng-deep { + .mat-sort-header-container { + justify-content: inherit; + } + } + } + + .mat-mdc-row { + &.cursor-pointer { + cursor: pointer; + } + } + } + } +} diff --git a/apps/client/src/app/components/positions-table/positions-table.component.ts b/libs/ui/src/lib/holdings-table/holdings-table.component.ts similarity index 82% rename from apps/client/src/app/components/positions-table/positions-table.component.ts rename to libs/ui/src/lib/holdings-table/holdings-table.component.ts index acd76ef11..a4aee7710 100644 --- a/apps/client/src/app/components/positions-table/positions-table.component.ts +++ b/libs/ui/src/lib/holdings-table/holdings-table.component.ts @@ -13,18 +13,17 @@ import { MatPaginator } from '@angular/material/paginator'; import { MatSort } from '@angular/material/sort'; import { MatTableDataSource } from '@angular/material/table'; import { Router } from '@angular/router'; -import { ASSET_SUB_CLASS_EMERGENCY_FUND } from '@ghostfolio/common/config'; import { PortfolioPosition, UniqueAsset } from '@ghostfolio/common/interfaces'; import { AssetClass, Order as OrderModel } from '@prisma/client'; import { Subject, Subscription } from 'rxjs'; @Component({ - selector: 'gf-positions-table', changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './positions-table.component.html', - styleUrls: ['./positions-table.component.scss'] + selector: 'gf-holdings-table', + styleUrls: ['./holdings-table.component.scss'], + templateUrl: './holdings-table.component.html' }) -export class PositionsTableComponent implements OnChanges, OnDestroy, OnInit { +export class HoldingsTableComponent implements OnChanges, OnDestroy, OnInit { @Input() baseCurrency: string; @Input() deviceType: string; @Input() hasPermissionToCreateActivity: boolean; @@ -42,10 +41,7 @@ export class PositionsTableComponent implements OnChanges, OnDestroy, OnInit { public dataSource: MatTableDataSource = new MatTableDataSource(); public displayedColumns = []; - public ignoreAssetSubClasses = [ - AssetClass.CASH.toString(), - ASSET_SUB_CLASS_EMERGENCY_FUND - ]; + public ignoreAssetSubClasses = [AssetClass.CASH.toString()]; public isLoading = true; public routeQueryParams: Subscription; @@ -56,13 +52,13 @@ export class PositionsTableComponent implements OnChanges, OnDestroy, OnInit { public ngOnInit() {} public ngOnChanges() { - this.displayedColumns = ['icon', 'symbol', 'name']; + this.displayedColumns = ['icon', 'nameWithSymbol', 'dateOfFirstActivity']; if (this.hasPermissionToShowValues) { this.displayedColumns.push('value'); } - this.displayedColumns.push('allocationCurrent'); + this.displayedColumns.push('allocationInPercentage'); this.displayedColumns.push('performance'); this.isLoading = true; diff --git a/apps/client/src/app/components/positions-table/positions-table.module.ts b/libs/ui/src/lib/holdings-table/holdings-table.module.ts similarity index 78% rename from apps/client/src/app/components/positions-table/positions-table.module.ts rename to libs/ui/src/lib/holdings-table/holdings-table.module.ts index e9be0932e..507c45594 100644 --- a/apps/client/src/app/components/positions-table/positions-table.module.ts +++ b/libs/ui/src/lib/holdings-table/holdings-table.module.ts @@ -2,23 +2,22 @@ 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 { MatInputModule } from '@angular/material/input'; 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 { GfSymbolIconModule } from '../symbol-icon/symbol-icon.module'; -import { PositionsTableComponent } from './positions-table.component'; +import { HoldingsTableComponent } from './holdings-table.component'; @NgModule({ - declarations: [PositionsTableComponent], - exports: [PositionsTableComponent], + declarations: [HoldingsTableComponent], + exports: [HoldingsTableComponent], imports: [ CommonModule, GfNoTransactionsInfoModule, @@ -28,7 +27,6 @@ import { PositionsTableComponent } from './positions-table.component'; GfValueModule, MatButtonModule, MatDialogModule, - MatInputModule, MatPaginatorModule, MatSortModule, MatTableModule, @@ -37,4 +35,4 @@ import { PositionsTableComponent } from './positions-table.component'; ], schemas: [CUSTOM_ELEMENTS_SCHEMA] }) -export class GfPositionsTableModule {} +export class GfHoldingsTableModule {} diff --git a/libs/ui/src/lib/i18n.ts b/libs/ui/src/lib/i18n.ts index e08fe1bc0..5def3b749 100644 --- a/libs/ui/src/lib/i18n.ts +++ b/libs/ui/src/lib/i18n.ts @@ -3,10 +3,26 @@ import '@angular/localize/init'; const locales = { ACCOUNT: $localize`Account`, ASSET_CLASS: $localize`Asset Class`, + ASSET_SUB_CLASS: $localize`Asset Sub Class`, + CORE: $localize`Core`, + DATA_IMPORT_AND_EXPORT_TOOLTIP_BASIC: $localize`Switch to Ghostfolio Premium or Ghostfolio Open Source easily`, + DATA_IMPORT_AND_EXPORT_TOOLTIP_OSS: $localize`Switch to Ghostfolio Premium easily`, + DATA_IMPORT_AND_EXPORT_TOOLTIP_PREMIUM: $localize`Switch to Ghostfolio Open Source or Ghostfolio Basic easily`, EMERGENCY_FUND: $localize`Emergency Fund`, + GRANT: $localize`Grant`, + HIGHER_RISK: $localize`Higher Risk`, + IMPORT_ACTIVITY_ERROR_IS_DUPLICATE: $localize`This activity already exists.`, + LOWER_RISK: $localize`Lower Risk`, + MONTH: $localize`Month`, + MONTHS: $localize`Months`, OTHER: $localize`Other`, + RETIREMENT_PROVISION: $localize`Retirement Provision`, + SATELLITE: $localize`Satellite`, + SECURITIES: $localize`Securities`, SYMBOL: $localize`Symbol`, TAG: $localize`Tag`, + YEAR: $localize`Year`, + YEARS: $localize`Years`, // enum AssetClass CASH: $localize`Cash`, @@ -33,6 +49,6 @@ const locales = { 'South America': $localize`South America` }; -export function translate(aKey: string) { +export function translate(aKey: string): string { return locales[aKey] ?? aKey; } diff --git a/libs/ui/src/lib/line-chart/line-chart.component.ts b/libs/ui/src/lib/line-chart/line-chart.component.ts index dc984314d..c6eb68cec 100644 --- a/libs/ui/src/lib/line-chart/line-chart.component.ts +++ b/libs/ui/src/lib/line-chart/line-chart.component.ts @@ -66,7 +66,7 @@ export class LineChartComponent implements AfterViewInit, OnChanges, OnDestroy { @ViewChild('chartCanvas') chartCanvas; - public chart: Chart; + public chart: Chart<'line'>; public isLoading = true; private readonly ANIMATION_DURATION = 1200; @@ -154,7 +154,8 @@ export class LineChartComponent implements AfterViewInit, OnChanges, OnDestroy { data: benchmarkPrices, fill: false, label: this.benchmarkLabel, - pointRadius: 0 + pointRadius: 0, + spanGaps: false }, { backgroundColor: gradient, @@ -212,10 +213,11 @@ export class LineChartComponent implements AfterViewInit, OnChanges, OnDestroy { }, scales: { x: { + border: { + color: `rgba(${getTextColor(this.colorScheme)}, 0.1)` + }, display: this.showXAxis, grid: { - borderColor: `rgba(${getTextColor(this.colorScheme)}, 0.1)`, - color: `rgba(${getTextColor(this.colorScheme)}, 0.8)`, display: false }, time: { @@ -225,11 +227,24 @@ export class LineChartComponent implements AfterViewInit, OnChanges, OnDestroy { type: 'time' }, y: { + border: { + width: 0 + }, display: this.showYAxis, grid: { - borderColor: `rgba(${getTextColor(this.colorScheme)}, 0.1)`, - color: `rgba(${getTextColor(this.colorScheme)}, 0.8)`, - display: false + color: ({ scale, tick }) => { + if ( + tick.value === 0 || + tick.value === scale.max || + tick.value === scale.min || + tick.value === this.yMax || + tick.value === this.yMin + ) { + return `rgba(${getTextColor(this.colorScheme)}, 0.1)`; + } + + return 'transparent'; + } }, max: this.yMax, min: this.yMin, diff --git a/libs/ui/src/lib/line-chart/line-chart.module.ts b/libs/ui/src/lib/line-chart/line-chart.module.ts index 8173358b9..0483fc996 100644 --- a/libs/ui/src/lib/line-chart/line-chart.module.ts +++ b/libs/ui/src/lib/line-chart/line-chart.module.ts @@ -7,7 +7,6 @@ import { LineChartComponent } from './line-chart.component'; @NgModule({ declarations: [LineChartComponent], exports: [LineChartComponent], - imports: [CommonModule, NgxSkeletonLoaderModule], - providers: [] + imports: [CommonModule, NgxSkeletonLoaderModule] }) export class GfLineChartModule {} diff --git a/libs/ui/src/lib/logo/logo.component.html b/libs/ui/src/lib/logo/logo.component.html index 71524fb6f..313a16c79 100644 --- a/libs/ui/src/lib/logo/logo.component.html +++ b/libs/ui/src/lib/logo/logo.component.html @@ -1,4 +1,4 @@ - Ghostfolio{{ label ?? 'Ghostfolio' }} diff --git a/libs/ui/src/lib/logo/logo.component.scss b/libs/ui/src/lib/logo/logo.component.scss index 85315c55d..27fb1b311 100644 --- a/libs/ui/src/lib/logo/logo.component.scss +++ b/libs/ui/src/lib/logo/logo.component.scss @@ -1,12 +1,13 @@ :host { + .label { + font-weight: 600; + } + .logo { background-color: rgba(var(--dark-primary-text)); + margin-top: -2px; mask: url('/assets/ghost.svg') no-repeat center; } - - .name { - font-weight: 600; - } } :host-context(.is-dark-theme) { @@ -16,23 +17,23 @@ } :host-context(.large) { + .label { + font-size: 3rem; + } + .logo { height: 2.5rem; width: 2.5rem; } - - .name { - font-size: 3rem; - } } :host-context(.medium) { + .label { + font-size: 1.5rem; + } + .logo { height: 1.5rem; width: 1.5rem; } - - .name { - font-size: 1.5rem; - } } diff --git a/libs/ui/src/lib/logo/logo.component.stories.ts b/libs/ui/src/lib/logo/logo.component.stories.ts index ca9530eb8..196043eb3 100644 --- a/libs/ui/src/lib/logo/logo.component.stories.ts +++ b/libs/ui/src/lib/logo/logo.component.stories.ts @@ -24,7 +24,7 @@ Large.args = { size: 'large' }; -export const NoName = Template.bind({}); -NoName.args = { - hideName: true +export const NoLabel = Template.bind({}); +NoLabel.args = { + showLabel: false }; diff --git a/libs/ui/src/lib/logo/logo.component.ts b/libs/ui/src/lib/logo/logo.component.ts index 97947891e..ecb3885dc 100644 --- a/libs/ui/src/lib/logo/logo.component.ts +++ b/libs/ui/src/lib/logo/logo.component.ts @@ -2,8 +2,7 @@ import { ChangeDetectionStrategy, Component, HostBinding, - Input, - OnInit + Input } from '@angular/core'; @Component({ @@ -12,13 +11,10 @@ import { templateUrl: './logo.component.html', styleUrls: ['./logo.component.scss'] }) -export class LogoComponent implements OnInit { +export class LogoComponent { @HostBinding('class') @Input() size: 'large' | 'medium' = 'medium'; - @Input() hideName = false; + @Input() label: string; + @Input() showLabel = true; public constructor() {} - - public ngOnInit() { - this.hideName = this.hideName ?? false; - } } diff --git a/libs/ui/src/lib/logo/logo.module.ts b/libs/ui/src/lib/logo/logo.module.ts index bb0fe18a0..ced9bae30 100644 --- a/libs/ui/src/lib/logo/logo.module.ts +++ b/libs/ui/src/lib/logo/logo.module.ts @@ -7,7 +7,6 @@ import { LogoComponent } from './logo.component'; declarations: [LogoComponent], exports: [LogoComponent], imports: [CommonModule], - providers: [], schemas: [CUSTOM_ELEMENTS_SCHEMA] }) export class GfLogoModule {} diff --git a/libs/ui/src/lib/no-transactions-info/no-transactions-info.component.html b/libs/ui/src/lib/no-transactions-info/no-transactions-info.component.html index 9f30d437a..103b21078 100644 --- a/libs/ui/src/lib/no-transactions-info/no-transactions-info.component.html +++ b/libs/ui/src/lib/no-transactions-info/no-transactions-info.component.html @@ -1,13 +1,13 @@
- +
Time to add your first activity. 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 78cda4ff9..85869e043 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 @@ -10,7 +10,6 @@ import { NoTransactionsInfoComponent } from './no-transactions-info.component'; declarations: [NoTransactionsInfoComponent], exports: [NoTransactionsInfoComponent], imports: [CommonModule, GfLogoModule, MatButtonModule, RouterModule], - providers: [], schemas: [CUSTOM_ELEMENTS_SCHEMA] }) export class GfNoTransactionsInfoModule {} diff --git a/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts b/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts index 296776cc9..ec0a63eea 100644 --- a/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts +++ b/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts @@ -55,7 +55,7 @@ export class PortfolioProportionChartComponent @ViewChild('chartCanvas') chartCanvas: ElementRef; - public chart: Chart; + public chart: Chart<'pie'>; public isLoading = true; private readonly OTHER_KEY = 'OTHER'; @@ -100,38 +100,42 @@ export class PortfolioProportionChartComponent }; Object.keys(this.positions).forEach((symbol) => { - if (this.positions[symbol][this.keys[0]]) { - if (chartData[this.positions[symbol][this.keys[0]]]) { - chartData[this.positions[symbol][this.keys[0]]].value = chartData[ - this.positions[symbol][this.keys[0]] - ].value.plus(this.positions[symbol].value); + if (this.positions[symbol][this.keys[0]]?.toUpperCase()) { + if (chartData[this.positions[symbol][this.keys[0]].toUpperCase()]) { + chartData[this.positions[symbol][this.keys[0]].toUpperCase()].value = + chartData[ + this.positions[symbol][this.keys[0]].toUpperCase() + ].value.plus(this.positions[symbol].value); if ( - chartData[this.positions[symbol][this.keys[0]]].subCategory[ - this.positions[symbol][this.keys[1]] - ] + chartData[this.positions[symbol][this.keys[0]].toUpperCase()] + .subCategory[this.positions[symbol][this.keys[1]]] ) { - chartData[this.positions[symbol][this.keys[0]]].subCategory[ - this.positions[symbol][this.keys[1]] - ].value = chartData[ - this.positions[symbol][this.keys[0]] - ].subCategory[this.positions[symbol][this.keys[1]]].value.plus( - this.positions[symbol].value - ); + chartData[ + this.positions[symbol][this.keys[0]].toUpperCase() + ].subCategory[this.positions[symbol][this.keys[1]]].value = + chartData[ + this.positions[symbol][this.keys[0]].toUpperCase() + ].subCategory[this.positions[symbol][this.keys[1]]].value.plus( + this.positions[symbol].value + ); } else { - chartData[this.positions[symbol][this.keys[0]]].subCategory[ - this.positions[symbol][this.keys[1]] ?? UNKNOWN_KEY - ] = { value: new Big(this.positions[symbol].value) }; + chartData[ + this.positions[symbol][this.keys[0]].toUpperCase() + ].subCategory[this.positions[symbol][this.keys[1]] ?? UNKNOWN_KEY] = + { value: new Big(this.positions[symbol].value) }; } } else { - chartData[this.positions[symbol][this.keys[0]]] = { - name: this.positions[symbol].name, + chartData[this.positions[symbol][this.keys[0]].toUpperCase()] = { + name: this.positions[symbol][this.keys[0]], subCategory: {}, value: new Big(this.positions[symbol].value ?? 0) }; if (this.positions[symbol][this.keys[1]]) { - chartData[this.positions[symbol][this.keys[0]]].subCategory = { + chartData[ + this.positions[symbol][this.keys[0]].toUpperCase() + ].subCategory = { [this.positions[symbol][this.keys[1]]]: { value: new Big(this.positions[symbol].value) } @@ -232,8 +236,8 @@ export class PortfolioProportionChartComponent } ]; - let labels = chartDataSorted.map(([label]) => { - return label; + let labels = chartDataSorted.map(([symbol, { name }]) => { + return name; }); if (this.keys[1]) { @@ -394,6 +398,9 @@ export class PortfolioProportionChartComponent })} ${this.baseCurrency} (${percentage.toFixed(2)}%)` ]; } + }, + title: () => { + return ''; } } }; diff --git a/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.module.ts b/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.module.ts index 9472b1cfa..587c19072 100644 --- a/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.module.ts +++ b/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.module.ts @@ -7,7 +7,6 @@ import { PortfolioProportionChartComponent } from './portfolio-proportion-chart. @NgModule({ declarations: [PortfolioProportionChartComponent], exports: [PortfolioProportionChartComponent], - imports: [CommonModule, NgxSkeletonLoaderModule], - providers: [] + imports: [CommonModule, NgxSkeletonLoaderModule] }) export class GfPortfolioProportionChartModule {} diff --git a/libs/ui/src/lib/premium-indicator/premium-indicator.module.ts b/libs/ui/src/lib/premium-indicator/premium-indicator.module.ts index 87eeb2f97..f79dc2f60 100644 --- a/libs/ui/src/lib/premium-indicator/premium-indicator.module.ts +++ b/libs/ui/src/lib/premium-indicator/premium-indicator.module.ts @@ -8,7 +8,6 @@ import { PremiumIndicatorComponent } from './premium-indicator.component'; declarations: [PremiumIndicatorComponent], exports: [PremiumIndicatorComponent], imports: [CommonModule, RouterModule], - providers: [], schemas: [CUSTOM_ELEMENTS_SCHEMA] }) export class GfPremiumIndicatorModule {} diff --git a/libs/ui/src/lib/symbol-autocomplete/abstract-mat-form-field.ts b/libs/ui/src/lib/symbol-autocomplete/abstract-mat-form-field.ts new file mode 100644 index 000000000..38198daea --- /dev/null +++ b/libs/ui/src/lib/symbol-autocomplete/abstract-mat-form-field.ts @@ -0,0 +1,181 @@ +import { FocusMonitor } from '@angular/cdk/a11y'; +import { coerceBooleanProperty } from '@angular/cdk/coercion'; +import { + Component, + DoCheck, + ElementRef, + HostBinding, + HostListener, + Input, + OnDestroy +} from '@angular/core'; +import { ControlValueAccessor, NgControl, Validators } from '@angular/forms'; +import { MatFormFieldControl } from '@angular/material/form-field'; +import { Subject } from 'rxjs'; + +@Component({ + template: '' +}) +export abstract class AbstractMatFormField + implements ControlValueAccessor, DoCheck, MatFormFieldControl, OnDestroy +{ + @HostBinding() + public id = `${this.controlType}-${AbstractMatFormField.nextId++}`; + + @HostBinding('attr.aria-describedBy') public describedBy = ''; + + public readonly autofilled: boolean; + public errorState: boolean; + public focused = false; + public readonly stateChanges = new Subject(); + public readonly userAriaDescribedBy: string; + + protected onChange?: (value: T) => void; + protected onTouched?: () => void; + + private static nextId: number = 0; + + protected constructor( + protected _elementRef: ElementRef, + protected _focusMonitor: FocusMonitor, + public readonly ngControl: NgControl + ) { + if (this.ngControl) { + this.ngControl.valueAccessor = this; + } + + _focusMonitor + .monitor(this._elementRef.nativeElement, true) + .subscribe((origin) => { + this.focused = !!origin; + this.stateChanges.next(); + }); + } + + private _controlType: string; + + public get controlType(): string { + return this._controlType; + } + + protected set controlType(value: string) { + this._controlType = value; + this.id = `${this._controlType}-${AbstractMatFormField.nextId++}`; + } + + private _value: T; + + public get value(): T { + return this._value; + } + + public set value(value: T) { + this._value = value; + + if (this.onChange) { + this.onChange(value); + } + } + + public get empty(): boolean { + return !this._value; + } + + public _placeholder: string = ''; + + public get placeholder() { + return this._placeholder; + } + + @Input() + public set placeholder(placeholder: string) { + this._placeholder = placeholder; + this.stateChanges.next(); + } + + public _required: boolean = false; + + public get required() { + return ( + this._required || + this.ngControl.control?.hasValidator(Validators.required) + ); + } + + @Input() + public set required(required: any) { + this._required = coerceBooleanProperty(required); + this.stateChanges.next(); + } + + public _disabled: boolean = false; + + public get disabled() { + if (this.ngControl && this.ngControl.disabled !== null) { + return this.ngControl.disabled; + } + + return this._disabled; + } + + @Input() + public set disabled(disabled: any) { + this._disabled = coerceBooleanProperty(disabled); + + if (this.focused) { + this.focused = false; + this.stateChanges.next(); + } + } + + public abstract focus(): void; + + public get shouldLabelFloat(): boolean { + return this.focused || !this.empty; + } + + public ngDoCheck(): void { + if (this.ngControl) { + this.errorState = this.ngControl.invalid && this.ngControl.touched; + this.stateChanges.next(); + } + } + + public ngOnDestroy(): void { + this.stateChanges.complete(); + this._focusMonitor.stopMonitoring(this._elementRef.nativeElement); + } + + public registerOnChange(fn: (_: T) => void): void { + this.onChange = fn; + } + + public registerOnTouched(fn: () => void): void { + this.onTouched = fn; + } + + public setDescribedByIds(ids: string[]): void { + this.describedBy = ids.join(' '); + } + + public writeValue(value: T): void { + this.value = value; + } + + @HostListener('focusout') + public onBlur() { + this.focused = false; + + if (this.onTouched) { + this.onTouched(); + } + + this.stateChanges.next(); + } + + public onContainerClick(): void { + if (!this.focused) { + this.focus(); + } + } +} diff --git a/libs/ui/src/lib/symbol-autocomplete/index.ts b/libs/ui/src/lib/symbol-autocomplete/index.ts new file mode 100644 index 000000000..7271d1ca9 --- /dev/null +++ b/libs/ui/src/lib/symbol-autocomplete/index.ts @@ -0,0 +1 @@ +export * from './symbol-autocomplete.module'; diff --git a/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html new file mode 100644 index 000000000..bc6a6dcc3 --- /dev/null +++ b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html @@ -0,0 +1,37 @@ + + + + + + {{ lookupItem.name }} +
+ {{ lookupItem.symbol | gfSymbol }} · {{ lookupItem.currency + }} + · {{ lookupItem.assetSubClassString }} +
+
+
+ diff --git a/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.scss b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.scss new file mode 100644 index 000000000..71c06f26e --- /dev/null +++ b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.scss @@ -0,0 +1,8 @@ +:host { + display: block; + + .mat-mdc-progress-spinner { + right: 0; + top: calc(50% - 10px); + } +} diff --git a/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts new file mode 100644 index 000000000..654a634ff --- /dev/null +++ b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts @@ -0,0 +1,179 @@ +import { FocusMonitor } from '@angular/cdk/a11y'; +import { + ChangeDetectionStrategy, + ChangeDetectorRef, + Component, + ElementRef, + Input, + OnDestroy, + OnInit, + ViewChild +} from '@angular/core'; +import { FormControl, NgControl } from '@angular/forms'; +import { + MatAutocomplete, + MatAutocompleteSelectedEvent +} 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 { isString } from 'lodash'; +import { Subject, tap } from 'rxjs'; +import { + debounceTime, + distinctUntilChanged, + filter, + switchMap, + takeUntil +} from 'rxjs/operators'; + +import { AbstractMatFormField } from './abstract-mat-form-field'; + +@Component({ + changeDetection: ChangeDetectionStrategy.OnPush, + host: { + '[attr.aria-describedBy]': 'describedBy', + '[id]': 'id' + }, + selector: 'gf-symbol-autocomplete', + styleUrls: ['./symbol-autocomplete.component.scss'], + templateUrl: 'symbol-autocomplete.component.html', + providers: [ + { + provide: MatFormFieldControl, + useExisting: SymbolAutocompleteComponent + } + ] +}) +export class SymbolAutocompleteComponent + extends AbstractMatFormField + implements OnInit, OnDestroy +{ + @Input() private includeIndices = false; + @Input() public isLoading = false; + + @ViewChild(MatInput, { static: false }) private input: MatInput; + + @ViewChild('symbolAutocomplete') public symbolAutocomplete: MatAutocomplete; + + public control = new FormControl(); + public filteredLookupItems: (LookupItem & { assetSubClassString: string })[] = + []; + + private unsubscribeSubject = new Subject(); + + public constructor( + public readonly _elementRef: ElementRef, + public readonly _focusMonitor: FocusMonitor, + public readonly changeDetectorRef: ChangeDetectorRef, + public readonly dataService: DataService, + public readonly ngControl: NgControl + ) { + super(_elementRef, _focusMonitor, ngControl); + + this.controlType = 'symbol-autocomplete'; + } + + public ngOnInit() { + if (this.disabled) { + this.control.disable(); + } + + this.control.valueChanges + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe(() => { + if (super.value) { + super.value.dataSource = null; + } + }); + + this.control.valueChanges + .pipe( + debounceTime(400), + distinctUntilChanged(), + filter((query) => { + return isString(query) && query.length > 1; + }), + takeUntil(this.unsubscribeSubject), + tap(() => { + this.isLoading = true; + + this.changeDetectorRef.markForCheck(); + }), + switchMap((query: string) => { + return this.dataService.fetchSymbols({ + query, + includeIndices: this.includeIndices + }); + }) + ) + .subscribe((filteredLookupItems) => { + this.filteredLookupItems = filteredLookupItems.map((lookupItem) => { + return { + ...lookupItem, + assetSubClassString: translate(lookupItem.assetSubClass) + }; + }); + + this.isLoading = false; + + this.changeDetectorRef.markForCheck(); + }); + } + + public displayFn(aLookupItem: LookupItem) { + return aLookupItem?.symbol ?? ''; + } + + public get empty() { + return this.input?.empty; + } + + public focus() { + this.input.focus(); + } + + public isValueInOptions(value: string) { + return this.filteredLookupItems.some((item) => { + return item.symbol === value; + }); + } + + public ngDoCheck() { + if (this.ngControl) { + this.validateRequired(); + this.errorState = this.ngControl.invalid && this.ngControl.touched; + this.stateChanges.next(); + } + } + + public onUpdateSymbol(event: MatAutocompleteSelectedEvent) { + super.value = { + dataSource: event.option.value.dataSource, + symbol: event.option.value.symbol + } as LookupItem; + } + + public set value(value: LookupItem) { + this.control.setValue(value); + super.value = value; + } + + public ngOnDestroy() { + super.ngOnDestroy(); + + this.unsubscribeSubject.next(); + this.unsubscribeSubject.complete(); + } + + private validateRequired() { + const requiredCheck = super.required + ? !super.value?.dataSource || !super.value?.symbol + : false; + if (requiredCheck) { + this.ngControl.control.setErrors({ invalidData: true }); + } + } +} diff --git a/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.module.ts b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.module.ts new file mode 100644 index 000000000..d7b1ed2f8 --- /dev/null +++ b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.module.ts @@ -0,0 +1,26 @@ +import { CommonModule } from '@angular/common'; +import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +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'; + +@NgModule({ + declarations: [SymbolAutocompleteComponent], + exports: [SymbolAutocompleteComponent], + imports: [ + CommonModule, + FormsModule, + GfSymbolModule, + MatAutocompleteModule, + MatFormFieldModule, + MatInputModule, + MatProgressSpinnerModule, + ReactiveFormsModule + ], + schemas: [CUSTOM_ELEMENTS_SCHEMA] +}) +export class GfSymbolAutocompleteModule {} diff --git a/libs/ui/src/lib/trend-indicator/trend-indicator.module.ts b/libs/ui/src/lib/trend-indicator/trend-indicator.module.ts index 444c996b4..dc84a3baa 100644 --- a/libs/ui/src/lib/trend-indicator/trend-indicator.module.ts +++ b/libs/ui/src/lib/trend-indicator/trend-indicator.module.ts @@ -8,7 +8,6 @@ import { TrendIndicatorComponent } from './trend-indicator.component'; declarations: [TrendIndicatorComponent], exports: [TrendIndicatorComponent], imports: [CommonModule, NgxSkeletonLoaderModule], - providers: [], schemas: [CUSTOM_ELEMENTS_SCHEMA] }) export class GfTrendIndicatorModule {} diff --git a/libs/ui/src/lib/value/value.component.html b/libs/ui/src/lib/value/value.component.html index 790d99a4e..61e6ecd5e 100644 --- a/libs/ui/src/lib/value/value.component.html +++ b/libs/ui/src/lib/value/value.component.html @@ -32,11 +32,11 @@ {{ formattedValue }}
- - {{ currency }} + + {{ unit }} -
- {{ currency }} +
+ {{ unit }}
@@ -48,17 +48,6 @@
- -
- - {{ subLabel }} -
- - - -
+ + +
+ + {{ subLabel }} +
+ + + +
diff --git a/libs/ui/src/lib/value/value.component.stories.ts b/libs/ui/src/lib/value/value.component.stories.ts index 739b4185b..fc3e202ea 100644 --- a/libs/ui/src/lib/value/value.component.stories.ts +++ b/libs/ui/src/lib/value/value.component.stories.ts @@ -24,8 +24,9 @@ Loading.args = { export const Currency = Template.bind({}); Currency.args = { - currency: 'USD', + isCurrency: true, locale: 'en-US', + unit: 'USD', value: 7 }; diff --git a/libs/ui/src/lib/value/value.component.ts b/libs/ui/src/lib/value/value.component.ts index d92d87cb1..d35c2d1b0 100644 --- a/libs/ui/src/lib/value/value.component.ts +++ b/libs/ui/src/lib/value/value.component.ts @@ -15,17 +15,17 @@ import { isNumber } from 'lodash'; }) export class ValueComponent implements OnChanges { @Input() colorizeSign = false; - @Input() currency = ''; @Input() icon = ''; @Input() isAbsolute = false; @Input() isCurrency = false; @Input() isDate = false; @Input() isPercent = false; - @Input() locale = getLocale(); + @Input() locale: string | undefined; @Input() position = ''; @Input() precision: number | undefined; @Input() size: 'large' | 'medium' | 'small' = 'small'; @Input() subLabel = ''; + @Input() unit = ''; @Input() value: number | string = ''; public absoluteValue = 0; @@ -37,6 +37,8 @@ export class ValueComponent implements OnChanges { public constructor() {} public ngOnChanges() { + this.initializeVariables(); + if (this.value || this.value === 0) { if (isNumber(this.value)) { this.isNumber = true; @@ -44,7 +46,7 @@ export class ValueComponent implements OnChanges { this.absoluteValue = Math.abs(this.value); if (this.colorizeSign) { - if (this.currency || this.isCurrency) { + if (this.isCurrency) { try { this.formattedValue = this.absoluteValue.toLocaleString( this.locale, @@ -65,6 +67,13 @@ export class ValueComponent implements OnChanges { ); } catch {} } + } else if (this.isCurrency) { + try { + this.formattedValue = this.value?.toLocaleString(this.locale, { + maximumFractionDigits: 2, + minimumFractionDigits: 2 + }); + } catch {} } else if (this.isPercent) { try { this.formattedValue = (this.value * 100).toLocaleString( @@ -75,13 +84,6 @@ export class ValueComponent implements OnChanges { } ); } catch {} - } else if (this.currency || this.isCurrency) { - try { - this.formattedValue = this.value?.toLocaleString(this.locale, { - maximumFractionDigits: 2, - minimumFractionDigits: 2 - }); - } catch {} } else if (this.precision || this.precision === 0) { try { this.formattedValue = this.value?.toLocaleString(this.locale, { @@ -90,7 +92,7 @@ export class ValueComponent implements OnChanges { }); } catch {} } else { - this.formattedValue = this.value?.toString(); + this.formattedValue = this.value?.toLocaleString(this.locale); } if (this.isAbsolute) { @@ -120,4 +122,17 @@ export class ValueComponent implements OnChanges { this.useAbsoluteValue = true; } } + + private initializeVariables() { + this.absoluteValue = 0; + this.formattedValue = ''; + this.isNumber = false; + this.isString = false; + + if (!this.locale) { + this.locale = getLocale(); + } + + this.useAbsoluteValue = false; + } } diff --git a/libs/ui/tsconfig.spec.json b/libs/ui/tsconfig.spec.json index b6347c6f6..e7d525ae4 100644 --- a/libs/ui/tsconfig.spec.json +++ b/libs/ui/tsconfig.spec.json @@ -3,7 +3,8 @@ "compilerOptions": { "outDir": "../../dist/out-tsc", "module": "commonjs", - "types": ["jest", "node"] + "types": ["jest", "node"], + "target": "es2016" }, "files": ["src/test-setup.ts"], "include": ["**/*.spec.ts", "**/*.test.ts", "**/*.d.ts", "jest.config.ts"] diff --git a/nx.json b/nx.json index d48f0d5b1..af4036866 100644 --- a/nx.json +++ b/nx.json @@ -5,7 +5,7 @@ "npmScope": "ghostfolio", "tasksRunnerOptions": { "default": { - "runner": "@nrwl/nx-cloud", + "runner": "nx-cloud", "options": { "accessToken": "Mjg0ZGQ2YjAtNGI4NS00NmYwLThhOWEtMWZmNmQzODM4YzU4fHJlYWQ=", "cacheableOperations": [ @@ -21,17 +21,17 @@ }, "defaultProject": "api", "generators": { - "@nrwl/angular:application": { + "@nx/angular:application": { "linter": "eslint", "unitTestRunner": "jest", "e2eTestRunner": "cypress" }, - "@nrwl/angular:library": { + "@nx/angular:library": { "linter": "eslint", "unitTestRunner": "jest" }, - "@nrwl/nest": {}, - "@nrwl/angular:component": {} + "@nx/angular:component": {}, + "@nx/nest": {} }, "$schema": "./node_modules/nx/schemas/nx-schema.json", "targetDefaults": { @@ -46,7 +46,12 @@ "inputs": ["default", "^production", "{workspaceRoot}/jest.preset.js"] }, "build-storybook": { - "inputs": ["default", "^production", "{workspaceRoot}/.storybook/**/*"] + "inputs": [ + "default", + "^production", + "{workspaceRoot}/.storybook/**/*", + "!{projectRoot}/.storybook/**/*" + ] } }, "namedInputs": { diff --git a/package.json b/package.json index 97f62bd47..86f535712 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "1.206.2", + "version": "1.287.0", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "scripts": { @@ -16,7 +16,6 @@ "build:all": "nx run api:build:production && nx run client:build:production --localize && yarn replace-placeholders-in-build", "build:dev": "nx run api:build && nx run client:build --localize && yarn replace-placeholders-in-build", "build:storybook": "nx run ui:build-storybook", - "clean": "rimraf dist", "database:format-schema": "prisma format", "database:generate-typings": "prisma generate", "database:gui": "prisma studio", @@ -44,8 +43,8 @@ "start:prod": "yarn database:migrate && yarn database:seed && node main", "start:server": "nx run api:serve --watch", "start:storybook": "nx run ui:storybook", - "test": "nx test", - "test:single": "nx test --test-file portfolio-calculator-novn-buy-and-sell-partially.spec.ts", + "test": "npx dotenv-cli -e .env.example -- nx test", + "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", @@ -53,25 +52,25 @@ "workspace-generator": "nx workspace-generator" }, "dependencies": { - "@angular/animations": "14.2.0", - "@angular/cdk": "14.2.0", - "@angular/common": "14.2.0", - "@angular/compiler": "14.2.0", - "@angular/core": "14.2.0", - "@angular/forms": "14.2.0", - "@angular/material": "14.2.0", - "@angular/platform-browser": "14.2.0", - "@angular/platform-browser-dynamic": "14.2.0", - "@angular/router": "14.2.0", - "@codewithdan/observable-store": "2.2.11", - "@dfinity/agent": "0.12.1", - "@dfinity/auth-client": "0.12.1", - "@dfinity/authentication": "0.12.1", - "@dfinity/candid": "0.12.1", - "@dfinity/identity": "0.12.1", - "@dfinity/principal": "0.12.1", + "@angular/animations": "15.2.5", + "@angular/cdk": "15.2.6", + "@angular/common": "15.2.5", + "@angular/compiler": "15.2.5", + "@angular/core": "15.2.5", + "@angular/forms": "15.2.5", + "@angular/material": "15.2.6", + "@angular/platform-browser": "15.2.5", + "@angular/platform-browser-dynamic": "15.2.5", + "@angular/router": "15.2.5", + "@angular/service-worker": "15.2.5", + "@codewithdan/observable-store": "2.2.15", + "@dfinity/agent": "0.15.7", + "@dfinity/auth-client": "0.15.7", + "@dfinity/candid": "0.15.7", + "@dfinity/identity": "0.15.7", + "@dfinity/principal": "0.15.7", "@dinero.js/currencies": "2.0.0-alpha.8", - "@nestjs/bull": "0.5.5", + "@nestjs/bull": "0.6.3", "@nestjs/common": "9.1.4", "@nestjs/config": "2.2.0", "@nestjs/core": "9.1.4", @@ -80,117 +79,127 @@ "@nestjs/platform-express": "9.1.4", "@nestjs/schedule": "2.1.0", "@nestjs/serve-static": "3.0.0", - "@nrwl/angular": "15.0.0", - "@prisma/client": "4.4.0", + "@prisma/client": "4.15.0", "@simplewebauthn/browser": "5.2.1", "@simplewebauthn/server": "5.2.1", - "@stripe/stripe-js": "1.22.0", + "@stripe/stripe-js": "1.47.0", "alphavantage": "2.2.0", - "angular-material-css-vars": "3.0.0", "bent": "7.3.12", - "big.js": "6.1.1", + "big.js": "6.2.1", + "body-parser": "1.20.1", "bootstrap": "4.6.0", - "bull": "4.8.5", + "bull": "4.10.4", "cache-manager": "3.4.3", "cache-manager-redis-store": "2.0.0", - "chart.js": "3.8.0", - "chartjs-adapter-date-fns": "2.0.0", - "chartjs-plugin-annotation": "2.0.0", - "chartjs-plugin-datalabels": "2.0.0", - "cheerio": "1.0.0-rc.6", - "class-transformer": "0.3.2", - "class-validator": "0.13.1", - "color": "4.0.1", + "chart.js": "4.2.0", + "chartjs-adapter-date-fns": "3.0.0", + "chartjs-plugin-annotation": "2.1.2", + "chartjs-plugin-datalabels": "2.2.0", + "cheerio": "1.0.0-rc.12", + "class-transformer": "0.5.1", + "class-validator": "0.14.0", + "color": "4.2.3", + "countries-and-timezones": "3.4.1", "countries-list": "2.6.1", - "countup.js": "2.0.7", - "date-fns": "2.28.0", + "countup.js": "2.3.2", + "date-fns": "2.29.3", "envalid": "7.3.1", "google-spreadsheet": "3.2.0", + "helmet": "7.0.0", "http-status-codes": "2.2.0", - "ionicons": "5.5.1", + "ionicons": "7.1.0", "lodash": "4.17.21", + "marked": "4.2.12", "ms": "3.0.0-canary.1", - "ng-extract-i18n-merge": "2.1.2", - "ngx-device-detector": "3.0.0", - "ngx-markdown": "14.0.1", - "ngx-skeleton-loader": "5.0.0", - "ngx-stripe": "13.0.0", + "ng-extract-i18n-merge": "2.6.0", + "ngx-device-detector": "5.0.1", + "ngx-markdown": "15.1.0", + "ngx-skeleton-loader": "7.0.0", + "ngx-stripe": "15.5.0", "papaparse": "5.3.1", "passport": "0.6.0", "passport-google-oauth20": "2.0.0", "passport-jwt": "4.0.0", - "prisma": "4.4.0", + "prisma": "4.15.0", "reflect-metadata": "0.1.13", "rxjs": "7.5.6", - "stripe": "8.199.0", + "stripe": "11.12.0", "svgmap": "2.6.0", - "twitter-api-v2": "1.10.3", - "uuid": "8.3.2", - "yahoo-finance2": "2.3.6", - "zone.js": "0.11.8" + "twitter-api-v2": "1.14.2", + "uuid": "9.0.0", + "yahoo-finance2": "2.4.1", + "zone.js": "0.12.0" }, "devDependencies": { - "@angular-devkit/build-angular": "14.2.1", - "@angular-eslint/eslint-plugin": "14.0.4", - "@angular-eslint/eslint-plugin-template": "14.0.4", - "@angular-eslint/template-parser": "14.0.4", - "@angular/cli": "14.2.1", - "@angular/compiler-cli": "14.2.0", - "@angular/language-service": "14.2.0", - "@angular/localize": "14.2.0", - "@nestjs/schematics": "9.0.3", - "@nestjs/testing": "9.1.4", - "@nrwl/cli": "15.0.0", - "@nrwl/cypress": "15.0.0", - "@nrwl/eslint-plugin-nx": "15.0.0", - "@nrwl/jest": "15.0.0", - "@nrwl/nest": "15.0.0", - "@nrwl/node": "15.0.0", - "@nrwl/nx-cloud": "15.0.0", - "@nrwl/storybook": "15.0.0", - "@nrwl/workspace": "15.0.0", + "@angular-devkit/build-angular": "15.2.5", + "@angular-devkit/core": "15.2.5", + "@angular-devkit/schematics": "15.2.5", + "@angular-eslint/eslint-plugin": "15.2.0", + "@angular-eslint/eslint-plugin-template": "15.2.0", + "@angular-eslint/template-parser": "15.2.0", + "@angular/cli": "15.2.5", + "@angular/compiler-cli": "15.2.5", + "@angular/language-service": "15.2.5", + "@angular/localize": "15.2.5", + "@angular/pwa": "15.2.5", + "@nestjs/schematics": "9.1.0", + "@nestjs/testing": "9.4.0", + "@nx/angular": "16.0.3", + "@nx/cypress": "16.0.3", + "@nx/eslint-plugin": "16.0.3", + "@nx/jest": "16.0.3", + "@nx/js": "16.0.3", + "@nx/nest": "16.0.3", + "@nx/node": "16.0.3", + "@nx/storybook": "16.0.3", + "@nx/web": "16.0.3", + "@nx/workspace": "16.0.3", + "@schematics/angular": "15.2.5", "@simplewebauthn/typescript-types": "5.2.1", - "@storybook/addon-essentials": "6.5.9", - "@storybook/angular": "6.5.9", - "@storybook/builder-webpack5": "6.5.9", - "@storybook/core-server": "6.5.9", - "@storybook/manager-webpack5": "6.5.9", - "@types/big.js": "6.1.2", - "@types/bull": "3.15.9", + "@storybook/addon-essentials": "7.0.9", + "@storybook/angular": "7.0.9", + "@storybook/core-server": "7.0.9", + "@types/big.js": "6.1.6", + "@types/body-parser": "1.19.2", "@types/cache-manager": "3.4.2", - "@types/color": "3.0.2", + "@types/color": "3.0.3", "@types/google-spreadsheet": "3.1.5", - "@types/jest": "28.1.8", - "@types/lodash": "4.14.174", - "@types/node": "18.7.1", - "@types/papaparse": "5.2.6", + "@types/jest": "29.4.4", + "@types/lodash": "4.14.191", + "@types/marked": "4.0.8", + "@types/node": "18.11.18", + "@types/papaparse": "5.3.7", "@types/passport-google-oauth20": "2.0.11", - "@typescript-eslint/eslint-plugin": "5.4.0", - "@typescript-eslint/parser": "5.4.0", + "@typescript-eslint/eslint-plugin": "5.51.0", + "@typescript-eslint/parser": "5.51.0", "codelyzer": "6.0.1", "cypress": "6.2.1", - "eslint": "8.3.0", - "eslint-config-prettier": "8.3.0", + "eslint": "8.33.0", + "eslint-config-prettier": "8.6.0", "eslint-plugin-cypress": "2.12.1", - "eslint-plugin-import": "2.25.3", + "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", - "jest": "28.1.3", - "jest-environment-jsdom": "28.1.1", - "jest-preset-angular": "12.2.2", - "nx": "15.0.0", - "prettier": "2.7.1", + "jest": "29.4.3", + "jest-environment-jsdom": "29.4.3", + "jest-preset-angular": "13.0.0", + "nx": "16.0.3", + "nx-cloud": "16.0.5", + "prettier": "2.8.4", "prettier-plugin-organize-attributes": "0.0.5", - "replace-in-file": "6.2.0", - "rimraf": "3.0.2", - "ts-jest": "28.0.8", + "react": "18.2.0", + "react-dom": "18.2.0", + "replace-in-file": "6.3.5", + "storybook": "7.0.9", + "ts-jest": "29.1.0", "ts-node": "10.9.1", "tslib": "2.0.0", - "typescript": "4.8.4" + "typescript": "4.9.5" }, "engines": { - "node": ">=14" + "node": ">=18" }, "importSort": { ".ts": { diff --git a/prisma/migrations/20221128064317_added_comment_to_symbol_profile/migration.sql b/prisma/migrations/20221128064317_added_comment_to_symbol_profile/migration.sql new file mode 100644 index 000000000..d78222d04 --- /dev/null +++ b/prisma/migrations/20221128064317_added_comment_to_symbol_profile/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "SymbolProfile" ADD COLUMN "comment" TEXT; diff --git a/prisma/migrations/20221225084546_removed_rakuten_from_data_source/migration.sql b/prisma/migrations/20221225084546_removed_rakuten_from_data_source/migration.sql new file mode 100644 index 000000000..448e240ec --- /dev/null +++ b/prisma/migrations/20221225084546_removed_rakuten_from_data_source/migration.sql @@ -0,0 +1,9 @@ +-- AlterEnum +BEGIN; +CREATE TYPE "DataSource_new" AS ENUM ('ALPHA_VANTAGE', 'EOD_HISTORICAL_DATA', 'GHOSTFOLIO', 'GOOGLE_SHEETS', 'MANUAL', 'RAPID_API', 'YAHOO'); +ALTER TABLE "MarketData" ALTER COLUMN "dataSource" TYPE "DataSource_new" USING ("dataSource"::text::"DataSource_new"); +ALTER TABLE "SymbolProfile" ALTER COLUMN "dataSource" TYPE "DataSource_new" USING ("dataSource"::text::"DataSource_new"); +ALTER TYPE "DataSource" RENAME TO "DataSource_old"; +ALTER TYPE "DataSource_new" RENAME TO "DataSource"; +DROP TYPE "DataSource_old"; +COMMIT; diff --git a/prisma/migrations/20221227203757_added_price_to_subscription/migration.sql b/prisma/migrations/20221227203757_added_price_to_subscription/migration.sql new file mode 100644 index 000000000..cf3f84ee9 --- /dev/null +++ b/prisma/migrations/20221227203757_added_price_to_subscription/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Subscription" ADD COLUMN "price" DOUBLE PRECISION; diff --git a/prisma/migrations/20230205173009_added_country_to_analytics/migration.sql b/prisma/migrations/20230205173009_added_country_to_analytics/migration.sql new file mode 100644 index 000000000..0312128b3 --- /dev/null +++ b/prisma/migrations/20230205173009_added_country_to_analytics/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Analytics" ADD COLUMN "country" TEXT; diff --git a/prisma/migrations/20230215174320_changed_data_source_from_ghostfolio_to_manual/migration.sql b/prisma/migrations/20230215174320_changed_data_source_from_ghostfolio_to_manual/migration.sql new file mode 100644 index 000000000..fbf129be4 --- /dev/null +++ b/prisma/migrations/20230215174320_changed_data_source_from_ghostfolio_to_manual/migration.sql @@ -0,0 +1,2 @@ +UPDATE "MarketData" SET "dataSource" = 'MANUAL' WHERE "dataSource" = 'GHOSTFOLIO'; +UPDATE "SymbolProfile" SET "dataSource" = 'MANUAL' WHERE "dataSource" = 'GHOSTFOLIO'; diff --git a/prisma/migrations/20230217173323_removed_ghostfolio_from_data_source/migration.sql b/prisma/migrations/20230217173323_removed_ghostfolio_from_data_source/migration.sql new file mode 100644 index 000000000..ceaf9134f --- /dev/null +++ b/prisma/migrations/20230217173323_removed_ghostfolio_from_data_source/migration.sql @@ -0,0 +1,9 @@ +-- AlterEnum +BEGIN; +CREATE TYPE "DataSource_new" AS ENUM ('ALPHA_VANTAGE', 'EOD_HISTORICAL_DATA', 'GOOGLE_SHEETS', 'MANUAL', 'RAPID_API', 'YAHOO'); +ALTER TABLE "MarketData" ALTER COLUMN "dataSource" TYPE "DataSource_new" USING ("dataSource"::text::"DataSource_new"); +ALTER TABLE "SymbolProfile" ALTER COLUMN "dataSource" TYPE "DataSource_new" USING ("dataSource"::text::"DataSource_new"); +ALTER TYPE "DataSource" RENAME TO "DataSource_old"; +ALTER TYPE "DataSource_new" RENAME TO "DataSource"; +DROP TYPE "DataSource_old"; +COMMIT; diff --git a/prisma/migrations/20230222200407_added_coingecko_to_data_source/migration.sql b/prisma/migrations/20230222200407_added_coingecko_to_data_source/migration.sql new file mode 100644 index 000000000..2b40d220a --- /dev/null +++ b/prisma/migrations/20230222200407_added_coingecko_to_data_source/migration.sql @@ -0,0 +1,2 @@ +-- AlterEnum +ALTER TYPE "DataSource" ADD VALUE 'COINGECKO'; diff --git a/prisma/migrations/20230318081658_added_isin_to_symbol_profile/migration.sql b/prisma/migrations/20230318081658_added_isin_to_symbol_profile/migration.sql new file mode 100644 index 000000000..f7081354c --- /dev/null +++ b/prisma/migrations/20230318081658_added_isin_to_symbol_profile/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "SymbolProfile" ADD COLUMN "isin" TEXT; diff --git a/prisma/migrations/20230422180309_added_data_source_to_market_data_as_unique_constraint/migration.sql b/prisma/migrations/20230422180309_added_data_source_to_market_data_as_unique_constraint/migration.sql new file mode 100644 index 000000000..7d4210bae --- /dev/null +++ b/prisma/migrations/20230422180309_added_data_source_to_market_data_as_unique_constraint/migration.sql @@ -0,0 +1,5 @@ +-- DropIndex +DROP INDEX "MarketData_date_symbol_key"; + +-- CreateIndex +CREATE UNIQUE INDEX "MarketData_dataSource_date_symbol_key" ON "MarketData"("dataSource", "date", "symbol"); diff --git a/prisma/migrations/20230424194009_added_state_to_market_data/migration.sql b/prisma/migrations/20230424194009_added_state_to_market_data/migration.sql new file mode 100644 index 000000000..e030d8109 --- /dev/null +++ b/prisma/migrations/20230424194009_added_state_to_market_data/migration.sql @@ -0,0 +1,5 @@ +-- CreateEnum +CREATE TYPE "MarketDataState" AS ENUM ('CLOSE', 'INTRADAY'); + +-- AlterTable +ALTER TABLE "MarketData" ADD COLUMN "state" "MarketDataState" NOT NULL DEFAULT 'CLOSE'; diff --git a/prisma/migrations/20230511070258_added_financial_modeling_prep_to_data_source/migration.sql b/prisma/migrations/20230511070258_added_financial_modeling_prep_to_data_source/migration.sql new file mode 100644 index 000000000..1005e6730 --- /dev/null +++ b/prisma/migrations/20230511070258_added_financial_modeling_prep_to_data_source/migration.sql @@ -0,0 +1,2 @@ +-- AlterEnum +ALTER TYPE "DataSource" ADD VALUE 'FINANCIAL_MODELING_PREP'; diff --git a/prisma/migrations/20230610083653_added_comment_to_account/migration.sql b/prisma/migrations/20230610083653_added_comment_to_account/migration.sql new file mode 100644 index 000000000..f354b1e64 --- /dev/null +++ b/prisma/migrations/20230610083653_added_comment_to_account/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Account" ADD COLUMN "comment" TEXT; diff --git a/prisma/migrations/20230614345544_added_liability_to_order_type/migration.sql b/prisma/migrations/20230614345544_added_liability_to_order_type/migration.sql new file mode 100644 index 000000000..67daa4dc2 --- /dev/null +++ b/prisma/migrations/20230614345544_added_liability_to_order_type/migration.sql @@ -0,0 +1,2 @@ +-- AlterEnum +ALTER TYPE "Type" ADD VALUE 'LIABILITY'; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 062d59b06..f46272a54 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -1,7 +1,7 @@ generator client { provider = "prisma-client-js" previewFeatures = [] - binaryTargets = ["debian-openssl-1.1.x", "linux-arm64-openssl-1.1.x", "native"] + binaryTargets = ["debian-openssl-1.1.x", "linux-arm64-openssl-3.0.x", "native"] } datasource db { @@ -23,6 +23,7 @@ model Access { model Account { accountType AccountType @default(SECURITIES) balance Float @default(0) + comment String? createdAt DateTime @default(now()) currency String? id String @default(uuid()) @@ -41,6 +42,7 @@ model Account { model Analytics { activityCount Int @default(0) + country String? updatedAt DateTime @updatedAt userId String @id User User @relation(fields: [userId], references: [id]) @@ -58,14 +60,15 @@ model AuthDevice { } model MarketData { - createdAt DateTime @default(now()) + createdAt DateTime @default(now()) dataSource DataSource date DateTime - id String @id @default(uuid()) - symbol String + id String @id @default(uuid()) marketPrice Float + state MarketDataState @default(CLOSE) + symbol String - @@unique([date, symbol]) + @@unique([dataSource, date, symbol]) @@index([symbol]) } @@ -104,19 +107,21 @@ model Property { model Settings { settings Json? - updatedAt DateTime @updatedAt - userId String @id - User User @relation(fields: [userId], references: [id]) + updatedAt DateTime @updatedAt + userId String @id + User User @relation(fields: [userId], references: [id]) } model SymbolProfile { assetClass AssetClass? assetSubClass AssetSubClass? + comment String? countries Json? createdAt DateTime @default(now()) currency String dataSource DataSource id String @id @default(uuid()) + isin String? name String? updatedAt DateTime @updatedAt scraperConfiguration Json? @@ -146,6 +151,7 @@ model Subscription { createdAt DateTime @default(now()) expiresAt DateTime id String @id @default(uuid()) + price Float? updatedAt DateTime @updatedAt userId String User User @relation(fields: [userId], references: [id]) @@ -202,18 +208,18 @@ enum AssetSubClass { enum DataSource { ALPHA_VANTAGE + COINGECKO EOD_HISTORICAL_DATA - GHOSTFOLIO + FINANCIAL_MODELING_PREP GOOGLE_SHEETS MANUAL - RAKUTEN RAPID_API YAHOO } -enum ViewMode { - DEFAULT - ZEN +enum MarketDataState { + CLOSE + INTRADAY } enum Provider { @@ -232,5 +238,11 @@ enum Type { BUY DIVIDEND ITEM + LIABILITY SELL } + +enum ViewMode { + DEFAULT + ZEN +} diff --git a/prisma/seed.js b/prisma/seed.js index 72a87259f..beafbed44 100644 --- a/prisma/seed.js +++ b/prisma/seed.js @@ -1,303 +1,16 @@ -const { - AccountType, - DataSource, - PrismaClient, - Role, - Type -} = require('@prisma/client'); +const { PrismaClient } = require('@prisma/client'); const prisma = new PrismaClient(); async function main() { - const platformBitcoinSuisse = await prisma.platform.upsert({ - create: { - id: '70b6e475-a2b9-4527-99db-943e4f38ce45', - name: 'Bitcoin Suisse', - url: 'https://www.bitcoinsuisse.com' - }, - update: {}, - where: { id: '70b6e475-a2b9-4527-99db-943e4f38ce45' } - }); - - const platformBitpanda = await prisma.platform.upsert({ - create: { - id: 'debf9110-498f-4811-b972-7ebbd317e730', - name: 'Bitpanda', - url: 'https://www.bitpanda.com' - }, - update: {}, - where: { id: 'debf9110-498f-4811-b972-7ebbd317e730' } - }); - - const platformCoinbase = await prisma.platform.upsert({ - create: { - id: '8dc24b88-bb92-4152-af25-fe6a31643e26', - name: 'Coinbase', - url: 'https://www.coinbase.com' - }, - update: {}, - where: { id: '8dc24b88-bb92-4152-af25-fe6a31643e26' } - }); - - const platformDegiro = await prisma.platform.upsert({ - create: { - id: '94c1a2f4-a666-47be-84cd-4c8952e74c81', - name: 'DEGIRO', - url: 'https://www.degiro.eu' - }, - update: {}, - where: { id: '94c1a2f4-a666-47be-84cd-4c8952e74c81' } - }); - - const platformInteractiveBrokers = await prisma.platform.upsert({ - create: { - id: '9da3a8a7-4795-43e3-a6db-ccb914189737', - name: 'Interactive Brokers', - url: 'https://www.interactivebrokers.com' - }, - update: {}, - where: { id: '9da3a8a7-4795-43e3-a6db-ccb914189737' } - }); - - const platformPostFinance = await prisma.platform.upsert({ - create: { - id: '5377d9df-0d25-42c2-9d9b-e4c63166281e', - name: 'PostFinance', - url: 'https://www.postfinance.ch' - }, - update: {}, - where: { id: '5377d9df-0d25-42c2-9d9b-e4c63166281e' } - }); - - const platformSwissquote = await prisma.platform.upsert({ - create: { - id: '1377d9df-0d25-42c2-9d9b-e4c63156291f', - name: 'Swissquote', - url: 'https://swissquote.com' - }, - update: {}, - where: { id: '1377d9df-0d25-42c2-9d9b-e4c63156291f' } - }); - - const userDemo = await prisma.user.upsert({ - create: { - accessToken: - 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjliMTEyYjRkLTNiN2QtNGJhZC05YmRkLTNiMGY3YjRkYWMyZiIsImlhdCI6MTYxODUxMjAxNCwiZXhwIjoxNjIxMTA0MDE0fQ.l3WUxpI0hxuQtdPrD0kd7sem6S2kx_7CrdNvkmlKuWw', - Account: { - create: [ - { - accountType: AccountType.SECURITIES, - balance: 0, - currency: 'USD', - id: 'd804de69-0429-42dc-b6ca-b308fd7dd926', - name: 'Coinbase Account', - platformId: platformCoinbase.id - }, - { - accountType: AccountType.SECURITIES, - balance: 0, - currency: 'EUR', - id: '65cfb79d-b6c7-4591-9d46-73426bc62094', - name: 'DEGIRO Account', - platformId: platformDegiro.id - }, - { - accountType: AccountType.SECURITIES, - balance: 0, - currency: 'USD', - id: '480269ce-e12a-4fd1-ac88-c4b0ff3f899c', - isDefault: true, - name: 'Interactive Brokers Account', - platformId: platformInteractiveBrokers.id - } - ] - }, - id: '9b112b4d-3b7d-4bad-9bdd-3b0f7b4dac2f', - role: Role.DEMO - }, - update: {}, - where: { id: '9b112b4d-3b7d-4bad-9bdd-3b0f7b4dac2f' } - }); - - await prisma.symbolProfile.createMany({ + await prisma.tag.createMany({ data: [ { - assetClass: 'EQUITY', - assetSubClass: 'STOCK', - countries: [{ code: 'US', weight: 1 }], - currency: 'USD', - dataSource: DataSource.YAHOO, - id: '2bd26362-136e-411c-b578-334084b4cdcc', - name: 'Amazon.com Inc.', - sectors: [{ name: 'Consumer Cyclical', weight: 1 }], - symbol: 'AMZN' - }, - { - assetClass: 'CASH', - assetSubClass: 'CRYPTOCURRENCY', - countries: undefined, - currency: 'USD', - dataSource: DataSource.YAHOO, - id: 'fdc42ea6-1321-44f5-9fb0-d7f1f2cf9b1e', - name: 'Bitcoin USD', - sectors: undefined, - symbol: 'BTCUSD' - }, - { - assetClass: 'EQUITY', - assetSubClass: 'STOCK', - countries: [{ code: 'US', weight: 1 }], - currency: 'USD', - dataSource: DataSource.YAHOO, - id: 'd1ee9681-fb21-4f99-a3b7-afd4fc04df2e', - name: 'Tesla Inc.', - sectors: [{ name: 'Consumer Cyclical', weight: 1 }], - symbol: 'TSLA' - }, - { - assetClass: 'EQUITY', - assetSubClass: 'ETF', - countries: [ - { code: 'US', weight: 0.9886789999999981 }, - { code: 'NL', weight: 0.000203 }, - { code: 'CA', weight: 0.000362 } - ], - currency: 'USD', - dataSource: DataSource.YAHOO, - id: '7d9c8540-061e-4e7e-b019-0d0f4a84e796', - name: 'Vanguard Total Stock Market Index Fund ETF', - sectors: [ - { name: 'Technology', weight: 0.31393799999999955 }, - { name: 'Consumer Cyclical', weight: 0.149224 }, - { name: 'Financials', weight: 0.11716100000000002 }, - { name: 'Healthcare', weight: 0.13285199999999994 }, - { name: 'Consumer Staples', weight: 0.053919000000000016 }, - { name: 'Energy', weight: 0.025529999999999997 }, - { name: 'Telecommunications', weight: 0.012579 }, - { name: 'Industrials', weight: 0.09526399999999995 }, - { name: 'Utilities', weight: 0.024791999999999988 }, - { name: 'Materials', weight: 0.027664 }, - { name: 'Real Estate', weight: 0.03239999999999998 }, - { name: 'Communication', weight: 0.0036139999999999996 }, - { name: 'Other', weight: 0.000218 } - ], - symbol: 'VTI' + id: '4452656d-9fa4-4bd0-ba38-70492e31d180', + name: 'EMERGENCY_FUND' } ], skipDuplicates: true }); - - await prisma.order.createMany({ - data: [ - { - accountId: '65cfb79d-b6c7-4591-9d46-73426bc62094', - accountUserId: userDemo.id, - date: new Date(Date.UTC(2017, 0, 3, 0, 0, 0)), - fee: 30, - id: 'cf7c0418-8535-4089-ae3d-5dbfa0aec2e1', - quantity: 50, - symbolProfileId: 'd1ee9681-fb21-4f99-a3b7-afd4fc04df2e', // TSLA - type: Type.BUY, - unitPrice: 42.97, - userId: userDemo.id - }, - { - accountId: 'd804de69-0429-42dc-b6ca-b308fd7dd926', - accountUserId: userDemo.id, - date: new Date(Date.UTC(2017, 7, 16, 0, 0, 0)), - fee: 29.9, - id: 'a1c5d73a-8631-44e5-ac44-356827a5212c', - quantity: 0.5614682, - symbolProfileId: 'fdc42ea6-1321-44f5-9fb0-d7f1f2cf9b1e', // BTCUSD - type: Type.BUY, - unitPrice: 3562.089535970158, - userId: userDemo.id - }, - { - accountId: '480269ce-e12a-4fd1-ac88-c4b0ff3f899c', - accountUserId: userDemo.id, - date: new Date(Date.UTC(2018, 9, 1, 0, 0, 0)), - fee: 80.79, - id: '71c08e2a-4a86-44ae-a890-c337de5d5f9b', - quantity: 5, - symbolProfileId: '2bd26362-136e-411c-b578-334084b4cdcc', // AMZN - type: Type.BUY, - unitPrice: 2021.99, - userId: userDemo.id - }, - { - accountId: '480269ce-e12a-4fd1-ac88-c4b0ff3f899c', - accountUserId: userDemo.id, - date: new Date(Date.UTC(2019, 2, 1, 0, 0, 0)), - fee: 19.9, - id: '385f2c2c-d53e-4937-b0e5-e92ef6020d4e', - quantity: 10, - symbolProfileId: '7d9c8540-061e-4e7e-b019-0d0f4a84e796', // VTI - type: Type.BUY, - unitPrice: 144.38, - userId: userDemo.id - }, - { - accountId: '480269ce-e12a-4fd1-ac88-c4b0ff3f899c', - accountUserId: userDemo.id, - date: new Date(Date.UTC(2019, 8, 3, 0, 0, 0)), - fee: 19.9, - id: '185f2c2c-d53e-4937-b0e5-a93ef6020d4e', - quantity: 10, - symbolProfileId: '7d9c8540-061e-4e7e-b019-0d0f4a84e796', // VTI - type: Type.BUY, - unitPrice: 147.99, - userId: userDemo.id - }, - { - accountId: '480269ce-e12a-4fd1-ac88-c4b0ff3f899c', - accountUserId: userDemo.id, - date: new Date(Date.UTC(2020, 2, 2, 0, 0, 0)), - fee: 19.9, - id: '347b0430-a84f-4031-a0f9-390399066ad6', - quantity: 10, - symbolProfileId: '7d9c8540-061e-4e7e-b019-0d0f4a84e796', // VTI - type: Type.BUY, - unitPrice: 151.41, - userId: userDemo.id - }, - { - accountId: '480269ce-e12a-4fd1-ac88-c4b0ff3f899c', - accountUserId: userDemo.id, - date: new Date(Date.UTC(2020, 8, 1, 0, 0, 0)), - fee: 19.9, - id: '67ec3f47-3189-4b63-ba05-60d3a06b302f', - quantity: 10, - symbolProfileId: '7d9c8540-061e-4e7e-b019-0d0f4a84e796', // VTI - type: Type.BUY, - unitPrice: 177.69, - userId: userDemo.id - }, - { - accountId: '480269ce-e12a-4fd1-ac88-c4b0ff3f899c', - accountUserId: userDemo.id, - date: new Date(Date.UTC(2020, 2, 1, 0, 0, 0)), - fee: 19.9, - id: 'd01c6fbc-fa8d-47e6-8e80-66f882d2bfd2', - quantity: 10, - symbolProfileId: '7d9c8540-061e-4e7e-b019-0d0f4a84e796', // VTI - type: Type.BUY, - unitPrice: 203.15, - userId: userDemo.id - } - ], - skipDuplicates: true - }); - - console.log({ - platformBitcoinSuisse, - platformBitpanda, - platformCoinbase, - platformDegiro, - platformInteractiveBrokers, - platformPostFinance, - platformSwissquote, - userDemo - }); } main() diff --git a/test/import/invalid-date-yy.csv b/test/import/invalid-date-yy.csv new file mode 100644 index 000000000..4bfa891e5 --- /dev/null +++ b/test/import/invalid-date-yy.csv @@ -0,0 +1,2 @@ +Date,Code,Currency,Price,Quantity,Action,Fee +16/09/21,MSFT,USD,298.580,5,buy,19.00 diff --git a/test/import/invalid-symbol.csv b/test/import/invalid-symbol.csv new file mode 100644 index 000000000..fb87b9183 --- /dev/null +++ b/test/import/invalid-symbol.csv @@ -0,0 +1,2 @@ +Date,Code,CCY,Price,Qty,Action,Fee +01/01/2021,,USD,100.0,20,buy,0 diff --git a/test/import/ok-500-activities.json b/test/import/ok-500-activities.json new file mode 100644 index 000000000..9fe1aa8c8 --- /dev/null +++ b/test/import/ok-500-activities.json @@ -0,0 +1,6019 @@ +{ + "meta": { + "date": "2022-04-01T00:00:00.000Z", + "version": "dev" + }, + "accounts": [ + { + "accountType": "SECURITIES", + "balance": 2000, + "currency": "USD", + "id": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "isExcluded": false, + "name": "My Online Trading Account", + "platformId": null + } + ], + "activities": [ + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 8.61, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-09-03T16:25:19.368113Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 8.58, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-10-16T17:42:36.368142Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 8.85, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-02-15T12:21:37.368151Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 0.9, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-02-22T03:16:43.368158Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 3, + "type": "BUY", + "unitPrice": 9.61, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-11-15T04:10:10.368165Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 4.36, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-12-21T13:19:32.368171Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 5.58, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-12-15T08:23:58.368177Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 4.41, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-31T09:59:52.368183Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 3, + "type": "BUY", + "unitPrice": 1.75, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-13T12:16:58.368189Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 5.65, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-22T04:11:54.368196Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 0.52, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-07T03:58:21.368201Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 9.56, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-05-23T15:40:32.368207Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 9.41, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-09-03T10:45:49.368213Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 7.6, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-13T08:53:49.368219Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 0.92, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-11-09T02:49:28.368225Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 2, + "type": "BUY", + "unitPrice": 6.3, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-07-04T11:43:58.368231Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 9.31, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-07-14T05:18:13.368237Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 8.96, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-01-07T17:15:01.368243Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 3, + "type": "BUY", + "unitPrice": 5.03, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-15T07:36:33.368249Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 4, + "type": "BUY", + "unitPrice": 4.65, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-04-06T01:14:28.368257Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 1.88, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-01-14T09:28:45.368263Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 4.69, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-13T18:30:40.368269Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 0.76, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-09-05T17:21:52.368276Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 6.81, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-06T12:59:48.368282Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 3.52, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-04-06T22:33:29.368288Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 4, + "type": "BUY", + "unitPrice": 4.08, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-06-04T04:19:41.368294Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 5.04, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-06-19T11:33:00.368299Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 8.19, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-07-07T02:23:00.368305Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 4, + "type": "BUY", + "unitPrice": 2.06, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-09-08T11:51:32.368311Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 4, + "type": "BUY", + "unitPrice": 0.77, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-01-26T01:20:44.368317Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 4, + "type": "BUY", + "unitPrice": 8.09, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-04-02T08:01:35.368323Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 6.82, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-06-13T22:10:04.368329Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 5.0, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-11-23T16:05:32.368335Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 1.15, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-01-28T06:53:26.368341Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 2.38, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-05T23:04:21.368347Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 3.46, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-12-10T07:06:06.368353Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 3.68, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-05-14T21:44:28.368359Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 2, + "type": "BUY", + "unitPrice": 3.68, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-06-28T08:33:09.368365Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 7.97, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-09-27T17:38:30.368371Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 3, + "type": "BUY", + "unitPrice": 3.41, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-09-26T03:33:00.368377Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 4.9, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-11-25T11:57:39.368382Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 9.34, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-06-14T17:50:40.368388Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 8.19, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-24T13:20:04.368394Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 3, + "type": "BUY", + "unitPrice": 3.46, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-02-17T08:22:30.368400Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 7.84, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-09-27T00:52:27.368406Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 8, + "type": "BUY", + "unitPrice": 3.52, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-19T04:03:47.368412Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 2, + "type": "BUY", + "unitPrice": 2.99, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-06-13T11:05:03.368417Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 3, + "type": "BUY", + "unitPrice": 5.76, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-12-31T01:58:30.368423Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 2, + "type": "BUY", + "unitPrice": 5.93, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-01-03T09:57:41.368429Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 8.18, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-02-13T10:48:54.368434Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 6.44, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-12-05T07:50:12.368441Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 3.0, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-09-18T03:39:23.368446Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 1.3, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-05-02T16:25:26.368452Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 8, + "type": "BUY", + "unitPrice": 7.07, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-04-10T12:01:49.368458Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 7.44, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-11-21T21:09:46.368464Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 2.11, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-06-10T03:58:01.368470Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 0.7, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-10-06T06:55:07.368478Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 3, + "type": "BUY", + "unitPrice": 8.48, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-11-15T12:34:06.368484Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 4, + "type": "BUY", + "unitPrice": 9.14, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-11-19T01:02:09.368490Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 2, + "type": "BUY", + "unitPrice": 4.48, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-10-25T03:37:44.368496Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 9.59, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-01-31T01:24:22.368502Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 9.66, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-23T09:30:13.368508Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 2.46, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-09-03T09:08:04.368513Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 6.46, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-02-26T12:49:06.368519Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 7.98, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-20T06:01:30.368525Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 8, + "type": "BUY", + "unitPrice": 5.21, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-10-05T16:25:29.368530Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 8.84, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-05-27T06:52:57.368536Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 9.0, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-12-15T14:19:06.368542Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 5.66, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-12-31T09:22:12.368548Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 5.39, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-09-03T12:44:56.368554Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 3.7, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-04-04T21:54:11.368559Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 2, + "type": "BUY", + "unitPrice": 4.2, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-10T01:11:24.368565Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 4, + "type": "BUY", + "unitPrice": 4.59, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-24T22:52:30.368571Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 6.58, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-29T03:33:48.368576Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 8, + "type": "BUY", + "unitPrice": 2.18, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-07-07T00:20:37.368582Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 2.25, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-12-20T04:40:08.368588Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 2, + "type": "BUY", + "unitPrice": 8.42, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-05-30T17:41:50.368594Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 5.93, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-23T06:22:50.368600Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 3.79, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-10-19T04:02:26.368605Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 9.05, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-05-08T06:05:30.368611Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 7.61, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-04-11T09:00:13.368617Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 2.61, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-02T21:19:15.368623Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 8, + "type": "BUY", + "unitPrice": 5.33, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-05-03T22:39:41.368629Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 7.77, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-12-28T17:41:50.368635Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 3.0, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-01-02T16:36:39.368641Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 7.46, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-04T16:09:29.368646Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 4.24, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-06-06T04:44:06.368652Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 2, + "type": "BUY", + "unitPrice": 1.55, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-05-12T10:36:10.368658Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 8, + "type": "BUY", + "unitPrice": 4.98, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-04-22T16:55:53.368664Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 8, + "type": "BUY", + "unitPrice": 7.02, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-10-11T22:12:28.368670Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 6.87, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-11-03T05:24:49.368675Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 4, + "type": "BUY", + "unitPrice": 4.24, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-20T18:00:16.368681Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 3, + "type": "BUY", + "unitPrice": 5.73, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-06-09T11:47:33.368687Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 2.78, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-14T10:37:18.368693Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 9.71, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-06-06T03:47:58.368698Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 6.46, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-02-11T15:33:39.368704Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 6.44, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-06-19T17:13:45.368710Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 3, + "type": "BUY", + "unitPrice": 8.11, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-06-14T22:43:00.368716Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 3, + "type": "BUY", + "unitPrice": 7.03, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-20T22:39:25.368721Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 3, + "type": "BUY", + "unitPrice": 2.23, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-02-08T16:13:24.368727Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 6.4, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-18T22:11:56.368733Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 3, + "type": "BUY", + "unitPrice": 2.79, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-11-08T04:11:01.368739Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 5.57, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-10T08:53:11.368745Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 8, + "type": "BUY", + "unitPrice": 6.13, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-10-22T02:49:27.368752Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 3, + "type": "BUY", + "unitPrice": 4.46, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-12-12T11:19:19.368757Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 5.71, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-12-29T10:02:36.368763Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 3.9, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-10-19T12:40:48.368771Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 2, + "type": "BUY", + "unitPrice": 7.74, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-05-09T11:48:52.368777Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 8.25, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-25T23:52:31.368783Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 4, + "type": "BUY", + "unitPrice": 7.69, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-12-17T04:13:11.368789Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 6.13, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-26T17:58:36.368795Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 0.77, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-02-10T19:23:59.368800Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 8, + "type": "BUY", + "unitPrice": 1.11, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-07-02T21:16:00.368806Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 7.24, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-24T02:28:02.368812Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 8, + "type": "BUY", + "unitPrice": 1.78, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-11-08T01:31:45.368818Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 8, + "type": "BUY", + "unitPrice": 6.62, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-15T11:11:52.368824Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 5.22, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-10-03T03:49:24.368830Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 8, + "type": "BUY", + "unitPrice": 4.09, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-20T11:22:02.368836Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 4.41, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-10-03T21:55:15.368841Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 0.89, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-12-14T10:29:19.368847Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 6.84, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-04-01T07:09:54.368853Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 2, + "type": "BUY", + "unitPrice": 4.25, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-12-15T01:07:25.368858Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 3.41, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-01-26T14:09:47.368864Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 5.78, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-10-03T04:36:27.368870Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 6.49, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-01-28T08:21:59.368876Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 9.5, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-06-10T07:14:49.368882Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 4, + "type": "BUY", + "unitPrice": 6.88, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-06-16T15:34:55.368888Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 8, + "type": "BUY", + "unitPrice": 9.39, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-11-28T05:59:36.368894Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 8, + "type": "BUY", + "unitPrice": 5.03, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-10-29T22:06:56.368899Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 2.02, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-02-08T10:59:04.368906Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 5.3, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-09-17T09:15:22.368911Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 0.65, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-12-24T18:04:11.368917Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 3.52, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-25T20:55:39.368923Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 0.52, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-15T09:45:15.368929Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 4, + "type": "BUY", + "unitPrice": 1.93, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-10-09T10:48:30.368935Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 3.72, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-05-15T05:29:01.368940Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 3, + "type": "BUY", + "unitPrice": 1.42, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-21T20:56:20.368946Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 8, + "type": "BUY", + "unitPrice": 6.33, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-10T10:13:10.368952Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 2.57, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-23T13:10:50.368957Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 4, + "type": "BUY", + "unitPrice": 9.75, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-01-04T19:11:24.368963Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 4, + "type": "BUY", + "unitPrice": 0.84, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-11-18T22:25:08.368969Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 2, + "type": "BUY", + "unitPrice": 8.84, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-09-14T20:41:32.368975Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 3.7, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-05-13T00:41:03.368981Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 8, + "type": "BUY", + "unitPrice": 8.89, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-04-24T07:27:25.368986Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 3, + "type": "BUY", + "unitPrice": 5.51, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-05-10T00:13:36.368992Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 5.98, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-11-11T09:09:29.369000Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 3, + "type": "BUY", + "unitPrice": 2.73, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-24T06:49:10.369006Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 5.26, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-05-26T03:43:30.369012Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 8, + "type": "BUY", + "unitPrice": 6.04, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-10-03T16:48:06.369018Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 7.54, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-10-16T10:58:23.369024Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 8.1, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-12-06T11:39:07.369030Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 6.66, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-10-27T20:02:26.369036Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 8.2, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-01-15T00:47:51.369042Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 6.34, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-02-18T04:59:37.369048Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 3, + "type": "BUY", + "unitPrice": 8.76, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-02-04T08:25:54.369053Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 8, + "type": "BUY", + "unitPrice": 8.41, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-01-12T01:46:02.369059Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 2.02, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-29T21:43:45.369065Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 5.81, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-07-10T01:02:35.369071Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 8, + "type": "BUY", + "unitPrice": 1.21, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-02-20T14:03:51.369077Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 6.33, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-12-24T14:20:45.369084Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 8.06, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-06-24T14:30:51.369091Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 2, + "type": "BUY", + "unitPrice": 6.37, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-05-31T05:00:55.369097Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 4, + "type": "BUY", + "unitPrice": 6.38, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-01-09T12:46:29.369102Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 8, + "type": "BUY", + "unitPrice": 1.57, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-09-01T16:02:38.369108Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 6.76, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-01T00:48:15.369114Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 7.42, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-01-28T17:45:29.369119Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 2.84, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-12-01T07:41:42.369125Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 3, + "type": "BUY", + "unitPrice": 5.52, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-02-08T14:11:39.369131Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 1.23, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-07T02:55:38.369137Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 8, + "type": "BUY", + "unitPrice": 6.66, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-11-26T05:38:58.369143Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 8, + "type": "BUY", + "unitPrice": 6.2, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-12-11T22:38:14.369148Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 6.48, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-05-26T16:59:54.369154Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 1.49, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-07-05T00:18:51.369160Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 8.43, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-01-09T02:04:05.369166Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 4, + "type": "BUY", + "unitPrice": 4.76, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-01-03T15:04:03.369172Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 3.77, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-01-26T09:39:42.369178Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 4.92, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-10-27T14:36:26.369183Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 9.49, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-02-05T10:33:21.369189Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 7.45, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-19T17:29:42.369195Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 9.85, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-01-30T23:34:59.369200Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 9.63, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-10-25T11:05:12.369206Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 2.61, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-05-22T06:46:59.369212Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 3, + "type": "BUY", + "unitPrice": 1.38, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-10T09:06:56.369218Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 9.06, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-12-27T19:56:02.369224Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 4.06, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-28T11:52:49.369229Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 8, + "type": "BUY", + "unitPrice": 6.24, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-06T13:24:11.369235Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 4, + "type": "BUY", + "unitPrice": 4.48, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-31T04:44:50.369241Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 3, + "type": "BUY", + "unitPrice": 3.35, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-07T10:37:13.369247Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 7.91, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-06-18T02:11:45.369253Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 1.82, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-09-24T09:39:47.369258Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 3.71, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-01-12T02:46:54.369264Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 2.81, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-06-29T00:55:37.369270Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 9.0, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-09-04T11:50:45.369276Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 5.37, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-12-01T01:22:14.369282Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 5.11, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-02-06T14:07:25.369288Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 5.87, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-10-03T06:54:46.369294Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 3, + "type": "BUY", + "unitPrice": 2.42, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-28T21:18:43.369299Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 5.79, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-04-25T16:19:03.369305Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 5.49, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-12-24T19:15:18.369311Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 3, + "type": "BUY", + "unitPrice": 3.52, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-23T14:36:33.369316Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 2, + "type": "BUY", + "unitPrice": 1.09, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-18T08:02:41.369322Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 2, + "type": "BUY", + "unitPrice": 4.99, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-10-12T17:05:09.369328Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 7.44, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-14T03:32:53.369334Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 8, + "type": "BUY", + "unitPrice": 1.83, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-24T08:13:48.369340Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 3.37, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-12-18T21:41:04.369345Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 8, + "type": "BUY", + "unitPrice": 6.44, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-06-10T18:22:10.369351Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 5.17, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-11-09T01:23:50.369358Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 2, + "type": "BUY", + "unitPrice": 6.54, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-15T15:36:41.369364Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 4.83, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-01-23T23:13:16.369370Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 3.7, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-02-27T01:42:51.369376Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 3.45, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-19T18:51:43.369382Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 4, + "type": "BUY", + "unitPrice": 5.25, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-10T18:49:51.369388Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 8.98, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-09-24T15:03:39.369394Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 2.73, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-14T10:38:49.369400Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 1.26, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-02-03T16:54:13.369405Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 4.53, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-11T14:14:32.369411Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 2, + "type": "BUY", + "unitPrice": 8.45, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-09-18T15:57:04.369417Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 4, + "type": "BUY", + "unitPrice": 6.37, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-01T16:26:45.369423Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 7.25, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-04-10T18:20:40.369429Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 5.72, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-05-12T12:38:26.369434Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 4, + "type": "BUY", + "unitPrice": 3.05, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-06-17T11:09:38.369440Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 4, + "type": "BUY", + "unitPrice": 2.59, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-12-27T06:10:56.369446Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 1.21, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-07-10T08:54:15.369452Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 5.4, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-22T14:30:53.369457Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 3, + "type": "BUY", + "unitPrice": 6.56, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-07-24T16:15:24.369463Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 7.68, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-07-07T22:15:00.369469Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 9.67, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-04-22T19:14:00.369474Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 2, + "type": "BUY", + "unitPrice": 2.05, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-06-16T03:46:52.369480Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 8.86, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-13T02:01:41.369486Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 3, + "type": "BUY", + "unitPrice": 3.11, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-09-07T04:13:19.369491Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 1.49, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-10-29T12:58:21.369497Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 3, + "type": "BUY", + "unitPrice": 4.8, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-04-12T02:14:01.369502Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 8.18, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-03T04:54:53.369508Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 6.03, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-04T04:21:16.369514Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 4.52, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-02-02T09:37:46.369519Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 4.49, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-09-02T06:58:12.369525Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 9.21, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-05-23T20:02:32.369531Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 8, + "type": "BUY", + "unitPrice": 5.07, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-10-06T18:14:35.369538Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 4.78, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-06-08T02:11:04.369544Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 5.76, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-06-04T04:59:35.369550Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 0.98, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-01-06T19:08:21.369555Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 8, + "type": "BUY", + "unitPrice": 1.72, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-26T18:46:22.369562Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 4.8, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-01-14T20:41:15.369568Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 8, + "type": "BUY", + "unitPrice": 3.14, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-09-09T09:17:15.369573Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 4, + "type": "BUY", + "unitPrice": 8.05, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-10-29T00:00:42.369579Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 4.21, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-11-25T18:54:15.369585Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 6.75, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-11-09T13:36:55.369591Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 1.42, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-05-19T06:16:12.369596Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 5.38, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-02-13T15:02:05.369602Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 3, + "type": "BUY", + "unitPrice": 7.04, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-03T10:59:13.369608Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 7.52, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-02-19T00:17:17.369614Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 5.0, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-06-06T02:09:28.369619Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 4, + "type": "BUY", + "unitPrice": 1.75, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-06T05:01:31.369625Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 2.41, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-04-30T15:43:36.369631Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 4, + "type": "BUY", + "unitPrice": 7.14, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-02-23T12:10:09.369637Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 4, + "type": "BUY", + "unitPrice": 6.02, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-04-24T08:45:01.369643Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 2, + "type": "BUY", + "unitPrice": 5.97, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-11-20T19:35:43.369650Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 2.74, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-10-08T10:24:55.369656Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 1.98, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-09-12T05:34:57.369661Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 2.59, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-10-10T20:30:58.369667Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 3.83, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-12-12T10:26:40.369673Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 6.85, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-09-23T19:33:25.369679Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 5.35, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-10-23T22:06:06.369685Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 8.42, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-02-19T00:10:50.369691Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 6.83, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-01-19T02:03:40.369697Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 1.69, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-04-08T22:45:35.369703Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 3, + "type": "BUY", + "unitPrice": 7.22, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-05-26T23:40:23.369708Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 7.05, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-05-13T02:11:10.369714Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 2, + "type": "BUY", + "unitPrice": 8.02, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-01-24T22:04:32.369720Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 2, + "type": "BUY", + "unitPrice": 4.04, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-30T00:56:14.369726Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 1.2, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-10T04:48:07.369733Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 3, + "type": "BUY", + "unitPrice": 3.29, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-10-08T12:08:52.369739Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 2, + "type": "BUY", + "unitPrice": 7.95, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-04-21T04:00:37.369745Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 8, + "type": "BUY", + "unitPrice": 0.85, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-02-14T00:15:09.369751Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 1.01, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-11-15T07:54:49.369757Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 2, + "type": "BUY", + "unitPrice": 3.92, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-12-30T20:09:41.369763Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 5.35, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-07-22T05:29:43.369768Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 8, + "type": "BUY", + "unitPrice": 0.88, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-06-16T00:39:21.369774Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 8, + "type": "BUY", + "unitPrice": 1.61, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-09-08T09:59:57.369780Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 8.42, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-12-12T14:10:40.369786Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 8.16, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-09-11T10:59:14.369791Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 4, + "type": "BUY", + "unitPrice": 7.86, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-05-31T02:37:22.369797Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 8, + "type": "BUY", + "unitPrice": 5.09, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-07-11T12:01:39.369803Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 3, + "type": "BUY", + "unitPrice": 4.89, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-11-15T03:02:12.369809Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 2.46, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-07-15T03:53:45.369814Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 4, + "type": "BUY", + "unitPrice": 1.89, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-11-08T23:01:19.369820Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 9.57, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-10-24T20:24:33.369826Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 4, + "type": "BUY", + "unitPrice": 4.25, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-02-07T08:37:51.369831Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 9.59, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-10-11T19:42:00.369837Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 3.25, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-04-25T13:15:09.369843Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 1.06, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-06-14T14:01:05.369849Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 2, + "type": "BUY", + "unitPrice": 4.95, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-11-12T12:45:59.369854Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 2.69, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-01-30T06:40:51.369860Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 4.85, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-04-17T09:07:03.369866Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 1.3, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-07-20T02:49:44.369872Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 8.18, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-11-18T21:54:52.369878Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 3, + "type": "BUY", + "unitPrice": 5.62, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-05-08T05:43:28.369883Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 6.78, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-16T15:46:33.369889Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 3, + "type": "BUY", + "unitPrice": 8.33, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-20T13:44:48.369895Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 3.53, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-07-31T07:41:12.369901Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 4, + "type": "BUY", + "unitPrice": 3.62, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-12-22T00:06:06.369907Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 8, + "type": "BUY", + "unitPrice": 8.06, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-12-26T21:10:50.369912Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 8, + "type": "BUY", + "unitPrice": 3.99, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-06-28T14:58:14.369920Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 4.12, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-05-11T17:36:01.369926Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 4.64, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-07-22T01:34:08.369931Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 3, + "type": "BUY", + "unitPrice": 0.99, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-07-23T10:35:09.369937Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 3, + "type": "BUY", + "unitPrice": 2.53, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-07-18T20:22:11.369943Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 1.84, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-06-28T15:11:14.369949Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 3, + "type": "BUY", + "unitPrice": 4.91, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-05-29T12:57:58.369954Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 2.46, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-06-21T07:00:48.369960Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 1.11, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-02-06T16:27:15.369966Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 8.56, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-07-16T09:59:12.369972Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 1.32, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-06-28T07:31:51.369978Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 3.75, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-05-13T09:14:31.369984Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 2, + "type": "BUY", + "unitPrice": 3.28, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-20T14:48:21.369990Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 5.69, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-10-02T23:14:49.369996Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 1.67, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-02-05T01:41:06.370001Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 6.71, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-11-24T22:42:15.370007Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 6.41, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-04-14T23:36:02.370013Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 2.99, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-02T21:52:42.370019Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 8.17, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-04-15T09:57:36.370024Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 9.17, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-31T21:42:28.370030Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 4, + "type": "BUY", + "unitPrice": 3.18, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-20T23:37:43.370036Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 1.75, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-21T21:56:16.370042Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 9.5, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-11-17T07:53:13.370048Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 8, + "type": "BUY", + "unitPrice": 0.6, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-07-20T09:11:51.370054Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 1.94, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-30T14:43:16.370060Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 9.84, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-05-14T00:11:46.370066Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 4, + "type": "BUY", + "unitPrice": 2.51, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-26T13:09:54.370071Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 2.23, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-01-30T06:20:03.370077Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 2, + "type": "BUY", + "unitPrice": 9.82, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-01-23T09:52:05.370083Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 8, + "type": "BUY", + "unitPrice": 3.33, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-04-23T09:56:54.370089Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 9.24, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-02-06T22:57:22.370095Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 6.92, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-12-10T04:33:39.370100Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 2.35, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-06-09T11:37:13.370106Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 2, + "type": "BUY", + "unitPrice": 6.71, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-06-18T20:53:22.370115Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 1.57, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-11-11T22:39:36.370121Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 0.66, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-05T12:21:46.370127Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 2.68, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-05-17T11:46:06.370132Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 0.62, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-05-04T23:20:21.370138Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 9.11, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-09T09:54:29.370144Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 9.23, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-10-28T14:46:44.370150Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 0.65, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-12-27T13:42:17.370155Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 9.99, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-30T10:42:04.370161Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 4, + "type": "BUY", + "unitPrice": 7.13, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-12-24T16:52:36.370167Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 4, + "type": "BUY", + "unitPrice": 6.93, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-17T13:53:23.370173Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 8, + "type": "BUY", + "unitPrice": 4.39, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-02-14T13:09:14.370179Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 6.71, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-06-16T17:41:30.370184Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 2.37, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-09-27T23:09:43.370190Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 6.18, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-10-21T02:03:24.370196Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 5.49, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-05-21T10:34:30.370202Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 1.21, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-04-04T13:36:35.370207Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 1.37, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-05-17T21:54:00.370213Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 2.51, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-07-03T21:11:09.370219Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 4.18, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-23T00:47:46.370225Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 4.13, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-10-21T16:34:19.370231Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 5.46, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-06-15T07:49:48.370237Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 7.23, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-17T00:35:47.370243Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 0.77, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-26T13:41:21.370249Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 2, + "type": "BUY", + "unitPrice": 4.17, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-09-05T15:49:35.370254Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 0.97, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-10-06T19:10:42.370260Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 9.38, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-06T17:48:07.370266Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 9.73, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-04-01T19:12:54.370272Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 3.19, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-22T07:21:20.370278Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 4.42, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-02-15T18:06:59.370284Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 8.2, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-14T22:13:42.370290Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 4, + "type": "BUY", + "unitPrice": 8.11, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-06T12:34:32.370295Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 8, + "type": "BUY", + "unitPrice": 1.69, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-05-26T10:17:46.370303Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 7.8, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-10-03T12:17:12.370309Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 5.28, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-11T01:47:26.370315Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 2, + "type": "BUY", + "unitPrice": 8.22, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-07-25T17:36:20.370320Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 8, + "type": "BUY", + "unitPrice": 0.57, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-04-12T19:46:46.370326Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 4, + "type": "BUY", + "unitPrice": 8.8, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-02-02T23:40:20.370332Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 8, + "type": "BUY", + "unitPrice": 2.09, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-06-26T11:50:46.370338Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 3, + "type": "BUY", + "unitPrice": 3.41, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-11-04T11:09:25.370343Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 2.16, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-04-14T04:28:08.370349Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 1.92, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-12-27T23:36:47.370355Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 8.54, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-05-06T04:19:42.370361Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 8.03, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-06-15T00:05:42.370367Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 2, + "type": "BUY", + "unitPrice": 2.48, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-01-01T12:08:52.370372Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 2, + "type": "BUY", + "unitPrice": 3.97, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-09-30T04:11:56.370378Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 8.2, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-09-10T01:39:56.370384Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 4, + "type": "BUY", + "unitPrice": 7.12, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-07-13T00:06:47.370390Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 2.09, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-04-25T13:29:51.370396Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 5.75, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-10-02T21:37:11.370401Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 5.14, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-12-20T18:12:04.370407Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 8.78, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-01-23T04:20:05.370413Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 2, + "type": "BUY", + "unitPrice": 0.7, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-01-10T15:16:18.370419Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 1.44, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-09-23T08:21:10.370425Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 1.29, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-05-12T00:35:28.370431Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 2, + "type": "BUY", + "unitPrice": 9.15, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-01-09T10:27:13.370436Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 8, + "type": "BUY", + "unitPrice": 4.42, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-24T08:36:54.370442Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 4, + "type": "BUY", + "unitPrice": 8.51, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-04-25T11:24:02.370448Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 5.69, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-05-06T08:49:08.370454Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 3.47, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-09-10T23:48:55.370460Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 4.06, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-06-26T21:38:48.370465Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 7.39, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-06-06T17:04:34.370471Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 8.79, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-02-11T09:34:44.370477Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 4.87, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-12-31T07:24:29.370485Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 2.05, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-07-22T23:44:12.370491Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 2, + "type": "BUY", + "unitPrice": 1.95, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-01-06T21:01:32.370497Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 7.58, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-06-03T20:04:22.370503Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 2.37, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-05-07T15:39:11.370509Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 4, + "type": "BUY", + "unitPrice": 5.82, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-06-16T06:49:12.370515Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 2, + "type": "BUY", + "unitPrice": 2.18, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-26T20:05:39.370521Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 2, + "type": "BUY", + "unitPrice": 9.83, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-10-09T03:54:38.370527Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 6.83, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-04-25T20:41:28.370533Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 4, + "type": "BUY", + "unitPrice": 1.91, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-11-18T00:38:31.370538Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 0.89, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-09-21T21:24:02.370544Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 3, + "type": "BUY", + "unitPrice": 9.05, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-02T22:34:38.370550Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 8.65, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-10-11T23:26:36.370555Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 0.65, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-10-10T17:58:07.370561Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 7.76, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-01-27T11:26:19.370567Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 2.35, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-12-17T22:37:57.370573Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 0.73, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-01-29T12:58:28.370578Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 2.84, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-26T05:40:14.370584Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 3, + "type": "BUY", + "unitPrice": 3.07, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-09-07T18:59:30.370590Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 8.26, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-05-09T18:23:01.370596Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 7.08, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-12-14T06:21:18.370601Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 6.33, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-05-28T12:37:56.370607Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 3, + "type": "BUY", + "unitPrice": 7.85, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-04-14T17:43:35.370612Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 8.26, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-02-19T03:29:16.370618Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 5.45, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-11-13T20:46:04.370624Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 3, + "type": "BUY", + "unitPrice": 0.97, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-07-12T19:49:04.370629Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 2, + "type": "BUY", + "unitPrice": 5.06, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-09-02T21:14:40.370635Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 4, + "type": "BUY", + "unitPrice": 1.06, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-10-03T13:07:00.370641Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 5.99, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-10-15T15:18:06.370647Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 8.01, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-06T06:53:39.370652Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 3, + "type": "BUY", + "unitPrice": 2.53, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-01-28T15:47:34.370658Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 0.54, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-06-22T07:53:54.370664Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 1.35, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-12-18T11:15:18.370670Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 8, + "type": "BUY", + "unitPrice": 9.59, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-12-11T09:53:48.370676Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 2.56, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-01-07T16:47:12.370684Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 5.48, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-02-19T19:41:41.370690Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 2.45, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-02-18T15:04:51.370696Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 8.13, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-10-03T22:07:47.370702Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 3, + "type": "BUY", + "unitPrice": 0.66, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-05-04T12:45:25.370708Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 3.64, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-09-22T16:54:59.370713Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 3, + "type": "BUY", + "unitPrice": 4.33, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-07-22T09:10:07.370719Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 7.33, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-11-19T01:51:09.370725Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 8.86, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-09-03T13:15:32.370731Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 3.23, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-02-11T21:24:54.370737Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 2, + "type": "BUY", + "unitPrice": 3.51, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-10-09T14:48:04.370743Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 9.4, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-01-01T13:26:31.370748Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 2.94, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-01-10T09:13:12.370754Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 9.49, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-01-08T00:11:43.370760Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 0.53, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-02-04T19:14:19.370765Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 1.67, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-10-02T08:34:19.370771Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 6.62, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-01-02T13:19:38.370777Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 9.21, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-01-07T06:01:17.370783Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 3.41, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-26T22:34:30.370789Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 1.35, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-05-25T10:32:19.370794Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 7.55, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-07-16T09:38:14.370800Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 6.05, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-09-24T06:11:14.370806Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 8, + "type": "BUY", + "unitPrice": 8.09, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-28T10:28:57.370811Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 1.54, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-01-22T03:48:24.370817Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 8, + "type": "BUY", + "unitPrice": 8.4, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-07-03T14:11:02.370823Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 4.03, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-04-18T23:34:49.370829Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 3.11, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-18T06:20:41.370834Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 8.44, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-13T03:41:34.370840Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 6.62, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-04-19T16:30:05.370846Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 3, + "type": "BUY", + "unitPrice": 7.92, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-29T14:54:49.370853Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 8.72, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-14T19:29:00.370859Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 5.49, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-04-22T08:07:30.370864Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 4.11, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-11-24T10:16:35.370870Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 8.14, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-09-04T23:15:11.370875Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 8.82, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-03T11:27:59.370881Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 8.46, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-13T15:16:08.370887Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 1.78, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-02T01:13:02.370893Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 8, + "type": "BUY", + "unitPrice": 0.54, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-06-28T04:22:14.370898Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 6.39, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-12-25T05:48:24.370904Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 5.38, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-11-27T12:26:17.370909Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 4, + "type": "BUY", + "unitPrice": 4.23, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-30T22:09:03.370914Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 7.3, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-07-29T04:27:48.370920Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 8, + "type": "BUY", + "unitPrice": 9.46, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-07-10T07:01:25.370925Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 6.65, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-10-28T17:24:19.370930Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 1.99, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-09-22T06:31:54.370936Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 7, + "type": "BUY", + "unitPrice": 4.3, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-02-21T02:50:25.370941Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 1.78, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-10-09T16:49:56.370947Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 3.54, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-07-07T00:03:42.370952Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 5.98, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-10-21T07:23:30.370957Z", + "symbol": "NFLX" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 5, + "type": "BUY", + "unitPrice": 3.78, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-03-04T08:10:35.370962Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 5.42, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-06-02T21:13:05.370968Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 9, + "type": "BUY", + "unitPrice": 5.24, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-07-17T18:09:10.370973Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 4, + "type": "BUY", + "unitPrice": 3.56, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-10-25T09:18:14.370979Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 4, + "type": "BUY", + "unitPrice": 9.81, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-05-06T19:43:34.370984Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 2, + "type": "BUY", + "unitPrice": 2.57, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-31T22:28:34.370989Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 2, + "type": "BUY", + "unitPrice": 6.4, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-11-05T20:04:43.370995Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 9.41, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-06-03T15:37:08.371000Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 1.6, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-06-26T01:53:31.371005Z", + "symbol": "AAPL" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 9.14, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-05-29T23:17:38.371011Z", + "symbol": "AMZN" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 2, + "type": "BUY", + "unitPrice": 5.64, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-10T18:10:15.371016Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 1, + "type": "BUY", + "unitPrice": 9.69, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-05-06T17:33:29.371021Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 3.09, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-02-08T01:30:13.371027Z", + "symbol": "MSFT" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 3.0, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-08-06T22:03:04.371032Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 3.78, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-09-24T17:28:55.371038Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 4, + "type": "BUY", + "unitPrice": 2.24, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-05-06T14:56:02.371043Z", + "symbol": "META" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 2.52, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2023-01-11T19:50:48.371049Z", + "symbol": "GOOG" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 6, + "type": "BUY", + "unitPrice": 0.63, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-09-15T23:14:46.371054Z", + "symbol": "TSLA" + }, + { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, + "fee": 0, + "quantity": 4, + "type": "BUY", + "unitPrice": 9.03, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2022-05-06T03:16:21.371059Z", + "symbol": "AAPL" + } + ] +} \ No newline at end of file diff --git a/test/import/ok-novn-buy-and-sell.json b/test/import/ok-novn-buy-and-sell.json new file mode 100644 index 000000000..b8a62279d --- /dev/null +++ b/test/import/ok-novn-buy-and-sell.json @@ -0,0 +1,28 @@ +{ + "meta": { + "date": "2022-07-21T21:28:05.857Z", + "version": "dev" + }, + "activities": [ + { + "fee": 0, + "quantity": 2, + "type": "SELL", + "unitPrice": 85.73, + "currency": "CHF", + "dataSource": "YAHOO", + "date": "2022-04-07T22:00:00.000Z", + "symbol": "NOVN.SW" + }, + { + "fee": 0, + "quantity": 2, + "type": "BUY", + "unitPrice": 75.8, + "currency": "CHF", + "dataSource": "YAHOO", + "date": "2022-03-06T23:00:00.000Z", + "symbol": "NOVN.SW" + } + ] +} diff --git a/test/import/ok-vti-buy-long-history.json b/test/import/ok-vti-buy-long-history.json new file mode 100644 index 000000000..e6020e405 --- /dev/null +++ b/test/import/ok-vti-buy-long-history.json @@ -0,0 +1,38 @@ +{ + "meta": { + "date": "2023-04-29T00:00:00.000Z", + "version": "dev" + }, + "activities": [ + { + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 65.31, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2012-01-02T22:00:00.000Z", + "symbol": "VTI" + }, + { + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 65.40, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2011-01-02T22:00:00.000Z", + "symbol": "VTI" + }, + { + "fee": 0, + "quantity": 10, + "type": "BUY", + "unitPrice": 57.05, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2010-01-03T22:00:00.000Z", + "symbol": "VTI" + } + ] +} diff --git a/test/import/ok-vti-buy-on-ibkr.csv b/test/import/ok-vti-buy-on-ibkr.csv new file mode 100644 index 000000000..512420a1d --- /dev/null +++ b/test/import/ok-vti-buy-on-ibkr.csv @@ -0,0 +1,2 @@ +"CurrencyPrimary","Symbol","DateTime","TradeDate","TransactionType","Quantity","TradePrice","Buy/Sell","ClientAccountID","AccountAlias","Model","FXRateToBase","AssetClass","SubCategory","Description","Conid","SecurityID","SecurityIDType","CUSIP","ISIN","ListingExchange","UnderlyingConid","UnderlyingSymbol","UnderlyingSecurityID","UnderlyingListingExchange","Issuer","Multiplier","Strike","TradeID","Expiry","RelatedTradeID","Put/Call","ReportDate","PrincipalAdjustFactor","SettleDateTarget","Exchange","TradeMoney","Proceeds","Taxes","IBCommission","IBCommissionCurrency","NetCash","ClosePrice","Open/CloseIndicator","Notes/Codes","CostBasis","FifoPnlRealized","FxPnl","MtmPnl","OrigTradePrice","OrigTradeDate","OrigTradeID","OrigOrderID","OrigTransactionID","ClearingFirmID","IBOrderID","TransactionID","IBExecID","RelatedTransactionID","BrokerageOrderID","OrderReference","VolatilityOrderLink","ExchOrderID","ExtExecID","OrderTime","OpenDateTime","HoldingPeriodDateTime","WhenRealized","WhenReopened","LevelOfDetail","ChangeInPrice","ChangeInQuantity","OrderType","TraderID","IsAPIOrder","AccruedInterest","SerialNumber","DeliveryType","CommodityType","Fineness","Weight" +"USD","VTI","20230403;095853","20230403","ExchTrade","17","204.3473","BUY","U1234567","","","0.9127","STK","ETF","VANGUARD TOTAL STOCK MKT ETF","12340041","US9229087690","ISIN","922908769","US9229087690","ARCA","","","","","","1","","1234567890","","","","20230403","","20230405","DARK","3473.9041","-3473.9041","0","-1","USD","-3474.9041","204.64","O","","3474.9041","0","0","4.9759","0","","","0","0","","1234567890","1234567890","0000a123.123abcde.01.01","","00cb7412.0001b9c2.642a55d0.0001","","","N/A","2304030003120950675","20230403;095853","","","","","EXECUTION","0","0","LMT","","N","0","","","","0.0","0.0 ()" diff --git a/test/import/ok-without-accounts.json b/test/import/ok-without-accounts.json new file mode 100644 index 000000000..63961be74 --- /dev/null +++ b/test/import/ok-without-accounts.json @@ -0,0 +1,48 @@ +{ + "meta": { + "date": "2022-04-01T00:00:00.000Z", + "version": "dev" + }, + "activities": [ + { + "fee": 0, + "quantity": 0, + "type": "BUY", + "unitPrice": 0, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2050-06-05T22:00:00.000Z", + "symbol": "MSFT" + }, + { + "fee": 0, + "quantity": 1, + "type": "ITEM", + "unitPrice": 500000, + "currency": "USD", + "dataSource": "MANUAL", + "date": "2021-12-31T22:00:00.000Z", + "symbol": "Penthouse Apartment" + }, + { + "fee": 0, + "quantity": 5, + "type": "DIVIDEND", + "unitPrice": 0.62, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2021-11-16T22:00:00.000Z", + "symbol": "MSFT" + }, + { + "fee": 19, + "quantity": 5, + "type": "BUY", + "unitPrice": 298.58, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2021-09-15T22:00:00.000Z", + "symbol": "MSFT" + } + ] +} diff --git a/test/import/ok.json b/test/import/ok.json index 63961be74..335d2cd8a 100644 --- a/test/import/ok.json +++ b/test/import/ok.json @@ -1,10 +1,23 @@ { "meta": { - "date": "2022-04-01T00:00:00.000Z", + "date": "2023-02-05T00:00:00.000Z", "version": "dev" }, + "accounts": [ + { + "accountType": "SECURITIES", + "balance": 2000, + "currency": "USD", + "id": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "isExcluded": false, + "name": "My Online Trading Account", + "platformId": null + } + ], "activities": [ { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, "fee": 0, "quantity": 0, "type": "BUY", @@ -15,6 +28,8 @@ "symbol": "MSFT" }, { + "accountId": null, + "comment": null, "fee": 0, "quantity": 1, "type": "ITEM", @@ -25,6 +40,8 @@ "symbol": "Penthouse Apartment" }, { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": null, "fee": 0, "quantity": 5, "type": "DIVIDEND", @@ -35,6 +52,8 @@ "symbol": "MSFT" }, { + "accountId": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", + "comment": "My first order", "fee": 19, "quantity": 5, "type": "BUY", diff --git a/tools/generators/.gitkeep b/tools/generators/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/yarn.lock b/yarn.lock index 06c6e588a..2c73e0ce8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,12 +2,7 @@ # yarn lockfile v1 -"@adobe/css-tools@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.0.1.tgz#b38b444ad3aa5fedbb15f2f746dcd934226a12dd" - integrity sha512-+u76oB43nOHrF4DDWRLWDCtci7f3QJoEBigemIdIeTi1ODqjx6Tad9NCVnPRwewWlKkVab5PlK8DCtPTyX7S8g== - -"@ampproject/remapping@2.2.0", "@ampproject/remapping@^2.1.0": +"@ampproject/remapping@2.2.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== @@ -15,287 +10,291 @@ "@jridgewell/gen-mapping" "^0.1.0" "@jridgewell/trace-mapping" "^0.3.9" -"@angular-devkit/architect@0.1402.1": - version "0.1402.1" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1402.1.tgz#3588269ebe44628a56d72b8c1ebf346c6cd9c6eb" - integrity sha512-OZ5mkVHSrk5WX6wIfvkxJUCqJRtfQh1S476qHIi80llhJufFTwoOwJrcz7XtNRvbZMLRMztf0aIhEDaUtEBRZQ== +"@ampproject/remapping@^2.1.0", "@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@angular-devkit/architect@0.1502.5": + version "0.1502.5" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1502.5.tgz#54bfb2d2fa5109c46782d0a571be5fd64c27972f" + integrity sha512-6KVrXQ/X7W88WSJvYe69ed/2QzQNlObKpj3BWzmcKnA+IvJB37/mvw8VaGFP9y+pDa/b1D1yCDtAJLeP5QY3xg== dependencies: - "@angular-devkit/core" "14.2.1" + "@angular-devkit/core" "15.2.5" rxjs "6.6.7" -"@angular-devkit/architect@^0.1301.0": - version "0.1301.4" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1301.4.tgz#2fc51bcae0dcb581c8be401e2fde7bbd10b43076" - integrity sha512-p6G8CEMnE+gYwxRyEttj3QGsuNJ3Kusi7iwBIzWyf2RpJSdGzXdwUEiRGg6iS0YHFr06/ZFfAWfnM2DQvNm4TA== +"@angular-devkit/architect@^0.1301.0 || ^0.1401.0 || ^0.1501.0": + version "0.1501.6" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1501.6.tgz#dc8b935d6aa12a9a7e84fec7b5011dd7cf19b981" + integrity sha512-u07zZFlfrg0Qn4mu5M9Nz0pH2Yd2028XF/73980PsZMxwkSm4diF08v4bHk3UyR7yPT7phwvt4znj6ryZhx1gw== dependencies: - "@angular-devkit/core" "13.1.4" + "@angular-devkit/core" "15.1.6" rxjs "6.6.7" -"@angular-devkit/build-angular@14.2.1": - version "14.2.1" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-14.2.1.tgz#d4b5ac1fa81a0e41f2b0f7b282a9b2d17227408b" - integrity sha512-6FeIe2nsNH/fslZmTfbo+RCjLk3HuCQa5rb/SFf3w0mwzWCrhV0/SqnQ4+YYgkKrohmTX+q5JmJPwWnkqgdIgQ== +"@angular-devkit/build-angular@15.2.5": + version "15.2.5" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-15.2.5.tgz#76864b74b05566077590914080961d51e20eabdf" + integrity sha512-D2LxjBtUlgJnPxybOIN0XsENEGkVkqCGBBii5oK84HvgBHXO/EyP1WXpOdb2lOYSUZyjhOOs0q42LCobJoaxUw== dependencies: "@ampproject/remapping" "2.2.0" - "@angular-devkit/architect" "0.1402.1" - "@angular-devkit/build-webpack" "0.1402.1" - "@angular-devkit/core" "14.2.1" - "@babel/core" "7.18.10" - "@babel/generator" "7.18.12" + "@angular-devkit/architect" "0.1502.5" + "@angular-devkit/build-webpack" "0.1502.5" + "@angular-devkit/core" "15.2.5" + "@babel/core" "7.20.12" + "@babel/generator" "7.20.14" "@babel/helper-annotate-as-pure" "7.18.6" - "@babel/plugin-proposal-async-generator-functions" "7.18.10" - "@babel/plugin-transform-async-to-generator" "7.18.6" - "@babel/plugin-transform-runtime" "7.18.10" - "@babel/preset-env" "7.18.10" - "@babel/runtime" "7.18.9" - "@babel/template" "7.18.10" + "@babel/helper-split-export-declaration" "7.18.6" + "@babel/plugin-proposal-async-generator-functions" "7.20.7" + "@babel/plugin-transform-async-to-generator" "7.20.7" + "@babel/plugin-transform-runtime" "7.19.6" + "@babel/preset-env" "7.20.2" + "@babel/runtime" "7.20.13" + "@babel/template" "7.20.7" "@discoveryjs/json-ext" "0.5.7" - "@ngtools/webpack" "14.2.1" + "@ngtools/webpack" "15.2.5" ansi-colors "4.1.3" - babel-loader "8.2.5" + autoprefixer "10.4.13" + babel-loader "9.1.2" babel-plugin-istanbul "6.1.1" - browserslist "^4.9.1" - cacache "16.1.2" + browserslist "4.21.5" + cacache "17.0.4" + chokidar "3.5.3" copy-webpack-plugin "11.0.0" critters "0.0.16" - css-loader "6.7.1" - esbuild-wasm "0.15.5" - glob "8.0.3" + css-loader "6.7.3" + esbuild-wasm "0.17.8" + glob "8.1.0" https-proxy-agent "5.0.1" inquirer "8.2.4" - jsonc-parser "3.1.0" + jsonc-parser "3.2.0" karma-source-map-support "1.4.0" less "4.1.3" - less-loader "11.0.0" + less-loader "11.1.0" license-webpack-plugin "4.0.2" - loader-utils "3.2.0" - mini-css-extract-plugin "2.6.1" - minimatch "5.1.0" - open "8.4.0" + loader-utils "3.2.1" + magic-string "0.29.0" + mini-css-extract-plugin "2.7.2" + open "8.4.1" ora "5.4.1" - parse5-html-rewriting-stream "6.0.1" + parse5-html-rewriting-stream "7.0.0" piscina "3.2.0" - postcss "8.4.16" - postcss-import "14.1.0" - postcss-loader "7.0.1" - postcss-preset-env "7.8.0" - regenerator-runtime "0.13.9" + postcss "8.4.21" + postcss-loader "7.0.2" resolve-url-loader "5.0.0" rxjs "6.6.7" - sass "1.54.4" - sass-loader "13.0.2" - semver "7.3.7" - source-map-loader "4.0.0" + sass "1.58.1" + sass-loader "13.2.0" + semver "7.3.8" + source-map-loader "4.0.1" source-map-support "0.5.21" - stylus "0.59.0" - stylus-loader "7.0.0" - terser "5.14.2" + terser "5.16.3" text-table "0.2.0" tree-kill "1.2.2" - tslib "2.4.0" - webpack "5.74.0" - webpack-dev-middleware "5.3.3" - webpack-dev-server "4.10.0" + tslib "2.5.0" + webpack "5.76.1" + webpack-dev-middleware "6.0.1" + webpack-dev-server "4.11.1" webpack-merge "5.8.0" webpack-subresource-integrity "5.1.0" optionalDependencies: - esbuild "0.15.5" + esbuild "0.17.8" -"@angular-devkit/build-webpack@0.1402.1": - version "0.1402.1" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.1402.1.tgz#8f19a70b8105ac548f8cec38db9dc51f3b6f0162" - integrity sha512-S9WvNKrHVgOWNqGCytJNPBEMojB9j6cgl5XlUMEQ+4NV5geOlDNiZltQ/gbC1jz19OU5N+Ky374mPI5IeIBqZg== +"@angular-devkit/build-webpack@0.1502.5": + version "0.1502.5" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.1502.5.tgz#fba71678c588ed70b3f117ae1d125f2481bc7e35" + integrity sha512-gPkAa4AvQ7BxU+jmVJqrAO18kw/6iks+VUQ+2BVPyHCdqhroANHYdGbZ/pFlZdPmZVzSpusjd6VIbLhbHr/Ohw== dependencies: - "@angular-devkit/architect" "0.1402.1" + "@angular-devkit/architect" "0.1502.5" rxjs "6.6.7" -"@angular-devkit/core@13.1.4": - version "13.1.4" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-13.1.4.tgz#b5b6ddd674ae351f83beff2e4a0d702096bdfd47" - integrity sha512-225Gjy4iVxh5Jo9njJnaG75M/Dt95UW+dEPCGWKV5E/++7UUlXlo9sNWq8x2vJm2nhtsPkpnXNOt4pW1mIDwqQ== +"@angular-devkit/core@15.1.6": + version "15.1.6" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-15.1.6.tgz#61275ee83825fea0e24966bc450fc27e6d5c35c7" + integrity sha512-jGgxyRjecVf6lEyqDxz7ltMEndNPxIg720pk6r40fgsu0dU8w9vjJSJe7k0XdJiXVRcN6wZa/J5nO/xcwWVIsA== dependencies: - ajv "8.8.2" + ajv "8.12.0" ajv-formats "2.1.1" - fast-json-stable-stringify "2.1.0" - magic-string "0.25.7" + jsonc-parser "3.2.0" rxjs "6.6.7" - source-map "0.7.3" + source-map "0.7.4" -"@angular-devkit/core@14.0.5": - version "14.0.5" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-14.0.5.tgz#19f5940b53aeb0ce56479c44670d3bc3b2df92b1" - integrity sha512-/CUGi6QLwh79FvsOY7M+1LQL3asZsbQW/WBd5f1iu5y7TLNqCwo+wOb0ZXLDNPw45vYBxFajtt3ob3U7qx3jNg== +"@angular-devkit/core@15.2.4": + version "15.2.4" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-15.2.4.tgz#f7696f09c66d01568a07f0e71672e887fdf57280" + integrity sha512-yl+0j1bMwJLKShsyCXw77tbJG8Sd21+itisPLL2MgEpLNAO252kr9zG4TLlFRJyKVftm2l1h78KjqvM5nbOXNg== dependencies: - ajv "8.11.0" + ajv "8.12.0" ajv-formats "2.1.1" - jsonc-parser "3.0.0" + jsonc-parser "3.2.0" rxjs "6.6.7" - source-map "0.7.3" + source-map "0.7.4" -"@angular-devkit/core@14.1.2", "@angular-devkit/core@^13.0.0 || ^14.0.0": - version "14.1.2" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-14.1.2.tgz#f4c287295065b3845e85a84e29f12629b4a52cf9" - integrity sha512-fIfymD1erjoj1eVh7pa/dvOtUhSd7sEOGuWEJ81HJqdzwZbPWweRu3Nh/9kj/ttUy8xawWfdJHLwyG2KnRu0DA== +"@angular-devkit/core@15.2.5": + version "15.2.5" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-15.2.5.tgz#ab1b41866de5fdfee630ef793938893dbd318bcc" + integrity sha512-ZfjEkAe2yYeekc3xjZ/U4pK9nb+w6BFwAEjou6mE8PWZH7iYskm0YCCXkmu+B+zViEcCLhAkJAxu9MwX4efd8g== dependencies: - ajv "8.11.0" + ajv "8.12.0" ajv-formats "2.1.1" - jsonc-parser "3.1.0" + jsonc-parser "3.2.0" rxjs "6.6.7" source-map "0.7.4" -"@angular-devkit/core@14.2.1": - version "14.2.1" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-14.2.1.tgz#7ce14efdb5fce687bb4f13bef03d4b67e971b22e" - integrity sha512-lW8oNGuJqr4r31FWBjfWQYkSXdiOHBGOThIEtHvUVBKfPF/oVrupLueCUgBPel+NvxENXdo93uPsqHN7bZbmsQ== +"@angular-devkit/core@15.2.8", "@angular-devkit/core@^13.0.0 || ^14.0.0 || ^15.0.0": + version "15.2.8" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-15.2.8.tgz#ff494ae7af137b0f0109deb8ee34f1550ed5cc1d" + integrity sha512-Lo4XrbDMtXarKnMrFgWLmQdSX+3QPNAg4otG8cmp/U4jJyjV4dAYKEAsb1sCNGUSM4h4v09EQU/5ugVjDU29lQ== dependencies: - ajv "8.11.0" + ajv "8.12.0" ajv-formats "2.1.1" - jsonc-parser "3.1.0" + jsonc-parser "3.2.0" rxjs "6.6.7" source-map "0.7.4" -"@angular-devkit/schematics@14.0.5": - version "14.0.5" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-14.0.5.tgz#01777d2ad473d35bdfdbbb751521c43421ad9772" - integrity sha512-sufxITBkn2MvgEREt9JQ3QCKHS+sue1WsVzLE+TWqG5MC/RPk0f9tQ5VoHk6ZTzDKUvOtSoc7G+n0RscQsyp5g== +"@angular-devkit/schematics@15.2.4": + version "15.2.4" + resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-15.2.4.tgz#85129ebabcdb362f4b65a6e290bb2ae846f3d64c" + integrity sha512-/W7/vvn59PAVLzhcvD4/N/E8RDhub8ny1A7I96LTRjC5o+yvVV16YJ4YJzolrRrIEN01KmLVQJ9A58VCaweMgw== dependencies: - "@angular-devkit/core" "14.0.5" - jsonc-parser "3.0.0" - magic-string "0.26.1" + "@angular-devkit/core" "15.2.4" + jsonc-parser "3.2.0" + magic-string "0.29.0" ora "5.4.1" rxjs "6.6.7" -"@angular-devkit/schematics@14.1.2", "@angular-devkit/schematics@^13.0.0 || ^14.0.0": - version "14.1.2" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-14.1.2.tgz#6fb81aaece4ad1a24f3dd7b213e2f7000b41adbf" - integrity sha512-vC9UA3heXbq9CAkwMXHJfIu0G7Ty2oTJ5PtrrFQpig1PrFnRfr4sg+qRS1CLsEAJYQNo14xV55OQkKEPTij/Gg== +"@angular-devkit/schematics@15.2.5": + version "15.2.5" + resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-15.2.5.tgz#84e3f235ca2fc6647a1d97861c7a899ff1f470b5" + integrity sha512-zm7chQRQtPXQzzSAvK/mbZ+RJ3eP7hlU53yyJ/i6kjWAh3Y5uiSHNYGmqhhAHFuzw4Jhb4OC2S9iycxrqmI8TA== dependencies: - "@angular-devkit/core" "14.1.2" - jsonc-parser "3.1.0" - magic-string "0.26.2" + "@angular-devkit/core" "15.2.5" + jsonc-parser "3.2.0" + magic-string "0.29.0" ora "5.4.1" rxjs "6.6.7" -"@angular-devkit/schematics@14.2.1", "@angular-devkit/schematics@~14.2.0": - version "14.2.1" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-14.2.1.tgz#9d66080e60ab32d1b44c854cabc8f5cbb421d877" - integrity sha512-0U18FwDYt4zROBPrvewH6iBTkf2ozVHN4/gxUb9jWrqVw8mPU5AWc/iYxQLHBSinkr2Egjo1H/i9aBqgJSeh3g== +"@angular-devkit/schematics@15.2.8", "@angular-devkit/schematics@^13.0.0 || ^14.0.0 || ^15.0.0": + version "15.2.8" + resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-15.2.8.tgz#c7dfc692e3f54e43085a8845d8c9f390a2519aa3" + integrity sha512-w6EUGC96kVsH9f8sEzajzbONMawezyVBiSo+JYp5r25rQArAz/a+KZntbuETWHQ0rQOEsKmUNKxwmr11BaptSQ== dependencies: - "@angular-devkit/core" "14.2.1" - jsonc-parser "3.1.0" - magic-string "0.26.2" + "@angular-devkit/core" "15.2.8" + jsonc-parser "3.2.0" + magic-string "0.29.0" ora "5.4.1" rxjs "6.6.7" -"@angular-eslint/bundled-angular-compiler@14.0.4": - version "14.0.4" - resolved "https://registry.yarnpkg.com/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-14.0.4.tgz#6ba0d9b8a6be62dcf0351f053d231dffdc9db916" - integrity sha512-/fbXDvkm4q95xG/9LZDtiyE2MQwT061sanmMginDk63f0dlC4H+AXgggva38YNRN+CFcbFtWfikTy7yFdNFZlA== +"@angular-eslint/bundled-angular-compiler@15.2.0": + version "15.2.0" + resolved "https://registry.yarnpkg.com/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-15.2.0.tgz#506f94c96039346f33ba92222062edbf3943543e" + integrity sha512-a0bfXxYyGoWJHrVQ4QER0HdRgselcTtJeyqiFPAxID2ZxF0IBGKLNTtugUTXekEmiLev8yGLX9TqAtthN57fEg== -"@angular-eslint/eslint-plugin-template@14.0.4": - version "14.0.4" - resolved "https://registry.yarnpkg.com/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-14.0.4.tgz#8d937efa9e00c7d3d84f734231209bc10c3c48d5" - integrity sha512-F3GgItYHcEtQfOcJoyfvmRKdFIrI+/Wc7SjOo1X31tdeaQaRHseYWGFZ5AaA+MM+/rV7jPAd671Tv7wlm+Wjtg== +"@angular-eslint/eslint-plugin-template@15.2.0": + version "15.2.0" + resolved "https://registry.yarnpkg.com/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-15.2.0.tgz#a7348bdddcdab51031439b9f9e09ea9bb9236484" + integrity sha512-aL3czf5Jpv29rKN3UG20tQepX1+V0d6xc0g+1l0zPHZJYjVd6Oy0nIxWiGfl4yanaXiVpmxiV4vUcLlqqaFwbw== dependencies: - "@angular-eslint/bundled-angular-compiler" "14.0.4" - "@typescript-eslint/type-utils" "5.36.2" - "@typescript-eslint/utils" "5.36.2" - aria-query "5.0.2" - axobject-query "3.0.1" + "@angular-eslint/bundled-angular-compiler" "15.2.0" + "@angular-eslint/utils" "15.2.0" + "@typescript-eslint/type-utils" "5.48.1" + "@typescript-eslint/utils" "5.48.1" + aria-query "5.1.3" + axobject-query "3.1.1" -"@angular-eslint/eslint-plugin@14.0.4": - version "14.0.4" - resolved "https://registry.yarnpkg.com/@angular-eslint/eslint-plugin/-/eslint-plugin-14.0.4.tgz#0e864b284551cac86386b37d0114cfa62f184c31" - integrity sha512-sPEXAZ/+u0jL849HV1dsc9C15zsiEiOd0Fo5St2YhZuCNsn94kg5zyai5p85/5tbpM6vchaH9cB4fZ3WE+FOog== +"@angular-eslint/eslint-plugin@15.2.0": + version "15.2.0" + resolved "https://registry.yarnpkg.com/@angular-eslint/eslint-plugin/-/eslint-plugin-15.2.0.tgz#37771dfc5278ec8cbb01aa0d38d362ef52e60be4" + integrity sha512-yJGbmSUU0B0MFJ48ktpkqqEK+zv5k9iwlZSqEHtiQMKvDelfluovnEusihel7uPRo1c1iVlbSgXfGpxpUCfocA== dependencies: - "@angular-eslint/utils" "14.0.4" - "@typescript-eslint/utils" "5.36.2" + "@angular-eslint/utils" "15.2.0" + "@typescript-eslint/utils" "5.48.1" -"@angular-eslint/template-parser@14.0.4": - version "14.0.4" - resolved "https://registry.yarnpkg.com/@angular-eslint/template-parser/-/template-parser-14.0.4.tgz#6f19956295d80841318693d72e258b7b2c100f18" - integrity sha512-L7+VHWlIUiUml81q43tP/CZZhIDkbHoin2OH+0TEqeQuCcYZwZQfUBey0pmbzzhjZD2tV75QxlAUqFCuM85Tng== +"@angular-eslint/template-parser@15.2.0": + version "15.2.0" + resolved "https://registry.yarnpkg.com/@angular-eslint/template-parser/-/template-parser-15.2.0.tgz#2b9b794f2f763725cf4d107c0fcb6e07c460ac4e" + integrity sha512-xnnxPfV/G0Ll3B0HGrF1ucsc/DHmNE6UhhmWxYPTERq0McbZGRiATa66hCoOZ/Rdylun4ogBfsRKAG8XxEvlvw== dependencies: - "@angular-eslint/bundled-angular-compiler" "14.0.4" - eslint-scope "^5.1.0" + "@angular-eslint/bundled-angular-compiler" "15.2.0" + eslint-scope "^7.0.0" -"@angular-eslint/utils@14.0.4": - version "14.0.4" - resolved "https://registry.yarnpkg.com/@angular-eslint/utils/-/utils-14.0.4.tgz#b741bda21b36036092c339abca7a2291d98c6322" - integrity sha512-7BcK+g0qaMRXfRFeOf57UOb5R4V8/uzGLyeXkugA65s7BLDLPEV1StRTpGW7w4jK7I8sldfsnbrkJqb6hgQtfA== +"@angular-eslint/utils@15.2.0": + version "15.2.0" + resolved "https://registry.yarnpkg.com/@angular-eslint/utils/-/utils-15.2.0.tgz#3a0ecc9d9d6877fbdaa9d24208071a5cdbbe5945" + integrity sha512-qfTOKQ+aef/YER679/xN1E+FkZKMd0I73P6txUZAb9k2G1ACVktG+wOUIBfgjIlUVq9Q01AV91LGOWcd+rdEEA== dependencies: - "@angular-eslint/bundled-angular-compiler" "14.0.4" - "@typescript-eslint/utils" "5.36.2" + "@angular-eslint/bundled-angular-compiler" "15.2.0" + "@typescript-eslint/utils" "5.48.1" -"@angular/animations@14.2.0": - version "14.2.0" - resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-14.2.0.tgz#9ad9cef59521516ad7ab9d3855f138eab71be354" - integrity sha512-T54F5NvX0XMj6L7hdqYYORFjY6EckOWaK96bF9QqJLKwIRViCEGR5YzaHGhQaAipvUJ+kEwN+bnRBJWOaNbmUw== +"@angular/animations@15.2.5": + version "15.2.5" + resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-15.2.5.tgz#d42e5f185ed3d8044d38b1c938c14044aa0345a8" + integrity sha512-areHbwTrJNEYWe+1xND7SEI8fY7Pi2wckuLtbGonjtoaAc8MPs0ov56TnpXHS7bIXKVszqUlBTBAElQSdtjCyw== dependencies: tslib "^2.3.0" -"@angular/cdk@14.2.0": - version "14.2.0" - resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-14.2.0.tgz#27d0b307b1e9361fff21199001ac19f9b107767c" - integrity sha512-rAeQXUSbOJSKLVizueRKoZmRb0An5qJUMigsF8wJwJjySUIcJ8uSIOMV+G1rxkvxVVY0HRAVi2rIkJbeq3+WKQ== +"@angular/cdk@15.2.6": + version "15.2.6" + resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-15.2.6.tgz#528f5c6c22c3e258fdc4c847ac061f2ae7faedc2" + integrity sha512-c6XFKMFowllHxb4tUt9en3bXBDqXKG2k4O9XGggJ1TL668d3Uhlk9qULywFNVWmNQSamkERmhFKAN4hEO3TPAQ== dependencies: tslib "^2.3.0" optionalDependencies: - parse5 "^5.0.0" + parse5 "^7.1.2" -"@angular/cli@14.2.1": - version "14.2.1" - resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-14.2.1.tgz#1e4faabf537c2686c34487e3fa3b03affbb31a01" - integrity sha512-ab/kpK3wYQvDOdhwfk3cVSiLMyl9lEVrNiwvrTnPLdt3jwqkT5Gm28WFShnOuNCaKea3iHP7LIItoRxeIWQQ9A== +"@angular/cli@15.2.5": + version "15.2.5" + resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-15.2.5.tgz#387354b28f87551dc6ec2a3f65c6d208ee33fc2c" + integrity sha512-TmkkeJkdfDkC6b2SNQcLlr1rsl2anc5rrrY3gawOVXYXBExMxAi2SNJsHZzUXfiitW52aZkAyajF1VFazs8PRw== dependencies: - "@angular-devkit/architect" "0.1402.1" - "@angular-devkit/core" "14.2.1" - "@angular-devkit/schematics" "14.2.1" - "@schematics/angular" "14.2.1" + "@angular-devkit/architect" "0.1502.5" + "@angular-devkit/core" "15.2.5" + "@angular-devkit/schematics" "15.2.5" + "@schematics/angular" "15.2.5" "@yarnpkg/lockfile" "1.1.0" ansi-colors "4.1.3" - debug "4.3.4" - ini "3.0.0" + ini "3.0.1" inquirer "8.2.4" - jsonc-parser "3.1.0" - npm-package-arg "9.1.0" - npm-pick-manifest "7.0.1" - open "8.4.0" + jsonc-parser "3.2.0" + npm-package-arg "10.1.0" + npm-pick-manifest "8.0.1" + open "8.4.1" ora "5.4.1" - pacote "13.6.2" + pacote "15.1.0" resolve "1.22.1" - semver "7.3.7" + semver "7.3.8" symbol-observable "4.0.0" - uuid "8.3.2" - yargs "17.5.1" + yargs "17.6.2" -"@angular/common@14.2.0": - version "14.2.0" - resolved "https://registry.yarnpkg.com/@angular/common/-/common-14.2.0.tgz#ad6b5ed690c3f9a7d247a89badee3a0cba846baa" - integrity sha512-dXCGuM/Yh9B8OVVHHfPuXLYdu0olemKmuYLZXGoqyzeYU5OpQ6+qcHYTrlREkWpF9QY+pk2ewfM9Hke1UENEHA== +"@angular/common@15.2.5": + version "15.2.5" + resolved "https://registry.yarnpkg.com/@angular/common/-/common-15.2.5.tgz#7ae960f17c260a92e939ad82fb115d908094aeda" + integrity sha512-6Wl1ak96NZvnL8p0eVsxHhaddv0/qYq2pQniKaKBfL9MVOQtAe07sPUDEZ6w0ApkmV63Giu4zFakaQMsmvxU0Q== dependencies: tslib "^2.3.0" -"@angular/compiler-cli@14.2.0": - version "14.2.0" - resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-14.2.0.tgz#22b46b560bb4248ed04423f444584bc885d30a27" - integrity sha512-cMjMVmAitY4GIn45pIqzhy4GKWfVAJSktCtuAebaAYC6Nqo9LbvqF2dnHK0MHoqjAf98e5zmz9WeBOQ7YlRZFQ== +"@angular/compiler-cli@15.2.5": + version "15.2.5" + resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-15.2.5.tgz#3c1882cc837a71fd0f93b880bfec6e851ec213e8" + integrity sha512-NNrnvL0JMg6dZMuTgBTb/IVIFJwy2my5XTNLngTNBfDCVu0SL1TKrYnpqp2qRi2ip9XdNqCtNF7JFDEklVbK2A== dependencies: - "@babel/core" "^7.17.2" + "@babel/core" "7.19.3" + "@jridgewell/sourcemap-codec" "^1.4.14" chokidar "^3.0.0" convert-source-map "^1.5.1" dependency-graph "^0.11.0" - magic-string "^0.26.0" + magic-string "^0.27.0" reflect-metadata "^0.1.2" semver "^7.0.0" - sourcemap-codec "^1.4.8" tslib "^2.3.0" yargs "^17.2.1" -"@angular/compiler@14.2.0": - version "14.2.0" - resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-14.2.0.tgz#1ec35457730a4124b28f2105af1b1ab84c36cc1c" - integrity sha512-csnvopy5a6ctdT7sHgwgn3wRni+UIk2zvs7WYsx+gtLTdH7SPg78CN0XZR/KQ142qLtuMnmkVON3D3ejmqC9xg== +"@angular/compiler@15.2.5": + version "15.2.5" + resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-15.2.5.tgz#4902db0699fd9ff8af15a3cd0d8be9aacef09b7f" + integrity sha512-0mAFF6Ud4ojsb8qGLQCWYh/LgKKrnn1Fz788LzfYcLYhi7UZPiCFrQJrEcCXBKtQsk8sG335CA9Qk0I/qc35zg== dependencies: tslib "^2.3.0" @@ -304,10 +303,10 @@ resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-9.0.0.tgz#87e0bef4c369b6cadae07e3a4295778fc93799d5" integrity sha512-ctjwuntPfZZT2mNj2NDIVu51t9cvbhl/16epc5xEwyzyDt76pX9UgwvY+MbXrf/C/FWwdtmNtfP698BKI+9leQ== -"@angular/core@14.2.0": - version "14.2.0" - resolved "https://registry.yarnpkg.com/@angular/core/-/core-14.2.0.tgz#51c6b95b423167998aee6d6b942e4155ffe9058e" - integrity sha512-m00WZL+df90QjrNmA43W8oSP1hyePoEXgw36JcFLQ+2ISO1HvqoeuKXIccyIQKpCuQ9VLNv5ptlTio6pjmcCqg== +"@angular/core@15.2.5": + version "15.2.5" + resolved "https://registry.yarnpkg.com/@angular/core/-/core-15.2.5.tgz#761d339551a3daf97d9b9786882a5dd42ee19445" + integrity sha512-GtmjJmwtzCuF4FDXIY+9UFMAcfPlJzJDBDF7mgEmD2YKf/HV5PSyU91lfv9yDPnAkdzlDAL9u4YxnGgoURY8/g== dependencies: tslib "^2.3.0" @@ -316,52 +315,115 @@ resolved "https://registry.yarnpkg.com/@angular/core/-/core-9.0.0.tgz#227dc53e1ac81824f998c6e76000b7efc522641e" integrity sha512-6Pxgsrf0qF9iFFqmIcWmjJGkkCaCm6V5QNnxMy2KloO3SDq6QuMVRbN9RtC8Urmo25LP+eZ6ZgYqFYpdD8Hd9w== -"@angular/forms@14.2.0": - version "14.2.0" - resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-14.2.0.tgz#7c9ec76d85df7d35623ff8db4634a2fa35547a68" - integrity sha512-KVAd4ITEUnP/MLNTDbTWEMoYIZgKawvoaNu4nBP0DAcZsADmB5a6IPYcg6GrgJ+teN0SnpiCxKvq1hRITj3d7g== +"@angular/forms@15.2.5": + version "15.2.5" + resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-15.2.5.tgz#e40cf0bc27eae6e7ae1409ff618a3fe7cea19cfc" + integrity sha512-F4YLh0S1VyWp4IyfORTpzkZJcg7nB4q/wIirVZocR9sK3FJMEKYcAGwLbkWDYGZ66UCDw7EEqCTXkjr99/6sPg== dependencies: tslib "^2.3.0" -"@angular/language-service@14.2.0": - version "14.2.0" - resolved "https://registry.yarnpkg.com/@angular/language-service/-/language-service-14.2.0.tgz#bbbdadd10a6e662c5b2221e293ac59481de9d5a3" - integrity sha512-8CdmymRVMEkMa1VhQc7gfUWFMzKEIuLEreGlhMewQoL8y6bB2dYHVfnju/dAA4PooVLZcVuZDeHy+CGzK9snmA== +"@angular/language-service@15.2.5": + version "15.2.5" + resolved "https://registry.yarnpkg.com/@angular/language-service/-/language-service-15.2.5.tgz#fff42544e1dad609293a33ae93371a11e2df0c44" + integrity sha512-knXe4D0gc2KiU3Y3LZCRvcIkddxUMHI6/44/QAGZD3UDx6ZnpizS0eb8q8AO1pWiBTUY5ETUAlihaGWqDgQ+Wg== -"@angular/localize@14.2.0": - version "14.2.0" - resolved "https://registry.yarnpkg.com/@angular/localize/-/localize-14.2.0.tgz#3c03358c7aa3490bcb71525c51021d7116988dde" - integrity sha512-sV+4itOllkgYkHMMtfYGsOvO+nuFMBlk6RKFVqWZcFO+XgOC4E9bXhRbkpGZ0JcIr42tlB63krjopnYfN9u+7A== +"@angular/localize@15.2.5": + version "15.2.5" + resolved "https://registry.yarnpkg.com/@angular/localize/-/localize-15.2.5.tgz#efcbb631b43992e816232d02f97d81a0e52c87f3" + integrity sha512-EbKZvWKvgjMGnCJ2o73bKweoPuYLWMrx8RTNecL7VN0h/PAGabtiRXqY+T9TCi0RVDutl7vfKEYhizF35rk2tw== dependencies: - "@babel/core" "7.18.9" - glob "8.0.3" + "@babel/core" "7.19.3" + glob "8.1.0" yargs "^17.2.1" -"@angular/material@14.2.0": - version "14.2.0" - resolved "https://registry.yarnpkg.com/@angular/material/-/material-14.2.0.tgz#915a39bd7c6434ac2465964abb93cecd6034e5d7" - integrity sha512-Lh7Ccc6zi5ClFnr5w1ZFVHb5QnOye1si0xWvS5nMQG3e0OPFAt0oOhjILFIBMK7n2jq4kv6erqNX2fLkyRvTQw== +"@angular/material@15.2.6": + version "15.2.6" + resolved "https://registry.yarnpkg.com/@angular/material/-/material-15.2.6.tgz#ac094216961a22058db7af898489808f02093038" + integrity sha512-r5feEcgs+xufI+GaO01XCehpnJVNB8sMS4l8DRV72DzgEIXhqYoLSWnQy7gYOKRXCUT66r1BxDmPG5fGa7jNzg== + dependencies: + "@material/animation" "15.0.0-canary.684e33d25.0" + "@material/auto-init" "15.0.0-canary.684e33d25.0" + "@material/banner" "15.0.0-canary.684e33d25.0" + "@material/base" "15.0.0-canary.684e33d25.0" + "@material/button" "15.0.0-canary.684e33d25.0" + "@material/card" "15.0.0-canary.684e33d25.0" + "@material/checkbox" "15.0.0-canary.684e33d25.0" + "@material/chips" "15.0.0-canary.684e33d25.0" + "@material/circular-progress" "15.0.0-canary.684e33d25.0" + "@material/data-table" "15.0.0-canary.684e33d25.0" + "@material/density" "15.0.0-canary.684e33d25.0" + "@material/dialog" "15.0.0-canary.684e33d25.0" + "@material/dom" "15.0.0-canary.684e33d25.0" + "@material/drawer" "15.0.0-canary.684e33d25.0" + "@material/elevation" "15.0.0-canary.684e33d25.0" + "@material/fab" "15.0.0-canary.684e33d25.0" + "@material/feature-targeting" "15.0.0-canary.684e33d25.0" + "@material/floating-label" "15.0.0-canary.684e33d25.0" + "@material/form-field" "15.0.0-canary.684e33d25.0" + "@material/icon-button" "15.0.0-canary.684e33d25.0" + "@material/image-list" "15.0.0-canary.684e33d25.0" + "@material/layout-grid" "15.0.0-canary.684e33d25.0" + "@material/line-ripple" "15.0.0-canary.684e33d25.0" + "@material/linear-progress" "15.0.0-canary.684e33d25.0" + "@material/list" "15.0.0-canary.684e33d25.0" + "@material/menu" "15.0.0-canary.684e33d25.0" + "@material/menu-surface" "15.0.0-canary.684e33d25.0" + "@material/notched-outline" "15.0.0-canary.684e33d25.0" + "@material/radio" "15.0.0-canary.684e33d25.0" + "@material/ripple" "15.0.0-canary.684e33d25.0" + "@material/rtl" "15.0.0-canary.684e33d25.0" + "@material/segmented-button" "15.0.0-canary.684e33d25.0" + "@material/select" "15.0.0-canary.684e33d25.0" + "@material/shape" "15.0.0-canary.684e33d25.0" + "@material/slider" "15.0.0-canary.684e33d25.0" + "@material/snackbar" "15.0.0-canary.684e33d25.0" + "@material/switch" "15.0.0-canary.684e33d25.0" + "@material/tab" "15.0.0-canary.684e33d25.0" + "@material/tab-bar" "15.0.0-canary.684e33d25.0" + "@material/tab-indicator" "15.0.0-canary.684e33d25.0" + "@material/tab-scroller" "15.0.0-canary.684e33d25.0" + "@material/textfield" "15.0.0-canary.684e33d25.0" + "@material/theme" "15.0.0-canary.684e33d25.0" + "@material/tooltip" "15.0.0-canary.684e33d25.0" + "@material/top-app-bar" "15.0.0-canary.684e33d25.0" + "@material/touch-target" "15.0.0-canary.684e33d25.0" + "@material/typography" "15.0.0-canary.684e33d25.0" + tslib "^2.3.0" + +"@angular/platform-browser-dynamic@15.2.5": + version "15.2.5" + resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-15.2.5.tgz#f715dafd227606142295fd717a7c3fb0b67ae79f" + integrity sha512-NoGVeaR7K+RMcLpS2gI4hyMVeUqP057rw8Yfk15dHy3cM8icj5zVfyez3AADcO1XthNhE1sI1d+2LD4/GxwIKQ== dependencies: tslib "^2.3.0" -"@angular/platform-browser-dynamic@14.2.0": - version "14.2.0" - resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-14.2.0.tgz#7d6c44c63628b760eef4fdf99d09fc28f62e92b5" - integrity sha512-CRSWbJiohfz4KBU4ts2kq2B2lATApMeG6uuxgXwNJAEUkn63EYbrFVY9JTaApyZ7X+3dUDZZtcsfNmQruK2UxQ== +"@angular/platform-browser@15.2.5": + version "15.2.5" + resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-15.2.5.tgz#b5e1a4da920577d147f162463b2448588543a172" + integrity sha512-D19HL3UsvPX4s8yC4C4gphTNyQU75VuzcyGZ+6y1o1SQbVjF6UwSrztmb//4MCkpclb+avv669z5AEiTuBTnVQ== dependencies: tslib "^2.3.0" -"@angular/platform-browser@14.2.0": - version "14.2.0" - resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-14.2.0.tgz#9e87d01c388146c085f7fc2dd99aefd2b2284f5c" - integrity sha512-zYWB9FtZQZEhPV2PuzaoXWChWS+7o4SP+0sF8hLddGNOezf1FsKKrqDhyYtQYgZ2qQPsS+uDFfkVry5dppALUQ== +"@angular/pwa@15.2.5": + version "15.2.5" + resolved "https://registry.yarnpkg.com/@angular/pwa/-/pwa-15.2.5.tgz#68c756bfa01714dfc1dfad7a81eaf984c2705186" + integrity sha512-H2yNYr1husCeryavRGoQtUwreRKDZOda9+yXTp5qZSGwIbsfKLZHShQc4Mft+/x2q/QtBJMfXLw1Nm0pAbHnRw== + dependencies: + "@angular-devkit/schematics" "15.2.5" + "@schematics/angular" "15.2.5" + parse5-html-rewriting-stream "7.0.0" + +"@angular/router@15.2.5": + version "15.2.5" + resolved "https://registry.yarnpkg.com/@angular/router/-/router-15.2.5.tgz#879839960d9a3d52a20cdffc51062e5d288c3440" + integrity sha512-NSEfx2wgPCS8EdXLbKUjNCXC29cMqEGDUrSv8+P/O+tY21Szkqp6uzGTOZJuSTOoKQmDEw9CRmuwxMKm2l6y/Q== dependencies: tslib "^2.3.0" -"@angular/router@14.2.0": - version "14.2.0" - resolved "https://registry.yarnpkg.com/@angular/router/-/router-14.2.0.tgz#b73ea638847828fe33cf3ce57841b312de15b686" - integrity sha512-SvtmSlRCIWeLhbXYh09W7luPKTtpZL16PB4DbT3VVfZlt2PfMys/tAmOCvChNxjkOgV7yEGaqklWw/1wKxeRlg== +"@angular/service-worker@15.2.5": + version "15.2.5" + resolved "https://registry.yarnpkg.com/@angular/service-worker/-/service-worker-15.2.5.tgz#7c1975cac6c979f943616ae490955cf0585bd0a8" + integrity sha512-KFpfU9PaWUICPoJfADuC3xUsycBKhR9b/lGodkdqAv0fmekxDXUIJxnMNzrwMmBeOJugXs2mV5aPAFWeqIjvDQ== dependencies: tslib "^2.3.0" @@ -370,170 +432,105 @@ resolved "https://registry.yarnpkg.com/@assemblyscript/loader/-/loader-0.10.1.tgz#70e45678f06c72fa2e350e8553ec4a4d72b92e06" integrity sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg== -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.5.5", "@babel/code-frame@^7.8.3": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" - integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== +"@aw-web-design/x-default-browser@1.4.88": + version "1.4.88" + resolved "https://registry.yarnpkg.com/@aw-web-design/x-default-browser/-/x-default-browser-1.4.88.tgz#33d869cb2a537cd6d2a8369d4dc8ea4988d4be89" + integrity sha512-AkEmF0wcwYC2QkhK703Y83fxWARttIWXDmQN8+cof8FmFZ5BRhnNXGymeb1S73bOCLfWjYELxtujL56idCN/XA== dependencies: - "@babel/highlight" "^7.16.7" + default-browser-id "3.0.0" -"@babel/code-frame@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" - integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.21.4": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39" + integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== dependencies: "@babel/highlight" "^7.18.6" -"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.17.10": - version "7.18.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.18.5.tgz#acac0c839e317038c73137fbb6ef71a1d6238471" - integrity sha512-BxhE40PVCBxVEJsSBhB6UWyAuqJRxGsAw8BdHMJ3AKGydcwuWW4kOO3HmqBQAdcq/OP+/DlTVxLvsCzRTnZuGg== - -"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.18.8": - version "7.18.8" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.18.8.tgz#2483f565faca607b8535590e84e7de323f27764d" - integrity sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ== - -"@babel/core@7.12.9": - version "7.12.9" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.9.tgz#fd450c4ec10cdbb980e2928b7aa7a28484593fc8" - integrity sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.12.5" - "@babel/helper-module-transforms" "^7.12.1" - "@babel/helpers" "^7.12.5" - "@babel/parser" "^7.12.7" - "@babel/template" "^7.12.7" - "@babel/traverse" "^7.12.9" - "@babel/types" "^7.12.7" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.1" - json5 "^2.1.2" - lodash "^4.17.19" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" +"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.1", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.21.5": + version "7.21.7" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.7.tgz#61caffb60776e49a57ba61a88f02bedd8714f6bc" + integrity sha512-KYMqFYTaenzMK4yUtf4EW9wc4N9ef80FsbMtkwool5zpwl4YrT1SdWYSTRcT94KO4hannogdS+LxY7L+arP3gA== -"@babel/core@7.18.10": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.10.tgz#39ad504991d77f1f3da91be0b8b949a5bc466fb8" - integrity sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw== +"@babel/core@7.19.3": + version "7.19.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.19.3.tgz#2519f62a51458f43b682d61583c3810e7dcee64c" + integrity sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ== dependencies: "@ampproject/remapping" "^2.1.0" "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.18.10" - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-module-transforms" "^7.18.9" - "@babel/helpers" "^7.18.9" - "@babel/parser" "^7.18.10" + "@babel/generator" "^7.19.3" + "@babel/helper-compilation-targets" "^7.19.3" + "@babel/helper-module-transforms" "^7.19.0" + "@babel/helpers" "^7.19.0" + "@babel/parser" "^7.19.3" "@babel/template" "^7.18.10" - "@babel/traverse" "^7.18.10" - "@babel/types" "^7.18.10" + "@babel/traverse" "^7.19.3" + "@babel/types" "^7.19.3" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.1" semver "^6.3.0" -"@babel/core@7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.9.tgz#805461f967c77ff46c74ca0460ccf4fe933ddd59" - integrity sha512-1LIb1eL8APMy91/IMW+31ckrfBM4yCoLaVzoDhZUKSM4cu1L1nIidyxkCgzPAgrC5WEz36IPEr/eSeSF9pIn+g== +"@babel/core@7.20.12": + version "7.20.12" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.12.tgz#7930db57443c6714ad216953d1356dac0eb8496d" + integrity sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg== dependencies: "@ampproject/remapping" "^2.1.0" "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.18.9" - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-module-transforms" "^7.18.9" - "@babel/helpers" "^7.18.9" - "@babel/parser" "^7.18.9" - "@babel/template" "^7.18.6" - "@babel/traverse" "^7.18.9" - "@babel/types" "^7.18.9" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.1" - semver "^6.3.0" - -"@babel/core@^7.0.1", "@babel/core@^7.1.0", "@babel/core@^7.12.10", "@babel/core@^7.12.3", "@babel/core@^7.17.2", "@babel/core@^7.2.2": - version "7.18.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.5.tgz#c597fa680e58d571c28dda9827669c78cdd7f000" - integrity sha512-MGY8vg3DxMnctw0LdvSEojOsumc70g0t18gNyUdAZqB1Rpd1Bqo/svHGvt+UJ6JcGX+DIekGFDxxIWofBxLCnQ== - dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.18.2" - "@babel/helper-compilation-targets" "^7.18.2" - "@babel/helper-module-transforms" "^7.18.0" - "@babel/helpers" "^7.18.2" - "@babel/parser" "^7.18.5" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.18.5" - "@babel/types" "^7.18.4" + "@babel/generator" "^7.20.7" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helpers" "^7.20.7" + "@babel/parser" "^7.20.7" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.12" + "@babel/types" "^7.20.7" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" - json5 "^2.2.1" + json5 "^2.2.2" semver "^6.3.0" -"@babel/core@^7.11.6": - version "7.18.13" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.13.tgz#9be8c44512751b05094a4d3ab05fc53a47ce00ac" - integrity sha512-ZisbOvRRusFktksHSG6pjj1CSvkPkcZq/KHD45LAkVP/oiHJkNBZWfpvlLmX8OtHDG8IuzsFlVRWo08w7Qxn0A== - dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.18.13" - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-module-transforms" "^7.18.9" - "@babel/helpers" "^7.18.9" - "@babel/parser" "^7.18.13" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.18.13" - "@babel/types" "^7.18.13" +"@babel/core@^7.11.6", "@babel/core@^7.12.10", "@babel/core@^7.12.3", "@babel/core@^7.13.16", "@babel/core@^7.15.0", "@babel/core@^7.2.2", "@babel/core@^7.20.2", "@babel/core@~7.21.0": + version "7.21.8" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.8.tgz#2a8c7f0f53d60100ba4c32470ba0281c92aa9aa4" + integrity sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.21.4" + "@babel/generator" "^7.21.5" + "@babel/helper-compilation-targets" "^7.21.5" + "@babel/helper-module-transforms" "^7.21.5" + "@babel/helpers" "^7.21.5" + "@babel/parser" "^7.21.8" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.5" + "@babel/types" "^7.21.5" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" - json5 "^2.2.1" + json5 "^2.2.2" semver "^6.3.0" -"@babel/generator@7.18.12": - version "7.18.12" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.12.tgz#fa58daa303757bd6f5e4bbca91b342040463d9f4" - integrity sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg== - dependencies: - "@babel/types" "^7.18.10" - "@jridgewell/gen-mapping" "^0.3.2" - jsesc "^2.5.1" - -"@babel/generator@^7.12.11", "@babel/generator@^7.12.5", "@babel/generator@^7.18.2", "@babel/generator@^7.7.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.2.tgz#33873d6f89b21efe2da63fe554460f3df1c5880d" - integrity sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw== - dependencies: - "@babel/types" "^7.18.2" - "@jridgewell/gen-mapping" "^0.3.0" - jsesc "^2.5.1" - -"@babel/generator@^7.18.10", "@babel/generator@^7.18.13": - version "7.18.13" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.13.tgz#59550cbb9ae79b8def15587bdfbaa388c4abf212" - integrity sha512-CkPg8ySSPuHTYPJYo7IRALdqyjM9HCbt/3uOBEFbzyGVP6Mn8bwFPB0jX6982JVNBlYzM1nnPkfjuXSOPtQeEQ== +"@babel/generator@7.20.14": + version "7.20.14" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.14.tgz#9fa772c9f86a46c6ac9b321039400712b96f64ce" + integrity sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg== dependencies: - "@babel/types" "^7.18.13" + "@babel/types" "^7.20.7" "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" -"@babel/generator@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.9.tgz#68337e9ea8044d6ddc690fb29acae39359cca0a5" - integrity sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug== +"@babel/generator@^7.19.3", "@babel/generator@^7.20.7", "@babel/generator@^7.21.5", "@babel/generator@^7.7.2", "@babel/generator@~7.21.1": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.5.tgz#c0c0e5449504c7b7de8236d99338c3e2a340745f" + integrity sha512-SrKK/sRv8GesIW1bDagf9cCG38IOMYZusoe1dfg0D8aiUe3Amvoj1QtjTPAWcfrZFvIwlleLb0gxzQidL9w14w== dependencies: - "@babel/types" "^7.18.9" + "@babel/types" "^7.21.5" "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" "@babel/helper-annotate-as-pure@7.18.6", "@babel/helper-annotate-as-pure@^7.18.6": @@ -543,123 +540,52 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-annotate-as-pure@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862" - integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz#38d138561ea207f0f69eb1626a418e4f7e6a580b" - integrity sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA== - dependencies: - "@babel/helper-explode-assignable-expression" "^7.16.7" - "@babel/types" "^7.16.7" - "@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz#acd4edfd7a566d1d51ea975dff38fd52906981bb" - integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw== - dependencies: - "@babel/helper-explode-assignable-expression" "^7.18.6" - "@babel/types" "^7.18.9" - -"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7", "@babel/helper-compilation-targets@^7.17.10", "@babel/helper-compilation-targets@^7.18.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz#67a85a10cbd5fc7f1457fec2e7f45441dc6c754b" - integrity sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ== + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.21.5.tgz#817f73b6c59726ab39f6ba18c234268a519e5abb" + integrity sha512-uNrjKztPLkUk7bpCNC0jEKDJzzkvel/W+HguzbN8krA+LPfC1CEobJEvAvGka2A/M+ViOqXdcRL0GqPUJSjx9g== dependencies: - "@babel/compat-data" "^7.17.10" - "@babel/helper-validator-option" "^7.16.7" - browserslist "^4.20.2" - semver "^6.3.0" + "@babel/types" "^7.21.5" -"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz#69e64f57b524cde3e5ff6cc5a9f4a387ee5563bf" - integrity sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg== +"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.19.3", "@babel/helper-compilation-targets@^7.20.0", "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz#631e6cc784c7b660417421349aac304c94115366" + integrity sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w== dependencies: - "@babel/compat-data" "^7.18.8" - "@babel/helper-validator-option" "^7.18.6" - browserslist "^4.20.2" + "@babel/compat-data" "^7.21.5" + "@babel/helper-validator-option" "^7.21.0" + browserslist "^4.21.3" + lru-cache "^5.1.1" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.17.12", "@babel/helper-create-class-features-plugin@^7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.0.tgz#fac430912606331cb075ea8d82f9a4c145a4da19" - integrity sha512-Kh8zTGR9de3J63e5nS0rQUdRs/kbtwoeQQ0sriS0lItjC96u8XXZN6lKpuyWd2coKSU13py/y+LTmThLuVX0Pg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.17.9" - "@babel/helper-member-expression-to-functions" "^7.17.7" - "@babel/helper-optimise-call-expression" "^7.16.7" - "@babel/helper-replace-supers" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - -"@babel/helper-create-class-features-plugin@^7.18.6": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.9.tgz#d802ee16a64a9e824fcbf0a2ffc92f19d58550ce" - integrity sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw== +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0": + version "7.21.8" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.8.tgz#205b26330258625ef8869672ebca1e0dee5a0f02" + integrity sha512-+THiN8MqiH2AczyuZrnrKL6cAxFRRQDKW9h1YkBvbgKmAm6mwiacig1qT73DHIWMGo40GRnsEfN3LA+E6NtmSw== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" - "@babel/helper-member-expression-to-functions" "^7.18.9" + "@babel/helper-environment-visitor" "^7.21.5" + "@babel/helper-function-name" "^7.21.0" + "@babel/helper-member-expression-to-functions" "^7.21.5" "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.18.9" + "@babel/helper-replace-supers" "^7.21.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@babel/helper-split-export-declaration" "^7.18.6" + semver "^6.3.0" -"@babel/helper-create-regexp-features-plugin@^7.16.7", "@babel/helper-create-regexp-features-plugin@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.12.tgz#bb37ca467f9694bbe55b884ae7a5cc1e0084e4fd" - integrity sha512-b2aZrV4zvutr9AIa6/gA3wsZKRwTKYoDxYiFKcESS3Ug2GTXzwBEvMuuFLhCQpEnRXs1zng4ISAXSUxxKBIcxw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - regexpu-core "^5.0.1" - -"@babel/helper-create-regexp-features-plugin@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz#3e35f4e04acbbf25f1b3534a657610a000543d3c" - integrity sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A== +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": + version "7.21.8" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.8.tgz#a7886f61c2e29e21fd4aaeaf1e473deba6b571dc" + integrity sha512-zGuSdedkFtsFHGbexAvNuipg1hbtitDLo2XE8/uf6Y9sOQV1xsYX/2pNbtedp/X0eU1pIt+kGvaqHCowkRbS5g== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" - regexpu-core "^5.1.0" - -"@babel/helper-define-polyfill-provider@^0.1.5": - version "0.1.5" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.1.5.tgz#3c2f91b7971b9fc11fe779c945c014065dea340e" - integrity sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg== - dependencies: - "@babel/helper-compilation-targets" "^7.13.0" - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/traverse" "^7.13.0" - debug "^4.1.1" - lodash.debounce "^4.0.8" - resolve "^1.14.2" - semver "^6.1.2" - -"@babel/helper-define-polyfill-provider@^0.3.1": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz#52411b445bdb2e676869e5a74960d2d3826d2665" - integrity sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA== - dependencies: - "@babel/helper-compilation-targets" "^7.13.0" - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/traverse" "^7.13.0" - debug "^4.1.1" - lodash.debounce "^4.0.8" - resolve "^1.14.2" - semver "^6.1.2" + regexpu-core "^5.3.1" + semver "^6.3.0" -"@babel/helper-define-polyfill-provider@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.2.tgz#bd10d0aca18e8ce012755395b05a79f45eca5073" - integrity sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg== +"@babel/helper-define-polyfill-provider@^0.3.3": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz#8612e55be5d51f0cd1f36b4a5a83924e89884b7a" + integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww== dependencies: "@babel/helper-compilation-targets" "^7.17.7" "@babel/helper-plugin-utils" "^7.16.7" @@ -668,52 +594,18 @@ resolve "^1.14.2" semver "^6.1.2" -"@babel/helper-environment-visitor@^7.16.7", "@babel/helper-environment-visitor@^7.18.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz#8a6d2dedb53f6bf248e31b4baf38739ee4a637bd" - integrity sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ== - -"@babel/helper-environment-visitor@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" - integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== - -"@babel/helper-explode-assignable-expression@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz#12a6d8522fdd834f194e868af6354e8650242b7a" - integrity sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-explode-assignable-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" - integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-function-name@^7.16.7", "@babel/helper-function-name@^7.17.9": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz#136fcd54bc1da82fcb47565cf16fd8e444b1ff12" - integrity sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg== - dependencies: - "@babel/template" "^7.16.7" - "@babel/types" "^7.17.0" - -"@babel/helper-function-name@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz#940e6084a55dee867d33b4e487da2676365e86b0" - integrity sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A== - dependencies: - "@babel/template" "^7.18.6" - "@babel/types" "^7.18.9" +"@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz#c769afefd41d171836f7cb63e295bedf689d48ba" + integrity sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ== -"@babel/helper-hoist-variables@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" - integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== +"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0", "@babel/helper-function-name@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" + integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== dependencies: - "@babel/types" "^7.16.7" + "@babel/template" "^7.20.7" + "@babel/types" "^7.21.0" "@babel/helper-hoist-variables@^7.18.6": version "7.18.6" @@ -722,68 +614,33 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-member-expression-to-functions@^7.17.7": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz#a34013b57d8542a8c4ff8ba3f747c02452a4d8c4" - integrity sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw== - dependencies: - "@babel/types" "^7.17.0" - -"@babel/helper-member-expression-to-functions@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz#1531661e8375af843ad37ac692c132841e2fd815" - integrity sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg== - dependencies: - "@babel/types" "^7.18.9" - -"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" - integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== +"@babel/helper-member-expression-to-functions@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.5.tgz#3b1a009af932e586af77c1030fba9ee0bde396c0" + integrity sha512-nIcGfgwpH2u4n9GG1HpStW5Ogx7x7ekiFHbjjFRKXbn5zUvqO9ZgotCO4x1aNbKn/x/xOUaXEhyNHCwtFCpxWg== dependencies: - "@babel/types" "^7.16.7" + "@babel/types" "^7.21.5" -"@babel/helper-module-imports@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" - integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== +"@babel/helper-module-imports@^7.18.6", "@babel/helper-module-imports@^7.21.4": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz#ac88b2f76093637489e718a90cec6cf8a9b029af" + integrity sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg== dependencies: - "@babel/types" "^7.18.6" + "@babel/types" "^7.21.4" -"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz#baf05dec7a5875fb9235bd34ca18bad4e21221cd" - integrity sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA== - dependencies: - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-simple-access" "^7.17.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/helper-validator-identifier" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.18.0" - "@babel/types" "^7.18.0" - -"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz#5a1079c005135ed627442df31a42887e80fcb712" - integrity sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g== +"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.19.0", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz#d937c82e9af68d31ab49039136a222b17ac0b420" + integrity sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw== dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.18.6" + "@babel/helper-environment-visitor" "^7.21.5" + "@babel/helper-module-imports" "^7.21.4" + "@babel/helper-simple-access" "^7.21.5" "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.18.6" - "@babel/template" "^7.18.6" - "@babel/traverse" "^7.18.9" - "@babel/types" "^7.18.9" - -"@babel/helper-optimise-call-expression@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz#a34e3560605abbd31a18546bd2aad3e6d9a174f2" - integrity sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w== - dependencies: - "@babel/types" "^7.16.7" + "@babel/helper-validator-identifier" "^7.19.1" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.5" + "@babel/types" "^7.21.5" "@babel/helper-optimise-call-expression@^7.18.6": version "7.18.6" @@ -792,31 +649,12 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-plugin-utils@7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" - integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.17.12", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz#86c2347da5acbf5583ba0a10aed4c9bf9da9cf96" - integrity sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA== - -"@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz#4b8aea3b069d8cb8a72cdfe28ddf5ceca695ef2f" - integrity sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w== - -"@babel/helper-remap-async-to-generator@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz#29ffaade68a367e2ed09c90901986918d25e57e3" - integrity sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-wrap-function" "^7.16.8" - "@babel/types" "^7.16.8" +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.21.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz#345f2377d05a720a4e5ecfa39cbf4474a4daed56" + integrity sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg== -"@babel/helper-remap-async-to-generator@^7.18.6", "@babel/helper-remap-async-to-generator@^7.18.9": +"@babel/helper-remap-async-to-generator@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== @@ -826,141 +664,72 @@ "@babel/helper-wrap-function" "^7.18.9" "@babel/types" "^7.18.9" -"@babel/helper-replace-supers@^7.16.7", "@babel/helper-replace-supers@^7.18.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.18.2.tgz#41fdfcc9abaf900e18ba6e5931816d9062a7b2e0" - integrity sha512-XzAIyxx+vFnrOxiQrToSUOzUOn0e1J2Li40ntddek1Y69AXUTXoDJ40/D5RdjFu7s7qHiaeoTiempZcbuVXh2Q== - dependencies: - "@babel/helper-environment-visitor" "^7.18.2" - "@babel/helper-member-expression-to-functions" "^7.17.7" - "@babel/helper-optimise-call-expression" "^7.16.7" - "@babel/traverse" "^7.18.2" - "@babel/types" "^7.18.2" - -"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.18.9.tgz#1092e002feca980fbbb0bd4d51b74a65c6a500e6" - integrity sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ== +"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7", "@babel/helper-replace-supers@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.21.5.tgz#a6ad005ba1c7d9bc2973dfde05a1bba7065dde3c" + integrity sha512-/y7vBgsr9Idu4M6MprbOVUfH3vs7tsIfnVWv/Ml2xgwvyH6LTngdfbf5AdsKwkJy4zgy1X/kuNrEKvhhK28Yrg== dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-member-expression-to-functions" "^7.18.9" + "@babel/helper-environment-visitor" "^7.21.5" + "@babel/helper-member-expression-to-functions" "^7.21.5" "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/traverse" "^7.18.9" - "@babel/types" "^7.18.9" - -"@babel/helper-simple-access@^7.17.7", "@babel/helper-simple-access@^7.18.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz#4dc473c2169ac3a1c9f4a51cfcd091d1c36fcff9" - integrity sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ== - dependencies: - "@babel/types" "^7.18.2" - -"@babel/helper-simple-access@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz#d6d8f51f4ac2978068df934b569f08f29788c7ea" - integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" - integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== - dependencies: - "@babel/types" "^7.16.0" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.5" + "@babel/types" "^7.21.5" -"@babel/helper-skip-transparent-expression-wrappers@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz#778d87b3a758d90b471e7b9918f34a9a02eb5818" - integrity sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw== +"@babel/helper-simple-access@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz#d697a7971a5c39eac32c7e63c0921c06c8a249ee" + integrity sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg== dependencies: - "@babel/types" "^7.18.9" + "@babel/types" "^7.21.5" -"@babel/helper-split-export-declaration@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" - integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== +"@babel/helper-skip-transparent-expression-wrappers@^7.20.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" + integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== dependencies: - "@babel/types" "^7.16.7" + "@babel/types" "^7.20.0" -"@babel/helper-split-export-declaration@^7.18.6": +"@babel/helper-split-export-declaration@7.18.6", "@babel/helper-split-export-declaration@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== dependencies: "@babel/types" "^7.18.6" -"@babel/helper-string-parser@^7.18.10": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz#181f22d28ebe1b3857fa575f5c290b1aaf659b56" - integrity sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw== - -"@babel/helper-validator-identifier@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" - integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== - -"@babel/helper-validator-identifier@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076" - integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== - -"@babel/helper-validator-option@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" - integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== +"@babel/helper-string-parser@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz#2b3eea65443c6bdc31c22d037c65f6d323b6b2bd" + integrity sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w== -"@babel/helper-validator-option@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" - integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== +"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== -"@babel/helper-wrap-function@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz#58afda087c4cd235de92f7ceedebca2c41274200" - integrity sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw== - dependencies: - "@babel/helper-function-name" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.16.8" - "@babel/types" "^7.16.8" +"@babel/helper-validator-option@^7.18.6", "@babel/helper-validator-option@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" + integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== "@babel/helper-wrap-function@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.18.9.tgz#ae1feddc6ebbaa2fd79346b77821c3bd73a39646" - integrity sha512-cG2ru3TRAL6a60tfQflpEfs4ldiPwF6YW3zfJiRgmoFVIaC1vGnBBgatfec+ZUziPHkHSaXAuEck3Cdkf3eRpQ== + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz#75e2d84d499a0ab3b31c33bcfe59d6b8a45f62e3" + integrity sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q== dependencies: - "@babel/helper-function-name" "^7.18.9" - "@babel/template" "^7.18.6" - "@babel/traverse" "^7.18.9" - "@babel/types" "^7.18.9" - -"@babel/helpers@^7.12.5", "@babel/helpers@^7.18.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.2.tgz#970d74f0deadc3f5a938bfa250738eb4ac889384" - integrity sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg== - dependencies: - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.18.2" - "@babel/types" "^7.18.2" - -"@babel/helpers@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.9.tgz#4bef3b893f253a1eced04516824ede94dcfe7ff9" - integrity sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ== - dependencies: - "@babel/template" "^7.18.6" - "@babel/traverse" "^7.18.9" - "@babel/types" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.20.5" + "@babel/types" "^7.20.5" -"@babel/highlight@^7.16.7": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.17.12.tgz#257de56ee5afbd20451ac0a75686b6b404257351" - integrity sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg== +"@babel/helpers@^7.19.0", "@babel/helpers@^7.20.7", "@babel/helpers@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.21.5.tgz#5bac66e084d7a4d2d9696bdf0175a93f7fb63c08" + integrity sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA== dependencies: - "@babel/helper-validator-identifier" "^7.16.7" - chalk "^2.0.0" - js-tokens "^4.0.0" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.5" + "@babel/types" "^7.21.5" "@babel/highlight@^7.18.6": version "7.18.6" @@ -971,27 +740,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.0.0-beta.54", "@babel/parser@^7.1.0", "@babel/parser@^7.12.11", "@babel/parser@^7.12.7", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.18.5": - version "7.18.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.5.tgz#337062363436a893a2d22faa60be5bb37091c83c" - integrity sha512-YZWVaglMiplo7v8f1oMQ5ZPQr0vn7HPeZXxXWsxXJRjGVrzUFn9OxFQl1sb5wzfootjA/yChhW84BV+383FSOw== - -"@babel/parser@^7.18.10", "@babel/parser@^7.18.13": - version "7.18.13" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.13.tgz#5b2dd21cae4a2c5145f1fbd8ca103f9313d3b7e4" - integrity sha512-dgXcIfMuQ0kgzLB2b9tRZs7TTFFaGM2AbtA4fJgUUYukzGH4jwsS7hzQHEGs67jdehpm22vkgKwvbU+aEflgwg== - -"@babel/parser@^7.18.6", "@babel/parser@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.9.tgz#f2dde0c682ccc264a9a8595efd030a5cc8fd2539" - integrity sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg== - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.17.12.tgz#1dca338caaefca368639c9ffb095afbd4d420b1e" - integrity sha512-xCJQXl4EeQ3J9C4yOmpTrtVGmzpm2iSzyxbkZHw7UCnZBftHpF/hpII80uWVyVrc40ytIClHjgWGTG1g/yB+aw== - dependencies: - "@babel/helper-plugin-utils" "^7.17.12" +"@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.19.3", "@babel/parser@^7.20.7", "@babel/parser@^7.21.5", "@babel/parser@^7.21.8", "@babel/parser@~7.21.2": + version "7.21.8" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.8.tgz#642af7d0333eab9c0ad70b14ac5e76dbde7bfdf8" + integrity sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": version "7.18.6" @@ -1000,52 +752,26 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.17.12.tgz#0d498ec8f0374b1e2eb54b9cb2c4c78714c77753" - integrity sha512-/vt0hpIw0x4b6BLKUkwlvEoiGZYYLNZ96CzyHYPbtG2jZGz6LBe7/V+drYrc/d+ovrF9NBi0pmtvmNb/FsWtRQ== - dependencies: - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" - "@babel/plugin-proposal-optional-chaining" "^7.17.12" - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz#a11af19aa373d68d561f08e0a57242350ed0ec50" - integrity sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz#d9c85589258539a22a901033853101a6198d4ef1" + integrity sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" - "@babel/plugin-proposal-optional-chaining" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-proposal-optional-chaining" "^7.20.7" -"@babel/plugin-proposal-async-generator-functions@7.18.10", "@babel/plugin-proposal-async-generator-functions@^7.18.10": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz#85ea478c98b0095c3e4102bff3b67d306ed24952" - integrity sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew== +"@babel/plugin-proposal-async-generator-functions@7.20.7", "@babel/plugin-proposal-async-generator-functions@^7.20.1", "@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" + integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== dependencies: "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-remap-async-to-generator" "^7.18.9" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-proposal-async-generator-functions@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.17.12.tgz#094a417e31ce7e692d84bab06c8e2a607cbeef03" - integrity sha512-RWVvqD1ooLKP6IqWTA5GyFVX2isGEgC5iFxKzfYOIy/QEFdxYyCybBDtIGjipHpb9bDWHzcqGqFakf+mVmBTdQ== - dependencies: - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-remap-async-to-generator" "^7.16.8" - "@babel/plugin-syntax-async-generators" "^7.8.4" - -"@babel/plugin-proposal-class-properties@^7.12.1", "@babel/plugin-proposal-class-properties@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.17.12.tgz#84f65c0cc247d46f40a6da99aadd6438315d80a4" - integrity sha512-U0mI9q8pW5Q9EaTHFPwSVusPMV/DV9Mm8p7csqROFLtIE9rBF5piLqyrBGigftALrBcsBGu4m38JneAe7ZDLXw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.17.12" - "@babel/helper-plugin-utils" "^7.17.12" - -"@babel/plugin-proposal-class-properties@^7.18.6": +"@babel/plugin-proposal-class-properties@^7.13.0", "@babel/plugin-proposal-class-properties@^7.14.5", "@babel/plugin-proposal-class-properties@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== @@ -1053,43 +779,25 @@ "@babel/helper-create-class-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-proposal-class-static-block@^7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.0.tgz#7d02253156e3c3793bdb9f2faac3a1c05f0ba710" - integrity sha512-t+8LsRMMDE74c6sV7KShIw13sqbqd58tlqNrsWoWBTIMw7SVQ0cZ905wLNS/FBCy/3PyooRHLFFlfrUNyyz5lA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.0" - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - -"@babel/plugin-proposal-class-static-block@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz#8aa81d403ab72d3962fc06c26e222dacfc9b9020" - integrity sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw== +"@babel/plugin-proposal-class-static-block@^7.18.6", "@babel/plugin-proposal-class-static-block@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz#77bdd66fb7b605f3a61302d224bdfacf5547977d" + integrity sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.21.0" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-class-static-block" "^7.14.5" -"@babel/plugin-proposal-decorators@^7.12.12": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.18.2.tgz#dbe4086d2d42db489399783c3aa9272e9700afd4" - integrity sha512-kbDISufFOxeczi0v4NQP3p5kIeW6izn/6klfWBrIIdGZZe4UpHR+QU03FAoWjGGd9SUXAwbw2pup1kaL4OQsJQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.0" - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-replace-supers" "^7.18.2" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/plugin-syntax-decorators" "^7.17.12" - charcodes "^0.2.0" - -"@babel/plugin-proposal-dynamic-import@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz#c19c897eaa46b27634a00fee9fb7d829158704b2" - integrity sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg== +"@babel/plugin-proposal-decorators@^7.14.5": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.21.0.tgz#70e0c89fdcd7465c97593edb8f628ba6e4199d63" + integrity sha512-MfgX49uRrFUTL/HvWtmx3zmpyzMMr4MTj3d527MLlr/4RTT9G/ytFFP7qet2uM2Ve03b+BkpWUpK+lRXnQ+v9w== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/helper-create-class-features-plugin" "^7.21.0" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-replace-supers" "^7.20.7" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/plugin-syntax-decorators" "^7.21.0" "@babel/plugin-proposal-dynamic-import@^7.18.6": version "7.18.6" @@ -1099,22 +807,6 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-proposal-export-default-from@^7.12.1": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.17.12.tgz#df785e638618d8ffa14e08c78c44d9695d083b73" - integrity sha512-LpsTRw725eBAXXKUOnJJct+SEaOzwR78zahcLuripD2+dKc2Sj+8Q2DzA+GC/jOpOu/KlDXuxrzG214o1zTauQ== - dependencies: - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/plugin-syntax-export-default-from" "^7.16.7" - -"@babel/plugin-proposal-export-namespace-from@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.17.12.tgz#b22864ccd662db9606edb2287ea5fd1709f05378" - integrity sha512-j7Ye5EWdwoXOpRmo5QmRyHPsDIe6+u70ZYZrd7uz+ebPYFKfRcLcNu3Ro0vOlJ5zuv8rU7xa+GttNiRzX56snQ== - dependencies: - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-proposal-export-namespace-from@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz#5f7313ab348cdb19d590145f9247540e94761203" @@ -1123,14 +815,6 @@ "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-proposal-json-strings@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.17.12.tgz#f4642951792437233216d8c1af370bb0fbff4664" - integrity sha512-rKJ+rKBoXwLnIn7n6o6fulViHMrOThz99ybH+hKHcOZbnN14VuMnH9fo2eHE69C8pO4uX1Q7t2HYYIDmv8VYkg== - dependencies: - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-proposal-json-strings@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz#7e8788c1811c393aff762817e7dbf1ebd0c05f0b" @@ -1139,31 +823,15 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-proposal-logical-assignment-operators@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.17.12.tgz#c64a1bcb2b0a6d0ed2ff674fd120f90ee4b88a23" - integrity sha512-EqFo2s1Z5yy+JeJu7SFfbIUtToJTVlC61/C7WLKDntSw4Sz6JNAIfL7zQ74VvirxpjB5kz/kIx0gCcb+5OEo2Q== - dependencies: - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - -"@babel/plugin-proposal-logical-assignment-operators@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz#8148cbb350483bf6220af06fa6db3690e14b2e23" - integrity sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q== +"@babel/plugin-proposal-logical-assignment-operators@^7.18.9", "@babel/plugin-proposal-logical-assignment-operators@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz#dfbcaa8f7b4d37b51e8bfb46d94a5aea2bb89d83" + integrity sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.12.1", "@babel/plugin-proposal-nullish-coalescing-operator@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.17.12.tgz#1e93079bbc2cbc756f6db6a1925157c4a92b94be" - integrity sha512-ws/g3FSGVzv+VH86+QvgtuJL/kR67xaEIF2x0iPqdDfYW6ra6JF3lKVBkWynRLcNtIC1oCTfDRVxmm2mKzy+ag== - dependencies: - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - -"@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": +"@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8", "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== @@ -1171,14 +839,6 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-proposal-numeric-separator@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz#d6b69f4af63fb38b6ca2558442a7fb191236eba9" - integrity sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-proposal-numeric-separator@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75" @@ -1187,44 +847,16 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz#def9bd03cea0f9b72283dac0ec22d289c7691069" - integrity sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-transform-parameters" "^7.12.1" - -"@babel/plugin-proposal-object-rest-spread@^7.12.1", "@babel/plugin-proposal-object-rest-spread@^7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.0.tgz#79f2390c892ba2a68ec112eb0d895cfbd11155e8" - integrity sha512-nbTv371eTrFabDfHLElkn9oyf9VG+VKK6WMzhY2o4eHKaG19BToD9947zzGMO6I/Irstx9d8CwX6njPNIAR/yw== - dependencies: - "@babel/compat-data" "^7.17.10" - "@babel/helper-compilation-targets" "^7.17.10" - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.17.12" - -"@babel/plugin-proposal-object-rest-spread@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz#f9434f6beb2c8cae9dfcf97d2a5941bbbf9ad4e7" - integrity sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q== +"@babel/plugin-proposal-object-rest-spread@^7.20.2", "@babel/plugin-proposal-object-rest-spread@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" + integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== dependencies: - "@babel/compat-data" "^7.18.8" - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/compat-data" "^7.20.5" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.18.8" - -"@babel/plugin-proposal-optional-catch-binding@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz#c623a430674ffc4ab732fd0a0ae7722b67cb74cf" - integrity sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.20.7" "@babel/plugin-proposal-optional-catch-binding@^7.18.6": version "7.18.6" @@ -1234,32 +866,15 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@^7.12.7", "@babel/plugin-proposal-optional-chaining@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.17.12.tgz#f96949e9bacace3a9066323a5cf90cfb9de67174" - integrity sha512-7wigcOs/Z4YWlK7xxjkvaIw84vGhDv/P1dFGQap0nHkc8gFKY/r+hXc8Qzf5k1gY7CvGIcHqAnOagVKJJ1wVOQ== +"@babel/plugin-proposal-optional-chaining@^7.13.12", "@babel/plugin-proposal-optional-chaining@^7.18.9", "@babel/plugin-proposal-optional-chaining@^7.20.7", "@babel/plugin-proposal-optional-chaining@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea" + integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz#e8e8fe0723f2563960e4bf5e9690933691915993" - integrity sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - -"@babel/plugin-proposal-private-methods@^7.12.1", "@babel/plugin-proposal-private-methods@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.17.12.tgz#c2ca3a80beb7539289938da005ad525a038a819c" - integrity sha512-SllXoxo19HmxhDWm3luPz+cPhtoTSKLJE9PXshsfrOzBqs60QP0r8OaJItrPhAj0d7mZMnNF0Y1UUggCDgMz1A== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.17.12" - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/plugin-proposal-private-methods@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea" @@ -1268,35 +883,17 @@ "@babel/helper-create-class-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-proposal-private-property-in-object@^7.12.1", "@babel/plugin-proposal-private-property-in-object@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.17.12.tgz#b02efb7f106d544667d91ae97405a9fd8c93952d" - integrity sha512-/6BtVi57CJfrtDNKfK5b66ydK2J5pXUKBKSPD2G1whamMuEnZWgoOIfO8Vf9F/DoD4izBLD/Au4NMQfruzzykg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-create-class-features-plugin" "^7.17.12" - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - -"@babel/plugin-proposal-private-property-in-object@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz#a64137b232f0aca3733a67eb1a144c192389c503" - integrity sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw== +"@babel/plugin-proposal-private-property-in-object@^7.18.6", "@babel/plugin-proposal-private-property-in-object@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz#19496bd9883dd83c23c7d7fc45dcd9ad02dfa1dc" + integrity sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.21.0" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" -"@babel/plugin-proposal-unicode-property-regex@^7.17.12", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.17.12.tgz#3dbd7a67bd7f94c8238b394da112d86aaf32ad4d" - integrity sha512-Wb9qLjXf3ZazqXA7IvI7ozqRIXIGPtSo+L5coFmEkhTQK18ao4UDDD0zdTGAarmbLj2urpRwrc6893cu5Bfh0A== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.17.12" - "@babel/helper-plugin-utils" "^7.17.12" - -"@babel/plugin-proposal-unicode-property-regex@^7.18.6": +"@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== @@ -1332,12 +929,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-decorators@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.17.12.tgz#02e8f678602f0af8222235271efea945cfdb018a" - integrity sha512-D1Hz0qtGTza8K2xGyEdVNCYLdVHukAcbQr4K3/s6r/esadyEriZovpJimQOpu8ju4/jV8dW/1xdaE0UpDroidw== +"@babel/plugin-syntax-decorators@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.21.0.tgz#d2b3f31c3e86fa86e16bb540b7660c55bd7d0e78" + integrity sha512-tIoPpGBR8UuM4++ccWN3gifhVvQu7ZizuR1fklhRJrd5ewgbkUS+0KVFeWWxELtn18NTLoW32XV7zyOgIAiz+w== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" @@ -1346,13 +943,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-export-default-from@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.16.7.tgz#fa89cf13b60de2c3f79acdc2b52a21174c6de060" - integrity sha512-4C3E4NsrLOgftKaTYTULhHsuQrGv3FHrBzOMDiS7UYKIpgGBkAdawg4h+EI8zPeK9M0fiIIh72hIwsI24K7MbA== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-export-namespace-from@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" @@ -1360,21 +950,21 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-import-assertions@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.17.12.tgz#58096a92b11b2e4e54b24c6a0cc0e5e607abcedd" - integrity sha512-n/loy2zkq9ZEM8tEOwON9wTQSTNDTDEz6NujPtJGLU7qObzT1N4c4YZZf8E6ATB2AjNQg/Ib2AIpO03EZaCehw== +"@babel/plugin-syntax-flow@^7.18.6": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.21.4.tgz#3e37fca4f06d93567c1cd9b75156422e90a67107" + integrity sha512-l9xd3N+XG4fZRxEP3vXdK6RW7vN1Uf5dxzRC/09wV86wqZ/YYQooBIGNsiRdfNR3/q2/5pPzV4B54J/9ctX5jw== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-syntax-import-assertions@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz#cd6190500a4fa2fe31990a963ffab4b63e4505e4" - integrity sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ== +"@babel/plugin-syntax-import-assertions@^7.20.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz#bb50e0d4bea0957235390641209394e87bdb9cc4" + integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.19.0" -"@babel/plugin-syntax-import-meta@^7.8.3": +"@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== @@ -1388,19 +978,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz#9d9d357cc818aa7ae7935917c1257f67677a0926" - integrity sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg== +"@babel/plugin-syntax-jsx@^7.21.4", "@babel/plugin-syntax-jsx@^7.7.2": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz#f264ed7bf40ffc9ec239edabc17a50c4f5b6fea2" + integrity sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-jsx@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.17.12.tgz#834035b45061983a491f60096f61a2e7c5674a47" - integrity sha512-spyY3E3AURfxh/RHtjx5j6hs8am5NbUBGfcZ2vB3uShSpZdQyXSf5rR5Mk76vbtlAZOelyVQ71Fg0x9SG4fsog== - dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" @@ -1423,7 +1006,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-object-rest-spread@7.8.3", "@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": +"@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== @@ -1458,51 +1041,28 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.17.12", "@babel/plugin-syntax-typescript@^7.7.2": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.17.12.tgz#b54fc3be6de734a56b87508f99d6428b5b605a7b" - integrity sha512-TYY0SXFiO31YXtNg3HtFwNJHjLsAyIIhAhNWkQ5whPPS7HWUFlg9z0Ta4qAQNjQbP1wsSt/oKkmZ/4/WWdMUpw== +"@babel/plugin-syntax-typescript@^7.20.0", "@babel/plugin-syntax-typescript@^7.3.3", "@babel/plugin-syntax-typescript@^7.7.2": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz#2751948e9b7c6d771a8efa59340c15d4a2891ff8" + integrity sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-arrow-functions@^7.12.1", "@babel/plugin-transform-arrow-functions@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.17.12.tgz#dddd783b473b1b1537ef46423e3944ff24898c45" - integrity sha512-PHln3CNi/49V+mza4xMwrg+WGYevSF1oaiXaC2EQfdp4HWlSjRsrDXWJiQBKpP7749u6vQ9mcry2uuFOv5CXvA== +"@babel/plugin-transform-arrow-functions@^7.18.6", "@babel/plugin-transform-arrow-functions@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz#9bb42a53de447936a57ba256fbf537fc312b6929" + integrity sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.21.5" -"@babel/plugin-transform-arrow-functions@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz#19063fcf8771ec7b31d742339dac62433d0611fe" - integrity sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-async-to-generator@7.18.6", "@babel/plugin-transform-async-to-generator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz#ccda3d1ab9d5ced5265fdb13f1882d5476c71615" - integrity sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag== +"@babel/plugin-transform-async-to-generator@7.20.7", "@babel/plugin-transform-async-to-generator@^7.18.6", "@babel/plugin-transform-async-to-generator@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz#dfee18623c8cb31deb796aa3ca84dda9cea94354" + integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== dependencies: "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-remap-async-to-generator" "^7.18.6" - -"@babel/plugin-transform-async-to-generator@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.17.12.tgz#dbe5511e6b01eee1496c944e35cdfe3f58050832" - integrity sha512-J8dbrWIOO3orDzir57NRsjg4uxucvhby0L/KZuGsWDj0g7twWK3g7JhJhOrXtuXiw8MeiSdJ3E0OW9H8LYEzLQ== - dependencies: - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-remap-async-to-generator" "^7.16.8" - -"@babel/plugin-transform-block-scoped-functions@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz#4d0d57d9632ef6062cdf354bb717102ee042a620" - integrity sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-remap-async-to-generator" "^7.18.9" "@babel/plugin-transform-block-scoped-functions@^7.18.6": version "7.18.6" @@ -1511,85 +1071,44 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-block-scoping@^7.12.12", "@babel/plugin-transform-block-scoping@^7.17.12": - version "7.18.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.4.tgz#7988627b3e9186a13e4d7735dc9c34a056613fb9" - integrity sha512-+Hq10ye+jlvLEogSOtq4mKvtk7qwcUQ1f0Mrueai866C82f844Yom2cttfJdMdqRLTxWpsbfbkIkOIfovyUQXw== +"@babel/plugin-transform-block-scoping@^7.20.2", "@babel/plugin-transform-block-scoping@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz#e737b91037e5186ee16b76e7ae093358a5634f02" + integrity sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-block-scoping@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz#f9b7e018ac3f373c81452d6ada8bd5a18928926d" - integrity sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-classes@^7.12.1", "@babel/plugin-transform-classes@^7.17.12": - version "7.18.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.4.tgz#51310b812a090b846c784e47087fa6457baef814" - integrity sha512-e42NSG2mlKWgxKUAD9EJJSkZxR67+wZqzNxLSpc51T8tRU5SLFHsPmgYR5yr7sdgX4u+iHA1C5VafJ6AyImV3A== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-environment-visitor" "^7.18.2" - "@babel/helper-function-name" "^7.17.9" - "@babel/helper-optimise-call-expression" "^7.16.7" - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-replace-supers" "^7.18.2" - "@babel/helper-split-export-declaration" "^7.16.7" - globals "^11.1.0" - -"@babel/plugin-transform-classes@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz#90818efc5b9746879b869d5ce83eb2aa48bbc3da" - integrity sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g== +"@babel/plugin-transform-classes@^7.20.2", "@babel/plugin-transform-classes@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz#f469d0b07a4c5a7dbb21afad9e27e57b47031665" + integrity sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-compilation-targets" "^7.20.7" "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" + "@babel/helper-function-name" "^7.21.0" "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/helper-replace-supers" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-replace-supers" "^7.20.7" "@babel/helper-split-export-declaration" "^7.18.6" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.17.12.tgz#bca616a83679698f3258e892ed422546e531387f" - integrity sha512-a7XINeplB5cQUWMg1E/GI1tFz3LfK021IjV1rj1ypE+R7jHm+pIHmHl25VNkZxtx9uuYp7ThGk8fur1HHG7PgQ== - dependencies: - "@babel/helper-plugin-utils" "^7.17.12" - -"@babel/plugin-transform-computed-properties@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz#2357a8224d402dad623caf6259b611e56aec746e" - integrity sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-destructuring@^7.12.1", "@babel/plugin-transform-destructuring@^7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.0.tgz#dc4f92587e291b4daa78aa20cc2d7a63aa11e858" - integrity sha512-Mo69klS79z6KEfrLg/1WkmVnB8javh75HX4pi2btjvlIoasuxilEyjtsQW6XPrubNd7AQy0MMaNIaQE4e7+PQw== - dependencies: - "@babel/helper-plugin-utils" "^7.17.12" - -"@babel/plugin-transform-destructuring@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.9.tgz#68906549c021cb231bee1db21d3b5b095f8ee292" - integrity sha512-p5VCYNddPLkZTq4XymQIaIfZNJwT9YsjkPOhkVEqt6QIpQFZVM9IltqqYpOEkJoN1DPznmxUDyZ5CTZs/ZCuHA== +"@babel/plugin-transform-computed-properties@^7.18.9", "@babel/plugin-transform-computed-properties@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz#3a2d8bb771cd2ef1cd736435f6552fe502e11b44" + integrity sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/template" "^7.20.7" -"@babel/plugin-transform-dotall-regex@^7.16.7", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz#6b2d67686fab15fb6a7fd4bd895d5982cfc81241" - integrity sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ== +"@babel/plugin-transform-destructuring@^7.20.2", "@babel/plugin-transform-destructuring@^7.21.3": + version "7.21.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz#73b46d0fd11cd6ef57dea8a381b1215f4959d401" + integrity sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-dotall-regex@^7.18.6": +"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz#b286b3e7aae6c7b861e45bed0a2fafd6b1a4fef8" integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== @@ -1597,13 +1116,6 @@ "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-duplicate-keys@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.17.12.tgz#a09aa709a3310013f8e48e0e23bc7ace0f21477c" - integrity sha512-EA5eYFUG6xeerdabina/xIoB95jJ17mAkR8ivx6ZSu9frKShBjpOGZPn511MTDTkiCO+zXnzNczvUM69YSf3Zw== - dependencies: - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/plugin-transform-duplicate-keys@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz#687f15ee3cdad6d85191eb2a372c4528eaa0ae0e" @@ -1611,14 +1123,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-exponentiation-operator@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz#efa9862ef97e9e9e5f653f6ddc7b665e8536fe9b" - integrity sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-exponentiation-operator@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz#421c705f4521888c65e91fdd1af951bfefd4dacd" @@ -1627,28 +1131,20 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-for-of@^7.12.1", "@babel/plugin-transform-for-of@^7.18.1": - version "7.18.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.1.tgz#ed14b657e162b72afbbb2b4cdad277bf2bb32036" - integrity sha512-+TTB5XwvJ5hZbO8xvl2H4XaMDOAK57zF4miuC9qQJgysPNEAZZ9Z69rdF5LJkozGdZrjBIUAIyKUWRMmebI7vg== +"@babel/plugin-transform-flow-strip-types@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.21.0.tgz#6aeca0adcb81dc627c8986e770bfaa4d9812aff5" + integrity sha512-FlFA2Mj87a6sDkW4gfGrQQqwY/dLlBAyJa2dJEZ+FHXUVHBflO2wyKvg+OOEzXfrKYIa4HWl0mgmbCzt0cMb7w== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-flow" "^7.18.6" -"@babel/plugin-transform-for-of@^7.18.8": - version "7.18.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz#6ef8a50b244eb6a0bdbad0c7c61877e4e30097c1" - integrity sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ== +"@babel/plugin-transform-for-of@^7.18.8", "@babel/plugin-transform-for-of@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz#e890032b535f5a2e237a18535f56a9fdaa7b83fc" + integrity sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-function-name@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz#5ab34375c64d61d083d7d2f05c38d90b97ec65cf" - integrity sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA== - dependencies: - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-function-name" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.21.5" "@babel/plugin-transform-function-name@^7.18.9": version "7.18.9" @@ -1659,13 +1155,6 @@ "@babel/helper-function-name" "^7.18.9" "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-literals@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.17.12.tgz#97131fbc6bbb261487105b4b3edbf9ebf9c830ae" - integrity sha512-8iRkvaTjJciWycPIZ9k9duu663FT7VrBdNqNgxnVXEFwOIp55JWcZd23VBRySYbnS3PwQ3rGiabJBBBGj5APmQ== - dependencies: - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/plugin-transform-literals@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc" @@ -1673,13 +1162,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-member-expression-literals@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz#6e5dcf906ef8a098e630149d14c867dd28f92384" - integrity sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-member-expression-literals@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e" @@ -1687,73 +1169,32 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-modules-amd@^7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.0.tgz#7ef1002e67e36da3155edc8bf1ac9398064c02ed" - integrity sha512-h8FjOlYmdZwl7Xm2Ug4iX2j7Qy63NANI+NQVWQzv6r25fqgg7k2dZl03p95kvqNclglHs4FZ+isv4p1uXMA+QA== - dependencies: - "@babel/helper-module-transforms" "^7.18.0" - "@babel/helper-plugin-utils" "^7.17.12" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-amd@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz#8c91f8c5115d2202f277549848874027d7172d21" - integrity sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg== - dependencies: - "@babel/helper-module-transforms" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-commonjs@^7.18.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.2.tgz#1aa8efa2e2a6e818b6a7f2235fceaf09bdb31e9e" - integrity sha512-f5A865gFPAJAEE0K7F/+nm5CmAE3y8AWlMBG9unu5j9+tk50UQVK0QS8RNxSp7MJf0wh97uYyLWt3Zvu71zyOQ== - dependencies: - "@babel/helper-module-transforms" "^7.18.0" - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-simple-access" "^7.18.2" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-commonjs@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz#afd243afba166cca69892e24a8fd8c9f2ca87883" - integrity sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q== +"@babel/plugin-transform-modules-amd@^7.19.6", "@babel/plugin-transform-modules-amd@^7.20.11": + version "7.20.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz#3daccca8e4cc309f03c3a0c4b41dc4b26f55214a" + integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g== dependencies: - "@babel/helper-module-transforms" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-simple-access" "^7.18.6" - babel-plugin-dynamic-import-node "^2.3.3" + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-modules-systemjs@^7.18.0": - version "7.18.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.5.tgz#87f11c44fbfd3657be000d4897e192d9cb535996" - integrity sha512-SEewrhPpcqMF1V7DhnEbhVJLrC+nnYfe1E0piZMZXBpxi9WvZqWGwpsk7JYP7wPWeqaBh4gyKlBhHJu3uz5g4Q== +"@babel/plugin-transform-modules-commonjs@^7.13.8", "@babel/plugin-transform-modules-commonjs@^7.19.6", "@babel/plugin-transform-modules-commonjs@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz#d69fb947eed51af91de82e4708f676864e5e47bc" + integrity sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ== dependencies: - "@babel/helper-hoist-variables" "^7.16.7" - "@babel/helper-module-transforms" "^7.18.0" - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-validator-identifier" "^7.16.7" - babel-plugin-dynamic-import-node "^2.3.3" + "@babel/helper-module-transforms" "^7.21.5" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-simple-access" "^7.21.5" -"@babel/plugin-transform-modules-systemjs@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz#545df284a7ac6a05125e3e405e536c5853099a06" - integrity sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A== +"@babel/plugin-transform-modules-systemjs@^7.19.6", "@babel/plugin-transform-modules-systemjs@^7.20.11": + version "7.20.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz#467ec6bba6b6a50634eea61c9c232654d8a4696e" + integrity sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw== dependencies: "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-module-transforms" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/helper-validator-identifier" "^7.18.6" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-umd@^7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.0.tgz#56aac64a2c2a1922341129a4597d1fd5c3ff020f" - integrity sha512-d/zZ8I3BWli1tmROLxXLc9A6YXvGK8egMxHp+E/rRwMh1Kip0AP77VwZae3snEJ33iiWwvNv2+UIIhfalqhzZA== - dependencies: - "@babel/helper-module-transforms" "^7.18.0" - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-validator-identifier" "^7.19.1" "@babel/plugin-transform-modules-umd@^7.18.6": version "7.18.6" @@ -1763,28 +1204,13 @@ "@babel/helper-module-transforms" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-named-capturing-groups-regex@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.12.tgz#9c4a5a5966e0434d515f2675c227fd8cc8606931" - integrity sha512-vWoWFM5CKaTeHrdUJ/3SIOTRV+MBVGybOC9mhJkaprGNt5demMymDW24yC74avb915/mIRe3TgNb/d8idvnCRA== +"@babel/plugin-transform-named-capturing-groups-regex@^7.19.1", "@babel/plugin-transform-named-capturing-groups-regex@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz#626298dd62ea51d452c3be58b285d23195ba69a8" + integrity sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.17.12" - "@babel/helper-plugin-utils" "^7.17.12" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz#c89bfbc7cc6805d692f3a49bc5fc1b630007246d" - integrity sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-new-target@^7.17.12": - version "7.18.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.5.tgz#8c228c4a07501dd12c95c5f23d1622131cc23931" - integrity sha512-TuRL5uGW4KXU6OsRj+mLp9BM7pO8e7SGNTEokQRRxHFkXYMFiy2jlKSZPFtI/mKORDzciH+hneskcSOp0gU8hg== - dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-create-regexp-features-plugin" "^7.20.5" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-new-target@^7.18.6": version "7.18.6" @@ -1793,14 +1219,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-object-super@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz#ac359cf8d32cf4354d27a46867999490b6c32a94" - integrity sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-replace-supers" "^7.16.7" - "@babel/plugin-transform-object-super@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c" @@ -1809,26 +1227,12 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/helper-replace-supers" "^7.18.6" -"@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.17.12.tgz#eb467cd9586ff5ff115a9880d6fdbd4a846b7766" - integrity sha512-6qW4rWo1cyCdq1FkYri7AHpauchbGLXpdwnYsfxFb+KtddHENfsY5JZb35xUwkK5opOLcJ3BNd2l7PhRYGlwIA== +"@babel/plugin-transform-parameters@^7.20.1", "@babel/plugin-transform-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.21.3": + version "7.21.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz#18fc4e797cf6d6d972cb8c411dbe8a809fa157db" + integrity sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" - -"@babel/plugin-transform-parameters@^7.18.8": - version "7.18.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz#ee9f1a0ce6d78af58d0956a9378ea3427cccb48a" - integrity sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-property-literals@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz#2dadac85155436f22c696c4827730e0fe1057a55" - integrity sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-property-literals@^7.18.6": version "7.18.6" @@ -1837,61 +1241,24 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-react-display-name@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz#7b6d40d232f4c0f550ea348593db3b21e2404340" - integrity sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-react-jsx-development@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz#43a00724a3ed2557ed3f276a01a929e6686ac7b8" - integrity sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A== - dependencies: - "@babel/plugin-transform-react-jsx" "^7.16.7" - -"@babel/plugin-transform-react-jsx@^7.12.12", "@babel/plugin-transform-react-jsx@^7.16.7", "@babel/plugin-transform-react-jsx@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.12.tgz#2aa20022709cd6a3f40b45d60603d5f269586dba" - integrity sha512-Lcaw8bxd1DKht3thfD4A12dqo1X16he1Lm8rIv8sTwjAYNInRS1qHa9aJoqvzpscItXvftKDCfaEQzwoVyXpEQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/plugin-syntax-jsx" "^7.17.12" - "@babel/types" "^7.17.12" - -"@babel/plugin-transform-react-pure-annotations@^7.16.7": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.0.tgz#ef82c8e310913f3522462c9ac967d395092f1954" - integrity sha512-6+0IK6ouvqDn9bmEG7mEyF/pwlJXVj5lwydybpyyH3D0A7Hftk+NCTdYjnLNZksn261xaOV5ksmp20pQEmc2RQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-plugin-utils" "^7.17.12" - -"@babel/plugin-transform-regenerator@^7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.0.tgz#44274d655eb3f1af3f3a574ba819d3f48caf99d5" - integrity sha512-C8YdRw9uzx25HSIzwA7EM7YP0FhCe5wNvJbZzjVNHHPGVcDJ3Aie+qGYYdS1oVQgn+B3eAIJbWFLrJ4Jipv7nw== - dependencies: - "@babel/helper-plugin-utils" "^7.17.12" - regenerator-transform "^0.15.0" - -"@babel/plugin-transform-regenerator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz#585c66cb84d4b4bf72519a34cfce761b8676ca73" - integrity sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ== +"@babel/plugin-transform-react-jsx@^7.19.0": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.5.tgz#bd98f3b429688243e4fa131fe1cbb2ef31ce6f38" + integrity sha512-ELdlq61FpoEkHO6gFRpfj0kUgSwQTGoaEU8eMRoS8Dv3v6e7BjEAj5WMtIBRdHUeAioMhKP5HyxNzNnP+heKbA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - regenerator-transform "^0.15.0" + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-module-imports" "^7.21.4" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-jsx" "^7.21.4" + "@babel/types" "^7.21.5" -"@babel/plugin-transform-reserved-words@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.17.12.tgz#7dbd349f3cdffba751e817cf40ca1386732f652f" - integrity sha512-1KYqwbJV3Co03NIi14uEHW8P50Md6KqFgt0FfpHdK6oyAHQVTosgPuPSiWud1HX0oYJ1hGRRlk0fP87jFpqXZA== +"@babel/plugin-transform-regenerator@^7.18.6", "@babel/plugin-transform-regenerator@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz#576c62f9923f94bcb1c855adc53561fd7913724e" + integrity sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.21.5" + regenerator-transform "^0.15.1" "@babel/plugin-transform-reserved-words@^7.18.6": version "7.18.6" @@ -1900,24 +1267,29 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-runtime@7.18.10": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.10.tgz#37d14d1fa810a368fd635d4d1476c0154144a96f" - integrity sha512-q5mMeYAdfEbpBAgzl7tBre/la3LeCxmDO1+wMXRdPWbcoMjR3GiXlCLk7JBZVVye0bqTGNMbt0yYVXX1B1jEWQ== +"@babel/plugin-transform-runtime@7.19.6": + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz#9d2a9dbf4e12644d6f46e5e75bfbf02b5d6e9194" + integrity sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw== dependencies: "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.9" - babel-plugin-polyfill-corejs2 "^0.3.2" - babel-plugin-polyfill-corejs3 "^0.5.3" - babel-plugin-polyfill-regenerator "^0.4.0" + "@babel/helper-plugin-utils" "^7.19.0" + babel-plugin-polyfill-corejs2 "^0.3.3" + babel-plugin-polyfill-corejs3 "^0.6.0" + babel-plugin-polyfill-regenerator "^0.4.1" semver "^6.3.0" -"@babel/plugin-transform-shorthand-properties@^7.12.1", "@babel/plugin-transform-shorthand-properties@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz#e8549ae4afcf8382f711794c0c7b6b934c5fbd2a" - integrity sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg== +"@babel/plugin-transform-runtime@^7.15.0": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.4.tgz#2e1da21ca597a7d01fc96b699b21d8d2023191aa" + integrity sha512-1J4dhrw1h1PqnNNpzwxQ2UBymJUF8KuPjAAnlLwZcGhHAIqUigFW7cdK6GHoB64ubY4qXQNYknoUeks4Wz7CUA== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-module-imports" "^7.21.4" + "@babel/helper-plugin-utils" "^7.20.2" + babel-plugin-polyfill-corejs2 "^0.3.3" + babel-plugin-polyfill-corejs3 "^0.6.0" + babel-plugin-polyfill-regenerator "^0.4.1" + semver "^6.3.0" "@babel/plugin-transform-shorthand-properties@^7.18.6": version "7.18.6" @@ -1926,28 +1298,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-spread@^7.12.1", "@babel/plugin-transform-spread@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.17.12.tgz#c112cad3064299f03ea32afed1d659223935d1f5" - integrity sha512-9pgmuQAtFi3lpNUstvG9nGfk9DkrdmWNp9KeKPFmuZCpEnxRzYlS8JgwPjYj+1AWDOSvoGN0H30p1cBOmT/Svg== +"@babel/plugin-transform-spread@^7.19.0", "@babel/plugin-transform-spread@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz#c2d83e0b99d3bf83e07b11995ee24bf7ca09401e" + integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" - -"@babel/plugin-transform-spread@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz#6ea7a6297740f381c540ac56caf75b05b74fb664" - integrity sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" - -"@babel/plugin-transform-sticky-regex@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz#c84741d4f4a38072b9a1e2e3fd56d359552e8660" - integrity sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@babel/plugin-transform-sticky-regex@^7.18.6": version "7.18.6" @@ -1956,13 +1313,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-template-literals@^7.12.1", "@babel/plugin-transform-template-literals@^7.18.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.2.tgz#31ed6915721864847c48b656281d0098ea1add28" - integrity sha512-/cmuBVw9sZBGZVOMkpAEaVLwm4JmK2GZ1dFKOGGpMzEHWFmyZZ59lUU0PdRr8YNYeQdNzTDwuxP2X2gzydTc9g== - dependencies: - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/plugin-transform-template-literals@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e" @@ -1970,13 +1320,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-typeof-symbol@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.17.12.tgz#0f12f57ac35e98b35b4ed34829948d42bd0e6889" - integrity sha512-Q8y+Jp7ZdtSPXCThB6zjQ74N3lj0f6TDh1Hnf5B+sYlzQ8i5Pjp8gW0My79iekSpT4WnI06blqP6DT0OmaXXmw== - dependencies: - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/plugin-transform-typeof-symbol@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz#c8cea68263e45addcd6afc9091429f80925762c0" @@ -1984,36 +1327,22 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-typescript@^7.17.12": - version "7.18.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.4.tgz#587eaf6a39edb8c06215e550dc939faeadd750bf" - integrity sha512-l4vHuSLUajptpHNEOUDEGsnpl9pfRLsN1XUoDQDD/YBuXTM+v37SHGS+c6n4jdcZy96QtuUuSvZYMLSSsjH8Mw== +"@babel/plugin-transform-typescript@^7.21.3": + version "7.21.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.3.tgz#316c5be579856ea890a57ebc5116c5d064658f2b" + integrity sha512-RQxPz6Iqt8T0uw/WsJNReuBpWpBqs/n7mNo18sKLoTbMp+UrEekhH+pKSVC7gWz+DNjo9gryfV8YzCiT45RgMw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.0" - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/plugin-syntax-typescript" "^7.17.12" - -"@babel/plugin-transform-unicode-escapes@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz#da8717de7b3287a2c6d659750c964f302b31ece3" - integrity sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-unicode-escapes@^7.18.10": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz#1ecfb0eda83d09bbcb77c09970c2dd55832aa246" - integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.21.0" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-typescript" "^7.20.0" -"@babel/plugin-transform-unicode-regex@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz#0f7aa4a501198976e25e82702574c34cfebe9ef2" - integrity sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q== +"@babel/plugin-transform-unicode-escapes@^7.18.10", "@babel/plugin-transform-unicode-escapes@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz#1e55ed6195259b0e9061d81f5ef45a9b009fb7f2" + integrity sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.21.5" "@babel/plugin-transform-unicode-regex@^7.18.6": version "7.18.6" @@ -2023,18 +1352,18 @@ "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/preset-env@7.18.10": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.18.10.tgz#83b8dfe70d7eea1aae5a10635ab0a5fe60dfc0f4" - integrity sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA== +"@babel/preset-env@7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.20.2.tgz#9b1642aa47bb9f43a86f9630011780dab7f86506" + integrity sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg== dependencies: - "@babel/compat-data" "^7.18.8" - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/compat-data" "^7.20.1" + "@babel/helper-compilation-targets" "^7.20.0" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-validator-option" "^7.18.6" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9" - "@babel/plugin-proposal-async-generator-functions" "^7.18.10" + "@babel/plugin-proposal-async-generator-functions" "^7.20.1" "@babel/plugin-proposal-class-properties" "^7.18.6" "@babel/plugin-proposal-class-static-block" "^7.18.6" "@babel/plugin-proposal-dynamic-import" "^7.18.6" @@ -2043,7 +1372,7 @@ "@babel/plugin-proposal-logical-assignment-operators" "^7.18.9" "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" "@babel/plugin-proposal-numeric-separator" "^7.18.6" - "@babel/plugin-proposal-object-rest-spread" "^7.18.9" + "@babel/plugin-proposal-object-rest-spread" "^7.20.2" "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" "@babel/plugin-proposal-optional-chaining" "^7.18.9" "@babel/plugin-proposal-private-methods" "^7.18.6" @@ -2054,7 +1383,7 @@ "@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.18.6" + "@babel/plugin-syntax-import-assertions" "^7.20.0" "@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" @@ -2067,10 +1396,10 @@ "@babel/plugin-transform-arrow-functions" "^7.18.6" "@babel/plugin-transform-async-to-generator" "^7.18.6" "@babel/plugin-transform-block-scoped-functions" "^7.18.6" - "@babel/plugin-transform-block-scoping" "^7.18.9" - "@babel/plugin-transform-classes" "^7.18.9" + "@babel/plugin-transform-block-scoping" "^7.20.2" + "@babel/plugin-transform-classes" "^7.20.2" "@babel/plugin-transform-computed-properties" "^7.18.9" - "@babel/plugin-transform-destructuring" "^7.18.9" + "@babel/plugin-transform-destructuring" "^7.20.2" "@babel/plugin-transform-dotall-regex" "^7.18.6" "@babel/plugin-transform-duplicate-keys" "^7.18.9" "@babel/plugin-transform-exponentiation-operator" "^7.18.6" @@ -2078,64 +1407,65 @@ "@babel/plugin-transform-function-name" "^7.18.9" "@babel/plugin-transform-literals" "^7.18.9" "@babel/plugin-transform-member-expression-literals" "^7.18.6" - "@babel/plugin-transform-modules-amd" "^7.18.6" - "@babel/plugin-transform-modules-commonjs" "^7.18.6" - "@babel/plugin-transform-modules-systemjs" "^7.18.9" + "@babel/plugin-transform-modules-amd" "^7.19.6" + "@babel/plugin-transform-modules-commonjs" "^7.19.6" + "@babel/plugin-transform-modules-systemjs" "^7.19.6" "@babel/plugin-transform-modules-umd" "^7.18.6" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.18.6" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.19.1" "@babel/plugin-transform-new-target" "^7.18.6" "@babel/plugin-transform-object-super" "^7.18.6" - "@babel/plugin-transform-parameters" "^7.18.8" + "@babel/plugin-transform-parameters" "^7.20.1" "@babel/plugin-transform-property-literals" "^7.18.6" "@babel/plugin-transform-regenerator" "^7.18.6" "@babel/plugin-transform-reserved-words" "^7.18.6" "@babel/plugin-transform-shorthand-properties" "^7.18.6" - "@babel/plugin-transform-spread" "^7.18.9" + "@babel/plugin-transform-spread" "^7.19.0" "@babel/plugin-transform-sticky-regex" "^7.18.6" "@babel/plugin-transform-template-literals" "^7.18.9" "@babel/plugin-transform-typeof-symbol" "^7.18.9" "@babel/plugin-transform-unicode-escapes" "^7.18.10" "@babel/plugin-transform-unicode-regex" "^7.18.6" "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.18.10" - babel-plugin-polyfill-corejs2 "^0.3.2" - babel-plugin-polyfill-corejs3 "^0.5.3" - babel-plugin-polyfill-regenerator "^0.4.0" - core-js-compat "^3.22.1" + "@babel/types" "^7.20.2" + babel-plugin-polyfill-corejs2 "^0.3.3" + babel-plugin-polyfill-corejs3 "^0.6.0" + babel-plugin-polyfill-regenerator "^0.4.1" + core-js-compat "^3.25.1" semver "^6.3.0" -"@babel/preset-env@^7.0.0", "@babel/preset-env@^7.12.11": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.18.2.tgz#f47d3000a098617926e674c945d95a28cb90977a" - integrity sha512-PfpdxotV6afmXMU47S08F9ZKIm2bJIQ0YbAAtDfIENX7G1NUAXigLREh69CWDjtgUy7dYn7bsMzkgdtAlmS68Q== - dependencies: - "@babel/compat-data" "^7.17.10" - "@babel/helper-compilation-targets" "^7.18.2" - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-validator-option" "^7.16.7" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.17.12" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.17.12" - "@babel/plugin-proposal-async-generator-functions" "^7.17.12" - "@babel/plugin-proposal-class-properties" "^7.17.12" - "@babel/plugin-proposal-class-static-block" "^7.18.0" - "@babel/plugin-proposal-dynamic-import" "^7.16.7" - "@babel/plugin-proposal-export-namespace-from" "^7.17.12" - "@babel/plugin-proposal-json-strings" "^7.17.12" - "@babel/plugin-proposal-logical-assignment-operators" "^7.17.12" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.17.12" - "@babel/plugin-proposal-numeric-separator" "^7.16.7" - "@babel/plugin-proposal-object-rest-spread" "^7.18.0" - "@babel/plugin-proposal-optional-catch-binding" "^7.16.7" - "@babel/plugin-proposal-optional-chaining" "^7.17.12" - "@babel/plugin-proposal-private-methods" "^7.17.12" - "@babel/plugin-proposal-private-property-in-object" "^7.17.12" - "@babel/plugin-proposal-unicode-property-regex" "^7.17.12" +"@babel/preset-env@^7.15.0", "@babel/preset-env@^7.20.2", "@babel/preset-env@~7.21.0": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.21.5.tgz#db2089d99efd2297716f018aeead815ac3decffb" + integrity sha512-wH00QnTTldTbf/IefEVyChtRdw5RJvODT/Vb4Vcxq1AZvtXj6T0YeX0cAcXhI6/BdGuiP3GcNIL4OQbI2DVNxg== + dependencies: + "@babel/compat-data" "^7.21.5" + "@babel/helper-compilation-targets" "^7.21.5" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-validator-option" "^7.21.0" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.20.7" + "@babel/plugin-proposal-async-generator-functions" "^7.20.7" + "@babel/plugin-proposal-class-properties" "^7.18.6" + "@babel/plugin-proposal-class-static-block" "^7.21.0" + "@babel/plugin-proposal-dynamic-import" "^7.18.6" + "@babel/plugin-proposal-export-namespace-from" "^7.18.9" + "@babel/plugin-proposal-json-strings" "^7.18.6" + "@babel/plugin-proposal-logical-assignment-operators" "^7.20.7" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" + "@babel/plugin-proposal-numeric-separator" "^7.18.6" + "@babel/plugin-proposal-object-rest-spread" "^7.20.7" + "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" + "@babel/plugin-proposal-optional-chaining" "^7.21.0" + "@babel/plugin-proposal-private-methods" "^7.18.6" + "@babel/plugin-proposal-private-property-in-object" "^7.21.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" "@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.17.12" + "@babel/plugin-syntax-import-assertions" "^7.20.0" + "@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" @@ -2145,46 +1475,55 @@ "@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-transform-arrow-functions" "^7.17.12" - "@babel/plugin-transform-async-to-generator" "^7.17.12" - "@babel/plugin-transform-block-scoped-functions" "^7.16.7" - "@babel/plugin-transform-block-scoping" "^7.17.12" - "@babel/plugin-transform-classes" "^7.17.12" - "@babel/plugin-transform-computed-properties" "^7.17.12" - "@babel/plugin-transform-destructuring" "^7.18.0" - "@babel/plugin-transform-dotall-regex" "^7.16.7" - "@babel/plugin-transform-duplicate-keys" "^7.17.12" - "@babel/plugin-transform-exponentiation-operator" "^7.16.7" - "@babel/plugin-transform-for-of" "^7.18.1" - "@babel/plugin-transform-function-name" "^7.16.7" - "@babel/plugin-transform-literals" "^7.17.12" - "@babel/plugin-transform-member-expression-literals" "^7.16.7" - "@babel/plugin-transform-modules-amd" "^7.18.0" - "@babel/plugin-transform-modules-commonjs" "^7.18.2" - "@babel/plugin-transform-modules-systemjs" "^7.18.0" - "@babel/plugin-transform-modules-umd" "^7.18.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.17.12" - "@babel/plugin-transform-new-target" "^7.17.12" - "@babel/plugin-transform-object-super" "^7.16.7" - "@babel/plugin-transform-parameters" "^7.17.12" - "@babel/plugin-transform-property-literals" "^7.16.7" - "@babel/plugin-transform-regenerator" "^7.18.0" - "@babel/plugin-transform-reserved-words" "^7.17.12" - "@babel/plugin-transform-shorthand-properties" "^7.16.7" - "@babel/plugin-transform-spread" "^7.17.12" - "@babel/plugin-transform-sticky-regex" "^7.16.7" - "@babel/plugin-transform-template-literals" "^7.18.2" - "@babel/plugin-transform-typeof-symbol" "^7.17.12" - "@babel/plugin-transform-unicode-escapes" "^7.16.7" - "@babel/plugin-transform-unicode-regex" "^7.16.7" + "@babel/plugin-transform-arrow-functions" "^7.21.5" + "@babel/plugin-transform-async-to-generator" "^7.20.7" + "@babel/plugin-transform-block-scoped-functions" "^7.18.6" + "@babel/plugin-transform-block-scoping" "^7.21.0" + "@babel/plugin-transform-classes" "^7.21.0" + "@babel/plugin-transform-computed-properties" "^7.21.5" + "@babel/plugin-transform-destructuring" "^7.21.3" + "@babel/plugin-transform-dotall-regex" "^7.18.6" + "@babel/plugin-transform-duplicate-keys" "^7.18.9" + "@babel/plugin-transform-exponentiation-operator" "^7.18.6" + "@babel/plugin-transform-for-of" "^7.21.5" + "@babel/plugin-transform-function-name" "^7.18.9" + "@babel/plugin-transform-literals" "^7.18.9" + "@babel/plugin-transform-member-expression-literals" "^7.18.6" + "@babel/plugin-transform-modules-amd" "^7.20.11" + "@babel/plugin-transform-modules-commonjs" "^7.21.5" + "@babel/plugin-transform-modules-systemjs" "^7.20.11" + "@babel/plugin-transform-modules-umd" "^7.18.6" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.20.5" + "@babel/plugin-transform-new-target" "^7.18.6" + "@babel/plugin-transform-object-super" "^7.18.6" + "@babel/plugin-transform-parameters" "^7.21.3" + "@babel/plugin-transform-property-literals" "^7.18.6" + "@babel/plugin-transform-regenerator" "^7.21.5" + "@babel/plugin-transform-reserved-words" "^7.18.6" + "@babel/plugin-transform-shorthand-properties" "^7.18.6" + "@babel/plugin-transform-spread" "^7.20.7" + "@babel/plugin-transform-sticky-regex" "^7.18.6" + "@babel/plugin-transform-template-literals" "^7.18.9" + "@babel/plugin-transform-typeof-symbol" "^7.18.9" + "@babel/plugin-transform-unicode-escapes" "^7.21.5" + "@babel/plugin-transform-unicode-regex" "^7.18.6" "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.18.2" - babel-plugin-polyfill-corejs2 "^0.3.0" - babel-plugin-polyfill-corejs3 "^0.5.0" - babel-plugin-polyfill-regenerator "^0.3.0" - core-js-compat "^3.22.1" + "@babel/types" "^7.21.5" + babel-plugin-polyfill-corejs2 "^0.3.3" + babel-plugin-polyfill-corejs3 "^0.6.0" + babel-plugin-polyfill-regenerator "^0.4.1" + core-js-compat "^3.25.1" semver "^6.3.0" +"@babel/preset-flow@^7.13.13": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.21.4.tgz#a5de2a1cafa61f0e0b3af9b30ff0295d38d3608f" + integrity sha512-F24cSq4DIBmhq4OzK3dE63NHagb27OPE3eWR+HLekt4Z3Y5MzIIUGF3LlLgV0gN8vzbDViSY7HnrReNVCJXTeA== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-validator-option" "^7.21.0" + "@babel/plugin-transform-flow-strip-types" "^7.21.0" + "@babel/preset-modules@^0.1.5": version "0.1.5" resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" @@ -2196,31 +1535,21 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/preset-react@^7.12.10": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.17.12.tgz#62adbd2d1870c0de3893095757ed5b00b492ab3d" - integrity sha512-h5U+rwreXtZaRBEQhW1hOJLMq8XNJBQ/9oymXiCXTuT/0uOwpbT0gUt+sXeOqoXBgNuUKI7TaObVwoEyWkpFgA== +"@babel/preset-typescript@^7.13.0", "@babel/preset-typescript@^7.15.0": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.21.5.tgz#68292c884b0e26070b4d66b202072d391358395f" + integrity sha512-iqe3sETat5EOrORXiQ6rWfoOg2y68Cs75B9wNxdPW4kixJxh7aXQE1KPdWLDniC24T/6dSnguF33W9j/ZZQcmA== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-validator-option" "^7.16.7" - "@babel/plugin-transform-react-display-name" "^7.16.7" - "@babel/plugin-transform-react-jsx" "^7.17.12" - "@babel/plugin-transform-react-jsx-development" "^7.16.7" - "@babel/plugin-transform-react-pure-annotations" "^7.16.7" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-validator-option" "^7.21.0" + "@babel/plugin-syntax-jsx" "^7.21.4" + "@babel/plugin-transform-modules-commonjs" "^7.21.5" + "@babel/plugin-transform-typescript" "^7.21.3" -"@babel/preset-typescript@^7.12.7": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.17.12.tgz#40269e0a0084d56fc5731b6c40febe1c9a4a3e8c" - integrity sha512-S1ViF8W2QwAKUGJXxP9NAfNaqGDdEBJKpYkxHf5Yy2C4NPPzXGeR3Lhk7G8xJaaLcFTRfNjVbtbVtm8Gb0mqvg== - dependencies: - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-validator-option" "^7.16.7" - "@babel/plugin-transform-typescript" "^7.17.12" - -"@babel/register@^7.12.1": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.17.7.tgz#5eef3e0f4afc07e25e847720e7b987ae33f08d0b" - integrity sha512-fg56SwvXRifootQEDQAu1mKdjh5uthPzdO0N6t358FktfL4XjAVXuH58ULoiW8mesxiOgNIrxiImqEwv0+hRRA== +"@babel/register@^7.13.16": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.21.0.tgz#c97bf56c2472e063774f31d344c592ebdcefa132" + integrity sha512-9nKsPmYDi5DidAqJaQooxIhsLJiNMkGr8ypQ8Uic7cIox7UCDsM7HuUGxdGT7mSDTYbqzIdsOWzfBton/YJrMw== dependencies: clone-deep "^4.0.1" find-cache-dir "^2.0.0" @@ -2228,118 +1557,57 @@ pirates "^4.0.5" source-map-support "^0.5.16" -"@babel/runtime@7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.9.tgz#b4fcfce55db3d2e5e080d2490f608a3b9f407f4a" - integrity sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw== - dependencies: - regenerator-runtime "^0.13.4" +"@babel/regjsgen@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" + integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/runtime@^7.0.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.17.8", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.0", "@babel/runtime@^7.8.4": - version "7.18.3" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.3.tgz#c7b654b57f6f63cf7f8b418ac9ca04408c4579f4" - integrity sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug== +"@babel/runtime@7.20.13": + version "7.20.13" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.13.tgz#7055ab8a7cff2b8f6058bf6ae45ff84ad2aded4b" + integrity sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA== dependencies: - regenerator-runtime "^0.13.4" + regenerator-runtime "^0.13.11" -"@babel/template@7.18.10", "@babel/template@^7.18.10": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" - integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== +"@babel/runtime@^7.14.8", "@babel/runtime@^7.17.8", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.5.tgz#8492dddda9644ae3bda3b45eabe87382caee7200" + integrity sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q== dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.18.10" - "@babel/types" "^7.18.10" + regenerator-runtime "^0.13.11" -"@babel/template@^7.12.7", "@babel/template@^7.16.7", "@babel/template@^7.3.3": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" - integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/parser" "^7.16.7" - "@babel/types" "^7.16.7" - -"@babel/template@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.6.tgz#1283f4993e00b929d6e2d3c72fdc9168a2977a31" - integrity sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw== +"@babel/template@7.20.7", "@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.3.3": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" + integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== dependencies: "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.18.6" - "@babel/types" "^7.18.6" - -"@babel/traverse@^7.0.0-beta.54", "@babel/traverse@^7.12.11", "@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.8", "@babel/traverse@^7.18.0", "@babel/traverse@^7.18.2", "@babel/traverse@^7.18.5", "@babel/traverse@^7.7.2": - version "7.18.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.5.tgz#94a8195ad9642801837988ab77f36e992d9a20cd" - integrity sha512-aKXj1KT66sBj0vVzk6rEeAO6Z9aiiQ68wfDgge3nHhA/my6xMM/7HGQUNumKZaoa2qUPQ5whJG9aAifsxUKfLA== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.18.2" - "@babel/helper-environment-visitor" "^7.18.2" - "@babel/helper-function-name" "^7.17.9" - "@babel/helper-hoist-variables" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/parser" "^7.18.5" - "@babel/types" "^7.18.4" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/traverse@^7.18.10", "@babel/traverse@^7.18.13": - version "7.18.13" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.13.tgz#5ab59ef51a997b3f10c4587d648b9696b6cb1a68" - integrity sha512-N6kt9X1jRMLPxxxPYWi7tgvJRH/rtoU+dbKAPDM44RFHiMH8igdsaSBgFeskhSl/kLWLDUvIh1RXCrTmg0/zvA== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.18.13" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + +"@babel/traverse@^7.0.0-beta.54", "@babel/traverse@^7.16.0", "@babel/traverse@^7.19.3", "@babel/traverse@^7.20.12", "@babel/traverse@^7.20.5", "@babel/traverse@^7.21.5", "@babel/traverse@^7.7.2", "@babel/traverse@~7.21.2": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.5.tgz#ad22361d352a5154b498299d523cf72998a4b133" + integrity sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw== + dependencies: + "@babel/code-frame" "^7.21.4" + "@babel/generator" "^7.21.5" + "@babel/helper-environment-visitor" "^7.21.5" + "@babel/helper-function-name" "^7.21.0" "@babel/helper-hoist-variables" "^7.18.6" "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.18.13" - "@babel/types" "^7.18.13" + "@babel/parser" "^7.21.5" + "@babel/types" "^7.21.5" debug "^4.1.0" globals "^11.1.0" -"@babel/traverse@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.9.tgz#deeff3e8f1bad9786874cb2feda7a2d77a904f98" - integrity sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg== +"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.54", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.3", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.4", "@babel/types@^7.21.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@~7.21.2": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.5.tgz#18dfbd47c39d3904d5db3d3dc2cc80bedb60e5b6" + integrity sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q== dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.18.9" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.18.9" - "@babel/types" "^7.18.9" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.54", "@babel/types@^7.12.11", "@babel/types@^7.12.7", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.17.12", "@babel/types@^7.18.0", "@babel/types@^7.18.2", "@babel/types@^7.18.4", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.18.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.4.tgz#27eae9b9fd18e9dccc3f9d6ad051336f307be354" - integrity sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw== - dependencies: - "@babel/helper-validator-identifier" "^7.16.7" - to-fast-properties "^2.0.0" - -"@babel/types@^7.18.10", "@babel/types@^7.18.13": - version "7.18.13" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.13.tgz#30aeb9e514f4100f7c1cb6e5ba472b30e48f519a" - integrity sha512-ePqfTihzW0W6XAU+aMw2ykilisStJfDnsejDCXRchCcMJ4O0+8DhPXf2YUbZ6wjBlsEmZwLK/sPweWtu8hcJYQ== - dependencies: - "@babel/helper-string-parser" "^7.18.10" - "@babel/helper-validator-identifier" "^7.18.6" - to-fast-properties "^2.0.0" - -"@babel/types@^7.18.6", "@babel/types@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.9.tgz#7148d64ba133d8d73a41b3172ac4b83a1452205f" - integrity sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg== - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" + "@babel/helper-string-parser" "^7.21.5" + "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": @@ -2348,22 +1616,14 @@ integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== "@braintree/sanitize-url@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-6.0.0.tgz#fe364f025ba74f6de6c837a84ef44bdb1d61e68f" - integrity sha512-mgmE7XBYY/21erpzhexk4Cj1cyTQ9LzvnTxtzM17BJ7ERMNE6W72mQRo0I1Ud8eFJ+RVVIcBNhLFZ3GX4XFz5w== + version "6.0.2" + resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-6.0.2.tgz#6110f918d273fe2af8ea1c4398a88774bb9fc12f" + integrity sha512-Tbsj02wXCbqGmzdnXNk0SOF19ChhRU70BsroIi4Pm6Ehp56in6vch94mfbdQ17DozxkL3BAVjbZ4Qc1a0HFRAg== -"@cnakazawa/watch@^1.0.3": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" - integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ== - dependencies: - exec-sh "^0.3.2" - minimist "^1.2.0" - -"@codewithdan/observable-store@2.2.11": - version "2.2.11" - resolved "https://registry.yarnpkg.com/@codewithdan/observable-store/-/observable-store-2.2.11.tgz#f5a168e86a2fa185a50ca40a1e838aa5e5fb007d" - integrity sha512-6CfqLJUqV0SwS4yE+9vciqxHUJ6CqIptSXXzFw80MonCDoVJvCJ/xhKfs7VZqJ4jDtEu/7ILvovFtZdLg9fiAg== +"@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" + integrity sha512-LVCSMZzTCvoDo5n7YDmtIIEhTmvJ8O21k36Vwu/A4kumdXQ1YVs4sKoSK3vlINZPL4AYY2MRsBVtvre4QIETFw== "@colors/colors@1.5.0": version "1.5.0" @@ -2377,122 +1637,6 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" -"@csstools/postcss-cascade-layers@^1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.0.5.tgz#f16f2c4396ace855541e1aa693f5f27ec972e6ad" - integrity sha512-Id/9wBT7FkgFzdEpiEWrsVd4ltDxN0rI0QS0SChbeQiSuux3z21SJCRLu6h2cvCEUmaRi+VD0mHFj+GJD4GFnw== - dependencies: - "@csstools/selector-specificity" "^2.0.2" - postcss-selector-parser "^6.0.10" - -"@csstools/postcss-color-function@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz#2bd36ab34f82d0497cfacdc9b18d34b5e6f64b6b" - integrity sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw== - dependencies: - "@csstools/postcss-progressive-custom-properties" "^1.1.0" - postcss-value-parser "^4.2.0" - -"@csstools/postcss-font-format-keywords@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz#677b34e9e88ae997a67283311657973150e8b16a" - integrity sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg== - dependencies: - postcss-value-parser "^4.2.0" - -"@csstools/postcss-hwb-function@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz#ab54a9fce0ac102c754854769962f2422ae8aa8b" - integrity sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w== - dependencies: - postcss-value-parser "^4.2.0" - -"@csstools/postcss-ic-unit@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz#28237d812a124d1a16a5acc5c3832b040b303e58" - integrity sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw== - dependencies: - "@csstools/postcss-progressive-custom-properties" "^1.1.0" - postcss-value-parser "^4.2.0" - -"@csstools/postcss-is-pseudo-class@^2.0.7": - version "2.0.7" - resolved "https://registry.yarnpkg.com/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz#846ae6c0d5a1eaa878fce352c544f9c295509cd1" - integrity sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA== - dependencies: - "@csstools/selector-specificity" "^2.0.0" - postcss-selector-parser "^6.0.10" - -"@csstools/postcss-nested-calc@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz#d7e9d1d0d3d15cf5ac891b16028af2a1044d0c26" - integrity sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ== - dependencies: - postcss-value-parser "^4.2.0" - -"@csstools/postcss-normalize-display-values@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz#15da54a36e867b3ac5163ee12c1d7f82d4d612c3" - integrity sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw== - dependencies: - postcss-value-parser "^4.2.0" - -"@csstools/postcss-oklab-function@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz#88cee0fbc8d6df27079ebd2fa016ee261eecf844" - integrity sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA== - dependencies: - "@csstools/postcss-progressive-custom-properties" "^1.1.0" - postcss-value-parser "^4.2.0" - -"@csstools/postcss-progressive-custom-properties@^1.1.0", "@csstools/postcss-progressive-custom-properties@^1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz#542292558384361776b45c85226b9a3a34f276fa" - integrity sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA== - dependencies: - postcss-value-parser "^4.2.0" - -"@csstools/postcss-stepped-value-functions@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz#f8772c3681cc2befed695e2b0b1d68e22f08c4f4" - integrity sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ== - dependencies: - postcss-value-parser "^4.2.0" - -"@csstools/postcss-text-decoration-shorthand@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz#ea96cfbc87d921eca914d3ad29340d9bcc4c953f" - integrity sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw== - dependencies: - postcss-value-parser "^4.2.0" - -"@csstools/postcss-trigonometric-functions@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz#94d3e4774c36d35dcdc88ce091336cb770d32756" - integrity sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og== - dependencies: - postcss-value-parser "^4.2.0" - -"@csstools/postcss-unset-value@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz#c99bb70e2cdc7312948d1eb41df2412330b81f77" - integrity sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g== - -"@csstools/selector-specificity@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-2.0.1.tgz#b6b8d81780b9a9f6459f4bfe9226ac6aefaefe87" - integrity sha512-aG20vknL4/YjQF9BSV7ts4EWm/yrjagAN7OWBNmlbEOUiu0llj4OGrFoOKK3g2vey4/p2omKCoHrWtPxSwV3HA== - -"@csstools/selector-specificity@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz#1bfafe4b7ed0f3e4105837e056e0a89b108ebe36" - integrity sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg== - -"@ctrl/tinycolor@^3.4.0": - version "3.4.1" - resolved "https://registry.yarnpkg.com/@ctrl/tinycolor/-/tinycolor-3.4.1.tgz#75b4c27948c81e88ccd3a8902047bcd797f38d32" - integrity sha512-ej5oVy6lykXsvieQtqZxCOaLT+xD4+QNarq78cIYISHmZXshCvROLudpQN3lfL8G0NL7plMSSK+zlyvCaIJ4Iw== - "@cypress/listr-verbose-renderer@^0.4.1": version "0.4.1" resolved "https://registry.yarnpkg.com/@cypress/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz#a77492f4b11dcc7c446a34b3e28721afd33c642a" @@ -2504,9 +1648,9 @@ figures "^1.7.0" "@cypress/request@^2.88.5": - version "2.88.10" - resolved "https://registry.yarnpkg.com/@cypress/request/-/request-2.88.10.tgz#b66d76b07f860d3a4b8d7a0604d020c662752cce" - integrity sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg== + version "2.88.11" + resolved "https://registry.yarnpkg.com/@cypress/request/-/request-2.88.11.tgz#5a4c7399bc2d7e7ed56e92ce5acb620c8b187047" + integrity sha512-M83/wfQ1EkspjkE2lNWNV5ui2Cv7UCv1swW1DqljahbzLVWltcsexQh8jYtuS/vzFXP+HySntGM83ZXA9fn17w== dependencies: aws-sign2 "~0.7.0" aws4 "^1.8.0" @@ -2521,21 +1665,12 @@ json-stringify-safe "~5.0.1" mime-types "~2.1.19" performance-now "^2.1.0" - qs "~6.5.2" + qs "~6.10.3" safe-buffer "^5.1.2" tough-cookie "~2.5.0" tunnel-agent "^0.6.0" uuid "^8.3.2" -"@cypress/webpack-preprocessor@^5.12.0": - version "5.12.0" - resolved "https://registry.yarnpkg.com/@cypress/webpack-preprocessor/-/webpack-preprocessor-5.12.0.tgz#231f6c86423237e17eaf12ce6193d4b67290b852" - integrity sha512-D/eLKKlgx6c/307FaCmjZGjFA64G29aA8KcCy6WqpNK/bSnRdPquMW2plemIsT/B80TK2DDKzZX/H3FcS41ZDA== - dependencies: - bluebird "3.7.1" - debug "^4.3.2" - lodash "^4.17.20" - "@cypress/xvfb@^1.2.4": version "1.2.4" resolved "https://registry.yarnpkg.com/@cypress/xvfb/-/xvfb-1.2.4.tgz#2daf42e8275b39f4aa53c14214e557bd14e7748a" @@ -2544,47 +1679,48 @@ debug "^3.1.0" lodash.once "^4.1.1" -"@dfinity/agent@0.12.1": - version "0.12.1" - resolved "https://registry.yarnpkg.com/@dfinity/agent/-/agent-0.12.1.tgz#c3acd6419712aca77bf94f76057f100caeb69be4" - integrity sha512-/KSKh248k4pjzvqCzIgYNNi3pTv+DBZ40+QiTBQeFzp6VEg3gfSv5bK2UwC0Plq9xwk7TeeeGLiTv6DI3RjCOQ== +"@dfinity/agent@0.15.7": + version "0.15.7" + resolved "https://registry.yarnpkg.com/@dfinity/agent/-/agent-0.15.7.tgz#e31261bc22504219cdf0e760bf396db642150a4a" + integrity sha512-w34yvlUTpPBG8nLOD0t/ao3k2xonOFq4QGvfJ1HiS/nIggdza/3xC3nLBszGrjVYWj1jqu8BLFvQXCAeWin75A== dependencies: base64-arraybuffer "^0.2.0" bignumber.js "^9.0.0" borc "^2.1.1" js-sha256 "0.9.0" simple-cbor "^0.4.1" + ts-node "^10.8.2" -"@dfinity/auth-client@0.12.1": - version "0.12.1" - resolved "https://registry.yarnpkg.com/@dfinity/auth-client/-/auth-client-0.12.1.tgz#8043aeafe8ba8a000954f94de25a76a2565acafc" - integrity sha512-iZKSVjk9K+35jp+AY3QfGAv0jBfn5LZTwpSXgBKVqZCez3GRniGJirJVTvk7t9yOj4BXN8tuvjIKxTsezPpgLQ== - -"@dfinity/authentication@0.12.1": - version "0.12.1" - resolved "https://registry.yarnpkg.com/@dfinity/authentication/-/authentication-0.12.1.tgz#19f157e6eb528518da874f3e10d3f7b2b028e5a4" - integrity sha512-krHR48HNqTOp2NwHoKHirTUXHDfHttWZfSmwBCsQa0xwWkrrLSGb3u+9e1oQjDK1G1eK2TP7T1W2duZmmmrZkg== +"@dfinity/auth-client@0.15.7": + version "0.15.7" + resolved "https://registry.yarnpkg.com/@dfinity/auth-client/-/auth-client-0.15.7.tgz#cbecc9e29b2096f56426656b1f6f3c9e1a622f3e" + integrity sha512-f6cRqXayCf+7+9gNcDnAZZwJrgBYKIzfxjxeRLlpsueQeo+E/BX2yVSANxzTkCNc4U3p+ttHI1RNtasLunYTcA== + dependencies: + idb "^7.0.2" -"@dfinity/candid@0.12.1": - version "0.12.1" - resolved "https://registry.yarnpkg.com/@dfinity/candid/-/candid-0.12.1.tgz#6ba819c56bc3ff55f6f98bdb39470d1d385084b6" - integrity sha512-YX8jfyy/8Qmz4f1mbjqXUqOmtYcGru1gfYWxlRhKFSkeLH0VeZkfPEmD6EQ25k+18ATPk83MQiZnu0b6AWxBUw== +"@dfinity/candid@0.15.7": + version "0.15.7" + resolved "https://registry.yarnpkg.com/@dfinity/candid/-/candid-0.15.7.tgz#c395d0fa353c4df653edd0aaebc9ff1f253cc5ba" + integrity sha512-lTcjK/xrSyT7wvUQ2pApG+yklQAwxaofQ04D1IWv0/8gKbY0eUbh8G2w6+CypJ15Hb1CH24ijUj8nWdeX/z3jg== + dependencies: + ts-node "^10.8.2" -"@dfinity/identity@0.12.1": - version "0.12.1" - resolved "https://registry.yarnpkg.com/@dfinity/identity/-/identity-0.12.1.tgz#f19bf2ed6bfbbb1f4e7c859c039e4da8dee81857" - integrity sha512-FNrjV4/gG9PjQfGLIoH1DycqSAMaoTZCxB+cSVJRFCvGQKc3F3kn5tj6rIv9LV+NNV1f1qfmTXE8rYsMCmEecg== +"@dfinity/identity@0.15.7": + version "0.15.7" + resolved "https://registry.yarnpkg.com/@dfinity/identity/-/identity-0.15.7.tgz#af8bf3f8e69f22e3cee08abb3a33851a6bc07c92" + integrity sha512-kBAkx9wq78jSQf6T5aayLyWm8YgtOZw8bW6+OuzX6tR3hkAEa85A9TcKA7BjkmMWSIskjEDVQub4fFfKWS2vOQ== dependencies: - "@types/webappsec-credential-management" "^0.6.2" borc "^2.1.1" js-sha256 "^0.9.0" - secp256k1 "^4.0.2" tweetnacl "^1.0.1" -"@dfinity/principal@0.12.1": - version "0.12.1" - resolved "https://registry.yarnpkg.com/@dfinity/principal/-/principal-0.12.1.tgz#d4b1f088beded6c1f1b2efbe68a0632e0b4018f7" - integrity sha512-aL5y0mpzRex6LRSc4LUZyhn2GTFfHyxkakkOZxEM7+ecz8HsKKK+mSo78gL1TCso2QkCL4BqZzxnoIxxKqM1cw== +"@dfinity/principal@0.15.7": + version "0.15.7" + resolved "https://registry.yarnpkg.com/@dfinity/principal/-/principal-0.15.7.tgz#311cf1072d6fd64b9b91476dda4d3ef5ddfcefea" + integrity sha512-6/AkYzpGEH6Jw/0+B/EeeQn+5u2GDDvRLt1kQPhIG4txQYFnOy04H3VvyrymmfAj6/CXUgrOrux6OxgYSLYVJg== + dependencies: + js-sha256 "^0.9.0" + ts-node "^10.8.2" "@dinero.js/currencies@2.0.0-alpha.8": version "2.0.0-alpha.8" @@ -2596,50 +1732,299 @@ resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== -"@esbuild/linux-loong64@0.15.5": - version "0.15.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.5.tgz#91aef76d332cdc7c8942b600fa2307f3387e6f82" - integrity sha512-UHkDFCfSGTuXq08oQltXxSZmH1TXyWsL+4QhZDWvvLl6mEJQqk3u7/wq1LjhrrAXYIllaTtRSzUXl4Olkf2J8A== - -"@esbuild/linux-loong64@0.15.6": - version "0.15.6" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.6.tgz#45be4184f00e505411bc265a05e709764114acd8" - integrity sha512-hqmVU2mUjH6J2ZivHphJ/Pdse2ZD+uGCHK0uvsiLDk/JnSedEVj77CiVUnbMKuU4tih1TZZL8tG9DExQg/GZsw== +"@emotion/use-insertion-effect-with-fallbacks@^1.0.0": + version "1.0.1" + 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/android-arm64@0.17.18": + version "0.17.18" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.18.tgz#4aa8d8afcffb4458736ca9b32baa97d7cb5861ea" + integrity sha512-/iq0aK0eeHgSC3z55ucMAHO05OIqmQehiGay8eP5l/5l+iEr4EIbh4/MI8xD9qRFjqzgkc0JkX0LculNC9mXBw== + +"@esbuild/android-arm64@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.8.tgz#b3d5b65a3b2e073a6c7ee36b1f3c30c8f000315b" + integrity sha512-oa/N5j6v1svZQs7EIRPqR8f+Bf8g6HBDjD/xHC02radE/NjKHK7oQmtmLxPs1iVwYyvE+Kolo6lbpfEQ9xnhxQ== + +"@esbuild/android-arm@0.17.18": + version "0.17.18" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.17.18.tgz#74a7e95af4ee212ebc9db9baa87c06a594f2a427" + integrity sha512-EmwL+vUBZJ7mhFCs5lA4ZimpUH3WMAoqvOIYhVQwdIgSpHC8ImHdsRyhHAVxpDYUSm0lWvd63z0XH1IlImS2Qw== + +"@esbuild/android-arm@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.17.8.tgz#c41e496af541e175369d48164d0cf01a5f656cf6" + integrity sha512-0/rb91GYKhrtbeglJXOhAv9RuYimgI8h623TplY2X+vA4EXnk3Zj1fXZreJ0J3OJJu1bwmb0W7g+2cT/d8/l/w== + +"@esbuild/android-x64@0.17.18": + version "0.17.18" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.17.18.tgz#1dcd13f201997c9fe0b204189d3a0da4eb4eb9b6" + integrity sha512-x+0efYNBF3NPW2Xc5bFOSFW7tTXdAcpfEg2nXmxegm4mJuVeS+i109m/7HMiOQ6M12aVGGFlqJX3RhNdYM2lWg== + +"@esbuild/android-x64@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.17.8.tgz#080fa67c29be77f5a3ca5ee4cc78d5bf927e3a3b" + integrity sha512-bTliMLqD7pTOoPg4zZkXqCDuzIUguEWLpeqkNfC41ODBHwoUgZ2w5JBeYimv4oP6TDVocoYmEhZrCLQTrH89bg== + +"@esbuild/darwin-arm64@0.17.18": + version "0.17.18" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.17.18.tgz#444f3b961d4da7a89eb9bd35cfa4415141537c2a" + integrity sha512-6tY+djEAdF48M1ONWnQb1C+6LiXrKjmqjzPNPWXhu/GzOHTHX2nh8Mo2ZAmBFg0kIodHhciEgUBtcYCAIjGbjQ== + +"@esbuild/darwin-arm64@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.17.8.tgz#053622bf9a82f43d5c075b7818e02618f7b4a397" + integrity sha512-ghAbV3ia2zybEefXRRm7+lx8J/rnupZT0gp9CaGy/3iolEXkJ6LYRq4IpQVI9zR97ID80KJVoUlo3LSeA/sMAg== + +"@esbuild/darwin-x64@0.17.18": + version "0.17.18" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.17.18.tgz#a6da308d0ac8a498c54d62e0b2bfb7119b22d315" + integrity sha512-Qq84ykvLvya3dO49wVC9FFCNUfSrQJLbxhoQk/TE1r6MjHo3sFF2tlJCwMjhkBVq3/ahUisj7+EpRSz0/+8+9A== + +"@esbuild/darwin-x64@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.17.8.tgz#8a1aadb358d537d8efad817bb1a5bff91b84734b" + integrity sha512-n5WOpyvZ9TIdv2V1K3/iIkkJeKmUpKaCTdun9buhGRWfH//osmUjlv4Z5mmWdPWind/VGcVxTHtLfLCOohsOXw== + +"@esbuild/freebsd-arm64@0.17.18": + version "0.17.18" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.18.tgz#b83122bb468889399d0d63475d5aea8d6829c2c2" + integrity sha512-fw/ZfxfAzuHfaQeMDhbzxp9mc+mHn1Y94VDHFHjGvt2Uxl10mT4CDavHm+/L9KG441t1QdABqkVYwakMUeyLRA== + +"@esbuild/freebsd-arm64@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.8.tgz#e6738d0081ba0721a5c6c674e84c6e7fcea61989" + integrity sha512-a/SATTaOhPIPFWvHZDoZYgxaZRVHn0/LX1fHLGfZ6C13JqFUZ3K6SMD6/HCtwOQ8HnsNaEeokdiDSFLuizqv5A== + +"@esbuild/freebsd-x64@0.17.18": + version "0.17.18" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.18.tgz#af59e0e03fcf7f221b34d4c5ab14094862c9c864" + integrity sha512-FQFbRtTaEi8ZBi/A6kxOC0V0E9B/97vPdYjY9NdawyLd4Qk5VD5g2pbWN2VR1c0xhzcJm74HWpObPszWC+qTew== + +"@esbuild/freebsd-x64@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.8.tgz#1855e562f2b730f4483f6e94086e9e2597feb4c3" + integrity sha512-xpFJb08dfXr5+rZc4E+ooZmayBW6R3q59daCpKZ/cDU96/kvDM+vkYzNeTJCGd8rtO6fHWMq5Rcv/1cY6p6/0Q== + +"@esbuild/linux-arm64@0.17.18": + version "0.17.18" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.17.18.tgz#8551d72ba540c5bce4bab274a81c14ed01eafdcf" + integrity sha512-R7pZvQZFOY2sxUG8P6A21eq6q+eBv7JPQYIybHVf1XkQYC+lT7nDBdC7wWKTrbvMXKRaGudp/dzZCwL/863mZQ== + +"@esbuild/linux-arm64@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.17.8.tgz#481da38952721a3fdb77c17a36ceaacc4270b5c5" + integrity sha512-v3iwDQuDljLTxpsqQDl3fl/yihjPAyOguxuloON9kFHYwopeJEf1BkDXODzYyXEI19gisEsQlG1bM65YqKSIww== + +"@esbuild/linux-arm@0.17.18": + version "0.17.18" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.17.18.tgz#e09e76e526df4f665d4d2720d28ff87d15cdf639" + integrity sha512-jW+UCM40LzHcouIaqv3e/oRs0JM76JfhHjCavPxMUti7VAPh8CaGSlS7cmyrdpzSk7A+8f0hiedHqr/LMnfijg== + +"@esbuild/linux-arm@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.17.8.tgz#18127072b270bb6321c6d11be20bfd30e0d6ad17" + integrity sha512-6Ij8gfuGszcEwZpi5jQIJCVIACLS8Tz2chnEBfYjlmMzVsfqBP1iGmHQPp7JSnZg5xxK9tjCc+pJ2WtAmPRFVA== + +"@esbuild/linux-ia32@0.17.18": + version "0.17.18" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.17.18.tgz#47878860ce4fe73a36fd8627f5647bcbbef38ba4" + integrity sha512-ygIMc3I7wxgXIxk6j3V00VlABIjq260i967Cp9BNAk5pOOpIXmd1RFQJQX9Io7KRsthDrQYrtcx7QCof4o3ZoQ== + +"@esbuild/linux-ia32@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.17.8.tgz#ee400af7b3bc69e8ca2e593ca35156ffb9abd54f" + integrity sha512-8svILYKhE5XetuFk/B6raFYIyIqydQi+GngEXJgdPdI7OMKUbSd7uzR02wSY4kb53xBrClLkhH4Xs8P61Q2BaA== + +"@esbuild/linux-loong64@0.17.18": + version "0.17.18" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.17.18.tgz#3f8fbf5267556fc387d20b2e708ce115de5c967a" + integrity sha512-bvPG+MyFs5ZlwYclCG1D744oHk1Pv7j8psF5TfYx7otCVmcJsEXgFEhQkbhNW8otDHL1a2KDINW20cfCgnzgMQ== + +"@esbuild/linux-loong64@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.17.8.tgz#8c509d8a454693d39824b83b3f66c400872fce82" + integrity sha512-B6FyMeRJeV0NpyEOYlm5qtQfxbdlgmiGdD+QsipzKfFky0K5HW5Td6dyK3L3ypu1eY4kOmo7wW0o94SBqlqBSA== + +"@esbuild/linux-mips64el@0.17.18": + version "0.17.18" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.18.tgz#9d896d8f3c75f6c226cbeb840127462e37738226" + integrity sha512-oVqckATOAGuiUOa6wr8TXaVPSa+6IwVJrGidmNZS1cZVx0HqkTMkqFGD2HIx9H1RvOwFeWYdaYbdY6B89KUMxA== + +"@esbuild/linux-mips64el@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.8.tgz#f2b0d36e63fb26bc3f95b203b6a80638292101ca" + integrity sha512-CCb67RKahNobjm/eeEqeD/oJfJlrWyw29fgiyB6vcgyq97YAf3gCOuP6qMShYSPXgnlZe/i4a8WFHBw6N8bYAA== + +"@esbuild/linux-ppc64@0.17.18": + version "0.17.18" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.18.tgz#3d9deb60b2d32c9985bdc3e3be090d30b7472783" + integrity sha512-3dLlQO+b/LnQNxgH4l9rqa2/IwRJVN9u/bK63FhOPB4xqiRqlQAU0qDU3JJuf0BmaH0yytTBdoSBHrb2jqc5qQ== + +"@esbuild/linux-ppc64@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.8.tgz#1e628be003e036e90423716028cc884fe5ba25bd" + integrity sha512-bytLJOi55y55+mGSdgwZ5qBm0K9WOCh0rx+vavVPx+gqLLhxtSFU0XbeYy/dsAAD6xECGEv4IQeFILaSS2auXw== + +"@esbuild/linux-riscv64@0.17.18": + version "0.17.18" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.18.tgz#8a943cf13fd24ff7ed58aefb940ef178f93386bc" + integrity sha512-/x7leOyDPjZV3TcsdfrSI107zItVnsX1q2nho7hbbQoKnmoeUWjs+08rKKt4AUXju7+3aRZSsKrJtaRmsdL1xA== + +"@esbuild/linux-riscv64@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.8.tgz#419a815cb4c3fb9f1b78ef5295f5b48b8bf6427a" + integrity sha512-2YpRyQJmKVBEHSBLa8kBAtbhucaclb6ex4wchfY0Tj3Kg39kpjeJ9vhRU7x4mUpq8ISLXRXH1L0dBYjAeqzZAw== + +"@esbuild/linux-s390x@0.17.18": + version "0.17.18" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.17.18.tgz#66cb01f4a06423e5496facabdce4f7cae7cb80e5" + integrity sha512-cX0I8Q9xQkL/6F5zWdYmVf5JSQt+ZfZD2bJudZrWD+4mnUvoZ3TDDXtDX2mUaq6upMFv9FlfIh4Gfun0tbGzuw== + +"@esbuild/linux-s390x@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.17.8.tgz#291c49ae5c3d11d226352755c0835911fe1a9e5c" + integrity sha512-QgbNY/V3IFXvNf11SS6exkpVcX0LJcob+0RWCgV9OiDAmVElnxciHIisoSix9uzYzScPmS6dJFbZULdSAEkQVw== + +"@esbuild/linux-x64@0.17.18": + version "0.17.18" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.17.18.tgz#23c26050c6c5d1359c7b774823adc32b3883b6c9" + integrity sha512-66RmRsPlYy4jFl0vG80GcNRdirx4nVWAzJmXkevgphP1qf4dsLQCpSKGM3DUQCojwU1hnepI63gNZdrr02wHUA== + +"@esbuild/linux-x64@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.17.8.tgz#03199d91c76faf80bd54104f5cbf0a489bc39f6a" + integrity sha512-mM/9S0SbAFDBc4OPoyP6SEOo5324LpUxdpeIUUSrSTOfhHU9hEfqRngmKgqILqwx/0DVJBzeNW7HmLEWp9vcOA== + +"@esbuild/netbsd-x64@0.17.18": + version "0.17.18" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.18.tgz#789a203d3115a52633ff6504f8cbf757f15e703b" + integrity sha512-95IRY7mI2yrkLlTLb1gpDxdC5WLC5mZDi+kA9dmM5XAGxCME0F8i4bYH4jZreaJ6lIZ0B8hTrweqG1fUyW7jbg== + +"@esbuild/netbsd-x64@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.8.tgz#b436d767e1b21852f9ed212e2bb57f77203b0ae2" + integrity sha512-eKUYcWaWTaYr9zbj8GertdVtlt1DTS1gNBWov+iQfWuWyuu59YN6gSEJvFzC5ESJ4kMcKR0uqWThKUn5o8We6Q== + +"@esbuild/openbsd-x64@0.17.18": + version "0.17.18" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.18.tgz#d7b998a30878f8da40617a10af423f56f12a5e90" + integrity sha512-WevVOgcng+8hSZ4Q3BKL3n1xTv5H6Nb53cBrtzzEjDbbnOmucEVcZeGCsCOi9bAOcDYEeBZbD2SJNBxlfP3qiA== + +"@esbuild/openbsd-x64@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.8.tgz#d1481d8539e21d4729cd04a0450a26c2c8789e89" + integrity sha512-Vc9J4dXOboDyMXKD0eCeW0SIeEzr8K9oTHJU+Ci1mZc5njPfhKAqkRt3B/fUNU7dP+mRyralPu8QUkiaQn7iIg== + +"@esbuild/sunos-x64@0.17.18": + version "0.17.18" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.17.18.tgz#ecad0736aa7dae07901ba273db9ef3d3e93df31f" + integrity sha512-Rzf4QfQagnwhQXVBS3BYUlxmEbcV7MY+BH5vfDZekU5eYpcffHSyjU8T0xucKVuOcdCsMo+Ur5wmgQJH2GfNrg== + +"@esbuild/sunos-x64@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.17.8.tgz#2cfb8126e079b2c00fd1bf095541e9f5c47877e4" + integrity sha512-0xvOTNuPXI7ft1LYUgiaXtpCEjp90RuBBYovdd2lqAFxje4sEucurg30M1WIm03+3jxByd3mfo+VUmPtRSVuOw== + +"@esbuild/win32-arm64@0.17.18": + version "0.17.18" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.17.18.tgz#58dfc177da30acf956252d7c8ae9e54e424887c4" + integrity sha512-Kb3Ko/KKaWhjeAm2YoT/cNZaHaD1Yk/pa3FTsmqo9uFh1D1Rfco7BBLIPdDOozrObj2sahslFuAQGvWbgWldAg== + +"@esbuild/win32-arm64@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.17.8.tgz#7c6ecfd097ca23b82119753bf7072bbaefe51e3a" + integrity sha512-G0JQwUI5WdEFEnYNKzklxtBheCPkuDdu1YrtRrjuQv30WsYbkkoixKxLLv8qhJmNI+ATEWquZe/N0d0rpr55Mg== + +"@esbuild/win32-ia32@0.17.18": + version "0.17.18" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.17.18.tgz#340f6163172b5272b5ae60ec12c312485f69232b" + integrity sha512-0/xUMIdkVHwkvxfbd5+lfG7mHOf2FRrxNbPiKWg9C4fFrB8H0guClmaM3BFiRUYrznVoyxTIyC/Ou2B7QQSwmw== + +"@esbuild/win32-ia32@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.17.8.tgz#cffec63c3cb0ef8563a04df4e09fa71056171d00" + integrity sha512-Fqy63515xl20OHGFykjJsMnoIWS+38fqfg88ClvPXyDbLtgXal2DTlhb1TfTX34qWi3u4I7Cq563QcHpqgLx8w== + +"@esbuild/win32-x64@0.17.18": + version "0.17.18" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.17.18.tgz#3a8e57153905308db357fd02f57c180ee3a0a1fa" + integrity sha512-qU25Ma1I3NqTSHJUOKi9sAH1/Mzuvlke0ioMJRthLXKm7JiSKVwFghlGbDLOO2sARECGhja4xYfRAZNPAkooYg== + +"@esbuild/win32-x64@0.17.8": + version "0.17.8" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.17.8.tgz#200a0965cf654ac28b971358ecdca9cc5b44c335" + integrity sha512-1iuezdyDNngPnz8rLRDO2C/ZZ/emJLb72OsZeqQ6gL6Avko/XCXZw+NuxBSNhBAP13Hie418V7VMt9et1FMvpg== + +"@eslint-community/eslint-utils@^4.2.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" -"@eslint/eslintrc@^1.0.4": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.0.tgz#29f92c30bb3e771e4a2048c95fa6855392dfac4f" - integrity sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw== +"@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== dependencies: ajv "^6.12.4" debug "^4.3.2" - espree "^9.3.2" - globals "^13.15.0" + espree "^9.4.0" + globals "^13.19.0" ignore "^5.2.0" import-fresh "^3.2.1" js-yaml "^4.1.0" minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@gar/promisify@^1.0.1", "@gar/promisify@^1.1.3": +"@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" + integrity sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ== + +"@gar/promisify@^1.1.3": version "1.1.3" resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== -"@humanwhocodes/config-array@^0.6.0": - version "0.6.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.6.0.tgz#b5621fdb3b32309d2d16575456cbc277fa8f021a" - integrity sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A== +"@humanwhocodes/config-array@^0.11.8": + version "0.11.8" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9" + integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g== dependencies: - "@humanwhocodes/object-schema" "^1.2.0" + "@humanwhocodes/object-schema" "^1.2.1" debug "^4.1.1" - minimatch "^3.0.4" + minimatch "^3.0.5" -"@humanwhocodes/object-schema@^1.2.0": +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== +"@ioredis/commands@^1.1.1": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ioredis/commands/-/commands-1.2.0.tgz#6d61b3097470af1fdbbe622795b8921d42018e11" + integrity sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg== + +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" @@ -2656,141 +2041,110 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jest/console@^28.1.1", "@jest/console@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-28.1.3.tgz#2030606ec03a18c31803b8a36382762e447655df" - integrity sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw== +"@jest/console@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.5.0.tgz#593a6c5c0d3f75689835f1b3b4688c4f8544cb57" + integrity sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ== dependencies: - "@jest/types" "^28.1.3" + "@jest/types" "^29.5.0" "@types/node" "*" chalk "^4.0.0" - jest-message-util "^28.1.3" - jest-util "^28.1.3" + jest-message-util "^29.5.0" + jest-util "^29.5.0" slash "^3.0.0" -"@jest/core@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-28.1.3.tgz#0ebf2bd39840f1233cd5f2d1e6fc8b71bd5a1ac7" - integrity sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA== +"@jest/core@^29.4.3", "@jest/core@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.5.0.tgz#76674b96904484e8214614d17261cc491e5f1f03" + integrity sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ== dependencies: - "@jest/console" "^28.1.3" - "@jest/reporters" "^28.1.3" - "@jest/test-result" "^28.1.3" - "@jest/transform" "^28.1.3" - "@jest/types" "^28.1.3" + "@jest/console" "^29.5.0" + "@jest/reporters" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" ci-info "^3.2.0" exit "^0.1.2" graceful-fs "^4.2.9" - jest-changed-files "^28.1.3" - jest-config "^28.1.3" - jest-haste-map "^28.1.3" - jest-message-util "^28.1.3" - jest-regex-util "^28.0.2" - jest-resolve "^28.1.3" - jest-resolve-dependencies "^28.1.3" - jest-runner "^28.1.3" - jest-runtime "^28.1.3" - jest-snapshot "^28.1.3" - jest-util "^28.1.3" - jest-validate "^28.1.3" - jest-watcher "^28.1.3" + jest-changed-files "^29.5.0" + jest-config "^29.5.0" + jest-haste-map "^29.5.0" + jest-message-util "^29.5.0" + jest-regex-util "^29.4.3" + jest-resolve "^29.5.0" + jest-resolve-dependencies "^29.5.0" + jest-runner "^29.5.0" + jest-runtime "^29.5.0" + jest-snapshot "^29.5.0" + jest-util "^29.5.0" + jest-validate "^29.5.0" + jest-watcher "^29.5.0" micromatch "^4.0.4" - pretty-format "^28.1.3" - rimraf "^3.0.0" + pretty-format "^29.5.0" slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/environment@^28.1.1", "@jest/environment@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-28.1.3.tgz#abed43a6b040a4c24fdcb69eab1f97589b2d663e" - integrity sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA== +"@jest/environment@^29.4.3", "@jest/environment@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.5.0.tgz#9152d56317c1fdb1af389c46640ba74ef0bb4c65" + integrity sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ== dependencies: - "@jest/fake-timers" "^28.1.3" - "@jest/types" "^28.1.3" + "@jest/fake-timers" "^29.5.0" + "@jest/types" "^29.5.0" "@types/node" "*" - jest-mock "^28.1.3" + jest-mock "^29.5.0" -"@jest/expect-utils@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-28.1.3.tgz#58561ce5db7cd253a7edddbc051fb39dda50f525" - integrity sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA== +"@jest/expect-utils@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.5.0.tgz#f74fad6b6e20f924582dc8ecbf2cb800fe43a036" + integrity sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg== dependencies: - jest-get-type "^28.0.2" + jest-get-type "^29.4.3" -"@jest/expect@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-28.1.3.tgz#9ac57e1d4491baca550f6bdbd232487177ad6a72" - integrity sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw== +"@jest/expect@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.5.0.tgz#80952f5316b23c483fbca4363ce822af79c38fba" + integrity sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g== dependencies: - expect "^28.1.3" - jest-snapshot "^28.1.3" + expect "^29.5.0" + jest-snapshot "^29.5.0" -"@jest/fake-timers@^28.1.1", "@jest/fake-timers@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-28.1.3.tgz#230255b3ad0a3d4978f1d06f70685baea91c640e" - integrity sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw== +"@jest/fake-timers@^29.4.3", "@jest/fake-timers@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.5.0.tgz#d4d09ec3286b3d90c60bdcd66ed28d35f1b4dc2c" + integrity sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg== dependencies: - "@jest/types" "^28.1.3" - "@sinonjs/fake-timers" "^9.1.2" + "@jest/types" "^29.5.0" + "@sinonjs/fake-timers" "^10.0.2" "@types/node" "*" - jest-message-util "^28.1.3" - jest-mock "^28.1.3" - jest-util "^28.1.3" - -"@jest/globals@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-28.1.3.tgz#a601d78ddc5fdef542728309894895b4a42dc333" - integrity sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA== - dependencies: - "@jest/environment" "^28.1.3" - "@jest/expect" "^28.1.3" - "@jest/types" "^28.1.3" + jest-message-util "^29.5.0" + jest-mock "^29.5.0" + jest-util "^29.5.0" -"@jest/reporters@28.1.1": - version "28.1.1" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-28.1.1.tgz#9389f4bb3cce4d9b586f6195f83c79cd2a1c8662" - integrity sha512-597Zj4D4d88sZrzM4atEGLuO7SdA/YrOv9SRXHXRNC+/FwPCWxZhBAEzhXoiJzfRwn8zes/EjS8Lo6DouGN5Gg== +"@jest/globals@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.5.0.tgz#6166c0bfc374c58268677539d0c181f9c1833298" + integrity sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ== dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^28.1.1" - "@jest/test-result" "^28.1.1" - "@jest/transform" "^28.1.1" - "@jest/types" "^28.1.1" - "@jridgewell/trace-mapping" "^0.3.7" - "@types/node" "*" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^5.1.0" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.1.3" - jest-message-util "^28.1.1" - jest-util "^28.1.1" - jest-worker "^28.1.1" - slash "^3.0.0" - string-length "^4.0.1" - strip-ansi "^6.0.0" - terminal-link "^2.0.0" - v8-to-istanbul "^9.0.0" + "@jest/environment" "^29.5.0" + "@jest/expect" "^29.5.0" + "@jest/types" "^29.5.0" + jest-mock "^29.5.0" -"@jest/reporters@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-28.1.3.tgz#9adf6d265edafc5fc4a434cfb31e2df5a67a369a" - integrity sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg== +"@jest/reporters@^29.4.1", "@jest/reporters@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.5.0.tgz#985dfd91290cd78ddae4914ba7921bcbabe8ac9b" + integrity sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^28.1.3" - "@jest/test-result" "^28.1.3" - "@jest/transform" "^28.1.3" - "@jest/types" "^28.1.3" - "@jridgewell/trace-mapping" "^0.3.13" + "@jest/console" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" + "@jridgewell/trace-mapping" "^0.3.15" "@types/node" "*" chalk "^4.0.0" collect-v8-coverage "^1.0.0" @@ -2802,243 +2156,872 @@ istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" istanbul-reports "^3.1.3" - jest-message-util "^28.1.3" - jest-util "^28.1.3" - jest-worker "^28.1.3" + jest-message-util "^29.5.0" + jest-util "^29.5.0" + jest-worker "^29.5.0" slash "^3.0.0" string-length "^4.0.1" strip-ansi "^6.0.0" - terminal-link "^2.0.0" v8-to-istanbul "^9.0.1" -"@jest/schemas@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-28.1.3.tgz#ad8b86a66f11f33619e3d7e1dcddd7f2d40ff905" - integrity sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg== +"@jest/schemas@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.3.tgz#39cf1b8469afc40b6f5a2baaa146e332c4151788" + integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg== dependencies: - "@sinclair/typebox" "^0.24.1" + "@sinclair/typebox" "^0.25.16" -"@jest/source-map@^28.1.2": - version "28.1.2" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-28.1.2.tgz#7fe832b172b497d6663cdff6c13b0a920e139e24" - integrity sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww== +"@jest/source-map@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.4.3.tgz#ff8d05cbfff875d4a791ab679b4333df47951d20" + integrity sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w== dependencies: - "@jridgewell/trace-mapping" "^0.3.13" + "@jridgewell/trace-mapping" "^0.3.15" callsites "^3.0.0" graceful-fs "^4.2.9" -"@jest/test-result@28.1.1": - version "28.1.1" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-28.1.1.tgz#c6f18d1bbb01aa88925dd687872a75f8414b317a" - integrity sha512-hPmkugBktqL6rRzwWAtp1JtYT4VHwv8OQ+9lE5Gymj6dHzubI/oJHMUpPOt8NrdVWSrz9S7bHjJUmv2ggFoUNQ== - dependencies: - "@jest/console" "^28.1.1" - "@jest/types" "^28.1.1" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - -"@jest/test-result@^28.1.1", "@jest/test-result@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-28.1.3.tgz#5eae945fd9f4b8fcfce74d239e6f725b6bf076c5" - integrity sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg== +"@jest/test-result@^29.4.1", "@jest/test-result@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.5.0.tgz#7c856a6ca84f45cc36926a4e9c6b57f1973f1408" + integrity sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ== dependencies: - "@jest/console" "^28.1.3" - "@jest/types" "^28.1.3" + "@jest/console" "^29.5.0" + "@jest/types" "^29.5.0" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^28.1.1", "@jest/test-sequencer@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-28.1.3.tgz#9d0c283d906ac599c74bde464bc0d7e6a82886c3" - integrity sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw== +"@jest/test-sequencer@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz#34d7d82d3081abd523dbddc038a3ddcb9f6d3cc4" + integrity sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ== dependencies: - "@jest/test-result" "^28.1.3" + "@jest/test-result" "^29.5.0" graceful-fs "^4.2.9" - jest-haste-map "^28.1.3" + jest-haste-map "^29.5.0" slash "^3.0.0" -"@jest/transform@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-26.6.2.tgz#5ac57c5fa1ad17b2aae83e73e45813894dcf2e4b" - integrity sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA== - dependencies: - "@babel/core" "^7.1.0" - "@jest/types" "^26.6.2" - babel-plugin-istanbul "^6.0.0" - chalk "^4.0.0" - convert-source-map "^1.4.0" - fast-json-stable-stringify "^2.0.0" - graceful-fs "^4.2.4" - jest-haste-map "^26.6.2" - jest-regex-util "^26.0.0" - jest-util "^26.6.2" - micromatch "^4.0.2" - pirates "^4.0.1" - slash "^3.0.0" - source-map "^0.6.1" - write-file-atomic "^3.0.0" - -"@jest/transform@^28.1.1", "@jest/transform@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-28.1.3.tgz#59d8098e50ab07950e0f2fc0fc7ec462371281b0" - integrity sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA== +"@jest/transform@^29.3.1", "@jest/transform@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.5.0.tgz#cf9c872d0965f0cbd32f1458aa44a2b1988b00f9" + integrity sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw== dependencies: "@babel/core" "^7.11.6" - "@jest/types" "^28.1.3" - "@jridgewell/trace-mapping" "^0.3.13" + "@jest/types" "^29.5.0" + "@jridgewell/trace-mapping" "^0.3.15" babel-plugin-istanbul "^6.1.1" chalk "^4.0.0" - convert-source-map "^1.4.0" - fast-json-stable-stringify "^2.0.0" + convert-source-map "^2.0.0" + fast-json-stable-stringify "^2.1.0" graceful-fs "^4.2.9" - jest-haste-map "^28.1.3" - jest-regex-util "^28.0.2" - jest-util "^28.1.3" + jest-haste-map "^29.5.0" + jest-regex-util "^29.4.3" + jest-util "^29.5.0" micromatch "^4.0.4" pirates "^4.0.4" slash "^3.0.0" - write-file-atomic "^4.0.1" + write-file-atomic "^4.0.2" -"@jest/types@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" - integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== +"@jest/types@^29.4.3", "@jest/types@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.5.0.tgz#f59ef9b031ced83047c67032700d8c807d6e1593" + integrity sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog== dependencies: + "@jest/schemas" "^29.4.3" "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" "@types/node" "*" - "@types/yargs" "^15.0.0" + "@types/yargs" "^17.0.8" chalk "^4.0.0" -"@jest/types@^28.1.1", "@jest/types@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-28.1.3.tgz#b05de80996ff12512bc5ceb1d208285a7d11748b" - integrity sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ== +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== dependencies: - "@jest/schemas" "^28.1.3" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + +"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/source-map@^0.3.2": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.3.tgz#8108265659d4c33e72ffe14e33d6cc5eb59f2fda" + integrity sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/sourcemap-codec@1.4.14": + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.13", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.15", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.18" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" + integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@juggle/resize-observer@^3.3.1": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@juggle/resize-observer/-/resize-observer-3.4.0.tgz#08d6c5e20cf7e4cc02fd181c4b0c225cd31dbb60" + integrity sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA== + +"@kurkle/color@^0.3.0": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@kurkle/color/-/color-0.3.2.tgz#5acd38242e8bde4f9986e7913c8fdf49d3aa199f" + integrity sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw== + +"@leichtgewicht/ip-codec@^2.0.1": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" + integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== + +"@material/animation@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/animation/-/animation-15.0.0-canary.684e33d25.0.tgz#d42ecdd31da5635ff5b44a53c6fc8746de7f5a5a" + integrity sha512-5osi1z4JQIXcklPALbH/zTfOm2pDzHt9Fxm7ZyURy250xIZj6QjULRzPTnzOhC2ropfix9ra2Cfggbf0dcRbEQ== + dependencies: + tslib "^2.1.0" + +"@material/auto-init@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/auto-init/-/auto-init-15.0.0-canary.684e33d25.0.tgz#39caf04e5647b6d73a63f8d90a744a92d3394f31" + integrity sha512-OigQTmrVzkcGvxNjOaIe5oItTFPgrO9xLewvharDI6m6yvO1z7OBnkcW+sFN6ggLNYNxd0O1u9v64vMsmeDABQ== + dependencies: + "@material/base" "15.0.0-canary.684e33d25.0" + tslib "^2.1.0" + +"@material/banner@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/banner/-/banner-15.0.0-canary.684e33d25.0.tgz#9e6e56f0fd1f572a046ea0dfe3fafa181a5e6c84" + integrity sha512-PqtGp3KWzdu58rWv/DIvSfe38m5YKOBbAAbBinSvgadBb/da+IE1t5F7YPNKE1T5lJsQBGVUYx6QBIeXm+aI/A== + dependencies: + "@material/base" "15.0.0-canary.684e33d25.0" + "@material/button" "15.0.0-canary.684e33d25.0" + "@material/dom" "15.0.0-canary.684e33d25.0" + "@material/elevation" "15.0.0-canary.684e33d25.0" + "@material/feature-targeting" "15.0.0-canary.684e33d25.0" + "@material/ripple" "15.0.0-canary.684e33d25.0" + "@material/rtl" "15.0.0-canary.684e33d25.0" + "@material/shape" "15.0.0-canary.684e33d25.0" + "@material/theme" "15.0.0-canary.684e33d25.0" + "@material/tokens" "15.0.0-canary.684e33d25.0" + "@material/typography" "15.0.0-canary.684e33d25.0" + tslib "^2.1.0" + +"@material/base@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/base/-/base-15.0.0-canary.684e33d25.0.tgz#fe9b3e01f7dc1ed064e06bfb0f8b072d0d7c7d10" + integrity sha512-oOaqb/SfjWwTKsdJUZmeh/Qrs41nIJI0N+zELsxnvbGjSIN1ZMAKYZFPMahqvC68OJ6+5CvJM8PoTNs5l+B8IQ== + dependencies: + tslib "^2.1.0" + +"@material/button@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/button/-/button-15.0.0-canary.684e33d25.0.tgz#714aaa80ceb73fef2852dd9b25bfe634076e957c" + integrity sha512-Nkekk4edeX+ObVOa7UlwavaHdmckPV5wU4SAJf3iA3R61cmz+KsgAgpzfcwv5WfNhIlc2nLu8QYEecpHdo9d/w== + dependencies: + "@material/density" "15.0.0-canary.684e33d25.0" + "@material/dom" "15.0.0-canary.684e33d25.0" + "@material/elevation" "15.0.0-canary.684e33d25.0" + "@material/feature-targeting" "15.0.0-canary.684e33d25.0" + "@material/focus-ring" "15.0.0-canary.684e33d25.0" + "@material/ripple" "15.0.0-canary.684e33d25.0" + "@material/rtl" "15.0.0-canary.684e33d25.0" + "@material/shape" "15.0.0-canary.684e33d25.0" + "@material/theme" "15.0.0-canary.684e33d25.0" + "@material/tokens" "15.0.0-canary.684e33d25.0" + "@material/touch-target" "15.0.0-canary.684e33d25.0" + "@material/typography" "15.0.0-canary.684e33d25.0" + tslib "^2.1.0" + +"@material/card@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/card/-/card-15.0.0-canary.684e33d25.0.tgz#68c4007746a93422c9a010d27dcf25d7176edd72" + integrity sha512-xhyB7XX5KkEiCEqwSPkl58ZGYL6xFdnY62zimyBXJRG/Eaa0Swj3kW20hVCpt4f7c9Zmp8Se27rg8vnKmhvO3g== + dependencies: + "@material/dom" "15.0.0-canary.684e33d25.0" + "@material/elevation" "15.0.0-canary.684e33d25.0" + "@material/feature-targeting" "15.0.0-canary.684e33d25.0" + "@material/ripple" "15.0.0-canary.684e33d25.0" + "@material/rtl" "15.0.0-canary.684e33d25.0" + "@material/shape" "15.0.0-canary.684e33d25.0" + "@material/theme" "15.0.0-canary.684e33d25.0" + "@material/tokens" "15.0.0-canary.684e33d25.0" + tslib "^2.1.0" + +"@material/checkbox@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/checkbox/-/checkbox-15.0.0-canary.684e33d25.0.tgz#2b48a55415eab10ce73ba87af8f5c2e77eeb1851" + integrity sha512-NFpM3TS924PmVsk2KQLNU95OYCf8ZwYgzeqfnAexU0bEfjUJXINBun2Go0AaeOUMjuvWUe+byjrXgv8SFYbMUA== + dependencies: + "@material/animation" "15.0.0-canary.684e33d25.0" + "@material/base" "15.0.0-canary.684e33d25.0" + "@material/density" "15.0.0-canary.684e33d25.0" + "@material/dom" "15.0.0-canary.684e33d25.0" + "@material/feature-targeting" "15.0.0-canary.684e33d25.0" + "@material/focus-ring" "15.0.0-canary.684e33d25.0" + "@material/ripple" "15.0.0-canary.684e33d25.0" + "@material/theme" "15.0.0-canary.684e33d25.0" + "@material/touch-target" "15.0.0-canary.684e33d25.0" + tslib "^2.1.0" + +"@material/chips@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/chips/-/chips-15.0.0-canary.684e33d25.0.tgz#81929e0c18ab58a8eb0682ead9d37352b8b583a3" + integrity sha512-z4ajQ4NnsAQ/Si9tZ4xmxzjj2Qb+vW++4QjCjjjwAGIZbCe0xglAnMh2t66XLJUxt7RoKZuZVEO7ZqcFZpvJFQ== + dependencies: + "@material/animation" "15.0.0-canary.684e33d25.0" + "@material/base" "15.0.0-canary.684e33d25.0" + "@material/checkbox" "15.0.0-canary.684e33d25.0" + "@material/density" "15.0.0-canary.684e33d25.0" + "@material/dom" "15.0.0-canary.684e33d25.0" + "@material/elevation" "15.0.0-canary.684e33d25.0" + "@material/feature-targeting" "15.0.0-canary.684e33d25.0" + "@material/focus-ring" "15.0.0-canary.684e33d25.0" + "@material/ripple" "15.0.0-canary.684e33d25.0" + "@material/rtl" "15.0.0-canary.684e33d25.0" + "@material/shape" "15.0.0-canary.684e33d25.0" + "@material/theme" "15.0.0-canary.684e33d25.0" + "@material/tokens" "15.0.0-canary.684e33d25.0" + "@material/touch-target" "15.0.0-canary.684e33d25.0" + "@material/typography" "15.0.0-canary.684e33d25.0" + safevalues "^0.3.4" + tslib "^2.1.0" + +"@material/circular-progress@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/circular-progress/-/circular-progress-15.0.0-canary.684e33d25.0.tgz#8484ce2b53d074b48b6851f60758c2fac9496a89" + integrity sha512-G6qD0nGNtEUwWnAMJuA9INYFpZoKtx7KFjBaPF4Ol2YLHtmShALNAYyn54TMAK8AZ2IpW08PXjGS7Ye88vrdEQ== + dependencies: + "@material/animation" "15.0.0-canary.684e33d25.0" + "@material/base" "15.0.0-canary.684e33d25.0" + "@material/dom" "15.0.0-canary.684e33d25.0" + "@material/feature-targeting" "15.0.0-canary.684e33d25.0" + "@material/progress-indicator" "15.0.0-canary.684e33d25.0" + "@material/rtl" "15.0.0-canary.684e33d25.0" + "@material/theme" "15.0.0-canary.684e33d25.0" + tslib "^2.1.0" + +"@material/data-table@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/data-table/-/data-table-15.0.0-canary.684e33d25.0.tgz#4c384fc74500aa4733ce3fe668a928007ef3b1c9" + integrity sha512-+wDw1DDDFfAsKAMzs84f/5GCjux39zjNfW8tL4wFbkWNwewmQrG9zaQMJhBpVOtLCrM8Gj6SOgOANqgqoCjvGg== + dependencies: + "@material/animation" "15.0.0-canary.684e33d25.0" + "@material/base" "15.0.0-canary.684e33d25.0" + "@material/checkbox" "15.0.0-canary.684e33d25.0" + "@material/density" "15.0.0-canary.684e33d25.0" + "@material/dom" "15.0.0-canary.684e33d25.0" + "@material/elevation" "15.0.0-canary.684e33d25.0" + "@material/feature-targeting" "15.0.0-canary.684e33d25.0" + "@material/icon-button" "15.0.0-canary.684e33d25.0" + "@material/linear-progress" "15.0.0-canary.684e33d25.0" + "@material/list" "15.0.0-canary.684e33d25.0" + "@material/menu" "15.0.0-canary.684e33d25.0" + "@material/rtl" "15.0.0-canary.684e33d25.0" + "@material/select" "15.0.0-canary.684e33d25.0" + "@material/shape" "15.0.0-canary.684e33d25.0" + "@material/theme" "15.0.0-canary.684e33d25.0" + "@material/tokens" "15.0.0-canary.684e33d25.0" + "@material/touch-target" "15.0.0-canary.684e33d25.0" + "@material/typography" "15.0.0-canary.684e33d25.0" + tslib "^2.1.0" + +"@material/density@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/density/-/density-15.0.0-canary.684e33d25.0.tgz#9af1ea0e8942341f76f032d42a4cd132050a007e" + integrity sha512-661yEVRMGrlq6S6WuSbPRO+ZwpdUOg2glCc7y96doM6itSLOa3UEAldjOLfsYZVB74GnKCiuDp//QmfoRyYTfA== + dependencies: + tslib "^2.1.0" + +"@material/dialog@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/dialog/-/dialog-15.0.0-canary.684e33d25.0.tgz#141164d6bdbf542f7224b172df40a79f2e562aa8" + integrity sha512-szn0dHnfeQTSOC6SSRSGAzX6Tnx+4NnSMUwNkXm+3bwjds8ZVK26+DXwLrP5f3ID5F1K5sFsRf2INo5/TNTHyQ== + dependencies: + "@material/animation" "15.0.0-canary.684e33d25.0" + "@material/base" "15.0.0-canary.684e33d25.0" + "@material/button" "15.0.0-canary.684e33d25.0" + "@material/dom" "15.0.0-canary.684e33d25.0" + "@material/elevation" "15.0.0-canary.684e33d25.0" + "@material/feature-targeting" "15.0.0-canary.684e33d25.0" + "@material/icon-button" "15.0.0-canary.684e33d25.0" + "@material/ripple" "15.0.0-canary.684e33d25.0" + "@material/rtl" "15.0.0-canary.684e33d25.0" + "@material/shape" "15.0.0-canary.684e33d25.0" + "@material/theme" "15.0.0-canary.684e33d25.0" + "@material/tokens" "15.0.0-canary.684e33d25.0" + "@material/touch-target" "15.0.0-canary.684e33d25.0" + "@material/typography" "15.0.0-canary.684e33d25.0" + tslib "^2.1.0" + +"@material/dom@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/dom/-/dom-15.0.0-canary.684e33d25.0.tgz#1487f4a0187aa8fb12819533537218888c2594eb" + integrity sha512-7pEJLYov+tGgfuD8mZxoVU6rWtPI8ppjTAhz+F27Hz9FG0JETMWTKpDPBXLnKvX7vhIxL83GvZ9geNHCe8Hfog== + dependencies: + "@material/feature-targeting" "15.0.0-canary.684e33d25.0" + "@material/rtl" "15.0.0-canary.684e33d25.0" + tslib "^2.1.0" + +"@material/drawer@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/drawer/-/drawer-15.0.0-canary.684e33d25.0.tgz#c56dc67a441030cb4cdef2030309d34c1d5266cc" + integrity sha512-/KMckLf1PYU/H3PXnS4e0aFl03qG3JlSv4LGgX6juJufcONqGTl/m63EMO/L/eUy6H1CRrXmVDjik/jzHLyDhg== + dependencies: + "@material/animation" "15.0.0-canary.684e33d25.0" + "@material/base" "15.0.0-canary.684e33d25.0" + "@material/dom" "15.0.0-canary.684e33d25.0" + "@material/elevation" "15.0.0-canary.684e33d25.0" + "@material/feature-targeting" "15.0.0-canary.684e33d25.0" + "@material/list" "15.0.0-canary.684e33d25.0" + "@material/ripple" "15.0.0-canary.684e33d25.0" + "@material/rtl" "15.0.0-canary.684e33d25.0" + "@material/shape" "15.0.0-canary.684e33d25.0" + "@material/theme" "15.0.0-canary.684e33d25.0" + "@material/typography" "15.0.0-canary.684e33d25.0" + tslib "^2.1.0" + +"@material/elevation@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/elevation/-/elevation-15.0.0-canary.684e33d25.0.tgz#99ad187917d06a8480f780089d254864589c7d05" + integrity sha512-WDF8SsRtq3rXUbVVbd9K4DUijIPH0bUFSOreVYxudpuxAfTlDS5+aeS1EK9UIBFYLuba4u5wVT2tDv6e1RTfrQ== + dependencies: + "@material/animation" "15.0.0-canary.684e33d25.0" + "@material/base" "15.0.0-canary.684e33d25.0" + "@material/feature-targeting" "15.0.0-canary.684e33d25.0" + "@material/rtl" "15.0.0-canary.684e33d25.0" + "@material/theme" "15.0.0-canary.684e33d25.0" + tslib "^2.1.0" + +"@material/fab@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/fab/-/fab-15.0.0-canary.684e33d25.0.tgz#12033d67712a04d25cb46e1646155a1a922e3cb8" + integrity sha512-KCu87rWOKEAe9vZcAm6K8XazYSWPNjMG+OhrbPjHW6bCO7as1YCgtmkBkhff7csY/rFmcVpIy884xtUfLmSudQ== + dependencies: + "@material/animation" "15.0.0-canary.684e33d25.0" + "@material/dom" "15.0.0-canary.684e33d25.0" + "@material/elevation" "15.0.0-canary.684e33d25.0" + "@material/feature-targeting" "15.0.0-canary.684e33d25.0" + "@material/focus-ring" "15.0.0-canary.684e33d25.0" + "@material/ripple" "15.0.0-canary.684e33d25.0" + "@material/rtl" "15.0.0-canary.684e33d25.0" + "@material/shape" "15.0.0-canary.684e33d25.0" + "@material/theme" "15.0.0-canary.684e33d25.0" + "@material/tokens" "15.0.0-canary.684e33d25.0" + "@material/touch-target" "15.0.0-canary.684e33d25.0" + "@material/typography" "15.0.0-canary.684e33d25.0" + tslib "^2.1.0" + +"@material/feature-targeting@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/feature-targeting/-/feature-targeting-15.0.0-canary.684e33d25.0.tgz#73247e0bcd25b0313a6f783ce8d0db3eb1d9b27a" + integrity sha512-HyH1erNTSjS63sigNSUMaCd0nJhTNdDFeC+myrxwtDaQm+uYJ8troCNtQM3g6mx0XATNtX5aTOoPmrM6yVVi1A== + dependencies: + tslib "^2.1.0" + +"@material/floating-label@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/floating-label/-/floating-label-15.0.0-canary.684e33d25.0.tgz#69565b508f4e9d19a9be589ccf495596c8102a07" + integrity sha512-f7TPp6bKpGvV3sYYiZHSGlrixXKkXXITW3Esp7KB9jRq42c0H82novmdwvY0eTef4ootmA2JEysr78KQfHBUPg== + dependencies: + "@material/animation" "15.0.0-canary.684e33d25.0" + "@material/base" "15.0.0-canary.684e33d25.0" + "@material/dom" "15.0.0-canary.684e33d25.0" + "@material/feature-targeting" "15.0.0-canary.684e33d25.0" + "@material/rtl" "15.0.0-canary.684e33d25.0" + "@material/theme" "15.0.0-canary.684e33d25.0" + "@material/typography" "15.0.0-canary.684e33d25.0" + tslib "^2.1.0" + +"@material/focus-ring@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/focus-ring/-/focus-ring-15.0.0-canary.684e33d25.0.tgz#e47985e7a8b6a696db2354670a427a4fd34f30a5" + integrity sha512-ikw2RVUfgzXChpWIzPH1VzRvTjYb5ZKj4H+CZf7jqPUXMstFOZg90Bp7ARLZHqYiyNMuUq3zUTHozS6iHorSqg== + dependencies: + "@material/dom" "15.0.0-canary.684e33d25.0" + "@material/feature-targeting" "15.0.0-canary.684e33d25.0" + "@material/rtl" "15.0.0-canary.684e33d25.0" + +"@material/form-field@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/form-field/-/form-field-15.0.0-canary.684e33d25.0.tgz#033930402e9766c2c6249caa6e1295557af61a36" + integrity sha512-vpF9N/uq5no/7+8GAbEH0868FhOuBgxAWRr1Sfb+jthKfBr8OS/wPU/AHzZHdHdAm7PQynbeOXfDsX2dI//PDA== + dependencies: + "@material/base" "15.0.0-canary.684e33d25.0" + "@material/feature-targeting" "15.0.0-canary.684e33d25.0" + "@material/ripple" "15.0.0-canary.684e33d25.0" + "@material/rtl" "15.0.0-canary.684e33d25.0" + "@material/theme" "15.0.0-canary.684e33d25.0" + "@material/typography" "15.0.0-canary.684e33d25.0" + tslib "^2.1.0" + +"@material/icon-button@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/icon-button/-/icon-button-15.0.0-canary.684e33d25.0.tgz#b1f1adba5f2947c3bb31795df2921fa2e7d1f862" + integrity sha512-wMI+XGzmIN/o2ePBKg2hLyx7H4pXCRAyyIKMQS1FMp1UKa2tYmiHVX/V8skhKwCqxg3i6Ls/LxMjfPxTR18WvQ== + dependencies: + "@material/base" "15.0.0-canary.684e33d25.0" + "@material/density" "15.0.0-canary.684e33d25.0" + "@material/dom" "15.0.0-canary.684e33d25.0" + "@material/elevation" "15.0.0-canary.684e33d25.0" + "@material/feature-targeting" "15.0.0-canary.684e33d25.0" + "@material/focus-ring" "15.0.0-canary.684e33d25.0" + "@material/ripple" "15.0.0-canary.684e33d25.0" + "@material/rtl" "15.0.0-canary.684e33d25.0" + "@material/theme" "15.0.0-canary.684e33d25.0" + "@material/touch-target" "15.0.0-canary.684e33d25.0" + tslib "^2.1.0" + +"@material/image-list@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/image-list/-/image-list-15.0.0-canary.684e33d25.0.tgz#d137369feea3011287906a6291784d692e701cdd" + integrity sha512-Ol+uaHYBe5R/cgzlfh5ONnMVX0wO6fV74JMUcQCQlxP6lXau/edARo4tkRc7A7UJUkU3VRv0EpEjLoCRNUPGaA== + dependencies: + "@material/feature-targeting" "15.0.0-canary.684e33d25.0" + "@material/shape" "15.0.0-canary.684e33d25.0" + "@material/theme" "15.0.0-canary.684e33d25.0" + "@material/typography" "15.0.0-canary.684e33d25.0" + tslib "^2.1.0" + +"@material/layout-grid@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/layout-grid/-/layout-grid-15.0.0-canary.684e33d25.0.tgz#4c9f3c2eee650f4ef2971a4c0facf7c7bc21f5f0" + integrity sha512-ALXE1mqFNb/RB2lVRQ3/r1Aufw2mFZnOjRE+boYDVepmAG/xWyPCyaGoavELJF5l4GAb0tXi8wA/8HeGbLOpuA== + dependencies: + tslib "^2.1.0" + +"@material/line-ripple@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/line-ripple/-/line-ripple-15.0.0-canary.684e33d25.0.tgz#df4601a780dae919ffb9d2bec05fa189238c9d67" + integrity sha512-7hRx8C/e9i0P6pgQpNOMfTwSS2r1fwEvBL72QDVGLtLuoKKwsjjgP6Z0Jat/GeHJe87u9LQvGBoD4upt+of/HA== + dependencies: + "@material/animation" "15.0.0-canary.684e33d25.0" + "@material/base" "15.0.0-canary.684e33d25.0" + "@material/feature-targeting" "15.0.0-canary.684e33d25.0" + "@material/theme" "15.0.0-canary.684e33d25.0" + tslib "^2.1.0" + +"@material/linear-progress@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/linear-progress/-/linear-progress-15.0.0-canary.684e33d25.0.tgz#7093199c8bb946bc15b677c968a43f8f032f546f" + integrity sha512-iJclt7mKmcMk6pqD7ocXKfCWZhqBoODp7N593jYlxVpTJuEz2wiVAjZUDn/YGj/Uz3CRH+2YFfOiLr9pwWjhDg== + dependencies: + "@material/animation" "15.0.0-canary.684e33d25.0" + "@material/base" "15.0.0-canary.684e33d25.0" + "@material/dom" "15.0.0-canary.684e33d25.0" + "@material/feature-targeting" "15.0.0-canary.684e33d25.0" + "@material/progress-indicator" "15.0.0-canary.684e33d25.0" + "@material/rtl" "15.0.0-canary.684e33d25.0" + "@material/theme" "15.0.0-canary.684e33d25.0" + tslib "^2.1.0" + +"@material/list@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/list/-/list-15.0.0-canary.684e33d25.0.tgz#2f12ac6250f9da19843ed122f3c6d87ca403dbc1" + integrity sha512-rQ+FCSdzmwTcT00IYE0uRV3CS4oGSccKFl9hkcF+aHFW61L7ORh/SCGUDPrEfQFrFkMn5f8qroVJjpUAMXBz4g== + dependencies: + "@material/base" "15.0.0-canary.684e33d25.0" + "@material/density" "15.0.0-canary.684e33d25.0" + "@material/dom" "15.0.0-canary.684e33d25.0" + "@material/feature-targeting" "15.0.0-canary.684e33d25.0" + "@material/ripple" "15.0.0-canary.684e33d25.0" + "@material/rtl" "15.0.0-canary.684e33d25.0" + "@material/shape" "15.0.0-canary.684e33d25.0" + "@material/theme" "15.0.0-canary.684e33d25.0" + "@material/tokens" "15.0.0-canary.684e33d25.0" + "@material/typography" "15.0.0-canary.684e33d25.0" + tslib "^2.1.0" + +"@material/menu-surface@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/menu-surface/-/menu-surface-15.0.0-canary.684e33d25.0.tgz#c397ec61703a1e6b24ce2751e959b5526c909ba9" + integrity sha512-RVO5GAYcfWPaKwxsF/NhUAmrYXQCQBKvRQW0TIlbmAJz6lcFeTs6YZqF3u1C7qrL3ZQGz+sur/7ywj6QU0oMow== + dependencies: + "@material/animation" "15.0.0-canary.684e33d25.0" + "@material/base" "15.0.0-canary.684e33d25.0" + "@material/elevation" "15.0.0-canary.684e33d25.0" + "@material/feature-targeting" "15.0.0-canary.684e33d25.0" + "@material/rtl" "15.0.0-canary.684e33d25.0" + "@material/shape" "15.0.0-canary.684e33d25.0" + "@material/theme" "15.0.0-canary.684e33d25.0" + tslib "^2.1.0" + +"@material/menu@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/menu/-/menu-15.0.0-canary.684e33d25.0.tgz#1fca04a5baa2514e850db82a218ebcc65ed8c0fe" + integrity sha512-r7wzDLSGSI9629/mfpvsMzkVxpmV75kcD3IrW0Pcu6/Bv/1xi0EvjcUXzNJJoQlwN4Zj35Ymz/PCjZkIDIz68Q== + dependencies: + "@material/base" "15.0.0-canary.684e33d25.0" + "@material/dom" "15.0.0-canary.684e33d25.0" + "@material/elevation" "15.0.0-canary.684e33d25.0" + "@material/feature-targeting" "15.0.0-canary.684e33d25.0" + "@material/list" "15.0.0-canary.684e33d25.0" + "@material/menu-surface" "15.0.0-canary.684e33d25.0" + "@material/ripple" "15.0.0-canary.684e33d25.0" + "@material/rtl" "15.0.0-canary.684e33d25.0" + "@material/shape" "15.0.0-canary.684e33d25.0" + "@material/theme" "15.0.0-canary.684e33d25.0" + "@material/tokens" "15.0.0-canary.684e33d25.0" + tslib "^2.1.0" -"@jridgewell/gen-mapping@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" - integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== +"@material/notched-outline@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/notched-outline/-/notched-outline-15.0.0-canary.684e33d25.0.tgz#c18b48d8a9d5153717e1dcb13ac51fcec8ca8489" + integrity sha512-9YHcBkvJLPVYzkHcWoTpBZAFrEd+j1hjhGxLhh0LuNrZe8VroUkZD1TTnUAPHRG3os6EqEWWaKb0RN+aPIF2yQ== + dependencies: + "@material/base" "15.0.0-canary.684e33d25.0" + "@material/feature-targeting" "15.0.0-canary.684e33d25.0" + "@material/floating-label" "15.0.0-canary.684e33d25.0" + "@material/rtl" "15.0.0-canary.684e33d25.0" + "@material/shape" "15.0.0-canary.684e33d25.0" + "@material/theme" "15.0.0-canary.684e33d25.0" + tslib "^2.1.0" + +"@material/progress-indicator@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/progress-indicator/-/progress-indicator-15.0.0-canary.684e33d25.0.tgz#260f87b3c300d917c84d610477c6dfa8fafcbf1a" + integrity sha512-c0icji4faeNWUoqGENGC7Hav0Puxh0RwXIDVizffaUxKIGbajpIp5+4Zop73fK/xFLGMB/npg7TbP+aCGjQ3fw== dependencies: - "@jridgewell/set-array" "^1.0.0" - "@jridgewell/sourcemap-codec" "^1.4.10" + tslib "^2.1.0" -"@jridgewell/gen-mapping@^0.3.0": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz#cf92a983c83466b8c0ce9124fadeaf09f7c66ea9" - integrity sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg== +"@material/radio@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/radio/-/radio-15.0.0-canary.684e33d25.0.tgz#7a2846124c1e78d6a513aee8ca3bafbe3ffcf1a9" + integrity sha512-U3Eh8sNUA8trDla1Bq8Bo02foxYvtoewaKeF8A8tAju81XZ4jRiftfOsOWZDZEHCVbbCB2QwvutvFlnay5n+Aw== + dependencies: + "@material/animation" "15.0.0-canary.684e33d25.0" + "@material/base" "15.0.0-canary.684e33d25.0" + "@material/density" "15.0.0-canary.684e33d25.0" + "@material/dom" "15.0.0-canary.684e33d25.0" + "@material/feature-targeting" "15.0.0-canary.684e33d25.0" + "@material/focus-ring" "15.0.0-canary.684e33d25.0" + "@material/ripple" "15.0.0-canary.684e33d25.0" + "@material/theme" "15.0.0-canary.684e33d25.0" + "@material/touch-target" "15.0.0-canary.684e33d25.0" + tslib "^2.1.0" + +"@material/ripple@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/ripple/-/ripple-15.0.0-canary.684e33d25.0.tgz#1adb32e4f6dacbb9e65d26fb1a6194f25e8db6f0" + integrity sha512-RyePu7SjIm/OuyyEieZ/gxiPYkNZOZHeid72WRcN9ofdlljj2pifcdPvcfZA+v/DMS33xo5GjG2L/Qj6ClWrKw== + dependencies: + "@material/animation" "15.0.0-canary.684e33d25.0" + "@material/base" "15.0.0-canary.684e33d25.0" + "@material/dom" "15.0.0-canary.684e33d25.0" + "@material/feature-targeting" "15.0.0-canary.684e33d25.0" + "@material/rtl" "15.0.0-canary.684e33d25.0" + "@material/theme" "15.0.0-canary.684e33d25.0" + tslib "^2.1.0" + +"@material/rtl@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/rtl/-/rtl-15.0.0-canary.684e33d25.0.tgz#89f69a1ec2c9cc9054d38a778b5acd8346d69385" + integrity sha512-NqdJl8Ayupp1Th+vCNCpVQHbUFOuF7TCte9LD1norTIBUF/QizIxWby2W5uUEiPbnh5j9PmE1CJtfLwKun3pcw== dependencies: - "@jridgewell/set-array" "^1.0.0" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" + "@material/theme" "15.0.0-canary.684e33d25.0" + tslib "^2.1.0" -"@jridgewell/gen-mapping@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== +"@material/segmented-button@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/segmented-button/-/segmented-button-15.0.0-canary.684e33d25.0.tgz#1ea1409ca726f0a647670314fad408bc6a580241" + integrity sha512-bEGgg8vgXNLyukyV8HRjFMuQ6t6nm5LQ4Pgm22um61Yc8qyi0BOqV41OR4SVdUrUqZxh1aVD+p+4NN03+LfQXw== + dependencies: + "@material/base" "15.0.0-canary.684e33d25.0" + "@material/elevation" "15.0.0-canary.684e33d25.0" + "@material/feature-targeting" "15.0.0-canary.684e33d25.0" + "@material/ripple" "15.0.0-canary.684e33d25.0" + "@material/theme" "15.0.0-canary.684e33d25.0" + "@material/touch-target" "15.0.0-canary.684e33d25.0" + "@material/typography" "15.0.0-canary.684e33d25.0" + tslib "^2.1.0" + +"@material/select@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/select/-/select-15.0.0-canary.684e33d25.0.tgz#e5e2feef48fed1314509ec5f206b311d2617ed6f" + integrity sha512-kf178/2TeEinTv0mgmSBcmmExQ2h7a7dtR1E3WuqQgisJ/R6+zVLMkC2CnfIyzxYX2vkuUTG0ue3Reh/6XiqSg== + dependencies: + "@material/animation" "15.0.0-canary.684e33d25.0" + "@material/base" "15.0.0-canary.684e33d25.0" + "@material/density" "15.0.0-canary.684e33d25.0" + "@material/dom" "15.0.0-canary.684e33d25.0" + "@material/elevation" "15.0.0-canary.684e33d25.0" + "@material/feature-targeting" "15.0.0-canary.684e33d25.0" + "@material/floating-label" "15.0.0-canary.684e33d25.0" + "@material/line-ripple" "15.0.0-canary.684e33d25.0" + "@material/list" "15.0.0-canary.684e33d25.0" + "@material/menu" "15.0.0-canary.684e33d25.0" + "@material/menu-surface" "15.0.0-canary.684e33d25.0" + "@material/notched-outline" "15.0.0-canary.684e33d25.0" + "@material/ripple" "15.0.0-canary.684e33d25.0" + "@material/rtl" "15.0.0-canary.684e33d25.0" + "@material/shape" "15.0.0-canary.684e33d25.0" + "@material/theme" "15.0.0-canary.684e33d25.0" + "@material/tokens" "15.0.0-canary.684e33d25.0" + "@material/typography" "15.0.0-canary.684e33d25.0" + tslib "^2.1.0" + +"@material/shape@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/shape/-/shape-15.0.0-canary.684e33d25.0.tgz#3e2ac86b9bff64a87c145d46178baca51e6cc99f" + integrity sha512-aEelpaTFmpnCji3TUGP9bVCS/bRVjUmLTHBPZtuu1gOrUVVtJ6kYOg73dZNJF+XOoNL2yOX/LRcKwsop29tptA== dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" + "@material/feature-targeting" "15.0.0-canary.684e33d25.0" + "@material/rtl" "15.0.0-canary.684e33d25.0" + "@material/theme" "15.0.0-canary.684e33d25.0" + tslib "^2.1.0" -"@jridgewell/resolve-uri@^3.0.3": - version "3.0.7" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz#30cd49820a962aff48c8fffc5cd760151fca61fe" - integrity sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA== +"@material/slider@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/slider/-/slider-15.0.0-canary.684e33d25.0.tgz#262bef7c33648a5381390c6df751adc3f5675c0d" + integrity sha512-WVyK+2pSNSZmj07M2K/a3TADoQ9FBCndfNC/vE7/wGIg4dddJJK5KvQ+yruf9R2cSzTL/S1sZ5WpyyeM8E9HTw== + dependencies: + "@material/animation" "15.0.0-canary.684e33d25.0" + "@material/base" "15.0.0-canary.684e33d25.0" + "@material/dom" "15.0.0-canary.684e33d25.0" + "@material/elevation" "15.0.0-canary.684e33d25.0" + "@material/feature-targeting" "15.0.0-canary.684e33d25.0" + "@material/ripple" "15.0.0-canary.684e33d25.0" + "@material/rtl" "15.0.0-canary.684e33d25.0" + "@material/theme" "15.0.0-canary.684e33d25.0" + "@material/tokens" "15.0.0-canary.684e33d25.0" + "@material/typography" "15.0.0-canary.684e33d25.0" + tslib "^2.1.0" -"@jridgewell/set-array@^1.0.0": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.1.tgz#36a6acc93987adcf0ba50c66908bd0b70de8afea" - integrity sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ== +"@material/snackbar@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/snackbar/-/snackbar-15.0.0-canary.684e33d25.0.tgz#43734efbe42905c91c773cc95bfb9087c7e162c7" + integrity sha512-itO+DCkOannZzR1/cCHcqAm7ifhuFvXmDItNoA8qLEcAyJDJJRkhpwj3XQ01yuo9gBFcSctp7Txt7e+Hncm/Jg== + dependencies: + "@material/animation" "15.0.0-canary.684e33d25.0" + "@material/base" "15.0.0-canary.684e33d25.0" + "@material/button" "15.0.0-canary.684e33d25.0" + "@material/dom" "15.0.0-canary.684e33d25.0" + "@material/elevation" "15.0.0-canary.684e33d25.0" + "@material/feature-targeting" "15.0.0-canary.684e33d25.0" + "@material/icon-button" "15.0.0-canary.684e33d25.0" + "@material/ripple" "15.0.0-canary.684e33d25.0" + "@material/rtl" "15.0.0-canary.684e33d25.0" + "@material/shape" "15.0.0-canary.684e33d25.0" + "@material/theme" "15.0.0-canary.684e33d25.0" + "@material/tokens" "15.0.0-canary.684e33d25.0" + "@material/typography" "15.0.0-canary.684e33d25.0" + tslib "^2.1.0" -"@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== +"@material/switch@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/switch/-/switch-15.0.0-canary.684e33d25.0.tgz#cd10b954efc49197bd1beec279c23cf26b96eb03" + integrity sha512-Jxi0gl92yvvZZsAPxvVHzXx2ga+T/djMow98jvEczmpUorWnAhgiCr9CsSSRoosahWyRB8NLZOxUQrACxvffjw== + dependencies: + "@material/animation" "15.0.0-canary.684e33d25.0" + "@material/base" "15.0.0-canary.684e33d25.0" + "@material/density" "15.0.0-canary.684e33d25.0" + "@material/dom" "15.0.0-canary.684e33d25.0" + "@material/elevation" "15.0.0-canary.684e33d25.0" + "@material/feature-targeting" "15.0.0-canary.684e33d25.0" + "@material/focus-ring" "15.0.0-canary.684e33d25.0" + "@material/ripple" "15.0.0-canary.684e33d25.0" + "@material/rtl" "15.0.0-canary.684e33d25.0" + "@material/shape" "15.0.0-canary.684e33d25.0" + "@material/theme" "15.0.0-canary.684e33d25.0" + "@material/tokens" "15.0.0-canary.684e33d25.0" + safevalues "^0.3.4" + tslib "^2.1.0" -"@jridgewell/source-map@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" - integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" +"@material/tab-bar@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/tab-bar/-/tab-bar-15.0.0-canary.684e33d25.0.tgz#621ca40d8ed36bf7213074c5737640ce49984480" + integrity sha512-SW/cMaDsIGGkM1ag3A7GJRlmr8eXmObWsvitQJzh6Azr5zzZtSI+GQygkMesAEE1gbpqOVN8d40rh3H7VVIAcA== + dependencies: + "@material/animation" "15.0.0-canary.684e33d25.0" + "@material/base" "15.0.0-canary.684e33d25.0" + "@material/density" "15.0.0-canary.684e33d25.0" + "@material/elevation" "15.0.0-canary.684e33d25.0" + "@material/feature-targeting" "15.0.0-canary.684e33d25.0" + "@material/tab" "15.0.0-canary.684e33d25.0" + "@material/tab-indicator" "15.0.0-canary.684e33d25.0" + "@material/tab-scroller" "15.0.0-canary.684e33d25.0" + "@material/theme" "15.0.0-canary.684e33d25.0" + "@material/tokens" "15.0.0-canary.684e33d25.0" + "@material/typography" "15.0.0-canary.684e33d25.0" + tslib "^2.1.0" -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.13" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz#b6461fb0c2964356c469e115f504c95ad97ab88c" - integrity sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w== +"@material/tab-indicator@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/tab-indicator/-/tab-indicator-15.0.0-canary.684e33d25.0.tgz#305c4461a45394619c9f89efca616816d21035b1" + integrity sha512-kKICqSPqOlaf0lzaFFCmuOqPXJC+cK48Qmsc+m5o6fJhkmuZRCYpIwB2JeP+uZSOq/bTH+SrPtCtnVlgWg6ksA== + dependencies: + "@material/animation" "15.0.0-canary.684e33d25.0" + "@material/base" "15.0.0-canary.684e33d25.0" + "@material/feature-targeting" "15.0.0-canary.684e33d25.0" + "@material/theme" "15.0.0-canary.684e33d25.0" + tslib "^2.1.0" -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== +"@material/tab-scroller@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/tab-scroller/-/tab-scroller-15.0.0-canary.684e33d25.0.tgz#ffe730dcca4fa1831fb541e9cdee9c566fff14ab" + integrity sha512-H6EU/TSiK/M2DyyORX5GEtXD9rKYxTMHC2VxsNWARPMFJGzgeW2ugYkFv+rKI1/c0bs0CJ4e+qFnOlBsQXZvyQ== dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" + "@material/animation" "15.0.0-canary.684e33d25.0" + "@material/base" "15.0.0-canary.684e33d25.0" + "@material/dom" "15.0.0-canary.684e33d25.0" + "@material/feature-targeting" "15.0.0-canary.684e33d25.0" + "@material/tab" "15.0.0-canary.684e33d25.0" + tslib "^2.1.0" + +"@material/tab@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/tab/-/tab-15.0.0-canary.684e33d25.0.tgz#73b12b8e6916b1d0befc7dd64f0f43ae45ea2f20" + integrity sha512-WQL3wj9syHNcfe8KbgGGUcA34M8C/xZ+n0Fkkh8Kk6puVwaU+xqUNihsxPY6YzKpmh4PZ4oJaBdiN8zvFT1zqQ== + dependencies: + "@material/base" "15.0.0-canary.684e33d25.0" + "@material/elevation" "15.0.0-canary.684e33d25.0" + "@material/feature-targeting" "15.0.0-canary.684e33d25.0" + "@material/focus-ring" "15.0.0-canary.684e33d25.0" + "@material/ripple" "15.0.0-canary.684e33d25.0" + "@material/rtl" "15.0.0-canary.684e33d25.0" + "@material/tab-indicator" "15.0.0-canary.684e33d25.0" + "@material/theme" "15.0.0-canary.684e33d25.0" + "@material/tokens" "15.0.0-canary.684e33d25.0" + "@material/typography" "15.0.0-canary.684e33d25.0" + tslib "^2.1.0" + +"@material/textfield@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/textfield/-/textfield-15.0.0-canary.684e33d25.0.tgz#ae3dcca57aa80a81a1fec6ae88877f6274d9ab6d" + integrity sha512-OvgpDXjvpyJTtAWskO69IDybFvDNzr9w2PN/Fk7yFm+uNVupaWz1Ew8lZ4gGslaTNSVmh2XcsvmzxcLINSiiNg== + dependencies: + "@material/animation" "15.0.0-canary.684e33d25.0" + "@material/base" "15.0.0-canary.684e33d25.0" + "@material/density" "15.0.0-canary.684e33d25.0" + "@material/dom" "15.0.0-canary.684e33d25.0" + "@material/feature-targeting" "15.0.0-canary.684e33d25.0" + "@material/floating-label" "15.0.0-canary.684e33d25.0" + "@material/line-ripple" "15.0.0-canary.684e33d25.0" + "@material/notched-outline" "15.0.0-canary.684e33d25.0" + "@material/ripple" "15.0.0-canary.684e33d25.0" + "@material/rtl" "15.0.0-canary.684e33d25.0" + "@material/shape" "15.0.0-canary.684e33d25.0" + "@material/theme" "15.0.0-canary.684e33d25.0" + "@material/tokens" "15.0.0-canary.684e33d25.0" + "@material/typography" "15.0.0-canary.684e33d25.0" + tslib "^2.1.0" -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.13": - version "0.3.15" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz#aba35c48a38d3fd84b37e66c9c0423f9744f9774" - integrity sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g== +"@material/theme@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/theme/-/theme-15.0.0-canary.684e33d25.0.tgz#0fa6faa4fbe6f17607e2313c826e5edfecce052a" + integrity sha512-AZxaXXAvRKzAi20RlMxzt2U5UmkCWyv7DMWEBXsxtG5Tk54mi1HsbVUp3fxDPTlmL7Pq8p1/DESg/o7TgRCVlw== dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" + "@material/feature-targeting" "15.0.0-canary.684e33d25.0" + tslib "^2.1.0" + +"@material/tokens@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/tokens/-/tokens-15.0.0-canary.684e33d25.0.tgz#ebfec227b7f1ed9db35227b199a24765d1882356" + integrity sha512-wVwbQOTCXDPKYPdHQHLr026y36MMFelID1CmbfRk6mSol4O8yE9U0fXcShfRDW8Qo5E3X31w9c2A6T3neJY7wQ== + dependencies: + "@material/elevation" "15.0.0-canary.684e33d25.0" + +"@material/tooltip@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/tooltip/-/tooltip-15.0.0-canary.684e33d25.0.tgz#981a20a010a7c41064f1a655f3f2482588585ed5" + integrity sha512-dtm26QjxyQdinc8btgz6yys07b7bUW4FZgNF2EBPeGrICrPg7jf+JEvDziz5g8VMaTBQLOQRSCGy0MKuRlOjLw== + dependencies: + "@material/animation" "15.0.0-canary.684e33d25.0" + "@material/base" "15.0.0-canary.684e33d25.0" + "@material/button" "15.0.0-canary.684e33d25.0" + "@material/dom" "15.0.0-canary.684e33d25.0" + "@material/elevation" "15.0.0-canary.684e33d25.0" + "@material/feature-targeting" "15.0.0-canary.684e33d25.0" + "@material/rtl" "15.0.0-canary.684e33d25.0" + "@material/shape" "15.0.0-canary.684e33d25.0" + "@material/theme" "15.0.0-canary.684e33d25.0" + "@material/tokens" "15.0.0-canary.684e33d25.0" + "@material/typography" "15.0.0-canary.684e33d25.0" + safevalues "^0.3.4" + tslib "^2.1.0" -"@jridgewell/trace-mapping@^0.3.7", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.13" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz#dcfe3e95f224c8fe97a87a5235defec999aa92ea" - integrity sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w== +"@material/top-app-bar@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/top-app-bar/-/top-app-bar-15.0.0-canary.684e33d25.0.tgz#3f5084d6c1f7fbaa791f23ddabc8c13dd4548465" + integrity sha512-1M+oupUxflfW7u81P1XlxoLZB8bLzwtpKofIfDNRbEsiKhlLTERJR3Yak3BGE9xakNMysAaBHlkb5MrN5bNPFw== + dependencies: + "@material/animation" "15.0.0-canary.684e33d25.0" + "@material/base" "15.0.0-canary.684e33d25.0" + "@material/elevation" "15.0.0-canary.684e33d25.0" + "@material/ripple" "15.0.0-canary.684e33d25.0" + "@material/rtl" "15.0.0-canary.684e33d25.0" + "@material/shape" "15.0.0-canary.684e33d25.0" + "@material/theme" "15.0.0-canary.684e33d25.0" + "@material/typography" "15.0.0-canary.684e33d25.0" + tslib "^2.1.0" + +"@material/touch-target@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/touch-target/-/touch-target-15.0.0-canary.684e33d25.0.tgz#4fed9c020cbd8d813b8c01f8590652b7c719cba7" + integrity sha512-zdE69Slg8+T7sTn1OwqZ6H7WBYac9mxJ/JlJqfTqthzIjZRcCxBSYymQJcDHjsrPnUojOtr9U4Tpm5YZ96TEkQ== dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" + "@material/base" "15.0.0-canary.684e33d25.0" + "@material/feature-targeting" "15.0.0-canary.684e33d25.0" + "@material/rtl" "15.0.0-canary.684e33d25.0" + "@material/theme" "15.0.0-canary.684e33d25.0" + tslib "^2.1.0" -"@leichtgewicht/ip-codec@^2.0.1": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" - integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== +"@material/typography@15.0.0-canary.684e33d25.0": + version "15.0.0-canary.684e33d25.0" + resolved "https://registry.yarnpkg.com/@material/typography/-/typography-15.0.0-canary.684e33d25.0.tgz#d2bd2cf9054206337b0b59a633e0dce8f8e3563b" + integrity sha512-aVnvgMwcfNa/K4wujzpKDIxjGl2hbkEL+m+OKDSQqWYjKcP9QrbzCXJruJBqxrBoPRHLbqo47k5f9uT8raSgjw== + dependencies: + "@material/feature-targeting" "15.0.0-canary.684e33d25.0" + "@material/theme" "15.0.0-canary.684e33d25.0" + tslib "^2.1.0" -"@mdx-js/mdx@^1.6.22": - version "1.6.22" - resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-1.6.22.tgz#8a723157bf90e78f17dc0f27995398e6c731f1ba" - integrity sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA== - dependencies: - "@babel/core" "7.12.9" - "@babel/plugin-syntax-jsx" "7.12.1" - "@babel/plugin-syntax-object-rest-spread" "7.8.3" - "@mdx-js/util" "1.6.22" - babel-plugin-apply-mdx-type-prop "1.6.22" - babel-plugin-extract-import-names "1.6.22" - camelcase-css "2.0.1" - detab "2.0.4" - hast-util-raw "6.0.1" - lodash.uniq "4.5.0" - mdast-util-to-hast "10.0.1" - remark-footnotes "2.0.0" - remark-mdx "1.6.22" - remark-parse "8.0.3" - remark-squeeze-paragraphs "4.0.0" - style-to-object "0.3.0" - unified "9.2.0" - unist-builder "2.0.3" - unist-util-visit "2.0.3" - -"@mdx-js/react@^1.6.22": - version "1.6.22" - resolved "https://registry.yarnpkg.com/@mdx-js/react/-/react-1.6.22.tgz#ae09b4744fddc74714ee9f9d6f17a66e77c43573" - integrity sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg== - -"@mdx-js/util@1.6.22": - version "1.6.22" - resolved "https://registry.yarnpkg.com/@mdx-js/util/-/util-1.6.22.tgz#219dfd89ae5b97a8801f015323ffa4b62f45718b" - integrity sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA== +"@mdx-js/react@^2.1.5": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@mdx-js/react/-/react-2.3.0.tgz#4208bd6d70f0d0831def28ef28c26149b03180b3" + integrity sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g== + dependencies: + "@types/mdx" "^2.0.0" + "@types/react" ">=16" "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" @@ -3048,50 +3031,59 @@ call-me-maybe "^1.0.1" glob-to-regexp "^0.3.0" -"@msgpackr-extract/msgpackr-extract-darwin-arm64@2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-2.0.2.tgz#01e3669b8b2dc01f6353f2c87e1ec94faf52c587" - integrity sha512-FMX5i7a+ojIguHpWbzh5MCsCouJkwf4z4ejdUY/fsgB9Vkdak4ZnoIEskOyOUMMB4lctiZFGszFQJXUeFL8tRg== +"@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" + integrity sha512-9bfjwDxIDWmmOKusUcqdS4Rw+SETlp9Dy39Xui9BEGEk19dDwH0jhipwFzEff/pFg95NKymc6TOTbRKcWeRqyQ== -"@msgpackr-extract/msgpackr-extract-darwin-x64@2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-2.0.2.tgz#5ca32f16e6f1b7854001a1a2345b61d4e26a0931" - integrity sha512-DznYtF3lHuZDSRaIOYeif4JgO0NtO2Xf8DsngAugMx/bUdTFbg86jDTmkVJBNmV+cxszz6OjGvinnS8AbJ342g== +"@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.2.tgz#f954f34355712212a8e06c465bc06c40852c6bb3" + integrity sha512-lwriRAHm1Yg4iDf23Oxm9n/t5Zpw1lVnxYU3HnJPTi2lJRkKTrps1KVgvL6m7WvmhYVt/FIsssWay+k45QHeuw== -"@msgpackr-extract/msgpackr-extract-linux-arm64@2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-2.0.2.tgz#ff629f94379981bf476dffb1439a7c1d3dba2d72" - integrity sha512-b0jMEo566YdM2K+BurSed7bswjo3a6bcdw5ETqoIfSuxKuRLPfAiOjVbZyZBgx3J/TAM/QrvEQ/VN89A0ZAxSg== +"@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.2.tgz#45c63037f045c2b15c44f80f0393fa24f9655367" + integrity sha512-FU20Bo66/f7He9Fp9sP2zaJ1Q8L9uLPZQDub/WlUip78JlPeMbVL8546HbZfcW9LNciEXc8d+tThSJjSC+tmsg== -"@msgpackr-extract/msgpackr-extract-linux-arm@2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-2.0.2.tgz#5f6fd30d266c4a90cf989049c7f2e50e5d4fcd4c" - integrity sha512-Gy9+c3Wj+rUlD3YvCZTi92gs+cRX7ZQogtwq0IhRenloTTlsbpezNgk6OCkt59V4ATEWSic9rbU92H/l7XsRvA== +"@msgpackr-extract/msgpackr-extract-linux-arm@3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.2.tgz#35707efeafe6d22b3f373caf9e8775e8920d1399" + integrity sha512-MOI9Dlfrpi2Cuc7i5dXdxPbFIgbDBGgKR5F2yWEa6FVEtSWncfVNKW5AKjImAQ6CZlBK9tympdsZJ2xThBiWWA== -"@msgpackr-extract/msgpackr-extract-linux-x64@2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-2.0.2.tgz#167faa553b9dbffac8b03bf27de9b6f846f0e1bc" - integrity sha512-zrBHaePwcv4cQXxzYgNj0+A8I1uVN97E7/3LmkRocYZ+rMwUsnPpp4RuTAHSRoKlTQV3nSdCQW4Qdt4MXw/iHw== +"@msgpackr-extract/msgpackr-extract-linux-x64@3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.2.tgz#091b1218b66c341f532611477ef89e83f25fae4f" + integrity sha512-gsWNDCklNy7Ajk0vBBf9jEx04RUxuDQfBse918Ww+Qb9HCPoGzS+XJTLe96iN3BVK7grnLiYghP/M4L8VsaHeA== -"@msgpackr-extract/msgpackr-extract-win32-x64@2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-2.0.2.tgz#baea7764b1adf201ce4a792fe971fd7211dad2e4" - integrity sha512-fpnI00dt+yO1cKx9qBXelKhPBdEgvc8ZPav1+0r09j0woYQU2N79w/jcGawSY5UGlgQ3vjaJsFHnGbGvvqdLzg== +"@msgpackr-extract/msgpackr-extract-win32-x64@3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.2.tgz#0f164b726869f71da3c594171df5ebc1c4b0a407" + integrity sha512-O+6Gs8UeDbyFpbSh2CPEz/UOrrdWPTBYNblZK5CxxLisYt4kGX3Sc+czffFonyjiGSq3jWLwJS/CCJc7tBr4sQ== -"@nestjs/bull-shared@^0.0.5": - version "0.0.5" - resolved "https://registry.yarnpkg.com/@nestjs/bull-shared/-/bull-shared-0.0.5.tgz#5cd9907fdc99cdd2a2088406bcae086e13918c4a" - integrity sha512-MPkl1q7N/ZlzLq4SC/NWdZ+7pIOF9x70+92xBcUPx7J6mewqVR1gzADHzEexErZEgg+K/n5nwJGe+BLlYFTUgg== +"@ndelangen/get-tarball@^3.0.7": + version "3.0.7" + resolved "https://registry.yarnpkg.com/@ndelangen/get-tarball/-/get-tarball-3.0.7.tgz#87c7aef2df4ff4fbdbab6ac9ed32cee142c4b1a3" + integrity sha512-NqGfTZIZpRFef1GoVaShSSRwDC3vde3ThtTeqFdcYd6ipKqnfEVhjK2hUeHjCQUcptyZr2TONqcloFXM+5QBrQ== dependencies: - tslib "2.3.1" + gunzip-maybe "^1.4.2" + pump "^3.0.0" + tar-fs "^2.1.1" -"@nestjs/bull@0.5.5": - version "0.5.5" - resolved "https://registry.yarnpkg.com/@nestjs/bull/-/bull-0.5.5.tgz#1ee9b7d8b78a52af58c4654de8d765a2a2b16862" - integrity sha512-g42/KH8YJmJE60kQVzQucWm5xEfyOj8iwXp2s3Ox3Yu6B/mmzNmqmXLnACnaD15q3WtH84vOhME41CJANxbQeQ== +"@nestjs/bull-shared@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@nestjs/bull-shared/-/bull-shared-0.1.3.tgz#df08180d3990c1234599069fa37c399d4913c6c1" + integrity sha512-K0a1ERpnl/ZnTmm0UtYSSClDlDkQwNNwJYM6PogzpeflD64oqwVIn8Pj8rdS+BOYUxqdDy55q3p67ytO5oaVDA== dependencies: - "@nestjs/bull-shared" "^0.0.5" - tslib "2.3.1" + tslib "2.5.0" + +"@nestjs/bull@0.6.3": + version "0.6.3" + resolved "https://registry.yarnpkg.com/@nestjs/bull/-/bull-0.6.3.tgz#c93e97c4575828bee9664a3deca650c55292d5af" + integrity sha512-CckH9O3t9qSiO4RCzdYvtFSaaMfIhTXMYagV/rtmVvI1SX5XNnxEaQXvtjxDBXF9DB1JE/5AejIl6ICym+MJIw== + dependencies: + "@nestjs/bull-shared" "^0.1.3" + tslib "2.5.0" "@nestjs/common@9.1.4": version "9.1.4" @@ -3157,28 +3149,16 @@ cron "2.0.0" uuid "8.3.2" -"@nestjs/schematics@9.0.3": - version "9.0.3" - resolved "https://registry.yarnpkg.com/@nestjs/schematics/-/schematics-9.0.3.tgz#175218350fb3829c9a903e980046a11950310e24" - integrity sha512-kZrU/lrpVd2cnK8I3ibDb3Wi1ppl3wX3U3lVWoL+DzRRoezWKkh8upEL4q0koKmuXnsmLiu3UPxFeMOrJV7TSA== +"@nestjs/schematics@9.1.0", "@nestjs/schematics@^9.0.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@nestjs/schematics/-/schematics-9.1.0.tgz#8afc4b1e7c7988c18d3ab44cffe56773b7507272" + integrity sha512-/7CyMTnPJSK9/xD9CkCqwuHPOlHVlLC2RDnbdCJ7mIO07SdbBbY14msTqtYW9VRQtsjZPLh1GTChf7ryJUImwA== dependencies: - "@angular-devkit/core" "14.2.1" - "@angular-devkit/schematics" "14.2.1" - fs-extra "10.1.0" + "@angular-devkit/core" "15.2.4" + "@angular-devkit/schematics" "15.2.4" jsonc-parser "3.2.0" pluralize "8.0.0" -"@nestjs/schematics@^9.0.0": - version "9.0.1" - resolved "https://registry.yarnpkg.com/@nestjs/schematics/-/schematics-9.0.1.tgz#2ec1b3fc4cd2c44310d4d7d1f5f276a18d24964b" - integrity sha512-QU7GbnQvADFXdumcdADmv4vil3bhnYl2IFHWKieRt0MgIhghgBxIB7kDKWhswcuZ0kZztVbyYjo9aCrlf62fcw== - dependencies: - "@angular-devkit/core" "14.0.5" - "@angular-devkit/schematics" "14.0.5" - fs-extra "10.1.0" - jsonc-parser "3.0.0" - pluralize "8.0.0" - "@nestjs/serve-static@3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@nestjs/serve-static/-/serve-static-3.0.0.tgz#085e7ebbb3c6d6e35b227ea57c8e988c87847309" @@ -3186,17 +3166,17 @@ dependencies: path-to-regexp "0.2.5" -"@nestjs/testing@9.1.4": - version "9.1.4" - resolved "https://registry.yarnpkg.com/@nestjs/testing/-/testing-9.1.4.tgz#8bb190f07356c796b828fba35018498d5ce8ab09" - integrity sha512-gO6b9QJyUajh38DNdss9gSE0UO7x60Jh10W4SwHEjQT1W+yxaEWr3aLyuQItTvUVY6C28XKFLTykMpr8GO28Ug== +"@nestjs/testing@9.4.0": + version "9.4.0" + resolved "https://registry.yarnpkg.com/@nestjs/testing/-/testing-9.4.0.tgz#1e5d1e799413e996c9c2da02a89dfefa62c3b70e" + integrity sha512-xZWp363P4otcebg++gSjUcdCfTK0RorORzyFq3aLaSAQOlq8kxfFDRIKzEATR4aOUfqTMMsAA8lhnMJWf35N6A== dependencies: - tslib "2.4.0" + tslib "2.5.0" -"@ngtools/webpack@14.2.1": - version "14.2.1" - resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-14.2.1.tgz#c88e23d4f1828467fc644d05e077671914e1cc7b" - integrity sha512-9tsfx2ZQscnpszVkdoJIIxZZDwitgmbPNrsQmyfHhwqPeJ8UUnAk6RNTfHjtX31VCmIM+qdGJsX7vDR9ye3/uA== +"@ngtools/webpack@15.2.5": + version "15.2.5" + resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-15.2.5.tgz#679c509fde254e92442ce97bc512638f4189453a" + integrity sha512-wD6GY4xghVK+SQL0dy/M3saGx5pqi7+1VHEr+BBI7IUNYGSqPNzylKNxLBgQiTzfkzvbrZ6MhfaMNkhvSCYr5w== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -3216,7 +3196,7 @@ 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.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" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== @@ -3224,364 +3204,490 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@npmcli/fs@^1.0.0": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.1.1.tgz#72f719fe935e687c56a4faecf3c03d06ba593257" - integrity sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ== +"@npmcli/fs@^2.1.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-2.1.2.tgz#a9e2541a4a2fec2e69c29b35e6060973da79b865" + integrity sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ== dependencies: - "@gar/promisify" "^1.0.1" + "@gar/promisify" "^1.1.3" semver "^7.3.5" -"@npmcli/fs@^2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-2.1.0.tgz#f2a21c28386e299d1a9fae8051d35ad180e33109" - integrity sha512-DmfBvNXGaetMxj9LTp8NAN9vEidXURrf5ZTslQzEAi/6GbW+4yjaLFQc6Tue5cpZ9Frlk4OBo/Snf1Bh/S7qTQ== +"@npmcli/fs@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-3.1.0.tgz#233d43a25a91d68c3a863ba0da6a3f00924a173e" + integrity sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w== dependencies: - "@gar/promisify" "^1.1.3" semver "^7.3.5" -"@npmcli/git@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-3.0.1.tgz#049b99b1381a2ddf7dc56ba3e91eaf76ca803a8d" - integrity sha512-UU85F/T+F1oVn3IsB/L6k9zXIMpXBuUBE25QDH0SsURwT6IOBqkC7M16uqo2vVZIyji3X1K4XH9luip7YekH1A== +"@npmcli/git@^4.0.0": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-4.0.4.tgz#cdf74f21b1d440c0756fb28159d935129d9daa33" + integrity sha512-5yZghx+u5M47LghaybLCkdSyFzV/w4OuH12d96HO389Ik9CDsLaDZJVynSGGVJOLn6gy/k7Dz5XYcplM3uxXRg== dependencies: - "@npmcli/promise-spawn" "^3.0.0" + "@npmcli/promise-spawn" "^6.0.0" lru-cache "^7.4.4" - mkdirp "^1.0.4" - npm-pick-manifest "^7.0.0" - proc-log "^2.0.0" + npm-pick-manifest "^8.0.0" + proc-log "^3.0.0" promise-inflight "^1.0.1" promise-retry "^2.0.1" semver "^7.3.5" - which "^2.0.2" - -"@npmcli/installed-package-contents@^1.0.7": - version "1.0.7" - resolved "https://registry.yarnpkg.com/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz#ab7408c6147911b970a8abe261ce512232a3f4fa" - integrity sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw== - dependencies: - npm-bundled "^1.1.1" - npm-normalize-package-bin "^1.0.1" + which "^3.0.0" -"@npmcli/move-file@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674" - integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== +"@npmcli/installed-package-contents@^2.0.1": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz#bfd817eccd9e8df200919e73f57f9e3d9e4f9e33" + integrity sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ== dependencies: - mkdirp "^1.0.4" - rimraf "^3.0.2" + npm-bundled "^3.0.0" + npm-normalize-package-bin "^3.0.0" "@npmcli/move-file@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-2.0.0.tgz#417f585016081a0184cef3e38902cd917a9bbd02" - integrity sha512-UR6D5f4KEGWJV6BGPH3Qb2EtgH+t+1XQ1Tt85c7qicN6cezzuHPdZwwAxqZr4JLtnQu0LZsTza/5gmNmSl8XLg== + version "2.0.1" + resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-2.0.1.tgz#26f6bdc379d87f75e55739bab89db525b06100e4" + integrity sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ== dependencies: mkdirp "^1.0.4" rimraf "^3.0.2" -"@npmcli/node-gyp@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-2.0.0.tgz#8c20e53e34e9078d18815c1d2dda6f2420d75e35" - integrity sha512-doNI35wIe3bBaEgrlPfdJPaCpUR89pJWep4Hq3aRdh6gKazIVWfs0jHttvSSoq47ZXgC7h73kDsUl8AoIQUB+A== - -"@npmcli/promise-spawn@^3.0.0": +"@npmcli/node-gyp@^3.0.0": version "3.0.0" - resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-3.0.0.tgz#53283b5f18f855c6925f23c24e67c911501ef573" - integrity sha512-s9SgS+p3a9Eohe68cSI3fi+hpcZUmXq5P7w0kMlAsWVtR7XbK3ptkZqKT2cK1zLDObJ3sR+8P59sJE0w/KTL1g== + resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz#101b2d0490ef1aa20ed460e4c0813f0db560545a" + integrity sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA== + +"@npmcli/promise-spawn@^6.0.0", "@npmcli/promise-spawn@^6.0.1": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz#c8bc4fa2bd0f01cb979d8798ba038f314cfa70f2" + integrity sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg== dependencies: - infer-owner "^1.0.4" + which "^3.0.0" -"@npmcli/run-script@^4.1.0": - version "4.1.7" - resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-4.1.7.tgz#b1a2f57568eb738e45e9ea3123fb054b400a86f7" - integrity sha512-WXr/MyM4tpKA4BotB81NccGAv8B48lNH0gRoILucbcAhTQXLCoi6HflMV3KdXubIqvP9SuLsFn68Z7r4jl+ppw== +"@npmcli/run-script@^6.0.0": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-6.0.1.tgz#a94404783d9afaff62decb71944435d0d8a29f8e" + integrity sha512-Yi04ZSold8jcbBJD/ahKMJSQCQifH8DAbMwkBvoLaTpGFxzHC3B/5ZyoVR69q/4xedz84tvi9DJOJjNe17h+LA== dependencies: - "@npmcli/node-gyp" "^2.0.0" - "@npmcli/promise-spawn" "^3.0.0" + "@npmcli/node-gyp" "^3.0.0" + "@npmcli/promise-spawn" "^6.0.0" node-gyp "^9.0.0" - read-package-json-fast "^2.0.3" - which "^2.0.2" + read-package-json-fast "^3.0.0" + which "^3.0.0" + +"@nrwl/angular@16.0.3": + version "16.0.3" + resolved "https://registry.yarnpkg.com/@nrwl/angular/-/angular-16.0.3.tgz#c388806a7ecd88591843c8cf5388ba69e811a736" + integrity sha512-LNbrOhbPcC6r3e+aS0PmWa9sbfEqT+daB3eNogh8UxPBqRa1kgsmGlvwF9UYnBgT3VGh8EvrrfgpxDyjeVuU1g== + dependencies: + "@nx/angular" "16.0.3" + tslib "^2.3.0" + +"@nrwl/cypress@16.0.3": + version "16.0.3" + resolved "https://registry.yarnpkg.com/@nrwl/cypress/-/cypress-16.0.3.tgz#fc822de6a20ab47591434097326703ac520e7ccd" + integrity sha512-TO1xuoZvFlJK+DYirJ8gys6hpgRiwiwOZfZ6/3AtO/t3xv6ngc63sfzT/lFUoHlEQwMvcypARUtgmSqXAaP9oA== + dependencies: + "@nx/cypress" "16.0.3" + +"@nrwl/devkit@16.0.3": + version "16.0.3" + resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-16.0.3.tgz#ee9141e49d28196aa7250c001f3e3e267e920da5" + integrity sha512-DbSV0vgPc3n/1mP0rKnVgO+m+mNGWRyUjvYifD1IJEvY8qaTsakfqIheINNElK369D5AHrIajCc2FJFHb1OrMw== + dependencies: + "@nx/devkit" "16.0.3" + +"@nrwl/eslint-plugin-nx@16.0.3": + version "16.0.3" + resolved "https://registry.yarnpkg.com/@nrwl/eslint-plugin-nx/-/eslint-plugin-nx-16.0.3.tgz#05b67e79bea87d9a85441b1d373ae4d24e76f61b" + integrity sha512-GyAGEVNnJlVcf2SlzcpwUbgrxCKDsAuxMqUYc4/qrlyMSMuFhrd4WQL9aP6/y3WNyB+1Dp5ZTs4QKevEY/cSsA== + dependencies: + "@nx/eslint-plugin" "16.0.3" + +"@nrwl/jest@16.0.3": + version "16.0.3" + resolved "https://registry.yarnpkg.com/@nrwl/jest/-/jest-16.0.3.tgz#dc5fcc8a4395e5ab43e6d9d7ff10d812ee18a33b" + integrity sha512-rIwmz8IXc0X0MPajhhmfcCJEPbPv+k3ozmv/nD7cjvD82Ix9ZgD3kCOclpVWBVgKf8GU1mCHLP5YgrruKuuz2Q== + dependencies: + "@nx/jest" "16.0.3" + +"@nrwl/js@16.0.3": + version "16.0.3" + resolved "https://registry.yarnpkg.com/@nrwl/js/-/js-16.0.3.tgz#439a59b67abedffd1a953b987e0f94369853712f" + integrity sha512-uesZETyFjlAQUqSrOC1PLRMumxzH27mFLVw/adClBcQABpZHvMsb9LxazQf6LBNDfWMUw7fORJoB2iYFBL9yjQ== + dependencies: + "@nx/js" "16.0.3" + +"@nrwl/linter@16.0.3": + version "16.0.3" + resolved "https://registry.yarnpkg.com/@nrwl/linter/-/linter-16.0.3.tgz#c2141fa6ea3c003e4a7f8de54fe82b91a7b026b2" + integrity sha512-IxpWNMwYOBrtrsaN/Fszxks0THHVRI6M+Uh/dGvhhqB32riNB+aGonwxYE4X+kTvJQRWasYep4ttiC8ZF/nNBQ== + dependencies: + "@nx/linter" "16.0.3" + +"@nrwl/nest@16.0.3": + version "16.0.3" + resolved "https://registry.yarnpkg.com/@nrwl/nest/-/nest-16.0.3.tgz#c4ab9301f5916bda472f8037e93848993e8abac2" + integrity sha512-bFG1H4zSZqRyRq1kIDS6tAYXl4KON4IdRZQA/gDma1t6Wm/F8M/KAtZTh5aV8gzFeH0GZMaV2dSO+yf5QA6rfg== + dependencies: + "@nx/nest" "16.0.3" + +"@nrwl/node@16.0.3": + version "16.0.3" + resolved "https://registry.yarnpkg.com/@nrwl/node/-/node-16.0.3.tgz#f94b1dc8e11dd5a9cb315884b92067d7bd00dc68" + integrity sha512-TUWbaxUoVNBjq/3XnWo9y04AAyjOrQwp+fdCWmwQ33VR6zQncJNzg1CcTqDRlxJYsqwoAJwgoyGAD9eczjU6GA== + dependencies: + "@nx/node" "16.0.3" + +"@nrwl/nx-cloud@16.0.5": + version "16.0.5" + resolved "https://registry.yarnpkg.com/@nrwl/nx-cloud/-/nx-cloud-16.0.5.tgz#c963480a71c4afa964fbbe9e4d6bbf222764e9cd" + integrity sha512-1p82ym8WE9ziejwgPslstn19iV/VkHfHfKr/5YOnfCHQS+NxUf92ogcYhHXtqWLblVZ9Zs4W4pkSXK4e04wCmQ== + dependencies: + nx-cloud "16.0.5" + +"@nrwl/storybook@16.0.3": + version "16.0.3" + resolved "https://registry.yarnpkg.com/@nrwl/storybook/-/storybook-16.0.3.tgz#1ab12d24c96a32503ecb2630ad494e89ae5c6b39" + integrity sha512-Q9iLJ6DBBk3zVtca+GhWVrAUWo3DZH1xKIbxlbwpclV2LpdSzCc3diYNovlCX1lO7kuHlMmoHII+hBwyVQaNfg== + dependencies: + "@nx/storybook" "16.0.3" + +"@nrwl/tao@16.0.3": + version "16.0.3" + resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-16.0.3.tgz#f0a34f20118484f3ffc1e8c4acb5cb520d012935" + integrity sha512-CAECe97eReR1vVf5iuv+Nw0msDJS/HtRBpkkN5e65lSJzEKdsOgpWtteU0QzexN/Spnah8Q/ByM14ii2P1xpCQ== + dependencies: + nx "16.0.3" + +"@nrwl/web@16.0.3": + version "16.0.3" + resolved "https://registry.yarnpkg.com/@nrwl/web/-/web-16.0.3.tgz#ebaf116386bdba44e673fb67dc099fe6fd85ddf9" + integrity sha512-c7Qjsjj+xGKIvrkpczYZZY7I7S/QUvWFjzSahr2v889DxfLLHTvn/p9MTUfK0kWQ/TMaCgNWhq3pivP6qOng+A== + dependencies: + "@nx/web" "16.0.3" + +"@nrwl/webpack@16.0.3": + version "16.0.3" + resolved "https://registry.yarnpkg.com/@nrwl/webpack/-/webpack-16.0.3.tgz#2334eb7c5aaeec6f1a8ed2f95dc4d2ef7e7bc9c3" + integrity sha512-nLmv0qpPG3ydk/eZ1cn19S8TTzpHxQaQfjKCWt8+dUpog1Eo0ZxEVVaRWyZWDG3oY65Wq6hyKZ2GL1FYbcKgVA== + dependencies: + "@nx/webpack" "16.0.3" + +"@nrwl/workspace@16.0.3": + version "16.0.3" + resolved "https://registry.yarnpkg.com/@nrwl/workspace/-/workspace-16.0.3.tgz#3e6024f59d857cf64fbe2df011ae90e367adab07" + integrity sha512-94mcNTttzv9IPKrA/uwGpb1gtIdZKaOJS0Pn/Ec72vEdqL+La6pUaYzEvrPSaBNlf6p+3ZzGYCtw03exar/GdQ== + dependencies: + "@nx/workspace" "16.0.3" + +"@nuxtjs/opencollective@0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz#620ce1044f7ac77185e825e1936115bb38e2681c" + integrity sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA== + dependencies: + chalk "^4.1.0" + consola "^2.15.0" + node-fetch "^2.6.1" -"@nrwl/angular@15.0.0": - version "15.0.0" - resolved "https://registry.yarnpkg.com/@nrwl/angular/-/angular-15.0.0.tgz#c920aa1c96e345591bd25f7cb85e8e861b1cd138" - integrity sha512-P3Kh4Z8Hc1pT5kXTmrdUiMnEowr5l7umNJ0+ei5rehzkfZyYQaeZZoVdDWn/0uWuVEOPeYOE+DUpasOk9PjTiQ== - dependencies: - "@angular-devkit/schematics" "~14.2.0" - "@nrwl/cypress" "15.0.0" - "@nrwl/devkit" "15.0.0" - "@nrwl/jest" "15.0.0" - "@nrwl/linter" "15.0.0" - "@nrwl/storybook" "15.0.0" - "@nrwl/webpack" "15.0.0" - "@nrwl/workspace" "15.0.0" - "@phenomnomnominal/tsquery" "4.1.1" - "@schematics/angular" "~14.2.0" - chalk "4.1.0" +"@nx/angular@16.0.3": + version "16.0.3" + resolved "https://registry.yarnpkg.com/@nx/angular/-/angular-16.0.3.tgz#4fe60ba6020d43c16e24ed79b67632d97944da4f" + integrity sha512-JENzYWE0j0hqRTB+Km4VAR+WbFOA7LO6WQJYh05lpGEprtIcHbtvHelDA04nyQwKp1Q2cxVDvpHNEBa4CZ1dWQ== + dependencies: + "@nrwl/angular" "16.0.3" + "@nx/cypress" "16.0.3" + "@nx/devkit" "16.0.3" + "@nx/jest" "16.0.3" + "@nx/js" "16.0.3" + "@nx/linter" "16.0.3" + "@nx/webpack" "16.0.3" + "@nx/workspace" "16.0.3" + "@phenomnomnominal/tsquery" "~5.0.1" + chalk "^4.1.0" chokidar "^3.5.1" + enquirer "^2.3.6" http-server "^14.1.0" ignore "^5.0.4" magic-string "~0.26.2" minimatch "3.0.5" semver "7.3.4" ts-node "10.9.1" - tsconfig-paths "^3.9.0" + tsconfig-paths "^4.1.2" tslib "^2.3.0" - webpack "^5.58.1" + webpack "^5.75.0" webpack-merge "5.7.3" -"@nrwl/cli@15.0.0": - version "15.0.0" - resolved "https://registry.yarnpkg.com/@nrwl/cli/-/cli-15.0.0.tgz#7b00d95a6502f83fdd84f8888fd1ba7a180cdd07" - integrity sha512-D0zAhZ375bQnoUM2HLifMzAa75A3/lC9OkkewsiVVbqaznjEIry8ezHZepgfjFRVzLr3ue7FIpDEH3iJIYzvVw== - dependencies: - nx "15.0.0" - -"@nrwl/cypress@15.0.0": - version "15.0.0" - resolved "https://registry.yarnpkg.com/@nrwl/cypress/-/cypress-15.0.0.tgz#c7f19de7571977f48deac8a37572d5ff015aebdc" - integrity sha512-H9KJH4lqdoxQcVqJZhyhz1rYrXaUJW9Fu1yX2xOPBE+FQjQVQ5SAU8F72vNfYcBKOb6ZPu6rbtX6FULOZcPqjQ== - dependencies: - "@babel/core" "^7.0.1" - "@babel/preset-env" "^7.0.0" - "@cypress/webpack-preprocessor" "^5.12.0" - "@nrwl/devkit" "15.0.0" - "@nrwl/linter" "15.0.0" - "@nrwl/workspace" "15.0.0" - "@phenomnomnominal/tsquery" "4.1.1" - babel-loader "^8.0.2" - chalk "4.1.0" +"@nx/cypress@16.0.3": + version "16.0.3" + resolved "https://registry.yarnpkg.com/@nx/cypress/-/cypress-16.0.3.tgz#a7b3a9d0d6740f31ea01ff2e93b6d30ae5cc7319" + integrity sha512-3/hZEhSpBAdr7J4BsAFW7Kd68lJ0POTKojF0ObjxTTI99XPPuPsNtxUCTvKGuEm8uUfI60g8Esy8oGhfwDTvaQ== + dependencies: + "@nrwl/cypress" "16.0.3" + "@nx/devkit" "16.0.3" + "@nx/js" "16.0.3" + "@nx/linter" "16.0.3" + "@phenomnomnominal/tsquery" "~5.0.1" + detect-port "^1.5.1" dotenv "~10.0.0" - fork-ts-checker-webpack-plugin "7.2.13" semver "7.3.4" - ts-loader "^9.3.1" - tsconfig-paths-webpack-plugin "3.5.2" - tslib "^2.3.0" - webpack "^4 || ^5" - webpack-node-externals "^3.0.0" -"@nrwl/devkit@15.0.0": - version "15.0.0" - resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-15.0.0.tgz#755bc07581a57e0ae87f68a7562ab86ff737e919" - integrity sha512-ALtPfILlxLDg77rV/XNdDGbhUkh0gZPj/4Ehy3ScvVqPhTrDIZNLGX13dXgUUF9xhGb7SXPmvzZkduBpqmHnfQ== +"@nx/devkit@16.0.3": + version "16.0.3" + resolved "https://registry.yarnpkg.com/@nx/devkit/-/devkit-16.0.3.tgz#3b5be0b9904784fd601d8101b2cb5804de028773" + integrity sha512-DO4cq1tBtGB+XiHehvJEjYf7gJ/TgDfWuN9PJqcAGC7wxxlsS/4P6ZEr6kmlPjb1FHH6NLgtcp+R+D0zSpV6Ag== dependencies: - "@phenomnomnominal/tsquery" "4.1.1" + "@nrwl/devkit" "16.0.3" ejs "^3.1.7" ignore "^5.0.4" semver "7.3.4" + tmp "~0.2.1" tslib "^2.3.0" -"@nrwl/eslint-plugin-nx@15.0.0": - version "15.0.0" - resolved "https://registry.yarnpkg.com/@nrwl/eslint-plugin-nx/-/eslint-plugin-nx-15.0.0.tgz#db7409bb5e4c256d208635a43341af76498fe73d" - integrity sha512-dUXDPM1lhZCUEG2l/ByoQWt4C74KtVRJeljDUDK14P8oWgD6xMASBDob0fxDoI6uK2PQFnGnmO6OI429bMhmSg== +"@nx/eslint-plugin@16.0.3": + version "16.0.3" + resolved "https://registry.yarnpkg.com/@nx/eslint-plugin/-/eslint-plugin-16.0.3.tgz#39a316aba0e2e82059d19d80e79347abe6b7c554" + integrity sha512-91yWq6kbTJYiRJ6rjp95DQmSf+wPzHSUZE0JyjzFY/l0vO5avTumupta+fNAfgGz10HDJcaqgPQIkAAGeblxyQ== dependencies: - "@nrwl/devkit" "15.0.0" - "@nrwl/workspace" "15.0.0" - "@typescript-eslint/utils" "^5.36.1" - chalk "4.1.0" + "@nrwl/eslint-plugin-nx" "16.0.3" + "@nx/devkit" "16.0.3" + "@nx/js" "16.0.3" + "@typescript-eslint/utils" "^5.58.0" + chalk "^4.1.0" confusing-browser-globals "^1.0.9" semver "7.3.4" -"@nrwl/jest@15.0.0": - version "15.0.0" - resolved "https://registry.yarnpkg.com/@nrwl/jest/-/jest-15.0.0.tgz#d10586a8b1cb092d6ea19f811bae131f3213fa1a" - integrity sha512-CSwUPMq/pFetackADicRGu1EiAvJVcOPwOvZdByfm8QLSZyFCXNjvpSUtbAnh48cKv+rU4jAlmJ3PZ7youJgiw== - dependencies: - "@jest/reporters" "28.1.1" - "@jest/test-result" "28.1.1" - "@nrwl/devkit" "15.0.0" - "@phenomnomnominal/tsquery" "4.1.1" - chalk "4.1.0" +"@nx/jest@16.0.3": + version "16.0.3" + resolved "https://registry.yarnpkg.com/@nx/jest/-/jest-16.0.3.tgz#1bf7272741a5ca2a46c45037567a1e119cb74d48" + integrity sha512-j8Ifkf7RTngGG4xh1/+ryaok+7qEN1frUm96oZN52m1ioAVBIKfCG0VtIicafDhFQ4xTOpHvCY/yB0B90kF2ug== + dependencies: + "@jest/reporters" "^29.4.1" + "@jest/test-result" "^29.4.1" + "@nrwl/jest" "16.0.3" + "@nx/devkit" "16.0.3" + "@nx/js" "16.0.3" + "@phenomnomnominal/tsquery" "~5.0.1" + chalk "^4.1.0" dotenv "~10.0.0" identity-obj-proxy "3.0.0" - jest-config "28.1.1" - jest-resolve "28.1.1" - jest-util "28.1.1" + jest-config "^29.4.1" + jest-resolve "^29.4.1" + jest-util "^29.4.1" resolve.exports "1.1.0" tslib "^2.3.0" -"@nrwl/js@15.0.0": - version "15.0.0" - resolved "https://registry.yarnpkg.com/@nrwl/js/-/js-15.0.0.tgz#fe7dd65e9125d55a130c21122f08d177775d5dac" - integrity sha512-S7JDE9sxFKIdK8JmKeVUI8dGuZ+jSsWqUQ8jaB7EdFZJoR81WwhgiDImwyuBI8EicTjoyV+e+JhWepXpetwsTg== - dependencies: - "@nrwl/devkit" "15.0.0" - "@nrwl/jest" "15.0.0" - "@nrwl/linter" "15.0.0" - "@nrwl/workspace" "15.0.0" - "@parcel/watcher" "2.0.4" - chalk "4.1.0" +"@nx/js@16.0.3": + version "16.0.3" + resolved "https://registry.yarnpkg.com/@nx/js/-/js-16.0.3.tgz#c83d3673eb2aa2f23a5370e3fbc039b62f2f596d" + integrity sha512-usi3vfP1f5EiwFPZ8GfY1VO3s+ymDxKhizS2vsRwsyOwctcxU0ZYxEfXytuMzOO0MPVYXA+Njqa8+dy9+QJiMg== + dependencies: + "@babel/core" "^7.15.0" + "@babel/plugin-proposal-class-properties" "^7.14.5" + "@babel/plugin-proposal-decorators" "^7.14.5" + "@babel/plugin-transform-runtime" "^7.15.0" + "@babel/preset-env" "^7.15.0" + "@babel/preset-typescript" "^7.15.0" + "@babel/runtime" "^7.14.8" + "@nrwl/js" "16.0.3" + "@nx/devkit" "16.0.3" + "@nx/workspace" "16.0.3" + "@phenomnomnominal/tsquery" "~5.0.1" + babel-plugin-const-enum "^1.0.1" + babel-plugin-macros "^2.8.0" + babel-plugin-transform-typescript-metadata "^0.3.1" + chalk "^4.1.0" fast-glob "3.2.7" - fs-extra "^10.1.0" + fs-extra "^11.1.0" ignore "^5.0.4" js-tokens "^4.0.0" minimatch "3.0.5" source-map-support "0.5.19" tree-kill "1.2.2" + tslib "^2.3.0" -"@nrwl/linter@15.0.0": - version "15.0.0" - resolved "https://registry.yarnpkg.com/@nrwl/linter/-/linter-15.0.0.tgz#806e4a58339aa930bd9de7e0b977cc372b010f5b" - integrity sha512-h2Momt/VfNtUIJESSG7FM9bfJFRfu/xpDnXgvvLLeUz+EWUfWK/HeuYhV1a9AGyTfCPV3pp4k7Ph/DiV//8VMQ== +"@nx/linter@16.0.3": + version "16.0.3" + resolved "https://registry.yarnpkg.com/@nx/linter/-/linter-16.0.3.tgz#78ee33372ece4db68c02f112319e735d0a3d7e9b" + integrity sha512-AP3Y2jQYJtpgWBddUFosEXJN5QvOui3DC0Cr/b5c2Q9E1N90V3UKof71m0fX5h5lpee7zkLlhjlTnqt9K803rg== dependencies: - "@nrwl/devkit" "15.0.0" - "@nrwl/jest" "15.0.0" - "@phenomnomnominal/tsquery" "4.1.1" - nx "15.0.0" + "@nrwl/linter" "16.0.3" + "@nx/devkit" "16.0.3" + "@nx/js" "16.0.3" + "@phenomnomnominal/tsquery" "~5.0.1" tmp "~0.2.1" tslib "^2.3.0" -"@nrwl/nest@15.0.0": - version "15.0.0" - resolved "https://registry.yarnpkg.com/@nrwl/nest/-/nest-15.0.0.tgz#5384d8a207674d8de73940b8291746705042e446" - integrity sha512-ZWoXiB/bnGy5wLdhZNBsOpnGZlXjII2Vt+BAuxFhq+wC73qd+wUbHM1VFAjPVcRqZbSWVkuaQdQmX0lFpwrI/Q== +"@nx/nest@16.0.3": + version "16.0.3" + resolved "https://registry.yarnpkg.com/@nx/nest/-/nest-16.0.3.tgz#e23d596cb76da8926a36f28a7b0a03e0b63a5a4b" + integrity sha512-ocfJhpqQ8SYsUp5Mh7gIKiSmNOM/HaNwXn1evNj3qNo0mcrlrAkRJnbECyQIU+IGxjp1aQKHDr+lahoGAGKWVg== dependencies: "@nestjs/schematics" "^9.0.0" - "@nrwl/devkit" "15.0.0" - "@nrwl/js" "15.0.0" - "@nrwl/linter" "15.0.0" - "@nrwl/node" "15.0.0" + "@nrwl/nest" "16.0.3" + "@nx/devkit" "16.0.3" + "@nx/js" "16.0.3" + "@nx/linter" "16.0.3" + "@nx/node" "16.0.3" enquirer "~2.3.6" -"@nrwl/node@15.0.0": - version "15.0.0" - resolved "https://registry.yarnpkg.com/@nrwl/node/-/node-15.0.0.tgz#731efec611799a40a6507825a8b21b9e5762e00b" - integrity sha512-szE4+gnjKM6EV9N+dHvpu89iCAK7XhwM8SStfDylHOzRrIJ8JtGFJE4WxSn0DH2bJdQbBd78jTbpivTk++0d3A== - dependencies: - "@nrwl/devkit" "15.0.0" - "@nrwl/jest" "15.0.0" - "@nrwl/js" "15.0.0" - "@nrwl/linter" "15.0.0" - "@nrwl/webpack" "15.0.0" - "@nrwl/workspace" "15.0.0" - chalk "4.1.0" +"@nx/node@16.0.3": + version "16.0.3" + resolved "https://registry.yarnpkg.com/@nx/node/-/node-16.0.3.tgz#00e093c2089d3338fa0e44ef20af4bbe9a6098bf" + integrity sha512-SdBXpYNkApk36LmLS9BClJC/fLTq/Sk+Zo9LN21uxeE0RZqQJ2l+R1GlMqrtH0Uf7Syu97XCWFnumPak8pCtSw== + dependencies: + "@nrwl/node" "16.0.3" + "@nx/devkit" "16.0.3" + "@nx/jest" "16.0.3" + "@nx/js" "16.0.3" + "@nx/linter" "16.0.3" + "@nx/workspace" "16.0.3" tslib "^2.3.0" -"@nrwl/nx-cloud@15.0.0": - version "15.0.0" - resolved "https://registry.yarnpkg.com/@nrwl/nx-cloud/-/nx-cloud-15.0.0.tgz#81d4feca9b0826a8cea3d431d4189e5ebb5e3efd" - integrity sha512-KAYmbx8M4we9gUn14rDnt5vMz+yYwIa4xJNsByWf7mjzC4lvBVZKqFzFGaklWzp/gJN/xyNleZt/Fg64k/kF+A== - dependencies: - axios "^0.21.2" - chalk "4.1.0" - dotenv "~10.0.0" - fs-extra "^10.1.0" - node-machine-id "^1.1.12" - strip-json-comments "^3.1.1" - tar "6.1.11" - yargs-parser ">=21.0.1" - -"@nrwl/storybook@15.0.0": - version "15.0.0" - resolved "https://registry.yarnpkg.com/@nrwl/storybook/-/storybook-15.0.0.tgz#f86e14999042adedaeaaf8481737e5553f3e0ca8" - integrity sha512-Qiqa/UzwxREHyHoSMTdpw37684iuBKZPabNvMGvocdRYE2bmKZodBaBJ0ln2rw2KAhc2DsR6bpC7/5E/OFWxlw== - dependencies: - "@nrwl/cypress" "15.0.0" - "@nrwl/devkit" "15.0.0" - "@nrwl/linter" "15.0.0" - "@nrwl/workspace" "15.0.0" +"@nx/nx-darwin-arm64@16.0.3": + version "16.0.3" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-16.0.3.tgz#dfd754593de11b6bc0811d2087aedca9df6fb3de" + integrity sha512-QBOlHVTSs6ZN86QoomFDsIhk9rhpCS7w7O6t4wSL4YyB09IqX0unvrsaLLoAx2iEbm+UOMc12klVKWoMQyhHwg== + +"@nx/nx-darwin-x64@16.0.3": + version "16.0.3" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-16.0.3.tgz#79ba57e7d3ee7f88c0469018ac7b1ea846fab50e" + integrity sha512-h2ZjBCwt2Nv7+F9tKHl7Y/xFGn9YUJEkS5TzFTgTfvL9AP5O/8cqwiDebslxeZ7Choff5Slmkj+P2WhJhKa7qQ== + +"@nx/nx-linux-arm-gnueabihf@16.0.3": + version "16.0.3" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-16.0.3.tgz#da9ceb05a6b753aedffc785a98ede44d98ca1410" + integrity sha512-gJVkTxOPDdgDPwaMYKvjfcIrWnt1cMlD3tKe9j4jVWsddO9JFLRAtknhXiLFkdcgZwQPo8P1hvo7QgbavbuVSA== + +"@nx/nx-linux-arm64-gnu@16.0.3": + version "16.0.3" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-16.0.3.tgz#43f461abb902d60f72ab2008c4ec61dbac88f4d5" + integrity sha512-p1ZxZxosfso74aDrP+ofmzrqH3om4LpRAfLDN69L/4OMTT10qLsPpMShWpw9j1U+wZc5o05ZdTMCbeg4jx4Tug== + +"@nx/nx-linux-arm64-musl@16.0.3": + version "16.0.3" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-16.0.3.tgz#71400eb49930ff188e6457434cfb2c9d08b08912" + integrity sha512-t2cQw84TyVdDATFK2R3NyG/LiweBiBLcneHuI8AFr0PSJSqof8BIHqX9NNB2L5z9j2XkEeMgsqnlXfQtOzNXJA== + +"@nx/nx-linux-x64-gnu@16.0.3": + version "16.0.3" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-16.0.3.tgz#a2d888621882a0bf1cf038981529fcb076c12b47" + integrity sha512-sKYP9RXAK+wZRXUIlOhqwvSOW6FJblJZPKKHXCWWq9dvAr3CXaWKr+Tt+7846fAX3Q+3hyckuAi6eEiT3XHMTA== + +"@nx/nx-linux-x64-musl@16.0.3": + version "16.0.3" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-16.0.3.tgz#19726dd93c9854fc577f5045bdf13082a7568684" + integrity sha512-AcDWUAs+Tgy4M0bguehUmZTPKE97pYP9GCM8QPzeNJLWyjCfkwHSUImOa0C8+Vx33uRO7I6uPa6QGEoEv/TiFg== + +"@nx/nx-win32-arm64-msvc@16.0.3": + version "16.0.3" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-16.0.3.tgz#8c2112727ff3801d1627e3b0fa0879526250ff1b" + integrity sha512-2aXeXYLOhyS0hrSqM5T0T4GK3EoQZZY7oyO4+ruk5f5JZq4LxmdJsrnkgBBR3FmPt7P/GT8vykgJuO9pUAWohQ== + +"@nx/nx-win32-x64-msvc@16.0.3": + version "16.0.3" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-16.0.3.tgz#dfe6a39bc58495234baba99b9a10b6d5d17db382" + integrity sha512-/Ezru8nlrckLAQ4s7wEAW192DULgWj9YBqREQPV0ddzwjeVC0clsHSXguH8WzMwEU44+IFnqNMJrWK3mZCvZYA== + +"@nx/storybook@16.0.3": + version "16.0.3" + resolved "https://registry.yarnpkg.com/@nx/storybook/-/storybook-16.0.3.tgz#2b274c20922d0ba39f7902651794805feaf0c692" + integrity sha512-22vh1AZLr+PmUL7+J6pJGUkHgitqIEiBJJljyKNUzGvC7VGuCh+AWWNX6jJDzdF/PC57CdaSBeFRjuJuKmjBYA== + dependencies: + "@nrwl/storybook" "16.0.3" + "@nx/cypress" "16.0.3" + "@nx/devkit" "16.0.3" + "@nx/js" "16.0.3" + "@nx/linter" "16.0.3" + "@nx/workspace" "16.0.3" + "@phenomnomnominal/tsquery" "~5.0.1" dotenv "~10.0.0" + enquirer "~2.3.6" semver "7.3.4" -"@nrwl/tao@15.0.0": - version "15.0.0" - resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-15.0.0.tgz#128499a4256e408716f7347131a3ed32d1fec5f0" - integrity sha512-qup1eSWYwp/KVrw/wxeWBvYttQ9dcbQnqpXb5NQMD31SpXEZSpJB1i3GV/o6CF5qQQSNLwICXZx25rNTTQAqpg== +"@nx/web@16.0.3": + version "16.0.3" + resolved "https://registry.yarnpkg.com/@nx/web/-/web-16.0.3.tgz#353e4bf30ea36ca2fd2d11d068bf2674baf021b6" + integrity sha512-wh4IxhhWoDliD/pZacMxzUIaK32LazC/UKJQj99gq/rdSmgTOX9CeF9BvBeh4skF5AUaCGnWWn4cZEnwf6kYhg== dependencies: - nx "15.0.0" + "@nrwl/web" "16.0.3" + "@nx/devkit" "16.0.3" + "@nx/js" "16.0.3" + chalk "^4.1.0" + chokidar "^3.5.1" + http-server "^14.1.0" + ignore "^5.0.4" + tslib "^2.3.0" -"@nrwl/webpack@15.0.0": - version "15.0.0" - resolved "https://registry.yarnpkg.com/@nrwl/webpack/-/webpack-15.0.0.tgz#5521a01991394727fe2ea2bf9aa67a4edde3b6a1" - integrity sha512-rnSQXZeRG+svGbZWv2/C01qU4iJi7CGr6MypCWkVr29B4pbnDVHrm8w3MxyXV3nGPsU1ooaPjNyDZiarylpoyg== +"@nx/webpack@16.0.3": + version "16.0.3" + resolved "https://registry.yarnpkg.com/@nx/webpack/-/webpack-16.0.3.tgz#40aff30cff95878d2faf27bc2b6bde7ddb7f650e" + integrity sha512-3a8xboBvcvCz/kqRDJqxUEo9bJV9zp/W+oLtGd9+VsFdk7qSTY68eI5iJbef6bqUyAD48GRzugQRxDi5F/kc5g== dependencies: - "@nrwl/devkit" "15.0.0" - "@nrwl/js" "15.0.0" - "@nrwl/workspace" "15.0.0" + "@babel/core" "^7.15.0" + "@nrwl/webpack" "16.0.3" + "@nx/devkit" "16.0.3" + "@nx/js" "16.0.3" autoprefixer "^10.4.9" - babel-loader "^8.2.2" - browserslist "^4.16.6" - caniuse-lite "^1.0.30001394" - chalk "4.1.0" + babel-loader "^9.1.2" + chalk "^4.1.0" chokidar "^3.5.1" copy-webpack-plugin "^10.2.4" + css-loader "^6.4.0" css-minimizer-webpack-plugin "^3.4.1" dotenv "~10.0.0" file-loader "^6.2.0" fork-ts-checker-webpack-plugin "7.2.13" - fs-extra "^10.1.0" ignore "^5.0.4" - less "3.12.2" - less-loader "^10.1.0" + less "4.1.3" + less-loader "11.1.0" license-webpack-plugin "^4.0.2" - loader-utils "1.2.3" + loader-utils "^2.0.3" mini-css-extract-plugin "~2.4.7" parse5 "4.0.0" - parse5-html-rewriting-stream "6.0.1" postcss "^8.4.14" postcss-import "~14.1.0" postcss-loader "^6.1.1" - raw-loader "^4.0.2" rxjs "^6.5.4" sass "^1.42.1" sass-loader "^12.2.0" source-map-loader "^3.0.0" style-loader "^3.3.0" stylus "^0.55.0" - stylus-loader "^6.2.0" + stylus-loader "^7.1.0" terser-webpack-plugin "^5.3.3" ts-loader "^9.3.1" ts-node "10.9.1" - tsconfig-paths "^3.9.0" - tsconfig-paths-webpack-plugin "3.5.2" + tsconfig-paths "^4.1.2" + tsconfig-paths-webpack-plugin "4.0.0" tslib "^2.3.0" - webpack "^5.58.1" + webpack "^5.75.0" webpack-dev-server "^4.9.3" - webpack-merge "^5.8.0" webpack-node-externals "^3.0.0" - webpack-sources "^3.2.3" webpack-subresource-integrity "^5.1.0" -"@nrwl/workspace@15.0.0": - version "15.0.0" - resolved "https://registry.yarnpkg.com/@nrwl/workspace/-/workspace-15.0.0.tgz#431c7b28322eea7dc38c4c32aca99937cc33058c" - integrity sha512-VTmqjEiymLYRNPgMp9OrkIgBgX1BjwnDQtmTo+F0rSM5/KTjwmLevqoCApgeV1/YMTUHsjI4tLIOeOPvMARX7Q== +"@nx/workspace@16.0.3": + version "16.0.3" + resolved "https://registry.yarnpkg.com/@nx/workspace/-/workspace-16.0.3.tgz#f8592330baa03e3c0cda77a7cc527755dc5bee49" + integrity sha512-jy5a7Gu0p5JgVfVyrnvE5Hqy0A+57U1pl5R3U4XvNNa1848ibVnT3qMkb7s6S50nN6WWHwuCAsIMEV/w88OmRA== dependencies: - "@nrwl/devkit" "15.0.0" - "@nrwl/jest" "15.0.0" - "@nrwl/linter" "15.0.0" + "@nrwl/workspace" "16.0.3" + "@nx/devkit" "16.0.3" "@parcel/watcher" "2.0.4" - chalk "4.1.0" + chalk "^4.1.0" chokidar "^3.5.1" cli-cursor "3.1.0" cli-spinners "2.6.1" dotenv "~10.0.0" - enquirer "~2.3.6" figures "3.2.0" flat "^5.0.2" - fs-extra "^10.1.0" - glob "7.1.4" ignore "^5.0.4" minimatch "3.0.5" npm-run-path "^4.0.1" - nx "15.0.0" + nx "16.0.3" open "^8.4.0" rxjs "^6.5.4" - semver "7.3.4" tmp "~0.2.1" tslib "^2.3.0" - yargs "^17.4.0" - yargs-parser "21.0.1" - -"@nuxtjs/opencollective@0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz#620ce1044f7ac77185e825e1936115bb38e2681c" - integrity sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA== - dependencies: - chalk "^4.1.0" - consola "^2.15.0" - node-fetch "^2.6.1" + yargs "^17.6.2" + yargs-parser "21.1.1" "@parcel/watcher@2.0.4": version "2.0.4" @@ -3592,57 +3698,62 @@ node-gyp-build "^4.3.0" "@peculiar/asn1-android@^2.1.7": - version "2.1.9" - resolved "https://registry.yarnpkg.com/@peculiar/asn1-android/-/asn1-android-2.1.9.tgz#c58dd464e841d88637a0bed6c92ff86baacb22bd" - integrity sha512-OeFd2dP6dy2FAlmkyXg903WTDmwSOD0arFhmVkWfa+hab8sxTViXqD+nQjwSbklZVwm2O/OGfLKoblrSPCU3/w== + version "2.3.6" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-android/-/asn1-android-2.3.6.tgz#20363c23bc5b9a91f7ffd80d7c3842dccff8c20b" + integrity sha512-zkYh4DsiRhiNfg6tWaUuRc+huwlb9XJbmeZLrjTz9v76UK1Ehq3EnfJFED6P3sdznW/nqWe46LoM9JrqxcD58g== dependencies: - "@peculiar/asn1-schema" "^2.1.9" - asn1js "^3.0.4" + "@peculiar/asn1-schema" "^2.3.6" + asn1js "^3.0.5" tslib "^2.4.0" -"@peculiar/asn1-schema@^2.1.7", "@peculiar/asn1-schema@^2.1.9": - version "2.1.9" - resolved "https://registry.yarnpkg.com/@peculiar/asn1-schema/-/asn1-schema-2.1.9.tgz#273f4b1a9487dfea37c7999aca2cd12c79674673" - integrity sha512-Ipio+pXGpL/Vb0qB4GnOgFMgc1RAhKHOVy24rQYLvmOAVp9z/aFb+VdIiQH09NjgvGVmaWOUqSWd9vRHk3xbrg== +"@peculiar/asn1-schema@^2.1.7", "@peculiar/asn1-schema@^2.3.6": + version "2.3.6" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-schema/-/asn1-schema-2.3.6.tgz#3dd3c2ade7f702a9a94dfb395c192f5fa5d6b922" + integrity sha512-izNRxPoaeJeg/AyH8hER6s+H7p4itk+03QCa4sbxI3lNdseQYCuxzgsuNK8bTXChtLTjpJz6NmXKA73qLa3rCA== dependencies: - asn1js "^3.0.4" + asn1js "^3.0.5" pvtsutils "^1.3.2" tslib "^2.4.0" "@peculiar/asn1-x509@^2.1.7": - version "2.1.9" - resolved "https://registry.yarnpkg.com/@peculiar/asn1-x509/-/asn1-x509-2.1.9.tgz#ce5db9443531f67a06a663d928578f2b3dc1088d" - integrity sha512-mqU8ZlWaBfDSG/iafCYKOa9N7scXiaXfHNgOyqG0GIPZGGjNeeBjgLRrlup6L8/Ipvlun5VIm7vNJdR8/XIqtg== + version "2.3.6" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-x509/-/asn1-x509-2.3.6.tgz#e50154a460cdf43da8a41b23ee807a53e0036af0" + integrity sha512-dRwX31R1lcbIdzbztiMvLNTDoGptxdV7HocNx87LfKU0fEWh7fTWJjx4oV+glETSy6heF/hJHB2J4RGB3vVSYg== dependencies: - "@peculiar/asn1-schema" "^2.1.9" - asn1js "^3.0.4" + "@peculiar/asn1-schema" "^2.3.6" + asn1js "^3.0.5" ipaddr.js "^2.0.1" pvtsutils "^1.3.2" tslib "^2.4.0" -"@phenomnomnominal/tsquery@4.1.1": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@phenomnomnominal/tsquery/-/tsquery-4.1.1.tgz#42971b83590e9d853d024ddb04a18085a36518df" - integrity sha512-jjMmK1tnZbm1Jq5a7fBliM4gQwjxMU7TFoRNwIyzwlO+eHPRCFv/Nv+H/Gi1jc3WR7QURG8D5d0Tn12YGrUqBQ== +"@phenomnomnominal/tsquery@~5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@phenomnomnominal/tsquery/-/tsquery-5.0.1.tgz#a2a5abc89f92c01562a32806655817516653a388" + integrity sha512-3nVv+e2FQwsW8Aw6qTU6f+1rfcJ3hrcnvH/mu9i8YhxO+9sqbOfpL8m6PbET5+xKOlz/VSbp0RoYWYCtIsnmuA== dependencies: - esquery "^1.0.1" + esquery "^1.4.0" -"@prisma/client@4.4.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@prisma/client/-/client-4.4.0.tgz#45f59c172dd3621ecc92d7cf9bc765d85e6c7d56" - integrity sha512-ciKOP246x1xwr04G9ajHlJ4pkmtu9Q6esVyqVBO0QJihaKQIUvbPjClp17IsRJyxqNpFm4ScbOc/s9DUzKHINQ== +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@prisma/client@4.15.0": + version "4.15.0" + resolved "https://registry.yarnpkg.com/@prisma/client/-/client-4.15.0.tgz#f52ec6ca6fbde37395a54b0a9e5da603a9de15f3" + integrity sha512-xnROvyABcGiwqRNdrObHVZkD9EjkJYHOmVdlKy1yGgI+XOzvMzJ4tRg3dz1pUlsyhKxXGCnjIQjWW+2ur+YXuw== dependencies: - "@prisma/engines-version" "4.4.0-66.f352a33b70356f46311da8b00d83386dd9f145d6" + "@prisma/engines-version" "4.15.0-28.8fbc245156db7124f997f4cecdd8d1219e360944" -"@prisma/engines-version@4.4.0-66.f352a33b70356f46311da8b00d83386dd9f145d6": - version "4.4.0-66.f352a33b70356f46311da8b00d83386dd9f145d6" - resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-4.4.0-66.f352a33b70356f46311da8b00d83386dd9f145d6.tgz#00875863bb30b670a586a5b5794a000f7f3ad976" - integrity sha512-P5v/PuEIJLYXZUZBvOLPqoyCW+m6StNqHdiR6te++gYVODpPdLakks5HVx3JaZIY+LwR02juJWFlwpc9Eog/ug== +"@prisma/engines-version@4.15.0-28.8fbc245156db7124f997f4cecdd8d1219e360944": + version "4.15.0-28.8fbc245156db7124f997f4cecdd8d1219e360944" + resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-4.15.0-28.8fbc245156db7124f997f4cecdd8d1219e360944.tgz#8d880becf996cffe08c78ad5afab6bc06090c990" + integrity sha512-sVOig4tjGxxlYaFcXgE71f/rtFhzyYrfyfNFUsxCIEJyVKU9rdOWIlIwQ2NQ7PntvGnn+x0XuFo4OC1jvPJKzg== -"@prisma/engines@4.4.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-4.4.0.tgz#6ca7d3ce8eee08dcfa82311b0a02f5ccaac7dc0c" - integrity sha512-Fpykccxlt9MHrAs/QpPGpI2nOiRxuLA+LiApgA59ibbf24YICZIMWd3SI2YD+q0IAIso0jCGiHhirAIbxK3RyQ== +"@prisma/engines@4.15.0": + version "4.15.0" + resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-4.15.0.tgz#d8687a9fda615fab88b75b466931280289de9e26" + integrity sha512-FTaOCGs0LL0OW68juZlGxFtYviZa4xdQj/rQEdat2txw0s3Vu/saAPKjNVXfIgUsGXmQ72HPgNr6935/P8FNAA== "@samverschueren/stream-to-observable@^0.3.0": version "0.3.1" @@ -3651,23 +3762,28 @@ dependencies: any-observable "^0.3.0" -"@schematics/angular@14.2.1", "@schematics/angular@~14.2.0": - version "14.2.1" - resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-14.2.1.tgz#00f54cb6b30dc1945b6d344ca225c04dcc12f682" - integrity sha512-Dchixep/FMETAMuyFchw9Nryi7tfuZQRumzIOtQpv+KaVtfjvcIlES0KuI0U3Qh7tGIYPBmO3Mkt3oojcl2RBA== +"@schematics/angular@15.2.5": + version "15.2.5" + resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-15.2.5.tgz#0f185db69b146c17ea8051febac2bee85bda0a4e" + integrity sha512-YN0A5bzuqEmLdwbcQRop9TFj0QVxTC/XCL0K5DfDymVBS2j09NMyLLVc6TDOs+J/fMQr5EwiT149ikzqiUmAcw== dependencies: - "@angular-devkit/core" "14.2.1" - "@angular-devkit/schematics" "14.2.1" - jsonc-parser "3.1.0" + "@angular-devkit/core" "15.2.5" + "@angular-devkit/schematics" "15.2.5" + jsonc-parser "3.2.0" -"@schematics/angular@^13.0.0 || ^14.0.0": - version "14.1.2" - resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-14.1.2.tgz#edc828c3bf3e5eb9c55d11e560d3fd680819021c" - integrity sha512-vttvYpffkG/cy9aUCXLW+Dc0msUNbyoFXTQRHN/MYX5uNVvXaRCEzWVE3tp87Dt5XlGo2r9e21gNAoY1TyXj3Q== +"@schematics/angular@^13.0.0 || ^14.0.0 || ^15.0.0": + version "15.2.8" + resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-15.2.8.tgz#d845903f1cc477d299f968eb5bc40a9855cfd911" + integrity sha512-F49IEzCFxQlpaMIgTO/wF1l/CLQKif7VaiDdyiTKOeT22IMmyd61FUmWDyZYfCBqMlvBmvDGx64HaHWes1HYCg== dependencies: - "@angular-devkit/core" "14.1.2" - "@angular-devkit/schematics" "14.1.2" - jsonc-parser "3.1.0" + "@angular-devkit/core" "15.2.8" + "@angular-devkit/schematics" "15.2.8" + jsonc-parser "3.2.0" + +"@sigstore/protobuf-specs@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@sigstore/protobuf-specs/-/protobuf-specs-0.1.0.tgz#957cb64ea2f5ce527cc9cf02a096baeb0d2b99b4" + integrity sha512-a31EnjuIDSX8IXBUib3cYLDRlPMU36AWX4xS8ysLaNu4ZzUesDiPt83pgrW2X1YLMe5L2HbDyaKK5BrL4cNKaQ== "@simplewebauthn/browser@5.2.1": version "5.2.1" @@ -3692,596 +3808,543 @@ node-fetch "^2.6.0" node-rsa "^1.1.1" -"@simplewebauthn/typescript-types@5.2.1", "@simplewebauthn/typescript-types@^5.2.1": +"@simplewebauthn/typescript-types@5.2.1": version "5.2.1" resolved "https://registry.yarnpkg.com/@simplewebauthn/typescript-types/-/typescript-types-5.2.1.tgz#a8229ce4f71be7edafe3bfdce062b332ef494f0d" integrity sha512-t/NzbjaD0zu4ivUmiof2cPA8X5LHhFX+DflBBl71/dzEhl15qepDI2rxWdjB+Hc0FfOT1fBQnb1uP19fPcDUiA== -"@sinclair/typebox@^0.24.1": - version "0.24.34" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.34.tgz#35b799cf98a203d1940c8ce06688f9a09fbc0f50" - integrity sha512-x3ejWKw7rpy30Bvm6U0AQMOHdjqe2E3YJrBHlTxH0KFsp77bBa+MH324nJxtXZFpnTy/JW2h5HPYVm0vG2WPnw== +"@simplewebauthn/typescript-types@^5.2.1": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@simplewebauthn/typescript-types/-/typescript-types-5.4.0.tgz#533b28e7cabcc092396ecd07bbb953b71e7696b6" + integrity sha512-LeJq6Jx+o7D6iIlCy8CH5jCjwVcUvAReEo66VcF3nysfc/yKW5yCAPLSRmPITF4CRZTfnVPxUBUcveUQL6aBMA== + +"@sinclair/typebox@^0.25.16": + version "0.25.24" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" + integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== -"@sinonjs/commons@^1.7.0": - version "1.8.3" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" - integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== +"@sinonjs/commons@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-2.0.0.tgz#fd4ca5b063554307e8327b4564bd56d3b73924a3" + integrity sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg== dependencies: type-detect "4.0.8" -"@sinonjs/fake-timers@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" - integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== - dependencies: - "@sinonjs/commons" "^1.7.0" - -"@stencil/core@^2.5.0": - version "2.16.1" - resolved "https://registry.yarnpkg.com/@stencil/core/-/core-2.16.1.tgz#f6752026af72a10356d5b1f27e2db6b1ee0c730f" - integrity sha512-s/UJp9qxExL3DyQPT70kiuWeb3AdjbUZM+5lEIXn30I2DLcLYPOPXfsoWJODieQywq+3vPiLZeIdkoqjf6jcSw== - -"@storybook/addon-actions@6.5.9": - version "6.5.9" - resolved "https://registry.yarnpkg.com/@storybook/addon-actions/-/addon-actions-6.5.9.tgz#d50d65631403e1a5b680961429d9c0d7bd383e68" - integrity sha512-wDYm3M1bN+zcYZV3Q24M03b/P8DDpvj1oSoY6VLlxDAi56h8qZB/voeIS2I6vWXOB79C5tbwljYNQO0GsufS0g== - dependencies: - "@storybook/addons" "6.5.9" - "@storybook/api" "6.5.9" - "@storybook/client-logger" "6.5.9" - "@storybook/components" "6.5.9" - "@storybook/core-events" "6.5.9" - "@storybook/csf" "0.0.2--canary.4566f4d.1" - "@storybook/theming" "6.5.9" - core-js "^3.8.2" - fast-deep-equal "^3.1.3" - global "^4.4.0" +"@sinonjs/fake-timers@^10.0.2": + version "10.0.2" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz#d10549ed1f423d80639c528b6c7f5a1017747d0c" + integrity sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw== + dependencies: + "@sinonjs/commons" "^2.0.0" + +"@stencil/core@^2.18.0": + version "2.22.3" + resolved "https://registry.yarnpkg.com/@stencil/core/-/core-2.22.3.tgz#83987e20bba855c450f6d6780e3a20192603f13f" + integrity sha512-kmVA0M/HojwsfkeHsifvHVIYe4l5tin7J5+DLgtl8h6WWfiMClND5K3ifCXXI2ETDNKiEk21p6jql3Fx9o2rng== + +"@storybook/addon-actions@7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@storybook/addon-actions/-/addon-actions-7.0.9.tgz#820edc3a88a8b7c78c1a42343dc4d8c8519813f6" + integrity sha512-xEO/Ekj6m6p1l4CXGh75BNBD/sqF7TqnUA/f2T3UCtLf9xVMoGEczxNi28iZq2RHoIAaV2aKArqjM+qTwoLjZw== + dependencies: + "@storybook/client-logger" "7.0.9" + "@storybook/components" "7.0.9" + "@storybook/core-events" "7.0.9" + "@storybook/global" "^5.0.0" + "@storybook/manager-api" "7.0.9" + "@storybook/preview-api" "7.0.9" + "@storybook/theming" "7.0.9" + "@storybook/types" "7.0.9" + dequal "^2.0.2" lodash "^4.17.21" polished "^4.2.2" prop-types "^15.7.2" - react-inspector "^5.1.0" - regenerator-runtime "^0.13.7" - telejson "^6.0.8" + react-inspector "^6.0.0" + telejson "^7.0.3" ts-dedent "^2.0.0" - util-deprecate "^1.0.2" - uuid-browser "^3.1.0" - -"@storybook/addon-backgrounds@6.5.9": - version "6.5.9" - resolved "https://registry.yarnpkg.com/@storybook/addon-backgrounds/-/addon-backgrounds-6.5.9.tgz#a9579fc9d73f783a768c6c6ceb97193c5a1ee708" - integrity sha512-9k+GiY5aiANLOct34ar29jqgdi5ZpCqpZ86zPH0GsEC6ifH6nzP4trLU0vFUe260XDCvB4g8YaI7JZKPhozERg== - dependencies: - "@storybook/addons" "6.5.9" - "@storybook/api" "6.5.9" - "@storybook/client-logger" "6.5.9" - "@storybook/components" "6.5.9" - "@storybook/core-events" "6.5.9" - "@storybook/csf" "0.0.2--canary.4566f4d.1" - "@storybook/theming" "6.5.9" - core-js "^3.8.2" - global "^4.4.0" + uuid "^9.0.0" + +"@storybook/addon-backgrounds@7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@storybook/addon-backgrounds/-/addon-backgrounds-7.0.9.tgz#f7a4186659adb2a1d2f0fae99a793dab75e975f8" + integrity sha512-95ZyTrzsW3ii7iJAgRh6Tiykg9vw0zK7ZzPi7+jMXV3F1MjX5GNnXzhtlb3b0GpTZacmLzdWhKexukZtbki/6Q== + dependencies: + "@storybook/client-logger" "7.0.9" + "@storybook/components" "7.0.9" + "@storybook/core-events" "7.0.9" + "@storybook/global" "^5.0.0" + "@storybook/manager-api" "7.0.9" + "@storybook/preview-api" "7.0.9" + "@storybook/theming" "7.0.9" + "@storybook/types" "7.0.9" memoizerific "^1.11.3" - regenerator-runtime "^0.13.7" ts-dedent "^2.0.0" - util-deprecate "^1.0.2" -"@storybook/addon-controls@6.5.9": - version "6.5.9" - resolved "https://registry.yarnpkg.com/@storybook/addon-controls/-/addon-controls-6.5.9.tgz#8f6ef939c87b3dbad98f8bda7e124f0b34f668d2" - integrity sha512-VvjkgK32bGURKyWU2No6Q2B0RQZjLZk8D3neVNCnrWxwrl1G82StegxjRPn/UZm9+MZVPvTvI46nj1VdgOktnw== - dependencies: - "@storybook/addons" "6.5.9" - "@storybook/api" "6.5.9" - "@storybook/client-logger" "6.5.9" - "@storybook/components" "6.5.9" - "@storybook/core-common" "6.5.9" - "@storybook/csf" "0.0.2--canary.4566f4d.1" - "@storybook/node-logger" "6.5.9" - "@storybook/store" "6.5.9" - "@storybook/theming" "6.5.9" - core-js "^3.8.2" +"@storybook/addon-controls@7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@storybook/addon-controls/-/addon-controls-7.0.9.tgz#5b763fddc4b85d1fa428d784cac5586e6d778dd4" + integrity sha512-KEFffKNh7BNnY2+xKUC4BlOudjA+yzFa9zGHUSGz2JB3Lplyd1hV5fX7Qnqp5Wk1SFeQ/5BiEOfhopJpuN/0ow== + dependencies: + "@storybook/blocks" "7.0.9" + "@storybook/client-logger" "7.0.9" + "@storybook/components" "7.0.9" + "@storybook/core-common" "7.0.9" + "@storybook/manager-api" "7.0.9" + "@storybook/node-logger" "7.0.9" + "@storybook/preview-api" "7.0.9" + "@storybook/theming" "7.0.9" + "@storybook/types" "7.0.9" lodash "^4.17.21" ts-dedent "^2.0.0" -"@storybook/addon-docs@6.5.9": - version "6.5.9" - resolved "https://registry.yarnpkg.com/@storybook/addon-docs/-/addon-docs-6.5.9.tgz#32b27fb298624afd738c1371a764d7ff4831fe6d" - integrity sha512-9lwOZyiOJFUgGd9ADVfcgpels5o0XOXqGMeVLuzT1160nopbZjNjo/3+YLJ0pyHRPpMJ4rmq2+vxRQR6PVRgPg== - dependencies: - "@babel/plugin-transform-react-jsx" "^7.12.12" - "@babel/preset-env" "^7.12.11" - "@jest/transform" "^26.6.2" - "@mdx-js/react" "^1.6.22" - "@storybook/addons" "6.5.9" - "@storybook/api" "6.5.9" - "@storybook/components" "6.5.9" - "@storybook/core-common" "6.5.9" - "@storybook/core-events" "6.5.9" - "@storybook/csf" "0.0.2--canary.4566f4d.1" - "@storybook/docs-tools" "6.5.9" - "@storybook/mdx1-csf" "^0.0.1" - "@storybook/node-logger" "6.5.9" - "@storybook/postinstall" "6.5.9" - "@storybook/preview-web" "6.5.9" - "@storybook/source-loader" "6.5.9" - "@storybook/store" "6.5.9" - "@storybook/theming" "6.5.9" - babel-loader "^8.0.0" - core-js "^3.8.2" - fast-deep-equal "^3.1.3" - global "^4.4.0" - lodash "^4.17.21" - regenerator-runtime "^0.13.7" +"@storybook/addon-docs@7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@storybook/addon-docs/-/addon-docs-7.0.9.tgz#8e2db1a8212da723a335d417828f2fccc8390ecb" + integrity sha512-jUJogghXpwZR8dMyFL3fmQIJUC9fTNO2ywp3wDSwuXT0OUtvWigu8Ny0l35AoPng+wCYS7wY7dZNf/RZKAfm7Q== + dependencies: + "@babel/core" "^7.20.2" + "@babel/plugin-transform-react-jsx" "^7.19.0" + "@jest/transform" "^29.3.1" + "@mdx-js/react" "^2.1.5" + "@storybook/blocks" "7.0.9" + "@storybook/client-logger" "7.0.9" + "@storybook/components" "7.0.9" + "@storybook/csf-plugin" "7.0.9" + "@storybook/csf-tools" "7.0.9" + "@storybook/global" "^5.0.0" + "@storybook/mdx2-csf" "^1.0.0" + "@storybook/node-logger" "7.0.9" + "@storybook/postinstall" "7.0.9" + "@storybook/preview-api" "7.0.9" + "@storybook/react-dom-shim" "7.0.9" + "@storybook/theming" "7.0.9" + "@storybook/types" "7.0.9" + fs-extra "^11.1.0" remark-external-links "^8.0.0" remark-slug "^6.0.0" ts-dedent "^2.0.0" - util-deprecate "^1.0.2" -"@storybook/addon-essentials@6.5.9": - version "6.5.9" - resolved "https://registry.yarnpkg.com/@storybook/addon-essentials/-/addon-essentials-6.5.9.tgz#32ba63acba4d153f4cf6ac33cbbf14b87d260788" - integrity sha512-V9ThjKQsde4A2Es20pLFBsn0MWx2KCJuoTcTsANP4JDcbvEmj8UjbDWbs8jAU+yzJT5r+CI6NoWmQudv12ZOgw== - dependencies: - "@storybook/addon-actions" "6.5.9" - "@storybook/addon-backgrounds" "6.5.9" - "@storybook/addon-controls" "6.5.9" - "@storybook/addon-docs" "6.5.9" - "@storybook/addon-measure" "6.5.9" - "@storybook/addon-outline" "6.5.9" - "@storybook/addon-toolbars" "6.5.9" - "@storybook/addon-viewport" "6.5.9" - "@storybook/addons" "6.5.9" - "@storybook/api" "6.5.9" - "@storybook/core-common" "6.5.9" - "@storybook/node-logger" "6.5.9" - core-js "^3.8.2" - regenerator-runtime "^0.13.7" +"@storybook/addon-essentials@7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@storybook/addon-essentials/-/addon-essentials-7.0.9.tgz#0388351071e9cc814296b729c4121e1c923263a4" + integrity sha512-XNZpFA1K2PLV4NdS99tpD6+L4yeLYMFeBuxI7u7dJo1kT0z5fDF+nZltEcnghDlZiWPsI2XvGaHsdS7AjLswcA== + dependencies: + "@storybook/addon-actions" "7.0.9" + "@storybook/addon-backgrounds" "7.0.9" + "@storybook/addon-controls" "7.0.9" + "@storybook/addon-docs" "7.0.9" + "@storybook/addon-highlight" "7.0.9" + "@storybook/addon-measure" "7.0.9" + "@storybook/addon-outline" "7.0.9" + "@storybook/addon-toolbars" "7.0.9" + "@storybook/addon-viewport" "7.0.9" + "@storybook/core-common" "7.0.9" + "@storybook/manager-api" "7.0.9" + "@storybook/node-logger" "7.0.9" + "@storybook/preview-api" "7.0.9" ts-dedent "^2.0.0" -"@storybook/addon-measure@6.5.9": - version "6.5.9" - resolved "https://registry.yarnpkg.com/@storybook/addon-measure/-/addon-measure-6.5.9.tgz#f949d4f5f4025c839634114365f1399ea04bd0ae" - integrity sha512-0aA22wD0CIEUccsEbWkckCOXOwr4VffofMH1ToVCOeqBoyLOMB0gxFubESeprqM54CWsYh2DN1uujgD6508cwA== - dependencies: - "@storybook/addons" "6.5.9" - "@storybook/api" "6.5.9" - "@storybook/client-logger" "6.5.9" - "@storybook/components" "6.5.9" - "@storybook/core-events" "6.5.9" - "@storybook/csf" "0.0.2--canary.4566f4d.1" - core-js "^3.8.2" - global "^4.4.0" - -"@storybook/addon-outline@6.5.9": - version "6.5.9" - resolved "https://registry.yarnpkg.com/@storybook/addon-outline/-/addon-outline-6.5.9.tgz#6ce9b3fb77e6a1a59607d7657c359c69f26cf6dd" - integrity sha512-oJ1DK3BDJr6aTlZc9axfOxV1oDkZO7hOohgUQDaKO1RZrSpyQsx2ViK2X6p/W7JhFJHKh7rv+nGCaVlLz3YIZA== - dependencies: - "@storybook/addons" "6.5.9" - "@storybook/api" "6.5.9" - "@storybook/client-logger" "6.5.9" - "@storybook/components" "6.5.9" - "@storybook/core-events" "6.5.9" - "@storybook/csf" "0.0.2--canary.4566f4d.1" - core-js "^3.8.2" - global "^4.4.0" - regenerator-runtime "^0.13.7" +"@storybook/addon-highlight@7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@storybook/addon-highlight/-/addon-highlight-7.0.9.tgz#8846967d6d2e5e6972fa116169b7a33106865917" + integrity sha512-gYMMkg/UXBdsFbHvbGZopaeuiefqKuVo+W6Eqjm5wxaSMvpSZFwbMXoKuACewLB0ByDUrSSZ3EewWR22ymbt8Q== + dependencies: + "@storybook/core-events" "7.0.9" + "@storybook/global" "^5.0.0" + "@storybook/preview-api" "7.0.9" + +"@storybook/addon-measure@7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@storybook/addon-measure/-/addon-measure-7.0.9.tgz#baf338ef785afa1b7ad02afa975cefdfc50ed1cd" + integrity sha512-URaWN6tTbFuJDsFX8eGPAObNTdv3UyNE+h8ZxZSo/8W21dlfdmDk8voCkBxpKjPijvwOQAJg7tMlL+8Pt1fCvw== + dependencies: + "@storybook/client-logger" "7.0.9" + "@storybook/components" "7.0.9" + "@storybook/core-events" "7.0.9" + "@storybook/global" "^5.0.0" + "@storybook/manager-api" "7.0.9" + "@storybook/preview-api" "7.0.9" + "@storybook/types" "7.0.9" + +"@storybook/addon-outline@7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@storybook/addon-outline/-/addon-outline-7.0.9.tgz#496aa3a3be20521fd169f7c20836ec0f4438d59d" + integrity sha512-evcvgZMMMOKUyDnuNqfUddK1TUCv9/2VLa1DEt/GPY3vSvomWvN0sWt54aNxbJkciGhNdUGbkGn38YZHO9MTVQ== + dependencies: + "@storybook/client-logger" "7.0.9" + "@storybook/components" "7.0.9" + "@storybook/core-events" "7.0.9" + "@storybook/global" "^5.0.0" + "@storybook/manager-api" "7.0.9" + "@storybook/preview-api" "7.0.9" + "@storybook/types" "7.0.9" ts-dedent "^2.0.0" -"@storybook/addon-toolbars@6.5.9": - version "6.5.9" - resolved "https://registry.yarnpkg.com/@storybook/addon-toolbars/-/addon-toolbars-6.5.9.tgz#feedfdac08482d43bb1f3cc00840d80322c5eace" - integrity sha512-6JFQNHYVZUwp17p5rppc+iQJ2QOIWPTF+ni1GMMThjc84mzXs2+899Sf1aPFTvrFJTklmT+bPX6x4aUTouVa1w== - dependencies: - "@storybook/addons" "6.5.9" - "@storybook/api" "6.5.9" - "@storybook/client-logger" "6.5.9" - "@storybook/components" "6.5.9" - "@storybook/theming" "6.5.9" - core-js "^3.8.2" - regenerator-runtime "^0.13.7" - -"@storybook/addon-viewport@6.5.9": - version "6.5.9" - resolved "https://registry.yarnpkg.com/@storybook/addon-viewport/-/addon-viewport-6.5.9.tgz#fc390ccebea56d2e874ed2fda085c09fe04dd240" - integrity sha512-thKS+iw6M7ueDQQ7M66STZ5rgtJKliAcIX6UCopo0Ffh4RaRYmX6MCjqtvBKk8joyXUvm9SpWQemJD9uBQrjgw== - dependencies: - "@storybook/addons" "6.5.9" - "@storybook/api" "6.5.9" - "@storybook/client-logger" "6.5.9" - "@storybook/components" "6.5.9" - "@storybook/core-events" "6.5.9" - "@storybook/theming" "6.5.9" - core-js "^3.8.2" - global "^4.4.0" +"@storybook/addon-toolbars@7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@storybook/addon-toolbars/-/addon-toolbars-7.0.9.tgz#ef9fe377da0d7c9c64553b9ad545b748c89979b0" + integrity sha512-zipiWCsxe0L9sSLIVtvU2vkbjjePKxqHW9d2DnJm+EXKwJfJxqIIjdZx3MU6lCV8wdCqkTGKR2lMXH7G4NzuAA== + dependencies: + "@storybook/client-logger" "7.0.9" + "@storybook/components" "7.0.9" + "@storybook/manager-api" "7.0.9" + "@storybook/preview-api" "7.0.9" + "@storybook/theming" "7.0.9" + +"@storybook/addon-viewport@7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@storybook/addon-viewport/-/addon-viewport-7.0.9.tgz#ab398e721feb0f308a4482553f3579e7d71a9bff" + integrity sha512-zSR2lbuvyzzrv7XwzRqEX+PFgqHZm+kt2QCgMFXY27YpRAWM6Vh8soeq1j4dq+KCZiQcYOiEJj8XQgcmd2QAPg== + dependencies: + "@storybook/client-logger" "7.0.9" + "@storybook/components" "7.0.9" + "@storybook/core-events" "7.0.9" + "@storybook/global" "^5.0.0" + "@storybook/manager-api" "7.0.9" + "@storybook/preview-api" "7.0.9" + "@storybook/theming" "7.0.9" memoizerific "^1.11.3" prop-types "^15.7.2" - regenerator-runtime "^0.13.7" - -"@storybook/addons@6.5.9": - version "6.5.9" - resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-6.5.9.tgz#5a9d7395c579a9cbc44dfc122362fb3c95dfb9d5" - integrity sha512-adwdiXg+mntfPocLc1KXjZXyLgGk7Aac699Fwe+OUYPEC5tW347Rm/kFatcE556d42o5czcRiq3ZSIGWnm9ieQ== - dependencies: - "@storybook/api" "6.5.9" - "@storybook/channels" "6.5.9" - "@storybook/client-logger" "6.5.9" - "@storybook/core-events" "6.5.9" - "@storybook/csf" "0.0.2--canary.4566f4d.1" - "@storybook/router" "6.5.9" - "@storybook/theming" "6.5.9" - "@types/webpack-env" "^1.16.0" - core-js "^3.8.2" - global "^4.4.0" - regenerator-runtime "^0.13.7" - -"@storybook/angular@6.5.9": - version "6.5.9" - resolved "https://registry.yarnpkg.com/@storybook/angular/-/angular-6.5.9.tgz#daa6843e1a2ba9d46d0cbfb432b0e50d5149bc97" - integrity sha512-V+Kt1qZBNxi6qVB1Uf5/mg9ma97sC8jzb0/w7SkwkcY+/PBSF9UtY9WqOdLVdicukVx0PhkEtVqpYEqhgU9IZw== - dependencies: - "@storybook/addons" "6.5.9" - "@storybook/api" "6.5.9" - "@storybook/client-logger" "6.5.9" - "@storybook/core" "6.5.9" - "@storybook/core-common" "6.5.9" - "@storybook/core-events" "6.5.9" - "@storybook/csf" "0.0.2--canary.4566f4d.1" - "@storybook/docs-tools" "6.5.9" - "@storybook/node-logger" "6.5.9" - "@storybook/semver" "^7.3.2" - "@storybook/store" "6.5.9" - "@types/node" "^14.14.20 || ^16.0.0" - "@types/react" "^16.14.23" + +"@storybook/addons@7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-7.0.9.tgz#fc9b1397cb39e2a78b15677b3723b996ac67b208" + integrity sha512-WxjURCJW2sNktYWgANqi/pzmRWTfFyB66mCTZNnhwagmbRkR7ifevUUqTX2cm5dgWSEoqYhVk91MQuEpBE3NoQ== + dependencies: + "@storybook/manager-api" "7.0.9" + "@storybook/preview-api" "7.0.9" + "@storybook/types" "7.0.9" + +"@storybook/angular@7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@storybook/angular/-/angular-7.0.9.tgz#fcefe6d3836abe632cf58a9ce872cf20ef8ca8d2" + integrity sha512-s5D8D0eLpYgMdyw0txBbjhat0FEtI1eFPu2UgmCWS11rSgeRDluyX2urU/gReE7TetfjoVZpEAz3vwoJUp1Vgg== + dependencies: + "@storybook/builder-webpack5" "7.0.9" + "@storybook/cli" "7.0.9" + "@storybook/client-logger" "7.0.9" + "@storybook/core-client" "7.0.9" + "@storybook/core-common" "7.0.9" + "@storybook/core-events" "7.0.9" + "@storybook/core-server" "7.0.9" + "@storybook/core-webpack" "7.0.9" + "@storybook/docs-tools" "7.0.9" + "@storybook/global" "^5.0.0" + "@storybook/manager-api" "7.0.9" + "@storybook/node-logger" "7.0.9" + "@storybook/preview-api" "7.0.9" + "@storybook/telemetry" "7.0.9" + "@storybook/types" "7.0.9" + "@types/node" "^16.0.0" + "@types/react" "^16.14.34" "@types/react-dom" "^16.9.14" - "@types/webpack-env" "^1.16.0" - autoprefixer "^9.8.6" - core-js "^3.8.2" + "@types/semver" "^7.3.4" + "@types/webpack-env" "^1.18.0" find-up "^5.0.0" - fork-ts-checker-webpack-plugin "^4.1.6" - global "^4.4.0" - nanoid "^3.1.23" - p-limit "^3.1.0" - postcss "^7.0.36" - postcss-loader "^4.2.0" - raw-loader "^4.0.2" - react "^16.14.0" - react-dom "^16.14.0" read-pkg-up "^7.0.1" - regenerator-runtime "^0.13.7" - sass-loader "^10.1.0" - telejson "^6.0.8" - ts-dedent "^2.0.0" - ts-loader "^8.0.14" - tsconfig-paths-webpack-plugin "^3.3.0" - util-deprecate "^1.0.2" - webpack ">=4.0.0 <6.0.0" - -"@storybook/api@6.5.9": - version "6.5.9" - resolved "https://registry.yarnpkg.com/@storybook/api/-/api-6.5.9.tgz#303733214c9de0422d162f7c54ae05d088b89bf9" - integrity sha512-9ylztnty4Y+ALU/ehW3BML9czjCAFsWvrwuCi6UgcwNjswwjSX3VRLhfD1KT3pl16ho//95LgZ0LnSwROCcPOA== - dependencies: - "@storybook/channels" "6.5.9" - "@storybook/client-logger" "6.5.9" - "@storybook/core-events" "6.5.9" - "@storybook/csf" "0.0.2--canary.4566f4d.1" - "@storybook/router" "6.5.9" - "@storybook/semver" "^7.3.2" - "@storybook/theming" "6.5.9" - core-js "^3.8.2" - fast-deep-equal "^3.1.3" - global "^4.4.0" - lodash "^4.17.21" - memoizerific "^1.11.3" - regenerator-runtime "^0.13.7" - store2 "^2.12.0" - telejson "^6.0.8" + semver "^7.3.7" + telejson "^7.0.3" ts-dedent "^2.0.0" + tsconfig-paths-webpack-plugin "^3.5.2" util-deprecate "^1.0.2" - -"@storybook/builder-webpack4@6.5.9": - version "6.5.9" - resolved "https://registry.yarnpkg.com/@storybook/builder-webpack4/-/builder-webpack4-6.5.9.tgz#4b37e1fa23a25aa4bfeaba640e5d318fcd511f95" - integrity sha512-YOeA4++9uRZ8Hog1wC60yjaxBOiI1FRQNtax7b9E7g+kP8UlSCPCGcv4gls9hFmzbzTOPfQTWnToA9Oa6jzRVw== - dependencies: - "@babel/core" "^7.12.10" - "@storybook/addons" "6.5.9" - "@storybook/api" "6.5.9" - "@storybook/channel-postmessage" "6.5.9" - "@storybook/channels" "6.5.9" - "@storybook/client-api" "6.5.9" - "@storybook/client-logger" "6.5.9" - "@storybook/components" "6.5.9" - "@storybook/core-common" "6.5.9" - "@storybook/core-events" "6.5.9" - "@storybook/node-logger" "6.5.9" - "@storybook/preview-web" "6.5.9" - "@storybook/router" "6.5.9" - "@storybook/semver" "^7.3.2" - "@storybook/store" "6.5.9" - "@storybook/theming" "6.5.9" - "@storybook/ui" "6.5.9" - "@types/node" "^14.0.10 || ^16.0.0" - "@types/webpack" "^4.41.26" - autoprefixer "^9.8.6" - babel-loader "^8.0.0" - case-sensitive-paths-webpack-plugin "^2.3.0" - core-js "^3.8.2" - css-loader "^3.6.0" - file-loader "^6.2.0" - find-up "^5.0.0" - fork-ts-checker-webpack-plugin "^4.1.6" - glob "^7.1.6" - glob-promise "^3.4.0" - global "^4.4.0" - html-webpack-plugin "^4.0.0" - pnp-webpack-plugin "1.6.4" - postcss "^7.0.36" - postcss-flexbugs-fixes "^4.2.1" - postcss-loader "^4.2.0" - raw-loader "^4.0.2" - stable "^0.1.8" - style-loader "^1.3.0" - terser-webpack-plugin "^4.2.3" + webpack "5" + +"@storybook/api@7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@storybook/api/-/api-7.0.9.tgz#d1708f12dc964bad6fababeaa901acb7bf2d7196" + integrity sha512-CbQ2YyWwYIVkHzj7RLusqgGWdQO8Q5GnUVdxsv7yoqe8ZKdCjOhexWLUWQDcpRKZXAxoEH+iGopzt6sISC5imQ== + dependencies: + "@storybook/client-logger" "7.0.9" + "@storybook/manager-api" "7.0.9" + +"@storybook/blocks@7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@storybook/blocks/-/blocks-7.0.9.tgz#00167a8a68a62bcfc0d8780e5c649719e62a3b95" + integrity sha512-Mk0sMYvpKy0S+nmxl3QUzf7uqYTrYv9y06D+Ii4Se1Czmwo2+a7ABjmLIzAKQbdBx7ZqUCxW48Ip+X9vQHL/Iw== + dependencies: + "@storybook/channels" "7.0.9" + "@storybook/client-logger" "7.0.9" + "@storybook/components" "7.0.9" + "@storybook/core-events" "7.0.9" + "@storybook/csf" "^0.1.0" + "@storybook/docs-tools" "7.0.9" + "@storybook/global" "^5.0.0" + "@storybook/manager-api" "7.0.9" + "@storybook/preview-api" "7.0.9" + "@storybook/theming" "7.0.9" + "@storybook/types" "7.0.9" + "@types/lodash" "^4.14.167" + color-convert "^2.0.1" + dequal "^2.0.2" + lodash "^4.17.21" + markdown-to-jsx "^7.1.8" + memoizerific "^1.11.3" + polished "^4.2.2" + react-colorful "^5.1.2" + telejson "^7.0.3" ts-dedent "^2.0.0" - url-loader "^4.1.1" util-deprecate "^1.0.2" - webpack "4" - webpack-dev-middleware "^3.7.3" - webpack-filter-warnings-plugin "^1.2.1" - webpack-hot-middleware "^2.25.1" - webpack-virtual-modules "^0.2.2" -"@storybook/builder-webpack5@6.5.9": - version "6.5.9" - resolved "https://registry.yarnpkg.com/@storybook/builder-webpack5/-/builder-webpack5-6.5.9.tgz#30b4e08622daff104bcccd015d3ee7902f99dd99" - integrity sha512-NUVZ4Qci6HWPuoH8U/zQkdBO5soGgu7QYrGC/LWU0tRfmmZxkjr7IUU14ppDpGPYgx3r7jkaQI1J/E1YEmSCWQ== +"@storybook/builder-manager@7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@storybook/builder-manager/-/builder-manager-7.0.9.tgz#1d1991bc347c7f9c0a1c8521f93980d8d00e6386" + integrity sha512-7yGEQsJgUZzuOuatE987e/VlB75THoNvsZn1TxbLDsrt6NgyFF+bxypon4rzmNhtCnoW77yC/1hXQTZuOqeHLQ== + dependencies: + "@fal-works/esbuild-plugin-global-externals" "^2.1.2" + "@storybook/core-common" "7.0.9" + "@storybook/manager" "7.0.9" + "@storybook/node-logger" "7.0.9" + "@types/ejs" "^3.1.1" + "@types/find-cache-dir" "^3.2.1" + "@yarnpkg/esbuild-plugin-pnp" "^3.0.0-rc.10" + browser-assert "^1.2.1" + ejs "^3.1.8" + esbuild "^0.17.0" + esbuild-plugin-alias "^0.2.1" + express "^4.17.3" + find-cache-dir "^3.0.0" + fs-extra "^11.1.0" + process "^0.11.10" + util "^0.12.4" + +"@storybook/builder-webpack5@7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@storybook/builder-webpack5/-/builder-webpack5-7.0.9.tgz#d3347f2c15850ae87495d4c40e9564c6890d9a76" + integrity sha512-a2482TEsk3K+FKC0rma3Z6oOvedUMXMCLrPJ5Zxl5BbtK8kAjJhlAxCZVNiKqckFW3CoN4v3zdOGs96I1mORLA== dependencies: "@babel/core" "^7.12.10" - "@storybook/addons" "6.5.9" - "@storybook/api" "6.5.9" - "@storybook/channel-postmessage" "6.5.9" - "@storybook/channels" "6.5.9" - "@storybook/client-api" "6.5.9" - "@storybook/client-logger" "6.5.9" - "@storybook/components" "6.5.9" - "@storybook/core-common" "6.5.9" - "@storybook/core-events" "6.5.9" - "@storybook/node-logger" "6.5.9" - "@storybook/preview-web" "6.5.9" - "@storybook/router" "6.5.9" - "@storybook/semver" "^7.3.2" - "@storybook/store" "6.5.9" - "@storybook/theming" "6.5.9" - "@types/node" "^14.0.10 || ^16.0.0" - babel-loader "^8.0.0" + "@storybook/addons" "7.0.9" + "@storybook/api" "7.0.9" + "@storybook/channel-postmessage" "7.0.9" + "@storybook/channel-websocket" "7.0.9" + "@storybook/channels" "7.0.9" + "@storybook/client-api" "7.0.9" + "@storybook/client-logger" "7.0.9" + "@storybook/components" "7.0.9" + "@storybook/core-common" "7.0.9" + "@storybook/core-events" "7.0.9" + "@storybook/core-webpack" "7.0.9" + "@storybook/global" "^5.0.0" + "@storybook/manager-api" "7.0.9" + "@storybook/node-logger" "7.0.9" + "@storybook/preview" "7.0.9" + "@storybook/preview-api" "7.0.9" + "@storybook/router" "7.0.9" + "@storybook/store" "7.0.9" + "@storybook/theming" "7.0.9" + "@types/node" "^16.0.0" + "@types/semver" "^7.3.4" + babel-loader "^9.0.0" babel-plugin-named-exports-order "^0.0.2" browser-assert "^1.2.1" - case-sensitive-paths-webpack-plugin "^2.3.0" - core-js "^3.8.2" - css-loader "^5.0.1" - fork-ts-checker-webpack-plugin "^6.0.4" - glob "^7.1.6" - glob-promise "^3.4.0" - html-webpack-plugin "^5.0.0" + case-sensitive-paths-webpack-plugin "^2.4.0" + css-loader "^6.7.1" + express "^4.17.3" + fork-ts-checker-webpack-plugin "^7.2.8" + fs-extra "^11.1.0" + html-webpack-plugin "^5.5.0" path-browserify "^1.0.1" process "^0.11.10" - stable "^0.1.8" - style-loader "^2.0.0" - terser-webpack-plugin "^5.0.3" + semver "^7.3.7" + style-loader "^3.3.1" + terser-webpack-plugin "^5.3.1" ts-dedent "^2.0.0" + util "^0.12.4" util-deprecate "^1.0.2" - webpack "^5.9.0" - webpack-dev-middleware "^4.1.0" + webpack "5" + webpack-dev-middleware "^5.3.1" webpack-hot-middleware "^2.25.1" - webpack-virtual-modules "^0.4.1" - -"@storybook/channel-postmessage@6.5.9": - version "6.5.9" - resolved "https://registry.yarnpkg.com/@storybook/channel-postmessage/-/channel-postmessage-6.5.9.tgz#9cf4530f0364cee0d5e58f92d6fb5ce98e10257b" - integrity sha512-pX/0R8UW7ezBhCrafRaL20OvMRcmESYvQQCDgjqSzJyHkcG51GOhsd6Ge93eJ6QvRMm9+w0Zs93N2VKjVtz0Qw== - dependencies: - "@storybook/channels" "6.5.9" - "@storybook/client-logger" "6.5.9" - "@storybook/core-events" "6.5.9" - core-js "^3.8.2" - global "^4.4.0" - qs "^6.10.0" - telejson "^6.0.8" - -"@storybook/channel-websocket@6.5.9": - version "6.5.9" - resolved "https://registry.yarnpkg.com/@storybook/channel-websocket/-/channel-websocket-6.5.9.tgz#6b7a0127fec58ee5be4f6aebcf460adc564f2f34" - integrity sha512-xtHvSNwuOhkgALwVshKWsoFhDmuvcosdYfxcfFGEiYKXIu46tRS5ZXmpmgEC/0JAVkVoFj5nL8bV7IY5np6oaA== - dependencies: - "@storybook/channels" "6.5.9" - "@storybook/client-logger" "6.5.9" - core-js "^3.8.2" - global "^4.4.0" - telejson "^6.0.8" + webpack-virtual-modules "^0.4.3" -"@storybook/channels@6.5.9": - version "6.5.9" - resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-6.5.9.tgz#abfab89a6587a2688e9926d4aafeb11c9d8b2e79" - integrity sha512-FvGA35nV38UPXWOl9ERapFTJaxwSTamQ339s2Ev7E9riyRG+GRkgTWzf5kECJgS1PAYKd/7m/RqKJT9BVv6A5g== +"@storybook/channel-postmessage@7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@storybook/channel-postmessage/-/channel-postmessage-7.0.9.tgz#cb810026b40603fbaefbcd263291a467cba48076" + integrity sha512-6zsUPlsD3GVhKNq4UZ5MePJPjiMcPs/K02mH5/uVTN2JSgLdWgbLhZ4VYit4HgwE+d98bd9zWbgNgSOXpTArag== dependencies: - core-js "^3.8.2" + "@storybook/channels" "7.0.9" + "@storybook/client-logger" "7.0.9" + "@storybook/core-events" "7.0.9" + "@storybook/global" "^5.0.0" + qs "^6.10.0" + telejson "^7.0.3" + +"@storybook/channel-websocket@7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@storybook/channel-websocket/-/channel-websocket-7.0.9.tgz#f2a18d860142bb5a0f76173ff92e9e6d1090c92f" + integrity sha512-fth6k/YSO75clM60+ermBmWSZ5lqV+9ARLp471UR0ZIAAyJ06KAguj2VOSxO0DEUd4Z/9j/3DC5ZZFHVqBPWhg== + dependencies: + "@storybook/channels" "7.0.9" + "@storybook/client-logger" "7.0.9" + "@storybook/global" "^5.0.0" + telejson "^7.0.3" + +"@storybook/channels@7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-7.0.9.tgz#0308c6a714daf1088228b554fd56dc72f2921b76" + integrity sha512-LF/Mkr0/+VOawEAospLGUcfZIPak3yV/ZjEAe/lubvLPJ6s2FFOjDUsyDIa2oM4ZE9TI6AGVN51kddVToelM8A== + +"@storybook/cli@7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@storybook/cli/-/cli-7.0.9.tgz#c0499b58aa567e9d84a8f0c7d023ae6e506d44e2" + integrity sha512-x1UkqSx0kVCvt6V+QV94CivnvWWBPmi4503nB7dtGH6VBh469oWZrFA2gYzH0yl+W3IAPRmgEMTVszLxguBo/g== + dependencies: + "@babel/core" "^7.20.2" + "@babel/preset-env" "^7.20.2" + "@ndelangen/get-tarball" "^3.0.7" + "@storybook/codemod" "7.0.9" + "@storybook/core-common" "7.0.9" + "@storybook/core-server" "7.0.9" + "@storybook/csf-tools" "7.0.9" + "@storybook/node-logger" "7.0.9" + "@storybook/telemetry" "7.0.9" + "@storybook/types" "7.0.9" + "@types/semver" "^7.3.4" + boxen "^5.1.2" + chalk "^4.1.0" + commander "^6.2.1" + cross-spawn "^7.0.3" + detect-indent "^6.1.0" + envinfo "^7.7.3" + execa "^5.0.0" + express "^4.17.3" + find-up "^5.0.0" + fs-extra "^11.1.0" + get-npm-tarball-url "^2.0.3" + get-port "^5.1.1" + giget "^1.0.0" + globby "^11.0.2" + jscodeshift "^0.14.0" + leven "^3.1.0" + prettier "^2.8.0" + prompts "^2.4.0" + puppeteer-core "^2.1.1" + read-pkg-up "^7.0.1" + semver "^7.3.7" + shelljs "^0.8.5" + simple-update-notifier "^1.0.0" + strip-json-comments "^3.0.1" + tempy "^1.0.1" ts-dedent "^2.0.0" util-deprecate "^1.0.2" -"@storybook/client-api@6.5.9": - version "6.5.9" - resolved "https://registry.yarnpkg.com/@storybook/client-api/-/client-api-6.5.9.tgz#3e4a8ec1d277fd81325c5d959c553161a85fa182" - integrity sha512-pc7JKJoWLesixUKvG2nV36HukUuYoGRyAgD3PpIV7qSBS4JixqZ3VAHFUtqV1UzfOSQTovLSl4a0rIRnpie6gA== - dependencies: - "@storybook/addons" "6.5.9" - "@storybook/channel-postmessage" "6.5.9" - "@storybook/channels" "6.5.9" - "@storybook/client-logger" "6.5.9" - "@storybook/core-events" "6.5.9" - "@storybook/csf" "0.0.2--canary.4566f4d.1" - "@storybook/store" "6.5.9" - "@types/qs" "^6.9.5" - "@types/webpack-env" "^1.16.0" - core-js "^3.8.2" - fast-deep-equal "^3.1.3" - global "^4.4.0" +"@storybook/client-api@7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@storybook/client-api/-/client-api-7.0.9.tgz#7a280c7f858f5e0c6496e9e87474b2007794154c" + integrity sha512-H1tmFi/zmrZIwHTMlt/LkyPSbNXkWDSBKkxLBSo3FIhH2vdTVM1v8M5Jf9Pq/Tc2ARq9Vpl1R7b25xxAGSQ/lQ== + dependencies: + "@storybook/client-logger" "7.0.9" + "@storybook/preview-api" "7.0.9" + +"@storybook/client-logger@7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-7.0.9.tgz#2f94d4378912c753e27e647880d429bb1ed23104" + integrity sha512-EJnXWvpTFEj462ixZbDouTN9X/FinRgaKKN6zXdhSSZUnm5PcZBtnoX5S+982z3LiAjdNIuAdZE/4vwBIAF88A== + dependencies: + "@storybook/global" "^5.0.0" + +"@storybook/codemod@7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@storybook/codemod/-/codemod-7.0.9.tgz#78aecd97ef26c72d0320ed79b333d010f82dc2d9" + integrity sha512-ElBZj7MyUIOc4jmsPgORShqwQw7z7vtqeXsrcuVg4GoUYMCuva88+zOiHcKBnXMXYOSYAINKLHtcKD8t3PHuhA== + dependencies: + "@babel/core" "~7.21.0" + "@babel/preset-env" "~7.21.0" + "@babel/types" "~7.21.2" + "@storybook/csf" "^0.1.0" + "@storybook/csf-tools" "7.0.9" + "@storybook/node-logger" "7.0.9" + "@storybook/types" "7.0.9" + cross-spawn "^7.0.3" + globby "^11.0.2" + jscodeshift "^0.14.0" lodash "^4.17.21" + prettier "^2.8.0" + recast "^0.23.1" + +"@storybook/components@7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@storybook/components/-/components-7.0.9.tgz#fd27d20886c44e9f0a2f370fcc6deee2dc9aa016" + integrity sha512-60TcZSHYjHkJ6YyheL5SQ8zWi4zmefUKzjcRdIJwMQ57PyEK0LL7wKv63xD3ePbKHTZaQaIB3yOJSF/HQ1BHcQ== + dependencies: + "@storybook/client-logger" "7.0.9" + "@storybook/csf" "^0.1.0" + "@storybook/global" "^5.0.0" + "@storybook/theming" "7.0.9" + "@storybook/types" "7.0.9" memoizerific "^1.11.3" - qs "^6.10.0" - regenerator-runtime "^0.13.7" - store2 "^2.12.0" - synchronous-promise "^2.0.15" - ts-dedent "^2.0.0" + use-resize-observer "^9.1.0" util-deprecate "^1.0.2" -"@storybook/client-logger@6.5.9": - version "6.5.9" - resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-6.5.9.tgz#dc1669abe8c45af1cc38f74c6f4b15ff33e63014" - integrity sha512-DOHL6p0uiDd3gV/Sb2FR+Vh6OiPrrf8BrA06uvXWsMRIIvEEvnparxv9EvPg7FlmUX0T3nq7d3juwjx4F8Wbcg== - dependencies: - core-js "^3.8.2" - global "^4.4.0" - -"@storybook/components@6.5.9": - version "6.5.9" - resolved "https://registry.yarnpkg.com/@storybook/components/-/components-6.5.9.tgz#97e07ffe11ab76c01ccee380888991bd161f75b2" - integrity sha512-BhfX980O9zn/1J4FNMeDo8ZvL1m5Ml3T4HRpfYmEBnf8oW5b5BeF6S2K2cwFStZRjWqm1feUcwNpZxCBVMkQnQ== +"@storybook/core-client@7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@storybook/core-client/-/core-client-7.0.9.tgz#a28ab73ee8490280213492d1b8f18727405315f8" + integrity sha512-gBZnwh+YgFVBdwyYX4SKQyjVq56WyJU3l2s5on6im2SjxKLZXFfeOpl6XtAgbP2eIU8oaV9txY2hURsUJRkEoA== dependencies: - "@storybook/client-logger" "6.5.9" - "@storybook/csf" "0.0.2--canary.4566f4d.1" - "@storybook/theming" "6.5.9" - "@types/react-syntax-highlighter" "11.0.5" - core-js "^3.8.2" - memoizerific "^1.11.3" - qs "^6.10.0" - react-syntax-highlighter "^15.4.5" - regenerator-runtime "^0.13.7" - util-deprecate "^1.0.2" - -"@storybook/core-client@6.5.9": - version "6.5.9" - resolved "https://registry.yarnpkg.com/@storybook/core-client/-/core-client-6.5.9.tgz#ea6035d1c90d2c68e860e3cf629979491856cd88" - integrity sha512-LY0QbhShowO+PQx3gao3wdVjpKMH1AaSLmuI95FrcjoMmSXGf96jVLKQp9mJRGeHIsAa93EQBYuCihZycM3Kbg== - dependencies: - "@storybook/addons" "6.5.9" - "@storybook/channel-postmessage" "6.5.9" - "@storybook/channel-websocket" "6.5.9" - "@storybook/client-api" "6.5.9" - "@storybook/client-logger" "6.5.9" - "@storybook/core-events" "6.5.9" - "@storybook/csf" "0.0.2--canary.4566f4d.1" - "@storybook/preview-web" "6.5.9" - "@storybook/store" "6.5.9" - "@storybook/ui" "6.5.9" - airbnb-js-shims "^2.2.1" - ansi-to-html "^0.6.11" - core-js "^3.8.2" - global "^4.4.0" - lodash "^4.17.21" - qs "^6.10.0" - regenerator-runtime "^0.13.7" - ts-dedent "^2.0.0" - unfetch "^4.2.0" - util-deprecate "^1.0.2" + "@storybook/client-logger" "7.0.9" + "@storybook/preview-api" "7.0.9" -"@storybook/core-common@6.5.9": - version "6.5.9" - resolved "https://registry.yarnpkg.com/@storybook/core-common/-/core-common-6.5.9.tgz#7ca8258ea2634b1d64695c1e4262f71cc7457989" - integrity sha512-NxOK0mrOCo0TWZ7Npc5HU66EKoRHlrtg18/ZixblLDWQMIqY9XCck8K1kJ8QYpYCHla+aHIsYUArFe2vhlEfZA== +"@storybook/core-common@7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@storybook/core-common/-/core-common-7.0.9.tgz#c44032111e47c4124c44a56e50afbdc3e023413f" + integrity sha512-IchifM372HCKfhqSIL9uShSNBHEGoPaDnKky3XfAz4IeI/iepFVWUtJ95znnhfRj4lzMenA6/Ng7TWWuQj5Q8w== dependencies: - "@babel/core" "^7.12.10" - "@babel/plugin-proposal-class-properties" "^7.12.1" - "@babel/plugin-proposal-decorators" "^7.12.12" - "@babel/plugin-proposal-export-default-from" "^7.12.1" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.12.1" - "@babel/plugin-proposal-object-rest-spread" "^7.12.1" - "@babel/plugin-proposal-optional-chaining" "^7.12.7" - "@babel/plugin-proposal-private-methods" "^7.12.1" - "@babel/plugin-proposal-private-property-in-object" "^7.12.1" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-transform-arrow-functions" "^7.12.1" - "@babel/plugin-transform-block-scoping" "^7.12.12" - "@babel/plugin-transform-classes" "^7.12.1" - "@babel/plugin-transform-destructuring" "^7.12.1" - "@babel/plugin-transform-for-of" "^7.12.1" - "@babel/plugin-transform-parameters" "^7.12.1" - "@babel/plugin-transform-shorthand-properties" "^7.12.1" - "@babel/plugin-transform-spread" "^7.12.1" - "@babel/preset-env" "^7.12.11" - "@babel/preset-react" "^7.12.10" - "@babel/preset-typescript" "^7.12.7" - "@babel/register" "^7.12.1" - "@storybook/node-logger" "6.5.9" - "@storybook/semver" "^7.3.2" - "@types/node" "^14.0.10 || ^16.0.0" + "@storybook/node-logger" "7.0.9" + "@storybook/types" "7.0.9" + "@types/node" "^16.0.0" "@types/pretty-hrtime" "^1.0.0" - babel-loader "^8.0.0" - babel-plugin-macros "^3.0.1" - babel-plugin-polyfill-corejs3 "^0.1.0" chalk "^4.1.0" - core-js "^3.8.2" - express "^4.17.1" - file-system-cache "^1.0.5" + esbuild "^0.17.0" + esbuild-register "^3.4.0" + file-system-cache "^2.0.0" find-up "^5.0.0" - fork-ts-checker-webpack-plugin "^6.0.4" - fs-extra "^9.0.1" - glob "^7.1.6" + fs-extra "^11.1.0" + glob "^8.1.0" + glob-promise "^6.0.2" handlebars "^4.7.7" - interpret "^2.2.0" - json5 "^2.1.3" - lazy-universal-dotenv "^3.0.1" + lazy-universal-dotenv "^4.0.0" picomatch "^2.3.0" pkg-dir "^5.0.0" pretty-hrtime "^1.0.3" resolve-from "^5.0.0" - slash "^3.0.0" - telejson "^6.0.8" ts-dedent "^2.0.0" - util-deprecate "^1.0.2" - webpack "4" -"@storybook/core-events@6.5.9": - version "6.5.9" - resolved "https://registry.yarnpkg.com/@storybook/core-events/-/core-events-6.5.9.tgz#5b0783c7d22a586c0f5e927a61fe1b1223e19637" - integrity sha512-tXt7a3ZvJOCeEKpNa/B5rQM5VI7UJLlOh3IHOImWn4HqoBRrZvbourmac+PRZAtXpos0h3c6554Hjapj/Sny5Q== - dependencies: - core-js "^3.8.2" +"@storybook/core-events@7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@storybook/core-events/-/core-events-7.0.9.tgz#4aa5913cfa3ccb40b83bf4ffbb6ef832aa8f5402" + integrity sha512-xJiyX7Gq/TgDdBv+8KbfTJ4Sc7fCMeIEUqWTtnYCHWB7Mp6Iui37+caDX3aGQRTz7FVgb7aL5QkQES9Ihc1+dg== -"@storybook/core-server@6.5.9": - version "6.5.9" - resolved "https://registry.yarnpkg.com/@storybook/core-server/-/core-server-6.5.9.tgz#749a881c1a81d7cf1a69f3782c06a7f0c39a505c" - integrity sha512-YeePGUrd5fQPvGzMhowh124KrcZURFpFXg1VB0Op3ESqCIsInoMZeObci4Gc+binMXC7vcv7aw3EwSLU37qJzQ== +"@storybook/core-server@7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@storybook/core-server/-/core-server-7.0.9.tgz#df1e3c76c2a439dbc610dcb016da2d242f880dee" + integrity sha512-cB8CX0EyneqdiE6f2Unk3p8ooFyr3dszzX8ffv+f1XVcidh98HuoUzGduqJYfLBZWjfMQIu9OuayAca9KvsOpQ== dependencies: + "@aw-web-design/x-default-browser" "1.4.88" "@discoveryjs/json-ext" "^0.5.3" - "@storybook/builder-webpack4" "6.5.9" - "@storybook/core-client" "6.5.9" - "@storybook/core-common" "6.5.9" - "@storybook/core-events" "6.5.9" - "@storybook/csf" "0.0.2--canary.4566f4d.1" - "@storybook/csf-tools" "6.5.9" - "@storybook/manager-webpack4" "6.5.9" - "@storybook/node-logger" "6.5.9" - "@storybook/semver" "^7.3.2" - "@storybook/store" "6.5.9" - "@storybook/telemetry" "6.5.9" - "@types/node" "^14.0.10 || ^16.0.0" + "@storybook/builder-manager" "7.0.9" + "@storybook/core-common" "7.0.9" + "@storybook/core-events" "7.0.9" + "@storybook/csf" "^0.1.0" + "@storybook/csf-tools" "7.0.9" + "@storybook/docs-mdx" "^0.1.0" + "@storybook/global" "^5.0.0" + "@storybook/manager" "7.0.9" + "@storybook/node-logger" "7.0.9" + "@storybook/preview-api" "7.0.9" + "@storybook/telemetry" "7.0.9" + "@storybook/types" "7.0.9" + "@types/detect-port" "^1.3.0" + "@types/node" "^16.0.0" "@types/node-fetch" "^2.5.7" "@types/pretty-hrtime" "^1.0.0" - "@types/webpack" "^4.41.26" + "@types/semver" "^7.3.4" better-opn "^2.1.1" boxen "^5.1.2" chalk "^4.1.0" cli-table3 "^0.6.1" - commander "^6.2.1" compression "^1.7.4" - core-js "^3.8.2" - cpy "^8.1.2" detect-port "^1.3.0" - express "^4.17.1" - fs-extra "^9.0.1" - global "^4.4.0" + express "^4.17.3" + fs-extra "^11.1.0" globby "^11.0.2" ip "^2.0.0" lodash "^4.17.21" @@ -4289,309 +4352,219 @@ open "^8.4.0" pretty-hrtime "^1.0.3" prompts "^2.4.0" - regenerator-runtime "^0.13.7" + read-pkg-up "^7.0.1" + semver "^7.3.7" serve-favicon "^2.5.0" - slash "^3.0.0" - telejson "^6.0.8" + telejson "^7.0.3" ts-dedent "^2.0.0" util-deprecate "^1.0.2" watchpack "^2.2.0" - webpack "4" ws "^8.2.3" - x-default-browser "^0.4.0" -"@storybook/core@6.5.9": - version "6.5.9" - resolved "https://registry.yarnpkg.com/@storybook/core/-/core-6.5.9.tgz#da4f237391d99aed1228323f24b335cafbdf3499" - integrity sha512-Mt3TTQnjQt2/pa60A+bqDsAOrYpohapdtt4DDZEbS8h0V6u11KyYYh3w7FCySlL+sPEyogj63l5Ec76Jah3l2w== +"@storybook/core-webpack@7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@storybook/core-webpack/-/core-webpack-7.0.9.tgz#8941966f111e3f9a0b427a3d9e5c62f8af7b7459" + integrity sha512-rulpzpQXeQurI69sicR1C110jKQ6TR0jwonVfTgD8UvBYQm0Q4Zujv4S3YGJLwRMYLNk4DKZ/mC0DNP32K/Pjg== dependencies: - "@storybook/core-client" "6.5.9" - "@storybook/core-server" "6.5.9" + "@storybook/core-common" "7.0.9" + "@storybook/node-logger" "7.0.9" + "@storybook/types" "7.0.9" + "@types/node" "^16.0.0" + ts-dedent "^2.0.0" -"@storybook/csf-tools@6.5.9": - version "6.5.9" - resolved "https://registry.yarnpkg.com/@storybook/csf-tools/-/csf-tools-6.5.9.tgz#8e01df2305b53e228229f0b45ada3720e6e42a1c" - integrity sha512-RAdhsO2XmEDyWy0qNQvdKMLeIZAuyfD+tYlUwBHRU6DbByDucvwgMOGy5dF97YNJFmyo93EUYJzXjUrJs3U1LQ== - dependencies: - "@babel/core" "^7.12.10" - "@babel/generator" "^7.12.11" - "@babel/parser" "^7.12.11" - "@babel/plugin-transform-react-jsx" "^7.12.12" - "@babel/preset-env" "^7.12.11" - "@babel/traverse" "^7.12.11" - "@babel/types" "^7.12.11" - "@storybook/csf" "0.0.2--canary.4566f4d.1" - "@storybook/mdx1-csf" "^0.0.1" - core-js "^3.8.2" - fs-extra "^9.0.1" - global "^4.4.0" - regenerator-runtime "^0.13.7" +"@storybook/csf-plugin@7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@storybook/csf-plugin/-/csf-plugin-7.0.9.tgz#37bed8c18402e5aacdf8bc7307197bd7d685bd79" + integrity sha512-h4VBKgd14Ep8jL+un5PtHSrCIyVBbo0h9lJpF9wgOn0MADlfCZ/LTQMaZa9bCEpiWoXwRl+QAzBg1HephjkGfw== + dependencies: + "@storybook/csf-tools" "7.0.9" + unplugin "^0.10.2" + +"@storybook/csf-tools@7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@storybook/csf-tools/-/csf-tools-7.0.9.tgz#c64b9f119d9d9ebc506286f724527cf92ed4e8eb" + integrity sha512-m2qwUELMQ+mg0E4djjKw2MAnH8r97ZARO5er7KdrZRafH61ucxbVOv1zr0JzlN0TQd5PQM9Q+MsromuPY7GmvA== + dependencies: + "@babel/generator" "~7.21.1" + "@babel/parser" "~7.21.2" + "@babel/traverse" "~7.21.2" + "@babel/types" "~7.21.2" + "@storybook/csf" "^0.1.0" + "@storybook/types" "7.0.9" + fs-extra "^11.1.0" + recast "^0.23.1" ts-dedent "^2.0.0" -"@storybook/csf@0.0.2--canary.4566f4d.1": - version "0.0.2--canary.4566f4d.1" - resolved "https://registry.yarnpkg.com/@storybook/csf/-/csf-0.0.2--canary.4566f4d.1.tgz#dac52a21c40ef198554e71fe4d20d61e17f65327" - integrity sha512-9OVvMVh3t9znYZwb0Svf/YQoxX2gVOeQTGe2bses2yj+a3+OJnCrUF3/hGv6Em7KujtOdL2LL+JnG49oMVGFgQ== +"@storybook/csf@^0.0.1": + version "0.0.1" + resolved "https://registry.yarnpkg.com/@storybook/csf/-/csf-0.0.1.tgz#95901507dc02f0bc6f9ac8ee1983e2fc5bb98ce6" + integrity sha512-USTLkZze5gkel8MYCujSRBVIrUQ3YPBrLOx7GNk/0wttvVtlzWXAq9eLbQ4p/NicGxP+3T7KPEMVV//g+yubpw== dependencies: lodash "^4.17.15" -"@storybook/docs-tools@6.5.9": - version "6.5.9" - resolved "https://registry.yarnpkg.com/@storybook/docs-tools/-/docs-tools-6.5.9.tgz#5ff304f881e972ce14923a5ffcfed3f052094889" - integrity sha512-UoTaXLvec8x+q+4oYIk/t8DBju9C3ZTGklqOxDIt+0kS3TFAqEgI3JhKXqQOXgN5zDcvLVSxi8dbVAeSxk2ktA== +"@storybook/csf@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@storybook/csf/-/csf-0.1.0.tgz#62315bf9704f3aa4e0d4d909b9033833774ddfbe" + integrity sha512-uk+jMXCZ8t38jSTHk2o5btI+aV2Ksbvl6DoOv3r6VaCM1KZqeuMwtwywIQdflkA8/6q/dKT8z8L+g8hC4GC3VQ== dependencies: - "@babel/core" "^7.12.10" - "@storybook/csf" "0.0.2--canary.4566f4d.1" - "@storybook/store" "6.5.9" - core-js "^3.8.2" - doctrine "^3.0.0" - lodash "^4.17.21" - regenerator-runtime "^0.13.7" + type-fest "^2.19.0" -"@storybook/manager-webpack4@6.5.9": - version "6.5.9" - resolved "https://registry.yarnpkg.com/@storybook/manager-webpack4/-/manager-webpack4-6.5.9.tgz#c75d2cced4550c8a786f00b0e57b203d613e706c" - integrity sha512-49LZlHqWc7zj9tQfOOANixPYmLxqWTTZceA6DSXnKd9xDiO2Gl23Y+l/CSPXNZGDB8QFAwpimwqyKJj/NLH45A== - dependencies: - "@babel/core" "^7.12.10" - "@babel/plugin-transform-template-literals" "^7.12.1" - "@babel/preset-react" "^7.12.10" - "@storybook/addons" "6.5.9" - "@storybook/core-client" "6.5.9" - "@storybook/core-common" "6.5.9" - "@storybook/node-logger" "6.5.9" - "@storybook/theming" "6.5.9" - "@storybook/ui" "6.5.9" - "@types/node" "^14.0.10 || ^16.0.0" - "@types/webpack" "^4.41.26" - babel-loader "^8.0.0" - case-sensitive-paths-webpack-plugin "^2.3.0" - chalk "^4.1.0" - core-js "^3.8.2" - css-loader "^3.6.0" - express "^4.17.1" - file-loader "^6.2.0" - find-up "^5.0.0" - fs-extra "^9.0.1" - html-webpack-plugin "^4.0.0" - node-fetch "^2.6.7" - pnp-webpack-plugin "1.6.4" - read-pkg-up "^7.0.1" - regenerator-runtime "^0.13.7" - resolve-from "^5.0.0" - style-loader "^1.3.0" - telejson "^6.0.8" - terser-webpack-plugin "^4.2.3" - ts-dedent "^2.0.0" - url-loader "^4.1.1" - util-deprecate "^1.0.2" - webpack "4" - webpack-dev-middleware "^3.7.3" - webpack-virtual-modules "^0.2.2" +"@storybook/docs-mdx@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@storybook/docs-mdx/-/docs-mdx-0.1.0.tgz#33ba0e39d1461caf048b57db354b2cc410705316" + integrity sha512-JDaBR9lwVY4eSH5W8EGHrhODjygPd6QImRbwjAuJNEnY0Vw4ie3bPkeGfnacB3OBW6u/agqPv2aRlR46JcAQLg== -"@storybook/manager-webpack5@6.5.9": - version "6.5.9" - resolved "https://registry.yarnpkg.com/@storybook/manager-webpack5/-/manager-webpack5-6.5.9.tgz#ce9dd6ea6298ab426b111f170c23deea7085ba08" - integrity sha512-J1GamphSsaZLNBEhn1awgxzOS8KfvzrHtVlAm2VHwW7j1E1DItROFJhGCgduYYuBiN9eqm+KIYrxcr6cRuoolQ== +"@storybook/docs-tools@7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@storybook/docs-tools/-/docs-tools-7.0.9.tgz#6013fc0da7475b26c2935b9f848b2a54256548eb" + integrity sha512-E/4aIDDGbSReqggPDVp+TchxnwKKZ7AmODV0N0yYi/srHuunZ8SgpshF5t0EQmoy8UpxzURU1VeSoZvzVIrLQw== dependencies: "@babel/core" "^7.12.10" - "@babel/plugin-transform-template-literals" "^7.12.1" - "@babel/preset-react" "^7.12.10" - "@storybook/addons" "6.5.9" - "@storybook/core-client" "6.5.9" - "@storybook/core-common" "6.5.9" - "@storybook/node-logger" "6.5.9" - "@storybook/theming" "6.5.9" - "@storybook/ui" "6.5.9" - "@types/node" "^14.0.10 || ^16.0.0" - babel-loader "^8.0.0" - case-sensitive-paths-webpack-plugin "^2.3.0" - chalk "^4.1.0" - core-js "^3.8.2" - css-loader "^5.0.1" - express "^4.17.1" - find-up "^5.0.0" - fs-extra "^9.0.1" - html-webpack-plugin "^5.0.0" - node-fetch "^2.6.7" - process "^0.11.10" - read-pkg-up "^7.0.1" - regenerator-runtime "^0.13.7" - resolve-from "^5.0.0" - style-loader "^2.0.0" - telejson "^6.0.8" - terser-webpack-plugin "^5.0.3" - ts-dedent "^2.0.0" - util-deprecate "^1.0.2" - webpack "^5.9.0" - webpack-dev-middleware "^4.1.0" - webpack-virtual-modules "^0.4.1" + "@storybook/core-common" "7.0.9" + "@storybook/preview-api" "7.0.9" + "@storybook/types" "7.0.9" + "@types/doctrine" "^0.0.3" + doctrine "^3.0.0" + lodash "^4.17.21" -"@storybook/mdx1-csf@^0.0.1": - version "0.0.1" - resolved "https://registry.yarnpkg.com/@storybook/mdx1-csf/-/mdx1-csf-0.0.1.tgz#d4184e3f6486fade9f7a6bfaf934d9bc07718d5b" - integrity sha512-4biZIWWzoWlCarMZmTpqcJNgo/RBesYZwGFbQeXiGYsswuvfWARZnW9RE9aUEMZ4XPn7B1N3EKkWcdcWe/K2tg== - dependencies: - "@babel/generator" "^7.12.11" - "@babel/parser" "^7.12.11" - "@babel/preset-env" "^7.12.11" - "@babel/types" "^7.12.11" - "@mdx-js/mdx" "^1.6.22" - "@types/lodash" "^4.14.167" - js-string-escape "^1.0.1" - loader-utils "^2.0.0" +"@storybook/global@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@storybook/global/-/global-5.0.0.tgz#b793d34b94f572c1d7d9e0f44fac4e0dbc9572ed" + integrity sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ== + +"@storybook/manager-api@7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@storybook/manager-api/-/manager-api-7.0.9.tgz#77ca5e371af2f1dc445681808529f5bf3b485962" + integrity sha512-x3sbSkf1HPSTVci2N/uaRr7Hdc7dOwk4YUO37jWLi1aWeaoawgLJS6w0qWsgFNE8Yn7mSMybdvI+1IIhj69ghg== + dependencies: + "@storybook/channels" "7.0.9" + "@storybook/client-logger" "7.0.9" + "@storybook/core-events" "7.0.9" + "@storybook/csf" "^0.1.0" + "@storybook/global" "^5.0.0" + "@storybook/router" "7.0.9" + "@storybook/theming" "7.0.9" + "@storybook/types" "7.0.9" + dequal "^2.0.2" lodash "^4.17.21" - prettier ">=2.2.1 <=2.3.0" + memoizerific "^1.11.3" + semver "^7.3.7" + store2 "^2.14.2" + telejson "^7.0.3" ts-dedent "^2.0.0" -"@storybook/node-logger@6.5.9": - version "6.5.9" - resolved "https://registry.yarnpkg.com/@storybook/node-logger/-/node-logger-6.5.9.tgz#129cfe0d0f79cab4f6a2ba194d39516680b1626f" - integrity sha512-nZZNZG2Wtwv6Trxi3FrnIqUmB55xO+X/WQGPT5iKlqNjdRIu/T72mE7addcp4rbuWCQfZUhcDDGpBOwKtBxaGg== +"@storybook/manager@7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@storybook/manager/-/manager-7.0.9.tgz#7bc1e8d38f719365c3523cb39341e2ced6275070" + integrity sha512-fyUb9DhTCnWBxjVQR0oTnXPStyIZh4DhQ1oXKEYKtV6ZeS+Qw4yXRDgciVXv6ifIBAdSEZOJ0o869c6NUt0iVQ== + +"@storybook/mdx2-csf@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@storybook/mdx2-csf/-/mdx2-csf-1.0.0.tgz#ce4b2e44c9082bf382db835eef611b0097b7d771" + integrity sha512-dBAnEL4HfxxJmv7LdEYUoZlQbWj9APZNIbOaq0tgF8XkxiIbzqvgB0jhL/9UOrysSDbQWBiCRTu2wOVxedGfmw== + +"@storybook/node-logger@7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@storybook/node-logger/-/node-logger-7.0.9.tgz#9331aab88c1f3e8fe2bd7b849592edc8dd87ed83" + integrity sha512-aD3OxqnXxDDx3yPoUhoQ863cTfALWhx5i8wKDECb2LWZBAMsh21wJk/CB/fW5FPd9YwzJ8nbvQxlaNpfsM4N7w== dependencies: "@types/npmlog" "^4.1.2" chalk "^4.1.0" - core-js "^3.8.2" npmlog "^5.0.1" pretty-hrtime "^1.0.3" -"@storybook/postinstall@6.5.9": - version "6.5.9" - resolved "https://registry.yarnpkg.com/@storybook/postinstall/-/postinstall-6.5.9.tgz#a5a2565808e9d7bc310e78c279b09ce337fe3457" - integrity sha512-KQBupK+FMRrtSt8IL0MzCZ/w9qbd25Yxxp/+ajfWgZTRgsWgVFOqcDyMhS16eNbBp5qKIBCBDXfEF+/mK8HwQQ== - dependencies: - core-js "^3.8.2" - -"@storybook/preview-web@6.5.9": - version "6.5.9" - resolved "https://registry.yarnpkg.com/@storybook/preview-web/-/preview-web-6.5.9.tgz#557d919e6df50d66259521aa36ebf4055bbd236e" - integrity sha512-4eMrO2HJyZUYyL/j+gUaDvry6iGedshwT5MQqe7J9FaA+Q2pNARQRB1X53f410w7S4sObRmYIAIluWPYdWym9w== - dependencies: - "@storybook/addons" "6.5.9" - "@storybook/channel-postmessage" "6.5.9" - "@storybook/client-logger" "6.5.9" - "@storybook/core-events" "6.5.9" - "@storybook/csf" "0.0.2--canary.4566f4d.1" - "@storybook/store" "6.5.9" - ansi-to-html "^0.6.11" - core-js "^3.8.2" - global "^4.4.0" +"@storybook/postinstall@7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@storybook/postinstall/-/postinstall-7.0.9.tgz#d27e59e9ecdfd6861c4f7880fd3ca3d1184f4334" + integrity sha512-KUcHqRDC7wANt9dE8gpymzKcqXMSFUPDC/EJSc8mhbuRBW9/DUmkFBgRDj+h3a+orWNzhFTDGr+CnXezV/0X+A== + +"@storybook/preview-api@7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@storybook/preview-api/-/preview-api-7.0.9.tgz#59fbf99e3f4d94263a65ba486f3e5be853ba4fee" + integrity sha512-cLyhq2nk0eiMOUwIIKhgDgZoS1ecRGojl92hR0agZDzNJrb1lvXK6uIkJh/Anl2Jbir28lAjQGU54voPODwTUA== + dependencies: + "@storybook/channel-postmessage" "7.0.9" + "@storybook/channels" "7.0.9" + "@storybook/client-logger" "7.0.9" + "@storybook/core-events" "7.0.9" + "@storybook/csf" "^0.1.0" + "@storybook/global" "^5.0.0" + "@storybook/types" "7.0.9" + "@types/qs" "^6.9.5" + dequal "^2.0.2" lodash "^4.17.21" + memoizerific "^1.11.3" qs "^6.10.0" - regenerator-runtime "^0.13.7" synchronous-promise "^2.0.15" ts-dedent "^2.0.0" - unfetch "^4.2.0" util-deprecate "^1.0.2" -"@storybook/router@6.5.9": - version "6.5.9" - resolved "https://registry.yarnpkg.com/@storybook/router/-/router-6.5.9.tgz#4740248f8517425b2056273fb366ace8a17c65e8" - integrity sha512-G2Xp/2r8vU2O34eelE+G5VbEEVFDeHcCURrVJEROh6dq2asFJAPbzslVXSeCqgOTNLSpRDJ2NcN5BckkNqmqJg== +"@storybook/preview@7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@storybook/preview/-/preview-7.0.9.tgz#0f2566afc8e65d9f1ed844d20fc2e48bee01dd7e" + integrity sha512-09tD+rBWMqBAdVqKhyotO6bTTJlCbVX9uVmc8la4jBoLL1JdE3qkBBmDivEsMDK5AoVaM5Zg2maDO4jm2HyZFw== + +"@storybook/react-dom-shim@7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@storybook/react-dom-shim/-/react-dom-shim-7.0.9.tgz#5f6d05f3556fcddec89d3d44d6575462d491f0a3" + integrity sha512-3S+zJtC0L7yBwLItF3GHn3dZ3T3/9chuzpKU36K+h+oNde/JEBMi8xNh00qXjr/wyl4kJgMhktczCLFgS23dOQ== + +"@storybook/router@7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@storybook/router/-/router-7.0.9.tgz#f892fa7b1d92a7664f36f287e985d733a5db09d6" + integrity sha512-1htgfqGuQxMB258ErNfShpJQncbY4/EL/5qhVB//7Ph98ZeJkaXzdVM9N8MYME5htuoVX43Jpg5hf3W6FB9jIg== dependencies: - "@storybook/client-logger" "6.5.9" - core-js "^3.8.2" + "@storybook/client-logger" "7.0.9" memoizerific "^1.11.3" qs "^6.10.0" - regenerator-runtime "^0.13.7" - -"@storybook/semver@^7.3.2": - version "7.3.2" - resolved "https://registry.yarnpkg.com/@storybook/semver/-/semver-7.3.2.tgz#f3b9c44a1c9a0b933c04e66d0048fcf2fa10dac0" - integrity sha512-SWeszlsiPsMI0Ps0jVNtH64cI5c0UF3f7KgjVKJoNP30crQ6wUSddY2hsdeczZXEKVJGEn50Q60flcGsQGIcrg== - dependencies: - core-js "^3.6.5" - find-up "^4.1.0" -"@storybook/source-loader@6.5.9": - version "6.5.9" - resolved "https://registry.yarnpkg.com/@storybook/source-loader/-/source-loader-6.5.9.tgz#7b6f065c6a6108c4b4ca7e45bfd78707373d84ac" - integrity sha512-H03nFKaP6borfWMTTa9igBA+Jm2ph+FoVJImWC/X+LAmLSJYYSXuqSgmiZ/DZvbjxS4k8vccE2HXogne1IvaRA== +"@storybook/store@7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@storybook/store/-/store-7.0.9.tgz#6e7327a241b94dffe06b17103f8d38bfda761053" + integrity sha512-g/rB0n2Z9muv8NH66SPISVrgb6prTLjI6ypqOQFmB9t+hnwsaRy8MANXn337f9T5yoHkKKONNxVjBtvLxX6U5w== dependencies: - "@storybook/addons" "6.5.9" - "@storybook/client-logger" "6.5.9" - "@storybook/csf" "0.0.2--canary.4566f4d.1" - core-js "^3.8.2" - estraverse "^5.2.0" - global "^4.4.0" - loader-utils "^2.0.0" - lodash "^4.17.21" - prettier ">=2.2.1 <=2.3.0" - regenerator-runtime "^0.13.7" - -"@storybook/store@6.5.9": - version "6.5.9" - resolved "https://registry.yarnpkg.com/@storybook/store/-/store-6.5.9.tgz#dc9963fc013636569082bd8f7200804866373735" - integrity sha512-80pcDTcCwK6wUA63aWOp13urI77jfipIVee9mpVvbNyfrNN8kGv1BS0z/JHDxuV6rC4g7LG1fb+BurR0yki7BA== - dependencies: - "@storybook/addons" "6.5.9" - "@storybook/client-logger" "6.5.9" - "@storybook/core-events" "6.5.9" - "@storybook/csf" "0.0.2--canary.4566f4d.1" - core-js "^3.8.2" - fast-deep-equal "^3.1.3" - global "^4.4.0" - lodash "^4.17.21" - memoizerific "^1.11.3" - regenerator-runtime "^0.13.7" - slash "^3.0.0" - stable "^0.1.8" - synchronous-promise "^2.0.15" - ts-dedent "^2.0.0" - util-deprecate "^1.0.2" + "@storybook/client-logger" "7.0.9" + "@storybook/preview-api" "7.0.9" -"@storybook/telemetry@6.5.9": - version "6.5.9" - resolved "https://registry.yarnpkg.com/@storybook/telemetry/-/telemetry-6.5.9.tgz#8e1e0d4a89fc2387620045e5ea96c109d16a7247" - integrity sha512-JluoHCRhHAr4X0eUNVBSBi1JIBA92404Tu1TPdbN7x6gCZxHXXPTSUTAnspXp/21cTdMhY2x+kfZQ8fmlGK4MQ== +"@storybook/telemetry@7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@storybook/telemetry/-/telemetry-7.0.9.tgz#2be6a1273a51228902a38c6dbb6d13e0fda5e7a4" + integrity sha512-2NB1k1eHgGq35g1nU+m3f9Poa85CiwwdlKVBIXpG5ht4J4XreCRrRDmiSF1vXLvZm7KEhXVS/IzLBAhR2vBdpA== dependencies: - "@storybook/client-logger" "6.5.9" - "@storybook/core-common" "6.5.9" + "@storybook/client-logger" "7.0.9" + "@storybook/core-common" "7.0.9" chalk "^4.1.0" - core-js "^3.8.2" detect-package-manager "^2.0.1" fetch-retry "^5.0.2" - fs-extra "^9.0.1" - global "^4.4.0" + fs-extra "^11.1.0" isomorphic-unfetch "^3.1.0" nanoid "^3.3.1" read-pkg-up "^7.0.1" - regenerator-runtime "^0.13.7" -"@storybook/theming@6.5.9": - version "6.5.9" - resolved "https://registry.yarnpkg.com/@storybook/theming/-/theming-6.5.9.tgz#13f60a3a3cd73ceb5caf9f188e1627e79f1891aa" - integrity sha512-KM0AMP5jMQPAdaO8tlbFCYqx9uYM/hZXGSVUhznhLYu7bhNAIK7ZVmXxyE/z/khM++8eUHzRoZGiO/cwCkg9Xw== +"@storybook/theming@7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@storybook/theming/-/theming-7.0.9.tgz#88060a48c22ad72c065f175c1332d22f599f7d15" + integrity sha512-HVbl4ljFRe5VIcg/HGUdZP7Vc8k9rPhWhE4K98MbuSdxnaU+uvHUhj0fE1umoCn39N9/Ws8Lm596+PKoTE3D1g== dependencies: - "@storybook/client-logger" "6.5.9" - core-js "^3.8.2" + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0" + "@storybook/client-logger" "7.0.9" + "@storybook/global" "^5.0.0" memoizerific "^1.11.3" - regenerator-runtime "^0.13.7" - -"@storybook/ui@6.5.9": - version "6.5.9" - resolved "https://registry.yarnpkg.com/@storybook/ui/-/ui-6.5.9.tgz#41e59279323cccc0d613974ec9782d797220c8a7" - integrity sha512-ryuPxJgtbb0gPXKGgGAUC+Z185xGAd1IvQ0jM5fJ0SisHXI8jteG3RaWhntOehi9qCg+64Vv6eH/cj9QYNHt1Q== - dependencies: - "@storybook/addons" "6.5.9" - "@storybook/api" "6.5.9" - "@storybook/channels" "6.5.9" - "@storybook/client-logger" "6.5.9" - "@storybook/components" "6.5.9" - "@storybook/core-events" "6.5.9" - "@storybook/router" "6.5.9" - "@storybook/semver" "^7.3.2" - "@storybook/theming" "6.5.9" - core-js "^3.8.2" - memoizerific "^1.11.3" - qs "^6.10.0" - regenerator-runtime "^0.13.7" - resolve-from "^5.0.0" -"@stripe/stripe-js@1.22.0": - version "1.22.0" - resolved "https://registry.yarnpkg.com/@stripe/stripe-js/-/stripe-js-1.22.0.tgz#9d3d2f0a1ce81f185ec477fd7cc67544b2b2a00c" - integrity sha512-fm8TR8r4LwbXgBIYdPmeMjJJkxxFC66tvoliNnmXOpUgZSgQKoNPW3ON0ZphZIiif1oqWNhAaSrr7tOvGu+AFg== +"@storybook/types@7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@storybook/types/-/types-7.0.9.tgz#745c74ab88ed911dd75246de3ec3f84e71844f76" + integrity sha512-6aKrrsX3wgPMg9Nu3AK1GYmCZQiHqHv7l24ywNxZPv0T63rcpS86kWK4qVAywoaXGFc9GtRT+dz1rK8Fx50J9Q== + dependencies: + "@storybook/channels" "7.0.9" + "@types/babel__core" "^7.0.0" + "@types/express" "^4.7.0" + file-system-cache "^2.0.0" + +"@stripe/stripe-js@1.47.0": + version "1.47.0" + resolved "https://registry.yarnpkg.com/@stripe/stripe-js/-/stripe-js-1.47.0.tgz#48626a2e43302330aa826ce498a2d9761db4053d" + integrity sha512-jKSClqEIKS2MbPCXlSsseDSZyJ3dVrfUrYMz5LBY1o9iS2tfKbpTZACt8r2g+xyQozI+uHr76pVTyFsmBKA4Mg== "@tootallnate/once@2": version "2.0.0" @@ -4623,13 +4596,26 @@ resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== -"@types/babel__core@^7.1.14": - version "7.1.19" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.19.tgz#7b497495b7d1b4812bdb9d02804d0576f43ee460" - integrity sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw== +"@tufjs/canonical-json@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz#eade9fd1f537993bc1f0949f3aea276ecc4fab31" + integrity sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ== + +"@tufjs/models@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tufjs/models/-/models-1.0.4.tgz#5a689630f6b9dbda338d4b208019336562f176ef" + integrity sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A== dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" + "@tufjs/canonical-json" "1.0.0" + minimatch "^9.0.0" + +"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.0.tgz#61bc5a4cae505ce98e1e36c5445e4bee060d8891" + integrity sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" "@types/babel__generator" "*" "@types/babel__template" "*" "@types/babel__traverse" "*" @@ -4650,18 +4636,18 @@ "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.17.1" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.17.1.tgz#1a0e73e8c28c7e832656db372b779bfd2ef37314" - integrity sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA== + version "7.18.5" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.5.tgz#c107216842905afafd3b6e774f6f935da6f5db80" + integrity sha512-enCvTL8m/EHS/zIvJno9nE+ndYPh1/oNFzRYRmtUqJICG2VnCSBzMLW5VN2KCQU91f23tsNKR8v7VJJQMatl7Q== dependencies: "@babel/types" "^7.3.0" -"@types/big.js@6.1.2": - version "6.1.2" - resolved "https://registry.yarnpkg.com/@types/big.js/-/big.js-6.1.2.tgz#68a952b629a6aaa2b5855a2f63363d1e77f6dd91" - integrity sha512-h24JIZ52rvSvi2jkpYDk2yLH99VzZoCJiSfDWwjst7TwJVuXN61XVCUlPCzRl7mxKEMsGf8z42Q+J4TZwU3z2w== +"@types/big.js@6.1.6": + version "6.1.6" + resolved "https://registry.yarnpkg.com/@types/big.js/-/big.js-6.1.6.tgz#3d417e758483d55345a03a087f7e0c87137ca444" + integrity sha512-0r9J+Zz9rYm2hOTwiMAVkm3XFQ4u5uTK37xrQMhc9bysn/sf/okzovWMYYIBMFTn/yrEZ11pusgLEaoarTlQbA== -"@types/body-parser@*": +"@types/body-parser@*", "@types/body-parser@1.19.2": version "1.19.2" resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== @@ -4676,14 +4662,6 @@ dependencies: "@types/node" "*" -"@types/bull@3.15.9": - version "3.15.9" - resolved "https://registry.yarnpkg.com/@types/bull/-/bull-3.15.9.tgz#e10e0901ec3762bff85716b3c580277960751c93" - integrity sha512-MPUcyPPQauAmynoO3ezHAmCOhbB0pWmYyijr/5ctaCqhbKWsjW0YCod38ZcLzUBprosfZ9dPqfYIcfdKjk7RNQ== - dependencies: - "@types/ioredis" "*" - "@types/redis" "^2.8.0" - "@types/cache-manager@3.4.2": version "3.4.2" resolved "https://registry.yarnpkg.com/@types/cache-manager/-/cache-manager-3.4.2.tgz#d57e7e5e6374d1037bdce753a05c9703e4483401" @@ -4701,17 +4679,17 @@ resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== -"@types/color@3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/color/-/color-3.0.2.tgz#3779043e782f562aa9157b5fc6bd07e14fd8e7f3" - integrity sha512-INiJl6sfNn8iyC5paxVzqiVUEj2boIlFki02uRTAkKwAj++7aAF+ZfEv/XrIeBa0XI/fTZuDHW8rEEcEVnON+Q== +"@types/color@3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/color/-/color-3.0.3.tgz#e6d8d72b7aaef4bb9fe80847c26c7c786191016d" + integrity sha512-X//qzJ3d3Zj82J9sC/C18ZY5f43utPbAJ6PhYt/M7uG6etcF6MRpKdN880KBy43B0BMzSfeT96MzrsNjFI3GbA== dependencies: "@types/color-convert" "*" "@types/connect-history-api-fallback@^1.3.5": - version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz#d1f7a8a09d0ed5a57aee5ae9c18ab9b803205dae" - integrity sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw== + version "1.5.0" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz#9fd20b3974bdc2bcd4ac6567e2e0f6885cb2cf41" + integrity sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig== dependencies: "@types/express-serve-static-core" "*" "@types/node" "*" @@ -4723,47 +4701,73 @@ dependencies: "@types/node" "*" +"@types/detect-port@^1.3.0": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@types/detect-port/-/detect-port-1.3.2.tgz#8c06a975e472803b931ee73740aeebd0a2eb27ae" + integrity sha512-xxgAGA2SAU4111QefXPSp5eGbDm/hW6zhvYl9IeEPZEry9F4d66QAHm5qpUXjb6IsevZV/7emAEx5MhP6O192g== + +"@types/doctrine@^0.0.3": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@types/doctrine/-/doctrine-0.0.3.tgz#e892d293c92c9c1d3f9af72c15a554fbc7e0895a" + integrity sha512-w5jZ0ee+HaPOaX25X2/2oGR/7rgAQSYII7X7pp0m9KgBfMP7uKfMfTvcpl5Dj+eDBbpxKGiqE+flqDr6XTd2RA== + +"@types/ejs@^3.1.1": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@types/ejs/-/ejs-3.1.2.tgz#75d277b030bc11b3be38c807e10071f45ebc78d9" + integrity sha512-ZmiaE3wglXVWBM9fyVC17aGPkLo/UgaOjEiI2FXQfyczrCefORPxIe+2dVmnmk3zkVIbizjrlQzmPGhSYGXG5g== + "@types/eslint-scope@^3.7.3": - version "3.7.3" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.3.tgz#125b88504b61e3c8bc6f870882003253005c3224" - integrity sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g== + version "3.7.4" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" + integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== dependencies: "@types/eslint" "*" "@types/estree" "*" "@types/eslint@*": - version "8.4.3" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.3.tgz#5c92815a3838b1985c90034cd85f26f59d9d0ece" - integrity sha512-YP1S7YJRMPs+7KZKDb9G63n8YejIwW9BALq7a5j2+H4yl6iOv9CB29edho+cuFRrvmJbbaH2yiVChKLJVysDGw== + version "8.37.0" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.37.0.tgz#29cebc6c2a3ac7fea7113207bf5a828fdf4d7ef1" + integrity sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ== dependencies: "@types/estree" "*" "@types/json-schema" "*" -"@types/estree@*", "@types/estree@^0.0.51": +"@types/estree@*", "@types/estree@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194" + integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== + +"@types/estree@^0.0.51": version "0.0.51" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== -"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.18": - version "4.17.29" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.29.tgz#2a1795ea8e9e9c91b4a4bbe475034b20c1ec711c" - integrity sha512-uMd++6dMKS32EOuw1Uli3e3BPgdLIXmezcfHv7N4c1s3gkhikBplORPpMq3fuWkxncZN1reb16d5n8yhQ80x7Q== +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": + version "4.17.34" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.34.tgz#c119e85b75215178bc127de588e93100698ab4cc" + integrity sha512-fvr49XlCGoUj2Pp730AItckfjat4WNb0lb3kfrLWffd+RLeoGAMsq7UOy04PAPtoL01uKwcp6u8nhzpgpDYr3w== dependencies: "@types/node" "*" "@types/qs" "*" "@types/range-parser" "*" + "@types/send" "*" -"@types/express@*", "@types/express@^4.17.13": - version "4.17.13" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034" - integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA== +"@types/express@*", "@types/express@^4.17.13", "@types/express@^4.7.0": + version "4.17.17" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.17.tgz#01d5437f6ef9cfa8668e616e13c2f2ac9a491ae4" + integrity sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q== dependencies: "@types/body-parser" "*" - "@types/express-serve-static-core" "^4.17.18" + "@types/express-serve-static-core" "^4.17.33" "@types/qs" "*" "@types/serve-static" "*" -"@types/glob@*", "@types/glob@^7.1.1": +"@types/find-cache-dir@^3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@types/find-cache-dir/-/find-cache-dir-3.2.1.tgz#7b959a4b9643a1e6a1a5fe49032693cc36773501" + integrity sha512-frsJrz2t/CeGifcu/6uRo4b+SzAwT4NYCVPu1GN8IB9XTzrpPkGuV0tmh9mN+/L0PklAlsC3u5Fxt0ju00LXIw== + +"@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== @@ -4771,54 +4775,38 @@ "@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" + integrity sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w== + dependencies: + "@types/minimatch" "^5.1.2" + "@types/node" "*" + "@types/google-spreadsheet@3.1.5": version "3.1.5" resolved "https://registry.yarnpkg.com/@types/google-spreadsheet/-/google-spreadsheet-3.1.5.tgz#2bdc6f9f5372551e0506cb6ef3f562adcf44fc2e" integrity sha512-7N+mDtZ1pmya2RRFPPl4KYc2TRgiqCNBLUZfyrKfER+u751JgCO+C24/LzF70UmUm/zhHUbzRZ5mtfaxekQ1ZQ== -"@types/graceful-fs@^4.1.2", "@types/graceful-fs@^4.1.3": - version "4.1.5" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" - integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== +"@types/graceful-fs@^4.1.3": + version "4.1.6" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" + integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== dependencies: "@types/node" "*" -"@types/hast@^2.0.0": - version "2.3.4" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.4.tgz#8aa5ef92c117d20d974a82bdfb6a648b08c0bafc" - integrity sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g== - dependencies: - "@types/unist" "*" - -"@types/html-minifier-terser@^5.0.0": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz#693b316ad323ea97eed6b38ed1a3cc02b1672b57" - integrity sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w== - "@types/html-minifier-terser@^6.0.0": version "6.1.0" resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== "@types/http-proxy@^1.17.8": - version "1.17.9" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.9.tgz#7f0e7931343761efde1e2bf48c40f02f3f75705a" - integrity sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw== + version "1.17.11" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.11.tgz#0ca21949a5588d55ac2b659b69035c84bd5da293" + integrity sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA== dependencies: "@types/node" "*" -"@types/ioredis@*": - version "4.28.10" - resolved "https://registry.yarnpkg.com/@types/ioredis/-/ioredis-4.28.10.tgz#40ceb157a4141088d1394bb87c98ed09a75a06ff" - integrity sha512-69LyhUgrXdgcNDv7ogs1qXZomnfOEnSmrmMFqKgt1XMJxmoOSG/u3wYy13yACIfKuMJ8IhKgHafDO3sx19zVQQ== - dependencies: - "@types/node" "*" - -"@types/is-function@^1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/is-function/-/is-function-1.0.1.tgz#2d024eace950c836d9e3335a66b97960ae41d022" - integrity sha512-A79HEEiwXTFtfY+Bcbo58M2GRYzCr9itHWzbzHVFNEYCcoU/MMGwYYf721gBrnhpj1s6RGVVha/IgNFnR0Iw/Q== - "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.4" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" @@ -4838,24 +4826,24 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/jest@28.1.8": - version "28.1.8" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-28.1.8.tgz#6936409f3c9724ea431efd412ea0238a0f03b09b" - integrity sha512-8TJkV++s7B6XqnDrzR1m/TT0A0h948Pnl/097veySPN67VRAgQ4gZ7n2KfJo2rVq6njQjdxU3GCCyDvAeuHoiw== +"@types/jest@29.4.4": + version "29.4.4" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.4.4.tgz#ba257bd7b1876dec9e0b4fb82fa60eec5505e5f1" + integrity sha512-qezb65VIH7X1wobSnd6Lvdve7PXSyQRa3dljTkhTtDhi603RvHQCshSlJcuyMLHJpeHgY3NKwvDJWxMOOHxGDQ== dependencies: - expect "^28.0.0" - pretty-format "^28.0.0" + expect "^29.0.0" + pretty-format "^29.0.0" -"@types/jsdom@^16.2.4": - version "16.2.15" - resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-16.2.15.tgz#6c09990ec43b054e49636cba4d11d54367fc90d6" - integrity sha512-nwF87yjBKuX/roqGYerZZM0Nv1pZDMAT5YhOHYeM/72Fic+VEqJh4nyoqoapzJnW3pUlfxPY5FhgsJtM+dRnQQ== +"@types/jsdom@^20.0.0": + version "20.0.1" + resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-20.0.1.tgz#07c14bc19bd2f918c1929541cdaacae894744808" + integrity sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ== dependencies: "@types/node" "*" - "@types/parse5" "^6.0.3" "@types/tough-cookie" "*" + parse5 "^7.0.0" -"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": +"@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.11" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== @@ -4872,65 +4860,68 @@ dependencies: "@types/node" "*" -"@types/lodash@4.14.174": - version "4.14.174" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.174.tgz#b4b06b6eced9850eed6b6a8f1abdd0f5192803c1" - integrity sha512-KMBLT6+g9qrGXpDt7ohjWPUD34WA/jasrtjTEHStF0NPdEwJ1N9SZ+4GaMVDeuk/y0+X5j9xFm6mNiXS7UoaLQ== +"@types/lodash@4.14.191": + version "4.14.191" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.191.tgz#09511e7f7cba275acd8b419ddac8da9a6a79e2fa" + integrity sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ== "@types/lodash@^4.14.167": - version "4.14.182" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.182.tgz#05301a4d5e62963227eaafe0ce04dd77c54ea5c2" - integrity sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q== + version "4.14.194" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.194.tgz#b71eb6f7a0ff11bff59fc987134a093029258a76" + integrity sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g== -"@types/marked@^4.0.3": - version "4.0.3" - resolved "https://registry.yarnpkg.com/@types/marked/-/marked-4.0.3.tgz#2098f4a77adaba9ce881c9e0b6baf29116e5acc4" - integrity sha512-HnMWQkLJEf/PnxZIfbm0yGJRRZYYMhb++O9M36UCTA9z53uPvVoSlAwJr3XOpDEryb7Hwl1qAx/MV6YIW1RXxg== +"@types/marked@4.0.8": + version "4.0.8" + resolved "https://registry.yarnpkg.com/@types/marked/-/marked-4.0.8.tgz#b316887ab3499d0a8f4c70b7bd8508f92d477955" + integrity sha512-HVNzMT5QlWCOdeuBsgXP8EZzKUf0+AXzN+sLmjvaB3ZlLqO+e4u0uXrdw9ub69wBKFs+c6/pA4r9sy6cCDvImw== -"@types/mdast@^3.0.0": - version "3.0.10" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.10.tgz#4724244a82a4598884cbbe9bcfd73dff927ee8af" - integrity sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA== - dependencies: - "@types/unist" "*" +"@types/mdx@^2.0.0": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@types/mdx/-/mdx-2.0.5.tgz#9a85a8f70c7c4d9e695a21d5ae5c93645eda64b1" + integrity sha512-76CqzuD6Q7LC+AtbPqrvD9AqsN0k8bsYo2bM2J8pmNldP1aIPAbzUQ7QbobyXL4eLr1wK5x8FZFe8eF/ubRuBg== + +"@types/mime-types@^2.1.0": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@types/mime-types/-/mime-types-2.1.1.tgz#d9ba43490fa3a3df958759adf69396c3532cf2c1" + integrity sha512-vXOTGVSLR2jMw440moWTC7H19iUyLtP3Z1YTj7cSsubOICinjMxFeb/V57v9QdyyPGbbWolUFSSmSiRSn94tFw== "@types/mime@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.0.tgz#e9a9903894405c6a6551f1774df4e64d9804d69c" - integrity sha512-fccbsHKqFDXClBZTDLA43zl0+TbxyIwyzIzwwhvoJvhNjOErCdeX2xJbURimv2EbSVUGav001PaCJg4mZxMl4w== + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" + integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== "@types/mime@^1": version "1.3.2" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== -"@types/minimatch@*": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" - integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== +"@types/minimatch@*", "@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== "@types/node-fetch@^2.5.7": - version "2.6.2" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.2.tgz#d1a9c5fd049d9415dce61571557104dec3ec81da" - integrity sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A== + version "2.6.3" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.3.tgz#175d977f5e24d93ad0f57602693c435c57ad7e80" + integrity sha512-ETTL1mOEdq/sxUtgtOhKjyB2Irra4cjxksvcMUR5Zr4n+PxVhsCD9WS46oPbHL3et9Zde7CNRr+WUNlcHvsX+w== dependencies: "@types/node" "*" form-data "^3.0.0" "@types/node@*", "@types/node@>=8.1.0": - version "18.0.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.0.0.tgz#67c7b724e1bcdd7a8821ce0d5ee184d3b4dd525a" - integrity sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA== + version "20.1.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.1.0.tgz#258805edc37c327cf706e64c6957f241ca4c4c20" + integrity sha512-O+z53uwx64xY7D6roOi4+jApDGFg0qn6WHcxe5QeqjMaTezBO/mxdfFXIVAVVyNWKx84OmPB3L8kbVYOTeN34A== -"@types/node@18.7.1": - version "18.7.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.7.1.tgz#352bee64f93117d867d05f7406642a52685cbca6" - integrity sha512-GKX1Qnqxo4S+Z/+Z8KKPLpH282LD7jLHWJcVryOflnsnH+BtSDfieR6ObwBMwpnNws0bUK8GI7z0unQf9bARNQ== +"@types/node@18.11.18": + version "18.11.18" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.18.tgz#8dfb97f0da23c2293e554c5a50d61ef134d7697f" + integrity sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA== -"@types/node@^14.0.10 || ^16.0.0", "@types/node@^14.14.20 || ^16.0.0": - version "16.11.41" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.41.tgz#88eb485b1bfdb4c224d878b7832239536aa2f813" - integrity sha512-mqoYK2TnVjdkGk8qXAVGc/x9nSaTpSrFaGFm43BUH3IdoBV0nta6hYaGmdOvIMlbHJbUEVen3gvwpwovAZKNdQ== +"@types/node@^16.0.0": + version "16.18.26" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.26.tgz#a18b88726a67bc6a8a5bdac9a40c093ecb03ccd0" + integrity sha512-pCNBzNQqCXE4A6FWDmrn/o1Qu+qBf8tnorBlNoPNSBQJF+jXzvTKNI/aMiE+hGJbK5sDAD65g7OS/YwSHIEJdw== "@types/normalize-package-data@^2.4.0": version "2.4.1" @@ -4949,10 +4940,10 @@ dependencies: "@types/node" "*" -"@types/papaparse@5.2.6": - version "5.2.6" - resolved "https://registry.yarnpkg.com/@types/papaparse/-/papaparse-5.2.6.tgz#0bba18de4d15eff65883bc7c0794e0134de9e7c7" - integrity sha512-xGKSd0UTn58N1h0+zf8mW863Rv8BvXcGibEgKFtBIXZlcDXAmX/T4RdDO2mwmrmOypUDt5vRgo2v32a78JdqUA== +"@types/papaparse@5.3.7": + version "5.3.7" + resolved "https://registry.yarnpkg.com/@types/papaparse/-/papaparse-5.3.7.tgz#8d3bf9e62ac2897df596f49d9ca59a15451aa247" + integrity sha512-f2HKmlnPdCvS0WI33WtCs5GD7X1cxzzS/aduaxSu3I7TbhWlENjSPs6z5TaB9K0J+BH1jbmqTaM+ja5puis4wg== dependencies: "@types/node" "*" @@ -4961,16 +4952,6 @@ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== -"@types/parse5@^5.0.0": - version "5.0.3" - resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-5.0.3.tgz#e7b5aebbac150f8b5fdd4a46e7f0bd8e65e19109" - integrity sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw== - -"@types/parse5@^6.0.3": - version "6.0.3" - resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-6.0.3.tgz#705bb349e789efa06f43f128cef51240753424cb" - integrity sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g== - "@types/passport-google-oauth20@2.0.11": version "2.0.11" resolved "https://registry.yarnpkg.com/@types/passport-google-oauth20/-/passport-google-oauth20-2.0.11.tgz#271ec71de3030a3e1c004b24e633e4b298ccba97" @@ -4981,25 +4962,25 @@ "@types/passport-oauth2" "*" "@types/passport-oauth2@*": - version "1.4.11" - resolved "https://registry.yarnpkg.com/@types/passport-oauth2/-/passport-oauth2-1.4.11.tgz#fbca527ecb44258774d17bcb251630c321515fa9" - integrity sha512-KUNwmGhe/3xPbjkzkPwwcPmyFwfyiSgtV1qOrPBLaU4i4q9GSCdAOyCbkFG0gUxAyEmYwqo9OAF/rjPjJ6ImdA== + version "1.4.12" + resolved "https://registry.yarnpkg.com/@types/passport-oauth2/-/passport-oauth2-1.4.12.tgz#c2ae0ee3b16646188d8b0b6cdbc6880a0247dc5f" + integrity sha512-RZg6cYTyEGinrZn/7REYQds6zrTxoBorX1/fdaz5UHzkG8xdFE7QQxkJagCr2ETzGII58FAFDmnmbTUVMrltNA== dependencies: "@types/express" "*" "@types/oauth" "*" "@types/passport" "*" "@types/passport@*": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@types/passport/-/passport-1.0.9.tgz#b32fa8f7485dace77a9b58e82d0c92908f6e8387" - integrity sha512-9+ilzUhmZQR4JP49GdC2O4UdDE3POPLwpmaTC/iLkW7l0TZCXOo1zsTnnlXPq6rP1UsUZPfbAV4IUdiwiXyC7g== + version "1.0.12" + resolved "https://registry.yarnpkg.com/@types/passport/-/passport-1.0.12.tgz#7dc8ab96a5e895ec13688d9e3a96920a7f42e73e" + integrity sha512-QFdJ2TiAEoXfEQSNDISJR1Tm51I78CymqcBa8imbjo6dNNu+l2huDxxbDEIoFIwOSKMkOfHEikyDuZ38WwWsmw== dependencies: "@types/express" "*" "@types/prettier@^2.1.5": - version "2.6.3" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.6.3.tgz#68ada76827b0010d0db071f739314fa429943d0a" - integrity sha512-ymZk3LEC/fsut+/Q5qejp6R9O1rMxz3XaRHDV6kX8MrGAhOSPqVARbDi+EZvInBpw+BnCX3TD240byVkOfQsHg== + version "2.7.2" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.2.tgz#6c2324641cc4ba050a8c710b2b251b377581fbf0" + integrity sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg== "@types/pretty-hrtime@^1.0.0": version "1.0.1" @@ -5022,58 +5003,52 @@ integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== "@types/react-dom@^16.9.14": - version "16.9.16" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.16.tgz#c591f2ed1c6f32e9759dfa6eb4abfd8041f29e39" - integrity sha512-Oqc0RY4fggGA3ltEgyPLc3IV9T73IGoWjkONbsyJ3ZBn+UPPCYpU2ec0i3cEbJuEdZtkqcCF2l1zf2pBdgUGSg== + version "16.9.19" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.19.tgz#6a139c26b02dec533a7fa131f084561babb10a8f" + integrity sha512-xC8D280Bf6p0zguJ8g62jcEOKZiUbx9sIe6O3tT/lKfR87A7A6g65q13z6D5QUMIa/6yFPkNhqjF5z/VVZEYqQ== dependencies: "@types/react" "^16" -"@types/react-syntax-highlighter@11.0.5": - version "11.0.5" - resolved "https://registry.yarnpkg.com/@types/react-syntax-highlighter/-/react-syntax-highlighter-11.0.5.tgz#0d546261b4021e1f9d85b50401c0a42acb106087" - integrity sha512-VIOi9i2Oj5XsmWWoB72p3KlZoEbdRAcechJa8Ztebw7bDl2YmR+odxIqhtJGp1q2EozHs02US+gzxJ9nuf56qg== - dependencies: - "@types/react" "*" - -"@types/react@*": - version "18.0.12" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.12.tgz#cdaa209d0a542b3fcf69cf31a03976ec4cdd8840" - integrity sha512-duF1OTASSBQtcigUvhuiTB1Ya3OvSy+xORCiEf20H0P0lzx+/KeVsA99U5UjLXSbyo1DRJDlLKqTeM1ngosqtg== +"@types/react@>=16": + version "18.2.6" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.6.tgz#5cd53ee0d30ffc193b159d3516c8c8ad2f19d571" + integrity sha512-wRZClXn//zxCFW+ye/D2qY65UsYP1Fpex2YXorHc8awoNamkMZSvBxwxdYVInsHOZZd2Ppq8isnSzJL5Mpf8OA== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" csstype "^3.0.2" -"@types/react@^16", "@types/react@^16.14.23": - version "16.14.26" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.14.26.tgz#82540a240ba7207ebe87d9579051bc19c9ef7605" - integrity sha512-c/5CYyciOO4XdFcNhZW1O2woVx86k4T+DO2RorHZL7EhitkNQgSD/SgpdZJAUJa/qjVgOmTM44gHkAdZSXeQuQ== +"@types/react@^16", "@types/react@^16.14.34": + version "16.14.41" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.14.41.tgz#55c4e7ebb736ca4e2379e97a4e0c1803150ed8d4" + integrity sha512-h+joCKF2r5rdECoM1U8WCEIHBp5/0TSR5Nyq8gtnnYY1n2WqGuj3indYqTjMb2/b5g2rfxJV6u4jUFq95lbT6Q== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" csstype "^3.0.2" -"@types/redis@^2.8.0": - version "2.8.32" - resolved "https://registry.yarnpkg.com/@types/redis/-/redis-2.8.32.tgz#1d3430219afbee10f8cfa389dad2571a05ecfb11" - integrity sha512-7jkMKxcGq9p242exlbsVzuJb57KqHRhNl4dHoQu2Y5v9bCAbtIXXH0R3HleSQW4CTOqpHIYUW3t6tpUj4BVQ+w== - dependencies: - "@types/node" "*" - "@types/retry@0.12.0": version "0.12.0" resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== "@types/scheduler@*": - version "0.16.2" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" - integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== + version "0.16.3" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.3.tgz#cef09e3ec9af1d63d2a6cc5b383a737e24e6dcf5" + integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== -"@types/semver@^7.3.12": - version "7.3.12" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.12.tgz#920447fdd78d76b19de0438b7f60df3c4a80bf1c" - integrity sha512-WwA1MW0++RfXmCr12xeYOOC5baSC9mSb0ZqCquFzKhcoF4TvHu5MKOuXsncgZcpVFhB1pXd5hZmM0ryAoCp12A== +"@types/semver@^7.3.12", "@types/semver@^7.3.4": + version "7.3.13" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91" + integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== + +"@types/send@*": + version "0.17.1" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.1.tgz#ed4932b8a2a805f1fe362a70f4e62d0ac994e301" + integrity sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q== + dependencies: + "@types/mime" "^1" + "@types/node" "*" "@types/serve-index@^1.9.1": version "1.9.1" @@ -5082,18 +5057,10 @@ dependencies: "@types/express" "*" -"@types/serve-static@*": - version "1.13.10" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.10.tgz#f5e0ce8797d2d7cc5ebeda48a52c96c4fa47a8d9" - integrity sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ== - dependencies: - "@types/mime" "^1" - "@types/node" "*" - -"@types/serve-static@^1.13.10": - version "1.15.0" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.0.tgz#c7930ff61afb334e121a9da780aac0d9b8f34155" - integrity sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg== +"@types/serve-static@*", "@types/serve-static@^1.13.10": + version "1.15.1" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.1.tgz#86b1753f0be4f9a1bee68d459fcda5be4ea52b5d" + integrity sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ== dependencies: "@types/mime" "*" "@types/node" "*" @@ -5115,78 +5082,35 @@ dependencies: "@types/node" "*" -"@types/source-list-map@*": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" - integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA== - "@types/stack-utils@^2.0.0": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== -"@types/tapable@^1", "@types/tapable@^1.0.5": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.8.tgz#b94a4391c85666c7b73299fd3ad79d4faa435310" - integrity sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ== - -"@types/tough-cookie@*": +"@types/tough-cookie@*", "@types/tough-cookie@^4.0.2": version "4.0.2" resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.2.tgz#6286b4c7228d58ab7866d19716f3696e03a09397" integrity sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw== -"@types/uglify-js@*": - version "3.16.0" - resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.16.0.tgz#2cf74a0e6ebb6cd54c0d48e509d5bd91160a9602" - integrity sha512-0yeUr92L3r0GLRnBOvtYK1v2SjqMIqQDHMl7GLb+l2L8+6LSFWEEWEIgVsPdMn5ImLM8qzWT8xFPtQYpp8co0g== - dependencies: - source-map "^0.6.1" - -"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3": +"@types/unist@^2.0.0": version "2.0.6" resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== -"@types/validator@^13.1.3": - version "13.7.3" - resolved "https://registry.yarnpkg.com/@types/validator/-/validator-13.7.3.tgz#3193c0a3c03a7d1189016c62b4fba4b149ef5e33" - integrity sha512-DNviAE5OUcZ5s+XEQHRhERLg8fOp8gSgvyJ4aaFASx5wwaObm+PBwTIMXiOFm1QrSee5oYwEAYb7LMzX2O88gA== - -"@types/webappsec-credential-management@^0.6.2": - version "0.6.2" - resolved "https://registry.yarnpkg.com/@types/webappsec-credential-management/-/webappsec-credential-management-0.6.2.tgz#93491de1ffcf57f6558c78949cc8e6c5d826b94e" - integrity sha512-/6w8wmKQOFh+1CL99fcFhH7lli1/ExBdAawXsVPXFC5MBOS6ww/4cmK4crpCw51RaG6sTr477N17Y84l0G69IA== - -"@types/webpack-env@^1.16.0": - version "1.17.0" - resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.17.0.tgz#f99ce359f1bfd87da90cc4a57cab0a18f34a48d0" - integrity sha512-eHSaNYEyxRA5IAG0Ym/yCyf86niZUIF/TpWKofQI/CVfh5HsMEUyfE2kwFxha4ow0s5g0LfISQxpDKjbRDrizw== - -"@types/webpack-sources@*": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-3.2.0.tgz#16d759ba096c289034b26553d2df1bf45248d38b" - integrity sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg== - dependencies: - "@types/node" "*" - "@types/source-list-map" "*" - source-map "^0.7.3" +"@types/validator@^13.7.10": + version "13.7.16" + resolved "https://registry.yarnpkg.com/@types/validator/-/validator-13.7.16.tgz#096c7951189e93ec49fd5df5bfbf088f0d95ea85" + integrity sha512-VyKmLktUHYLbrSbsRi241MSUlGYomQgK/tfCNpej3Gt5qDOM10AZ3nU2aR2s5JritClXuOBu4K7MkywVW/Y6Ow== -"@types/webpack@^4.41.26", "@types/webpack@^4.41.8": - version "4.41.32" - resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.32.tgz#a7bab03b72904070162b2f169415492209e94212" - integrity sha512-cb+0ioil/7oz5//7tZUSwbrSAN/NWHrQylz5cW8G0dWTcF/g+/dSdMlKVZspBYuMAN1+WnwHrkxiRrLcwd0Heg== - dependencies: - "@types/node" "*" - "@types/tapable" "^1" - "@types/uglify-js" "*" - "@types/webpack-sources" "*" - anymatch "^3.0.0" - source-map "^0.6.0" +"@types/webpack-env@^1.18.0": + version "1.18.0" + resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.18.0.tgz#ed6ecaa8e5ed5dfe8b2b3d00181702c9925f13fb" + integrity sha512-56/MAlX5WMsPVbOg7tAxnYvNYMMWr/QJiIp6BxVSW3JJXUVzzOn64qW8TzQyMSqSUFM2+PVI4aUHcHOzIz/1tg== "@types/ws@^8.5.1": - version "8.5.3" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.3.tgz#7d25a1ffbecd3c4f2d35068d0b283c037003274d" - integrity sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w== + version "8.5.4" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.4.tgz#bb10e36116d6e570dd943735f86c933c1587b8a5" + integrity sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg== dependencies: "@types/node" "*" @@ -5195,192 +5119,201 @@ resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== -"@types/yargs@^15.0.0": - version "15.0.14" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.14.tgz#26d821ddb89e70492160b66d10a0eb6df8f6fb06" - integrity sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ== - dependencies: - "@types/yargs-parser" "*" - "@types/yargs@^17.0.8": - version "17.0.12" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.12.tgz#0745ff3e4872b4ace98616d4b7e37ccbd75f9526" - integrity sha512-Nz4MPhecOFArtm81gFQvQqdV7XYCrWKx5uUt6GNHredFHn1i2mtWqXTON7EPXMtNi1qjtjEM/VCHDhcHsAMLXQ== + version "17.0.24" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.24.tgz#b3ef8d50ad4aa6aecf6ddc97c580a00f5aa11902" + integrity sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw== dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.4.0.tgz#05e711a2e7b68342661fde61bccbd1531c19521a" - integrity sha512-9/yPSBlwzsetCsGEn9j24D8vGQgJkOTr4oMLas/w886ZtzKIs1iyoqFrwsX2fqYEeUwsdBpC21gcjRGo57u0eg== +"@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== dependencies: - "@typescript-eslint/experimental-utils" "5.4.0" - "@typescript-eslint/scope-manager" "5.4.0" - debug "^4.3.2" - functional-red-black-tree "^1.0.1" - ignore "^5.1.8" + "@typescript-eslint/scope-manager" "5.51.0" + "@typescript-eslint/type-utils" "5.51.0" + "@typescript-eslint/utils" "5.51.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.5" + semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/experimental-utils@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.4.0.tgz#238a7418d2da3b24874ba35385eb21cc61d2a65e" - integrity sha512-Nz2JDIQUdmIGd6p33A+naQmwfkU5KVTLb/5lTk+tLVTDacZKoGQisj8UCxk7onJcrgjIvr8xWqkYI+DbI3TfXg== +"@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== dependencies: - "@types/json-schema" "^7.0.9" - "@typescript-eslint/scope-manager" "5.4.0" - "@typescript-eslint/types" "5.4.0" - "@typescript-eslint/typescript-estree" "5.4.0" - eslint-scope "^5.1.1" - eslint-utils "^3.0.0" + "@typescript-eslint/scope-manager" "5.51.0" + "@typescript-eslint/types" "5.51.0" + "@typescript-eslint/typescript-estree" "5.51.0" + debug "^4.3.4" -"@typescript-eslint/parser@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.4.0.tgz#3aa83ce349d66e39b84151f6d5464928044ca9e3" - integrity sha512-JoB41EmxiYpaEsRwpZEYAJ9XQURPFer8hpkIW9GiaspVLX8oqbqNM8P4EP8HOZg96yaALiLEVWllA2E8vwsIKw== +"@typescript-eslint/scope-manager@5.48.1": + version "5.48.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.48.1.tgz#39c71e4de639f5fe08b988005beaaf6d79f9d64d" + integrity sha512-S035ueRrbxRMKvSTv9vJKIWgr86BD8s3RqoRZmsSh/s8HhIs90g6UlK8ZabUSjUZQkhVxt7nmZ63VJ9dcZhtDQ== dependencies: - "@typescript-eslint/scope-manager" "5.4.0" - "@typescript-eslint/types" "5.4.0" - "@typescript-eslint/typescript-estree" "5.4.0" - debug "^4.3.2" + "@typescript-eslint/types" "5.48.1" + "@typescript-eslint/visitor-keys" "5.48.1" -"@typescript-eslint/scope-manager@5.36.2": - version "5.36.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.36.2.tgz#a75eb588a3879ae659514780831370642505d1cd" - integrity sha512-cNNP51L8SkIFSfce8B1NSUBTJTu2Ts4nWeWbFrdaqjmn9yKrAaJUBHkyTZc0cL06OFHpb+JZq5AUHROS398Orw== +"@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.36.2" - "@typescript-eslint/visitor-keys" "5.36.2" + "@typescript-eslint/types" "5.51.0" + "@typescript-eslint/visitor-keys" "5.51.0" -"@typescript-eslint/scope-manager@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.4.0.tgz#aaab08415f4a9cf32b870c7750ae8ba4607126a1" - integrity sha512-pRxFjYwoi8R+n+sibjgF9iUiAELU9ihPBtHzocyW8v8D8G8KeQvXTsW7+CBYIyTYsmhtNk50QPGLE3vrvhM5KA== +"@typescript-eslint/scope-manager@5.59.2": + version "5.59.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.59.2.tgz#f699fe936ee4e2c996d14f0fdd3a7da5ba7b9a4c" + integrity sha512-dB1v7ROySwQWKqQ8rEWcdbTsFjh2G0vn8KUyvTXdPoyzSL6lLGkiXEV5CvpJsEe9xIdKV+8Zqb7wif2issoOFA== dependencies: - "@typescript-eslint/types" "5.4.0" - "@typescript-eslint/visitor-keys" "5.4.0" + "@typescript-eslint/types" "5.59.2" + "@typescript-eslint/visitor-keys" "5.59.2" -"@typescript-eslint/scope-manager@5.40.1": - version "5.40.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.40.1.tgz#a7a5197dfd234622a2421ea590ee0ccc02e18dfe" - integrity sha512-jkn4xsJiUQucI16OLCXrLRXDZ3afKhOIqXs4R3O+M00hdQLKR58WuyXPZZjhKLFCEP2g+TXdBRtLQ33UfAdRUg== +"@typescript-eslint/type-utils@5.48.1": + version "5.48.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.48.1.tgz#5d94ac0c269a81a91ad77c03407cea2caf481412" + integrity sha512-Hyr8HU8Alcuva1ppmqSYtM/Gp0q4JOp1F+/JH5D1IZm/bUBrV0edoewQZiEc1r6I8L4JL21broddxK8HAcZiqQ== dependencies: - "@typescript-eslint/types" "5.40.1" - "@typescript-eslint/visitor-keys" "5.40.1" + "@typescript-eslint/typescript-estree" "5.48.1" + "@typescript-eslint/utils" "5.48.1" + debug "^4.3.4" + tsutils "^3.21.0" -"@typescript-eslint/type-utils@5.36.2": - version "5.36.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.36.2.tgz#752373f4babf05e993adf2cd543a763632826391" - integrity sha512-rPQtS5rfijUWLouhy6UmyNquKDPhQjKsaKH0WnY6hl/07lasj8gPaH2UD8xWkePn6SC+jW2i9c2DZVDnL+Dokw== +"@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== dependencies: - "@typescript-eslint/typescript-estree" "5.36.2" - "@typescript-eslint/utils" "5.36.2" + "@typescript-eslint/typescript-estree" "5.51.0" + "@typescript-eslint/utils" "5.51.0" debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/types@5.36.2": - version "5.36.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.36.2.tgz#a5066e500ebcfcee36694186ccc57b955c05faf9" - integrity sha512-9OJSvvwuF1L5eS2EQgFUbECb99F0mwq501w0H0EkYULkhFa19Qq7WFbycdw1PexAc929asupbZcgjVIe6OK/XQ== +"@typescript-eslint/types@5.48.1": + version "5.48.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.48.1.tgz#efd1913a9aaf67caf8a6e6779fd53e14e8587e14" + integrity sha512-xHyDLU6MSuEEdIlzrrAerCGS3T7AA/L8Hggd0RCYBi0w3JMvGYxlLlXHeg50JI9Tfg5MrtsfuNxbS/3zF1/ATg== -"@typescript-eslint/types@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.4.0.tgz#b1c130f4b381b77bec19696c6e3366f9781ce8f2" - integrity sha512-GjXNpmn+n1LvnttarX+sPD6+S7giO+9LxDIGlRl4wK3a7qMWALOHYuVSZpPTfEIklYjaWuMtfKdeByx0AcaThA== +"@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.40.1": - version "5.40.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.40.1.tgz#de37f4f64de731ee454bb2085d71030aa832f749" - integrity sha512-Icg9kiuVJSwdzSQvtdGspOlWNjVDnF3qVIKXdJ103o36yRprdl3Ge5cABQx+csx960nuMF21v8qvO31v9t3OHw== +"@typescript-eslint/types@5.59.2": + version "5.59.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.59.2.tgz#b511d2b9847fe277c5cb002a2318bd329ef4f655" + integrity sha512-LbJ/HqoVs2XTGq5shkiKaNTuVv5tTejdHgfdjqRUGdYhjW1crm/M7og2jhVskMt8/4wS3T1+PfFvL1K3wqYj4w== -"@typescript-eslint/typescript-estree@5.36.2": - version "5.36.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.36.2.tgz#0c93418b36c53ba0bc34c61fe9405c4d1d8fe560" - integrity sha512-8fyH+RfbKc0mTspfuEjlfqA4YywcwQK2Amcf6TDOwaRLg7Vwdu4bZzyvBZp4bjt1RRjQ5MDnOZahxMrt2l5v9w== +"@typescript-eslint/typescript-estree@5.48.1": + version "5.48.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.48.1.tgz#9efa8ee2aa471c6ab62e649f6e64d8d121bc2056" + integrity sha512-Hut+Osk5FYr+sgFh8J/FHjqX6HFcDzTlWLrFqGoK5kVUN3VBHF/QzZmAsIXCQ8T/W9nQNBTqalxi1P3LSqWnRA== dependencies: - "@typescript-eslint/types" "5.36.2" - "@typescript-eslint/visitor-keys" "5.36.2" + "@typescript-eslint/types" "5.48.1" + "@typescript-eslint/visitor-keys" "5.48.1" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/typescript-estree@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.4.0.tgz#fe524fb308973c68ebeb7428f3b64499a6ba5fc0" - integrity sha512-nhlNoBdhKuwiLMx6GrybPT3SFILm5Gij2YBdPEPFlYNFAXUJWX6QRgvi/lwVoadaQEFsizohs6aFRMqsXI2ewA== +"@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.4.0" - "@typescript-eslint/visitor-keys" "5.4.0" - debug "^4.3.2" - globby "^11.0.4" + "@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.5" + semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/typescript-estree@5.40.1": - version "5.40.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.40.1.tgz#9a7d25492f02c69882ce5e0cd1857b0c55645d72" - integrity sha512-5QTP/nW5+60jBcEPfXy/EZL01qrl9GZtbgDZtDPlfW5zj/zjNrdI2B5zMUHmOsfvOr2cWqwVdWjobCiHcedmQA== +"@typescript-eslint/typescript-estree@5.59.2": + version "5.59.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.2.tgz#6e2fabd3ba01db5d69df44e0b654c0b051fe9936" + integrity sha512-+j4SmbwVmZsQ9jEyBMgpuBD0rKwi9RxRpjX71Brr73RsYnEr3Lt5QZ624Bxphp8HUkSKfqGnPJp1kA5nl0Sh7Q== dependencies: - "@typescript-eslint/types" "5.40.1" - "@typescript-eslint/visitor-keys" "5.40.1" + "@typescript-eslint/types" "5.59.2" + "@typescript-eslint/visitor-keys" "5.59.2" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@5.36.2": - version "5.36.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.36.2.tgz#b01a76f0ab244404c7aefc340c5015d5ce6da74c" - integrity sha512-uNcopWonEITX96v9pefk9DC1bWMdkweeSsewJ6GeC7L6j2t0SJywisgkr9wUTtXk90fi2Eljj90HSHm3OGdGRg== +"@typescript-eslint/utils@5.48.1": + version "5.48.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.48.1.tgz#20f2f4e88e9e2a0961cbebcb47a1f0f7da7ba7f9" + integrity sha512-SmQuSrCGUOdmGMwivW14Z0Lj8dxG1mOFZ7soeJ0TQZEJcs3n5Ndgkg0A4bcMFzBELqLJ6GTHnEU+iIoaD6hFGA== dependencies: "@types/json-schema" "^7.0.9" - "@typescript-eslint/scope-manager" "5.36.2" - "@typescript-eslint/types" "5.36.2" - "@typescript-eslint/typescript-estree" "5.36.2" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.48.1" + "@typescript-eslint/types" "5.48.1" + "@typescript-eslint/typescript-estree" "5.48.1" eslint-scope "^5.1.1" eslint-utils "^3.0.0" + semver "^7.3.7" -"@typescript-eslint/utils@^5.36.1": - version "5.40.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.40.1.tgz#3204fb73a559d3b7bab7dc9d3c44487c2734a9ca" - integrity sha512-a2TAVScoX9fjryNrW6BZRnreDUszxqm9eQ9Esv8n5nXApMW0zeANUYlwh/DED04SC/ifuBvXgZpIK5xeJHQ3aw== +"@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.40.1" - "@typescript-eslint/types" "5.40.1" - "@typescript-eslint/typescript-estree" "5.40.1" + "@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/visitor-keys@5.36.2": - version "5.36.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.36.2.tgz#2f8f78da0a3bad3320d2ac24965791ac39dace5a" - integrity sha512-BtRvSR6dEdrNt7Net2/XDjbYKU5Ml6GqJgVfXT0CxTCJlnIqK7rAGreuWKMT2t8cFUT2Msv5oxw0GMRD7T5J7A== +"@typescript-eslint/utils@^5.45.0", "@typescript-eslint/utils@^5.58.0": + version "5.59.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.59.2.tgz#0c45178124d10cc986115885688db6abc37939f4" + integrity sha512-kSuF6/77TZzyGPhGO4uVp+f0SBoYxCDf+lW3GKhtKru/L8k/Hd7NFQxyWUeY7Z/KGB2C6Fe3yf2vVi4V9TsCSQ== dependencies: - "@typescript-eslint/types" "5.36.2" + "@eslint-community/eslint-utils" "^4.2.0" + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.59.2" + "@typescript-eslint/types" "5.59.2" + "@typescript-eslint/typescript-estree" "5.59.2" + eslint-scope "^5.1.1" + semver "^7.3.7" + +"@typescript-eslint/visitor-keys@5.48.1": + version "5.48.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.48.1.tgz#79fd4fb9996023ef86849bf6f904f33eb6c8fccb" + integrity sha512-Ns0XBwmfuX7ZknznfXozgnydyR8F6ev/KEGePP4i74uL3ArsKbEhJ7raeKr1JSa997DBDwol/4a0Y+At82c9dA== + dependencies: + "@typescript-eslint/types" "5.48.1" eslint-visitor-keys "^3.3.0" -"@typescript-eslint/visitor-keys@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.4.0.tgz#09bc28efd3621f292fe88c86eef3bf4893364c8c" - integrity sha512-PVbax7MeE7tdLfW5SA0fs8NGVVr+buMPrcj+CWYWPXsZCH8qZ1THufDzbXm1xrZ2b2PA1iENJ0sRq5fuUtvsJg== +"@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.4.0" - eslint-visitor-keys "^3.0.0" + "@typescript-eslint/types" "5.51.0" + eslint-visitor-keys "^3.3.0" -"@typescript-eslint/visitor-keys@5.40.1": - version "5.40.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.40.1.tgz#f3d2bf5af192f4432b84cec6fdcb387193518754" - integrity sha512-A2DGmeZ+FMja0geX5rww+DpvILpwo1OsiQs0M+joPWJYsiEFBLsH0y1oFymPNul6Z5okSmHpP4ivkc2N0Cgfkw== +"@typescript-eslint/visitor-keys@5.59.2": + version "5.59.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.2.tgz#37a419dc2723a3eacbf722512b86d6caf7d3b750" + integrity sha512-EEpsO8m3RASrKAHI9jpavNv9NlEUebV4qmF1OWxSTtKSFBpC1NCmWazDQHFivRf0O1DV11BA645yrLEVQ0/Lig== dependencies: - "@typescript-eslint/types" "5.40.1" + "@typescript-eslint/types" "5.59.2" eslint-visitor-keys "^3.3.0" "@webassemblyjs/ast@1.11.1": @@ -5391,63 +5324,43 @@ "@webassemblyjs/helper-numbers" "1.11.1" "@webassemblyjs/helper-wasm-bytecode" "1.11.1" -"@webassemblyjs/ast@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" - integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA== +"@webassemblyjs/ast@1.11.5", "@webassemblyjs/ast@^1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.5.tgz#6e818036b94548c1fb53b754b5cae3c9b208281c" + integrity sha512-LHY/GSAZZRpsNQH+/oHqhRQ5FT7eoULcBqgfyTB5nQHogFnK3/7QoN7dLnwSE/JkUAF0SrRuclT7ODqMFtWxxQ== dependencies: - "@webassemblyjs/helper-module-context" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/wast-parser" "1.9.0" + "@webassemblyjs/helper-numbers" "1.11.5" + "@webassemblyjs/helper-wasm-bytecode" "1.11.5" "@webassemblyjs/floating-point-hex-parser@1.11.1": version "1.11.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== -"@webassemblyjs/floating-point-hex-parser@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" - integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== +"@webassemblyjs/floating-point-hex-parser@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.5.tgz#e85dfdb01cad16b812ff166b96806c050555f1b4" + integrity sha512-1j1zTIC5EZOtCplMBG/IEwLtUojtwFVwdyVMbL/hwWqbzlQoJsWCOavrdnLkemwNoC/EOwtUFch3fuo+cbcXYQ== "@webassemblyjs/helper-api-error@1.11.1": version "1.11.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== -"@webassemblyjs/helper-api-error@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" - integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== +"@webassemblyjs/helper-api-error@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.5.tgz#1e82fa7958c681ddcf4eabef756ce09d49d442d1" + integrity sha512-L65bDPmfpY0+yFrsgz8b6LhXmbbs38OnwDCf6NpnMUYqa+ENfE5Dq9E42ny0qz/PdR0LJyq/T5YijPnU8AXEpA== "@webassemblyjs/helper-buffer@1.11.1": version "1.11.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== -"@webassemblyjs/helper-buffer@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" - integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA== - -"@webassemblyjs/helper-code-frame@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27" - integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA== - dependencies: - "@webassemblyjs/wast-printer" "1.9.0" - -"@webassemblyjs/helper-fsm@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8" - integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw== - -"@webassemblyjs/helper-module-context@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07" - integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g== - dependencies: - "@webassemblyjs/ast" "1.9.0" +"@webassemblyjs/helper-buffer@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.5.tgz#91381652ea95bb38bbfd270702351c0c89d69fba" + integrity sha512-fDKo1gstwFFSfacIeH5KfwzjykIE6ldh1iH9Y/8YkAZrhmu4TctqYjSh7t0K2VyDSXOZJ1MLhht/k9IvYGcIxg== "@webassemblyjs/helper-numbers@1.11.1": version "1.11.1" @@ -5458,15 +5371,24 @@ "@webassemblyjs/helper-api-error" "1.11.1" "@xtuc/long" "4.2.2" +"@webassemblyjs/helper-numbers@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.5.tgz#23380c910d56764957292839006fecbe05e135a9" + integrity sha512-DhykHXM0ZABqfIGYNv93A5KKDw/+ywBFnuWybZZWcuzWHfbp21wUfRkbtz7dMGwGgT4iXjWuhRMA2Mzod6W4WA== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.5" + "@webassemblyjs/helper-api-error" "1.11.5" + "@xtuc/long" "4.2.2" + "@webassemblyjs/helper-wasm-bytecode@1.11.1": version "1.11.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== -"@webassemblyjs/helper-wasm-bytecode@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" - integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== +"@webassemblyjs/helper-wasm-bytecode@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.5.tgz#e258a25251bc69a52ef817da3001863cc1c24b9f" + integrity sha512-oC4Qa0bNcqnjAowFn7MPCETQgDYytpsfvz4ujZz63Zu/a/v71HeCAAmZsgZ3YVKec3zSPYytG3/PrRCqbtcAvA== "@webassemblyjs/helper-wasm-section@1.11.1": version "1.11.1" @@ -5478,15 +5400,15 @@ "@webassemblyjs/helper-wasm-bytecode" "1.11.1" "@webassemblyjs/wasm-gen" "1.11.1" -"@webassemblyjs/helper-wasm-section@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" - integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw== +"@webassemblyjs/helper-wasm-section@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.5.tgz#966e855a6fae04d5570ad4ec87fbcf29b42ba78e" + integrity sha512-uEoThA1LN2NA+K3B9wDo3yKlBfVtC6rh0i4/6hvbz071E8gTNZD/pT0MsBf7MeD6KbApMSkaAK0XeKyOZC7CIA== dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-buffer" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/ast" "1.11.5" + "@webassemblyjs/helper-buffer" "1.11.5" + "@webassemblyjs/helper-wasm-bytecode" "1.11.5" + "@webassemblyjs/wasm-gen" "1.11.5" "@webassemblyjs/ieee754@1.11.1": version "1.11.1" @@ -5495,10 +5417,10 @@ dependencies: "@xtuc/ieee754" "^1.2.0" -"@webassemblyjs/ieee754@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" - integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg== +"@webassemblyjs/ieee754@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.5.tgz#b2db1b33ce9c91e34236194c2b5cba9b25ca9d60" + integrity sha512-37aGq6qVL8A8oPbPrSGMBcp38YZFXcHfiROflJn9jxSdSMMM5dS5P/9e2/TpaJuhE+wFrbukN2WI6Hw9MH5acg== dependencies: "@xtuc/ieee754" "^1.2.0" @@ -5509,10 +5431,10 @@ dependencies: "@xtuc/long" "4.2.2" -"@webassemblyjs/leb128@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" - integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw== +"@webassemblyjs/leb128@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.5.tgz#482e44d26b6b949edf042a8525a66c649e38935a" + integrity sha512-ajqrRSXaTJoPW+xmkfYN6l8VIeNnR4vBOTQO9HzR7IygoCcKWkICbKFbVTNMjMgMREqXEr0+2M6zukzM47ZUfQ== dependencies: "@xtuc/long" "4.2.2" @@ -5521,10 +5443,10 @@ resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== -"@webassemblyjs/utf8@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" - integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== +"@webassemblyjs/utf8@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.5.tgz#83bef94856e399f3740e8df9f63bc47a987eae1a" + integrity sha512-WiOhulHKTZU5UPlRl53gHR8OxdGsSOxqfpqWeA2FmcwBMaoEdz6b2x2si3IwC9/fSPLfe8pBMRTHVMk5nlwnFQ== "@webassemblyjs/wasm-edit@1.11.1": version "1.11.1" @@ -5540,19 +5462,19 @@ "@webassemblyjs/wasm-parser" "1.11.1" "@webassemblyjs/wast-printer" "1.11.1" -"@webassemblyjs/wasm-edit@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" - integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-buffer" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/helper-wasm-section" "1.9.0" - "@webassemblyjs/wasm-gen" "1.9.0" - "@webassemblyjs/wasm-opt" "1.9.0" - "@webassemblyjs/wasm-parser" "1.9.0" - "@webassemblyjs/wast-printer" "1.9.0" +"@webassemblyjs/wasm-edit@^1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.5.tgz#93ee10a08037657e21c70de31c47fdad6b522b2d" + integrity sha512-C0p9D2fAu3Twwqvygvf42iGCQ4av8MFBLiTb+08SZ4cEdwzWx9QeAHDo1E2k+9s/0w1DM40oflJOpkZ8jW4HCQ== + dependencies: + "@webassemblyjs/ast" "1.11.5" + "@webassemblyjs/helper-buffer" "1.11.5" + "@webassemblyjs/helper-wasm-bytecode" "1.11.5" + "@webassemblyjs/helper-wasm-section" "1.11.5" + "@webassemblyjs/wasm-gen" "1.11.5" + "@webassemblyjs/wasm-opt" "1.11.5" + "@webassemblyjs/wasm-parser" "1.11.5" + "@webassemblyjs/wast-printer" "1.11.5" "@webassemblyjs/wasm-gen@1.11.1": version "1.11.1" @@ -5565,16 +5487,16 @@ "@webassemblyjs/leb128" "1.11.1" "@webassemblyjs/utf8" "1.11.1" -"@webassemblyjs/wasm-gen@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" - integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA== +"@webassemblyjs/wasm-gen@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.5.tgz#ceb1c82b40bf0cf67a492c53381916756ef7f0b1" + integrity sha512-14vteRlRjxLK9eSyYFvw1K8Vv+iPdZU0Aebk3j6oB8TQiQYuO6hj9s4d7qf6f2HJr2khzvNldAFG13CgdkAIfA== dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/ieee754" "1.9.0" - "@webassemblyjs/leb128" "1.9.0" - "@webassemblyjs/utf8" "1.9.0" + "@webassemblyjs/ast" "1.11.5" + "@webassemblyjs/helper-wasm-bytecode" "1.11.5" + "@webassemblyjs/ieee754" "1.11.5" + "@webassemblyjs/leb128" "1.11.5" + "@webassemblyjs/utf8" "1.11.5" "@webassemblyjs/wasm-opt@1.11.1": version "1.11.1" @@ -5586,15 +5508,15 @@ "@webassemblyjs/wasm-gen" "1.11.1" "@webassemblyjs/wasm-parser" "1.11.1" -"@webassemblyjs/wasm-opt@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" - integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A== +"@webassemblyjs/wasm-opt@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.5.tgz#b52bac29681fa62487e16d3bb7f0633d5e62ca0a" + integrity sha512-tcKwlIXstBQgbKy1MlbDMlXaxpucn42eb17H29rawYLxm5+MsEmgPzeCP8B1Cl69hCice8LeKgZpRUAPtqYPgw== dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-buffer" "1.9.0" - "@webassemblyjs/wasm-gen" "1.9.0" - "@webassemblyjs/wasm-parser" "1.9.0" + "@webassemblyjs/ast" "1.11.5" + "@webassemblyjs/helper-buffer" "1.11.5" + "@webassemblyjs/wasm-gen" "1.11.5" + "@webassemblyjs/wasm-parser" "1.11.5" "@webassemblyjs/wasm-parser@1.11.1": version "1.11.1" @@ -5608,29 +5530,17 @@ "@webassemblyjs/leb128" "1.11.1" "@webassemblyjs/utf8" "1.11.1" -"@webassemblyjs/wasm-parser@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" - integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA== +"@webassemblyjs/wasm-parser@1.11.5", "@webassemblyjs/wasm-parser@^1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.5.tgz#7ba0697ca74c860ea13e3ba226b29617046982e2" + integrity sha512-SVXUIwsLQlc8srSD7jejsfTU83g7pIGr2YYNb9oHdtldSxaOhvA5xwvIiWIfcX8PlSakgqMXsLpLfbbJ4cBYew== dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-api-error" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/ieee754" "1.9.0" - "@webassemblyjs/leb128" "1.9.0" - "@webassemblyjs/utf8" "1.9.0" - -"@webassemblyjs/wast-parser@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914" - integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/floating-point-hex-parser" "1.9.0" - "@webassemblyjs/helper-api-error" "1.9.0" - "@webassemblyjs/helper-code-frame" "1.9.0" - "@webassemblyjs/helper-fsm" "1.9.0" - "@xtuc/long" "4.2.2" + "@webassemblyjs/ast" "1.11.5" + "@webassemblyjs/helper-api-error" "1.11.5" + "@webassemblyjs/helper-wasm-bytecode" "1.11.5" + "@webassemblyjs/ieee754" "1.11.5" + "@webassemblyjs/leb128" "1.11.5" + "@webassemblyjs/utf8" "1.11.5" "@webassemblyjs/wast-printer@1.11.1": version "1.11.1" @@ -5640,13 +5550,12 @@ "@webassemblyjs/ast" "1.11.1" "@xtuc/long" "4.2.2" -"@webassemblyjs/wast-printer@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" - integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA== +"@webassemblyjs/wast-printer@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.5.tgz#7a5e9689043f3eca82d544d7be7a8e6373a6fa98" + integrity sha512-f7Pq3wvg3GSPUPzR0F6bmI89Hdb+u9WXrSKc4v+N0aV0q6r42WoF92Jp2jEorBEBRoRNXgjp53nBniDXcqZYPA== dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/wast-parser" "1.9.0" + "@webassemblyjs/ast" "1.11.5" "@xtuc/long" "4.2.2" "@xtuc/ieee754@^1.2.0": @@ -5659,15 +5568,22 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== +"@yarnpkg/esbuild-plugin-pnp@^3.0.0-rc.10": + version "3.0.0-rc.15" + resolved "https://registry.yarnpkg.com/@yarnpkg/esbuild-plugin-pnp/-/esbuild-plugin-pnp-3.0.0-rc.15.tgz#4e40e7d2eb28825c9a35ab9d04c363931d7c0e67" + integrity sha512-kYzDJO5CA9sy+on/s2aIW0411AklfCi8Ck/4QDivOqsMKpStZA2SsR+X27VTggGwpStWaLrjJcDcdDMowtG8MA== + dependencies: + tslib "^2.4.0" + "@yarnpkg/lockfile@1.1.0", "@yarnpkg/lockfile@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== "@yarnpkg/parsers@^3.0.0-rc.18": - version "3.0.0-rc.25" - resolved "https://registry.yarnpkg.com/@yarnpkg/parsers/-/parsers-3.0.0-rc.25.tgz#aec9794739fd6923ce4ae628f4d52734c817f871" - integrity sha512-uotaIJwVQeV/DcGA9G2EVuVFHnEEdxDy3yRLeh9VHS6Lx7nZETaWzJPU1bgAwnAa3gplol2NIQhlsr2eqgq9qA== + version "3.0.0-rc.43" + resolved "https://registry.yarnpkg.com/@yarnpkg/parsers/-/parsers-3.0.0-rc.43.tgz#2bf720ec6444e3f002f40dce734c262e9f3d888a" + integrity sha512-AhFF3mIDfA+jEwQv2WMHmiYhOvmdbh2qhUkDVQfiqzQtUwS4BgoWwom5NpSPg4Ix5vOul+w1690Bt21CkVLpgg== dependencies: js-yaml "^3.10.0" tslib "^2.4.0" @@ -5684,7 +5600,7 @@ abab@^2.0.5, abab@^2.0.6: resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== -abbrev@1: +abbrev@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== @@ -5704,13 +5620,13 @@ accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: mime-types "~2.1.34" negotiator "0.6.3" -acorn-globals@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" - integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== +acorn-globals@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-7.0.1.tgz#0dbf05c44fa7c94332914c02066d5beff62c40c3" + integrity sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q== dependencies: - acorn "^7.1.1" - acorn-walk "^7.1.1" + acorn "^8.1.0" + acorn-walk "^8.0.2" acorn-import-assertions@^1.7.6: version "1.8.0" @@ -5722,35 +5638,25 @@ acorn-jsx@^5.0.0, acorn-jsx@^5.3.2: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn-walk@^7.1.1: - version "7.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" - integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== - -acorn-walk@^8.1.1: +acorn-walk@^8.0.2, acorn-walk@^8.1.1: version "8.2.0" 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, acorn@^6.4.1: +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@^7.1.1: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - -acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1: - version "8.7.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" - integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== +acorn@^8.1.0, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0, acorn@^8.8.1: + version "8.8.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== address@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/address/-/address-1.2.0.tgz#d352a62c92fee90f89a693eccd2a8b2139ab02d9" - integrity sha512-tNEZYz5G/zYunxFm7sfhAxkXEuLj3K6BKwv6ZURlsF6yiUQ65z0Q2wZW9L5cPUl9ocofGvXOdFYbFHp0+6MOig== + version "1.2.2" + resolved "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" + integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== adjust-sourcemap-loader@^4.0.0: version "4.0.0" @@ -5760,6 +5666,11 @@ adjust-sourcemap-loader@^4.0.0: loader-utils "^2.0.0" regex-parser "^2.2.11" +agent-base@5: + version "5.1.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-5.1.1.tgz#e8fb3f242959db44d63be665db7a8e739537a32c" + integrity sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g== + agent-base@6, agent-base@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" @@ -5768,12 +5679,12 @@ agent-base@6, agent-base@^6.0.2: debug "4" agentkeepalive@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.2.1.tgz#a7975cbb9f83b367f06c90cc51ff28fe7d499717" - integrity sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA== + version "4.3.0" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.3.0.tgz#bb999ff07412653c1803b3ced35e50729830a255" + integrity sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg== dependencies: debug "^4.1.0" - depd "^1.1.2" + depd "^2.0.0" humanize-ms "^1.2.1" aggregate-error@^3.0.0: @@ -5784,34 +5695,6 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" -airbnb-js-shims@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/airbnb-js-shims/-/airbnb-js-shims-2.2.1.tgz#db481102d682b98ed1daa4c5baa697a05ce5c040" - integrity sha512-wJNXPH66U2xjgo1Zwyjf9EydvJ2Si94+vSdk6EERcBfB2VZkeltpqIats0cqIZMLCXP3zcyaUKGYQeIBT6XjsQ== - dependencies: - array-includes "^3.0.3" - array.prototype.flat "^1.2.1" - array.prototype.flatmap "^1.2.1" - es5-shim "^4.5.13" - es6-shim "^0.35.5" - function.prototype.name "^1.1.0" - globalthis "^1.0.0" - object.entries "^1.1.0" - object.fromentries "^2.0.0 || ^1.0.0" - object.getownpropertydescriptors "^2.0.3" - object.values "^1.1.0" - promise.allsettled "^1.0.0" - promise.prototype.finally "^3.1.0" - string.prototype.matchall "^4.0.0 || ^3.0.1" - string.prototype.padend "^3.0.0" - string.prototype.padstart "^3.0.0" - symbol.prototype.description "^1.0.0" - -ajv-errors@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" - integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== - ajv-formats@2.1.1, ajv-formats@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" @@ -5819,12 +5702,12 @@ ajv-formats@2.1.1, ajv-formats@^2.1.1: dependencies: ajv "^8.0.0" -ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: +ajv-keywords@^3.5.2: version "3.5.2" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv-keywords@^5.0.0: +ajv-keywords@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== @@ -5841,27 +5724,17 @@ ajv@8.10.0: require-from-string "^2.0.2" uri-js "^4.2.2" -ajv@8.11.0, ajv@^8.0.0, ajv@^8.8.0: - version "8.11.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" - integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -ajv@8.8.2: - version "8.8.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.8.2.tgz#01b4fef2007a28bf75f0b7fc009f62679de4abbb" - integrity sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw== +ajv@8.12.0, ajv@^8.0.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== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" require-from-string "^2.0.2" uri-js "^4.2.2" -ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1: +ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -5878,14 +5751,6 @@ alphavantage@2.2.0: dependencies: cross-fetch "^3.0.5" -angular-material-css-vars@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/angular-material-css-vars/-/angular-material-css-vars-3.0.0.tgz#1b4e4aa3520adbfee9b874b2250d9557ab04b7f6" - integrity sha512-NkrLQlMUqBf7SoJr0VY2YXwY6oWAOssB9CykWIxdJyqMENY4ZqVEhSjCzROAJgxafvanAn4n2h7byFLvq4iMTw== - dependencies: - "@ctrl/tinycolor" "^3.4.0" - tslib "^2.3.0" - ansi-align@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" @@ -5898,11 +5763,6 @@ 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-colors@^3.0.0: - version "3.2.4" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" - integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== - ansi-escapes@^3.0.0, ansi-escapes@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" @@ -5940,6 +5800,11 @@ ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" @@ -5964,30 +5829,20 @@ ansi-styles@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== -ansi-to-html@^0.6.11: - version "0.6.15" - resolved "https://registry.yarnpkg.com/ansi-to-html/-/ansi-to-html-0.6.15.tgz#ac6ad4798a00f6aa045535d7f6a9cb9294eebea7" - integrity sha512-28ijx2aHJGdzbs+O5SNQF65r6rrKYnkuwTYm8lZlChuoJ9P1vVzIpWO20sQTqTPDXYp6NFwk326vApTtLVFXpQ== - dependencies: - entities "^2.0.0" +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== any-observable@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b" integrity sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog== -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - -anymatch@^3.0.0, anymatch@^3.0.3, anymatch@~3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== +anymatch@^3.0.3, anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" @@ -5998,9 +5853,9 @@ app-root-dir@^1.0.2: integrity sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g== app-root-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-3.0.0.tgz#210b6f43873227e18a4b810a032283311555d5ad" - integrity sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw== + version "3.1.0" + resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-3.1.0.tgz#5971a2fc12ba170369a7a1ef018c71e6e47c2e86" + integrity sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA== append-field@^1.0.0: version "1.0.0" @@ -6012,11 +5867,6 @@ append-field@^1.0.0: resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== -aproba@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== - arch@^2.1.2: version "2.2.0" resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" @@ -6031,9 +5881,9 @@ are-we-there-yet@^2.0.0: readable-stream "^3.6.0" are-we-there-yet@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz#ba20bd6b553e31d62fc8c31bd23d22b95734390d" - integrity sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw== + version "3.0.1" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz#679df222b278c64f2cdba1175cdc00b0d96164bd" + integrity sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg== dependencies: delegates "^1.0.0" readable-stream "^3.6.0" @@ -6055,10 +5905,12 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -aria-query@5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.0.2.tgz#0b8a744295271861e1d933f8feca13f9b70cfdc1" - integrity sha512-eigU3vhqSO+Z8BKDnVLN/ompjhf3pYzecKXz8+whRy+9gZu8n1TCGfwzQUUPnqdHl9ax1Hr9031orZ+UOEYr7Q== +aria-query@5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" + integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== + dependencies: + deep-equal "^2.0.5" aria-query@^3.0.0: version "3.0.0" @@ -6083,10 +5935,13 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== -array-find-index@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - integrity sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw== +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" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" array-flatten@1.1.1: version "1.1.1" @@ -6098,15 +5953,15 @@ 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.0.3, array-includes@^3.1.4: - version "3.1.5" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.5.tgz#2c320010db8d31031fd2a5f6b3bbd4b1aad31bdb" - integrity sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ== +array-includes@^3.1.6: + version "3.1.6" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" + integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== dependencies: call-bind "^1.0.2" define-properties "^1.1.4" - es-abstract "^1.19.5" - get-intrinsic "^1.1.1" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" is-string "^1.0.7" array-union@^1.0.2: @@ -6136,54 +5991,32 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== -array.prototype.flat@^1.2.1, array.prototype.flat@^1.2.5: - version "1.3.0" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz#0b0c1567bf57b38b56b4c97b8aa72ab45e4adc7b" - integrity sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw== +array.prototype.flat@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" + integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" es-shim-unscopables "^1.0.0" -array.prototype.flatmap@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz#a7e8ed4225f4788a70cd910abcf0791e76a5534f" - integrity sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg== +array.prototype.flatmap@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" + integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" es-shim-unscopables "^1.0.0" -array.prototype.map@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/array.prototype.map/-/array.prototype.map-1.0.4.tgz#0d97b640cfdd036c1b41cfe706a5e699aa0711f2" - integrity sha512-Qds9QnX7A0qISY7JT5WuJO0NJPE9CMlC6JzHQfhpqAAQQzufVRoeH7EzUY5GcPTx72voG8LV/5eo+b8Qi8hmhA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - es-array-method-boxes-properly "^1.0.0" - is-string "^1.0.7" - -array.prototype.reduce@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.4.tgz#8167e80089f78bff70a99e20bd4201d4663b0a6f" - integrity sha512-WnM+AjG/DvLRLo4DDl+r+SvCzYtD2Jd9oeBYMcEaI7t3fFrHY9M53/wdLcTvmZNQ70IU6Htj0emFkZ5TS+lrdw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.2" - es-array-method-boxes-properly "^1.0.0" - is-string "^1.0.7" - -arrify@^2.0.0, arrify@^2.0.1: +arrify@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== -asn1.js@^5.2.0, asn1.js@^5.3.0: +asn1.js@^5.3.0: version "5.4.1" resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== @@ -6200,7 +6033,7 @@ asn1@^0.2.4, asn1@~0.2.3: dependencies: safer-buffer "~2.1.0" -asn1js@^3.0.4: +asn1js@^3.0.5: version "3.0.5" resolved "https://registry.yarnpkg.com/asn1js/-/asn1js-3.0.5.tgz#5ea36820443dbefb51cc7f88a2ebb5b462114f38" integrity sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ== @@ -6214,13 +6047,15 @@ assert-plus@1.0.0, assert-plus@^1.0.0: resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== -assert@^1.1.1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" - integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== +assert@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-2.0.0.tgz#95fc1c616d48713510680f2eaf2d10dd22e02d32" + integrity sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A== dependencies: - object-assign "^4.1.1" - util "0.10.3" + es6-object-assign "^1.1.0" + is-nan "^1.2.1" + object-is "^1.0.1" + util "^0.12.0" assign-symbols@^1.0.0: version "1.0.0" @@ -6232,22 +6067,36 @@ ast-types-flow@0.0.7: resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== +ast-types@0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.15.2.tgz#39ae4809393c4b16df751ee563411423e85fb49d" + integrity sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg== + dependencies: + tslib "^2.0.1" + +ast-types@^0.16.1: + version "0.16.1" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.16.1.tgz#7a9da1617c9081bc121faafe91711b4c8bb81da2" + integrity sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg== + 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@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" - integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== async@3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720" integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw== -async@^2.6.2: +async@^2.6.4: version "2.6.4" resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== @@ -6274,42 +6123,34 @@ atob@^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.8: - version "10.4.8" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.8.tgz#92c7a0199e1cfb2ad5d9427bd585a3d75895b9e5" - integrity sha512-75Jr6Q/XpTqEf6D2ltS5uMewJIx5irCU1oBYJrWjFenq/m12WRRrz6g15L1EIoYvPLXTbEry7rDOwrcYNj77xw== +autoprefixer@10.4.13: + version "10.4.13" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.13.tgz#b5136b59930209a321e9fa3dca2e7c4d223e83a8" + integrity sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg== dependencies: - browserslist "^4.21.3" - caniuse-lite "^1.0.30001373" + browserslist "^4.21.4" + caniuse-lite "^1.0.30001426" fraction.js "^4.2.0" normalize-range "^0.1.2" picocolors "^1.0.0" postcss-value-parser "^4.2.0" autoprefixer@^10.4.9: - version "10.4.12" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.12.tgz#183f30bf0b0722af54ee5ef257f7d4320bb33129" - integrity sha512-WrCGV9/b97Pa+jtwf5UGaRjgQIg7OK3D06GnoYoZNcG1Xb8Gt3EfuKjlhh9i/VtT16g6PYjZ69jdJ2g8FxSC4Q== + version "10.4.14" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.14.tgz#e28d49902f8e759dd25b153264e862df2705f79d" + integrity sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ== dependencies: - browserslist "^4.21.4" - caniuse-lite "^1.0.30001407" + browserslist "^4.21.5" + caniuse-lite "^1.0.30001464" fraction.js "^4.2.0" normalize-range "^0.1.2" picocolors "^1.0.0" postcss-value-parser "^4.2.0" -autoprefixer@^9.8.6: - version "9.8.8" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.8.tgz#fd4bd4595385fa6f06599de749a4d5f7a474957a" - integrity sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA== - dependencies: - browserslist "^4.12.0" - caniuse-lite "^1.0.30001109" - normalize-range "^0.1.2" - num2fraction "^1.2.2" - picocolors "^0.2.1" - postcss "^7.0.32" - postcss-value-parser "^4.1.0" +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== aws-sign2@~0.7.0: version "0.7.0" @@ -6317,11 +6158,20 @@ aws-sign2@~0.7.0: integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== aws4@^1.8.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" - integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== + version "1.12.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" + integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== + +axios@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.1.3.tgz#8274250dada2edf53814ed7db644b9c2866c1e35" + integrity sha512-00tXVRwKx/FZr/IDVFt4C+f9FYairX517WoGCL6dpOntqLkZofjhu43F/Xl44UOpqa+9sLFDrG/XAnFsUYgkDA== + dependencies: + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" -axios@^0.21.2, 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== @@ -6329,9 +6179,9 @@ axios@^0.21.2, axios@^0.21.4: follow-redirects "^1.14.0" axios@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.1.3.tgz#8274250dada2edf53814ed7db644b9c2866c1e35" - integrity sha512-00tXVRwKx/FZr/IDVFt4C+f9FYairX517WoGCL6dpOntqLkZofjhu43F/Xl44UOpqa+9sLFDrG/XAnFsUYgkDA== + version "1.4.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.4.0.tgz#38a7bf1224cd308de271146038b551d725f0be1f" + integrity sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA== dependencies: follow-redirects "^1.15.0" form-data "^4.0.0" @@ -6344,57 +6194,49 @@ axobject-query@2.0.2: dependencies: ast-types-flow "0.0.7" -axobject-query@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.0.1.tgz#160e20533a7010db37726df68b7faf7db9653acd" - integrity sha512-vy5JPSOibF9yAeC2PoemRdA1MuSXX7vX5osdoxKf/6OUeppAWekZ3JIJVNWFMH6wgj7uHYyqZUSqE/b/3JLV1A== +axobject-query@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.1.1.tgz#3b6e5c6d4e43ca7ba51c5babf99d22a9c68485e1" + integrity sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg== + dependencies: + deep-equal "^2.0.5" -babel-jest@^28.1.1, babel-jest@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-28.1.3.tgz#c1187258197c099072156a0a121c11ee1e3917d5" - integrity sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q== +babel-core@^7.0.0-bridge.0: + version "7.0.0-bridge.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" + integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg== + +babel-jest@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.5.0.tgz#3fe3ddb109198e78b1c88f9ebdecd5e4fc2f50a5" + integrity sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q== dependencies: - "@jest/transform" "^28.1.3" + "@jest/transform" "^29.5.0" "@types/babel__core" "^7.1.14" babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^28.1.3" + babel-preset-jest "^29.5.0" chalk "^4.0.0" graceful-fs "^4.2.9" slash "^3.0.0" -babel-loader@8.2.5, babel-loader@^8.0.0, babel-loader@^8.0.2, babel-loader@^8.2.2: - version "8.2.5" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.5.tgz#d45f585e654d5a5d90f5350a779d7647c5ed512e" - integrity sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ== - dependencies: - find-cache-dir "^3.3.1" - loader-utils "^2.0.0" - make-dir "^3.1.0" - schema-utils "^2.6.5" - -babel-plugin-apply-mdx-type-prop@1.6.22: - version "1.6.22" - resolved "https://registry.yarnpkg.com/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz#d216e8fd0de91de3f1478ef3231e05446bc8705b" - integrity sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ== - dependencies: - "@babel/helper-plugin-utils" "7.10.4" - "@mdx-js/util" "1.6.22" - -babel-plugin-dynamic-import-node@^2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" - integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== +babel-loader@9.1.2, babel-loader@^9.0.0, babel-loader@^9.1.2: + version "9.1.2" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-9.1.2.tgz#a16a080de52d08854ee14570469905a5fc00d39c" + integrity sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA== dependencies: - object.assign "^4.1.0" + find-cache-dir "^3.3.2" + schema-utils "^4.0.0" -babel-plugin-extract-import-names@1.6.22: - version "1.6.22" - resolved "https://registry.yarnpkg.com/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz#de5f9a28eb12f3eb2578bf74472204e66d1a13dc" - integrity sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ== +babel-plugin-const-enum@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-const-enum/-/babel-plugin-const-enum-1.2.0.tgz#3d25524106f68f081e187829ba736b251c289861" + integrity sha512-o1m/6iyyFnp9MRsK1dHF3bneqyf3AlM2q3A/YbgQr2pCat6B6XJVDv2TXqzfY2RYUi4mak6WAksSBPlyYGx9dg== dependencies: - "@babel/helper-plugin-utils" "7.10.4" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-typescript" "^7.3.3" + "@babel/traverse" "^7.16.0" -babel-plugin-istanbul@6.1.1, babel-plugin-istanbul@^6.0.0, babel-plugin-istanbul@^6.1.1: +babel-plugin-istanbul@6.1.1, babel-plugin-istanbul@^6.1.1: version "6.1.1" resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== @@ -6405,85 +6247,60 @@ babel-plugin-istanbul@6.1.1, babel-plugin-istanbul@^6.0.0, babel-plugin-istanbul istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" -babel-plugin-jest-hoist@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.3.tgz#1952c4d0ea50f2d6d794353762278d1d8cca3fbe" - integrity sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q== +babel-plugin-jest-hoist@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz#a97db437936f441ec196990c9738d4b88538618a" + integrity sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w== dependencies: "@babel/template" "^7.3.3" "@babel/types" "^7.3.3" "@types/babel__core" "^7.1.14" "@types/babel__traverse" "^7.0.6" -babel-plugin-macros@^3.0.1: - version "3.1.0" - resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" - integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== +babel-plugin-macros@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz#0f958a7cc6556b1e65344465d99111a1e5e10138" + integrity sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg== dependencies: - "@babel/runtime" "^7.12.5" - cosmiconfig "^7.0.0" - resolve "^1.19.0" + "@babel/runtime" "^7.7.2" + cosmiconfig "^6.0.0" + resolve "^1.12.0" babel-plugin-named-exports-order@^0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/babel-plugin-named-exports-order/-/babel-plugin-named-exports-order-0.0.2.tgz#ae14909521cf9606094a2048239d69847540cb09" integrity sha512-OgOYHOLoRK+/mvXU9imKHlG6GkPLYrUCvFXG/CM93R/aNNO8pOOF4aS+S8CCHMDQoNSeiOYEZb/G6RwL95Jktw== -babel-plugin-polyfill-corejs2@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz#440f1b70ccfaabc6b676d196239b138f8a2cfba5" - integrity sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w== - dependencies: - "@babel/compat-data" "^7.13.11" - "@babel/helper-define-polyfill-provider" "^0.3.1" - semver "^6.1.1" - -babel-plugin-polyfill-corejs2@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.2.tgz#e4c31d4c89b56f3cf85b92558954c66b54bd972d" - integrity sha512-LPnodUl3lS0/4wN3Rb+m+UK8s7lj2jcLRrjho4gLw+OJs+I4bvGXshINesY5xx/apM+biTnQ9reDI8yj+0M5+Q== +babel-plugin-polyfill-corejs2@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz#5d1bd3836d0a19e1b84bbf2d9640ccb6f951c122" + integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== dependencies: "@babel/compat-data" "^7.17.7" - "@babel/helper-define-polyfill-provider" "^0.3.2" + "@babel/helper-define-polyfill-provider" "^0.3.3" semver "^6.1.1" -babel-plugin-polyfill-corejs3@^0.1.0: - version "0.1.7" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.7.tgz#80449d9d6f2274912e05d9e182b54816904befd0" - integrity sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.1.5" - core-js-compat "^3.8.1" - -babel-plugin-polyfill-corejs3@^0.5.0: - version "0.5.2" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz#aabe4b2fa04a6e038b688c5e55d44e78cd3a5f72" - integrity sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.1" - core-js-compat "^3.21.0" - -babel-plugin-polyfill-corejs3@^0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz#d7e09c9a899079d71a8b670c6181af56ec19c5c7" - integrity sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw== +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" + integrity sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA== dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.2" - core-js-compat "^3.21.0" + "@babel/helper-define-polyfill-provider" "^0.3.3" + core-js-compat "^3.25.1" -babel-plugin-polyfill-regenerator@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz#2c0678ea47c75c8cc2fbb1852278d8fb68233990" - integrity sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A== +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" + integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.1" + "@babel/helper-define-polyfill-provider" "^0.3.3" -babel-plugin-polyfill-regenerator@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.0.tgz#8f51809b6d5883e07e71548d75966ff7635527fe" - integrity sha512-RW1cnryiADFeHmfLS+WW/G431p1PsW5qdRdz0SDRi7TKcUgc7Oh/uXkT7MZ/+tGsT1BkczEAmD5XjUyJ5SWDTw== +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" + integrity sha512-mWEvCQTgXQf48yDqgN7CH50waTyYBeP2Lpqx4nNWab9sxEpdXVeKgfj1qYI2/TgUPQtNFZ85i3PemRtnXVYYJg== dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.2" + "@babel/helper-plugin-utils" "^7.0.0" babel-preset-current-node-syntax@^1.0.0: version "1.0.1" @@ -6503,19 +6320,14 @@ babel-preset-current-node-syntax@^1.0.0: "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-top-level-await" "^7.8.3" -babel-preset-jest@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-28.1.3.tgz#5dfc20b99abed5db994406c2b9ab94c73aaa419d" - integrity sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A== +babel-preset-jest@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz#57bc8cc88097af7ff6a5ab59d1cd29d52a5916e2" + integrity sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg== dependencies: - babel-plugin-jest-hoist "^28.1.3" + babel-plugin-jest-hoist "^29.5.0" babel-preset-current-node-syntax "^1.0.0" -bail@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" - integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== - balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -6526,7 +6338,7 @@ base64-arraybuffer@^0.2.0: resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.2.0.tgz#4b944fac0191aa5907afe2d8c999ccc57ce80f45" integrity sha512-7emyCsu1/xiBXgQZrscw/8KPRT44I4Yq9Pe6EGs3aPRTsWuggML1/1DTuZUuIaJPIm1FTDUVXl4x/yW8s0kQDQ== -base64-js@^1.0.2, base64-js@^1.2.0, base64-js@^1.3.0, base64-js@^1.3.1: +base64-js@^1.2.0, base64-js@^1.3.0, base64-js@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== @@ -6584,15 +6396,15 @@ better-opn@^2.1.1: dependencies: open "^7.0.3" -big-integer@^1.6.7: +big-integer@^1.6.44: version "1.6.51" resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686" integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== -big.js@6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-6.1.1.tgz#63b35b19dc9775c94991ee5db7694880655d5537" - integrity sha512-1vObw81a8ylZO5ePrtMay0n018TcftpTA5HFKDaSuiUDBo8biRBtjIobw60OpwuvrGk+FsxKamqN4cnmj/eXdg== +big.js@6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-6.2.1.tgz#7205ce763efb17c2e41f26f121c420c6a7c2744f" + integrity sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ== big.js@^5.2.2: version "5.2.2" @@ -6600,27 +6412,15 @@ big.js@^5.2.2: integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== bignumber.js@^9.0.0, bignumber.js@^9.0.1: - version "9.0.2" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.2.tgz#71c6c6bed38de64e24a65ebe16cfcf23ae693673" - integrity sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw== - -binary-extensions@^1.0.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" - integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + version "9.1.1" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.1.tgz#c4df7dc496bd849d4c9464344c1aa74228b4dac6" + integrity sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig== binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -bindings@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" - integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== - dependencies: - file-uri-to-path "1.0.0" - bl@^4.0.3, bl@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" @@ -6635,26 +6435,16 @@ blob-util@2.0.2: resolved "https://registry.yarnpkg.com/blob-util/-/blob-util-2.0.2.tgz#3b4e3c281111bb7f11128518006cdc60b403a1eb" integrity sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ== -bluebird@3.7.1: - version "3.7.1" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.1.tgz#df70e302b471d7473489acf26a93d63b53f874de" - integrity sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg== - -bluebird@^3.5.5, bluebird@^3.7.2: +bluebird@^3.7.2: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: +bn.js@^4.0.0, bn.js@^4.11.9: version "4.12.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== -bn.js@^5.0.0, bn.js@^5.1.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" - integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== - body-parser@1.20.0: version "1.20.0" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5" @@ -6673,10 +6463,28 @@ body-parser@1.20.0: type-is "~1.6.18" unpipe "1.0.0" +body-parser@1.20.1: + version "1.20.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + bonjour-service@^1.0.11: - version "1.0.13" - resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.0.13.tgz#4ac003dc1626023252d58adf2946f57e5da450c1" - integrity sha512-LWKRU/7EqDUC9CTAQtuZl5HzBALoCYwtLhffW3et7vZMwv3bWLpJf8bRYlMD5OCcDpTfnPgNCV4yo9ZIaJGMiA== + version "1.1.1" + resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.1.1.tgz#960948fa0e0153f5d26743ab15baf8e33752c135" + integrity sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg== dependencies: array-flatten "^2.1.2" dns-equal "^1.0.0" @@ -6720,12 +6528,12 @@ boxen@^5.1.2: widest-line "^3.1.0" wrap-ansi "^7.0.0" -bplist-parser@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.1.1.tgz#d60d5dcc20cba6dc7e1f299b35d3e1f95dafbae6" - integrity sha512-2AEM0FXy8ZxVLBuqX0hqt1gDwcnz2zygEkQ6zaD5Wko/sB9paUNwlpawrFtKeHUAQUOzjVy9AO4oeonqIHKA9Q== +bplist-parser@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.2.0.tgz#43a9d183e5bf9d545200ceac3e712f79ebbe8d0e" + integrity sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw== dependencies: - big-integer "^1.6.7" + big-integer "^1.6.44" brace-expansion@^1.1.7: version "1.1.11" @@ -6742,7 +6550,7 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@^2.3.1, braces@^2.3.2: +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== @@ -6765,7 +6573,7 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -brorand@^1.0.1, brorand@^1.1.0: +brorand@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== @@ -6775,102 +6583,22 @@ 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-process-hrtime@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" - integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== - -browserify-aes@^1.0.0, browserify-aes@^1.0.4: - version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" - integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== - dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" - -browserify-cipher@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" - integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" - -browserify-des@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" - integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" - integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== - dependencies: - bn.js "^5.0.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" - integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== - dependencies: - bn.js "^5.1.1" - browserify-rsa "^4.0.1" - create-hash "^1.2.0" - create-hmac "^1.1.7" - elliptic "^6.5.3" - inherits "^2.0.4" - parse-asn1 "^5.1.5" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -browserify-zlib@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" - integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== - dependencies: - pako "~1.0.5" - -browserslist@^4.0.0, browserslist@^4.16.6, browserslist@^4.21.3: - version "4.21.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.3.tgz#5df277694eb3c48bc5c4b05af3e8b7e09c5a6d1a" - integrity sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ== - dependencies: - caniuse-lite "^1.0.30001370" - electron-to-chromium "^1.4.202" - node-releases "^2.0.6" - update-browserslist-db "^1.0.5" - -browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.20.2, browserslist@^4.20.3, browserslist@^4.20.4, browserslist@^4.9.1: - version "4.20.4" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.4.tgz#98096c9042af689ee1e0271333dbc564b8ce4477" - integrity sha512-ok1d+1WpnU24XYN7oC3QWgTyMhY/avPJ/r9T00xxvUOIparA/gc+UPUMaod3i+G6s+nI2nUb9xZ5k794uIwShw== +browserify-zlib@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d" + integrity sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ== dependencies: - caniuse-lite "^1.0.30001349" - electron-to-chromium "^1.4.147" - escalade "^3.1.1" - node-releases "^2.0.5" - picocolors "^1.0.0" + pako "~0.2.0" -browserslist@^4.21.4: - version "4.21.4" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" - integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== +browserslist@4.21.5, browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.21.3, browserslist@^4.21.4, browserslist@^4.21.5: + version "4.21.5" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" + integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== dependencies: - caniuse-lite "^1.0.30001400" - electron-to-chromium "^1.4.251" - node-releases "^2.0.6" - update-browserslist-db "^1.0.9" + caniuse-lite "^1.0.30001449" + electron-to-chromium "^1.4.284" + node-releases "^2.0.8" + update-browserslist-db "^1.0.10" bs-logger@0.x, bs-logger@^0.2.6: version "0.2.6" @@ -6901,20 +6629,6 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== - -buffer@^4.3.0: - version "4.9.2" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" - integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" - buffer@^5.5.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" @@ -6923,16 +6637,11 @@ buffer@^5.5.0: base64-js "^1.3.1" ieee754 "^1.1.13" -builtin-modules@^3.0.0: +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== -builtin-status-codes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" - integrity sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ== - builtins@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.0.1.tgz#87f6db9ab0458be728564fa81d876d8d74552fa9" @@ -6940,18 +6649,17 @@ builtins@^5.0.0: dependencies: semver "^7.0.0" -bull@4.8.5: - version "4.8.5" - resolved "https://registry.yarnpkg.com/bull/-/bull-4.8.5.tgz#eebafddc3249d6d5e8ced1c42b8bfa8efcc274aa" - integrity sha512-2Z630e4f6VsLJnWMAtfEHwIqJYmND4W3dcG48RIbXeWpvb4UnYtpe/zxEdslJu0PKrltB4IkFj5YtBsdeQRn8w== +bull@4.10.4: + version "4.10.4" + resolved "https://registry.yarnpkg.com/bull/-/bull-4.10.4.tgz#db39ee0c3bfbe3b76f1f35db800501de5bba4f84" + integrity sha512-o9m/7HjS/Or3vqRd59evBlWCXd9Lp+ALppKseoSKHaykK46SmRjAilX98PgmOz1yeVaurt8D5UtvEt4bUjM3eA== dependencies: cron-parser "^4.2.1" debuglog "^1.0.0" get-port "^5.1.1" - ioredis "^4.28.5" + ioredis "^5.0.0" lodash "^4.17.21" msgpackr "^1.5.2" - p-timeout "^3.2.0" semver "^7.3.2" uuid "^8.3.0" @@ -6977,79 +6685,29 @@ bytesish@^0.4.1: resolved "https://registry.yarnpkg.com/bytesish/-/bytesish-0.4.4.tgz#f3b535a0f1153747427aee27256748cff92347e6" integrity sha512-i4uu6M4zuMUiyfZN4RU2+i9+peJh//pXhd9x1oSe1LBkZ3LEbCoygu8W0bXTukU1Jme2txKuotpCZRaC3FLxcQ== -cacache@16.1.2: - version "16.1.2" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-16.1.2.tgz#a519519e9fc9e5e904575dcd3b77660cbf03f749" - integrity sha512-Xx+xPlfCZIUHagysjjOAje9nRo8pRDczQCcXb4J2O0BLtH+xeVue6ba4y1kfJfQMAnM2mkcoMIAyOctlaRGWYA== - dependencies: - "@npmcli/fs" "^2.1.0" - "@npmcli/move-file" "^2.0.0" - chownr "^2.0.0" - fs-minipass "^2.1.0" - glob "^8.0.1" - infer-owner "^1.0.4" - lru-cache "^7.7.1" - minipass "^3.1.6" - minipass-collect "^1.0.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - mkdirp "^1.0.4" - p-map "^4.0.0" - promise-inflight "^1.0.1" - rimraf "^3.0.2" - ssri "^9.0.0" - tar "^6.1.11" - unique-filename "^1.1.1" - -cacache@^12.0.2: - version "12.0.4" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" - integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== +cacache@17.0.4: + version "17.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-17.0.4.tgz#5023ed892ba8843e3b7361c26d0ada37e146290c" + integrity sha512-Z/nL3gU+zTUjz5pCA5vVjYM8pmaw2kxM7JEiE0fv3w77Wj+sFbi70CrBruUWH0uNcEdvLDixFpgA2JM4F4DBjA== dependencies: - bluebird "^3.5.5" - chownr "^1.1.1" - figgy-pudding "^3.5.1" - glob "^7.1.4" - graceful-fs "^4.1.15" - infer-owner "^1.0.3" - lru-cache "^5.1.1" - mississippi "^3.0.0" - mkdirp "^0.5.1" - move-concurrently "^1.0.1" - promise-inflight "^1.0.1" - rimraf "^2.6.3" - ssri "^6.0.1" - unique-filename "^1.1.1" - y18n "^4.0.0" - -cacache@^15.0.5: - version "15.3.0" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb" - integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== - dependencies: - "@npmcli/fs" "^1.0.0" - "@npmcli/move-file" "^1.0.1" - chownr "^2.0.0" - fs-minipass "^2.0.0" - glob "^7.1.4" - infer-owner "^1.0.4" - lru-cache "^6.0.0" - minipass "^3.1.1" + "@npmcli/fs" "^3.1.0" + fs-minipass "^3.0.0" + glob "^8.0.1" + lru-cache "^7.7.1" + minipass "^4.0.0" minipass-collect "^1.0.2" minipass-flush "^1.0.5" - minipass-pipeline "^1.2.2" - mkdirp "^1.0.3" + minipass-pipeline "^1.2.4" p-map "^4.0.0" promise-inflight "^1.0.1" - rimraf "^3.0.2" - ssri "^8.0.1" - tar "^6.0.2" - unique-filename "^1.1.1" + ssri "^10.0.0" + tar "^6.1.11" + unique-filename "^3.0.0" -cacache@^16.0.0, cacache@^16.1.0: - version "16.1.1" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-16.1.1.tgz#4e79fb91d3efffe0630d5ad32db55cc1b870669c" - integrity sha512-VDKN+LHyCQXaaYZ7rA/qtkURU+/yYhviUdvqEv2LT6QPZU8jpyzEkEVAcKlKLt5dJ5BRp11ym8lo3NKLluEPLg== +cacache@^16.1.0: + version "16.1.3" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-16.1.3.tgz#a02b9f34ecfaf9a78c9f4bc16fceb94d5d67a38e" + integrity sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ== dependencies: "@npmcli/fs" "^2.1.0" "@npmcli/move-file" "^2.0.0" @@ -7068,7 +6726,25 @@ cacache@^16.0.0, cacache@^16.1.0: rimraf "^3.0.2" ssri "^9.0.0" tar "^6.1.11" - unique-filename "^1.1.1" + unique-filename "^2.0.0" + +cacache@^17.0.0: + version "17.1.0" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-17.1.0.tgz#b7286ef941dafe55b461cdcdceda71cacc1eb98d" + integrity sha512-hXpFU+Z3AfVmNuiLve1qxWHMq0RSIt5gjCKAHi/M6DktwFwDdAXAtunl1i4WSKaaVcU9IsRvXFg42jTHigcC6Q== + dependencies: + "@npmcli/fs" "^3.1.0" + fs-minipass "^3.0.0" + glob "^10.2.2" + lru-cache "^7.7.1" + minipass "^5.0.0" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + p-map "^4.0.0" + ssri "^10.0.0" + tar "^6.1.11" + unique-filename "^3.0.0" cache-base@^1.0.1: version "1.0.1" @@ -7115,9 +6791,9 @@ call-bind@^1.0.0, call-bind@^1.0.2: get-intrinsic "^1.0.2" call-me-maybe@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" - integrity sha512-wCyFsDQkKPwwF8BDwOiWNx/9K45L/hvggQiDbve+viMNMQnWhrlYIuBk09offfwCRtCO9P6XwUttufzU11WCVw== + 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" @@ -7143,7 +6819,7 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -camel-case@^4.1.1, camel-case@^4.1.2: +camel-case@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== @@ -7151,24 +6827,6 @@ camel-case@^4.1.1, camel-case@^4.1.2: pascal-case "^3.1.2" tslib "^2.0.3" -camelcase-css@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" - integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== - -camelcase-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" - integrity sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ== - dependencies: - camelcase "^2.0.0" - map-obj "^1.0.0" - -camelcase@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" - integrity sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw== - camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" @@ -7189,29 +6847,12 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001370, caniuse-lite@^1.0.30001373: - version "1.0.30001373" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001373.tgz#2dc3bc3bfcb5d5a929bec11300883040d7b4b4be" - integrity sha512-pJYArGHrPp3TUqQzFYRmP/lwJlj8RCbVe3Gd3eJQkAV8SAC6b19XS9BjMvRdvaS8RMkaTN8ZhoHP6S1y8zzwEQ== - -caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001349: - version "1.0.30001355" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001355.tgz#e240b7177443ed0198c737a7f609536976701c77" - integrity sha512-Sd6pjJHF27LzCB7pT7qs+kuX2ndurzCzkpJl6Qct7LPSZ9jn0bkOA8mdgMgmqnQAWLVOOGjLpc+66V57eLtb1g== - -caniuse-lite@^1.0.30001394, caniuse-lite@^1.0.30001400, caniuse-lite@^1.0.30001407: - version "1.0.30001420" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001420.tgz#f62f35f051e0b6d25532cf376776d41e45b47ef6" - integrity sha512-OnyeJ9ascFA9roEj72ok2Ikp7PHJTKubtEJIQ/VK3fdsS50q4KWy+Z5X0A1/GswEItKX0ctAp8n4SYDE7wTu6A== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001426, caniuse-lite@^1.0.30001449, caniuse-lite@^1.0.30001464: + version "1.0.30001486" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001486.tgz#56a08885228edf62cbe1ac8980f2b5dae159997e" + integrity sha512-uv7/gXuHi10Whlj0pp5q/tsK/32J2QSqVRKQhs2j8VsDCjgyruAh/eEXHF822VqO9yT6iZKw3nRwZRSPBE9OQg== -capture-exit@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" - integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== - dependencies: - rsvp "^4.8.4" - -case-sensitive-paths-webpack-plugin@^2.3.0: +case-sensitive-paths-webpack-plugin@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz#db64066c6422eed2e08cc14b986ca43796dbc6d4" integrity sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw== @@ -7229,19 +6870,6 @@ cbor@^5.1.0: bignumber.js "^9.0.1" nofilter "^1.0.4" -ccount@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" - integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== - -chalk@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" - integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== - 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" @@ -7275,80 +6903,64 @@ char-regex@^1.0.2: resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== -character-entities-legacy@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" - integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== - -character-entities@^1.0.0: - version "1.2.4" - resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" - integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== - -character-reference-invalid@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" - integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== - -charcodes@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/charcodes/-/charcodes-0.2.0.tgz#5208d327e6cc05f99eb80ffc814707572d1f14e4" - integrity sha512-Y4kiDb+AM4Ecy58YkuZrrSRJBDQdQ2L+NyS1vHHFtNtUjgutcZfx3yp1dAONI/oPaPmyGfCLx5CxL+zauIMyKQ== - chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -chart.js@3.8.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-3.8.0.tgz#c6c14c457b9dc3ce7f1514a59e9b262afd6f1a94" - integrity sha512-cr8xhrXjLIXVLOBZPkBZVF6NDeiVIrPLHcMhnON7UufudL+CNeRrD+wpYanswlm8NpudMdrt3CHoLMQMxJhHRg== +chart.js@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-4.2.0.tgz#dd281b2ce890bff32f3e249cf2972a1e74bc032c" + integrity sha512-wbtcV+QKeH0F7gQZaCJEIpsNriFheacouJQTVIjITi3eQA8bTlIBoknz0+dgV79aeKLNMAX+nDslIVE/nJ3rzA== + dependencies: + "@kurkle/color" "^0.3.0" -chartjs-adapter-date-fns@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/chartjs-adapter-date-fns/-/chartjs-adapter-date-fns-2.0.0.tgz#5e53b2f660b993698f936f509c86dddf9ed44c6b" - integrity sha512-rmZINGLe+9IiiEB0kb57vH3UugAtYw33anRiw5kS2Tu87agpetDDoouquycWc9pRsKtQo5j+vLsYHyr8etAvFw== +chartjs-adapter-date-fns@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chartjs-adapter-date-fns/-/chartjs-adapter-date-fns-3.0.0.tgz#c25f63c7f317c1f96f9a7c44bd45eeedb8a478e5" + integrity sha512-Rs3iEB3Q5pJ973J93OBTpnP7qoGwvq3nUnoMdtxO+9aoJof7UFcRbWcIDteXuYd1fgAvct/32T9qaLyLuZVwCg== -chartjs-plugin-annotation@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/chartjs-plugin-annotation/-/chartjs-plugin-annotation-2.0.0.tgz#f8a0a6adeac5b9c3206a22263b6651ac81425784" - integrity sha512-Gd8X+uaWuD63qHSf4R9SvFIdHbxmP1RBsKfdlQt7oFgsyDYjqP2y0WrbEs1UoE7OXJDm8lfZes2tQQNhEL/EZw== +chartjs-plugin-annotation@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/chartjs-plugin-annotation/-/chartjs-plugin-annotation-2.1.2.tgz#8c307c931fda735a1acf1b606ad0e3fd7d96299b" + integrity sha512-kmEp2WtpogwnKKnDPO3iO3mVwvVGtmG5BkZVtAEZm5YzJ9CYxojjYEgk7OTrFbJ5vU098b84UeJRe8kRfNcq5g== -chartjs-plugin-datalabels@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/chartjs-plugin-datalabels/-/chartjs-plugin-datalabels-2.0.0.tgz#caacefb26803d968785071eab012dde8746c5939" - integrity sha512-WBsWihphzM0Y8fmQVm89+iy99mmgejmj5/jcsYqwxSioLRL/zqJ4Scv/eXq5ZqvG3TpojlGzZLeaOaSvDm7fwA== +chartjs-plugin-datalabels@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/chartjs-plugin-datalabels/-/chartjs-plugin-datalabels-2.2.0.tgz#369578e131d743c2e34b5fbe2d3f9335f6639b8f" + integrity sha512-14ZU30lH7n89oq+A4bWaJPnAG8a7ZTk7dKf48YAzMvJjQtjrgg5Dpk9f+LbjCF6bpx3RAGTeL13IXpKQYyRvlw== check-more-types@^2.24.0: version "2.24.0" resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600" integrity sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA== -cheerio-select@^1.3.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-1.6.0.tgz#489f36604112c722afa147dedd0d4609c09e1696" - integrity sha512-eq0GdBvxVFbqWgmCm7M3XGs1I8oLy/nExUnh6oLqmBditPO9AqQJrkslDpMun/hZ0yyTs8L0m85OHp4ho6Qm9g== - dependencies: - css-select "^4.3.0" - css-what "^6.0.1" - domelementtype "^2.2.0" - domhandler "^4.3.1" - domutils "^2.8.0" - -cheerio@1.0.0-rc.6: - version "1.0.0-rc.6" - resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.6.tgz#a5ae81ab483aeefa1280c325543c601145506240" - integrity sha512-hjx1XE1M/D5pAtMgvWwE21QClmAEeGHOIDfycgmndisdNgI6PE1cGRQkMGBcsbUbmEQyWu5PJLUcAOjtQS8DWw== +cheerio-select@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-2.1.0.tgz#4d8673286b8126ca2a8e42740d5e3c4884ae21b4" + integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g== dependencies: - cheerio-select "^1.3.0" - dom-serializer "^1.3.1" - domhandler "^4.1.0" - htmlparser2 "^6.1.0" - parse5 "^6.0.1" - parse5-htmlparser2-tree-adapter "^6.0.1" - -"chokidar@>=3.0.0 <4.0.0", chokidar@^3.0.0, chokidar@^3.4.1, chokidar@^3.4.2, chokidar@^3.5.1, chokidar@^3.5.3: + boolbase "^1.0.0" + css-select "^5.1.0" + css-what "^6.1.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.0.1" + +cheerio@1.0.0-rc.12: + version "1.0.0-rc.12" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.12.tgz#788bf7466506b1c6bf5fae51d24a2c4d62e47683" + integrity sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q== + dependencies: + cheerio-select "^2.1.0" + dom-serializer "^2.0.0" + domhandler "^5.0.3" + domutils "^3.0.1" + htmlparser2 "^8.0.1" + 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: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== @@ -7363,25 +6975,6 @@ cheerio@1.0.0-rc.6: optionalDependencies: fsevents "~2.3.2" -chokidar@^2.1.8: - version "2.1.8" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" - integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== - dependencies: - anymatch "^2.0.0" - async-each "^1.0.1" - braces "^2.3.2" - glob-parent "^3.1.0" - inherits "^2.0.3" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - normalize-path "^3.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.2.1" - upath "^1.1.1" - optionalDependencies: - fsevents "^1.2.7" - chownr@^1.1.1: version "1.1.4" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" @@ -7403,27 +6996,19 @@ ci-info@^2.0.0: integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== ci-info@^3.2.0: - version "3.3.2" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.2.tgz#6d2967ffa407466481c6c90b6e16b3098f080128" - integrity sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg== - -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" + version "3.8.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" + integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== cjs-module-lexer@^1.0.0: version "1.2.2" resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== -class-transformer@0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/class-transformer/-/class-transformer-0.3.2.tgz#779ef5f124784324b40f8e927c774bd96cdecd4b" - integrity sha512-9QY6QXBH/+Gt1C3HBmJCrgY6+EFpIa6aLjfDnlXFx0zQl/HjrCE7qoaI0srNrxpMIfsobCpgUdDG5JYtJOpVsw== +class-transformer@0.5.1: + version "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" @@ -7435,26 +7020,19 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" -class-validator@0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/class-validator/-/class-validator-0.13.1.tgz#381b2001ee6b9e05afd133671fbdf760da7dec67" - integrity sha512-zWIeYFhUitvAHBwNhDdCRK09hWx+P0HUwFE8US8/CxFpMVzkUK8RJl7yOIE+BVu2lxyPNgeOaFv78tLE47jBIg== - dependencies: - "@types/validator" "^13.1.3" - libphonenumber-js "^1.9.7" - validator "^13.5.2" - -clean-css@^4.2.3: - version "4.2.4" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.4.tgz#733bf46eba4e607c6891ea57c24a989356831178" - integrity sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A== +class-validator@0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/class-validator/-/class-validator-0.14.0.tgz#40ed0ecf3c83b2a8a6a320f4edb607be0f0df159" + integrity sha512-ct3ltplN8I9fOwUd8GrP8UQixwff129BkEtuWDKL5W45cQuLd19xqmTLu5ge78YDm/fdje6FMt0hGOhl0lii3A== dependencies: - source-map "~0.6.0" + "@types/validator" "^13.7.10" + libphonenumber-js "^1.10.14" + validator "^13.7.0" clean-css@^5.2.2: - version "5.3.0" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.0.tgz#ad3d8238d5f3549e83d5f87205189494bc7cbb59" - integrity sha512-YYuuxv4H/iNb1Z/5IbMRoxgrzjWGhOEFfd+groZ5dMCVkpENiMZmwspdrzBo9286JjM1gZJPAyL7ZIdzuvu2AQ== + version "5.3.2" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.2.tgz#70ecc7d4d4114921f5d298349ff86a31a9975224" + integrity sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww== dependencies: source-map "~0.6.0" @@ -7489,15 +7067,20 @@ cli-cursor@^2.0.0, cli-cursor@^2.1.0: dependencies: restore-cursor "^2.0.0" -cli-spinners@2.6.1, cli-spinners@^2.5.0: +cli-spinners@2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== +cli-spinners@^2.5.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.0.tgz#5881d0ad96381e117bbe07ad91f2008fe6ffd8db" + integrity sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g== + cli-table3@^0.6.1, cli-table3@~0.6.0: - version "0.6.2" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.2.tgz#aaf5df9d8b5bf12634dc8b3040806a0c07120d2a" - integrity sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw== + version "0.6.3" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.3.tgz#61ab765aac156b52f222954ffc607a6f01dbeeb2" + integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg== dependencies: string-width "^4.2.0" optionalDependencies: @@ -7548,6 +7131,15 @@ cliui@^7.0.2: 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" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + clone-deep@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" @@ -7563,9 +7155,9 @@ clone@^1.0.2: integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== cluster-key-slot@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz#30474b2a981fb12172695833052bc0d01336d10d" - integrity sha512-2Nii8p3RwAPiFwsnZvukotvow2rIHM+yQ6ZcBXGHdniadkYGZYiGmkHJIbZPIV9nfv7m/U1IPMVVcAhoWFeklw== + version "1.1.2" + resolved "https://registry.yarnpkg.com/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz#88ddaa46906e303b5de30d3153b7d9fe0a0c19ac" + integrity sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA== co@^4.6.0: version "4.6.0" @@ -7597,11 +7189,6 @@ codelyzer@6.0.1: tslib "^1.10.0" zone.js "~0.10.3" -collapse-white-space@^1.0.2: - version "1.0.6" - resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.6.tgz#e63629c0016665792060dbbeb79c42239d2c5287" - integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ== - collect-v8-coverage@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" @@ -7639,7 +7226,7 @@ color-name@^1.0.0, color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -color-string@^1.6.0: +color-string@^1.9.0: version "1.9.1" resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== @@ -7652,28 +7239,23 @@ color-support@^1.1.2, color-support@^1.1.3: resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== -color@4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/color/-/color-4.0.1.tgz#21df44cd10245a91b1ccf5ba031609b0e10e7d67" - integrity sha512-rpZjOKN5O7naJxkH2Rx1sZzzBgaiWECc6BYXjeCE6kF0kcASJYbUq02u7JqIHwCb/j3NhV+QhRL2683aICeGZA== +color@4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" + integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== dependencies: color-convert "^2.0.1" - color-string "^1.6.0" + color-string "^1.9.0" colord@^2.9.1: - version "2.9.2" - resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.2.tgz#25e2bacbbaa65991422c07ea209e2089428effb1" - integrity sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ== - -colorette@^1.2.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" - integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== + version "2.9.3" + resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" + integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== -colorette@^2.0.10: - version "2.0.19" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" - integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== +colorette@^2.0.10, colorette@^2.0.19: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" @@ -7682,25 +7264,15 @@ combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -comma-separated-tokens@^1.0.0: - version "1.0.8" - resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" - integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== - -commander@2, 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== - commander@7, commander@^7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== -commander@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" - integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== +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== commander@^5.1.0: version "5.1.0" @@ -7712,7 +7284,7 @@ commander@^6.2.1: resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== -commander@^8.0.0, commander@^8.3.0, commander@~8.3.0: +commander@^8.3.0, commander@~8.3.0: version "8.3.0" resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== @@ -7762,7 +7334,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -concat-stream@^1.5.0, concat-stream@^1.5.2, concat-stream@^1.6.2: +concat-stream@^1.5.2, concat-stream@^1.6.2: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -7787,21 +7359,11 @@ consola@^2.15.0: resolved "https://registry.yarnpkg.com/consola/-/consola-2.15.3.tgz#2e11f98d6a4be71ff72e0bdf07bd23e12cb61550" integrity sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw== -console-browserify@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" - integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== - console-control-strings@^1.0.0, console-control-strings@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== -constants-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" - integrity sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ== - content-disposition@0.5.4: version "0.5.4" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" @@ -7810,16 +7372,19 @@ content-disposition@0.5.4: safe-buffer "5.2.1" content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== -convert-source-map@^1.4.0, convert-source-map@^1.5.1, convert-source-map@^1.6.0, convert-source-map@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== - dependencies: - safe-buffer "~5.1.1" +convert-source-map@^1.5.1, convert-source-map@^1.6.0, convert-source-map@^1.7.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== cookie-signature@1.0.6: version "1.0.6" @@ -7838,18 +7403,6 @@ copy-anything@^2.0.1: dependencies: is-what "^3.14.1" -copy-concurrently@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" - integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== - dependencies: - aproba "^1.1.1" - fs-write-stream-atomic "^1.0.8" - iferr "^0.1.5" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.0" - copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" @@ -7879,18 +7432,12 @@ copy-webpack-plugin@^10.2.4: schema-utils "^4.0.0" serialize-javascript "^6.0.0" -core-js-compat@^3.21.0, core-js-compat@^3.22.1, core-js-compat@^3.8.1: - version "3.23.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.23.1.tgz#23d44d9f209086e60dabf9130cea7719af6e199b" - integrity sha512-KeYrEc8t6FJsKYB2qnDwRHWaC0cJNaqlHfCpMe5q3j/W1nje3moib/txNklddLPCtGb+etcBIyJ8zuMa/LN5/A== +core-js-compat@^3.25.1: + version "3.30.2" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.30.2.tgz#83f136e375babdb8c80ad3c22d67c69098c1dd8b" + integrity sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA== dependencies: - browserslist "^4.20.4" - semver "7.0.0" - -core-js@^3.0.4, core-js@^3.6.5, core-js@^3.8.2: - version "3.23.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.23.1.tgz#9f9a9255115f62c512db56d567f636da32ca0b78" - integrity sha512-wfMYHWi1WQjpgZNC9kAlN4ut04TM9fUTdi7CqIoTVM7yaiOUQTklOzfb+oWH3r9edQcT3F887swuVmxrV+CC8w== + browserslist "^4.21.5" core-util-is@1.0.2: version "1.0.2" @@ -7915,6 +7462,20 @@ corser@^2.0.1: resolved "https://registry.yarnpkg.com/corser/-/corser-2.0.1.tgz#8eda252ecaab5840dcd975ceb90d9370c819ff87" integrity sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ== +cose-base@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/cose-base/-/cose-base-1.0.3.tgz#650334b41b869578a543358b80cda7e0abe0a60a" + integrity sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg== + dependencies: + layout-base "^1.0.0" + +cose-base@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cose-base/-/cose-base-2.2.0.tgz#1c395c35b6e10bb83f9769ca8b817d614add5c01" + integrity sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g== + 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" @@ -7937,9 +7498,9 @@ cosmiconfig@^6.0.0: yaml "^1.7.2" cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" - integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== + version "7.1.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== dependencies: "@types/parse-json" "^4.0.0" import-fresh "^3.2.1" @@ -7947,71 +7508,20 @@ cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: path-type "^4.0.0" yaml "^1.10.0" +countries-and-timezones@3.4.1: + version "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== -countup.js@2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/countup.js/-/countup.js-2.0.7.tgz#56b72a87fc0ee3cadb38356c246ccac88fb0a8cc" - integrity sha512-FO0nQdvG1iQwHp28wdvkErxnNUSbdkzztqZ6YNHKLHydngD2tdiKEW8dFrqpahF3tj+Ma70h0vyYrCBzxlVWdg== - -cp-file@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/cp-file/-/cp-file-7.0.0.tgz#b9454cfd07fe3b974ab9ea0e5f29655791a9b8cd" - integrity sha512-0Cbj7gyvFVApzpK/uhCtQ/9kE9UnYpxMzaq5nQQC/Dh4iaj5fxp7iEFIullrYwzj8nf0qnsI1Qsx34hAeAebvw== - dependencies: - graceful-fs "^4.1.2" - make-dir "^3.0.0" - nested-error-stacks "^2.0.0" - p-event "^4.1.0" - -cpy@^8.1.2: - version "8.1.2" - resolved "https://registry.yarnpkg.com/cpy/-/cpy-8.1.2.tgz#e339ea54797ad23f8e3919a5cffd37bfc3f25935" - integrity sha512-dmC4mUesv0OYH2kNFEidtf/skUwv4zePmGeepjyyJ0qTo5+8KhA1o99oIAwVVLzQMAeDJml74d6wPPKb6EZUTg== - dependencies: - arrify "^2.0.1" - cp-file "^7.0.0" - globby "^9.2.0" - has-glob "^1.0.0" - junk "^3.1.0" - nested-error-stacks "^2.1.0" - p-all "^2.1.0" - p-filter "^2.1.0" - p-map "^3.0.0" - -create-ecdh@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" - integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== - dependencies: - bn.js "^4.1.0" - elliptic "^6.5.3" - -create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" - -create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" - integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" +countup.js@2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/countup.js/-/countup.js-2.3.2.tgz#9a91d95780be1c908d1e6feb548625f353f57988" + integrity sha512-dQ7F/CmKGjaO6cDfhtEXwsKVlXIpJ89dFs8PvkaZH9jBVJ2Z8GU4iwG/qP7MgY8qwr+1skbwR6qecWWQLUzB8Q== create-require@^1.1.0: version "1.1.1" @@ -8031,11 +7541,11 @@ critters@0.0.16: pretty-bytes "^5.3.0" cron-parser@^4.2.1: - version "4.4.0" - resolved "https://registry.yarnpkg.com/cron-parser/-/cron-parser-4.4.0.tgz#829d67f9e68eb52fa051e62de0418909f05db983" - integrity sha512-TrE5Un4rtJaKgmzPewh67yrER5uKM0qI9hGLDBfWb8GGRe9pn/SDkhVrdHa4z7h0SeyeNxnQnogws/H+AQANQA== + version "4.8.1" + resolved "https://registry.yarnpkg.com/cron-parser/-/cron-parser-4.8.1.tgz#47062ea63d21d78c10ddedb08ea4c5b6fc2750fb" + integrity sha512-jbokKWGcyU4gl6jAfX97E1gDpY12DJ1cLJZmoDzaAln/shZ+S3KBFBuA2Q6WeUN4gJf/8klnV1EfvhA2lK5IRQ== dependencies: - luxon "^1.28.0" + luxon "^3.2.1" cron@2.0.0: version "2.0.0" @@ -8071,90 +7581,29 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -crypto-browserify@^3.11.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" - -css-blank-pseudo@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz#36523b01c12a25d812df343a32c322d2a2324561" - integrity sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ== - dependencies: - postcss-selector-parser "^6.0.9" - -css-declaration-sorter@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.3.0.tgz#72ebd995c8f4532ff0036631f7365cce9759df14" - integrity sha512-OGT677UGHJTAVMRhPO+HJ4oKln3wkBTwtDFH0ojbqm+MJm6xuDMHp2nkhh/ThaBqq20IbraBQSWKfSLNHQO9Og== +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== -css-has-pseudo@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz#57f6be91ca242d5c9020ee3e51bbb5b89fc7af73" - integrity sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw== - dependencies: - postcss-selector-parser "^6.0.9" +css-declaration-sorter@^6.3.1: + version "6.4.0" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.4.0.tgz#630618adc21724484b3e9505bce812def44000ad" + integrity sha512-jDfsatwWMWN0MODAFuHszfjphEXfNw9JUAhmY4pLu3TyTU+ohUpsbVtbU+1MZn4a47D9kqh03i4eyOm+74+zew== -css-loader@6.7.1: - version "6.7.1" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.7.1.tgz#e98106f154f6e1baf3fc3bc455cb9981c1d5fd2e" - integrity sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw== +css-loader@6.7.3, css-loader@^6.4.0, css-loader@^6.7.1: + version "6.7.3" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.7.3.tgz#1e8799f3ccc5874fdd55461af51137fcc5befbcd" + integrity sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ== dependencies: icss-utils "^5.1.0" - postcss "^8.4.7" + postcss "^8.4.19" postcss-modules-extract-imports "^3.0.0" postcss-modules-local-by-default "^4.0.0" postcss-modules-scope "^3.0.0" postcss-modules-values "^4.0.0" postcss-value-parser "^4.2.0" - semver "^7.3.5" - -css-loader@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.6.0.tgz#2e4b2c7e6e2d27f8c8f28f61bffcd2e6c91ef645" - integrity sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ== - dependencies: - camelcase "^5.3.1" - cssesc "^3.0.0" - icss-utils "^4.1.1" - loader-utils "^1.2.3" - normalize-path "^3.0.0" - postcss "^7.0.32" - postcss-modules-extract-imports "^2.0.0" - postcss-modules-local-by-default "^3.0.2" - postcss-modules-scope "^2.2.0" - postcss-modules-values "^3.0.0" - postcss-value-parser "^4.1.0" - schema-utils "^2.7.0" - semver "^6.3.0" - -css-loader@^5.0.1: - version "5.2.7" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-5.2.7.tgz#9b9f111edf6fb2be5dc62525644cbc9c232064ae" - integrity sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg== - dependencies: - icss-utils "^5.1.0" - loader-utils "^2.0.0" - postcss "^8.2.15" - postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.0" - postcss-modules-scope "^3.0.0" - postcss-modules-values "^4.0.0" - postcss-value-parser "^4.1.0" - schema-utils "^3.0.0" - semver "^7.3.5" + semver "^7.3.8" css-minimizer-webpack-plugin@^3.4.1: version "3.4.1" @@ -8168,12 +7617,7 @@ css-minimizer-webpack-plugin@^3.4.1: serialize-javascript "^6.0.0" source-map "^0.6.1" -css-prefers-color-scheme@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz#ca8a22e5992c10a5b9d315155e7caee625903349" - integrity sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA== - -css-select@^4.1.3, css-select@^4.2.0, css-select@^4.3.0: +css-select@^4.1.3, css-select@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== @@ -8184,6 +7628,17 @@ css-select@^4.1.3, css-select@^4.2.0, css-select@^4.3.0: domutils "^2.8.0" nth-check "^2.0.1" +css-select@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" + integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== + dependencies: + boolbase "^1.0.0" + css-what "^6.1.0" + domhandler "^5.0.2" + domutils "^3.0.1" + nth-check "^2.0.1" + css-selector-tokenizer@^0.7.1: version "0.7.3" resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz#735f26186e67c749aaf275783405cf0661fae8f1" @@ -8200,7 +7655,7 @@ css-tree@^1.1.2, css-tree@^1.1.3: mdn-data "2.0.14" source-map "^0.6.1" -css-what@^6.0.1: +css-what@^6.0.1, css-what@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== @@ -8221,35 +7676,30 @@ cssauron@^1.4.0: dependencies: through X.X.X -cssdb@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-7.0.1.tgz#3810a0c67ae06362982dfe965dbedf57a0f26617" - integrity sha512-pT3nzyGM78poCKLAEy2zWIVX2hikq6dIrjuZzLV98MumBg+xMTNYfHx7paUlfiRTgg91O/vR889CIf+qiv79Rw== - cssesc@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -cssnano-preset-default@^5.2.12: - version "5.2.12" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.2.12.tgz#ebe6596ec7030e62c3eb2b3c09f533c0644a9a97" - integrity sha512-OyCBTZi+PXgylz9HAA5kHyoYhfGcYdwFmyaJzWnzxuGRtnMw/kR6ilW9XzlzlRAtB6PLT/r+prYgkef7hngFew== +cssnano-preset-default@^5.2.14: + version "5.2.14" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz#309def4f7b7e16d71ab2438052093330d9ab45d8" + integrity sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A== dependencies: - css-declaration-sorter "^6.3.0" + css-declaration-sorter "^6.3.1" cssnano-utils "^3.1.0" postcss-calc "^8.2.3" - postcss-colormin "^5.3.0" - postcss-convert-values "^5.1.2" + postcss-colormin "^5.3.1" + postcss-convert-values "^5.1.3" postcss-discard-comments "^5.1.2" postcss-discard-duplicates "^5.1.0" postcss-discard-empty "^5.1.1" postcss-discard-overridden "^5.1.0" - postcss-merge-longhand "^5.1.6" - postcss-merge-rules "^5.1.2" + postcss-merge-longhand "^5.1.7" + postcss-merge-rules "^5.1.4" postcss-minify-font-values "^5.1.0" postcss-minify-gradients "^5.1.1" - postcss-minify-params "^5.1.3" + postcss-minify-params "^5.1.4" postcss-minify-selectors "^5.2.1" postcss-normalize-charset "^5.1.0" postcss-normalize-display-values "^5.1.0" @@ -8257,11 +7707,11 @@ cssnano-preset-default@^5.2.12: postcss-normalize-repeat-style "^5.1.1" postcss-normalize-string "^5.1.0" postcss-normalize-timing-functions "^5.1.0" - postcss-normalize-unicode "^5.1.0" + postcss-normalize-unicode "^5.1.1" postcss-normalize-url "^5.1.0" postcss-normalize-whitespace "^5.1.1" postcss-ordered-values "^5.1.3" - postcss-reduce-initial "^5.1.0" + postcss-reduce-initial "^5.1.2" postcss-reduce-transforms "^5.1.0" postcss-svgo "^5.1.0" postcss-unique-selectors "^5.1.1" @@ -8272,11 +7722,11 @@ cssnano-utils@^3.1.0: integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== cssnano@^5.0.6: - version "5.1.12" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.1.12.tgz#bcd0b64d6be8692de79332c501daa7ece969816c" - integrity sha512-TgvArbEZu0lk/dvg2ja+B7kYoD7BBCmn3+k58xD0qjrGHsFzXY/wKTo9M5egcUCabPol05e/PVoIu79s2JN4WQ== + version "5.1.15" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.1.15.tgz#ded66b5480d5127fcb44dac12ea5a983755136bf" + integrity sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw== dependencies: - cssnano-preset-default "^5.2.12" + cssnano-preset-default "^5.2.14" lilconfig "^2.0.3" yaml "^1.10.2" @@ -8305,21 +7755,9 @@ cssstyle@^2.3.0: cssom "~0.3.6" csstype@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.0.tgz#4ddcac3718d787cf9df0d1b7d15033925c8f29f2" - integrity sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA== - -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - integrity sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng== - dependencies: - array-find-index "^1.0.1" - -cyclist@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" - integrity sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A== + version "3.1.2" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" + integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== cypress@6.2.1: version "6.2.1" @@ -8365,39 +7803,40 @@ cypress@6.2.1: url "^0.11.0" yauzl "^2.10.0" -d3-array@1, d3-array@^1.1.1, d3-array@^1.2.0: - version "1.2.4" - resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.4.tgz#635ce4d5eea759f6f605863dbcfc30edc737f71f" - integrity sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw== +cytoscape-cose-bilkent@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz#762fa121df9930ffeb51a495d87917c570ac209b" + integrity sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ== + dependencies: + cose-base "^1.0.0" -"d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3: - version "3.1.6" - resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.1.6.tgz#0342c835925826f49b4d16eb7027aec334ffc97d" - integrity sha512-DCbBBNuKOeiR9h04ySRBMW52TFVc91O9wJziuyXw6Ztmy8D3oZbmCkOO3UHKC7ceNJsN2Mavo9+vwV8EAEUXzA== +cytoscape-fcose@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz#e4d6f6490df4fab58ae9cea9e5c3ab8d7472f471" + integrity sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ== dependencies: - internmap "1 - 2" + cose-base "^2.2.0" -d3-axis@1: - version "1.0.12" - resolved "https://registry.yarnpkg.com/d3-axis/-/d3-axis-1.0.12.tgz#cdf20ba210cfbb43795af33756886fb3638daac9" - integrity sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ== +cytoscape@^3.23.0: + version "3.24.0" + resolved "https://registry.yarnpkg.com/cytoscape/-/cytoscape-3.24.0.tgz#764e4ca3df37160b1c55244c648afd303a07e109" + integrity sha512-W9fJMrAfr/zKFzDCpRR/wn6uoEQ7gfbJmxPK5DadXj69XyAhZYi1QXLOE+UXJfXVXxqGM1o1eeiIrtxrtB43zA== + dependencies: + heap "^0.2.6" + lodash "^4.17.21" + +"d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3, d3-array@^3.2.0: + version "3.2.3" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.3.tgz#39f1f4954e4a09ff69ac597c2d61906b04e84740" + integrity sha512-JRHwbQQ84XuAESWhvIPaUV4/1UYTBOLiOPGWqgFDHZS1D5QN9c57FbH3QpEnQMYiOXNzKUQyGTZf+EVO7RT5TQ== + dependencies: + internmap "1 - 2" d3-axis@3: version "3.0.0" resolved "https://registry.yarnpkg.com/d3-axis/-/d3-axis-3.0.0.tgz#c42a4a13e8131d637b745fc2973824cfeaf93322" integrity sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw== -d3-brush@1: - version "1.1.6" - resolved "https://registry.yarnpkg.com/d3-brush/-/d3-brush-1.1.6.tgz#b0a22c7372cabec128bdddf9bddc058592f89e9b" - integrity sha512-7RW+w7HfMCPyZLifTz/UnJmI5kdkXtpCbombUSs8xniAyo0vIbrDzDwUJB6eJOgl9u5DQOt2TQlYumxzD1SvYA== - dependencies: - d3-dispatch "1" - d3-drag "1" - d3-interpolate "1" - d3-selection "1" - d3-transition "1" - d3-brush@3: version "3.0.0" resolved "https://registry.yarnpkg.com/d3-brush/-/d3-brush-3.0.0.tgz#6f767c4ed8dcb79de7ede3e1c0f89e63ef64d31c" @@ -8409,14 +7848,6 @@ d3-brush@3: d3-selection "3" d3-transition "3" -d3-chord@1: - version "1.0.6" - resolved "https://registry.yarnpkg.com/d3-chord/-/d3-chord-1.0.6.tgz#309157e3f2db2c752f0280fedd35f2067ccbb15f" - integrity sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA== - dependencies: - d3-array "1" - d3-path "1" - d3-chord@3: version "3.0.1" resolved "https://registry.yarnpkg.com/d3-chord/-/d3-chord-3.0.1.tgz#d156d61f485fce8327e6abf339cb41d8cbba6966" @@ -8424,59 +7855,29 @@ d3-chord@3: dependencies: d3-path "1 - 3" -d3-collection@1: - version "1.0.7" - resolved "https://registry.yarnpkg.com/d3-collection/-/d3-collection-1.0.7.tgz#349bd2aa9977db071091c13144d5e4f16b5b310e" - integrity sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A== - -d3-color@1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.4.1.tgz#c52002bf8846ada4424d55d97982fef26eb3bc8a" - integrity sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q== - "d3-color@1 - 3", d3-color@3: version "3.1.0" resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-3.1.0.tgz#395b2833dfac71507f12ac2f7af23bf819de24e2" integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA== -d3-contour@1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/d3-contour/-/d3-contour-1.3.2.tgz#652aacd500d2264cb3423cee10db69f6f59bead3" - integrity sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg== - dependencies: - d3-array "^1.1.1" - -d3-contour@3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/d3-contour/-/d3-contour-3.1.0.tgz#708484a5d89be9558dfdda4a95b3df2fdebb65ab" - integrity sha512-vV3xtwrYK5p1J4vyukr70m57mtFTEQYqoaDC1ylBfht/hkdUF0nfWZ1b3V2EPBUVkUkoqq5/fbRoBImBWJgOsg== +d3-contour@4: + version "4.0.2" + resolved "https://registry.yarnpkg.com/d3-contour/-/d3-contour-4.0.2.tgz#bb92063bc8c5663acb2422f99c73cbb6c6ae3bcc" + integrity sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA== dependencies: - d3-array "2 - 3" + d3-array "^3.2.0" d3-delaunay@6: - version "6.0.2" - resolved "https://registry.yarnpkg.com/d3-delaunay/-/d3-delaunay-6.0.2.tgz#7fd3717ad0eade2fc9939f4260acfb503f984e92" - integrity sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ== + version "6.0.4" + resolved "https://registry.yarnpkg.com/d3-delaunay/-/d3-delaunay-6.0.4.tgz#98169038733a0a5babbeda55054f795bb9e4a58b" + integrity sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A== dependencies: delaunator "5" -d3-dispatch@1: - version "1.0.6" - resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-1.0.6.tgz#00d37bcee4dd8cd97729dd893a0ac29caaba5d58" - integrity sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA== - "d3-dispatch@1 - 3", d3-dispatch@3: version "3.0.1" resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz#5fc75284e9c2375c36c839411a0cf550cbfc4d5e" - integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg== - -d3-drag@1: - version "1.2.5" - resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-1.2.5.tgz#2537f451acd39d31406677b7dc77c82f7d988f70" - integrity sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w== - dependencies: - d3-dispatch "1" - d3-selection "1" + integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg== "d3-drag@2 - 3", d3-drag@3: version "3.0.0" @@ -8486,15 +7887,6 @@ d3-drag@1: d3-dispatch "1 - 3" d3-selection "3" -d3-dsv@1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-1.2.0.tgz#9d5f75c3a5f8abd611f74d3f5847b0d4338b885c" - integrity sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g== - dependencies: - commander "2" - iconv-lite "0.4" - rw "1" - "d3-dsv@1 - 3", d3-dsv@3: version "3.0.1" resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-3.0.1.tgz#c63af978f4d6a0d084a52a673922be2160789b73" @@ -8504,23 +7896,11 @@ d3-dsv@1: iconv-lite "0.6" rw "1" -d3-ease@1: - version "1.0.7" - resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-1.0.7.tgz#9a834890ef8b8ae8c558b2fe55bd57f5993b85e2" - integrity sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ== - "d3-ease@1 - 3", d3-ease@3: version "3.0.1" resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-3.0.1.tgz#9658ac38a2140d59d346160f1f6c30fda0bd12f4" integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w== -d3-fetch@1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/d3-fetch/-/d3-fetch-1.2.0.tgz#15ce2ecfc41b092b1db50abd2c552c2316cf7fc7" - integrity sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA== - dependencies: - d3-dsv "1" - d3-fetch@3: version "3.0.1" resolved "https://registry.yarnpkg.com/d3-fetch/-/d3-fetch-3.0.1.tgz#83141bff9856a0edb5e38de89cdcfe63d0a60a22" @@ -8528,16 +7908,6 @@ d3-fetch@3: dependencies: d3-dsv "1 - 3" -d3-force@1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-1.2.1.tgz#fd29a5d1ff181c9e7f0669e4bd72bdb0e914ec0b" - integrity sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg== - dependencies: - d3-collection "1" - d3-dispatch "1" - d3-quadtree "1" - d3-timer "1" - d3-force@3: version "3.0.0" resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-3.0.0.tgz#3e2ba1a61e70888fe3d9194e30d6d14eece155c4" @@ -8547,47 +7917,23 @@ d3-force@3: d3-quadtree "1 - 3" d3-timer "1 - 3" -d3-format@1: - version "1.4.5" - resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-1.4.5.tgz#374f2ba1320e3717eb74a9356c67daee17a7edb4" - integrity sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ== - "d3-format@1 - 3", d3-format@3: version "3.1.0" resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-3.1.0.tgz#9260e23a28ea5cb109e93b21a06e24e2ebd55641" integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA== -d3-geo@1: - version "1.12.1" - resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-1.12.1.tgz#7fc2ab7414b72e59fbcbd603e80d9adc029b035f" - integrity sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg== - dependencies: - d3-array "1" - d3-geo@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-3.0.1.tgz#4f92362fd8685d93e3b1fae0fd97dc8980b1ed7e" - integrity sha512-Wt23xBych5tSy9IYAM1FR2rWIBFWa52B/oF/GYe5zbdHrg08FU8+BuI6X4PvTwPDdqdAdq04fuWJpELtsaEjeA== + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-3.1.0.tgz#74fd54e1f4cebd5185ac2039217a98d39b0a4c0e" + integrity sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA== dependencies: d3-array "2.5.0 - 3" -d3-hierarchy@1: - version "1.1.9" - resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz#2f6bee24caaea43f8dc37545fa01628559647a83" - integrity sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ== - d3-hierarchy@3: version "3.1.2" resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz#b01cd42c1eed3d46db77a5966cf726f8c09160c6" integrity sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA== -d3-interpolate@1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.4.0.tgz#526e79e2d80daa383f9e0c1c1c7dcc0f0583e987" - integrity sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA== - dependencies: - d3-color "1" - "d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3", d3-interpolate@3: version "3.0.1" resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d" @@ -8595,54 +7941,26 @@ d3-interpolate@1: dependencies: d3-color "1 - 3" -d3-path@1: - version "1.0.9" - resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.9.tgz#48c050bb1fe8c262493a8caf5524e3e9591701cf" - integrity sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg== - -"d3-path@1 - 3", d3-path@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-3.0.1.tgz#f09dec0aaffd770b7995f1a399152bf93052321e" - integrity sha512-gq6gZom9AFZby0YLduxT1qmrp4xpBA1YZr19OI717WIdKE2OM5ETq5qrHLb301IgxhLwcuxvGZVLeeWc/k1I6w== - -d3-polygon@1: - version "1.0.6" - resolved "https://registry.yarnpkg.com/d3-polygon/-/d3-polygon-1.0.6.tgz#0bf8cb8180a6dc107f518ddf7975e12abbfbd38e" - integrity sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ== +"d3-path@1 - 3", d3-path@3, d3-path@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-3.1.0.tgz#22df939032fb5a71ae8b1800d61ddb7851c42526" + integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ== d3-polygon@3: version "3.0.1" resolved "https://registry.yarnpkg.com/d3-polygon/-/d3-polygon-3.0.1.tgz#0b45d3dd1c48a29c8e057e6135693ec80bf16398" integrity sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg== -d3-quadtree@1: - version "1.0.7" - resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-1.0.7.tgz#ca8b84df7bb53763fe3c2f24bd435137f4e53135" - integrity sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA== - "d3-quadtree@1 - 3", d3-quadtree@3: version "3.0.1" resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-3.0.1.tgz#6dca3e8be2b393c9a9d514dabbd80a92deef1a4f" integrity sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw== -d3-random@1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/d3-random/-/d3-random-1.1.2.tgz#2833be7c124360bf9e2d3fd4f33847cfe6cab291" - integrity sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ== - d3-random@3: version "3.0.1" resolved "https://registry.yarnpkg.com/d3-random/-/d3-random-3.0.1.tgz#d4926378d333d9c0bfd1e6fa0194d30aebaa20f4" integrity sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ== -d3-scale-chromatic@1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz#54e333fc78212f439b14641fb55801dd81135a98" - integrity sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg== - dependencies: - d3-color "1" - d3-interpolate "1" - d3-scale-chromatic@3: version "3.0.0" resolved "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz#15b4ceb8ca2bb0dcb6d1a641ee03d59c3b62376a" @@ -8651,18 +7969,6 @@ d3-scale-chromatic@3: d3-color "1 - 3" d3-interpolate "1 - 3" -d3-scale@2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-2.2.2.tgz#4e880e0b2745acaaddd3ede26a9e908a9e17b81f" - integrity sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw== - dependencies: - d3-array "^1.2.0" - d3-collection "1" - d3-format "1" - d3-interpolate "1" - d3-time "1" - d3-time-format "2" - d3-scale@4: version "4.0.2" resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-4.0.2.tgz#82b38e8e8ff7080764f8dcec77bd4be393689396" @@ -8674,36 +7980,17 @@ d3-scale@4: d3-time "2.1.1 - 3" d3-time-format "2 - 4" -d3-selection@1, d3-selection@^1.1.0: - version "1.4.2" - resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-1.4.2.tgz#dcaa49522c0dbf32d6c1858afc26b6094555bc5c" - integrity sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg== - "d3-selection@2 - 3", d3-selection@3: version "3.0.0" resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-3.0.0.tgz#c25338207efa72cc5b9bd1458a1a41901f1e1b31" integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ== -d3-shape@1: - version "1.3.7" - resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.3.7.tgz#df63801be07bc986bc54f63789b4fe502992b5d7" - integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw== - dependencies: - d3-path "1" - d3-shape@3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-3.1.0.tgz#c8a495652d83ea6f524e482fca57aa3f8bc32556" - integrity sha512-tGDh1Muf8kWjEDT/LswZJ8WF85yDZLvVJpYU9Nq+8+yW1Z5enxrmXOhTArlkaElU+CTn0OTVNli+/i+HP45QEQ== - dependencies: - d3-path "1 - 3" - -d3-time-format@2: - version "2.3.0" - resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-2.3.0.tgz#107bdc028667788a8924ba040faf1fbccd5a7850" - integrity sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ== + version "3.2.0" + resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-3.2.0.tgz#a1a839cbd9ba45f28674c69d7f855bcf91dfc6a5" + integrity sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA== dependencies: - d3-time "1" + d3-path "^3.1.0" "d3-time-format@2 - 4", d3-time-format@4: version "4.1.0" @@ -8712,40 +7999,18 @@ d3-time-format@2: dependencies: d3-time "1 - 3" -d3-time@1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-1.1.0.tgz#b1e19d307dae9c900b7e5b25ffc5dcc249a8a0f1" - integrity sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA== - "d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@3: - version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-3.0.0.tgz#65972cb98ae2d4954ef5c932e8704061335d4975" - integrity sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ== + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-3.1.0.tgz#9310db56e992e3c0175e1ef385e545e48a9bb5c7" + integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q== dependencies: d3-array "2 - 3" -d3-timer@1: - version "1.0.10" - resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-1.0.10.tgz#dfe76b8a91748831b13b6d9c793ffbd508dd9de5" - integrity sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw== - "d3-timer@1 - 3", d3-timer@3: version "3.0.1" resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-3.0.1.tgz#6284d2a2708285b1abb7e201eda4380af35e63b0" integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== -d3-transition@1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-1.3.2.tgz#a98ef2151be8d8600543434c1ca80140ae23b398" - integrity sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA== - dependencies: - d3-color "1" - d3-dispatch "1" - d3-ease "1" - d3-interpolate "1" - d3-selection "^1.1.0" - d3-timer "1" - "d3-transition@2 - 3", d3-transition@3: version "3.0.1" resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-3.0.1.tgz#6869fdde1448868077fdd5989200cb61b2a1645f" @@ -8757,22 +8022,6 @@ d3-transition@1: d3-interpolate "1 - 3" d3-timer "1 - 3" -d3-voronoi@1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/d3-voronoi/-/d3-voronoi-1.1.4.tgz#dd3c78d7653d2bb359284ae478645d95944c8297" - integrity sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg== - -d3-zoom@1: - version "1.8.3" - resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-1.8.3.tgz#b6a3dbe738c7763121cd05b8a7795ffe17f4fc0a" - integrity sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ== - dependencies: - d3-dispatch "1" - d3-drag "1" - d3-interpolate "1" - d3-selection "1" - d3-transition "1" - d3-zoom@3: version "3.0.0" resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-3.0.0.tgz#d13f4165c73217ffeaa54295cd6969b3e7aee8f3" @@ -8784,54 +8033,17 @@ d3-zoom@3: d3-selection "2 - 3" d3-transition "2 - 3" -d3@^5.14: - version "5.16.0" - resolved "https://registry.yarnpkg.com/d3/-/d3-5.16.0.tgz#9c5e8d3b56403c79d4ed42fbd62f6113f199c877" - integrity sha512-4PL5hHaHwX4m7Zr1UapXW23apo6pexCgdetdJ5kTmADpG/7T9Gkxw0M0tf/pjoB63ezCCm0u5UaFYy2aMt0Mcw== - dependencies: - d3-array "1" - d3-axis "1" - d3-brush "1" - d3-chord "1" - d3-collection "1" - d3-color "1" - d3-contour "1" - d3-dispatch "1" - d3-drag "1" - d3-dsv "1" - d3-ease "1" - d3-fetch "1" - d3-force "1" - d3-format "1" - d3-geo "1" - d3-hierarchy "1" - d3-interpolate "1" - d3-path "1" - d3-polygon "1" - d3-quadtree "1" - d3-random "1" - d3-scale "2" - d3-scale-chromatic "1" - d3-selection "1" - d3-shape "1" - d3-time "1" - d3-time-format "2" - d3-timer "1" - d3-transition "1" - d3-voronoi "1" - d3-zoom "1" - -d3@^7.0.0: - version "7.5.0" - resolved "https://registry.yarnpkg.com/d3/-/d3-7.5.0.tgz#495a2eb30159c34ad54dacf872ac056dd763f3ae" - integrity sha512-b0hUpzWOI99VOek1VpmARF67izlrvd6C83wAAP+Wm7c3Prx7080W26ETt51XTiUn5HDdgVytjrz1UX/0P48VdQ== +d3@^7.4.0, d3@^7.8.2: + version "7.8.4" + resolved "https://registry.yarnpkg.com/d3/-/d3-7.8.4.tgz#e35d45800e4068cab07e59e5d883a4bb42ab217f" + integrity sha512-q2WHStdhiBtD8DMmhDPyJmXUxr6VWRngKyiJ5EfXMxPw+tqT6BhNjhJZ4w3BHsNm3QoVfZLY8Orq/qPFczwKRA== dependencies: d3-array "3" d3-axis "3" d3-brush "3" d3-chord "3" d3-color "3" - d3-contour "3" + d3-contour "4" d3-delaunay "6" d3-dispatch "3" d3-drag "3" @@ -8857,23 +8069,13 @@ d3@^7.0.0: d3-transition "3" d3-zoom "3" -dagre-d3@^0.6.4: - version "0.6.4" - resolved "https://registry.yarnpkg.com/dagre-d3/-/dagre-d3-0.6.4.tgz#0728d5ce7f177ca2337df141ceb60fbe6eeb7b29" - integrity sha512-e/6jXeCP7/ptlAM48clmX4xTZc5Ek6T6kagS7Oz2HrYSdqcLZFLqpAfh7ldbZRFfxCZVyh61NEPR08UQRVxJzQ== - dependencies: - d3 "^5.14" - dagre "^0.8.5" - graphlib "^2.1.8" - lodash "^4.17.15" - -dagre@^0.8.5: - version "0.8.5" - resolved "https://registry.yarnpkg.com/dagre/-/dagre-0.8.5.tgz#ba30b0055dac12b6c1fcc247817442777d06afee" - integrity sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw== +dagre-d3-es@7.0.9: + version "7.0.9" + resolved "https://registry.yarnpkg.com/dagre-d3-es/-/dagre-d3-es-7.0.9.tgz#aca12fccd9d09955a4430029ba72ee6934542a8d" + integrity sha512-rYR4QfVmy+sR44IBDvVtcAmOReGBvRCWDpO2QjYwqgh9yijw6eSHBqaPG/LIOEy7aBsniLvtMW6pg19qJhq60w== dependencies: - graphlib "^2.1.8" - lodash "^4.17.15" + d3 "^7.8.2" + lodash-es "^4.17.21" damerau-levenshtein@^1.0.4: version "1.0.8" @@ -8887,7 +8089,7 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -data-urls@^3.0.1: +data-urls@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143" integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ== @@ -8896,31 +8098,36 @@ data-urls@^3.0.1: whatwg-mimetype "^3.0.0" whatwg-url "^11.0.0" -date-fns@2.28.0: - version "2.28.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.28.0.tgz#9570d656f5fc13143e50c975a3b6bbeb46cd08b2" - integrity sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw== +date-fns@2.29.3: + version "2.29.3" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.3.tgz#27402d2fc67eb442b511b70bbdf98e6411cd68a8" + integrity sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA== date-fns@^1.27.2: version "1.30.1" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9: +dayjs@^1.11.7: + version "1.11.7" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.7.tgz#4b296922642f70999544d1144a2c25730fce63e2" + integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ== + +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, 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.3.4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: +debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, 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@^3.0.0, debug@^3.1.0, debug@^3.1.1, debug@^3.2.6, debug@^3.2.7: +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" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== @@ -8939,15 +8146,15 @@ 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.1.2, decamelize@^1.2.0: +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.3.1: - version "10.4.0" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.0.tgz#97a7448873b01e92e5ff9117d89a7bca8e63e0fe" - integrity sha512-Nv6ENEzyPQ6AItkGwLE2PGKinZZ9g59vSh2BeH6NqPu0OTKZ5ruJsVqh/orbAnqXc9pBbgXAIrc2EyaCj8NpGg== +decimal.js@^10.4.2: + version "10.4.3" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" + integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== decode-uri-component@^0.2.0: version "0.2.2" @@ -8959,24 +8166,47 @@ dedent@^0.7.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== +deep-equal@^2.0.5: + version "2.2.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.1.tgz#c72ab22f3a7d3503a4ca87dde976fe9978816739" + integrity sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.2" + es-get-iterator "^1.1.3" + get-intrinsic "^1.2.0" + is-arguments "^1.1.1" + is-array-buffer "^3.0.2" + is-date-object "^1.0.5" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + isarray "^2.0.5" + object-is "^1.1.5" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.0" + side-channel "^1.0.4" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.9" + deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== deepmerge@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" - integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== -default-browser-id@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-1.0.4.tgz#e59d09a5d157b828b876c26816e61c3d2a2c203a" - integrity sha512-qPy925qewwul9Hifs+3sx1ZYn14obHxpkX+mPD369w4Rzg+YkJBgi3SOvwUq81nWSjqGUegIgEPwD8u+HUnxlw== +default-browser-id@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-3.0.0.tgz#bee7bbbef1f4e75d31f98f4d3f1556a14cea790c" + integrity sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA== dependencies: - bplist-parser "^0.1.0" - meow "^3.1.0" - untildify "^2.0.0" + bplist-parser "^0.2.0" + untildify "^4.0.0" default-gateway@^6.0.3: version "6.0.3" @@ -8986,9 +8216,9 @@ default-gateway@^6.0.3: execa "^5.0.0" defaults@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" - integrity sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA== + version "1.0.4" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" + integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== dependencies: clone "^1.0.2" @@ -8997,10 +8227,10 @@ 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.2, define-properties@^1.1.3, define-properties@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" - integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== +define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" + integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== dependencies: has-property-descriptors "^1.0.0" object-keys "^1.1.1" @@ -9027,6 +8257,25 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" +defu@^6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/defu/-/defu-6.1.2.tgz#1217cba167410a1765ba93893c6dbac9ed9d9e5c" + integrity sha512-+uO4+qr7msjNNWKYPHqN/3+Dx3NFkmIzayk2L1MyZQlvgZb/J1A0fo410dpKrN2SnqFjt8n4JL8fDJE0wIgjFQ== + +del@^6.0.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/del/-/del-6.1.1.tgz#3b70314f1ec0aa325c6b14eb36b95786671edb7a" + integrity sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg== + dependencies: + globby "^11.0.1" + graceful-fs "^4.2.4" + is-glob "^4.0.1" + is-path-cwd "^2.2.0" + is-path-inside "^3.0.2" + p-map "^4.0.0" + rimraf "^3.0.2" + slash "^3.0.0" + delaunator@5: version "5.0.0" resolved "https://registry.yarnpkg.com/delaunator/-/delaunator-5.0.0.tgz#60f052b28bd91c9b4566850ebf7756efe821d81b" @@ -9054,17 +8303,22 @@ delimit-stream@0.1.0: resolved "https://registry.yarnpkg.com/delimit-stream/-/delimit-stream-0.1.0.tgz#9b8319477c0e5f8aeb3ce357ae305fc25ea1cd2b" integrity sha512-a02fiQ7poS5CnjiJBAsjGLPp5EwVoGHNeu9sziBd9huppRfsAFIpv5zNLv0V1gbop53ilngAf5Kf331AwcoRBQ== -denque@^1.1.0, denque@^1.5.0: +denque@^1.5.0: version "1.5.1" resolved "https://registry.yarnpkg.com/denque/-/denque-1.5.1.tgz#07f670e29c9a78f8faecb2566a1e2c11929c5cbf" integrity sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw== -depd@2.0.0: +denque@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/denque/-/denque-2.1.0.tgz#e93e1a6569fb5e66f16a3c2a2964617d349d6ab1" + integrity sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw== + +depd@2.0.0, depd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== -depd@^1.1.2, depd@~1.1.2: +depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== @@ -9074,25 +8328,20 @@ dependency-graph@^0.11.0: resolved "https://registry.yarnpkg.com/dependency-graph/-/dependency-graph-0.11.0.tgz#ac0ce7ed68a54da22165a85e97a01d53f5eb2e27" integrity sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg== -des.js@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" - integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" +dequal@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== destroy@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== -detab@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/detab/-/detab-2.0.4.tgz#b927892069aff405fbb9a186fe97a44a92a94b43" - integrity sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g== - dependencies: - repeat-string "^1.5.4" +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" @@ -9116,33 +8365,24 @@ detect-package-manager@^2.0.1: dependencies: execa "^5.1.1" -detect-port@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.3.0.tgz#d9c40e9accadd4df5cac6a782aefd014d573d1f1" - integrity sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ== +detect-port@^1.3.0, detect-port@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.5.1.tgz#451ca9b6eaf20451acb0799b8ab40dff7718727b" + integrity sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ== dependencies: address "^1.0.1" - debug "^2.6.0" + debug "4" -diff-sequences@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-28.1.1.tgz#9989dc731266dc2903457a70e996f3a041913ac6" - integrity sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw== +diff-sequences@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2" + integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== diff@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== -diffie-hellman@^5.0.0: - version "5.0.3" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" - integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" - dir-glob@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" @@ -9163,9 +8403,9 @@ dns-equal@^1.0.0: integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== dns-packet@^5.2.2: - version "5.4.0" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.4.0.tgz#1f88477cf9f27e78a213fb6d118ae38e759a879b" - integrity sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g== + version "5.6.0" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.0.tgz#2202c947845c7a63c23ece58f2f70ff6ab4c2f7d" + integrity sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ== dependencies: "@leichtgewicht/ip-codec" "^2.0.1" @@ -9190,7 +8430,7 @@ dom-converter@^0.2.0: dependencies: utila "~0.4" -dom-serializer@^1.0.1, dom-serializer@^1.3.1: +dom-serializer@^1.0.1: version "1.4.1" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== @@ -9199,17 +8439,16 @@ dom-serializer@^1.0.1, dom-serializer@^1.3.1: domhandler "^4.2.0" entities "^2.0.0" -dom-walk@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" - integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== - -domain-browser@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" - integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" -domelementtype@^2.0.1, domelementtype@^2.2.0: +domelementtype@^2.0.1, domelementtype@^2.2.0, domelementtype@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== @@ -9221,17 +8460,24 @@ domexception@^4.0.0: dependencies: webidl-conversions "^7.0.0" -domhandler@^4.0.0, domhandler@^4.1.0, domhandler@^4.2.0, domhandler@^4.3.1: +domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== dependencies: domelementtype "^2.2.0" -dompurify@2.3.8: - version "2.3.8" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.3.8.tgz#224fe9ae57d7ebd9a1ae1ac18c1c1ca3f532226f" - integrity sha512-eVhaWoVibIzqdGYjwsBWodIQIaXFSB+cKDf4cfxLMsK0xiud6SE+/WCVx/Xw/UwQsa4cS3T2eITcdtmTg2UKcw== +domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + +dompurify@2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.4.3.tgz#f4133af0e6a50297fc8874e2eaedc13a3c308c03" + integrity sha512-q6QaLcakcRjebxjg8/+NP+h0rPfatOgOzc46Fst9VAA3jF2ApfKBNKMzdP4DYTqtUMXSCd5pRS/8Po/OmoCHZQ== domutils@^2.5.2, domutils@^2.8.0: version "2.8.0" @@ -9242,6 +8488,15 @@ domutils@^2.5.2, domutils@^2.8.0: domelementtype "^2.2.0" domhandler "^4.2.0" +domutils@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" + integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + dot-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" @@ -9255,20 +8510,20 @@ dotenv-expand@8.0.3: resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-8.0.3.tgz#29016757455bcc748469c83a19b36aaf2b83dd6e" integrity sha512-SErOMvge0ZUyWd5B0NXMQlDkN+8r+HhVUsxgOO7IoPDOdDRD2JjExpN6y3KnFR66jsJMwSn1pqIivhU5rcJiNg== -dotenv-expand@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" - integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== +dotenv-expand@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-10.0.0.tgz#12605d00fb0af6d0a592e6558585784032e4ef37" + integrity sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A== dotenv@16.0.1: version "16.0.1" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.1.tgz#8f8f9d94876c35dac989876a5d3a82a267fdce1d" integrity sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ== -dotenv@^8.0.0: - version "8.6.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b" - integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g== +dotenv@^16.0.0: + version "16.0.3" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.3.tgz#115aec42bac5053db3c456db30cc243a5a836a07" + integrity sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ== dotenv@~10.0.0: version "10.0.0" @@ -9280,7 +8535,7 @@ duplexer@^0.1.1: resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== -duplexify@^3.4.2, duplexify@^3.6.0: +duplexify@^3.5.0, duplexify@^3.6.0: version "3.7.1" resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== @@ -9290,6 +8545,11 @@ duplexify@^3.4.2, duplexify@^3.6.0: readable-stream "^2.0.0" stream-shift "^1.0.0" +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" @@ -9310,33 +8570,28 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -ejs@^3.1.7: - version "3.1.8" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.8.tgz#758d32910c78047585c7ef1f92f9ee041c1c190b" - integrity sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ== +ejs@^3.1.7, ejs@^3.1.8: + version "3.1.9" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.9.tgz#03c9e8777fe12686a9effcef22303ca3d8eeb361" + integrity sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ== dependencies: jake "^10.8.5" -electron-to-chromium@^1.4.147: - version "1.4.158" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.158.tgz#abbdaaf64676bfa4bc0307522125db34424a0ada" - integrity sha512-gppO3/+Y6sP432HtvwvuU8S+YYYLH4PmAYvQwqUtt9HDOmEsBwQfLnK9T8+1NIKwAS1BEygIjTaATC4H5EzvxQ== - -electron-to-chromium@^1.4.202: - version "1.4.206" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.206.tgz#580ff85b54d7ec0c05f20b1e37ea0becdd7b0ee4" - integrity sha512-h+Fadt1gIaQ06JaIiyqPsBjJ08fV5Q7md+V8bUvQW/9OvXfL2LRICTz2EcnnCP7QzrFTS6/27MRV6Bl9Yn97zA== - -electron-to-chromium@^1.4.251: - version "1.4.283" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.283.tgz#d4f263f5df402fd799c0a06255d580dcf8aa9a8e" - integrity sha512-g6RQ9zCOV+U5QVHW9OpFR7rdk/V7xfopNXnyAamdpFgCHgZ1sjI8VuR1+zG2YG/TZk+tQ8mpNkug4P8FU0fuOA== +electron-to-chromium@^1.4.284: + version "1.4.385" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.385.tgz#1afd8d6280d510145148777b899ff481c65531ff" + integrity sha512-L9zlje9bIw0h+CwPQumiuVlfMcV4boxRjFIWDcLfFqTZNbkwOExBzfmswytHawObQX4OUhtNv8gIiB21kOurIg== elegant-spinner@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" integrity sha512-B+ZM+RXvRqQaAmkMlO/oSe5nMUOaUnyfGYCEHoR8wrXsZR2mA0XVibsxV1bvTwxdRWah1PkQqso2EzhILGHtEQ== +elkjs@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/elkjs/-/elkjs-0.8.2.tgz#c37763c5a3e24e042e318455e0147c912a7c248e" + integrity sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ== + elliptic@^6.5.3, elliptic@^6.5.4: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" @@ -9350,10 +8605,10 @@ elliptic@^6.5.3, elliptic@^6.5.4: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" -emittery@^0.10.2: - version "0.10.2" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.2.tgz#902eec8aedb8c41938c46e9385e9db7e03182933" - integrity sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw== +emittery@^0.13.1: + version "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" @@ -9365,15 +8620,15 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -emoji-toolkit@^6.6.0: - version "6.6.0" - resolved "https://registry.yarnpkg.com/emoji-toolkit/-/emoji-toolkit-6.6.0.tgz#e7287c43a96f940ec4c5428cd7100a40e57518f1" - integrity sha512-pEu0kow2p1N8zCKnn/L6H0F3rWUBB3P3hVjr/O5yl1fK7N9jU4vO4G7EFapC5Y3XwZLUCY0FZbOPyTkH+4V2eQ== +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== -emojis-list@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" - integrity sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng== +emoji-toolkit@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/emoji-toolkit/-/emoji-toolkit-7.0.1.tgz#4ea2a78fe4b40c7cdbe7ef5725c7011299932f09" + integrity sha512-l5aJyAhpC5s4mDuoVuqt4SzVjwIsIvakPh4ZGJJE4KWuWFCEHaXacQFkStVdD9zbRR+/BbRXob7u99o0lQFr8A== emojis-list@^3.0.0: version "3.0.0" @@ -9399,32 +8654,15 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: dependencies: once "^1.4.0" -enhanced-resolve@^4.0.0, enhanced-resolve@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec" - integrity sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg== - dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.5.0" - tapable "^1.0.0" - -enhanced-resolve@^5.0.0, enhanced-resolve@^5.7.0, enhanced-resolve@^5.9.3: - version "5.9.3" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz#44a342c012cbc473254af5cc6ae20ebd0aae5d88" - integrity sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - -enhanced-resolve@^5.10.0: - version "5.10.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz#0dc579c3bb2a1032e357ac45b8f3a6f3ad4fb1e6" - integrity sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ== +enhanced-resolve@^5.0.0, enhanced-resolve@^5.10.0, enhanced-resolve@^5.13.0, enhanced-resolve@^5.7.0: + version "5.13.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.13.0.tgz#26d1ecc448c02de997133217b5c1053f34a0a275" + integrity sha512-eyV8f0y1+bzyfh8xAwW/WTSZpLbjhqc4ne9eGSH4Zo2ejdyiNG9pU6mf9DG8a7+Auk6MFTlNOT4Y2y/9k8GKVg== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" -enquirer@^2.3.5, enquirer@~2.3.6: +enquirer@^2.3.6, enquirer@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== @@ -9436,6 +8674,11 @@ entities@^2.0.0: resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== +entities@^4.2.0, entities@^4.3.0, entities@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + env-paths@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" @@ -9448,78 +8691,104 @@ envalid@7.3.1: dependencies: tslib "2.3.1" +envinfo@^7.7.3: + version "7.8.1" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" + integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== + err-code@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== -errno@^0.1.1, errno@^0.1.3, errno@~0.1.7: +errno@^0.1.1: version "0.1.8" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== dependencies: prr "~1.0.1" -error-ex@^1.2.0, error-ex@^1.3.1: +error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" -es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5, es-abstract@^1.20.1: - version "1.20.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.1.tgz#027292cd6ef44bd12b1913b828116f54787d1814" - integrity sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA== +es-abstract@^1.19.0, es-abstract@^1.20.4: + version "1.21.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.2.tgz#a56b9695322c8a185dc25975aa3b8ec31d0e7eff" + integrity sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg== dependencies: + array-buffer-byte-length "^1.0.0" + available-typed-arrays "^1.0.5" call-bind "^1.0.2" + es-set-tostringtag "^2.0.1" es-to-primitive "^1.2.1" - function-bind "^1.1.1" function.prototype.name "^1.1.5" - get-intrinsic "^1.1.1" + get-intrinsic "^1.2.0" get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" has "^1.0.3" has-property-descriptors "^1.0.0" + has-proto "^1.0.1" has-symbols "^1.0.3" - internal-slot "^1.0.3" - is-callable "^1.2.4" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" + is-callable "^1.2.7" is-negative-zero "^2.0.2" is-regex "^1.1.4" is-shared-array-buffer "^1.0.2" is-string "^1.0.7" + is-typed-array "^1.1.10" is-weakref "^1.0.2" - object-inspect "^1.12.0" + object-inspect "^1.12.3" object-keys "^1.1.1" - object.assign "^4.1.2" + object.assign "^4.1.4" regexp.prototype.flags "^1.4.3" - string.prototype.trimend "^1.0.5" - string.prototype.trimstart "^1.0.5" + safe-regex-test "^1.0.0" + string.prototype.trim "^1.2.7" + string.prototype.trimend "^1.0.6" + string.prototype.trimstart "^1.0.6" + typed-array-length "^1.0.4" unbox-primitive "^1.0.2" + which-typed-array "^1.1.9" -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-get-iterator@^1.0.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.2.tgz#9234c54aba713486d7ebde0220864af5e2b283f7" - integrity sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ== +es-get-iterator@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" + integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== dependencies: call-bind "^1.0.2" - get-intrinsic "^1.1.0" - has-symbols "^1.0.1" - is-arguments "^1.1.0" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + is-arguments "^1.1.1" is-map "^2.0.2" is-set "^2.0.2" - is-string "^1.0.5" + is-string "^1.0.7" isarray "^2.0.5" + stop-iteration-iterator "^1.0.0" es-module-lexer@^0.9.0: version "0.9.3" resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== +es-module-lexer@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.2.1.tgz#ba303831f63e6a394983fde2f97ad77b22324527" + integrity sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg== + +es-set-tostringtag@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" + integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== + dependencies: + get-intrinsic "^1.1.3" + has "^1.0.3" + has-tostringtag "^1.0.0" + es-shim-unscopables@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" @@ -9536,279 +8805,88 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -es5-shim@^4.5.13: - version "4.6.7" - resolved "https://registry.yarnpkg.com/es5-shim/-/es5-shim-4.6.7.tgz#bc67ae0fc3dd520636e0a1601cc73b450ad3e955" - integrity sha512-jg21/dmlrNQI7JyyA2w7n+yifSxBng0ZralnSfVZjoCawgNTCnS+yBCyVM9DL5itm7SUnDGgv7hcq2XCZX4iRQ== - -es6-shim@^0.35.5: - version "0.35.6" - resolved "https://registry.yarnpkg.com/es6-shim/-/es6-shim-0.35.6.tgz#d10578301a83af2de58b9eadb7c2c9945f7388a0" - integrity sha512-EmTr31wppcaIAgblChZiuN/l9Y7DPyw8Xtbg7fIVngn6zMW+IEBJDJngeKC3x6wr0V/vcA2wqeFnaw1bFJbDdA== - -esbuild-android-64@0.15.5: - version "0.15.5" - resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.15.5.tgz#3c7b2f2a59017dab3f2c0356188a8dd9cbdc91c8" - integrity sha512-dYPPkiGNskvZqmIK29OPxolyY3tp+c47+Fsc2WYSOVjEPWNCHNyqhtFqQadcXMJDQt8eN0NMDukbyQgFcHquXg== - -esbuild-android-64@0.15.6: - version "0.15.6" - resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.15.6.tgz#baaed943ca510c2ad546e116728132e76d1d2044" - integrity sha512-Z1CHSgB1crVQi2LKSBwSkpaGtaloVz0ZIYcRMsvHc3uSXcR/x5/bv9wcZspvH/25lIGTaViosciS/NS09ERmVA== - -esbuild-android-arm64@0.15.5: - version "0.15.5" - resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.5.tgz#e301db818c5a67b786bf3bb7320e414ac0fcf193" - integrity sha512-YyEkaQl08ze3cBzI/4Cm1S+rVh8HMOpCdq8B78JLbNFHhzi4NixVN93xDrHZLztlocEYqi45rHHCgA8kZFidFg== - -esbuild-android-arm64@0.15.6: - version "0.15.6" - resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.6.tgz#1c33c73d4c074969e014e31958116460c8e75a7a" - integrity sha512-mvM+gqNxqKm2pCa3dnjdRzl7gIowuc4ga7P7c3yHzs58Im8v/Lfk1ixSgQ2USgIywT48QWaACRa3F4MG7djpSw== - -esbuild-darwin-64@0.15.5: - version "0.15.5" - resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.5.tgz#11726de5d0bf5960b92421ef433e35871c091f8d" - integrity sha512-Cr0iIqnWKx3ZTvDUAzG0H/u9dWjLE4c2gTtRLz4pqOBGjfjqdcZSfAObFzKTInLLSmD0ZV1I/mshhPoYSBMMCQ== - -esbuild-darwin-64@0.15.6: - version "0.15.6" - resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.6.tgz#388592ba61bf31993d79f6311f7452aa1ef255b9" - integrity sha512-BsfVt3usScAfGlXJiGtGamwVEOTM8AiYiw1zqDWhGv6BncLXCnTg1As+90mxWewdTZKq3iIy8s9g8CKkrrAXVw== - -esbuild-darwin-arm64@0.15.5: - version "0.15.5" - resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.5.tgz#ad89dafebb3613fd374f5a245bb0ce4132413997" - integrity sha512-WIfQkocGtFrz7vCu44ypY5YmiFXpsxvz2xqwe688jFfSVCnUsCn2qkEVDo7gT8EpsLOz1J/OmqjExePL1dr1Kg== - -esbuild-darwin-arm64@0.15.6: - version "0.15.6" - resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.6.tgz#194e987849dc4688654008a1792f26e948f52e74" - integrity sha512-CnrAeJaEpPakUobhqO4wVSA4Zm6TPaI5UY4EsI62j9mTrjIyQPXA1n4Ju6Iu5TVZRnEqV6q8blodgYJ6CJuwCA== - -esbuild-freebsd-64@0.15.5: - version "0.15.5" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.5.tgz#6bfb52b4a0d29c965aa833e04126e95173289c8a" - integrity sha512-M5/EfzV2RsMd/wqwR18CELcenZ8+fFxQAAEO7TJKDmP3knhWSbD72ILzrXFMMwshlPAS1ShCZ90jsxkm+8FlaA== - -esbuild-freebsd-64@0.15.6: - version "0.15.6" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.6.tgz#daa72faee585ec2ec27cc65e86a6ce0786373e66" - integrity sha512-+qFdmqi+jkAsxsNJkaWVrnxEUUI50nu6c3MBVarv3RCDCbz7ZS1a4ZrdkwEYFnKcVWu6UUE0Kkb1SQ1yGEG6sg== - -esbuild-freebsd-arm64@0.15.5: - version "0.15.5" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.5.tgz#38a3fed8c6398072f9914856c7c3e3444f9ef4dd" - integrity sha512-2JQQ5Qs9J0440F/n/aUBNvY6lTo4XP/4lt1TwDfHuo0DY3w5++anw+jTjfouLzbJmFFiwmX7SmUhMnysocx96w== - -esbuild-freebsd-arm64@0.15.6: - version "0.15.6" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.6.tgz#70c8a2a30bf6bb9d547a0d8dc93aa015ec4f77f9" - integrity sha512-KtQkQOhnNciXm2yrTYZMD3MOm2zBiiwFSU+dkwNbcfDumzzUprr1x70ClTdGuZwieBS1BM/k0KajRQX7r504Xw== - -esbuild-linux-32@0.15.5: - version "0.15.5" - resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.15.5.tgz#942dc70127f0c0a7ea91111baf2806e61fc81b32" - integrity sha512-gO9vNnIN0FTUGjvTFucIXtBSr1Woymmx/aHQtuU+2OllGU6YFLs99960UD4Dib1kFovVgs59MTXwpFdVoSMZoQ== - -esbuild-linux-32@0.15.6: - version "0.15.6" - resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.15.6.tgz#d69ed2335b2d68c00b3248254b432172077b7ced" - integrity sha512-IAkDNz3TpxwISTGVdQijwyHBZrbFgLlRi5YXcvaEHtgbmayLSDcJmH5nV1MFgo/x2QdKcHBkOYHdjhKxUAcPwg== - -esbuild-linux-64@0.15.5: - version "0.15.5" - resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.15.5.tgz#6d748564492d5daaa7e62420862c31ac3a44aed9" - integrity sha512-ne0GFdNLsm4veXbTnYAWjbx3shpNKZJUd6XpNbKNUZaNllDZfYQt0/zRqOg0sc7O8GQ+PjSMv9IpIEULXVTVmg== - -esbuild-linux-64@0.15.6: - version "0.15.6" - resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.15.6.tgz#dca821e8f129cccde23ac947fd0d4bea3b333808" - integrity sha512-gQPksyrEYfA4LJwyfTQWAZaVZCx4wpaLrSzo2+Xc9QLC+i/sMWmX31jBjrn4nLJCd79KvwCinto36QC7BEIU/A== - -esbuild-linux-arm64@0.15.5: - version "0.15.5" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.5.tgz#28cd899beb2d2b0a3870fd44f4526835089a318d" - integrity sha512-7EgFyP2zjO065XTfdCxiXVEk+f83RQ1JsryN1X/VSX2li9rnHAt2swRbpoz5Vlrl6qjHrCmq5b6yxD13z6RheA== - -esbuild-linux-arm64@0.15.6: - version "0.15.6" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.6.tgz#c9e8bc86f3c58a7c8ff1ded5880c6a39ade7621b" - integrity sha512-aovDkclFa6C9EdZVBuOXxqZx83fuoq8097xZKhEPSygwuy4Lxs8J4anHG7kojAsR+31lfUuxzOo2tHxv7EiNHA== - -esbuild-linux-arm@0.15.5: - version "0.15.5" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.5.tgz#6441c256225564d8794fdef5b0a69bc1a43051b5" - integrity sha512-wvAoHEN+gJ/22gnvhZnS/+2H14HyAxM07m59RSLn3iXrQsdS518jnEWRBnJz3fR6BJa+VUTo0NxYjGaNt7RA7Q== - -esbuild-linux-arm@0.15.6: - version "0.15.6" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.6.tgz#354ecad0223f5b176995cf4462560eec2633de24" - integrity sha512-xZ0Bq2aivsthDjA/ytQZzxrxIZbG0ATJYMJxNeOIBc1zUjpbVpzBKgllOZMsTSXMHFHGrow6TnCcgwqY0+oEoQ== - -esbuild-linux-mips64le@0.15.5: - version "0.15.5" - resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.5.tgz#d4927f817290eaffc062446896b2a553f0e11981" - integrity sha512-KdnSkHxWrJ6Y40ABu+ipTZeRhFtc8dowGyFsZY5prsmMSr1ZTG9zQawguN4/tunJ0wy3+kD54GaGwdcpwWAvZQ== - -esbuild-linux-mips64le@0.15.6: - version "0.15.6" - resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.6.tgz#f4fb941a4ff0af437deed69a2e0712983c8fff3e" - integrity sha512-wVpW8wkWOGizsCqCwOR/G3SHwhaecpGy3fic9BF1r7vq4djLjUcA8KunDaBCjJ6TgLQFhJ98RjDuyEf8AGjAvw== - -esbuild-linux-ppc64le@0.15.5: - version "0.15.5" - resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.5.tgz#b6d660dc6d5295f89ac51c675f1a2f639e2fb474" - integrity sha512-QdRHGeZ2ykl5P0KRmfGBZIHmqcwIsUKWmmpZTOq573jRWwmpfRmS7xOhmDHBj9pxv+6qRMH8tLr2fe+ZKQvCYw== - -esbuild-linux-ppc64le@0.15.6: - version "0.15.6" - resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.6.tgz#19774a8b52c77173f2d4f171b8a8cf839b12e686" - integrity sha512-z6w6gsPH/Y77uchocluDC8tkCg9rfkcPTePzZKNr879bF4tu7j9t255wuNOCE396IYEGxY7y8u2HJ9i7kjCLVw== - -esbuild-linux-riscv64@0.15.5: - version "0.15.5" - resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.5.tgz#2801bf18414dc3d3ad58d1ea83084f00d9d84896" - integrity sha512-p+WE6RX+jNILsf+exR29DwgV6B73khEQV0qWUbzxaycxawZ8NE0wA6HnnTxbiw5f4Gx9sJDUBemh9v49lKOORA== - -esbuild-linux-riscv64@0.15.6: - version "0.15.6" - resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.6.tgz#66bd83b065c4a1e623df02c122bc7e4e15fd8486" - integrity sha512-pfK/3MJcmbfU399TnXW5RTPS1S+ID6ra+CVj9TFZ2s0q9Ja1F5A1VirUUvViPkjiw+Kq3zveyn6U09Wg1zJXrw== - -esbuild-linux-s390x@0.15.5: - version "0.15.5" - resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.5.tgz#12a634ae6d3384cacc2b8f4201047deafe596eae" - integrity sha512-J2ngOB4cNzmqLHh6TYMM/ips8aoZIuzxJnDdWutBw5482jGXiOzsPoEF4j2WJ2mGnm7FBCO4StGcwzOgic70JQ== - -esbuild-linux-s390x@0.15.6: - version "0.15.6" - resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.6.tgz#1e024bddc75afe8dc70ed48fc9627af770d7f34b" - integrity sha512-OZeeDu32liefcwAE63FhVqM4heWTC8E3MglOC7SK0KYocDdY/6jyApw0UDkDHlcEK9mW6alX/SH9r3PDjcCo/Q== - -esbuild-netbsd-64@0.15.5: - version "0.15.5" - resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.5.tgz#951bbf87600512dfcfbe3b8d9d117d684d26c1b8" - integrity sha512-MmKUYGDizYjFia0Rwt8oOgmiFH7zaYlsoQ3tIOfPxOqLssAsEgG0MUdRDm5lliqjiuoog8LyDu9srQk5YwWF3w== - -esbuild-netbsd-64@0.15.6: - version "0.15.6" - resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.6.tgz#c11477d197f059c8794ee1691e3399201f7c4b9a" - integrity sha512-kaxw61wcHMyiEsSsi5ut1YYs/hvTC2QkxJwyRvC2Cnsz3lfMLEu8zAjpBKWh9aU/N0O/gsRap4wTur5GRuSvBA== - -esbuild-openbsd-64@0.15.5: - version "0.15.5" - resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.5.tgz#26705b61961d525d79a772232e8b8f211fdbb035" - integrity sha512-2mMFfkLk3oPWfopA9Plj4hyhqHNuGyp5KQyTT9Rc8hFd8wAn5ZrbJg+gNcLMo2yzf8Uiu0RT6G9B15YN9WQyMA== - -esbuild-openbsd-64@0.15.6: - version "0.15.6" - resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.6.tgz#b29e7faed5b8d2aeaf3884c47c1a96b1cba8e263" - integrity sha512-CuoY60alzYfIZapUHqFXqXbj88bbRJu8Fp9okCSHRX2zWIcGz4BXAHXiG7dlCye5nFVrY72psesLuWdusyf2qw== - -esbuild-sunos-64@0.15.5: - version "0.15.5" - resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.5.tgz#d794da1ae60e6e2f6194c44d7b3c66bf66c7a141" - integrity sha512-2sIzhMUfLNoD+rdmV6AacilCHSxZIoGAU2oT7XmJ0lXcZWnCvCtObvO6D4puxX9YRE97GodciRGDLBaiC6x1SA== - -esbuild-sunos-64@0.15.6: - version "0.15.6" - resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.6.tgz#9668f39e47179f50c0435040904b9c6e10e84a70" - integrity sha512-1ceefLdPWcd1nW/ZLruPEYxeUEAVX0YHbG7w+BB4aYgfknaLGotI/ZvPWUZpzhC8l1EybrVlz++lm3E6ODIJOg== - -esbuild-wasm@0.15.5: - version "0.15.5" - resolved "https://registry.yarnpkg.com/esbuild-wasm/-/esbuild-wasm-0.15.5.tgz#d59878b097d2da024a532da94acce6384de9e314" - integrity sha512-lTJOEKekN/4JI/eOEq0wLcx53co2N6vaT/XjBz46D1tvIVoUEyM0o2K6txW6gEotf31szFD/J1PbxmnbkGlK9A== +es6-object-assign@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c" + integrity sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw== + +esbuild-plugin-alias@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/esbuild-plugin-alias/-/esbuild-plugin-alias-0.2.1.tgz#45a86cb941e20e7c2bc68a2bea53562172494fcb" + integrity sha512-jyfL/pwPqaFXyKnj8lP8iLk6Z0m099uXR45aSN8Av1XD4vhvQutxxPzgA2bTcAwQpa1zCXDcWOlhFgyP3GKqhQ== + +esbuild-register@^3.4.0: + version "3.4.2" + resolved "https://registry.yarnpkg.com/esbuild-register/-/esbuild-register-3.4.2.tgz#1e39ee0a77e8f320a9790e68c64c3559620b9175" + integrity sha512-kG/XyTDyz6+YDuyfB9ZoSIOOmgyFCH+xPRtsCa8W85HLRV5Csp+o3jWVbOSHgSLfyLc5DmP+KFDNwty4mEjC+Q== + dependencies: + debug "^4.3.4" + +esbuild-wasm@0.17.8: + version "0.17.8" + resolved "https://registry.yarnpkg.com/esbuild-wasm/-/esbuild-wasm-0.17.8.tgz#c2348306430c27613ee3cc9a955cdd54df29137a" + integrity sha512-zCmpxv95E0FuCmvdw1K836UHnj4EdiQnFfjTby35y3LAjRPtXMj3sbHDRHjbD8Mqg5lTwq3knacr/1qIFU51CQ== esbuild-wasm@>=0.13.8: - version "0.15.6" - resolved "https://registry.yarnpkg.com/esbuild-wasm/-/esbuild-wasm-0.15.6.tgz#e2360b3eb35c48ea7cdf4adfcd080ee203e7c3d8" - integrity sha512-UiRz1VyslE+xq+1zcij439+pZaqCe8xGDtCzNfo+1jH8ciofyg5A4zwlOOF3JLdNORe/W8ZwY8sJeQsD34dDFQ== - -esbuild-windows-32@0.15.5: - version "0.15.5" - resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.15.5.tgz#0670326903f421424be86bc03b7f7b3ff86a9db7" - integrity sha512-e+duNED9UBop7Vnlap6XKedA/53lIi12xv2ebeNS4gFmu7aKyTrok7DPIZyU5w/ftHD4MUDs5PJUkQPP9xJRzg== - -esbuild-windows-32@0.15.6: - version "0.15.6" - resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.15.6.tgz#9ddcd56e3c4fb9729a218c713c4e76bdbc1678b4" - integrity sha512-pBqdOsKqCD5LRYiwF29PJRDJZi7/Wgkz46u3d17MRFmrLFcAZDke3nbdDa1c8YgY78RiemudfCeAemN8EBlIpA== - -esbuild-windows-64@0.15.5: - version "0.15.5" - resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.15.5.tgz#64f32acb7341f3f0a4d10e8ff1998c2d1ebfc0a9" - integrity sha512-v+PjvNtSASHOjPDMIai9Yi+aP+Vwox+3WVdg2JB8N9aivJ7lyhp4NVU+J0MV2OkWFPnVO8AE/7xH+72ibUUEnw== - -esbuild-windows-64@0.15.6: - version "0.15.6" - resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.15.6.tgz#1eaadeadfd995e9d065d35cb3e9f02607202f339" - integrity sha512-KpPOh4aTOo//g9Pk2oVAzXMpc9Sz9n5A9sZTmWqDSXCiiachfFhbuFlsKBGATYCVitXfmBIJ4nNYYWSOdz4hQg== - -esbuild-windows-arm64@0.15.5: - version "0.15.5" - resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.5.tgz#4fe7f333ce22a922906b10233c62171673a3854b" - integrity sha512-Yz8w/D8CUPYstvVQujByu6mlf48lKmXkq6bkeSZZxTA626efQOJb26aDGLzmFWx6eg/FwrXgt6SZs9V8Pwy/aA== - -esbuild-windows-arm64@0.15.6: - version "0.15.6" - resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.6.tgz#e18a778d354fc2ca2306688f3fedad8a3e57819e" - integrity sha512-DB3G2x9OvFEa00jV+OkDBYpufq5x/K7a6VW6E2iM896DG4ZnAvJKQksOsCPiM1DUaa+DrijXAQ/ZOcKAqf/3Hg== - -esbuild@0.15.5: - version "0.15.5" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.15.5.tgz#5effd05666f621d4ff2fe2c76a67c198292193ff" - integrity sha512-VSf6S1QVqvxfIsSKb3UKr3VhUCis7wgDbtF4Vd9z84UJr05/Sp2fRKmzC+CSPG/dNAPPJZ0BTBLTT1Fhd6N9Gg== + version "0.17.18" + resolved "https://registry.yarnpkg.com/esbuild-wasm/-/esbuild-wasm-0.17.18.tgz#4d922c509eccfc33f7969c880a520e5e665681ef" + integrity sha512-h4m5zVa+KaDuRFIbH9dokMwovvkIjTQJS7/Ry+0Z1paVuS9aIkso2vdA2GmwH9GSvGX6w71WveJ3PfkoLuWaRw== + +esbuild@0.17.8: + version "0.17.8" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.17.8.tgz#f7f799abc7cdce3f0f2e3e0c01f120d4d55193b4" + integrity sha512-g24ybC3fWhZddZK6R3uD2iF/RIPnRpwJAqLov6ouX3hMbY4+tKolP0VMF3zuIYCaXun+yHwS5IPQ91N2BT191g== optionalDependencies: - "@esbuild/linux-loong64" "0.15.5" - esbuild-android-64 "0.15.5" - esbuild-android-arm64 "0.15.5" - esbuild-darwin-64 "0.15.5" - esbuild-darwin-arm64 "0.15.5" - esbuild-freebsd-64 "0.15.5" - esbuild-freebsd-arm64 "0.15.5" - esbuild-linux-32 "0.15.5" - esbuild-linux-64 "0.15.5" - esbuild-linux-arm "0.15.5" - esbuild-linux-arm64 "0.15.5" - esbuild-linux-mips64le "0.15.5" - esbuild-linux-ppc64le "0.15.5" - esbuild-linux-riscv64 "0.15.5" - esbuild-linux-s390x "0.15.5" - esbuild-netbsd-64 "0.15.5" - esbuild-openbsd-64 "0.15.5" - esbuild-sunos-64 "0.15.5" - esbuild-windows-32 "0.15.5" - esbuild-windows-64 "0.15.5" - esbuild-windows-arm64 "0.15.5" - -esbuild@>=0.13.8: - version "0.15.6" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.15.6.tgz#626e5941b98de506b862047be3c4b33f89278923" - integrity sha512-sgLOv3l4xklvXzzczhRwKRotyrfyZ2i1fCS6PTOLPd9wevDPArGU8HFtHrHCOcsMwTjLjzGm15gvC8uxVzQf+w== + "@esbuild/android-arm" "0.17.8" + "@esbuild/android-arm64" "0.17.8" + "@esbuild/android-x64" "0.17.8" + "@esbuild/darwin-arm64" "0.17.8" + "@esbuild/darwin-x64" "0.17.8" + "@esbuild/freebsd-arm64" "0.17.8" + "@esbuild/freebsd-x64" "0.17.8" + "@esbuild/linux-arm" "0.17.8" + "@esbuild/linux-arm64" "0.17.8" + "@esbuild/linux-ia32" "0.17.8" + "@esbuild/linux-loong64" "0.17.8" + "@esbuild/linux-mips64el" "0.17.8" + "@esbuild/linux-ppc64" "0.17.8" + "@esbuild/linux-riscv64" "0.17.8" + "@esbuild/linux-s390x" "0.17.8" + "@esbuild/linux-x64" "0.17.8" + "@esbuild/netbsd-x64" "0.17.8" + "@esbuild/openbsd-x64" "0.17.8" + "@esbuild/sunos-x64" "0.17.8" + "@esbuild/win32-arm64" "0.17.8" + "@esbuild/win32-ia32" "0.17.8" + "@esbuild/win32-x64" "0.17.8" + +esbuild@>=0.13.8, esbuild@^0.17.0: + version "0.17.18" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.17.18.tgz#f4f8eb6d77384d68cd71c53eb6601c7efe05e746" + integrity sha512-z1lix43jBs6UKjcZVKOw2xx69ffE2aG0PygLL5qJ9OS/gy0Ewd1gW/PUQIOIQGXBHWNywSc0floSKoMFF8aK2w== optionalDependencies: - "@esbuild/linux-loong64" "0.15.6" - esbuild-android-64 "0.15.6" - esbuild-android-arm64 "0.15.6" - esbuild-darwin-64 "0.15.6" - esbuild-darwin-arm64 "0.15.6" - esbuild-freebsd-64 "0.15.6" - esbuild-freebsd-arm64 "0.15.6" - esbuild-linux-32 "0.15.6" - esbuild-linux-64 "0.15.6" - esbuild-linux-arm "0.15.6" - esbuild-linux-arm64 "0.15.6" - esbuild-linux-mips64le "0.15.6" - esbuild-linux-ppc64le "0.15.6" - esbuild-linux-riscv64 "0.15.6" - esbuild-linux-s390x "0.15.6" - esbuild-netbsd-64 "0.15.6" - esbuild-openbsd-64 "0.15.6" - esbuild-sunos-64 "0.15.6" - esbuild-windows-32 "0.15.6" - esbuild-windows-64 "0.15.6" - esbuild-windows-arm64 "0.15.6" + "@esbuild/android-arm" "0.17.18" + "@esbuild/android-arm64" "0.17.18" + "@esbuild/android-x64" "0.17.18" + "@esbuild/darwin-arm64" "0.17.18" + "@esbuild/darwin-x64" "0.17.18" + "@esbuild/freebsd-arm64" "0.17.18" + "@esbuild/freebsd-x64" "0.17.18" + "@esbuild/linux-arm" "0.17.18" + "@esbuild/linux-arm64" "0.17.18" + "@esbuild/linux-ia32" "0.17.18" + "@esbuild/linux-loong64" "0.17.18" + "@esbuild/linux-mips64el" "0.17.18" + "@esbuild/linux-ppc64" "0.17.18" + "@esbuild/linux-riscv64" "0.17.18" + "@esbuild/linux-s390x" "0.17.18" + "@esbuild/linux-x64" "0.17.18" + "@esbuild/netbsd-x64" "0.17.18" + "@esbuild/openbsd-x64" "0.17.18" + "@esbuild/sunos-x64" "0.17.18" + "@esbuild/win32-arm64" "0.17.18" + "@esbuild/win32-ia32" "0.17.18" + "@esbuild/win32-x64" "0.17.18" escalade@^3.1.1: version "3.1.1" @@ -9847,26 +8925,26 @@ escodegen@^2.0.0: optionalDependencies: source-map "~0.6.1" -eslint-config-prettier@8.3.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz#f7471b20b6fe8a9a9254cc684454202886a2dd7a" - integrity sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew== +eslint-config-prettier@8.6.0: + version "8.6.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.6.0.tgz#dec1d29ab728f4fa63061774e1672ac4e363d207" + integrity sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA== -eslint-import-resolver-node@^0.3.6: - version "0.3.6" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" - integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== +eslint-import-resolver-node@^0.3.7: + version "0.3.7" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz#83b375187d412324a1963d84fa664377a23eb4d7" + integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA== dependencies: debug "^3.2.7" - resolve "^1.20.0" + is-core-module "^2.11.0" + resolve "^1.22.1" -eslint-module-utils@^2.7.1: - version "2.7.3" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz#ad7e3a10552fdd0642e1e55292781bd6e34876ee" - integrity sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ== +eslint-module-utils@^2.7.4: + 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" - find-up "^2.1.0" eslint-plugin-cypress@2.12.1: version "2.12.1" @@ -9875,26 +8953,38 @@ eslint-plugin-cypress@2.12.1: dependencies: globals "^11.12.0" -eslint-plugin-import@2.25.3: - version "2.25.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.25.3.tgz#a554b5f66e08fb4f6dc99221866e57cfff824766" - integrity sha512-RzAVbby+72IB3iOEL8clzPLzL3wpDrlwjsTBAQXgyp5SeTqqY+0bFubwuo+y/HLhNZcXV4XqTBO4LGsfyHIDXg== +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== dependencies: - array-includes "^3.1.4" - array.prototype.flat "^1.2.5" - debug "^2.6.9" + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + array.prototype.flatmap "^1.3.1" + debug "^3.2.7" doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.6" - eslint-module-utils "^2.7.1" + eslint-import-resolver-node "^0.3.7" + eslint-module-utils "^2.7.4" has "^1.0.3" - is-core-module "^2.8.0" + is-core-module "^2.11.0" is-glob "^4.0.3" - minimatch "^3.0.4" - object.values "^1.1.5" - resolve "^1.20.0" - tsconfig-paths "^3.11.0" + minimatch "^3.1.2" + object.values "^1.1.6" + resolve "^1.22.1" + semver "^6.3.0" + tsconfig-paths "^3.14.1" + +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== + dependencies: + "@storybook/csf" "^0.0.1" + "@typescript-eslint/utils" "^5.45.0" + requireindex "^1.1.0" + ts-dedent "^2.2.0" -eslint-scope@5.1.1, eslint-scope@^5.1.0, eslint-scope@^5.1.1: +eslint-scope@5.1.1, eslint-scope@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== @@ -9910,10 +9000,10 @@ eslint-scope@^4.0.3: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-scope@^7.1.0: - version "7.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" - integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== +eslint-scope@^7.0.0, eslint-scope@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.0.tgz#f21ebdafda02352f103634b96dd47d9f81ca117b" + integrity sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw== dependencies: esrecurse "^4.3.0" estraverse "^5.2.0" @@ -9942,54 +9032,55 @@ eslint-visitor-keys@^2.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== -eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.1.0, eslint-visitor-keys@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" - integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== - -eslint@8.3.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.3.0.tgz#a3c2409507403c1c7f6c42926111d6cbefbc3e85" - integrity sha512-aIay56Ph6RxOTC7xyr59Kt3ewX185SaGnAr8eWukoPLeriCrvGjvAubxuvaXOfsxhtwV5g0uBOsyhAom4qJdww== - dependencies: - "@eslint/eslintrc" "^1.0.4" - "@humanwhocodes/config-array" "^0.6.0" +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz#c22c48f48942d08ca824cc526211ae400478a994" + integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== + +eslint@8.33.0: + version "8.33.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.33.0.tgz#02f110f32998cb598c6461f24f4d306e41ca33d7" + integrity sha512-WjOpFQgKK8VrCnAtl8We0SUOy/oVZ5NHykyMiagV1M9r8IFpIJX7DduK6n1mpfhlG7T1NLWm2SuD8QB7KFySaA== + dependencies: + "@eslint/eslintrc" "^1.4.1" + "@humanwhocodes/config-array" "^0.11.8" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" debug "^4.3.2" doctrine "^3.0.0" - enquirer "^2.3.5" escape-string-regexp "^4.0.0" - eslint-scope "^7.1.0" + eslint-scope "^7.1.1" eslint-utils "^3.0.0" - eslint-visitor-keys "^3.1.0" - espree "^9.1.0" + eslint-visitor-keys "^3.3.0" + espree "^9.4.0" esquery "^1.4.0" esutils "^2.0.2" fast-deep-equal "^3.1.3" file-entry-cache "^6.0.1" - functional-red-black-tree "^1.0.1" - glob-parent "^6.0.1" - globals "^13.6.0" - ignore "^4.0.6" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + grapheme-splitter "^1.0.4" + 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.0.4" + minimatch "^3.1.2" natural-compare "^1.4.0" optionator "^0.9.1" - progress "^2.0.0" regexpp "^3.2.0" - semver "^7.2.1" strip-ansi "^6.0.1" strip-json-comments "^3.1.0" text-table "^0.2.0" - v8-compile-cache "^2.0.3" eslint@^5.0.0: version "5.16.0" @@ -10042,24 +9133,24 @@ espree@^5.0.1: acorn-jsx "^5.0.0" eslint-visitor-keys "^1.0.0" -espree@^9.1.0, espree@^9.3.2: - version "9.3.2" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.2.tgz#f58f77bd334731182801ced3380a8cc859091596" - integrity sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA== +espree@^9.4.0: + version "9.5.2" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.5.2.tgz#e994e7dc33a082a7a82dceaf12883a829353215b" + integrity sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw== dependencies: - acorn "^8.7.1" + acorn "^8.8.0" acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.3.0" + eslint-visitor-keys "^3.4.1" -esprima@^4.0.0, esprima@^4.0.1: +esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: version "4.0.1" 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: - version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" - integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + 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" @@ -10101,33 +9192,20 @@ eventemitter-asyncresource@^1.0.0: integrity sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ== eventemitter2@^6.4.2: - version "6.4.5" - resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.5.tgz#97380f758ae24ac15df8353e0cc27f8b95644655" - integrity sha512-bXE7Dyc1i6oQElDG0jMRZJrRAn9QR2xyyFGmBdZleNmyQX0FqGYmhZIrIrpPfm/w//LTo4tVQGOGQcGCb5q9uw== + version "6.4.9" + resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.9.tgz#41f2750781b4230ed58827bc119d293471ecb125" + integrity sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg== eventemitter3@^4.0.0: version "4.0.7" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== -events@^3.0.0, events@^3.2.0: +events@^3.2.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" - integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - -exec-sh@^0.3.2: - version "0.3.6" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.6.tgz#ff264f9e325519a60cb5e273692943483cca63bc" - integrity sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w== - execa@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" @@ -10201,25 +9279,62 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" -expect@^28.0.0, expect@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/expect/-/expect-28.1.3.tgz#90a7c1a124f1824133dd4533cce2d2bdcb6603ec" - integrity sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g== +expect@^29.0.0, expect@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.5.0.tgz#68c0509156cb2a0adb8865d413b137eeaae682f7" + integrity sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg== + dependencies: + "@jest/expect-utils" "^29.5.0" + jest-get-type "^29.4.3" + jest-matcher-utils "^29.5.0" + jest-message-util "^29.5.0" + jest-util "^29.5.0" + +express@4.18.1: + version "4.18.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf" + integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q== dependencies: - "@jest/expect-utils" "^28.1.3" - jest-get-type "^28.0.2" - jest-matcher-utils "^28.1.3" - jest-message-util "^28.1.3" - jest-util "^28.1.3" + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.0" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.5.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.2.0" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.10.3" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" -express@4.18.1, express@^4.17.1, express@^4.17.3: - version "4.18.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf" - integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q== +express@^4.17.3: + version "4.18.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" + integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== dependencies: accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.20.0" + body-parser "1.20.1" content-disposition "0.5.4" content-type "~1.0.4" cookie "0.5.0" @@ -10238,7 +9353,7 @@ express@4.18.1, express@^4.17.1, express@^4.17.3: parseurl "~1.3.3" path-to-regexp "0.1.7" proxy-addr "~2.0.7" - qs "6.10.3" + qs "6.11.0" range-parser "~1.2.1" safe-buffer "5.2.1" send "0.18.0" @@ -10292,7 +9407,7 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" -extract-zip@^1.7.0: +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" integrity sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA== @@ -10340,10 +9455,10 @@ fast-glob@^2.2.6: merge2 "^1.2.3" micromatch "^3.1.10" -fast-glob@^3.2.11, fast-glob@^3.2.7, fast-glob@^3.2.9: - version "3.2.11" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" - integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== +fast-glob@^3.2.11, fast-glob@^3.2.12, fast-glob@^3.2.7, fast-glob@^3.2.9: + version "3.2.12" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -10351,7 +9466,7 @@ fast-glob@^3.2.11, fast-glob@^3.2.7, fast-glob@^3.2.9: merge2 "^1.3.0" micromatch "^4.0.4" -fast-json-stable-stringify@2.1.0, fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== @@ -10367,9 +9482,9 @@ fast-safe-stringify@2.1.1: integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== fast-text-encoding@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz#ec02ac8e01ab8a319af182dae2681213cfe9ce53" - integrity sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig== + version "1.0.6" + resolved "https://registry.yarnpkg.com/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz#0aa25f7f638222e3396d72bf936afcf1d42d6867" + integrity sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w== fastparse@^1.1.2: version "1.1.2" @@ -10377,19 +9492,12 @@ fastparse@^1.1.2: integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ== fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + version "1.15.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== dependencies: reusify "^1.0.4" -fault@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/fault/-/fault-1.0.4.tgz#eafcfc0a6d214fc94601e170df29954a4f842f13" - integrity sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA== - dependencies: - format "^0.2.0" - faye-websocket@^0.11.3: version "0.11.4" resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" @@ -10398,9 +9506,9 @@ faye-websocket@^0.11.3: websocket-driver ">=0.5.1" fb-watchman@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" - integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== + version "2.0.2" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== dependencies: bser "2.1.1" @@ -10412,14 +9520,9 @@ fd-slicer@~1.1.0: pend "~1.2.0" fetch-retry@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/fetch-retry/-/fetch-retry-5.0.2.tgz#4c55663a7c056cb45f182394e479464f0ff8f3e3" - integrity sha512-57Hmu+1kc6pKFUGVIobT7qw3NeAzY/uNN26bSevERLVvf6VGFR/ooDCOFBHMNDgAxBiU2YJq1D0vFzc6U1DcPw== - -figgy-pudding@^3.5.1: - version "3.5.2" - resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" - integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== + version "5.0.5" + resolved "https://registry.yarnpkg.com/fetch-retry/-/fetch-retry-5.0.5.tgz#61079b816b6651d88a022ebd45d51d83aa72b521" + integrity sha512-q9SvpKH5Ka6h7X2C6r1sP31pQoeDb3o6/R9cg21ahfPAqbIOkW9tus1dXfwYb6G6dOI4F7nVS4Q+LSssBGIz0A== figures@3.2.0, figures@^3.0.0: version "3.2.0" @@ -10465,19 +9568,14 @@ file-loader@^6.2.0: loader-utils "^2.0.0" schema-utils "^3.0.0" -file-system-cache@^1.0.5: - version "1.1.0" - resolved "https://registry.yarnpkg.com/file-system-cache/-/file-system-cache-1.1.0.tgz#984de17b976b75a77a27e08d6828137c1aa80fa1" - integrity sha512-IzF5MBq+5CR0jXx5RxPe4BICl/oEhBSXKaL9fLhAXrIfIUS77Hr4vzrYyqYMHN6uTt+BOqi3fDCTjjEBCjERKw== +file-system-cache@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/file-system-cache/-/file-system-cache-2.1.1.tgz#25bb4019f7d62b458f4bed45452b638e41f6412b" + integrity sha512-vgZ1uDsK29DM4pptUOv47zdJO2tYM5M/ERyAE9Jk0QBN6e64Md+a+xJSOp68dCCDH4niFMVD8nC8n8A5ic0bmg== dependencies: - fs-extra "^10.1.0" + fs-extra "^11.1.0" ramda "^0.28.0" -file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" - integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== - file@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/file/-/file-0.2.2.tgz#c3dfd8f8cf3535ae455c2b423c2e52635d76b4d3" @@ -10520,7 +9618,7 @@ finalhandler@1.2.0: statuses "2.0.1" unpipe "~1.0.0" -find-cache-dir@^2.0.0, find-cache-dir@^2.1.0: +find-cache-dir@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== @@ -10529,7 +9627,7 @@ find-cache-dir@^2.0.0, find-cache-dir@^2.1.0: make-dir "^2.0.0" pkg-dir "^3.0.0" -find-cache-dir@^3.3.1: +find-cache-dir@^3.0.0, find-cache-dir@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== @@ -10548,21 +9646,6 @@ find-root@^1.0.0: resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - integrity sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA== - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - -find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== - dependencies: - locate-path "^2.0.0" - find-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" @@ -10614,33 +9697,40 @@ flatted@^2.0.0: integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== flatted@^3.1.0: - version "3.2.5" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3" - integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg== - -flush-write-stream@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" - integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== - dependencies: - inherits "^2.0.3" - readable-stream "^2.3.6" + version "3.2.7" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== -follow-redirects@^1.0.0, follow-redirects@^1.14.0: - version "1.15.1" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5" - integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== +flow-parser@0.*: + version "0.205.1" + resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.205.1.tgz#337464aaf027b00b2514610386cf21a5f7c94137" + integrity sha512-+RF/e1Et6ZX2I/UG7SGAz3Z8+ulj9xKYLu5AD7Wi8H2llzncU8ZpdKfLR50pPvj4g2a/FbZWkXYL7qHc+zXJNA== -follow-redirects@^1.15.0: +follow-redirects@^1.0.0, follow-redirects@^1.14.0, follow-redirects@^1.15.0: version "1.15.2" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + 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" + integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -10664,37 +9754,23 @@ fork-ts-checker-webpack-plugin@7.2.13: semver "^7.3.5" tapable "^2.2.1" -fork-ts-checker-webpack-plugin@^4.1.6: - version "4.1.6" - resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz#5055c703febcf37fa06405d400c122b905167fc5" - integrity sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw== - dependencies: - "@babel/code-frame" "^7.5.5" - chalk "^2.4.1" - micromatch "^3.1.10" - minimatch "^3.0.4" - semver "^5.6.0" - tapable "^1.0.0" - worker-rpc "^0.1.0" - -fork-ts-checker-webpack-plugin@^6.0.4: - version "6.5.2" - resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz#4f67183f2f9eb8ba7df7177ce3cf3e75cdafb340" - integrity sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA== +fork-ts-checker-webpack-plugin@^7.2.8: + version "7.3.0" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.3.0.tgz#a9c984a018493962360d7c7e77a67b44a2d5f3aa" + integrity sha512-IN+XTzusCjR5VgntYFgxbxVx3WraPRnKehBFrf00cMSrtUuW9MsG9dhL6MWpY6MkjC3wVwoujfCDgZZCQwbswA== dependencies: - "@babel/code-frame" "^7.8.3" - "@types/json-schema" "^7.0.5" - chalk "^4.1.0" - chokidar "^3.4.2" - cosmiconfig "^6.0.0" + "@babel/code-frame" "^7.16.7" + chalk "^4.1.2" + chokidar "^3.5.3" + cosmiconfig "^7.0.1" deepmerge "^4.2.2" - fs-extra "^9.0.0" - glob "^7.1.6" - memfs "^3.1.2" + fs-extra "^10.0.0" + memfs "^3.4.1" minimatch "^3.0.4" - schema-utils "2.7.0" - semver "^7.3.2" - tapable "^1.0.0" + node-abort-controller "^3.0.1" + schema-utils "^3.1.1" + semver "^7.3.5" + tapable "^2.2.1" form-data@^3.0.0: version "3.0.1" @@ -10723,11 +9799,6 @@ form-data@~2.3.2: combined-stream "^1.0.6" mime-types "^2.1.12" -format@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" - integrity sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww== - forwarded@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" @@ -10750,20 +9821,12 @@ fresh@0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== -from2@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - integrity sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g== - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.0" - fs-constants@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== -fs-extra@10.1.0, fs-extra@^10.0.0, fs-extra@^10.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" integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== @@ -10772,7 +9835,16 @@ fs-extra@10.1.0, fs-extra@^10.0.0, fs-extra@^10.1.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@^9.0.0, fs-extra@^9.0.1: +fs-extra@^11.1.0: + version "11.1.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.1.tgz#da69f7c39f3b002378b0954bb6ae7efdc0876e2d" + integrity sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^9.0.1: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== @@ -10789,35 +9861,24 @@ fs-minipass@^2.0.0, fs-minipass@^2.1.0: dependencies: minipass "^3.0.0" -fs-monkey@1.0.3: +fs-minipass@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-3.0.2.tgz#5b383858efa8c1eb8c33b39e994f7e8555b8b3a3" + integrity sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g== + dependencies: + minipass "^5.0.0" + +fs-monkey@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== -fs-write-stream-atomic@^1.0.8: - version "1.0.10" - resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" - integrity sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA== - dependencies: - graceful-fs "^4.1.2" - iferr "^0.1.5" - imurmurhash "^0.1.4" - readable-stream "1 || 2" - fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@^1.2.7: - version "1.2.13" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" - integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== - dependencies: - bindings "^1.5.0" - nan "^2.12.1" - -fsevents@^2.1.2, fsevents@^2.3.2, fsevents@~2.3.2: +fsevents@^2.3.2, fsevents@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== @@ -10827,7 +9888,7 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -function.prototype.name@^1.1.0, function.prototype.name@^1.1.5: +function.prototype.name@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== @@ -10842,7 +9903,7 @@ functional-red-black-tree@^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.2: +functions-have-names@^1.2.2, 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" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== @@ -10895,7 +9956,7 @@ gcp-metadata@^4.2.0: gaxios "^4.0.0" json-bigint "^1.0.0" -gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: +gensync@^1.0.0-beta.2: version "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== @@ -10910,15 +9971,20 @@ get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598" - integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" + integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== dependencies: function-bind "^1.1.1" has "^1.0.3" has-symbols "^1.0.3" +get-npm-tarball-url@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/get-npm-tarball-url/-/get-npm-tarball-url-2.0.3.tgz#67dff908d699e9e2182530ae6e939a93e5f8dfdb" + integrity sha512-R/PW6RqyaBQNWYaSyfrh54/qtcnOp22FHCCiRhSSZj0FP3KQWCsxxt0DzIdVTbwTqe9CtQfvl/FPD4UIPt4pqw== + get-package-type@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" @@ -10929,11 +9995,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-stdin@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" - integrity sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw== - get-stream@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" @@ -10980,10 +10041,23 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" +giget@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/giget/-/giget-1.1.2.tgz#f99a49cb0ff85479c8c3612cdc7ca27f2066e818" + integrity sha512-HsLoS07HiQ5oqvObOI+Qb2tyZH4Gj5nYGfF9qQcZNrPw+uEFhdXtgJr01aO2pWadGHucajYDLxxbtQkm97ON2A== + dependencies: + colorette "^2.0.19" + defu "^6.1.2" + https-proxy-agent "^5.0.1" + mri "^1.2.0" + node-fetch-native "^1.0.2" + pathe "^1.1.0" + tar "^6.1.13" + github-slugger@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.4.0.tgz#206eb96cdb22ee56fdc53a28d5a302338463444e" - integrity sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ== + version "1.5.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" @@ -11000,19 +10074,19 @@ glob-parent@^5.1.2, glob-parent@~5.1.2: dependencies: is-glob "^4.0.1" -glob-parent@^6.0.1: +glob-parent@^6.0.1, glob-parent@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: is-glob "^4.0.3" -glob-promise@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/glob-promise/-/glob-promise-3.4.0.tgz#b6b8f084504216f702dc2ce8c9bc9ac8866fdb20" - integrity sha512-q08RJ6O+eJn+dVanerAndJwIcumgbDdYiUT7zFQl3Wm1xD6fBKtah7H8ZJChj4wP+8C+QfeVy8xautR7rdmKEw== +glob-promise@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-promise/-/glob-promise-6.0.2.tgz#7c7f2a223e3aaa8f7bd7ff5f24d0ab2352724b31" + integrity sha512-Ni2aDyD1ekD6x8/+K4hDriRDbzzfuK4yKpqSymJ4P7IxbtARiOOuU+k40kbHM0sLIlbf1Qh0qdMkAHMZYE6XJQ== dependencies: - "@types/glob" "*" + "@types/glob" "^8.0.0" glob-to-regexp@^0.3.0: version "0.3.0" @@ -11036,10 +10110,10 @@ glob@7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" -glob@8.0.3, glob@^8.0.1: - version "8.0.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-8.0.3.tgz#415c6eb2deed9e502c68fa44a272e6da6eeca42e" - integrity sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ== +glob@8.1.0, glob@^8.0.1, glob@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -11047,7 +10121,18 @@ glob@8.0.3, glob@^8.0.1: minimatch "^5.0.1" once "^1.3.0" -glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: +glob@^10.2.2: + version "10.2.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.2.2.tgz#ce2468727de7e035e8ecf684669dc74d0526ab75" + integrity sha512-Xsa0BcxIC6th9UwNjZkhrMtNo/MnyRL8jGCP+uEwhA5oFOCY1f2s1/oNKY47xQ0Bg5nkjsfAEIej1VeH62bDDQ== + dependencies: + foreground-child "^3.1.0" + jackspeak "^2.0.3" + minimatch "^9.0.0" + minipass "^5.0.0" + path-scurry "^1.7.0" + +glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -11066,34 +10151,26 @@ global-dirs@^2.0.1: dependencies: ini "1.3.7" -global@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" - integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== - dependencies: - min-document "^2.19.0" - process "^0.11.10" - globals@^11.1.0, globals@^11.12.0, globals@^11.7.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== -globals@^13.15.0, globals@^13.6.0: - version "13.15.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.15.0.tgz#38113218c907d2f7e98658af246cef8b77e90bac" - integrity sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog== +globals@^13.19.0: + version "13.20.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" + integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== dependencies: type-fest "^0.20.2" -globalthis@^1.0.0: +globalthis@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== dependencies: define-properties "^1.1.3" -globby@^11.0.2, globby@^11.0.4, globby@^11.1.0: +globby@^11.0.1, globby@^11.0.2, globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== @@ -11118,9 +10195,9 @@ globby@^12.0.2: slash "^4.0.0" globby@^13.1.1: - version "13.1.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.2.tgz#29047105582427ab6eca4f905200667b056da515" - integrity sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ== + version "13.1.4" + resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.4.tgz#2f91c116066bcec152465ba36e5caa4a13c01317" + integrity sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g== dependencies: dir-glob "^3.0.1" fast-glob "^3.2.11" @@ -11128,7 +10205,7 @@ globby@^13.1.1: merge2 "^1.4.1" slash "^4.0.0" -globby@^9.0.0, globby@^9.2.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== @@ -11180,17 +10257,22 @@ google-spreadsheet@3.2.0: google-auth-library "^6.1.3" lodash "^4.17.21" -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== - -graphlib@^2.1.8: - version "2.1.8" - resolved "https://registry.yarnpkg.com/graphlib/-/graphlib-2.1.8.tgz#5761d414737870084c92ec7b5dbcb0592c9d35da" - integrity sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A== +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== dependencies: - lodash "^4.17.15" + get-intrinsic "^1.1.3" + +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: + version "4.2.11" + 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== gtoken@^5.0.4: version "5.3.2" @@ -11201,6 +10283,18 @@ gtoken@^5.0.4: google-p12-pem "^3.1.3" jws "^4.0.0" +gunzip-maybe@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/gunzip-maybe/-/gunzip-maybe-1.4.2.tgz#b913564ae3be0eda6f3de36464837a9cd94b98ac" + integrity sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw== + dependencies: + browserify-zlib "^0.1.4" + is-deflate "^1.0.0" + is-gzip "^1.0.0" + peek-stream "^1.1.0" + pumpify "^1.3.3" + through2 "^2.0.3" + handle-thing@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" @@ -11245,13 +10339,6 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-glob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-glob/-/has-glob-1.0.0.tgz#9aaa9eedbffb1ba3990a7b0010fb678ee0081207" - integrity sha512-D+8A457fBShSEI3tFCj65PAbT++5sKiFtdCdOam0gnfBgw9D277OERk+HM9qYJXmdVLZ/znez10SqHN0BBQ50g== - dependencies: - is-glob "^3.0.0" - has-property-descriptors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" @@ -11259,7 +10346,12 @@ has-property-descriptors@^1.0.0: dependencies: get-intrinsic "^1.1.1" -has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== @@ -11314,15 +10406,6 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" -hash-base@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" - integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== - dependencies: - inherits "^2.0.4" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - hash.js@^1.0.0, hash.js@^1.0.3: version "1.1.7" resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" @@ -11331,74 +10414,6 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.1" -hast-to-hyperscript@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz#9b67fd188e4c81e8ad66f803855334173920218d" - integrity sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA== - dependencies: - "@types/unist" "^2.0.3" - comma-separated-tokens "^1.0.0" - property-information "^5.3.0" - space-separated-tokens "^1.0.0" - style-to-object "^0.3.0" - unist-util-is "^4.0.0" - web-namespaces "^1.0.0" - -hast-util-from-parse5@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz#554e34abdeea25ac76f5bd950a1f0180e0b3bc2a" - integrity sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA== - dependencies: - "@types/parse5" "^5.0.0" - hastscript "^6.0.0" - property-information "^5.0.0" - vfile "^4.0.0" - vfile-location "^3.2.0" - web-namespaces "^1.0.0" - -hast-util-parse-selector@^2.0.0: - version "2.2.5" - resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a" - integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== - -hast-util-raw@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-6.0.1.tgz#973b15930b7529a7b66984c98148b46526885977" - integrity sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig== - dependencies: - "@types/hast" "^2.0.0" - hast-util-from-parse5 "^6.0.0" - hast-util-to-parse5 "^6.0.0" - html-void-elements "^1.0.0" - parse5 "^6.0.0" - unist-util-position "^3.0.0" - vfile "^4.0.0" - web-namespaces "^1.0.0" - xtend "^4.0.0" - zwitch "^1.0.0" - -hast-util-to-parse5@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz#1ec44650b631d72952066cea9b1445df699f8479" - integrity sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ== - dependencies: - hast-to-hyperscript "^9.0.0" - property-information "^5.0.0" - web-namespaces "^1.0.0" - xtend "^4.0.0" - zwitch "^1.0.0" - -hastscript@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-6.0.0.tgz#e8768d7eac56c3fdeac8a92830d58e811e5bf640" - integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w== - dependencies: - "@types/hast" "^2.0.0" - comma-separated-tokens "^1.0.0" - hast-util-parse-selector "^2.0.0" - property-information "^5.0.0" - space-separated-tokens "^1.0.0" - hdr-histogram-js@^2.0.1: version "2.0.3" resolved "https://registry.yarnpkg.com/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz#0b860534655722b6e3f3e7dca7b78867cf43dcb5" @@ -11418,10 +10433,15 @@ he@^1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -highlight.js@^10.4.1, highlight.js@~10.7.0: - version "10.7.3" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" - integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== +heap@^0.2.6: + version "0.2.7" + resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.7.tgz#1e6adf711d3f27ce35a81fe3b7bd576c2260a8fc" + integrity sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg== + +helmet@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/helmet/-/helmet-7.0.0.tgz#ac3011ba82fa2467f58075afa58a49427ba6212d" + integrity sha512-MsIgYmdBh460ZZ8cJC81q4XJknjG567wzEmv46WOBblDb6TUd3z8/GhgmsM9pn8g2B80tAJ4m5/d3Bi1KrSUBQ== hmac-drbg@^1.0.1: version "1.0.1" @@ -11437,10 +10457,10 @@ hosted-git-info@^2.1.4: resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== -hosted-git-info@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-5.0.0.tgz#df7a06678b4ebd722139786303db80fdf302ea56" - integrity sha512-rRnjWu0Bxj+nIfUOkz0695C0H6tRrN5iYIzYejb0tDEefe2AekHu/U5Kn9pEie5vsJqpNQU02az7TGSH3qpz4Q== +hosted-git-info@^6.0.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-6.1.1.tgz#629442c7889a69c05de604d52996b74fe6f26d58" + integrity sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w== dependencies: lru-cache "^7.5.1" @@ -11471,19 +10491,6 @@ html-escaper@^2.0.0: resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== -html-minifier-terser@^5.0.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#922e96f1f3bb60832c2634b79884096389b1f054" - integrity sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg== - dependencies: - camel-case "^4.1.1" - clean-css "^4.2.3" - commander "^4.1.1" - he "^1.2.0" - param-case "^3.0.3" - relateurl "^0.2.7" - terser "^4.6.3" - html-minifier-terser@^6.0.2: version "6.1.0" resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab" @@ -11497,30 +10504,10 @@ html-minifier-terser@^6.0.2: relateurl "^0.2.7" terser "^5.10.0" -html-void-elements@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-1.0.5.tgz#ce9159494e86d95e45795b166c2021c2cfca4483" - integrity sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w== - -html-webpack-plugin@^4.0.0: - version "4.5.2" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.5.2.tgz#76fc83fa1a0f12dd5f7da0404a54e2699666bc12" - integrity sha512-q5oYdzjKUIPQVjOosjgvCHQOv9Ett9CYYHlgvJeXG0qQvdSojnBq4vAdQBwn1+yGveAwHCoe/rMR86ozX3+c2A== - dependencies: - "@types/html-minifier-terser" "^5.0.0" - "@types/tapable" "^1.0.5" - "@types/webpack" "^4.41.8" - html-minifier-terser "^5.0.1" - loader-utils "^1.2.3" - lodash "^4.17.20" - pretty-error "^2.1.1" - tapable "^1.1.3" - util.promisify "1.0.0" - -html-webpack-plugin@^5.0.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz#c3911936f57681c1f9f4d8b68c158cd9dfe52f50" - integrity sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw== +html-webpack-plugin@^5.5.0: + version "5.5.1" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.5.1.tgz#826838e31b427f5f7f30971f8d8fa2422dfa6763" + integrity sha512-cTUzZ1+NqjGEKjmVgZKLMdiFg3m9MdRXkZW2OEe69WYVi5ONLMmlnSZdXzGGMOq0C8jGDrL6EWyEDDUioHO/pA== dependencies: "@types/html-minifier-terser" "^6.0.0" html-minifier-terser "^6.0.2" @@ -11538,10 +10525,20 @@ htmlparser2@^6.1.0: domutils "^2.5.2" entities "^2.0.0" -http-cache-semantics@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" - integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== +htmlparser2@^8.0.1: + version "8.0.2" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21" + integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.0.1" + entities "^4.4.0" + +http-cache-semantics@^4.1.0, http-cache-semantics@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== http-deceiver@^1.2.7: version "1.2.7" @@ -11570,9 +10567,9 @@ http-errors@~1.6.2: statuses ">= 1.4.0 < 2" http-parser-js@>=0.5.1: - version "0.5.6" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.6.tgz#2e02406ab2df8af8a7abfba62e0da01c62b95afd" - integrity sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA== + version "0.5.8" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" + integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== http-proxy-agent@^5.0.0: version "5.0.0" @@ -11636,12 +10633,7 @@ http-status-codes@2.2.0: resolved "https://registry.yarnpkg.com/http-status-codes/-/http-status-codes-2.2.0.tgz#bb2efe63d941dfc2be18e15f703da525169622be" integrity sha512-feERVo9iWxvnejp3SEfm/+oNG517npqL2/PIA8ORjyOZjGC7TwCRQsZylciLS64i6pJ0wRYz3rkXLRwbtFa8Ng== -https-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" - integrity sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg== - -https-proxy-agent@5.0.1, https-proxy-agent@^5.0.0: +https-proxy-agent@5.0.1, https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== @@ -11649,6 +10641,14 @@ https-proxy-agent@5.0.1, https-proxy-agent@^5.0.0: agent-base "6" debug "4" +https-proxy-agent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz#702b71fb5520a132a66de1f67541d9e62154d82b" + integrity sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg== + dependencies: + agent-base "5" + debug "4" + human-signals@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" @@ -11666,7 +10666,7 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" -iconv-lite@0.4, iconv-lite@0.4.24, iconv-lite@^0.4.24: +iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -11680,18 +10680,16 @@ iconv-lite@0.6, iconv-lite@0.6.3, iconv-lite@^0.6.2, iconv-lite@^0.6.3: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" -icss-utils@^4.0.0, icss-utils@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" - integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== - dependencies: - postcss "^7.0.14" - icss-utils@^5.0.0, icss-utils@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== +idb@^7.0.2: + version "7.1.1" + resolved "https://registry.yarnpkg.com/idb/-/idb-7.1.1.tgz#d910ded866d32c7ced9befc5bfdf36f572ced72b" + integrity sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ== + identity-obj-proxy@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz#94d2bda96084453ef36fbc5aaec37e0f79f1fc14" @@ -11699,32 +10697,27 @@ identity-obj-proxy@3.0.0: dependencies: harmony-reflect "^1.4.6" -ieee754@^1.1.13, ieee754@^1.1.4: +ieee754@^1.1.13: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -iferr@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" - integrity sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA== - -ignore-walk@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-5.0.1.tgz#5f199e23e1288f518d90358d461387788a154776" - integrity sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw== +ignore-walk@^6.0.0: + version "6.0.3" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-6.0.3.tgz#0fcdb6decaccda35e308a7b0948645dd9523b7bb" + integrity sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA== dependencies: - minimatch "^5.0.1" + 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.8, ignore@^5.1.9, ignore@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" - integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== +ignore@^5.0.4, ignore@^5.1.9, ignore@^5.2.0: + version "5.2.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== image-size@~0.5.0: version "0.5.5" @@ -11732,9 +10725,9 @@ image-size@~0.5.0: integrity sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ== immutable@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.1.0.tgz#f795787f0db780183307b9eb2091fcac1f6fafef" - integrity sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ== + version "4.3.0" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.0.tgz#eb1738f14ffb39fd068b1dbe1296117484dd34be" + integrity sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg== import-fresh@^2.0.0: version "2.0.0" @@ -11844,13 +10837,6 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== -indent-string@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" - integrity sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg== - dependencies: - repeating "^2.0.0" - indent-string@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" @@ -11861,7 +10847,7 @@ indent-string@^4.0.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== -infer-owner@^1.0.3, infer-owner@^1.0.4: +infer-owner@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== @@ -11874,16 +10860,11 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -inherits@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" - integrity sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA== - inherits@2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" @@ -11894,15 +10875,10 @@ ini@1.3.7: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.7.tgz#a09363e1911972ea16d7a8851005d84cf09a9a84" integrity sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ== -ini@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ini/-/ini-3.0.0.tgz#2f6de95006923aa75feed8894f5686165adc08f1" - integrity sha512-TxYQaeNW/N8ymDvwAxPyRbhMBtnEwuvaTYpOQkFx1nSeusgezHniEc/l35Vo4iCq/mMiTJbpD7oYxN98hFlfmw== - -inline-style-parser@0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" - integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== +ini@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ini/-/ini-3.0.1.tgz#c76ec81007875bc44d544ff7a11a55d12294102d" + integrity sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ== inquirer@8.2.4: version "8.2.4" @@ -11944,12 +10920,12 @@ inquirer@^6.2.2: strip-ansi "^5.1.0" through "^2.3.6" -internal-slot@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" - integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== +internal-slot@^1.0.4, internal-slot@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" + integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== dependencies: - get-intrinsic "^1.1.0" + get-intrinsic "^1.2.0" has "^1.0.3" side-channel "^1.0.4" @@ -11958,45 +10934,38 @@ internal-slot@^1.0.3: resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009" integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== -interpret@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" - integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== +interpret@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== 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@5.5.1: - version "5.5.1" - resolved "https://registry.yarnpkg.com/ionicons/-/ionicons-5.5.1.tgz#c337b2a0871c18910dea5c72384b0f0a393abf15" - integrity sha512-1auVisfaXmkmxINer8Q3kJGHP1vSxk86hf7By95eJ+Av9+oBcNuAEBfSe3jaMaGRVxVw8U/2j23MFq7R3c0HPg== +ionicons@7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/ionicons/-/ionicons-7.1.0.tgz#25daa91345acedcb0f4fb7da670f5aff2e1f266a" + integrity sha512-iE4GuEdEHARJpp0sWL7WJZCzNCf5VxpNRhAjW0fLnZPnNL5qZOJUcfup2Z2Ty7Jk8Q5hacrHfGEB1lCwOdXqGg== dependencies: - "@stencil/core" "^2.5.0" + "@stencil/core" "^2.18.0" -ioredis@^4.28.5: - version "4.28.5" - resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-4.28.5.tgz#5c149e6a8d76a7f8fa8a504ffc85b7d5b6797f9f" - integrity sha512-3GYo0GJtLqgNXj4YhrisLaNNvWSNwSS2wS4OELGfGxH8I69+XfNdnmV1AyN+ZqMh0i7eX+SWjrwFKDBDgfBC1A== +ioredis@^5.0.0: + version "5.3.2" + resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-5.3.2.tgz#9139f596f62fc9c72d873353ac5395bcf05709f7" + integrity sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA== dependencies: + "@ioredis/commands" "^1.1.1" cluster-key-slot "^1.1.0" - debug "^4.3.1" - denque "^1.1.0" + debug "^4.3.4" + denque "^2.1.0" lodash.defaults "^4.2.0" - lodash.flatten "^4.4.0" lodash.isarguments "^3.1.0" - p-map "^2.1.0" - redis-commands "1.7.0" redis-errors "^1.2.0" redis-parser "^3.0.0" standard-as-callback "^2.1.0" -ip@^1.1.5: - version "1.1.8" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.8.tgz#ae05948f6b075435ed3307acce04629da8cdbf48" - integrity sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg== - ip@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" @@ -12031,20 +11000,7 @@ is-accessor-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" -is-alphabetical@1.0.4, is-alphabetical@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" - integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== - -is-alphanumerical@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" - integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== - dependencies: - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" - -is-arguments@^1.1.0: +is-arguments@^1.0.4, is-arguments@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== @@ -12052,6 +11008,15 @@ is-arguments@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + is-typed-array "^1.1.10" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -12069,13 +11034,6 @@ is-bigint@^1.0.1: dependencies: has-bigints "^1.0.1" -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - integrity sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q== - dependencies: - binary-extensions "^1.0.0" - is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" @@ -12096,22 +11054,17 @@ is-buffer@^1.1.5: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-buffer@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" - integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== - is-builtin-module@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.1.0.tgz#6fdb24313b1c03b75f8b9711c0feb8c30b903b00" - integrity sha512-OV7JjAgOTfAFJmHZLvpSTb4qi0nIILDV1gWPYDnDJUTNFM5aGlRAhk4QcT8i7TuAleeEV5Fdkqn3t4mS+Q11fg== + 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.0.0" + builtin-modules "^3.3.0" -is-callable@^1.1.4, is-callable@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" - integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== +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" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== is-ci@^2.0.0: version "2.0.0" @@ -12120,10 +11073,10 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" -is-core-module@^2.8.0, is-core-module@^2.8.1, is-core-module@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" - integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== +is-core-module@^2.11.0, is-core-module@^2.8.1, is-core-module@^2.9.0: + version "2.12.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.0.tgz#36ad62f6f73c8253fd6472517a12483cf03e7ec4" + integrity sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ== dependencies: has "^1.0.3" @@ -12141,17 +11094,17 @@ is-data-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" -is-date-object@^1.0.1: +is-date-object@^1.0.1, is-date-object@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== dependencies: has-tostringtag "^1.0.0" -is-decimal@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" - integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== +is-deflate@^1.0.0: + version "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" @@ -12181,14 +11134,6 @@ is-docker@^2.0.0, is-docker@^2.1.1: resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== -is-dom@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-dom/-/is-dom-1.1.0.tgz#af1fced292742443bb59ca3f76ab5e80907b4e8a" - integrity sha512-u82f6mvhYxRPKpw8V1N0W8ce1xXwOrQtgGcxl6UCL5zBmZu3is/18K0rR7uFCnMDuAsS/3W54mGL4vsaFUQlEQ== - dependencies: - is-object "^1.0.1" - is-window "^1.0.2" - 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" @@ -12206,11 +11151,6 @@ is-extglob@^2.1.0, is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== -is-finite@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" - integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== - is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" @@ -12228,17 +11168,19 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-function@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" - integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== - is-generator-fn@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== -is-glob@^3.0.0, is-glob@^3.1.0: +is-generator-function@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + 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== @@ -12252,10 +11194,10 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" -is-hexadecimal@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" - integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== +is-gzip@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-gzip/-/is-gzip-1.0.0.tgz#6ca8b07b99c77998025900e555ced8ed80879a83" + integrity sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ== is-installed-globally@^0.3.2: version "0.3.2" @@ -12275,11 +11217,19 @@ is-lambda@^1.0.1: resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== -is-map@^2.0.2: +is-map@^2.0.1, is-map@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== +is-nan@^1.2.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.3.2.tgz#043a54adea31748b55b6cd4e09aadafa69bd9e1d" + integrity sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + is-negative-zero@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" @@ -12304,11 +11254,6 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-object@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf" - integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA== - is-observable@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-1.1.0.tgz#b3e986c8f44de950867cab5403f5a3465005975e" @@ -12316,16 +11261,16 @@ is-observable@^1.1.0: dependencies: symbol-observable "^1.1.0" -is-path-inside@^3.0.1: +is-path-cwd@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + +is-path-inside@^3.0.1, is-path-inside@^3.0.2, is-path-inside@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== -is-plain-obj@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - is-plain-obj@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" @@ -12348,7 +11293,7 @@ is-promise@^2.1.0: resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== -is-regex@^1.1.2, is-regex@^1.1.4: +is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== @@ -12356,7 +11301,7 @@ is-regex@^1.1.2, is-regex@^1.1.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-set@^2.0.2: +is-set@^2.0.1, is-set@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== @@ -12392,7 +11337,18 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" -is-typedarray@^1.0.0, is-typedarray@~1.0.0: +is-typed-array@^1.1.10, is-typed-array@^1.1.3, is-typed-array@^1.1.9: + version "1.1.10" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" + integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + +is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== @@ -12402,10 +11358,10 @@ is-unicode-supported@^0.1.0: resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== -is-utf8@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - integrity sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q== +is-weakmap@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" + integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== is-weakref@^1.0.2: version "1.0.2" @@ -12414,36 +11370,24 @@ is-weakref@^1.0.2: dependencies: call-bind "^1.0.2" +is-weakset@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" + integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + is-what@^3.14.1: version "3.14.1" resolved "https://registry.yarnpkg.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1" integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA== -is-whitespace-character@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7" - integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w== - -is-window@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-window/-/is-window-1.0.2.tgz#2c896ca53db97de45d3c33133a65d8c9f563480d" - integrity sha512-uj00kdXyZb9t9RcAUAwMZAnkBUwdYGhYlt7djMXhfyhUCzwNba50tIiBKR7q0l7tdoBtFVw/3JmLY6fI3rmZmg== - 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-word-character@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.4.tgz#ce0e73216f98599060592f62ff31354ddbeb0230" - integrity sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA== - -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" @@ -12451,7 +11395,7 @@ is-wsl@^2.1.1, is-wsl@^2.2.0: dependencies: is-docker "^2.0.0" -isarray@1.0.0, isarray@^1.0.0, isarray@~1.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== @@ -12483,11 +11427,6 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== -isobject@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-4.0.0.tgz#3f1c9155e73b192022a80819bacd0343711697b0" - integrity sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA== - isomorphic-unfetch@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz#87341d5f4f7b63843d468438128cb087b7c3e98f" @@ -12507,9 +11446,9 @@ istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz#31d18bdd127f825dd02ea7bfdfd906f8ab840e9f" - integrity sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A== + version "5.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== dependencies: "@babel/core" "^7.12.3" "@babel/parser" "^7.14.7" @@ -12536,9 +11475,9 @@ istanbul-lib-source-maps@^4.0.0: source-map "^0.6.1" istanbul-reports@^3.1.3: - version "3.1.4" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.4.tgz#1b6f068ecbc6c331040aab5741991273e609e40c" - integrity sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw== + version "3.1.5" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" + integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" @@ -12548,18 +11487,14 @@ iterare@1.2.1: resolved "https://registry.yarnpkg.com/iterare/-/iterare-1.2.1.tgz#139c400ff7363690e33abffa33cbba8920f00042" integrity sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q== -iterate-iterator@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/iterate-iterator/-/iterate-iterator-1.0.2.tgz#551b804c9eaa15b847ea6a7cdc2f5bf1ec150f91" - integrity sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw== - -iterate-value@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/iterate-value/-/iterate-value-1.0.2.tgz#935115bd37d006a52046535ebc8d07e9c9337f57" - integrity sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ== +jackspeak@^2.0.3: + version "2.2.0" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.2.0.tgz#497cbaedc902ec3f31d5d61be804d2364ff9ddad" + integrity sha512-r5XBrqIJfwRIjRt/Xr5fv9Wh09qyhHfKnYddDlpM+ibRR20qrYActpCAgU6U+d53EOEjzkvxPMVHSlgR7leXrQ== dependencies: - es-get-iterator "^1.0.2" - iterate-iterator "^1.0.1" + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" jake@^10.8.5: version "10.8.5" @@ -12571,496 +11506,389 @@ jake@^10.8.5: filelist "^1.0.1" minimatch "^3.0.4" -jest-changed-files@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-28.1.3.tgz#d9aeee6792be3686c47cb988a8eaf82ff4238831" - integrity sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA== +jest-changed-files@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.5.0.tgz#e88786dca8bf2aa899ec4af7644e16d9dcf9b23e" + integrity sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag== dependencies: execa "^5.0.0" p-limit "^3.1.0" -jest-circus@^28.1.1, jest-circus@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-28.1.3.tgz#d14bd11cf8ee1a03d69902dc47b6bd4634ee00e4" - integrity sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow== +jest-circus@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.5.0.tgz#b5926989449e75bff0d59944bae083c9d7fb7317" + integrity sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA== dependencies: - "@jest/environment" "^28.1.3" - "@jest/expect" "^28.1.3" - "@jest/test-result" "^28.1.3" - "@jest/types" "^28.1.3" + "@jest/environment" "^29.5.0" + "@jest/expect" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/types" "^29.5.0" "@types/node" "*" chalk "^4.0.0" co "^4.6.0" dedent "^0.7.0" is-generator-fn "^2.0.0" - jest-each "^28.1.3" - jest-matcher-utils "^28.1.3" - jest-message-util "^28.1.3" - jest-runtime "^28.1.3" - jest-snapshot "^28.1.3" - jest-util "^28.1.3" + jest-each "^29.5.0" + jest-matcher-utils "^29.5.0" + jest-message-util "^29.5.0" + jest-runtime "^29.5.0" + jest-snapshot "^29.5.0" + jest-util "^29.5.0" p-limit "^3.1.0" - pretty-format "^28.1.3" + pretty-format "^29.5.0" + pure-rand "^6.0.0" slash "^3.0.0" stack-utils "^2.0.3" -jest-cli@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-28.1.3.tgz#558b33c577d06de55087b8448d373b9f654e46b2" - integrity sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ== +jest-cli@^29.4.3: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.5.0.tgz#b34c20a6d35968f3ee47a7437ff8e53e086b4a67" + integrity sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw== dependencies: - "@jest/core" "^28.1.3" - "@jest/test-result" "^28.1.3" - "@jest/types" "^28.1.3" + "@jest/core" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/types" "^29.5.0" chalk "^4.0.0" exit "^0.1.2" graceful-fs "^4.2.9" import-local "^3.0.2" - jest-config "^28.1.3" - jest-util "^28.1.3" - jest-validate "^28.1.3" + jest-config "^29.5.0" + jest-util "^29.5.0" + jest-validate "^29.5.0" prompts "^2.0.1" yargs "^17.3.1" -jest-config@28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-28.1.1.tgz#e90b97b984f14a6c24a221859e81b258990fce2f" - integrity sha512-tASynMhS+jVV85zKvjfbJ8nUyJS/jUSYZ5KQxLUN2ZCvcQc/OmhQl2j6VEL3ezQkNofxn5pQ3SPYWPHb0unTZA== - dependencies: - "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^28.1.1" - "@jest/types" "^28.1.1" - babel-jest "^28.1.1" - chalk "^4.0.0" - ci-info "^3.2.0" - deepmerge "^4.2.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-circus "^28.1.1" - jest-environment-node "^28.1.1" - jest-get-type "^28.0.2" - jest-regex-util "^28.0.2" - jest-resolve "^28.1.1" - jest-runner "^28.1.1" - jest-util "^28.1.1" - jest-validate "^28.1.1" - micromatch "^4.0.4" - parse-json "^5.2.0" - pretty-format "^28.1.1" - slash "^3.0.0" - strip-json-comments "^3.1.1" - -jest-config@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-28.1.3.tgz#e315e1f73df3cac31447eed8b8740a477392ec60" - integrity sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ== +jest-config@^29.4.1, jest-config@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.5.0.tgz#3cc972faec8c8aaea9ae158c694541b79f3748da" + integrity sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA== dependencies: "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^28.1.3" - "@jest/types" "^28.1.3" - babel-jest "^28.1.3" + "@jest/test-sequencer" "^29.5.0" + "@jest/types" "^29.5.0" + babel-jest "^29.5.0" chalk "^4.0.0" ci-info "^3.2.0" deepmerge "^4.2.2" glob "^7.1.3" graceful-fs "^4.2.9" - jest-circus "^28.1.3" - jest-environment-node "^28.1.3" - jest-get-type "^28.0.2" - jest-regex-util "^28.0.2" - jest-resolve "^28.1.3" - jest-runner "^28.1.3" - jest-util "^28.1.3" - jest-validate "^28.1.3" + jest-circus "^29.5.0" + jest-environment-node "^29.5.0" + jest-get-type "^29.4.3" + jest-regex-util "^29.4.3" + jest-resolve "^29.5.0" + jest-runner "^29.5.0" + jest-util "^29.5.0" + jest-validate "^29.5.0" micromatch "^4.0.4" parse-json "^5.2.0" - pretty-format "^28.1.3" + pretty-format "^29.5.0" slash "^3.0.0" strip-json-comments "^3.1.1" -jest-diff@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-28.1.3.tgz#948a192d86f4e7a64c5264ad4da4877133d8792f" - integrity sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw== +jest-diff@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.5.0.tgz#e0d83a58eb5451dcc1fa61b1c3ee4e8f5a290d63" + integrity sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw== dependencies: chalk "^4.0.0" - diff-sequences "^28.1.1" - jest-get-type "^28.0.2" - pretty-format "^28.1.3" + diff-sequences "^29.4.3" + jest-get-type "^29.4.3" + pretty-format "^29.5.0" -jest-docblock@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-28.1.1.tgz#6f515c3bf841516d82ecd57a62eed9204c2f42a8" - integrity sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA== +jest-docblock@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.4.3.tgz#90505aa89514a1c7dceeac1123df79e414636ea8" + integrity sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg== dependencies: detect-newline "^3.0.0" -jest-each@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-28.1.3.tgz#bdd1516edbe2b1f3569cfdad9acd543040028f81" - integrity sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g== +jest-each@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.5.0.tgz#fc6e7014f83eac68e22b7195598de8554c2e5c06" + integrity sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA== dependencies: - "@jest/types" "^28.1.3" + "@jest/types" "^29.5.0" chalk "^4.0.0" - jest-get-type "^28.0.2" - jest-util "^28.1.3" - pretty-format "^28.1.3" - -jest-environment-jsdom@28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-28.1.1.tgz#8bd721915b32f9b196723292c4461a0ad548b55b" - integrity sha512-41ZvgSoPNcKG5q3LuuOcAczdBxRq9DbZkPe24okN6ZCmiZdAfFtPg3z+lOtsT1fM6OAERApKT+3m0MRDQH2zIA== - dependencies: - "@jest/environment" "^28.1.1" - "@jest/fake-timers" "^28.1.1" - "@jest/types" "^28.1.1" - "@types/jsdom" "^16.2.4" + jest-get-type "^29.4.3" + jest-util "^29.5.0" + pretty-format "^29.5.0" + +jest-environment-jsdom@29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-29.4.3.tgz#bd8ed3808e6d3f616403fbaf8354f77019613d90" + integrity sha512-rFjf8JXrw3OjUzzmSE5l0XjMj0/MSVEUMCSXBGPDkfwb1T03HZI7iJSL0cGctZApPSyJxbjyKDVxkZuyhHkuTw== + dependencies: + "@jest/environment" "^29.4.3" + "@jest/fake-timers" "^29.4.3" + "@jest/types" "^29.4.3" + "@types/jsdom" "^20.0.0" "@types/node" "*" - jest-mock "^28.1.1" - jest-util "^28.1.1" - jsdom "^19.0.0" - -jest-environment-jsdom@^28.0.0: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-28.1.3.tgz#2d4e5d61b7f1d94c3bddfbb21f0308ee506c09fb" - integrity sha512-HnlGUmZRdxfCByd3GM2F100DgQOajUBzEitjGqIREcb45kGjZvRrKUdlaF6escXBdcXNl0OBh+1ZrfeZT3GnAg== - dependencies: - "@jest/environment" "^28.1.3" - "@jest/fake-timers" "^28.1.3" - "@jest/types" "^28.1.3" - "@types/jsdom" "^16.2.4" + jest-mock "^29.4.3" + jest-util "^29.4.3" + jsdom "^20.0.0" + +jest-environment-jsdom@^29.0.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-29.5.0.tgz#cfe86ebaf1453f3297b5ff3470fbe94739c960cb" + integrity sha512-/KG8yEK4aN8ak56yFVdqFDzKNHgF4BAymCx2LbPNPsUshUlfAl0eX402Xm1pt+eoG9SLZEUVifqXtX8SK74KCw== + dependencies: + "@jest/environment" "^29.5.0" + "@jest/fake-timers" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/jsdom" "^20.0.0" "@types/node" "*" - jest-mock "^28.1.3" - jest-util "^28.1.3" - jsdom "^19.0.0" - -jest-environment-node@^28.1.1, jest-environment-node@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-28.1.3.tgz#7e74fe40eb645b9d56c0c4b70ca4357faa349be5" - integrity sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A== - dependencies: - "@jest/environment" "^28.1.3" - "@jest/fake-timers" "^28.1.3" - "@jest/types" "^28.1.3" + jest-mock "^29.5.0" + jest-util "^29.5.0" + jsdom "^20.0.0" + +jest-environment-node@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.5.0.tgz#f17219d0f0cc0e68e0727c58b792c040e332c967" + integrity sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw== + dependencies: + "@jest/environment" "^29.5.0" + "@jest/fake-timers" "^29.5.0" + "@jest/types" "^29.5.0" "@types/node" "*" - jest-mock "^28.1.3" - jest-util "^28.1.3" - -jest-get-type@^28.0.2: - version "28.0.2" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-28.0.2.tgz#34622e628e4fdcd793d46db8a242227901fcf203" - integrity sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA== + jest-mock "^29.5.0" + jest-util "^29.5.0" -jest-haste-map@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.6.2.tgz#dd7e60fe7dc0e9f911a23d79c5ff7fb5c2cafeaa" - integrity sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w== - dependencies: - "@jest/types" "^26.6.2" - "@types/graceful-fs" "^4.1.2" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.4" - jest-regex-util "^26.0.0" - jest-serializer "^26.6.2" - jest-util "^26.6.2" - jest-worker "^26.6.2" - micromatch "^4.0.2" - sane "^4.0.3" - walker "^1.0.7" - optionalDependencies: - fsevents "^2.1.2" +jest-get-type@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.4.3.tgz#1ab7a5207c995161100b5187159ca82dd48b3dd5" + integrity sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg== -jest-haste-map@^28.1.1, jest-haste-map@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-28.1.3.tgz#abd5451129a38d9841049644f34b034308944e2b" - integrity sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA== +jest-haste-map@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.5.0.tgz#69bd67dc9012d6e2723f20a945099e972b2e94de" + integrity sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA== dependencies: - "@jest/types" "^28.1.3" + "@jest/types" "^29.5.0" "@types/graceful-fs" "^4.1.3" "@types/node" "*" anymatch "^3.0.3" fb-watchman "^2.0.0" graceful-fs "^4.2.9" - jest-regex-util "^28.0.2" - jest-util "^28.1.3" - jest-worker "^28.1.3" + jest-regex-util "^29.4.3" + jest-util "^29.5.0" + jest-worker "^29.5.0" micromatch "^4.0.4" walker "^1.0.8" optionalDependencies: fsevents "^2.3.2" -jest-leak-detector@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz#a6685d9b074be99e3adee816ce84fd30795e654d" - integrity sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA== +jest-leak-detector@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz#cf4bdea9615c72bac4a3a7ba7e7930f9c0610c8c" + integrity sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow== dependencies: - jest-get-type "^28.0.2" - pretty-format "^28.1.3" + jest-get-type "^29.4.3" + pretty-format "^29.5.0" -jest-matcher-utils@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz#5a77f1c129dd5ba3b4d7fc20728806c78893146e" - integrity sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw== +jest-matcher-utils@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz#d957af7f8c0692c5453666705621ad4abc2c59c5" + integrity sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw== dependencies: chalk "^4.0.0" - jest-diff "^28.1.3" - jest-get-type "^28.0.2" - pretty-format "^28.1.3" + jest-diff "^29.5.0" + jest-get-type "^29.4.3" + pretty-format "^29.5.0" -jest-message-util@^28.1.1, jest-message-util@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-28.1.3.tgz#232def7f2e333f1eecc90649b5b94b0055e7c43d" - integrity sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g== +jest-message-util@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.5.0.tgz#1f776cac3aca332ab8dd2e3b41625435085c900e" + integrity sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA== dependencies: "@babel/code-frame" "^7.12.13" - "@jest/types" "^28.1.3" + "@jest/types" "^29.5.0" "@types/stack-utils" "^2.0.0" chalk "^4.0.0" graceful-fs "^4.2.9" micromatch "^4.0.4" - pretty-format "^28.1.3" + pretty-format "^29.5.0" slash "^3.0.0" stack-utils "^2.0.3" -jest-mock@^28.1.1, jest-mock@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-28.1.3.tgz#d4e9b1fc838bea595c77ab73672ebf513ab249da" - integrity sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA== +jest-mock@^29.4.3, jest-mock@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.5.0.tgz#26e2172bcc71d8b0195081ff1f146ac7e1518aed" + integrity sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw== dependencies: - "@jest/types" "^28.1.3" + "@jest/types" "^29.5.0" "@types/node" "*" + jest-util "^29.5.0" jest-pnp-resolver@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" - integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== + version "1.2.3" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" + integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== -jest-preset-angular@12.2.2: - version "12.2.2" - resolved "https://registry.yarnpkg.com/jest-preset-angular/-/jest-preset-angular-12.2.2.tgz#f7414e15e165e34efdc4fd8404a19e8e4856441e" - integrity sha512-aj5ZwVW6cGGzZKUn6e/jDwFgQh6FHy1zCCXWOeqFCuM3WODrbdUJ93zKrex18e9K1+PvOcP0e20yKbj3gwhfFg== +jest-preset-angular@13.0.0: + version "13.0.0" + resolved "https://registry.yarnpkg.com/jest-preset-angular/-/jest-preset-angular-13.0.0.tgz#8427926052711a31b09aa20b67ec0d409e2c4f8a" + integrity sha512-FNaWL41PgW3yvleB423pf1Z7xqaDaFMJxi2TwUek9J1p3SHT1Se+A2jeOI27XcC16zj87blUuffh/Smse2Grpg== dependencies: bs-logger "^0.2.6" esbuild-wasm ">=0.13.8" - jest-environment-jsdom "^28.0.0" - pretty-format "^28.0.0" - ts-jest "^28.0.0" + jest-environment-jsdom "^29.0.0" + jest-util "^29.0.0" + pretty-format "^29.0.0" + ts-jest "^29.0.0" optionalDependencies: esbuild ">=0.13.8" -jest-regex-util@^26.0.0: - version "26.0.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28" - integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A== - -jest-regex-util@^28.0.2: - version "28.0.2" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-28.0.2.tgz#afdc377a3b25fb6e80825adcf76c854e5bf47ead" - integrity sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw== - -jest-resolve-dependencies@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.3.tgz#8c65d7583460df7275c6ea2791901fa975c1fe66" - integrity sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA== - dependencies: - jest-regex-util "^28.0.2" - jest-snapshot "^28.1.3" +jest-regex-util@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.4.3.tgz#a42616141e0cae052cfa32c169945d00c0aa0bb8" + integrity sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg== -jest-resolve@28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-28.1.1.tgz#bc2eaf384abdcc1aaf3ba7c50d1adf01e59095e5" - integrity sha512-/d1UbyUkf9nvsgdBildLe6LAD4DalgkgZcKd0nZ8XUGPyA/7fsnaQIlKVnDiuUXv/IeZhPEDrRJubVSulxrShA== +jest-resolve-dependencies@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz#f0ea29955996f49788bf70996052aa98e7befee4" + integrity sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg== dependencies: - chalk "^4.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^28.1.1" - jest-pnp-resolver "^1.2.2" - jest-util "^28.1.1" - jest-validate "^28.1.1" - resolve "^1.20.0" - resolve.exports "^1.1.0" - slash "^3.0.0" + jest-regex-util "^29.4.3" + jest-snapshot "^29.5.0" -jest-resolve@^28.1.1, jest-resolve@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-28.1.3.tgz#cfb36100341ddbb061ec781426b3c31eb51aa0a8" - integrity sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ== +jest-resolve@^29.4.1, jest-resolve@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.5.0.tgz#b053cc95ad1d5f6327f0ac8aae9f98795475ecdc" + integrity sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w== dependencies: chalk "^4.0.0" graceful-fs "^4.2.9" - jest-haste-map "^28.1.3" + jest-haste-map "^29.5.0" jest-pnp-resolver "^1.2.2" - jest-util "^28.1.3" - jest-validate "^28.1.3" + jest-util "^29.5.0" + jest-validate "^29.5.0" resolve "^1.20.0" - resolve.exports "^1.1.0" + resolve.exports "^2.0.0" slash "^3.0.0" -jest-runner@^28.1.1, jest-runner@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-28.1.3.tgz#5eee25febd730b4713a2cdfd76bdd5557840f9a1" - integrity sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA== +jest-runner@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.5.0.tgz#6a57c282eb0ef749778d444c1d758c6a7693b6f8" + integrity sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ== dependencies: - "@jest/console" "^28.1.3" - "@jest/environment" "^28.1.3" - "@jest/test-result" "^28.1.3" - "@jest/transform" "^28.1.3" - "@jest/types" "^28.1.3" + "@jest/console" "^29.5.0" + "@jest/environment" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" "@types/node" "*" chalk "^4.0.0" - emittery "^0.10.2" + emittery "^0.13.1" graceful-fs "^4.2.9" - jest-docblock "^28.1.1" - jest-environment-node "^28.1.3" - jest-haste-map "^28.1.3" - jest-leak-detector "^28.1.3" - jest-message-util "^28.1.3" - jest-resolve "^28.1.3" - jest-runtime "^28.1.3" - jest-util "^28.1.3" - jest-watcher "^28.1.3" - jest-worker "^28.1.3" + jest-docblock "^29.4.3" + jest-environment-node "^29.5.0" + jest-haste-map "^29.5.0" + jest-leak-detector "^29.5.0" + jest-message-util "^29.5.0" + jest-resolve "^29.5.0" + jest-runtime "^29.5.0" + jest-util "^29.5.0" + jest-watcher "^29.5.0" + jest-worker "^29.5.0" p-limit "^3.1.0" source-map-support "0.5.13" -jest-runtime@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-28.1.3.tgz#a57643458235aa53e8ec7821949e728960d0605f" - integrity sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw== - dependencies: - "@jest/environment" "^28.1.3" - "@jest/fake-timers" "^28.1.3" - "@jest/globals" "^28.1.3" - "@jest/source-map" "^28.1.2" - "@jest/test-result" "^28.1.3" - "@jest/transform" "^28.1.3" - "@jest/types" "^28.1.3" +jest-runtime@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.5.0.tgz#c83f943ee0c1da7eb91fa181b0811ebd59b03420" + integrity sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw== + dependencies: + "@jest/environment" "^29.5.0" + "@jest/fake-timers" "^29.5.0" + "@jest/globals" "^29.5.0" + "@jest/source-map" "^29.4.3" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" chalk "^4.0.0" cjs-module-lexer "^1.0.0" collect-v8-coverage "^1.0.0" - execa "^5.0.0" glob "^7.1.3" graceful-fs "^4.2.9" - jest-haste-map "^28.1.3" - jest-message-util "^28.1.3" - jest-mock "^28.1.3" - jest-regex-util "^28.0.2" - jest-resolve "^28.1.3" - jest-snapshot "^28.1.3" - jest-util "^28.1.3" + jest-haste-map "^29.5.0" + jest-message-util "^29.5.0" + jest-mock "^29.5.0" + jest-regex-util "^29.4.3" + jest-resolve "^29.5.0" + jest-snapshot "^29.5.0" + jest-util "^29.5.0" slash "^3.0.0" strip-bom "^4.0.0" -jest-serializer@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-26.6.2.tgz#d139aafd46957d3a448f3a6cdabe2919ba0742d1" - integrity sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g== - dependencies: - "@types/node" "*" - graceful-fs "^4.2.4" - -jest-snapshot@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-28.1.3.tgz#17467b3ab8ddb81e2f605db05583d69388fc0668" - integrity sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg== +jest-snapshot@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.5.0.tgz#c9c1ce0331e5b63cd444e2f95a55a73b84b1e8ce" + integrity sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g== dependencies: "@babel/core" "^7.11.6" "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-jsx" "^7.7.2" "@babel/plugin-syntax-typescript" "^7.7.2" "@babel/traverse" "^7.7.2" "@babel/types" "^7.3.3" - "@jest/expect-utils" "^28.1.3" - "@jest/transform" "^28.1.3" - "@jest/types" "^28.1.3" + "@jest/expect-utils" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" "@types/babel__traverse" "^7.0.6" "@types/prettier" "^2.1.5" babel-preset-current-node-syntax "^1.0.0" chalk "^4.0.0" - expect "^28.1.3" + expect "^29.5.0" graceful-fs "^4.2.9" - jest-diff "^28.1.3" - jest-get-type "^28.0.2" - jest-haste-map "^28.1.3" - jest-matcher-utils "^28.1.3" - jest-message-util "^28.1.3" - jest-util "^28.1.3" + jest-diff "^29.5.0" + jest-get-type "^29.4.3" + jest-matcher-utils "^29.5.0" + jest-message-util "^29.5.0" + jest-util "^29.5.0" natural-compare "^1.4.0" - pretty-format "^28.1.3" + pretty-format "^29.5.0" semver "^7.3.5" -jest-util@28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-28.1.1.tgz#ff39e436a1aca397c0ab998db5a51ae2b7080d05" - integrity sha512-FktOu7ca1DZSyhPAxgxB6hfh2+9zMoJ7aEQA759Z6p45NuO8mWcqujH+UdHlCm/V6JTWwDztM2ITCzU1ijJAfw== - dependencies: - "@jest/types" "^28.1.1" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-util@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.6.2.tgz#907535dbe4d5a6cb4c47ac9b926f6af29576cbc1" - integrity sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q== - dependencies: - "@jest/types" "^26.6.2" - "@types/node" "*" - chalk "^4.0.0" - graceful-fs "^4.2.4" - is-ci "^2.0.0" - micromatch "^4.0.2" - -jest-util@^28.0.0, jest-util@^28.1.1, jest-util@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-28.1.3.tgz#f4f932aa0074f0679943220ff9cbba7e497028b0" - integrity sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ== +jest-util@^29.0.0, jest-util@^29.4.1, jest-util@^29.4.3, jest-util@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.5.0.tgz#24a4d3d92fc39ce90425311b23c27a6e0ef16b8f" + integrity sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ== dependencies: - "@jest/types" "^28.1.3" + "@jest/types" "^29.5.0" "@types/node" "*" chalk "^4.0.0" ci-info "^3.2.0" graceful-fs "^4.2.9" picomatch "^2.2.3" -jest-validate@^28.1.1, jest-validate@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-28.1.3.tgz#e322267fd5e7c64cea4629612c357bbda96229df" - integrity sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA== +jest-validate@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.5.0.tgz#8e5a8f36178d40e47138dc00866a5f3bd9916ffc" + integrity sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ== dependencies: - "@jest/types" "^28.1.3" + "@jest/types" "^29.5.0" camelcase "^6.2.0" chalk "^4.0.0" - jest-get-type "^28.0.2" + jest-get-type "^29.4.3" leven "^3.1.0" - pretty-format "^28.1.3" + pretty-format "^29.5.0" -jest-watcher@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-28.1.3.tgz#c6023a59ba2255e3b4c57179fc94164b3e73abd4" - integrity sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g== +jest-watcher@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.5.0.tgz#cf7f0f949828ba65ddbbb45c743a382a4d911363" + integrity sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA== dependencies: - "@jest/test-result" "^28.1.3" - "@jest/types" "^28.1.3" + "@jest/test-result" "^29.5.0" + "@jest/types" "^29.5.0" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" - emittery "^0.10.2" - jest-util "^28.1.3" + emittery "^0.13.1" + jest-util "^29.5.0" string-length "^4.0.1" -jest-worker@^26.5.0, jest-worker@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" - integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^7.0.0" - jest-worker@^27.0.2, jest-worker@^27.4.5: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" @@ -13070,40 +11898,41 @@ jest-worker@^27.0.2, jest-worker@^27.4.5: merge-stream "^2.0.0" supports-color "^8.0.0" -jest-worker@^28.1.1, jest-worker@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-28.1.3.tgz#7e3c4ce3fa23d1bb6accb169e7f396f98ed4bb98" - integrity sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g== +jest-worker@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.5.0.tgz#bdaefb06811bd3384d93f009755014d8acb4615d" + integrity sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA== dependencies: "@types/node" "*" + jest-util "^29.5.0" merge-stream "^2.0.0" supports-color "^8.0.0" -jest@28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest/-/jest-28.1.3.tgz#e9c6a7eecdebe3548ca2b18894a50f45b36dfc6b" - integrity sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA== +jest@29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.4.3.tgz#1b8be541666c6feb99990fd98adac4737e6e6386" + integrity sha512-XvK65feuEFGZT8OO0fB/QAQS+LGHvQpaadkH5p47/j3Ocqq3xf2pK9R+G0GzgfuhXVxEv76qCOOcMb5efLk6PA== dependencies: - "@jest/core" "^28.1.3" - "@jest/types" "^28.1.3" + "@jest/core" "^29.4.3" + "@jest/types" "^29.4.3" import-local "^3.0.2" - jest-cli "^28.1.3" + jest-cli "^29.4.3" js-levenshtein@~1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== +js-sdsl@^4.1.4: + version "4.4.0" + resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.0.tgz#8b437dbe642daa95760400b602378ed8ffea8430" + integrity sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg== + js-sha256@0.9.0, js-sha256@^0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.9.0.tgz#0b89ac166583e91ef9123644bd3c5334ce9d0966" integrity sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA== -js-string-escape@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef" - integrity sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg== - "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -13129,37 +11958,61 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== -jsdom@^19.0.0: - version "19.0.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-19.0.0.tgz#93e67c149fe26816d38a849ea30ac93677e16b6a" - integrity sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A== +jscodeshift@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/jscodeshift/-/jscodeshift-0.14.0.tgz#7542e6715d6d2e8bde0b4e883f0ccea358b46881" + integrity sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA== + dependencies: + "@babel/core" "^7.13.16" + "@babel/parser" "^7.13.16" + "@babel/plugin-proposal-class-properties" "^7.13.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.13.8" + "@babel/plugin-proposal-optional-chaining" "^7.13.12" + "@babel/plugin-transform-modules-commonjs" "^7.13.8" + "@babel/preset-flow" "^7.13.13" + "@babel/preset-typescript" "^7.13.0" + "@babel/register" "^7.13.16" + babel-core "^7.0.0-bridge.0" + chalk "^4.1.2" + flow-parser "0.*" + graceful-fs "^4.2.4" + micromatch "^4.0.4" + neo-async "^2.5.0" + node-dir "^0.1.17" + recast "^0.21.0" + temp "^0.8.4" + write-file-atomic "^2.3.0" + +jsdom@^20.0.0: + version "20.0.3" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-20.0.3.tgz#886a41ba1d4726f67a8858028c99489fed6ad4db" + integrity sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ== dependencies: - abab "^2.0.5" - acorn "^8.5.0" - acorn-globals "^6.0.0" + abab "^2.0.6" + acorn "^8.8.1" + acorn-globals "^7.0.0" cssom "^0.5.0" cssstyle "^2.3.0" - data-urls "^3.0.1" - decimal.js "^10.3.1" + data-urls "^3.0.2" + decimal.js "^10.4.2" domexception "^4.0.0" escodegen "^2.0.0" form-data "^4.0.0" html-encoding-sniffer "^3.0.0" http-proxy-agent "^5.0.0" - https-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.1" is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.0" - parse5 "6.0.1" - saxes "^5.0.1" + nwsapi "^2.2.2" + parse5 "^7.1.1" + saxes "^6.0.0" symbol-tree "^3.2.4" - tough-cookie "^4.0.0" - w3c-hr-time "^1.0.2" - w3c-xmlserializer "^3.0.0" + tough-cookie "^4.1.2" + w3c-xmlserializer "^4.0.0" webidl-conversions "^7.0.0" whatwg-encoding "^2.0.0" whatwg-mimetype "^3.0.0" - whatwg-url "^10.0.0" - ws "^8.2.3" + whatwg-url "^11.0.0" + ws "^8.11.0" xml-name-validator "^4.0.0" jsesc@^2.5.1: @@ -13179,7 +12032,7 @@ json-bigint@^1.0.0: dependencies: bignumber.js "^9.0.0" -json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: +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== @@ -13189,6 +12042,11 @@ json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== +json-parse-even-better-errors@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz#2cb2ee33069a78870a0c7e3da560026b89669cf7" + integrity sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA== + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -13221,27 +12079,17 @@ json-text-sequence@~0.1.0: dependencies: delimit-stream "0.1.0" -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== dependencies: minimist "^1.2.0" -json5@^2.1.2, json5@^2.1.3, json5@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" - integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== - -jsonc-parser@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.0.0.tgz#abdd785701c7e7eaca8a9ec8cf070ca51a745a22" - integrity sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA== - -jsonc-parser@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.1.0.tgz#73b8f0e5c940b83d03476bc2e51a20ef0932615d" - integrity sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg== +json5@^2.1.2, json5@^2.2.1, json5@^2.2.2, json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== jsonc-parser@3.2.0: version "3.2.0" @@ -13289,14 +12137,9 @@ jsprim@^2.0.2: verror "1.10.0" jsrsasign@^10.4.0: - version "10.5.24" - resolved "https://registry.yarnpkg.com/jsrsasign/-/jsrsasign-10.5.24.tgz#2d159e1756b2268682c6eb5e147184e33e946b1c" - integrity sha512-0i/UHRgJZifp/YmoXHyNQXUY4eKWiSd7YxuD7oKEw9mlqgr51hg9lZQw2nlEDvwHDh7pyj6ZjYlxldlW27xb/Q== - -junk@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/junk/-/junk-3.1.0.tgz#31499098d902b7e98c5d9b9c80f43457a88abfa1" - integrity sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ== + version "10.8.6" + resolved "https://registry.yarnpkg.com/jsrsasign/-/jsrsasign-10.8.6.tgz#ebf7f3c812c6517af84f0d8a10115e0dbfabe145" + integrity sha512-bQmbVtsfbgaKBTWCKiDCPlUPbdlRIK/FzSwT3BzIgZl/cU6TqXu6pZJsCI/dJVrZ9Gir5GC4woqw9shH/v7MBw== jwa@^1.4.1: version "1.4.1" @@ -13349,11 +12192,11 @@ karma-source-map-support@1.4.0: source-map-support "^0.5.5" katex@^0.16.0: - version "0.16.0" - resolved "https://registry.yarnpkg.com/katex/-/katex-0.16.0.tgz#4faff4c905aad0c6010e85901c4d9140efb80a5e" - integrity sha512-wPRB4iUPysfH97wTgG5/tRLYxmKVq6Q4jRAWRVOUxXB1dsiv4cvcNjqabHkrOvJHM1Bpk3WrgmllSO1vIvP24w== + version "0.16.7" + resolved "https://registry.yarnpkg.com/katex/-/katex-0.16.7.tgz#36be1d4ed96e8afdc5863407e70f8fb250aeafd5" + integrity sha512-Xk9C6oGKRwJTfqfIbtr0Kes9OSv6IFsuhFGc7tW4urlpMJtuh+7YhzU6YEG9n8gmWKcMAFzkp7nr+r69kV0zrA== dependencies: - commander "^8.0.0" + commander "^8.3.0" khroma@^2.0.0: version "2.0.0" @@ -13390,25 +12233,41 @@ kleur@^3.0.3: integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== klona@^2.0.4, klona@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc" - integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== + version "2.0.6" + resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.6.tgz#85bffbf819c03b2f53270412420a4555ef882e22" + integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA== + +launch-editor@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.6.0.tgz#4c0c1a6ac126c572bd9ff9a30da1d2cae66defd7" + integrity sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ== + dependencies: + picocolors "^1.0.0" + shell-quote "^1.7.3" + +layout-base@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/layout-base/-/layout-base-1.0.2.tgz#1291e296883c322a9dd4c5dd82063721b53e26e2" + integrity sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg== + +layout-base@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/layout-base/-/layout-base-2.0.1.tgz#d0337913586c90f9c2c075292069f5c2da5dd285" + integrity sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg== lazy-ass@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513" integrity sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw== -lazy-universal-dotenv@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lazy-universal-dotenv/-/lazy-universal-dotenv-3.0.1.tgz#a6c8938414bca426ab8c9463940da451a911db38" - integrity sha512-prXSYk799h3GY3iOWnC6ZigYzMPjxN2svgjJ9shk7oMadSNX3wXy0B6F32PMJv7qtMnrIbUxoEHzbutvxR2LBQ== +lazy-universal-dotenv@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/lazy-universal-dotenv/-/lazy-universal-dotenv-4.0.0.tgz#0b220c264e89a042a37181a4928cdd298af73422" + integrity sha512-aXpZJRnTkpK6gQ/z4nk+ZBLd/Qdp118cvPruLSIQzQNRhKwEcdXCOzXuF55VDqIiuAaY3UGZ10DJtvZzDcvsxg== dependencies: - "@babel/runtime" "^7.5.0" app-root-dir "^1.0.2" - core-js "^3.0.4" - dotenv "^8.0.0" - dotenv-expand "^5.1.0" + dotenv "^16.0.0" + dotenv-expand "^10.0.0" lcid@^2.0.0: version "2.0.0" @@ -13417,35 +12276,13 @@ lcid@^2.0.0: dependencies: invert-kv "^2.0.0" -less-loader@11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-11.0.0.tgz#a31b2bc5cdfb62f1c7de9b2d01cd944c22b1a024" - integrity sha512-9+LOWWjuoectIEx3zrfN83NAGxSUB5pWEabbbidVQVgZhN+wN68pOvuyirVlH1IK4VT1f3TmlyvAnCXh8O5KEw== - dependencies: - klona "^2.0.4" - -less-loader@^10.1.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-10.2.0.tgz#97286d8797dc3dc05b1d16b0ecec5f968bdd4e32" - integrity sha512-AV5KHWvCezW27GT90WATaDnfXBv99llDbtaj4bshq6DvAihMdNjaPDcUMa6EXKLRF+P2opFenJp89BXg91XLYg== +less-loader@11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-11.1.0.tgz#a452384259bdf8e4f6d5fdcc39543609e6313f82" + integrity sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug== dependencies: klona "^2.0.4" -less@3.12.2: - version "3.12.2" - resolved "https://registry.yarnpkg.com/less/-/less-3.12.2.tgz#157e6dd32a68869df8859314ad38e70211af3ab4" - integrity sha512-+1V2PCMFkL+OIj2/HrtrvZw0BC0sYLMICJfbQjuj/K8CEnlrFX6R5cKKgzzttsZDHyxQNL1jqMREjKN3ja/E3Q== - dependencies: - tslib "^1.10.0" - optionalDependencies: - errno "^0.1.1" - graceful-fs "^4.1.2" - image-size "~0.5.0" - make-dir "^2.1.0" - mime "^1.4.1" - native-request "^1.0.5" - source-map "~0.6.0" - less@4.1.3: version "4.1.3" resolved "https://registry.yarnpkg.com/less/-/less-4.1.3.tgz#175be9ddcbf9b250173e0a00b4d6920a5b770246" @@ -13484,10 +12321,10 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -libphonenumber-js@^1.9.7: - version "1.10.6" - resolved "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.10.6.tgz#a453efe9d692cc9457abb20a712dec34472a7164" - integrity sha512-CIjT100/SmntsUjsLVs2t3ufeN4KdNXUxhD07tH153pdbaCWuAjv0jK/gPuywR3IImB/U/MQM+x9RfhMs5XZiA== +libphonenumber-js@^1.10.14: + version "1.10.30" + resolved "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.10.30.tgz#c0559d6c58dc1a7f189b88b7b23354c98b182848" + integrity sha512-PLGc+xfrQrkya/YK2/5X+bPpxRmyJBHM+xxz9krUdSgk4Vs2ZwxX5/Ow0lv3r9PDlDtNWb4u+it8MY5rZ0IyGw== license-webpack-plugin@4.0.2, license-webpack-plugin@^4.0.2: version "4.0.2" @@ -13497,15 +12334,20 @@ license-webpack-plugin@4.0.2, license-webpack-plugin@^4.0.2: webpack-sources "^3.0.0" lilconfig@^2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.6.tgz#32a384558bd58af3d4c6e077dd1ad1d397bc69d4" - integrity sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg== + version "2.1.0" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== 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" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== +lines-and-columns@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-2.0.3.tgz#b2f0badedb556b747020ab8ea7f0373e22efac1b" + integrity sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w== + listr-silent-renderer@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" @@ -13550,67 +12392,25 @@ listr@^0.14.3: p-map "^2.0.0" rxjs "^6.3.3" -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - integrity sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A== - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" - -loader-runner@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" - integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== - loader-runner@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== -loader-utils@1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" - integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== - dependencies: - big.js "^5.2.2" - emojis-list "^2.0.0" - json5 "^1.0.1" - -loader-utils@3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.2.0.tgz#bcecc51a7898bee7473d4bc6b845b23af8304d4f" - integrity sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ== - -loader-utils@^1.2.3: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" - integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^1.0.1" +loader-utils@3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.2.1.tgz#4fb104b599daafd82ef3e1a41fb9265f87e1f576" + integrity sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw== -loader-utils@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.2.tgz#d6e3b4fb81870721ae4e0868ab11dd638368c129" - integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A== +loader-utils@^2.0.0, loader-utils@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" + integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== dependencies: big.js "^5.2.2" emojis-list "^3.0.0" json5 "^2.1.2" -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - locate-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" @@ -13633,6 +12433,11 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +lodash-es@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== + lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" @@ -13643,11 +12448,6 @@ lodash.defaults@^4.2.0: resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" integrity sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ== -lodash.flatten@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" - integrity sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g== - lodash.includes@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" @@ -13698,7 +12498,7 @@ lodash.once@^4.0.0, lodash.once@^4.1.1: resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== -lodash.uniq@4.5.0, lodash.uniq@^4.5.0: +lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== @@ -13739,14 +12539,6 @@ loose-envify@^1.1.0, loose-envify@^1.4.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" -loud-rejection@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" - integrity sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ== - dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.0" - lower-case@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" @@ -13754,14 +12546,6 @@ lower-case@^2.0.2: dependencies: tslib "^2.0.3" -lowlight@^1.17.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.20.0.tgz#ddb197d33462ad0d93bf19d17b6c301aa3941888" - integrity sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw== - dependencies: - fault "^1.0.0" - highlight.js "~10.7.0" - lru-cache@6.0.0, lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" @@ -13777,33 +12561,43 @@ lru-cache@^5.1.1: yallist "^3.0.2" lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1: - version "7.10.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.10.1.tgz#db577f42a94c168f676b638d15da8fb073448cab" - integrity sha512-BQuhQxPuRl79J5zSXRP+uNzPOyZw2oFI9JLRQ80XswSvg21KMKNtQza9eF42rfI/3Z40RvzBdXgziEkudzjo8A== + version "7.18.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" + integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== -luxon@^1.23.x, luxon@^1.28.0: - version "1.28.0" - resolved "https://registry.yarnpkg.com/luxon/-/luxon-1.28.0.tgz#e7f96daad3938c06a62de0fb027115d251251fbf" - integrity sha512-TfTiyvZhwBYM/7QdAVDh+7dBTBA29v4ik0Ce9zda3Mnf8on1S5KJI8P2jKFZ8+5C0jhmr0KwJEO/Wdpm0VeWJQ== +lru-cache@^9.0.0: + version "9.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-9.1.1.tgz#c58a93de58630b688de39ad04ef02ef26f1902f1" + integrity sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A== -magic-string@0.25.7: - version "0.25.7" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" - integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== +luxon@^1.23.x: + version "1.28.1" + resolved "https://registry.yarnpkg.com/luxon/-/luxon-1.28.1.tgz#528cdf3624a54506d710290a2341aa8e6e6c61b0" + integrity sha512-gYHAa180mKrNIUJCbwpmD0aTu9kV0dREDrwNnuyFAsO1Wt0EVYSZelPnJlbj9HplzXX/YWXHFTL45kvZ53M0pw== + +luxon@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.3.0.tgz#d73ab5b5d2b49a461c47cedbc7e73309b4805b48" + integrity sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg== + +magic-string@0.29.0: + version "0.29.0" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.29.0.tgz#f034f79f8c43dba4ae1730ffb5e8c4e084b16cf3" + integrity sha512-WcfidHrDjMY+eLjlU+8OvwREqHwpgCeKVBUpQ3OhYYuvfaYCUgcbuBzappNzZvg/v8onU3oQj+BYpkOJe9Iw4Q== dependencies: - sourcemap-codec "^1.4.4" + "@jridgewell/sourcemap-codec" "^1.4.13" -magic-string@0.26.1: - version "0.26.1" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.26.1.tgz#ba9b651354fa9512474199acecf9c6dbe93f97fd" - integrity sha512-ndThHmvgtieXe8J/VGPjG+Apu7v7ItcD5mhEIvOscWjPF/ccOiLxHaSuCAS2G+3x4GKsAbT8u7zdyamupui8Tg== +magic-string@^0.27.0: + version "0.27.0" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.27.0.tgz#e4a3413b4bab6d98d2becffd48b4a257effdbbf3" + integrity sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA== dependencies: - sourcemap-codec "^1.4.8" + "@jridgewell/sourcemap-codec" "^1.4.13" -magic-string@0.26.2, magic-string@^0.26.0, magic-string@~0.26.2: - version "0.26.2" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.26.2.tgz#5331700e4158cd6befda738bb6b0c7b93c0d4432" - integrity sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A== +magic-string@~0.26.2: + version "0.26.7" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.26.7.tgz#caf7daf61b34e9982f8228c4527474dac8981d6f" + integrity sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow== dependencies: sourcemap-codec "^1.4.8" @@ -13815,7 +12609,7 @@ make-dir@^2.0.0, make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" -make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: +make-dir@^3.0.0, make-dir@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== @@ -13828,9 +12622,9 @@ make-error@1.x, make-error@^1.1.1: integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== make-fetch-happen@^10.0.3: - version "10.2.0" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-10.2.0.tgz#0bde3914f2f82750b5d48c6d2294d2c74f985e5b" - integrity sha512-OnEfCLofQVJ5zgKwGk55GaqosqKjaR6khQlJY3dBAA+hM25Bc5CmX5rKUfVut+rYA3uidA7zb7AvcglU87rPRg== + version "10.2.1" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz#f5e3835c5e9817b617f2770870d9492d28678164" + integrity sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w== dependencies: agentkeepalive "^4.2.1" cacache "^16.1.0" @@ -13849,27 +12643,26 @@ make-fetch-happen@^10.0.3: socks-proxy-agent "^7.0.0" ssri "^9.0.0" -make-fetch-happen@^10.0.6: - version "10.1.7" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-10.1.7.tgz#b1402cb3c9fad92b380ff3a863cdae5414a42f76" - integrity sha512-J/2xa2+7zlIUKqfyXDCXFpH3ypxO4k3rgkZHPSZkyUYcBT/hM80M3oyKLM/9dVriZFiGeGGS2Ei+0v2zfhqj3Q== +make-fetch-happen@^11.0.0, make-fetch-happen@^11.0.1, make-fetch-happen@^11.1.0: + version "11.1.1" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz#85ceb98079584a9523d4bf71d32996e7e208549f" + integrity sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w== dependencies: agentkeepalive "^4.2.1" - cacache "^16.1.0" - http-cache-semantics "^4.1.0" + cacache "^17.0.0" + http-cache-semantics "^4.1.1" http-proxy-agent "^5.0.0" https-proxy-agent "^5.0.0" is-lambda "^1.0.1" lru-cache "^7.7.1" - minipass "^3.1.6" - minipass-collect "^1.0.2" - minipass-fetch "^2.0.3" + minipass "^5.0.0" + minipass-fetch "^3.0.0" minipass-flush "^1.0.5" minipass-pipeline "^1.2.4" negotiator "^0.6.3" promise-retry "^2.0.1" socks-proxy-agent "^7.0.0" - ssri "^9.0.0" + ssri "^10.0.0" makeerror@1.0.12: version "1.0.12" @@ -13878,7 +12671,7 @@ makeerror@1.0.12: dependencies: tmpl "1.0.5" -map-age-cleaner@^0.1.1, map-age-cleaner@^0.1.3: +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== @@ -13890,11 +12683,6 @@ map-cache@^0.2.2: resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== -map-obj@^1.0.0, map-obj@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== - 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" @@ -13907,31 +12695,15 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -markdown-escapes@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz#c95415ef451499d7602b91095f3c8e8975f78535" - integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg== - -marked@^4.0.17: - version "4.0.17" - resolved "https://registry.yarnpkg.com/marked/-/marked-4.0.17.tgz#1186193d85bb7882159cdcfc57d1dfccaffb3fe9" - integrity sha512-Wfk0ATOK5iPxM4ptrORkFemqroz0ZDxp5MWfYA7H/F+wO17NRWV5Ypxi6p3g2Xmw2bKeiYOl6oVnLHKxBA0VhA== - -md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" +markdown-to-jsx@^7.1.8: + version "7.2.0" + resolved "https://registry.yarnpkg.com/markdown-to-jsx/-/markdown-to-jsx-7.2.0.tgz#e7b46b65955f6a04d48a753acd55874a14bdda4b" + integrity sha512-3l4/Bigjm4bEqjCR6Xr+d4DtM1X6vvtGsMGSjJYyep8RjjIvcWtrXBS8Wbfe1/P+atKNMccpsraESIaWVplzVg== -mdast-squeeze-paragraphs@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz#7c4c114679c3bee27ef10b58e2e015be79f1ef97" - integrity sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ== - dependencies: - unist-util-remove "^2.0.0" +marked@4.2.12: + version "4.2.12" + resolved "https://registry.yarnpkg.com/marked/-/marked-4.2.12.tgz#d69a64e21d71b06250da995dcd065c11083bebb5" + integrity sha512-yr8hSKa3Fv4D3jdZmtMMPghgVt6TWbk86WQaWhDloQjRSQhMMYCAro7jP7VDJrjjdV8pxVxMssXS8B8Y5DZ5aw== mdast-util-definitions@^4.0.0: version "4.0.0" @@ -13940,20 +12712,6 @@ mdast-util-definitions@^4.0.0: dependencies: unist-util-visit "^2.0.0" -mdast-util-to-hast@10.0.1: - version "10.0.1" - resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz#0cfc82089494c52d46eb0e3edb7a4eb2aea021eb" - integrity sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA== - dependencies: - "@types/mdast" "^3.0.0" - "@types/unist" "^2.0.0" - mdast-util-definitions "^4.0.0" - mdurl "^1.0.0" - unist-builder "^2.0.0" - unist-util-generated "^1.0.0" - unist-util-position "^3.0.0" - unist-util-visit "^2.0.0" - mdast-util-to-string@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz#27055500103f51637bd07d01da01eb1967a43527" @@ -13964,11 +12722,6 @@ mdn-data@2.0.14: resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== -mdurl@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" - integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== - media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -13983,20 +12736,12 @@ mem@^4.0.0: mimic-fn "^2.0.0" p-is-promise "^2.0.0" -mem@^8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/mem/-/mem-8.1.1.tgz#cf118b357c65ab7b7e0817bdf00c8062297c0122" - integrity sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA== - dependencies: - map-age-cleaner "^0.1.3" - mimic-fn "^3.1.0" - -memfs@^3.1.2, memfs@^3.2.2, memfs@^3.4.1, memfs@^3.4.3: - version "3.4.4" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.4.tgz#e8973cd8060548916adcca58a248e7805c715e89" - integrity sha512-W4gHNUE++1oSJVn8Y68jPXi+mkx3fXR5ITE/Ubz6EQ3xRpCN5k2CQ4AUR8094Z7211F876TyoBACGsIveqgiGA== +memfs@^3.4.1, memfs@^3.4.12, memfs@^3.4.3: + version "3.5.1" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.5.1.tgz#f0cd1e2bfaef58f6fe09bfb9c2288f07fea099ec" + integrity sha512-UWbFJKvj5k+nETdteFndTpYxdeTMox/ULeqX5k/dpaQJCCFmj5EeKv3dBcyO2xmkRAx2vppRu5dVG7SOtsGOzA== dependencies: - fs-monkey "1.0.3" + fs-monkey "^1.0.3" memoizerific@^1.11.3: version "1.11.3" @@ -14005,38 +12750,6 @@ memoizerific@^1.11.3: dependencies: map-or-similar "^1.5.0" -memory-fs@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" - integrity sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ== - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -memory-fs@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" - integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -meow@^3.1.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" - integrity sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA== - dependencies: - camelcase-keys "^2.0.0" - decamelize "^1.1.2" - loud-rejection "^1.0.0" - map-obj "^1.0.1" - minimist "^1.1.3" - normalize-package-data "^2.3.4" - object-assign "^4.0.1" - read-pkg-up "^1.0.1" - redent "^1.0.0" - trim-newlines "^1.0.0" - merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" @@ -14053,31 +12766,33 @@ merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1: integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== mermaid@^9.1.2: - version "9.1.3" - resolved "https://registry.yarnpkg.com/mermaid/-/mermaid-9.1.3.tgz#15d08662c66250124ce31106a4620285061ac59c" - integrity sha512-jTIYiqKwsUXVCoxHUVkK8t0QN3zSKIdJlb9thT0J5jCnzXyc+gqTbZE2QmjRfavFTPPn5eRy5zaFp7V+6RhxYg== + version "9.4.3" + resolved "https://registry.yarnpkg.com/mermaid/-/mermaid-9.4.3.tgz#62cf210c246b74972ea98c19837519b6f03427f2" + integrity sha512-TLkQEtqhRSuEHSE34lh5bCa94KATCyluAXmFnNI2PRZwOpXFeqiJWwZl+d2CcemE1RS6QbbueSSq9QIg8Uxcyw== dependencies: "@braintree/sanitize-url" "^6.0.0" - d3 "^7.0.0" - dagre "^0.8.5" - dagre-d3 "^0.6.4" - dompurify "2.3.8" - graphlib "^2.1.8" + cytoscape "^3.23.0" + cytoscape-cose-bilkent "^4.1.0" + cytoscape-fcose "^2.1.0" + d3 "^7.4.0" + dagre-d3-es "7.0.9" + dayjs "^1.11.7" + dompurify "2.4.3" + elkjs "^0.8.2" khroma "^2.0.0" - moment-mini "^2.24.0" - stylis "^4.0.10" + lodash-es "^4.17.21" + non-layered-tidy-tree-layout "^2.0.2" + stylis "^4.1.2" + ts-dedent "^2.2.0" + uuid "^9.0.0" + web-worker "^1.2.0" methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== -microevent.ts@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/microevent.ts/-/microevent.ts-0.1.1.tgz#70b09b83f43df5172d0205a63025bce0f7357fa0" - integrity sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g== - -micromatch@^3.1.10, micromatch@^3.1.4: +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== @@ -14104,20 +12819,12 @@ micromatch@^4.0.0, micromatch@^4.0.2, micromatch@^4.0.4: braces "^3.0.2" picomatch "^2.3.1" -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" - integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": version "1.52.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.30, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: +mime-types@^2.1.12, mime-types@^2.1.25, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== @@ -14129,7 +12836,7 @@ mime@1.6.0, mime@^1.4.1, mime@^1.6.0: resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mime@^2.4.4: +mime@^2.0.3: version "2.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== @@ -14144,22 +12851,10 @@ mimic-fn@^2.0.0, mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -mimic-fn@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-3.1.0.tgz#65755145bbf3e36954b949c16450427451d5ca74" - integrity sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ== - -min-document@^2.19.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" - integrity sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ== - dependencies: - dom-walk "^0.1.0" - -mini-css-extract-plugin@2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz#9a1251d15f2035c342d99a468ab9da7a0451b71e" - integrity sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg== +mini-css-extract-plugin@2.7.2: + version "2.7.2" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.2.tgz#e049d3ea7d3e4e773aad585c6cb329ce0c7b72d7" + integrity sha512-EdlUizq13o0Pd+uCp+WO/JpkLvHRVGt97RqfeGhXqAcorYo1ypJSpkV+WDT0vY/kmh/p7wRdJNJtuyK540PXDw== dependencies: schema-utils "^4.0.0" @@ -14187,24 +12882,31 @@ minimatch@3.0.5: dependencies: brace-expansion "^1.1.7" -minimatch@5.1.0, minimatch@^5.0.1: - version "5.1.0" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.0.tgz#1717b464f4971b144f6aabe8f2d0b8e4511e09c7" - integrity sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: +minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" -minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" - integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.0.tgz#bfc8e88a1c40ffd40c172ddac3decb8451503b56" + integrity sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== minipass-collect@^1.0.2: version "1.0.2" @@ -14214,9 +12916,9 @@ minipass-collect@^1.0.2: minipass "^3.0.0" minipass-fetch@^2.0.3: - version "2.1.0" - resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-2.1.0.tgz#ca1754a5f857a3be99a9271277246ac0b44c3ff8" - integrity sha512-H9U4UVBGXEyyWJnqYDCLp1PwD8XIkJ4akNHp1aGVI+2Ym7wQMlxDKi4IB4JbmyU+pl9pEs/cVrK6cOuvmbK4Sg== + version "2.1.2" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-2.1.2.tgz#95560b50c472d81a3bc76f20ede80eaed76d8add" + integrity sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA== dependencies: minipass "^3.1.6" minipass-sized "^1.0.3" @@ -14224,6 +12926,17 @@ minipass-fetch@^2.0.3: optionalDependencies: encoding "^0.1.13" +minipass-fetch@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-3.0.3.tgz#d9df70085609864331b533c960fd4ffaa78d15ce" + integrity sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ== + dependencies: + minipass "^5.0.0" + minipass-sized "^1.0.3" + minizlib "^2.1.2" + optionalDependencies: + encoding "^0.1.13" + minipass-flush@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" @@ -14239,7 +12952,7 @@ minipass-json-stream@^1.0.1: jsonparse "^1.3.1" minipass "^3.0.0" -minipass-pipeline@^1.2.2, minipass-pipeline@^1.2.4: +minipass-pipeline@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== @@ -14254,35 +12967,29 @@ minipass-sized@^1.0.3: minipass "^3.0.0" minipass@^3.0.0, minipass@^3.1.1, minipass@^3.1.6: - version "3.1.6" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.6.tgz#3b8150aa688a711a1521af5e8779c1d3bb4f45ee" - integrity sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ== + version "3.3.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== dependencies: yallist "^4.0.0" +minipass@^4.0.0: + version "4.2.8" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.2.8.tgz#f0010f64393ecfc1d1ccb5f582bcaf45f48e1a3a" + integrity sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ== + +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + minizlib@^2.1.1, minizlib@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== dependencies: minipass "^3.0.0" - yallist "^4.0.0" - -mississippi@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" - integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== - dependencies: - concat-stream "^1.5.0" - duplexify "^3.4.2" - end-of-stream "^1.1.0" - flush-write-stream "^1.0.0" - from2 "^2.1.0" - parallel-transform "^1.1.0" - pump "^3.0.0" - pumpify "^1.3.3" - stream-each "^1.1.0" - through2 "^2.0.0" + yallist "^4.0.0" mixin-deep@^1.2.0: version "1.3.2" @@ -14292,7 +12999,12 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.4, mkdirp@^0.5.5: +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: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== @@ -14304,27 +13016,15 @@ mkdirp@^1.0.3, mkdirp@^1.0.4, mkdirp@~1.0.4: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -moment-mini@^2.24.0: - version "2.24.0" - resolved "https://registry.yarnpkg.com/moment-mini/-/moment-mini-2.24.0.tgz#fa68d98f7fe93ae65bf1262f6abb5fb6983d8d18" - integrity sha512-9ARkWHBs+6YJIvrIp0Ik5tyTTtP9PoV0Ssu2Ocq5y9v8+NOOpWiRshAp8c4rZVWTOe+157on/5G+zj5pwIQFEQ== - moment@^2.27.0: - version "2.29.3" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.3.tgz#edd47411c322413999f7a5940d526de183c031f3" - integrity sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw== + version "2.29.4" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" + integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== -move-concurrently@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" - integrity sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ== - dependencies: - aproba "^1.1.1" - copy-concurrently "^1.0.0" - fs-write-stream-atomic "^1.0.8" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.3" +mri@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" + integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== ms@2.0.0: version "2.0.0" @@ -14351,26 +13051,26 @@ ms@3.0.0-canary.1: resolved "https://registry.yarnpkg.com/ms/-/ms-3.0.0-canary.1.tgz#c7b34fbce381492fd0b345d1cf56e14d67b77b80" integrity sha512-kh8ARjh8rMN7Du2igDRO9QJnqCb2xYTJxyQYK7vJJS4TvLLmsbyhiKpSW+t+y26gyOyMd0riphX0GeWKU3ky5g== -msgpackr-extract@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/msgpackr-extract/-/msgpackr-extract-2.0.2.tgz#201a8d7ade47e99b3ba277c45736b00e195d4670" - integrity sha512-coskCeJG2KDny23zWeu+6tNy7BLnAiOGgiwzlgdm4oeSsTpqEJJPguHIuKZcCdB7tzhZbXNYSg6jZAXkZErkJA== +msgpackr-extract@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/msgpackr-extract/-/msgpackr-extract-3.0.2.tgz#e05ec1bb4453ddf020551bcd5daaf0092a2c279d" + integrity sha512-SdzXp4kD/Qf8agZ9+iTu6eql0m3kWm1A2y1hkpTeVNENutaB0BwHlSvAIaMxwntmRUAUjon2V4L8Z/njd0Ct8A== dependencies: - node-gyp-build-optional-packages "5.0.2" + node-gyp-build-optional-packages "5.0.7" optionalDependencies: - "@msgpackr-extract/msgpackr-extract-darwin-arm64" "2.0.2" - "@msgpackr-extract/msgpackr-extract-darwin-x64" "2.0.2" - "@msgpackr-extract/msgpackr-extract-linux-arm" "2.0.2" - "@msgpackr-extract/msgpackr-extract-linux-arm64" "2.0.2" - "@msgpackr-extract/msgpackr-extract-linux-x64" "2.0.2" - "@msgpackr-extract/msgpackr-extract-win32-x64" "2.0.2" + "@msgpackr-extract/msgpackr-extract-darwin-arm64" "3.0.2" + "@msgpackr-extract/msgpackr-extract-darwin-x64" "3.0.2" + "@msgpackr-extract/msgpackr-extract-linux-arm" "3.0.2" + "@msgpackr-extract/msgpackr-extract-linux-arm64" "3.0.2" + "@msgpackr-extract/msgpackr-extract-linux-x64" "3.0.2" + "@msgpackr-extract/msgpackr-extract-win32-x64" "3.0.2" msgpackr@^1.5.2: - version "1.6.1" - resolved "https://registry.yarnpkg.com/msgpackr/-/msgpackr-1.6.1.tgz#4f3c94d6a5b819b838ffc736eddaf60eba436d20" - integrity sha512-Je+xBEfdjtvA4bKaOv8iRhjC8qX2oJwpYH4f7JrG4uMVJVmnmkAT4pjKdbztKprGj3iwjcxPzb5umVZ02Qq3tA== + version "1.9.1" + resolved "https://registry.yarnpkg.com/msgpackr/-/msgpackr-1.9.1.tgz#4375d705232b721bedb44a3993e7aa8a6f959502" + integrity sha512-jJdrNH8tzfCtT0rjPFryBXjRDQE7rqfLkah4/8B4gYa7NNZYFBcGxqWBtfQpGC+oYyBwlkj3fARk4aooKNPHxg== optionalDependencies: - msgpackr-extract "^2.0.2" + msgpackr-extract "^3.0.2" multer@1.4.4-lts.1: version "1.4.4-lts.1" @@ -14403,15 +13103,10 @@ mute-stream@0.0.8: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== -nan@^2.12.1: - version "2.16.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.16.0.tgz#664f43e45460fb98faf00edca0bb0d7b8dce7916" - integrity sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA== - -nanoid@^3.1.23, nanoid@^3.3.1, nanoid@^3.3.4: - version "3.3.4" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" - integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== +nanoid@^3.3.1, nanoid@^3.3.4, nanoid@^3.3.6: + version "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" @@ -14430,10 +13125,10 @@ nanomatch@^1.2.9: snapdragon "^0.8.1" to-regex "^3.0.1" -native-request@^1.0.5: - version "1.1.0" - resolved "https://registry.yarnpkg.com/native-request/-/native-request-1.1.0.tgz#acdb30fe2eefa3e1bc8c54b3a6852e9c5c0d3cb0" - integrity sha512-uZ5rQaeRn15XmpgE0xoPL8YWqcX90VtCFglYwAgkvKM5e8fog+vePLAhHxuuv/gRkrQxIeh5U3q9sMNUrENqWw== +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== natural-compare@^1.4.0: version "1.4.0" @@ -14441,9 +13136,9 @@ natural-compare@^1.4.0: integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== needle@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/needle/-/needle-3.1.0.tgz#3bf5cd090c28eb15644181ab6699e027bd6c53c9" - integrity sha512-gCE9weDhjVGCRqS8dwDR/D3GTAeyXLXuqp7I8EzH6DllZGXSUyxuqqLh+YX9rMAWaaTFyVAg6rHGL25dqvczKw== + version "3.2.0" + resolved "https://registry.yarnpkg.com/needle/-/needle-3.2.0.tgz#07d240ebcabfd65c76c03afae7f6defe6469df44" + integrity sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ== dependencies: debug "^3.2.6" iconv-lite "^0.6.3" @@ -14454,62 +13149,56 @@ negotiator@0.6.3, negotiator@^0.6.3: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== -neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1, neo-async@^2.6.2: +neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== -nested-error-stacks@^2.0.0, nested-error-stacks@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-2.1.1.tgz#26c8a3cee6cc05fbcf1e333cd2fc3e003326c0b5" - integrity sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw== - -ng-extract-i18n-merge@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ng-extract-i18n-merge/-/ng-extract-i18n-merge-2.1.2.tgz#1a86beccc85cf2fbeb7538009feeb8a6787d602a" - integrity sha512-dRo/oO4m3tr26uE4+DHJh0iTqSV3qVl+WGTSHGKKyAM628dP3hZunhBTs7fCpLs57aEex84cJax8X+Y8wmBXTQ== - dependencies: - "@angular-devkit/architect" "^0.1301.0" - "@angular-devkit/core" "^13.0.0 || ^14.0.0" - "@angular-devkit/schematics" "^13.0.0 || ^14.0.0" - "@schematics/angular" "^13.0.0 || ^14.0.0" - xliff-simple-merge "~0.12.4" - xml_normalize "~0.8.4" +ng-extract-i18n-merge@2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/ng-extract-i18n-merge/-/ng-extract-i18n-merge-2.6.0.tgz#1b797fea85d90690c787c7f86710d37916aa008d" + integrity sha512-Lgd9zsAkAQX3gCUypE53S7/2A+fdpMiSJ8cVMOBctI3Et3e9nEPSfb2n0wkj1BnlitdjtQP+x42CldqjHtnAgw== + dependencies: + "@angular-devkit/architect" "^0.1301.0 || ^0.1401.0 || ^0.1501.0" + "@angular-devkit/core" "^13.0.0 || ^14.0.0 || ^15.0.0" + "@angular-devkit/schematics" "^13.0.0 || ^14.0.0 || ^15.0.0" + "@schematics/angular" "^13.0.0 || ^14.0.0 || ^15.0.0" + xliff-simple-merge "~1.0.1" + xml_normalize "^1.0.0" xmldoc "~1.1.2" -ngx-device-detector@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ngx-device-detector/-/ngx-device-detector-3.0.0.tgz#9c5b1db66e03837d5de0e93fe4a1de93948c9c81" - integrity sha512-mzegvxnNTDkHTxh+UeWnCUgZ91/XDOcN2kj8aCupvA7wNgDc/NZ0L90feKJsc+wES7IWq0/DIIKq2F732WOkfw== +ngx-device-detector@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ngx-device-detector/-/ngx-device-detector-5.0.1.tgz#da511f0393fff7dab45a3dfa72d40981c5e81e3c" + integrity sha512-hVKaGzyXzy6zeliYyN7runz3eOOsh3tmZ8A6P5MSpHIjVjSx3pUJcobFTKNyHGn/zGS4JFWuhSSb7QmNwmqK9w== dependencies: tslib "^2.0.0" -ngx-markdown@14.0.1: - version "14.0.1" - resolved "https://registry.yarnpkg.com/ngx-markdown/-/ngx-markdown-14.0.1.tgz#5e97d91012dd3f429635aa7a18b2b75051eea85e" - integrity sha512-y5CY4e0QM0uR6+MvU1rnh1Ks+rku14309kVVojyXLcWl4zlrt8VAYCcf/+A+8z/IDOaz38yTrxNBnvYDJzNzYA== +ngx-markdown@15.1.0: + version "15.1.0" + resolved "https://registry.yarnpkg.com/ngx-markdown/-/ngx-markdown-15.1.0.tgz#819e0b07027cf57a10a5cfe5bbac214e426a572b" + integrity sha512-BmbhIY9O4ldPxEymjrCUHgwWPphfY2nO36QoNU8UCzFThkbxcgsfWmyM3fBm81W1BbOPt6mxz6PVx6MaOinB9A== dependencies: - "@types/marked" "^4.0.3" + tslib "^2.3.0" + optionalDependencies: clipboard "^2.0.11" - emoji-toolkit "^6.6.0" + emoji-toolkit "^7.0.0" katex "^0.16.0" - marked "^4.0.17" mermaid "^9.1.2" prismjs "^1.28.0" - tslib "^2.3.0" -ngx-skeleton-loader@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ngx-skeleton-loader/-/ngx-skeleton-loader-5.0.0.tgz#e0042de20b0159d3f97d03a696d68f39ceee383b" - integrity sha512-6cz8UAu4WcYnBp/LnU053LCIwjKNZWX8GX1v3bvqQVdDa1ubsEeJm+CZxk5B8W2jP9CcFhvWrBlmmVUyl1Yxug== +ngx-skeleton-loader@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/ngx-skeleton-loader/-/ngx-skeleton-loader-7.0.0.tgz#3b1325025a7208a20f3a0fdba6e578532a09cfcd" + integrity sha512-myc6GNcNhyksZrimIFkCxeihi0kQ8JhQVZiGbtiIv4gYrnnRk5nXbs3kYitK8E8OstHG+jlsmRofqGBxuIsYTA== dependencies: perf-marks "^1.13.4" tslib "^2.0.0" -ngx-stripe@13.0.0: - version "13.0.0" - resolved "https://registry.yarnpkg.com/ngx-stripe/-/ngx-stripe-13.0.0.tgz#d5ed50590447aa74012de4e75ac9bcdafc68b1c8" - integrity sha512-SImKvoC/mZZrtzh2UUmxFdkqMLKX2y+BtcvMAPdHD4D7miXWEjCTZeXt8h85mcfy7y1NKKwIipH4CSr9eBzZ4w== +ngx-stripe@15.5.0: + version "15.5.0" + resolved "https://registry.yarnpkg.com/ngx-stripe/-/ngx-stripe-15.5.0.tgz#b05fc1cf9f55bb5e7f307ac5cfdf29807a2f48a9" + integrity sha512-Ut3JANfxSzl/4qy+pokHOXGVITgNSlSMv7XGN2Y4tPDk6BVUD9SSl/3VuXW9UdbKAmX0XS68nRACiKCOSet5zw== dependencies: tslib "^2.3.0" @@ -14535,57 +13224,66 @@ no-case@^3.0.4: tslib "^2.0.3" node-abort-controller@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/node-abort-controller/-/node-abort-controller-3.0.1.tgz#f91fa50b1dee3f909afabb7e261b1e1d6b0cb74e" - integrity sha512-/ujIVxthRs+7q6hsdjHMaj8hRG9NuWmwrz+JdRwZ14jdFoKSkm+vDsCbF9PLpnSqjaWQJuTmVtcWHNLr+vrOFw== - -node-addon-api@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" - integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== + version "3.1.1" + resolved "https://registry.yarnpkg.com/node-abort-controller/-/node-abort-controller-3.1.1.tgz#a94377e964a9a37ac3976d848cb5c765833b8548" + integrity sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ== node-addon-api@^3.0.0, node-addon-api@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== -node-fetch@2.6.7, node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.7: +node-dir@^0.1.17: + version "0.1.17" + resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.17.tgz#5f5665d93351335caabef8f1c554516cf5f1e4e5" + integrity sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg== + dependencies: + minimatch "^3.0.2" + +node-fetch-native@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/node-fetch-native/-/node-fetch-native-1.1.0.tgz#a530f5c4cadb49b382dcf81d8f5f19ed0f457fbe" + integrity sha512-nl5goFCig93JZ9FIV8GHT9xpNqXbxQUzkOmKIMKmncsBH9jhg7qKex8hirpymkBFmNQ114chEEG5lS4wgK2I+Q== + +node-fetch@2.6.7: version "2.6.7" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== dependencies: whatwg-url "^5.0.0" +node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.7: + version "2.6.9" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.9.tgz#7c7f744b5cc6eb5fd404e0c7a9fec630a55657e6" + integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg== + dependencies: + whatwg-url "^5.0.0" + node-forge@^1, node-forge@^1.3.1: version "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.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.2.tgz#3de7d30bd1f9057b5dfbaeab4a4442b7fe9c5901" - integrity sha512-PiN4NWmlQPqvbEFcH/omQsswWQbe5Z9YK/zdB23irp5j2XibaA2IrGvpSWmVVG4qMZdmPdwPctSy4a86rOMn6g== - -node-gyp-build@^4.2.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.5.0.tgz#7a64eefa0b21112f89f58379da128ac177f20e40" - integrity sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg== +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" + integrity sha512-YlCCc6Wffkx0kHkmam79GKvDQ6x+QZkMjFGrIMxgFNILFvGSbCp2fCBC55pGTT9gVaz8Na5CLmxt/urtzRv36w== node-gyp-build@^4.2.2, node-gyp-build@^4.3.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.4.0.tgz#42e99687ce87ddeaf3a10b99dc06abc11021f3f4" - integrity sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ== + version "4.6.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.0.tgz#0c52e4cbf54bbd28b709820ef7b6a3c2d6209055" + integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ== node-gyp@^9.0.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.1.0.tgz#c8d8e590678ea1f7b8097511dedf41fc126648f8" - integrity sha512-HkmN0ZpQJU7FLbJauJTHkHlSVAXlNGDAzH/VYFZGDOnFyn/Na3GlNJfkudmufOdS6/jNFhy88ObzL7ERz9es1g== + version "9.3.1" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.3.1.tgz#1e19f5f290afcc9c46973d68700cbd21a96192e4" + integrity sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg== dependencies: env-paths "^2.2.0" glob "^7.1.4" graceful-fs "^4.2.6" make-fetch-happen "^10.0.3" - nopt "^5.0.0" + nopt "^6.0.0" npmlog "^6.0.0" rimraf "^3.0.2" semver "^7.3.5" @@ -14597,49 +13295,15 @@ node-int64@^0.4.0: resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== -node-libs-browser@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" - integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== - dependencies: - assert "^1.1.1" - browserify-zlib "^0.2.0" - buffer "^4.3.0" - console-browserify "^1.1.0" - constants-browserify "^1.0.0" - crypto-browserify "^3.11.0" - domain-browser "^1.1.1" - events "^3.0.0" - https-browserify "^1.0.0" - os-browserify "^0.3.0" - path-browserify "0.0.1" - process "^0.11.10" - punycode "^1.2.4" - querystring-es3 "^0.2.0" - readable-stream "^2.3.3" - stream-browserify "^2.0.1" - stream-http "^2.7.2" - string_decoder "^1.0.0" - timers-browserify "^2.0.4" - tty-browserify "0.0.0" - url "^0.11.0" - util "^0.11.0" - vm-browserify "^1.0.1" - node-machine-id@^1.1.12: version "1.1.12" resolved "https://registry.yarnpkg.com/node-machine-id/-/node-machine-id-1.1.12.tgz#37904eee1e59b320bb9c5d6c0a59f3b469cb6267" integrity sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ== -node-releases@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.5.tgz#280ed5bc3eba0d96ce44897d8aee478bfb3d9666" - integrity sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q== - -node-releases@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" - integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== +node-releases@^2.0.8: + version "2.0.10" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" + integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== node-rsa@^1.1.1: version "1.1.1" @@ -14653,14 +13317,19 @@ nofilter@^1.0.4: resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-1.0.4.tgz#78d6f4b6a613e7ced8b015cec534625f7667006e" integrity sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA== -nopt@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" - integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== +non-layered-tidy-tree-layout@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz#57d35d13c356643fc296a55fb11ac15e74da7804" + integrity sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw== + +nopt@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-6.0.0.tgz#245801d8ebf409c6df22ab9d95b65e1309cdb16d" + integrity sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g== dependencies: - abbrev "1" + abbrev "^1.0.0" -normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.5.0: +normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== @@ -14670,23 +13339,16 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package- semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-package-data@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-4.0.0.tgz#1122d5359af21d4cd08718b92b058a658594177c" - integrity sha512-m+GL22VXJKkKbw62ZaBBjv8u6IE3UI4Mh5QakIqs3fWiKe0Xyi6L97hakwZK41/LD4R/2ly71Bayx0NLMwLA/g== +normalize-package-data@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-5.0.0.tgz#abcb8d7e724c40d88462b84982f7cbf6859b4588" + integrity sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q== dependencies: - hosted-git-info "^5.0.0" + hosted-git-info "^6.0.0" is-core-module "^2.8.1" semver "^7.3.5" validate-npm-package-license "^3.0.4" -normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w== - dependencies: - remove-trailing-separator "^1.0.1" - normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" @@ -14702,76 +13364,64 @@ normalize-url@^6.0.1: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== -npm-bundled@^1.1.1, npm-bundled@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.2.tgz#944c78789bd739035b70baa2ca5cc32b8d860bc1" - integrity sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ== +npm-bundled@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-3.0.0.tgz#7e8e2f8bb26b794265028491be60321a25a39db7" + integrity sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ== dependencies: - npm-normalize-package-bin "^1.0.1" + npm-normalize-package-bin "^3.0.0" -npm-install-checks@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-5.0.0.tgz#5ff27d209a4e3542b8ac6b0c1db6063506248234" - integrity sha512-65lUsMI8ztHCxFz5ckCEC44DRvEGdZX5usQFriauxHEwt7upv1FKaQEmAtU0YnOAdwuNWCmk64xYiQABNrEyLA== +npm-install-checks@^6.0.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-6.1.1.tgz#b459b621634d06546664207fde16810815808db1" + integrity sha512-dH3GmQL4vsPtld59cOn8uY0iOqRmqKvV+DLGwNXV/Q7MDgD2QfOADWd/mFXcIE5LVhYYGjA3baz6W9JneqnuCw== dependencies: semver "^7.1.1" -npm-normalize-package-bin@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" - integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== - -npm-package-arg@9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-9.1.0.tgz#a60e9f1e7c03e4e3e4e994ea87fff8b90b522987" - integrity sha512-4J0GL+u2Nh6OnhvUKXRr2ZMG4lR8qtLp+kv7UiV00Y+nGiSxtttCyIRHCt5L5BNkXQld/RceYItau3MDOoGiBw== - dependencies: - hosted-git-info "^5.0.0" - proc-log "^2.0.1" - semver "^7.3.5" - validate-npm-package-name "^4.0.0" +npm-normalize-package-bin@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz#25447e32a9a7de1f51362c61a559233b89947832" + integrity sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ== -npm-package-arg@^9.0.0, npm-package-arg@^9.0.1: - version "9.0.2" - resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-9.0.2.tgz#f3ef7b1b3b02e82564af2d5228b4c36567dcd389" - integrity sha512-v/miORuX8cndiOheW8p2moNuPJ7QhcFh9WGlTorruG8hXSA23vMTEp5hTCmDxic0nD8KHhj/NQgFuySD3GYY3g== +npm-package-arg@10.1.0, npm-package-arg@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-10.1.0.tgz#827d1260a683806685d17193073cc152d3c7e9b1" + integrity sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA== dependencies: - hosted-git-info "^5.0.0" + hosted-git-info "^6.0.0" + proc-log "^3.0.0" semver "^7.3.5" - validate-npm-package-name "^4.0.0" + validate-npm-package-name "^5.0.0" -npm-packlist@^5.1.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-5.1.1.tgz#79bcaf22a26b6c30aa4dd66b976d69cc286800e0" - integrity sha512-UfpSvQ5YKwctmodvPPkK6Fwk603aoVsf8AEbmVKAEECrfvL8SSe1A2YIwrJ6xmTHAITKPwwZsWo7WwEbNk0kxw== +npm-packlist@^7.0.0: + version "7.0.4" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-7.0.4.tgz#033bf74110eb74daf2910dc75144411999c5ff32" + integrity sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q== dependencies: - glob "^8.0.1" - ignore-walk "^5.0.1" - npm-bundled "^1.1.2" - npm-normalize-package-bin "^1.0.1" + ignore-walk "^6.0.0" -npm-pick-manifest@7.0.1, npm-pick-manifest@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-7.0.1.tgz#76dda30a7cd6b99be822217a935c2f5eacdaca4c" - integrity sha512-IA8+tuv8KujbsbLQvselW2XQgmXWS47t3CB0ZrzsRZ82DbDfkcFunOaPm4X7qNuhMfq+FmV7hQT4iFVpHqV7mg== +npm-pick-manifest@8.0.1, npm-pick-manifest@^8.0.0: + version "8.0.1" + resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz#c6acd97d1ad4c5dbb80eac7b386b03ffeb289e5f" + integrity sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA== dependencies: - npm-install-checks "^5.0.0" - npm-normalize-package-bin "^1.0.1" - npm-package-arg "^9.0.0" + npm-install-checks "^6.0.0" + npm-normalize-package-bin "^3.0.0" + npm-package-arg "^10.0.0" semver "^7.3.5" -npm-registry-fetch@^13.0.1: - version "13.1.1" - resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-13.1.1.tgz#26dc4b26d0a545886e807748032ba2aefaaae96b" - integrity sha512-5p8rwe6wQPLJ8dMqeTnA57Dp9Ox6GH9H60xkyJup07FmVlu3Mk7pf/kIIpl9gaN5bM8NM+UUx3emUWvDNTt39w== +npm-registry-fetch@^14.0.0: + version "14.0.5" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz#fe7169957ba4986a4853a650278ee02e568d115d" + integrity sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA== dependencies: - make-fetch-happen "^10.0.6" - minipass "^3.1.6" - minipass-fetch "^2.0.3" + make-fetch-happen "^11.0.0" + minipass "^5.0.0" + minipass-fetch "^3.0.0" minipass-json-stream "^1.0.1" minizlib "^2.1.2" - npm-package-arg "^9.0.1" - proc-log "^2.0.0" + npm-package-arg "^10.0.0" + proc-log "^3.0.0" npm-run-path@^2.0.0: version "2.0.2" @@ -14814,35 +13464,44 @@ nth-check@^2.0.1: dependencies: boolbase "^1.0.0" -num2fraction@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" - integrity sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg== - number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== -nwsapi@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" - integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== +nwsapi@^2.2.2: + version "2.2.4" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.4.tgz#fd59d5e904e8e1f03c25a7d5a15cfa16c714a1e5" + integrity sha512-NHj4rzRo0tQdijE9ZqAx6kYDcoRwYwSYzCA8MY3JzfxlrvEU0jhnhJT9BhqhJs7I/dKcrDm6TyulaRqZPIhN5g== + +nx-cloud@16.0.5: + version "16.0.5" + resolved "https://registry.yarnpkg.com/nx-cloud/-/nx-cloud-16.0.5.tgz#fa0b0185d254405ec47fcbcdbbd8b12ff1add096" + integrity sha512-13P7r0aKikjBtmdZrNorwXzVPeVIV4MLEwqGY+DEG6doLBtI5KqEQk/d5B5l2dCF2BEi/LXEmLYCmf9gwbOJ+Q== + dependencies: + "@nrwl/nx-cloud" "16.0.5" + axios "1.1.3" + chalk "^4.1.0" + dotenv "~10.0.0" + fs-extra "^11.1.0" + node-machine-id "^1.1.12" + open "~8.4.0" + strip-json-comments "^3.1.1" + tar "6.1.11" + yargs-parser ">=21.1.1" -nx@15.0.0: - version "15.0.0" - resolved "https://registry.yarnpkg.com/nx/-/nx-15.0.0.tgz#8f1a291b7393861242b5c0f0d03c6317aed9c182" - integrity sha512-uh9Ou5oj7yr6Uyp4QhqW1vIVoanYn1sJM1jzOyoT17GAhhODfS0BtQgUvlmInDuRqP8LMaPg4LXFMby07U1HXg== +nx@16.0.3: + version "16.0.3" + resolved "https://registry.yarnpkg.com/nx/-/nx-16.0.3.tgz#30085e06fa5c79abd3b65c553c3baf84f54999e3" + integrity sha512-Q76wS7oWsbxi7lxyhI9d10MOvNhbxjDU0J40gdg8DhIi8QWJ5q5SfkD5+Vn1mYy9AA7zyKUF8CGh2kYJMpWPpA== dependencies: - "@nrwl/cli" "15.0.0" - "@nrwl/tao" "15.0.0" + "@nrwl/tao" "16.0.3" "@parcel/watcher" "2.0.4" "@yarnpkg/lockfile" "^1.1.0" "@yarnpkg/parsers" "^3.0.0-rc.18" "@zkochan/js-yaml" "0.0.6" axios "^1.0.0" - chalk "4.1.0" - chokidar "^3.5.1" + chalk "^4.1.0" cli-cursor "3.1.0" cli-spinners "2.6.1" cliui "^7.0.2" @@ -14851,11 +13510,12 @@ nx@15.0.0: fast-glob "3.2.7" figures "3.2.0" flat "^5.0.2" - fs-extra "^10.1.0" + fs-extra "^11.1.0" glob "7.1.4" ignore "^5.0.4" js-yaml "4.1.0" jsonc-parser "3.2.0" + lines-and-columns "~2.0.3" minimatch "3.0.5" npm-run-path "^4.0.1" open "^8.4.0" @@ -14864,18 +13524,28 @@ nx@15.0.0: strong-log-transformer "^2.1.0" tar-stream "~2.2.0" tmp "~0.2.1" - tsconfig-paths "^3.9.0" + tsconfig-paths "^4.1.2" tslib "^2.3.0" v8-compile-cache "2.3.0" - yargs "^17.4.0" - yargs-parser "21.0.1" + yargs "^17.6.2" + yargs-parser "21.1.1" + optionalDependencies: + "@nx/nx-darwin-arm64" "16.0.3" + "@nx/nx-darwin-x64" "16.0.3" + "@nx/nx-linux-arm-gnueabihf" "16.0.3" + "@nx/nx-linux-arm64-gnu" "16.0.3" + "@nx/nx-linux-arm64-musl" "16.0.3" + "@nx/nx-linux-x64-gnu" "16.0.3" + "@nx/nx-linux-x64-musl" "16.0.3" + "@nx/nx-win32-arm64-msvc" "16.0.3" + "@nx/nx-win32-x64-msvc" "16.0.3" oauth@0.9.x: version "0.9.15" resolved "https://registry.yarnpkg.com/oauth/-/oauth-0.9.15.tgz#bd1fefaf686c96b75475aed5196412ff60cfb9c1" integrity sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA== -object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@^4, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== @@ -14894,10 +13564,18 @@ object-hash@3.0.0: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== -object-inspect@^1.12.0, object-inspect@^1.9.0: - version "1.12.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" - integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== +object-inspect@^1.12.3, object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + +object-is@^1.0.1, object-is@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" object-keys@^1.1.1: version "1.1.1" @@ -14911,43 +13589,15 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.assign@^4.1.0, object.assign@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" - integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - has-symbols "^1.0.1" - object-keys "^1.1.1" - -object.entries@^1.1.0: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861" - integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - -"object.fromentries@^2.0.0 || ^1.0.0": - version "2.0.5" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.5.tgz#7b37b205109c21e741e605727fe8b0ad5fa08251" - integrity sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - -object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.2: - version "2.1.4" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.4.tgz#7965e6437a57278b587383831a9b829455a4bc37" - integrity sha512-sccv3L/pMModT6dJAYF3fzGMVcb38ysQ0tEE6ixv2yXJDtEIPph268OlAdJj5/qZMZDq2g/jqvwppt36uS/uQQ== +object.assign@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== dependencies: - array.prototype.reduce "^1.0.4" call-bind "^1.0.2" define-properties "^1.1.4" - es-abstract "^1.20.1" + has-symbols "^1.0.3" + object-keys "^1.1.1" object.pick@^1.3.0: version "1.3.0" @@ -14956,14 +13606,14 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -object.values@^1.1.0, object.values@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" - integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== +object.values@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" + integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" @@ -15008,10 +13658,10 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" -open@8.4.0, open@^8.0.9, open@^8.4.0: - version "8.4.0" - resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" - integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== +open@8.4.1: + version "8.4.1" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.1.tgz#2ab3754c07f5d1f99a7a8d6a82737c95e3101cff" + integrity sha512-/4b7qZNhv6Uhd7jjnREh1NjnPxlTq+XNWPG88Ydkj5AILcA5m3ajvcg57pB24EQjKv0dK62XnDqk9c/hkIG5Kg== dependencies: define-lazy-prop "^2.0.0" is-docker "^2.1.1" @@ -15025,6 +13675,15 @@ open@^7.0.3: is-docker "^2.0.0" is-wsl "^2.1.1" +open@^8.0.9, open@^8.4.0, open@~8.4.0: + version "8.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + opener@^1.5.1: version "1.5.2" resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" @@ -15069,16 +13728,6 @@ ora@5.4.1, ora@^5.4.1: strip-ansi "^6.0.0" wcwidth "^1.0.1" -os-browserify@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" - integrity sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A== - -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ== - os-locale@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" @@ -15098,32 +13747,11 @@ ospath@^1.2.2: resolved "https://registry.yarnpkg.com/ospath/-/ospath-1.2.2.tgz#1276639774a3f8ef2572f7fe4280e0ea4550c07b" integrity sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA== -p-all@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-all/-/p-all-2.1.0.tgz#91419be56b7dee8fe4c5db875d55e0da084244a0" - integrity sha512-HbZxz5FONzz/z2gJfk6bFca0BCiSRF8jU3yCsWOen/vR6lZjfPOu/e7L3uFzTW1i0H8TlC3vqQstEJPQL4/uLA== - dependencies: - p-map "^2.0.0" - 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-event@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/p-event/-/p-event-4.2.0.tgz#af4b049c8acd91ae81083ebd1e6f5cae2044c1b5" - integrity sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ== - dependencies: - p-timeout "^3.1.0" - -p-filter@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-filter/-/p-filter-2.1.0.tgz#1b1472562ae7a0f742f0f3d3d3718ea66ff9c09c" - integrity sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw== - dependencies: - p-map "^2.0.0" - p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" @@ -15134,13 +13762,6 @@ p-is-promise@^2.0.0: resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.0" - 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" @@ -15155,13 +13776,6 @@ p-limit@^3.0.2, p-limit@^3.1.0: dependencies: yocto-queue "^0.1.0" -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== - dependencies: - p-limit "^1.1.0" - p-locate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" @@ -15183,18 +13797,11 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" -p-map@^2.0.0, p-map@^2.1.0: +p-map@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== -p-map@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" - integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== - dependencies: - aggregate-error "^3.0.0" - p-map@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" @@ -15210,70 +13817,51 @@ p-retry@^4.5.0: "@types/retry" "0.12.0" retry "^0.13.1" -p-timeout@^3.1.0, p-timeout@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" - integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== - dependencies: - p-finally "^1.0.0" - -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== - p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -pacote@13.6.2: - version "13.6.2" - resolved "https://registry.yarnpkg.com/pacote/-/pacote-13.6.2.tgz#0d444ba3618ab3e5cd330b451c22967bbd0ca48a" - integrity sha512-Gu8fU3GsvOPkak2CkbojR7vjs3k3P9cA6uazKTHdsdV0gpCEQq2opelnEv30KRQWgVzP5Vd/5umjcedma3MKtg== - dependencies: - "@npmcli/git" "^3.0.0" - "@npmcli/installed-package-contents" "^1.0.7" - "@npmcli/promise-spawn" "^3.0.0" - "@npmcli/run-script" "^4.1.0" - cacache "^16.0.0" - chownr "^2.0.0" - fs-minipass "^2.1.0" - infer-owner "^1.0.4" - minipass "^3.1.6" - mkdirp "^1.0.4" - npm-package-arg "^9.0.0" - npm-packlist "^5.1.0" - npm-pick-manifest "^7.0.0" - npm-registry-fetch "^13.0.1" - proc-log "^2.0.0" +pacote@15.1.0: + version "15.1.0" + resolved "https://registry.yarnpkg.com/pacote/-/pacote-15.1.0.tgz#2e0b12a4f55ffd801a8134a1ae28ef361dc3f243" + integrity sha512-FFcjtIl+BQNfeliSm7MZz5cpdohvUV1yjGnqgVM4UnVF7JslRY0ImXAygdaCDV0jjUADEWu4y5xsDV8brtrTLg== + dependencies: + "@npmcli/git" "^4.0.0" + "@npmcli/installed-package-contents" "^2.0.1" + "@npmcli/promise-spawn" "^6.0.1" + "@npmcli/run-script" "^6.0.0" + cacache "^17.0.0" + fs-minipass "^3.0.0" + minipass "^4.0.0" + npm-package-arg "^10.0.0" + npm-packlist "^7.0.0" + npm-pick-manifest "^8.0.0" + npm-registry-fetch "^14.0.0" + proc-log "^3.0.0" promise-retry "^2.0.1" - read-package-json "^5.0.0" - read-package-json-fast "^2.0.3" - rimraf "^3.0.2" - ssri "^9.0.0" + read-package-json "^6.0.0" + read-package-json-fast "^3.0.0" + sigstore "^1.0.0" + ssri "^10.0.0" tar "^6.1.11" -pako@^1.0.3, pako@~1.0.5: +pako@^1.0.3: version "1.0.11" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== +pako@~0.2.0: + version "0.2.9" + resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" + integrity sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA== + papaparse@5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/papaparse/-/papaparse-5.3.1.tgz#770b7a9124d821d4b2132132b7bd7dce7194b5b1" integrity sha512-Dbt2yjLJrCwH2sRqKFFJaN5XgIASO9YOFeFP8rIBRG2Ain8mqk5r1M6DkfvqEVozVcz3r3HaUGw253hA1nLIcA== -parallel-transform@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" - integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== - dependencies: - cyclist "^1.0.1" - inherits "^2.0.3" - readable-stream "^2.1.5" - -param-case@^3.0.3, param-case@^3.0.4: +param-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== @@ -15288,36 +13876,6 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-asn1@^5.0.0, parse-asn1@^5.1.5: - version "5.1.6" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" - integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== - dependencies: - asn1.js "^5.2.0" - browserify-aes "^1.0.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - safe-buffer "^5.1.1" - -parse-entities@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" - integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== - dependencies: - character-entities "^1.0.0" - character-entities-legacy "^1.0.0" - character-reference-invalid "^1.0.0" - is-alphanumerical "^1.0.0" - is-decimal "^1.0.0" - is-hexadecimal "^1.0.0" - -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ== - dependencies: - error-ex "^1.2.0" - parse-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" @@ -15341,13 +13899,14 @@ parse-node-version@^1.0.1: resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== -parse5-html-rewriting-stream@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-6.0.1.tgz#de1820559317ab4e451ea72dba05fddfd914480b" - integrity sha512-vwLQzynJVEfUlURxgnf51yAJDQTtVpNyGD8tKi2Za7m+akukNHxCcUQMAa/mUGLhCeicFdpy7Tlvj8ZNKadprg== +parse5-html-rewriting-stream@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz#e376d3e762d2950ccbb6bb59823fc1d7e9fdac36" + integrity sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg== dependencies: - parse5 "^6.0.1" - parse5-sax-parser "^6.0.1" + entities "^4.3.0" + parse5 "^7.0.0" + parse5-sax-parser "^7.0.0" parse5-htmlparser2-tree-adapter@^6.0.1: version "6.0.1" @@ -15356,27 +13915,37 @@ parse5-htmlparser2-tree-adapter@^6.0.1: dependencies: parse5 "^6.0.1" -parse5-sax-parser@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5-sax-parser/-/parse5-sax-parser-6.0.1.tgz#98b4d366b5b266a7cd90b4b58906667af882daba" - integrity sha512-kXX+5S81lgESA0LsDuGjAlBybImAChYRMT+/uKCEXFBFOeEhS52qUCydGhU3qLRD8D9DVjaUo821WK7DM4iCeg== +parse5-htmlparser2-tree-adapter@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz#23c2cc233bcf09bb7beba8b8a69d46b08c62c2f1" + integrity sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g== dependencies: - parse5 "^6.0.1" + domhandler "^5.0.2" + parse5 "^7.0.0" + +parse5-sax-parser@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz#4c05064254f0488676aca75fb39ca069ec96dee5" + integrity sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg== + dependencies: + parse5 "^7.0.0" parse5@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== -parse5@6.0.1, parse5@^6.0.0, parse5@^6.0.1: +parse5@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== -parse5@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" - integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== +parse5@^7.0.0, parse5@^7.1.1, parse5@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== + dependencies: + entities "^4.4.0" parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" @@ -15412,9 +13981,9 @@ passport-jwt@4.0.0: passport-strategy "^1.0.0" passport-oauth2@1.x.x: - version "1.6.1" - resolved "https://registry.yarnpkg.com/passport-oauth2/-/passport-oauth2-1.6.1.tgz#c5aee8f849ce8bd436c7f81d904a3cd1666f181b" - integrity sha512-ZbV43Hq9d/SBSYQ22GOiglFsjsD1YY/qdiptA+8ej+9C1dL1TVB+mBE5kDH/D4AJo50+2i8f4bx0vg4/yDDZCQ== + version "1.7.0" + resolved "https://registry.yarnpkg.com/passport-oauth2/-/passport-oauth2-1.7.0.tgz#5c4766c8531ac45ffe9ec2c09de9809e2c841fc4" + integrity sha512-j2gf34szdTF2Onw3+76alNnaAExlUmHvkc7cL+cmaS5NzHzDP/BvFHJruueQ9XAeNOdpI+CH+PWid8RA7KCwAQ== dependencies: base64url "3.x.x" oauth "0.9.x" @@ -15436,11 +14005,6 @@ passport@0.6.0: pause "0.0.1" utils-merge "^1.0.1" -path-browserify@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" - integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== - path-browserify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" @@ -15451,13 +14015,6 @@ path-dirname@^1.0.0: resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" integrity sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q== -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - integrity sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ== - dependencies: - pinkie-promise "^2.0.0" - path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -15493,6 +14050,14 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-scurry@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.7.0.tgz#99c741a2cfbce782294a39994d63748b5a24f6db" + integrity sha512-UkZUeDjczjYRE495+9thsgcVgsaCPkaw80slmfVFgllxY+IO8ubTsOpFVjDPROBqJdHfVPUFRHPBV/WciOVfWg== + dependencies: + lru-cache "^9.0.0" + minipass "^5.0.0" + path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" @@ -15508,15 +14073,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@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - integrity sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg== - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" - path-type@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" @@ -15529,21 +14085,24 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pathe@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.0.tgz#e2e13f6c62b31a3289af4ba19886c230f295ec03" + integrity sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w== + pause@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d" integrity sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg== -pbkdf2@^3.0.3: - version "3.1.2" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" - integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== +peek-stream@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/peek-stream/-/peek-stream-1.1.3.tgz#3b35d84b7ccbbd262fff31dc10da56856ead6d67" + integrity sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA== dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" + buffer-from "^1.0.0" + duplexify "^3.5.0" + through2 "^2.0.3" pend@~1.2.0: version "1.2.0" @@ -15562,11 +14121,6 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== -picocolors@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" - integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== - picocolors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" @@ -15577,7 +14131,7 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.0, picomatc resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -pify@^2.0.0, pify@^2.2.0, pify@^2.3.0: +pify@^2.2.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== @@ -15592,19 +14146,7 @@ pify@^4.0.1: resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw== - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== - -pirates@^4.0.1, pirates@^4.0.4, pirates@^4.0.5: +pirates@^4.0.4, pirates@^4.0.5: version "4.0.5" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== @@ -15646,13 +14188,6 @@ pluralize@8.0.0: resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== -pnp-webpack-plugin@1.6.4: - version "1.6.4" - resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149" - integrity sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg== - dependencies: - ts-pnp "^1.1.6" - polished@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/polished/-/polished-4.2.2.tgz#2529bb7c3198945373c52e34618c8fe7b1aa84d1" @@ -15661,26 +14196,19 @@ polished@^4.2.2: "@babel/runtime" "^7.17.8" portfinder@^1.0.28: - version "1.0.28" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" - integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA== + version "1.0.32" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.32.tgz#2fe1b9e58389712429dc2bea5beb2146146c7f81" + integrity sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg== dependencies: - async "^2.6.2" - debug "^3.1.1" - mkdirp "^0.5.5" + async "^2.6.4" + debug "^3.2.7" + mkdirp "^0.5.6" 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-attribute-case-insensitive@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz#03d761b24afc04c09e757e92ff53716ae8ea2741" - integrity sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ== - dependencies: - postcss-selector-parser "^6.0.10" - postcss-calc@^8.2.3: version "8.2.4" resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.2.4.tgz#77b9c29bfcbe8a07ff6693dc87050828889739a5" @@ -15689,80 +14217,24 @@ postcss-calc@^8.2.3: postcss-selector-parser "^6.0.9" postcss-value-parser "^4.2.0" -postcss-clamp@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/postcss-clamp/-/postcss-clamp-4.1.0.tgz#7263e95abadd8c2ba1bd911b0b5a5c9c93e02363" - integrity sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-color-functional-notation@^4.2.4: - version "4.2.4" - resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz#21a909e8d7454d3612d1659e471ce4696f28caec" - integrity sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-color-hex-alpha@^8.0.4: - version "8.0.4" - resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz#c66e2980f2fbc1a63f5b079663340ce8b55f25a5" - integrity sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-color-rebeccapurple@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz#63fdab91d878ebc4dd4b7c02619a0c3d6a56ced0" - integrity sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-colormin@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.3.0.tgz#3cee9e5ca62b2c27e84fce63affc0cfb5901956a" - integrity sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg== +postcss-colormin@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.3.1.tgz#86c27c26ed6ba00d96c79e08f3ffb418d1d1988f" + integrity sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ== dependencies: - browserslist "^4.16.6" + browserslist "^4.21.4" caniuse-api "^3.0.0" colord "^2.9.1" postcss-value-parser "^4.2.0" -postcss-convert-values@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.1.2.tgz#31586df4e184c2e8890e8b34a0b9355313f503ab" - integrity sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g== - dependencies: - browserslist "^4.20.3" - postcss-value-parser "^4.2.0" - -postcss-custom-media@^8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz#c8f9637edf45fef761b014c024cee013f80529ea" - integrity sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-custom-properties@^12.1.8: - version "12.1.8" - resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-12.1.8.tgz#aa003e1885c5bd28e2e32496cd597e389ca889e4" - integrity sha512-8rbj8kVu00RQh2fQF81oBqtduiANu4MIxhyf0HbbStgPtnFlWn0yiaYTpLHrPnJbffVY1s9apWsIoVZcc68FxA== +postcss-convert-values@^5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz#04998bb9ba6b65aa31035d669a6af342c5f9d393" + integrity sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA== dependencies: + browserslist "^4.21.4" postcss-value-parser "^4.2.0" -postcss-custom-selectors@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz#1ab4684d65f30fed175520f82d223db0337239d9" - integrity sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg== - dependencies: - postcss-selector-parser "^6.0.4" - -postcss-dir-pseudo-class@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz#2bf31de5de76added44e0a25ecf60ae9f7c7c26c" - integrity sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA== - dependencies: - postcss-selector-parser "^6.0.10" - postcss-discard-comments@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz#8df5e81d2925af2780075840c1526f0660e53696" @@ -15783,60 +14255,7 @@ postcss-discard-overridden@^5.1.0: resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz#7e8c5b53325747e9d90131bb88635282fb4a276e" integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw== -postcss-double-position-gradients@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz#b96318fdb477be95997e86edd29c6e3557a49b91" - integrity sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ== - dependencies: - "@csstools/postcss-progressive-custom-properties" "^1.1.0" - postcss-value-parser "^4.2.0" - -postcss-env-function@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-4.0.6.tgz#7b2d24c812f540ed6eda4c81f6090416722a8e7a" - integrity sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-flexbugs-fixes@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.1.tgz#9218a65249f30897deab1033aced8578562a6690" - integrity sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ== - dependencies: - postcss "^7.0.26" - -postcss-focus-visible@^6.0.4: - version "6.0.4" - resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz#50c9ea9afa0ee657fb75635fabad25e18d76bf9e" - integrity sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw== - dependencies: - postcss-selector-parser "^6.0.9" - -postcss-focus-within@^5.0.4: - version "5.0.4" - resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz#5b1d2ec603195f3344b716c0b75f61e44e8d2e20" - integrity sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ== - dependencies: - postcss-selector-parser "^6.0.9" - -postcss-font-variant@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz#efd59b4b7ea8bb06127f2d031bfbb7f24d32fa66" - integrity sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA== - -postcss-gap-properties@^3.0.5: - version "3.0.5" - resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz#f7e3cddcf73ee19e94ccf7cb77773f9560aa2fff" - integrity sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg== - -postcss-image-set-function@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz#08353bd756f1cbfb3b6e93182c7829879114481f" - integrity sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-import@14.1.0, postcss-import@~14.1.0: +postcss-import@~14.1.0: version "14.1.0" resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-14.1.0.tgz#a7333ffe32f0b8795303ee9e40215dac922781f0" integrity sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw== @@ -15845,38 +14264,14 @@ postcss-import@14.1.0, postcss-import@~14.1.0: read-cache "^1.0.0" resolve "^1.1.7" -postcss-initial@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-4.0.1.tgz#529f735f72c5724a0fb30527df6fb7ac54d7de42" - integrity sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ== - -postcss-lab-function@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz#6fe4c015102ff7cd27d1bd5385582f67ebdbdc98" - integrity sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w== - dependencies: - "@csstools/postcss-progressive-custom-properties" "^1.1.0" - postcss-value-parser "^4.2.0" - -postcss-loader@7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-7.0.1.tgz#4c883cc0a1b2bfe2074377b7a74c1cd805684395" - integrity sha512-VRviFEyYlLjctSM93gAZtcJJ/iSkPZ79zWbN/1fSH+NisBByEiVLqpdVDrPLVSi8DX0oJo12kL/GppTBdKVXiQ== +postcss-loader@7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-7.0.2.tgz#b53ff44a26fba3688eee92a048c7f2d4802e23bb" + integrity sha512-fUJzV/QH7NXUAqV8dWJ9Lg4aTkDCezpTS5HgJ2DvqznexTbSTxgi/dTECvTZ15BwKTtk8G/bqI/QTu2HPd3ZCg== dependencies: cosmiconfig "^7.0.0" klona "^2.0.5" - semver "^7.3.7" - -postcss-loader@^4.2.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-4.3.0.tgz#2c4de9657cd4f07af5ab42bd60a673004da1b8cc" - integrity sha512-M/dSoIiNDOo8Rk0mUqoj4kpGq91gcxCfb9PoyZVdZ76/AuhxylHDYZblNE8o+EQ9AMSASeMFEKxZf5aU6wlx1Q== - dependencies: - cosmiconfig "^7.0.0" - klona "^2.0.4" - loader-utils "^2.0.0" - schema-utils "^3.0.0" - semver "^7.3.4" + semver "^7.3.8" postcss-loader@^6.1.1: version "6.2.1" @@ -15887,30 +14282,20 @@ postcss-loader@^6.1.1: klona "^2.0.5" semver "^7.3.5" -postcss-logical@^5.0.4: - version "5.0.4" - resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-5.0.4.tgz#ec75b1ee54421acc04d5921576b7d8db6b0e6f73" - integrity sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g== - -postcss-media-minmax@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz#7140bddec173e2d6d657edbd8554a55794e2a5b5" - integrity sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ== - -postcss-merge-longhand@^5.1.6: - version "5.1.6" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.1.6.tgz#f378a8a7e55766b7b644f48e5d8c789ed7ed51ce" - integrity sha512-6C/UGF/3T5OE2CEbOuX7iNO63dnvqhGZeUnKkDeifebY0XqkkvrctYSZurpNE902LDf2yKwwPFgotnfSoPhQiw== +postcss-merge-longhand@^5.1.7: + version "5.1.7" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz#24a1bdf402d9ef0e70f568f39bdc0344d568fb16" + integrity sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ== dependencies: postcss-value-parser "^4.2.0" - stylehacks "^5.1.0" + stylehacks "^5.1.1" -postcss-merge-rules@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.1.2.tgz#7049a14d4211045412116d79b751def4484473a5" - integrity sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ== +postcss-merge-rules@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz#2f26fa5cacb75b1402e213789f6766ae5e40313c" + integrity sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g== dependencies: - browserslist "^4.16.6" + browserslist "^4.21.4" caniuse-api "^3.0.0" cssnano-utils "^3.1.0" postcss-selector-parser "^6.0.5" @@ -15931,12 +14316,12 @@ postcss-minify-gradients@^5.1.1: cssnano-utils "^3.1.0" postcss-value-parser "^4.2.0" -postcss-minify-params@^5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz#ac41a6465be2db735099bbd1798d85079a6dc1f9" - integrity sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg== +postcss-minify-params@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz#c06a6c787128b3208b38c9364cfc40c8aa5d7352" + integrity sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw== dependencies: - browserslist "^4.16.6" + browserslist "^4.21.4" cssnano-utils "^3.1.0" postcss-value-parser "^4.2.0" @@ -15947,28 +14332,11 @@ postcss-minify-selectors@^5.2.1: dependencies: postcss-selector-parser "^6.0.5" -postcss-modules-extract-imports@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" - integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== - dependencies: - postcss "^7.0.5" - postcss-modules-extract-imports@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== -postcss-modules-local-by-default@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz#bb14e0cc78279d504dbdcbfd7e0ca28993ffbbb0" - integrity sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw== - dependencies: - icss-utils "^4.1.1" - postcss "^7.0.32" - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.1.0" - postcss-modules-local-by-default@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" @@ -15978,14 +14346,6 @@ postcss-modules-local-by-default@^4.0.0: postcss-selector-parser "^6.0.2" postcss-value-parser "^4.1.0" -postcss-modules-scope@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" - integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ== - dependencies: - postcss "^7.0.6" - postcss-selector-parser "^6.0.0" - postcss-modules-scope@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" @@ -15993,14 +14353,6 @@ postcss-modules-scope@^3.0.0: dependencies: postcss-selector-parser "^6.0.4" -postcss-modules-values@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" - integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg== - dependencies: - icss-utils "^4.0.0" - postcss "^7.0.6" - postcss-modules-values@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" @@ -16008,14 +14360,6 @@ postcss-modules-values@^4.0.0: dependencies: icss-utils "^5.0.0" -postcss-nesting@^10.1.10: - version "10.1.10" - resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-10.1.10.tgz#9c396df3d8232cbedfa95baaac6b765b8fd2a817" - integrity sha512-lqd7LXCq0gWc0wKXtoKDru5wEUNjm3OryLVNRZ8OnW8km6fSNUuFrjEhU3nklxXE2jvd4qrox566acgh+xQt8w== - dependencies: - "@csstools/selector-specificity" "^2.0.0" - postcss-selector-parser "^6.0.10" - postcss-normalize-charset@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz#9302de0b29094b52c259e9b2cf8dc0879879f0ed" @@ -16056,12 +14400,12 @@ postcss-normalize-timing-functions@^5.1.0: dependencies: postcss-value-parser "^4.2.0" -postcss-normalize-unicode@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz#3d23aede35e160089a285e27bf715de11dc9db75" - integrity sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ== +postcss-normalize-unicode@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz#f67297fca3fea7f17e0d2caa40769afc487aa030" + integrity sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA== dependencies: - browserslist "^4.16.6" + browserslist "^4.21.4" postcss-value-parser "^4.2.0" postcss-normalize-url@^5.1.0: @@ -16079,11 +14423,6 @@ postcss-normalize-whitespace@^5.1.1: dependencies: postcss-value-parser "^4.2.0" -postcss-opacity-percentage@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.2.tgz#bd698bb3670a0a27f6d657cc16744b3ebf3b1145" - integrity sha512-lyUfF7miG+yewZ8EAk9XUBIlrHyUE6fijnesuz+Mj5zrIHIEw6KcIZSOk/elVMqzLvREmXB83Zi/5QpNRYd47w== - postcss-ordered-values@^5.1.3: version "5.1.3" resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz#b6fd2bd10f937b23d86bc829c69e7732ce76ea38" @@ -16092,93 +14431,12 @@ postcss-ordered-values@^5.1.3: cssnano-utils "^3.1.0" postcss-value-parser "^4.2.0" -postcss-overflow-shorthand@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz#7ed6486fec44b76f0eab15aa4866cda5d55d893e" - integrity sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-page-break@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-3.0.4.tgz#7fbf741c233621622b68d435babfb70dd8c1ee5f" - integrity sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ== - -postcss-place@^7.0.5: - version "7.0.5" - resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-7.0.5.tgz#95dbf85fd9656a3a6e60e832b5809914236986c4" - integrity sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-preset-env@7.8.0: - version "7.8.0" - resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-7.8.0.tgz#5bd3ad53b2ef02edd41645d1ffee1ff8a49f24e5" - integrity sha512-leqiqLOellpLKfbHkD06E04P6d9ZQ24mat6hu4NSqun7WG0UhspHR5Myiv/510qouCjoo4+YJtNOqg5xHaFnCA== - dependencies: - "@csstools/postcss-cascade-layers" "^1.0.5" - "@csstools/postcss-color-function" "^1.1.1" - "@csstools/postcss-font-format-keywords" "^1.0.1" - "@csstools/postcss-hwb-function" "^1.0.2" - "@csstools/postcss-ic-unit" "^1.0.1" - "@csstools/postcss-is-pseudo-class" "^2.0.7" - "@csstools/postcss-nested-calc" "^1.0.0" - "@csstools/postcss-normalize-display-values" "^1.0.1" - "@csstools/postcss-oklab-function" "^1.1.1" - "@csstools/postcss-progressive-custom-properties" "^1.3.0" - "@csstools/postcss-stepped-value-functions" "^1.0.1" - "@csstools/postcss-text-decoration-shorthand" "^1.0.0" - "@csstools/postcss-trigonometric-functions" "^1.0.2" - "@csstools/postcss-unset-value" "^1.0.2" - autoprefixer "^10.4.8" - browserslist "^4.21.3" - css-blank-pseudo "^3.0.3" - css-has-pseudo "^3.0.4" - css-prefers-color-scheme "^6.0.3" - cssdb "^7.0.0" - postcss-attribute-case-insensitive "^5.0.2" - postcss-clamp "^4.1.0" - postcss-color-functional-notation "^4.2.4" - postcss-color-hex-alpha "^8.0.4" - postcss-color-rebeccapurple "^7.1.1" - postcss-custom-media "^8.0.2" - postcss-custom-properties "^12.1.8" - postcss-custom-selectors "^6.0.3" - postcss-dir-pseudo-class "^6.0.5" - postcss-double-position-gradients "^3.1.2" - postcss-env-function "^4.0.6" - postcss-focus-visible "^6.0.4" - postcss-focus-within "^5.0.4" - postcss-font-variant "^5.0.0" - postcss-gap-properties "^3.0.5" - postcss-image-set-function "^4.0.7" - postcss-initial "^4.0.1" - postcss-lab-function "^4.2.1" - postcss-logical "^5.0.4" - postcss-media-minmax "^5.0.0" - postcss-nesting "^10.1.10" - postcss-opacity-percentage "^1.1.2" - postcss-overflow-shorthand "^3.0.4" - postcss-page-break "^3.0.4" - postcss-place "^7.0.5" - postcss-pseudo-class-any-link "^7.1.6" - postcss-replace-overflow-wrap "^4.0.0" - postcss-selector-not "^6.0.1" - postcss-value-parser "^4.2.0" - -postcss-pseudo-class-any-link@^7.1.6: - version "7.1.6" - resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz#2693b221902da772c278def85a4d9a64b6e617ab" - integrity sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w== - dependencies: - postcss-selector-parser "^6.0.10" - -postcss-reduce-initial@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz#fc31659ea6e85c492fb2a7b545370c215822c5d6" - integrity sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw== +postcss-reduce-initial@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz#798cd77b3e033eae7105c18c9d371d989e1382d6" + integrity sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg== dependencies: - browserslist "^4.16.6" + browserslist "^4.21.4" caniuse-api "^3.0.0" postcss-reduce-transforms@^5.1.0: @@ -16188,22 +14446,10 @@ postcss-reduce-transforms@^5.1.0: dependencies: postcss-value-parser "^4.2.0" -postcss-replace-overflow-wrap@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz#d2df6bed10b477bf9c52fab28c568b4b29ca4319" - integrity sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw== - -postcss-selector-not@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz#8f0a709bf7d4b45222793fc34409be407537556d" - integrity sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ== - dependencies: - postcss-selector-parser "^6.0.10" - -postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: - version "6.0.10" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d" - integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== +postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: + version "6.0.12" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.12.tgz#2efae5ffab3c8bfb2b7fbf0c426e3bca616c4abb" + integrity sha512-NdxGCAZdRrwVI1sy59+Wzrh+pMMHxapGnpfenDVlMEXoOcvt4pGE0JLK9YY2F5dLxcFYA/YbVQKhcGU+FtSYQg== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -16228,29 +14474,21 @@ 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.16: - version "8.4.16" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.16.tgz#33a1d675fac39941f5f445db0de4db2b6e01d43c" - integrity sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ== +postcss@8.4.21: + version "8.4.21" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4" + integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== dependencies: nanoid "^3.3.4" picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@^7.0.14, postcss@^7.0.26, postcss@^7.0.32, postcss@^7.0.36, postcss@^7.0.5, postcss@^7.0.6: - version "7.0.39" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309" - integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== +postcss@^8.2.14, postcss@^8.3.5, postcss@^8.3.7, postcss@^8.4.14, postcss@^8.4.19: + version "8.4.23" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.23.tgz#df0aee9ac7c5e53e1075c24a3613496f9e6552ab" + integrity sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA== dependencies: - picocolors "^0.2.1" - source-map "^0.6.1" - -postcss@^8.2.14, postcss@^8.2.15, postcss@^8.3.5, postcss@^8.3.7, postcss@^8.4.14, postcss@^8.4.7: - version "8.4.14" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.14.tgz#ee9274d5622b4858c1007a74d76e42e56fd21caf" - integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig== - dependencies: - nanoid "^3.3.4" + nanoid "^3.3.6" picocolors "^1.0.0" source-map-js "^1.0.2" @@ -16269,29 +14507,21 @@ prettier-plugin-organize-attributes@0.0.5: resolved "https://registry.yarnpkg.com/prettier-plugin-organize-attributes/-/prettier-plugin-organize-attributes-0.0.5.tgz#46e54533936fc42a3cff3d876a738a3f98df0360" integrity sha512-dSts16q8wd+oq8Zwk5mwmYXo1aN3B+ZkEJqx/ar5fedNHdOvx7S4XDMH/pNK7rmBW0bPXkp/kJX5gAANsWzh3A== -prettier@2.7.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" - integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== +prettier@2.8.4: + version "2.8.4" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.4.tgz#34dd2595629bfbb79d344ac4a91ff948694463c3" + integrity sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw== -"prettier@>=2.2.1 <=2.3.0": - version "2.3.0" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.0.tgz#b6a5bf1284026ae640f17f7ff5658a7567fc0d18" - integrity sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w== +prettier@^2.8.0: + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== pretty-bytes@^5.3.0, pretty-bytes@^5.4.1: version "5.6.0" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== -pretty-error@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.2.tgz#be89f82d81b1c86ec8fdfbc385045882727f93b6" - integrity sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw== - dependencies: - lodash "^4.17.20" - renderkid "^2.0.4" - pretty-error@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" @@ -16300,13 +14530,12 @@ pretty-error@^4.0.0: lodash "^4.17.20" renderkid "^3.0.0" -pretty-format@^28.0.0, pretty-format@^28.1.1, pretty-format@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.1.3.tgz#c9fba8cedf99ce50963a11b27d982a9ae90970d5" - integrity sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q== +pretty-format@^29.0.0, pretty-format@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.5.0.tgz#283134e74f70e2e3e7229336de0e4fce94ccde5a" + integrity sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw== dependencies: - "@jest/schemas" "^28.1.3" - ansi-regex "^5.0.1" + "@jest/schemas" "^29.4.3" ansi-styles "^5.0.0" react-is "^18.0.0" @@ -16315,27 +14544,22 @@ 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@4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/prisma/-/prisma-4.4.0.tgz#0c53324bf6a29474636b3e1964e0d72e0277bf8f" - integrity sha512-l/QKLmLcKJQFuc+X02LyICo0NWTUVaNNZ00jKJBqwDyhwMAhboD1FWwYV50rkH4Wls0RviAJSFzkC2ZrfawpfA== +prisma@4.15.0: + version "4.15.0" + resolved "https://registry.yarnpkg.com/prisma/-/prisma-4.15.0.tgz#4faa94f0d584828b68468953ff0bc88f37912c8c" + integrity sha512-iKZZpobPl48gTcSZVawLMQ3lEy6BnXwtoMj7hluoGFYu2kQ6F9LBuBrUyF95zRVnNo8/3KzLXJXJ5TEnLSJFiA== dependencies: - "@prisma/engines" "4.4.0" + "@prisma/engines" "4.15.0" -prismjs@^1.27.0, prismjs@^1.28.0: - version "1.28.0" - resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.28.0.tgz#0d8f561fa0f7cf6ebca901747828b149147044b6" - integrity sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw== +prismjs@^1.28.0: + version "1.29.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12" + integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== -prismjs@~1.27.0: - version "1.27.0" - resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.27.0.tgz#bb6ee3138a0b438a3653dd4d6ce0cc6510a45057" - integrity sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA== - -proc-log@^2.0.0, proc-log@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-2.0.1.tgz#8f3f69a1f608de27878f91f5c688b225391cb685" - integrity sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw== +proc-log@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-3.0.0.tgz#fb05ef83ccd64fd7b20bbe9c8c1070fc08338dd8" + integrity sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A== process-nextick-args@~2.0.0: version "2.0.1" @@ -16347,7 +14571,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.0, 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== @@ -16365,27 +14589,6 @@ promise-retry@^2.0.1: err-code "^2.0.2" retry "^0.12.0" -promise.allsettled@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/promise.allsettled/-/promise.allsettled-1.0.5.tgz#2443f3d4b2aa8dfa560f6ac2aa6c4ea999d75f53" - integrity sha512-tVDqeZPoBC0SlzJHzWGZ2NKAguVq2oiYj7gbggbiTvH2itHohijTp7njOUA0aQ/nl+0lr/r6egmhoYu63UZ/pQ== - dependencies: - array.prototype.map "^1.0.4" - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - get-intrinsic "^1.1.1" - iterate-value "^1.0.2" - -promise.prototype.finally@^3.1.0: - version "3.1.3" - resolved "https://registry.yarnpkg.com/promise.prototype.finally/-/promise.prototype.finally-3.1.3.tgz#d3186e58fcf4df1682a150f934ccc27b7893389c" - integrity sha512-EXRF3fC9/0gz4qkt/f5EP5iW4kj9oFpBICNpCNOb/52+8nlHIX07FPLbi/q4qYBQ1xZqivMzTpNQSnArVASolQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - prompts@^2.0.1, prompts@^2.4.0: version "2.4.2" resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" @@ -16394,7 +14597,7 @@ prompts@^2.0.1, prompts@^2.4.0: kleur "^3.0.3" sisteransi "^1.0.5" -prop-types@^15.0.0, prop-types@^15.6.2, prop-types@^15.7.2: +prop-types@^15.7.2: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -16403,13 +14606,6 @@ prop-types@^15.0.0, prop-types@^15.6.2, prop-types@^15.7.2: object-assign "^4.1.1" react-is "^16.13.1" -property-information@^5.0.0, property-information@^5.3.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69" - integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== - dependencies: - xtend "^4.0.0" - proxy-addr@~2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" @@ -16418,7 +14614,7 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" -proxy-from-env@^1.1.0: +proxy-from-env@^1.0.0, proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== @@ -16429,21 +14625,9 @@ prr@~1.0.1: integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== psl@^1.1.28, psl@^1.1.33: - version "1.8.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" - integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== - -public-encrypt@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" - integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - safe-buffer "^5.1.2" + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== pump@^2.0.0: version "2.0.1" @@ -16475,15 +14659,31 @@ punycode@1.3.2: resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw== -punycode@^1.2.4: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== - punycode@^2.1.0, punycode@^2.1.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + +puppeteer-core@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-2.1.1.tgz#e9b3fbc1237b4f66e25999832229e9db3e0b90ed" + integrity sha512-n13AWriBMPYxnpbb6bnaY5YoY6rGj8vPLrz6CZF3o0qJNEwlcfJVxBzYZ0NJsQ21UbdJoijPCDrM++SUVEz7+w== + dependencies: + "@types/mime-types" "^2.1.0" + debug "^4.1.0" + extract-zip "^1.6.6" + https-proxy-agent "^4.0.0" + mime "^2.0.3" + mime-types "^2.1.25" + progress "^2.0.1" + proxy-from-env "^1.0.0" + rimraf "^2.6.1" + ws "^6.1.0" + +pure-rand@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.2.tgz#a9c2ddcae9b68d736a8163036f088a2781c8b306" + integrity sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ== pvtsutils@^1.3.2: version "1.3.2" @@ -16504,32 +14704,36 @@ qs@6.10.3: dependencies: side-channel "^1.0.4" -qs@^6.10.0, qs@^6.4.0, qs@^6.6.0: +qs@6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + +qs@^6.10.0, qs@^6.11.0, qs@^6.4.0: + version "6.11.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.1.tgz#6c29dff97f0c0060765911ba65cbc9764186109f" + integrity sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ== + dependencies: + side-channel "^1.0.4" + +qs@~6.10.3: version "6.10.5" resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.5.tgz#974715920a80ff6a262264acd2c7e6c2a53282b4" integrity sha512-O5RlPh0VFtR78y79rgcgKK4wbAI0C5zGVLztOIdpWX6ep368q5Hv6XRxDvXuZ9q3C6v+e3n8UfZZJw7IIG27eQ== dependencies: side-channel "^1.0.4" -qs@~6.5.2: - version "6.5.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" - integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== - -querystring-es3@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" - integrity sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA== - querystring@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" integrity sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g== -querystring@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.1.tgz#40d77615bb09d16902a85c3e38aa8b5ed761c2dd" - integrity sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg== +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== queue-microtask@^1.2.2: version "1.2.3" @@ -16546,21 +14750,13 @@ ramda@~0.26.1: resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.26.1.tgz#8d41351eb8111c55353617fc3bbffad8e4d35d06" integrity sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ== -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: +randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" -randomfill@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" - integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== - dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" - 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" @@ -16576,32 +14772,23 @@ raw-body@2.5.1: iconv-lite "0.4.24" unpipe "1.0.0" -raw-loader@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-4.0.2.tgz#1aac6b7d1ad1501e66efdac1522c73e59a584eb6" - integrity sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA== - dependencies: - loader-utils "^2.0.0" - schema-utils "^3.0.0" +react-colorful@^5.1.2: + version "5.6.1" + resolved "https://registry.yarnpkg.com/react-colorful/-/react-colorful-5.6.1.tgz#7dc2aed2d7c72fac89694e834d179e32f3da563b" + integrity sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw== -react-dom@^16.14.0: - version "16.14.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.14.0.tgz#7ad838ec29a777fb3c75c3a190f661cf92ab8b89" - integrity sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw== +react-dom@18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" + integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== dependencies: loose-envify "^1.1.0" - object-assign "^4.1.1" - prop-types "^15.6.2" - scheduler "^0.19.1" + scheduler "^0.23.0" -react-inspector@^5.1.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/react-inspector/-/react-inspector-5.1.1.tgz#58476c78fde05d5055646ed8ec02030af42953c8" - integrity sha512-GURDaYzoLbW8pMGXwYPDBIv6nqei4kK7LPRZ9q9HCZF54wqXz/dnylBp/kfE9XmekBhHvLDdcYeyIwSrvtOiWg== - dependencies: - "@babel/runtime" "^7.0.0" - is-dom "^1.0.0" - prop-types "^15.0.0" +react-inspector@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/react-inspector/-/react-inspector-6.0.1.tgz#1a37f0165d9df81ee804d63259eaaeabe841287d" + integrity sha512-cxKSeFTf7jpSSVddm66sKdolG90qURAX3g1roTeaN6x0YEbtWc8JpmFN9+yIqLNH2uEkYerWLtJZIXRIFuBKrg== react-is@^16.13.1: version "16.13.1" @@ -16613,25 +14800,12 @@ react-is@^18.0.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== -react-syntax-highlighter@^15.4.5: - version "15.5.0" - resolved "https://registry.yarnpkg.com/react-syntax-highlighter/-/react-syntax-highlighter-15.5.0.tgz#4b3eccc2325fa2ec8eff1e2d6c18fa4a9e07ab20" - integrity sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg== - dependencies: - "@babel/runtime" "^7.3.1" - highlight.js "^10.4.1" - lowlight "^1.17.0" - prismjs "^1.27.0" - refractor "^3.6.0" - -react@^16.14.0: - version "16.14.0" - resolved "https://registry.yarnpkg.com/react/-/react-16.14.0.tgz#94d776ddd0aaa37da3eda8fc5b6b18a4c9a3114d" - integrity sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g== +react@18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" + integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== dependencies: loose-envify "^1.1.0" - object-assign "^4.1.1" - prop-types "^15.6.2" read-cache@^1.0.0: version "1.0.0" @@ -16640,31 +14814,23 @@ read-cache@^1.0.0: dependencies: pify "^2.3.0" -read-package-json-fast@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz#323ca529630da82cb34b36cc0b996693c98c2b83" - integrity sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ== - dependencies: - json-parse-even-better-errors "^2.3.0" - npm-normalize-package-bin "^1.0.1" - -read-package-json@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-5.0.1.tgz#1ed685d95ce258954596b13e2e0e76c7d0ab4c26" - integrity sha512-MALHuNgYWdGW3gKzuNMuYtcSSZbGQm94fAp16xt8VsYTLBjUSc55bLMKe6gzpWue0Tfi6CBgwCSdDAqutGDhMg== +read-package-json-fast@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz#394908a9725dc7a5f14e70c8e7556dff1d2b1049" + integrity sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw== dependencies: - glob "^8.0.1" - json-parse-even-better-errors "^2.3.1" - normalize-package-data "^4.0.0" - npm-normalize-package-bin "^1.0.1" + json-parse-even-better-errors "^3.0.0" + npm-normalize-package-bin "^3.0.0" -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - integrity sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A== +read-package-json@^6.0.0: + version "6.0.3" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-6.0.3.tgz#726116b75e00eac2075240995f05681af4ca7122" + integrity sha512-4QbpReW4kxFgeBQ0vPAqh2y8sXEB3D4t3jsXbJKIhBiF80KT6XRo45reqwtftju5J6ru1ax06A2Gb/wM1qCOEQ== dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" + glob "^10.2.2" + json-parse-even-better-errors "^3.0.0" + normalize-package-data "^5.0.0" + npm-normalize-package-bin "^3.0.0" read-pkg-up@^7.0.1: version "7.0.1" @@ -16675,15 +14841,6 @@ read-pkg-up@^7.0.1: read-pkg "^5.2.0" type-fest "^0.8.1" -read-pkg@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - integrity sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ== - dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" - read-pkg@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" @@ -16694,10 +14851,10 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== +readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.2.2, readable-stream@~2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -16708,23 +14865,14 @@ read-pkg@^5.2.0: util-deprecate "~1.0.1" readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" util-deprecate "^1.0.1" -readdirp@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" - integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== - dependencies: - graceful-fs "^4.1.11" - micromatch "^3.1.10" - readable-stream "^2.0.2" - readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -16732,15 +14880,35 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" -redent@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" - integrity sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g== +recast@^0.21.0: + version "0.21.5" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.21.5.tgz#e8cd22bb51bcd6130e54f87955d33a2b2e57b495" + integrity sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg== dependencies: - indent-string "^2.1.0" - strip-indent "^1.0.1" + ast-types "0.15.2" + esprima "~4.0.0" + source-map "~0.6.1" + tslib "^2.0.1" + +recast@^0.23.1: + version "0.23.1" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.23.1.tgz#ee415a5561d2f99f02318ea8db81ad3a2267a6ff" + integrity sha512-RokaBcoxSjXUDzz1TXSZmZsSW6ZpLmlA3GGqJ8uuTrQ9hZhEz+4Tpsc+gRvYRJ2BU4H+ZyUlg91eSGDw7bwy7g== + dependencies: + assert "^2.0.0" + ast-types "^0.16.1" + esprima "~4.0.0" + source-map "~0.6.1" + tslib "^2.0.1" -redis-commands@1.7.0, redis-commands@^1.7.0: +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== + dependencies: + resolve "^1.1.6" + +redis-commands@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/redis-commands/-/redis-commands-1.7.0.tgz#15a6fea2d58281e27b1cd1acfb4b293e278c3a89" integrity sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ== @@ -16772,19 +14940,10 @@ reflect-metadata@0.1.13, reflect-metadata@^0.1.2: resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== -refractor@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/refractor/-/refractor-3.6.0.tgz#ac318f5a0715ead790fcfb0c71f4dd83d977935a" - integrity sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA== - dependencies: - hastscript "^6.0.0" - parse-entities "^2.0.0" - prismjs "~1.27.0" - -regenerate-unicode-properties@^10.0.1: - version "10.0.1" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz#7f442732aa7934a3740c779bb9b3340dccc1fb56" - integrity sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw== +regenerate-unicode-properties@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" + integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== dependencies: regenerate "^1.4.2" @@ -16793,15 +14952,15 @@ regenerate@^1.4.2: resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== -regenerator-runtime@0.13.9, regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.7: - version "0.13.9" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" - integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== +regenerator-runtime@^0.13.11: + version "0.13.11" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== -regenerator-transform@^0.15.0: - version "0.15.0" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.0.tgz#cbd9ead5d77fae1a48d957cf889ad0586adb6537" - integrity sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg== +regenerator-transform@^0.15.1: + version "0.15.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" + integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== dependencies: "@babel/runtime" "^7.8.4" @@ -16818,14 +14977,14 @@ regex-parser@^2.2.11: resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58" integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== -regexp.prototype.flags@^1.4.1, regexp.prototype.flags@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" - integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== +regexp.prototype.flags@^1.4.3, regexp.prototype.flags@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" + integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - functions-have-names "^1.2.2" + define-properties "^1.2.0" + functions-have-names "^1.2.3" regexpp@^2.0.1: version "2.0.1" @@ -16837,39 +14996,22 @@ regexpp@^3.2.0: resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== -regexpu-core@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.0.1.tgz#c531122a7840de743dcf9c83e923b5560323ced3" - integrity sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw== - dependencies: - regenerate "^1.4.2" - regenerate-unicode-properties "^10.0.1" - regjsgen "^0.6.0" - regjsparser "^0.8.2" - unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.0.0" - -regexpu-core@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.1.0.tgz#2f8504c3fd0ebe11215783a41541e21c79942c6d" - integrity sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA== +regexpu-core@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" + integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== dependencies: + "@babel/regjsgen" "^0.8.0" regenerate "^1.4.2" - regenerate-unicode-properties "^10.0.1" - regjsgen "^0.6.0" - regjsparser "^0.8.2" + regenerate-unicode-properties "^10.1.0" + regjsparser "^0.9.1" unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.0.0" - -regjsgen@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.6.0.tgz#83414c5354afd7d6627b16af5f10f41c4e71808d" - integrity sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA== + unicode-match-property-value-ecmascript "^2.1.0" -regjsparser@^0.8.2: - version "0.8.4" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.8.4.tgz#8a14285ffcc5de78c5b95d62bbf413b6bc132d5f" - integrity sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA== +regjsparser@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== dependencies: jsesc "~0.5.0" @@ -16889,47 +15031,6 @@ remark-external-links@^8.0.0: space-separated-tokens "^1.0.0" unist-util-visit "^2.0.0" -remark-footnotes@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/remark-footnotes/-/remark-footnotes-2.0.0.tgz#9001c4c2ffebba55695d2dd80ffb8b82f7e6303f" - integrity sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ== - -remark-mdx@1.6.22: - version "1.6.22" - resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-1.6.22.tgz#06a8dab07dcfdd57f3373af7f86bd0e992108bbd" - integrity sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ== - dependencies: - "@babel/core" "7.12.9" - "@babel/helper-plugin-utils" "7.10.4" - "@babel/plugin-proposal-object-rest-spread" "7.12.1" - "@babel/plugin-syntax-jsx" "7.12.1" - "@mdx-js/util" "1.6.22" - is-alphabetical "1.0.4" - remark-parse "8.0.3" - unified "9.2.0" - -remark-parse@8.0.3: - version "8.0.3" - resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-8.0.3.tgz#9c62aa3b35b79a486454c690472906075f40c7e1" - integrity sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q== - dependencies: - ccount "^1.0.0" - collapse-white-space "^1.0.2" - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" - is-whitespace-character "^1.0.0" - is-word-character "^1.0.0" - markdown-escapes "^1.0.0" - parse-entities "^2.0.0" - repeat-string "^1.5.4" - state-toggle "^1.0.0" - trim "0.0.1" - trim-trailing-lines "^1.0.0" - unherit "^1.0.4" - unist-util-remove-position "^2.0.0" - vfile-location "^3.0.0" - xtend "^4.0.1" - remark-slug@^6.0.0: version "6.1.0" resolved "https://registry.yarnpkg.com/remark-slug/-/remark-slug-6.1.0.tgz#0503268d5f0c4ecb1f33315c00465ccdd97923ce" @@ -16939,29 +15040,6 @@ remark-slug@^6.0.0: mdast-util-to-string "^1.0.0" unist-util-visit "^2.0.0" -remark-squeeze-paragraphs@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz#76eb0e085295131c84748c8e43810159c5653ead" - integrity sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw== - dependencies: - mdast-squeeze-paragraphs "^4.0.0" - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw== - -renderkid@^2.0.4: - version "2.0.7" - resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.7.tgz#464f276a6bdcee606f4a15993f9b29fc74ca8609" - integrity sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ== - dependencies: - css-select "^4.1.3" - dom-converter "^0.2.0" - htmlparser2 "^6.1.0" - lodash "^4.17.21" - strip-ansi "^3.0.1" - renderkid@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-3.0.0.tgz#5fd823e4d6951d37358ecc9a58b1f06836b6268a" @@ -16978,26 +15056,19 @@ repeat-element@^1.1.2: 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.5.4, repeat-string@^1.6.1: +repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - integrity sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A== - dependencies: - is-finite "^1.0.0" - -replace-in-file@6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/replace-in-file/-/replace-in-file-6.2.0.tgz#9c0e381b0e02f27f83d5ba500bb4046f63d18566" - integrity sha512-Im2AF9G/qgkYneOc9QwWwUS/efyyonTUBvzXS2VXuxPawE5yQIjT/e6x4CTijO0Quq48lfAujuo+S89RR2TP2Q== +replace-in-file@6.3.5: + version "6.3.5" + resolved "https://registry.yarnpkg.com/replace-in-file/-/replace-in-file-6.3.5.tgz#ff956b0ab5bc96613207d603d197cd209400a654" + integrity sha512-arB9d3ENdKva2fxRnSjwBEXfK1npgyci7ZZuwysgAp7ORjHSyxz6oqIjTEv8R0Ydl4Ll7uOAZXL4vbkhGIizCg== dependencies: - chalk "^4.1.0" - glob "^7.1.6" - yargs "^16.2.0" + chalk "^4.1.2" + glob "^7.2.0" + yargs "^17.2.1" request-progress@^3.0.0: version "3.0.0" @@ -17021,6 +15092,11 @@ require-main-filename@^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" + integrity sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww== + requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" @@ -17064,11 +15140,16 @@ resolve-url@^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, resolve.exports@^1.1.0: +resolve.exports@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== +resolve.exports@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" + integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== + resolve@1.22.1: version "1.22.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" @@ -17078,12 +15159,12 @@ resolve@1.22.1: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^1.1.7, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.3.2, resolve@^1.8.1: - version "1.22.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" - integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== +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.8.1: + version "1.22.2" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" + integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== dependencies: - is-core-module "^2.8.1" + is-core-module "^2.11.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -17131,45 +15212,32 @@ 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.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@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -rimraf@^2.5.4, rimraf@^2.6.3: +rimraf@^2.6.1: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== dependencies: glob "^7.1.3" -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== +rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" + glob "^7.1.3" robust-predicates@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/robust-predicates/-/robust-predicates-3.0.1.tgz#ecde075044f7f30118682bd9fb3f123109577f9a" integrity sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g== -rsvp@^4.8.4: - version "4.8.5" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" - integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== - run-async@^2.2.0, run-async@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" @@ -17182,13 +15250,6 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -run-queue@^1.0.0, run-queue@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" - integrity sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg== - dependencies: - aproba "^1.1.1" - rw@1: version "1.3.3" resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" @@ -17211,11 +15272,20 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + 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" @@ -17228,39 +15298,18 @@ safe-regex@^1.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sane@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" - integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== - dependencies: - "@cnakazawa/watch" "^1.0.3" - anymatch "^2.0.0" - capture-exit "^2.0.0" - exec-sh "^0.3.2" - execa "^1.0.0" - fb-watchman "^2.0.0" - micromatch "^3.1.4" - minimist "^1.1.1" - walker "~1.0.5" - -sass-loader@13.0.2: - version "13.0.2" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-13.0.2.tgz#e81a909048e06520e9f2ff25113a801065adb3fe" - integrity sha512-BbiqbVmbfJaWVeOOAu2o7DhYWtcNmTfvroVgFXa6k2hHheMxNAeDHLNoDy/Q5aoaVlz0LH+MbMktKwm9vN/j8Q== - dependencies: - klona "^2.0.4" - neo-async "^2.6.2" +safevalues@^0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/safevalues/-/safevalues-0.3.4.tgz#82e846a02b6956d7d40bf9f41e92e13fce0186db" + integrity sha512-LRneZZRXNgjzwG4bDQdOTSbze3fHm1EAKN/8bePxnlEZiBmkYEDggaHbuvHI9/hoqHbGfsEA7tWS9GhYHZBBsw== -sass-loader@^10.1.0: - version "10.2.1" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-10.2.1.tgz#17e51df313f1a7a203889ce8ff91be362651276e" - integrity sha512-RRvWl+3K2LSMezIsd008ErK4rk6CulIMSwrcc2aZvjymUgKo/vjXGp1rSWmfTUX7bblEOz8tst4wBwWtCGBqKA== +sass-loader@13.2.0: + version "13.2.0" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-13.2.0.tgz#80195050f58c9aac63b792fa52acb6f5e0f6bdc3" + integrity sha512-JWEp48djQA4nbZxmgC02/Wh0eroSUutulROUusYJO9P9zltRbNN80JCBHqRGzjd4cmZCa/r88xgfkjGD0TXsHg== dependencies: klona "^2.0.4" - loader-utils "^2.0.0" neo-async "^2.6.2" - schema-utils "^3.0.0" - semver "^7.3.2" sass-loader@^12.2.0: version "12.6.0" @@ -17270,19 +15319,19 @@ sass-loader@^12.2.0: klona "^2.0.4" neo-async "^2.6.2" -sass@1.54.4: - version "1.54.4" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.54.4.tgz#803ff2fef5525f1dd01670c3915b4b68b6cba72d" - integrity sha512-3tmF16yvnBwtlPrNBHw/H907j8MlOX8aTBnlNX1yrKx24RKcJGPyLhFUwkoKBKesR3unP93/2z14Ll8NicwQUA== +sass@1.58.1: + version "1.58.1" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.58.1.tgz#17ab0390076a50578ed0733f1cc45429e03405f6" + integrity sha512-bnINi6nPXbP1XNRaranMFEBZWUfdW/AF16Ql5+ypRxfTvCRTTKrLsMIakyDcayUt2t/RZotmL4kgJwNH5xO+bg== 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.54.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.54.0.tgz#24873673265e2a4fe3d3a997f714971db2fba1f4" - integrity sha512-C4zp79GCXZfK0yoHZg+GxF818/aclhp9F48XBu/+bm9vXEVAYov9iU3FBVRMq3Hx3OA4jfKL+p2K9180mEh0xQ== + version "1.62.1" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.62.1.tgz#caa8d6bf098935bc92fc73fa169fb3790cacd029" + integrity sha512-NHpxIzN29MXvWiuswfc1W3I0N8SXBd8UR26WntmDlRYf0bSADnwnOjsyMZ3lMezSlArD33Vs3YFhp7dWvL770A== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -17293,75 +15342,38 @@ sax@^1.2.4, sax@~1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -saxes@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" - integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== +saxes@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" + integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== dependencies: xmlchars "^2.2.0" -scheduler@^0.19.1: - version "0.19.1" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196" - integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA== +scheduler@^0.23.0: + version "0.23.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" + integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== dependencies: loose-envify "^1.1.0" - object-assign "^4.1.1" - -schema-utils@2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7" - integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== - dependencies: - "@types/json-schema" "^7.0.4" - ajv "^6.12.2" - ajv-keywords "^3.4.1" - -schema-utils@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" - integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== - dependencies: - ajv "^6.1.0" - ajv-errors "^1.0.0" - ajv-keywords "^3.1.0" -schema-utils@^2.6.5, schema-utils@^2.7.0: - version "2.7.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" - integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== - dependencies: - "@types/json-schema" "^7.0.5" - ajv "^6.12.4" - ajv-keywords "^3.5.2" - -schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" - integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== +schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1, schema-utils@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.2.tgz#36c10abca6f7577aeae136c804b0c741edeadc99" + integrity sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg== dependencies: "@types/json-schema" "^7.0.8" ajv "^6.12.5" ajv-keywords "^3.5.2" schema-utils@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" - integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== + version "4.0.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.1.tgz#eb2d042df8b01f4b5c276a2dfd41ba0faab72e8d" + integrity sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ== dependencies: "@types/json-schema" "^7.0.9" - ajv "^8.8.0" + ajv "^8.9.0" ajv-formats "^2.1.1" - ajv-keywords "^5.0.0" - -secp256k1@^4.0.2: - version "4.0.3" - resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" - integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== - dependencies: - elliptic "^6.5.4" - node-addon-api "^2.0.0" - node-gyp-build "^4.2.0" + ajv-keywords "^5.1.0" secure-compare@3.0.1: version "3.0.1" @@ -17378,10 +15390,10 @@ select@^1.1.2: resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" integrity sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA== -selfsigned@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.0.1.tgz#8b2df7fa56bf014d19b6007655fff209c0ef0a56" - integrity sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ== +selfsigned@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.1.1.tgz#18a7613d714c0cd3385c48af0075abf3f266af61" + integrity sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ== dependencies: node-forge "^1" @@ -17392,16 +15404,11 @@ semver-dsl@^1.0.1: dependencies: semver "^5.3.0" -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" - integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== - semver@7.3.4: version "7.3.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" @@ -17409,10 +15416,17 @@ semver@7.3.4: dependencies: lru-cache "^6.0.0" -semver@7.3.7, semver@7.x, semver@^7.0.0, semver@^7.1.1, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7: - version "7.3.7" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== +semver@7.3.8: + version "7.3.8" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + dependencies: + lru-cache "^6.0.0" + +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: + version "7.5.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.0.tgz#ed8c5dc8efb6c629c88b23d41dc9bf40c1d96cd0" + integrity sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA== dependencies: lru-cache "^6.0.0" @@ -17421,6 +15435,11 @@ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@~7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + send@0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" @@ -17440,24 +15459,10 @@ send@0.18.0: range-parser "~1.2.1" statuses "2.0.1" -serialize-javascript@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" - integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== - dependencies: - randombytes "^2.1.0" - -serialize-javascript@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" - integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== - dependencies: - randombytes "^2.1.0" - -serialize-javascript@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" - integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== +serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" + integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== dependencies: randombytes "^2.1.0" @@ -17510,11 +15515,6 @@ set-value@^2.0.0, set-value@^2.0.1: is-plain-object "^2.0.3" split-string "^3.0.1" -setimmediate@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== - setprototypeof@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" @@ -17525,14 +15525,6 @@ setprototypeof@1.2.0: resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== -sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - shallow-clone@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" @@ -17564,6 +15556,20 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +shell-quote@^1.7.3: + version "1.8.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" + integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== + +shelljs@^0.8.5: + version "0.8.5" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" + integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + side-channel@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" @@ -17578,6 +15584,20 @@ signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +signal-exit@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.0.1.tgz#96a61033896120ec9335d96851d902cc98f0ba2a" + integrity sha512-uUWsN4aOxJAS8KOuf3QMyFtgm1pkb6I+KRZbRF/ghdf5T7sM+B1lLLzPDxswUjkmHyxQAVzEgG35E3NzDM9GVw== + +sigstore@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/sigstore/-/sigstore-1.4.0.tgz#2e3a28c08b1b8246744c27cfb179c525c3f164d8" + integrity sha512-N7TRpSbFjY/TrFDg6yGAQSYBrQ5s6qmPiq4pD6fkv1LoyfMsLG0NwZWG2s5q+uttLHgyVyTa0Rogx2P78rN8kQ== + dependencies: + "@sigstore/protobuf-specs" "^0.1.0" + make-fetch-happen "^11.0.1" + tuf-js "^1.1.3" + simple-cbor@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/simple-cbor/-/simple-cbor-0.4.1.tgz#0c88312e87db52b94e0e92f6bd1cf634e86f8a22" @@ -17590,6 +15610,13 @@ simple-swizzle@^0.2.2: dependencies: is-arrayish "^0.3.1" +simple-update-notifier@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz#67694c121de354af592b347cdba798463ed49c82" + integrity sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg== + dependencies: + semver "~7.0.0" + sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" @@ -17678,36 +15705,31 @@ socks-proxy-agent@^7.0.0: socks "^2.6.2" socks@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.6.2.tgz#ec042d7960073d40d94268ff3bb727dc685f111a" - integrity sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA== + version "2.7.1" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" + integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== dependencies: - ip "^1.1.5" + ip "^2.0.0" smart-buffer "^4.2.0" -source-list-map@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" - integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== - "source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1, source-map-js@^1.0.2: version "1.0.2" 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.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-4.0.0.tgz#bdc6b118bc6c87ee4d8d851f2d4efcc5abdb2ef5" - integrity sha512-i3KVgM3+QPAHNbGavK+VBq03YoJl24m9JWNbLgsjTj8aJzXG9M61bantBTNBt7CNwY2FYf+RJRYJ3pzalKjIrw== +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== dependencies: abab "^2.0.6" iconv-lite "^0.6.3" source-map-js "^1.0.2" source-map-loader@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-3.0.1.tgz#9ae5edc7c2d42570934be4c95d1ccc6352eba52d" - integrity sha512-Vp1UsfyPvgujKQzi4pyDiTOnE3E4H+yHvkVRN3c/9PJmQS4CQJExvcDvaX/D+RV+xQben9HJ56jMJS3CgUeWyA== + version "3.0.2" + resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-3.0.2.tgz#af23192f9b344daa729f6772933194cc5fa54fee" + integrity sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg== dependencies: abab "^2.0.5" iconv-lite "^0.6.3" @@ -17748,7 +15770,7 @@ source-map-support@0.5.19: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-support@0.5.21, source-map-support@^0.5.16, source-map-support@^0.5.5, source-map-support@~0.5.12, source-map-support@~0.5.20: +source-map-support@0.5.21, source-map-support@^0.5.16, source-map-support@^0.5.5, source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== @@ -17766,22 +15788,17 @@ source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, sourc resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" - integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== - source-map@0.7.4, source-map@^0.7.3: version "0.7.4" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== -source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7: +source-map@^0.5.6, 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== -sourcemap-codec@^1.4.4, sourcemap-codec@^1.4.8: +sourcemap-codec@^1.4.8: version "1.4.8" resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== @@ -17792,9 +15809,9 @@ space-separated-tokens@^1.0.0: integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + version "3.2.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" @@ -17813,9 +15830,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.11" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" - integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== + version "3.0.13" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz#7189a474c46f8d47c7b0da4b987bb45e908bd2d5" + integrity sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w== spdy-transport@^3.0.0: version "3.0.0" @@ -17872,19 +15889,12 @@ sshpk@^1.14.1: safer-buffer "^2.0.2" tweetnacl "~0.14.0" -ssri@^6.0.1: - version "6.0.2" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5" - integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q== - dependencies: - figgy-pudding "^3.5.1" - -ssri@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" - integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== +ssri@^10.0.0: + version "10.0.4" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.4.tgz#5a20af378be586df139ddb2dfb3bf992cf0daba6" + integrity sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ== dependencies: - minipass "^3.1.1" + minipass "^5.0.0" ssri@^9.0.0: version "9.0.1" @@ -17899,9 +15909,9 @@ stable@^0.1.8: integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== stack-utils@^2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" - integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== + version "2.0.6" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== dependencies: escape-string-regexp "^2.0.0" @@ -17910,11 +15920,6 @@ standard-as-callback@^2.1.0: resolved "https://registry.yarnpkg.com/standard-as-callback/-/standard-as-callback-2.1.0.tgz#8953fc05359868a77b5b9739a665c5977bb7df45" integrity sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A== -state-toggle@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.3.tgz#e123b16a88e143139b09c6852221bc9815917dfe" - integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ== - static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" @@ -17933,37 +15938,24 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== -store2@^2.12.0: - version "2.13.2" - resolved "https://registry.yarnpkg.com/store2/-/store2-2.13.2.tgz#01ad8802ca5b445b9c316b55e72645c13a3cd7e3" - integrity sha512-CMtO2Uneg3SAz/d6fZ/6qbqqQHi2ynq6/KzMD/26gTkiEShCcpqFfTHgOxsE0egAq6SX3FmN4CeSqn8BzXQkJg== - -stream-browserify@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" - integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== +stop-iteration-iterator@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" + integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== dependencies: - inherits "~2.0.1" - readable-stream "^2.0.2" + internal-slot "^1.0.4" -stream-each@^1.1.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" - integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== - dependencies: - end-of-stream "^1.1.0" - stream-shift "^1.0.0" +store2@^2.14.2: + version "2.14.2" + resolved "https://registry.yarnpkg.com/store2/-/store2-2.14.2.tgz#56138d200f9fe5f582ad63bc2704dbc0e4a45068" + integrity sha512-siT1RiqlfQnGqgT/YzXVUNsom9S0H1OX+dpdGN1xkyYATo4I6sep5NmsRD/40s3IIOvlCq6akxkqG82urIZW1w== -stream-http@^2.7.2: - version "2.8.3" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" - integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== +storybook@7.0.9: + version "7.0.9" + resolved "https://registry.yarnpkg.com/storybook/-/storybook-7.0.9.tgz#7f778d64d91c282f6747064854ce7fd89f457712" + integrity sha512-kUgeS22kjqmAN/BZwCLjgP/IhtVb9/cU0UAjGp/1q6FfU7hy+N2NS/lWJESgnZFNArbB0qNuLLi2QbZd6OvXzA== dependencies: - builtin-status-codes "^3.0.0" - inherits "^2.0.1" - readable-stream "^2.3.6" - to-arraybuffer "^1.0.0" - xtend "^4.0.0" + "@storybook/cli" "7.0.9" stream-shift@^1.0.0: version "1.0.1" @@ -17983,6 +15975,15 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" +"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -17992,15 +15993,6 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" @@ -18018,57 +16010,43 @@ string-width@^3.0.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -"string.prototype.matchall@^4.0.0 || ^3.0.1": - version "4.0.7" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz#8e6ecb0d8a1fb1fda470d81acecb2dba057a481d" - integrity sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - get-intrinsic "^1.1.1" - has-symbols "^1.0.3" - internal-slot "^1.0.3" - regexp.prototype.flags "^1.4.1" - side-channel "^1.0.4" - -string.prototype.padend@^3.0.0: - version "3.1.3" - resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz#997a6de12c92c7cb34dc8a201a6c53d9bd88a5f1" - integrity sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg== +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" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" -string.prototype.padstart@^3.0.0: - version "3.1.3" - resolved "https://registry.yarnpkg.com/string.prototype.padstart/-/string.prototype.padstart-3.1.3.tgz#4551d0117d9501692ec6000b15056ac3f816cfa5" - integrity sha512-NZydyOMtYxpTjGqp0VN5PYUF/tsU15yDMZnUdj16qRUIUiMJkHHSDElYyQFrMu+/WloTpA7MQSiADhBicDfaoA== +string.prototype.trim@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" + integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" -string.prototype.trimend@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" - integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== +string.prototype.trimend@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" + integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== dependencies: call-bind "^1.0.2" define-properties "^1.1.4" - es-abstract "^1.19.5" + es-abstract "^1.20.4" -string.prototype.trimstart@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef" - integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== +string.prototype.trimstart@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" + integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== dependencies: call-bind "^1.0.2" define-properties "^1.1.4" - es-abstract "^1.19.5" + es-abstract "^1.20.4" -string_decoder@^1.0.0, string_decoder@^1.1.1: +string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== @@ -18082,6 +16060,13 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" @@ -18103,19 +16088,12 @@ strip-ansi@^5.1.0: dependencies: ansi-regex "^4.1.0" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-bom@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - integrity sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g== +strip-ansi@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" + integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== dependencies: - is-utf8 "^0.2.0" + ansi-regex "^6.0.1" strip-bom@^3.0.0: version "3.0.0" @@ -18137,30 +16115,23 @@ strip-final-newline@^2.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== -strip-indent@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" - integrity sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA== - dependencies: - get-stdin "^4.0.1" - 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.1.0, strip-json-comments@^3.1.1: +strip-json-comments@^3.0.1, strip-json-comments@^3.1.0, 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== -stripe@8.199.0: - version "8.199.0" - resolved "https://registry.yarnpkg.com/stripe/-/stripe-8.199.0.tgz#dcd109f16ff0c33da638a0d154c966d0f20c73d1" - integrity sha512-Bc5Zfp6eOOCdde9x5NPrAczeGSKuNwemzjsfGJXWtpbUfQXgJujzTGgkhx2YuzamqakDYJkTgf9w7Ry2uY8QNA== +stripe@11.12.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/stripe/-/stripe-11.12.0.tgz#2d7d4c37a6447a972128b1266e027693241704e3" + integrity sha512-7yzFyVV/eYpYalfjnw1f9sh/N3r5QVdx5MFtmpOg2QikKVAW4AptXC8P0wj1KNCd/LIo23nTDo0+m9788jHswg== dependencies: "@types/node" ">=8.1.0" - qs "^6.6.0" + qs "^6.11.0" strong-log-transformer@^2.1.0: version "2.1.0" @@ -18171,76 +16142,33 @@ strong-log-transformer@^2.1.0: minimist "^1.2.0" through "^2.3.4" -style-loader@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.3.0.tgz#828b4a3b3b7e7aa5847ce7bae9e874512114249e" - integrity sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q== - dependencies: - loader-utils "^2.0.0" - schema-utils "^2.7.0" - -style-loader@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-2.0.0.tgz#9669602fd4690740eaaec137799a03addbbc393c" - integrity sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ== - dependencies: - loader-utils "^2.0.0" - schema-utils "^3.0.0" - -style-loader@^3.3.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.1.tgz#057dfa6b3d4d7c7064462830f9113ed417d38575" - integrity sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ== - -style-to-object@0.3.0, style-to-object@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.3.0.tgz#b1b790d205991cc783801967214979ee19a76e46" - integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== - dependencies: - inline-style-parser "0.1.1" +style-loader@^3.3.0, style-loader@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.2.tgz#eaebca714d9e462c19aa1e3599057bc363924899" + integrity sha512-RHs/vcrKdQK8wZliteNK4NKzxvLBzpuHMqYmUVWeKa6MkaIQ97ZTOS0b+zapZhy6GcrgWnvWYCMHRirC3FsUmw== -stylehacks@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.1.0.tgz#a40066490ca0caca04e96c6b02153ddc39913520" - integrity sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q== +stylehacks@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.1.1.tgz#7934a34eb59d7152149fa69d6e9e56f2fc34bcc9" + integrity sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw== dependencies: - browserslist "^4.16.6" + browserslist "^4.21.4" postcss-selector-parser "^6.0.4" -stylis@^4.0.10: - version "4.1.1" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.1.1.tgz#e46c6a9bbf7c58db1e65bb730be157311ae1fe12" - integrity sha512-lVrM/bNdhVX2OgBFNa2YJ9Lxj7kPzylieHd3TNjuGE0Re9JB7joL5VUKOVH1kdNNJTgGPpT8hmwIAPLaSyEVFQ== +stylis@^4.1.2: + version "4.2.0" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51" + integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== -stylus-loader@7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/stylus-loader/-/stylus-loader-7.0.0.tgz#31fb929cd3a7c447a07a0b0148b48480eb2c3f4a" - integrity sha512-WTbtLrNfOfLgzTaR9Lj/BPhQroKk/LC1hfTXSUbrxmxgfUo3Y3LpmKRVA2R1XbjvTAvOfaian9vOyfv1z99E+A== +stylus-loader@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/stylus-loader/-/stylus-loader-7.1.0.tgz#19e09a98b19075c246e6e3f65e38b8cb89d2d6fb" + integrity sha512-gNUEjjozR+oZ8cuC/Fx4LVXqZOgDKvpW9t2hpXHcxjfPYqSjQftaGwZUK+wL9B0QJ26uS6p1EmoWHmvld1dF7g== dependencies: - fast-glob "^3.2.11" + fast-glob "^3.2.12" klona "^2.0.5" normalize-path "^3.0.0" -stylus-loader@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/stylus-loader/-/stylus-loader-6.2.0.tgz#0ba499e744e7fb9d9b3977784c8639728a7ced8c" - integrity sha512-5dsDc7qVQGRoc6pvCL20eYgRUxepZ9FpeK28XhdXaIPP6kXr6nI1zAAKFQgP5OBkOfKaURp4WUpJzspg1f01Gg== - dependencies: - fast-glob "^3.2.7" - klona "^2.0.4" - normalize-path "^3.0.0" - -stylus@0.59.0: - version "0.59.0" - resolved "https://registry.yarnpkg.com/stylus/-/stylus-0.59.0.tgz#a344d5932787142a141946536d6e24e6a6be7aa6" - integrity sha512-lQ9w/XIOH5ZHVNuNbWW8D822r+/wBSO/d6XvtyHLF7LW4KaCIDeVbvn5DF8fGCJAUCwVhVi/h6J0NUcnylUEjg== - dependencies: - "@adobe/css-tools" "^4.0.1" - debug "^4.3.2" - glob "^7.1.6" - sax "~1.2.4" - source-map "^0.7.3" - stylus@^0.55.0: version "0.55.0" resolved "https://registry.yarnpkg.com/stylus/-/stylus-0.55.0.tgz#bd404a36dd93fa87744a9dd2d2b1b8450345e5fc" @@ -18267,7 +16195,7 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" -supports-color@^7.0.0, supports-color@^7.1.0, supports-color@^7.2.0: +supports-color@^7.1.0, supports-color@^7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== @@ -18281,14 +16209,6 @@ supports-color@^8.0.0: dependencies: has-flag "^4.0.0" -supports-hyperlinks@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" - integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== - dependencies: - has-flag "^4.0.0" - supports-color "^7.0.0" - supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" @@ -18334,20 +16254,10 @@ symbol-tree@^3.2.4: resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== -symbol.prototype.description@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/symbol.prototype.description/-/symbol.prototype.description-1.0.5.tgz#d30e01263b6020fbbd2d2884a6276ce4d49ab568" - integrity sha512-x738iXRYsrAt9WBhRCVG5BtIC3B7CUkFwbHW2zOvGtwM33s7JjrCDyq8V0zgMYVb5ymsL8+qkzzpANH63CPQaQ== - dependencies: - call-bind "^1.0.2" - get-symbol-description "^1.0.0" - has-symbols "^1.0.2" - object.getownpropertydescriptors "^2.1.2" - synchronous-promise@^2.0.15: - version "2.0.15" - resolved "https://registry.yarnpkg.com/synchronous-promise/-/synchronous-promise-2.0.15.tgz#07ca1822b9de0001f5ff73595f3d08c4f720eb8e" - integrity sha512-k8uzYIkIVwmT+TcglpdN50pS2y1BDcUnBPK9iJeGu0Pl1lOI8pD6wtzgw91Pjpe+RxtTncw32tLxs/R0yNL2Mg== + version "2.0.17" + 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" @@ -18359,17 +16269,22 @@ table@^5.2.3: slice-ansi "^2.1.0" string-width "^3.0.0" -tapable@^1.0.0, tapable@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" - integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== - 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" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== -tar-stream@~2.2.0: +tar-fs@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" + integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +tar-stream@^2.1.4, tar-stream@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== @@ -18380,7 +16295,7 @@ tar-stream@~2.2.0: inherits "^2.0.3" readable-stream "^3.1.1" -tar@6.1.11, tar@^6.0.2, tar@^6.1.11, tar@^6.1.2: +tar@6.1.11: version "6.1.11" resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== @@ -18392,92 +16307,73 @@ tar@6.1.11, tar@^6.0.2, tar@^6.1.11, tar@^6.1.2: mkdirp "^1.0.3" yallist "^4.0.0" -telejson@^6.0.8: - version "6.0.8" - resolved "https://registry.yarnpkg.com/telejson/-/telejson-6.0.8.tgz#1c432db7e7a9212c1fbd941c3e5174ec385148f7" - integrity sha512-nerNXi+j8NK1QEfBHtZUN/aLdDcyupA//9kAboYLrtzZlPLpUfqbVGWb9zz91f/mIjRbAYhbgtnJHY8I1b5MBg== +tar@^6.1.11, tar@^6.1.13, tar@^6.1.2: + version "6.1.14" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.14.tgz#e87926bec1cfe7c9e783a77a79f3e81c1cfa3b66" + integrity sha512-piERznXu0U7/pW7cdSn7hjqySIVTYT6F76icmFk7ptU7dDYlXTm5r9A6K04R2vU3olYgoKeo1Cg3eeu5nhftAw== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^5.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +telejson@^7.0.3: + version "7.1.0" + resolved "https://registry.yarnpkg.com/telejson/-/telejson-7.1.0.tgz#1ef7a0dd57eeb52cde933126f61bcc296c170f52" + integrity sha512-jFJO4P5gPebZAERPkJsqMAQ0IMA1Hi0AoSfxpnUaV6j6R2SZqlpkbS20U6dEUtA3RUYt2Ak/mTlkQzHH9Rv/hA== dependencies: - "@types/is-function" "^1.0.0" - global "^4.4.0" - is-function "^1.0.2" - is-regex "^1.1.2" - is-symbol "^1.0.3" - isobject "^4.0.0" - lodash "^4.17.21" memoizerific "^1.11.3" -terminal-link@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" - integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== +temp-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-2.0.0.tgz#bde92b05bdfeb1516e804c9c00ad45177f31321e" + integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== + +temp@^0.8.4: + version "0.8.4" + resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.4.tgz#8c97a33a4770072e0a05f919396c7665a7dd59f2" + integrity sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg== dependencies: - ansi-escapes "^4.2.1" - supports-hyperlinks "^2.0.0" - -terser-webpack-plugin@^1.4.3: - version "1.4.5" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b" - integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw== - dependencies: - cacache "^12.0.2" - find-cache-dir "^2.1.0" - is-wsl "^1.1.0" - schema-utils "^1.0.0" - serialize-javascript "^4.0.0" - source-map "^0.6.1" - terser "^4.1.2" - webpack-sources "^1.4.0" - worker-farm "^1.7.0" + rimraf "~2.6.2" -terser-webpack-plugin@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz#28daef4a83bd17c1db0297070adc07fc8cfc6a9a" - integrity sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ== +tempy@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tempy/-/tempy-1.0.1.tgz#30fe901fd869cfb36ee2bd999805aa72fbb035de" + integrity sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w== dependencies: - cacache "^15.0.5" - find-cache-dir "^3.3.1" - jest-worker "^26.5.0" - p-limit "^3.0.2" - schema-utils "^3.0.0" - serialize-javascript "^5.0.1" - source-map "^0.6.1" - terser "^5.3.4" - webpack-sources "^1.4.3" + del "^6.0.0" + is-stream "^2.0.0" + temp-dir "^2.0.0" + type-fest "^0.16.0" + unique-string "^2.0.0" -terser-webpack-plugin@^5.0.3, terser-webpack-plugin@^5.1.3, terser-webpack-plugin@^5.3.3: - version "5.3.3" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz#8033db876dd5875487213e87c627bca323e5ed90" - integrity sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ== +terser-webpack-plugin@^5.1.3, terser-webpack-plugin@^5.3.1, terser-webpack-plugin@^5.3.3, terser-webpack-plugin@^5.3.7: + version "5.3.8" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.8.tgz#415e03d2508f7de63d59eca85c5d102838f06610" + integrity sha512-WiHL3ElchZMsK27P8uIUh4604IgJyAW47LVXGbEoB21DbQcZ+OuMpGjVYnEUaqcWM6dO8uS2qUbA7LSCWqvsbg== dependencies: - "@jridgewell/trace-mapping" "^0.3.7" + "@jridgewell/trace-mapping" "^0.3.17" jest-worker "^27.4.5" schema-utils "^3.1.1" - serialize-javascript "^6.0.0" - terser "^5.7.2" + serialize-javascript "^6.0.1" + terser "^5.16.8" -terser@5.14.2: - version "5.14.2" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.14.2.tgz#9ac9f22b06994d736174f4091aa368db896f1c10" - integrity sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA== +terser@5.16.3: + version "5.16.3" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.3.tgz#3266017a9b682edfe019b8ecddd2abaae7b39c6b" + integrity sha512-v8wWLaS/xt3nE9dgKEWhNUFP6q4kngO5B8eYFUuebsu7Dw/UNAnpUod6UHo04jSSkv8TzKHjZDSd7EXdDQAl8Q== dependencies: "@jridgewell/source-map" "^0.3.2" acorn "^8.5.0" commander "^2.20.0" source-map-support "~0.5.20" -terser@^4.1.2, terser@^4.6.3: - version "4.8.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" - integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== - dependencies: - commander "^2.20.0" - source-map "~0.6.1" - source-map-support "~0.5.12" - -terser@^5.10.0, terser@^5.3.4, terser@^5.7.2: - version "5.14.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.14.1.tgz#7c95eec36436cb11cf1902cc79ac564741d19eca" - integrity sha512-+ahUAE+iheqBTDxXhTisdA8hgvbEG1hHOQ9xmNjeUJSoi6DU/gMrKNcfZjHkyY6Alnuyc+ikYJaxxfHkT3+WuQ== +terser@^5.10.0, terser@^5.16.8: + version "5.17.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.17.1.tgz#948f10830454761e2eeedc6debe45c532c83fd69" + integrity sha512-hVl35zClmpisy6oaoKALOpS0rDYLxRFLHhRuDlEGTKey9qHjS1w9GMORjuwIMt70Wan4lwsLYyWDVnWgF+KUEw== dependencies: "@jridgewell/source-map" "^0.3.2" acorn "^8.5.0" @@ -18503,7 +16399,7 @@ throttleit@^1.0.0: resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" integrity sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g== -through2@^2.0.0: +through2@^2.0.3: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== @@ -18521,13 +16417,6 @@ thunky@^1.0.2: resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== -timers-browserify@^2.0.4: - version "2.0.12" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" - integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== - dependencies: - setimmediate "^1.0.4" - tiny-emitter@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" @@ -18550,12 +16439,7 @@ tmp@~0.2.1: tmpl@1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" - integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== - -to-arraybuffer@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" - integrity sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA== + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== to-fast-properties@^2.0.0: version "2.0.0" @@ -18599,14 +16483,15 @@ toidentifier@1.0.1: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== -tough-cookie@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" - integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== +tough-cookie@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.2.tgz#e53e84b85f24e0b65dd526f46628db6c85f6b874" + integrity sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ== dependencies: psl "^1.1.33" punycode "^2.1.1" - universalify "^0.1.2" + universalify "^0.2.0" + url-parse "^1.5.3" tough-cookie@~2.5.0: version "2.5.0" @@ -18633,67 +16518,36 @@ tree-kill@1.2.2: resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== -trim-newlines@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" - integrity sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw== - -trim-trailing-lines@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz#bd4abbec7cc880462f10b2c8b5ce1d8d1ec7c2c0" - integrity sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ== - -trim@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" - integrity sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ== - -trough@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" - integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== - -ts-dedent@^2.0.0: +ts-dedent@^2.0.0, ts-dedent@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/ts-dedent/-/ts-dedent-2.2.0.tgz#39e4bd297cd036292ae2394eb3412be63f563bb5" integrity sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ== -ts-jest@28.0.8, ts-jest@^28.0.0: - version "28.0.8" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-28.0.8.tgz#cd204b8e7a2f78da32cf6c95c9a6165c5b99cc73" - integrity sha512-5FaG0lXmRPzApix8oFG8RKjAz4ehtm8yMKOTy5HX3fY6W8kmvOrmcY0hKDElW52FJov+clhUbrKAqofnj4mXTg== +ts-jest@29.1.0, ts-jest@^29.0.0: + version "29.1.0" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.1.0.tgz#4a9db4104a49b76d2b368ea775b6c9535c603891" + integrity sha512-ZhNr7Z4PcYa+JjMl62ir+zPiNJfXJN6E8hSLnaUKhOgqcn8vb3e537cpkd0FuAfRK3sR1LSqM1MOhliXNgOFPA== dependencies: bs-logger "0.x" fast-json-stable-stringify "2.x" - jest-util "^28.0.0" - json5 "^2.2.1" + jest-util "^29.0.0" + json5 "^2.2.3" lodash.memoize "4.x" make-error "1.x" semver "7.x" yargs-parser "^21.0.1" -ts-loader@^8.0.14: - version "8.4.0" - resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-8.4.0.tgz#e845ea0f38d140bdc3d7d60293ca18d12ff2720f" - integrity sha512-6nFY3IZ2//mrPc+ImY3hNWx1vCHyEhl6V+wLmL4CZcm6g1CqX7UKrkc6y0i4FwcfOhxyMPCfaEvh20f4r9GNpw== - dependencies: - chalk "^4.1.0" - enhanced-resolve "^4.0.0" - loader-utils "^2.0.0" - micromatch "^4.0.0" - semver "^7.3.4" - ts-loader@^9.3.1: - version "9.3.1" - resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.3.1.tgz#fe25cca56e3e71c1087fe48dc67f4df8c59b22d4" - integrity sha512-OkyShkcZTsTwyS3Kt7a4rsT/t2qvEVQuKCTg4LJmpj9fhFR7ukGdZwV6Qq3tRUkqcXtfGpPR7+hFKHCG/0d3Lw== + version "9.4.2" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.4.2.tgz#80a45eee92dd5170b900b3d00abcfa14949aeb78" + integrity sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA== dependencies: chalk "^4.1.0" enhanced-resolve "^5.0.0" micromatch "^4.0.0" semver "^7.3.4" -ts-node@10.9.1: +ts-node@10.9.1, ts-node@^10.8.2: version "10.9.1" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== @@ -18712,12 +16566,16 @@ ts-node@10.9.1: v8-compile-cache-lib "^3.0.1" yn "3.1.1" -ts-pnp@^1.1.6: - version "1.2.0" - resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" - integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== +tsconfig-paths-webpack-plugin@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.0.0.tgz#84008fc3e3e0658fdb0262758b07b4da6265ff1a" + integrity sha512-fw/7265mIWukrSHd0i+wSwx64kYUSAKPfxRDksjKIYTxSAp9W9/xcZVBF4Kl0eqQd5eBpAQ/oQrc5RyM/0c1GQ== + dependencies: + chalk "^4.1.0" + enhanced-resolve "^5.7.0" + tsconfig-paths "^4.0.0" -tsconfig-paths-webpack-plugin@3.5.2, tsconfig-paths-webpack-plugin@^3.3.0: +tsconfig-paths-webpack-plugin@^3.5.2: version "3.5.2" resolved "https://registry.yarnpkg.com/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-3.5.2.tgz#01aafff59130c04a8c4ebc96a3045c43c376449a" integrity sha512-EhnfjHbzm5IYI9YPNVIxx1moxMI4bpHD2e0zTXeDNQcwjjRaGepP7IhTHJkyDBG0CAOoxRfe7jCG630Ou+C6Pw== @@ -18726,13 +16584,22 @@ tsconfig-paths-webpack-plugin@3.5.2, tsconfig-paths-webpack-plugin@^3.3.0: enhanced-resolve "^5.7.0" tsconfig-paths "^3.9.0" -tsconfig-paths@^3.11.0, tsconfig-paths@^3.9.0: - version "3.14.1" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" - integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== +tsconfig-paths@^3.14.1, tsconfig-paths@^3.9.0: + 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== dependencies: "@types/json5" "^0.0.29" - json5 "^1.0.1" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tsconfig-paths@^4.0.0, tsconfig-paths@^4.1.2: + version "4.2.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz#ef78e19039133446d244beac0fd6a1632e2d107c" + integrity sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg== + dependencies: + json5 "^2.2.2" minimist "^1.2.6" strip-bom "^3.0.0" @@ -18746,11 +16613,16 @@ tslib@2.3.1: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== -tslib@2.4.0, tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.4.0: +tslib@2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== +tslib@2.5.0, tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.4.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" + integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== + tslib@^1.10.0, tslib@^1.8.1: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" @@ -18763,10 +16635,13 @@ tsutils@^3.21.0: dependencies: tslib "^1.8.1" -tty-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" - integrity sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw== +tuf-js@^1.1.3: + version "1.1.5" + resolved "https://registry.yarnpkg.com/tuf-js/-/tuf-js-1.1.5.tgz#ad82a18c5db42f142d2d2e15d6d25655e30c03c3" + integrity sha512-inqodgxdsmuxrtQVbu6tPNgRKWD1Boy3VB6GO7KczJZpAHiTukwhSzXUSzvDcw5pE2Jo8ua+e1ykpHv7VdPVlQ== + dependencies: + "@tufjs/models" "1.0.4" + make-fetch-happen "^11.1.0" tunnel-agent@^0.6.0: version "0.6.0" @@ -18785,10 +16660,10 @@ tweetnacl@^1.0.1: resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== -twitter-api-v2@1.10.3: - version "1.10.3" - resolved "https://registry.yarnpkg.com/twitter-api-v2/-/twitter-api-v2-1.10.3.tgz#07441bd9c4d27433aa0284d900cf60f6328b8239" - integrity sha512-AbCboiTOWv4DUPbAlF43Uyk4iK/QRk354pNdKgtOmv45+BWGB5Kdv6ls+C99pww/DyLBiXgQEnuyGv4d1HdRhw== +twitter-api-v2@1.14.2: + version "1.14.2" + resolved "https://registry.yarnpkg.com/twitter-api-v2/-/twitter-api-v2-1.14.2.tgz#d928eeb588f3a195a1db8059f0654b75d4278d3a" + integrity sha512-389e/rWaN8zWkmD5z2IpKVb5+ojPxVtrexQoGBI1Xfib1mE/9M7k7zbnZ3Q/WLwthwcWkQIlB25ecT64AL8LvQ== type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" @@ -18809,6 +16684,11 @@ type-detect@4.0.8: resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== +type-fest@^0.16.0: + version "0.16.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.16.0.tgz#3240b891a78b0deae910dbeb86553e552a148860" + integrity sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg== + type-fest@^0.20.2: version "0.20.2" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" @@ -18829,6 +16709,11 @@ type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== +type-fest@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" + integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== + type-is@^1.6.4, type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -18837,27 +16722,29 @@ type-is@^1.6.4, type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + typed-assert@^1.0.8: version "1.0.9" resolved "https://registry.yarnpkg.com/typed-assert/-/typed-assert-1.0.9.tgz#8af9d4f93432c4970ec717e3006f33f135b06213" integrity sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg== -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== -typescript@4.8.4: - version "4.8.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6" - integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== +typescript@4.9.5: + version "4.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== typescript@^3.2.4: version "3.9.10" @@ -18865,9 +16752,9 @@ typescript@^3.2.4: integrity sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q== uglify-js@^3.1.4: - version "3.16.0" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.16.0.tgz#b778ba0831ca102c1d8ecbdec2d2bdfcc7353190" - integrity sha512-FEikl6bR30n0T3amyBh3LoiBdqHRy/f4H80+My34HOesOKyHfOsxAPAxOoqC0JUnC1amnO0IwkYC3sko51caSw== + version "3.17.4" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" + integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== uid2@0.0.x: version "0.0.4" @@ -18889,14 +16776,6 @@ unfetch@^4.2.0: resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be" integrity sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA== -unherit@^1.0.4: - version "1.1.3" - resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.3.tgz#6c9b503f2b41b262330c80e91c8614abdaa69c22" - integrity sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ== - dependencies: - inherits "^2.0.0" - xtend "^4.0.0" - unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" @@ -18910,27 +16789,15 @@ unicode-match-property-ecmascript@^2.0.0: unicode-canonical-property-names-ecmascript "^2.0.0" unicode-property-aliases-ecmascript "^2.0.0" -unicode-match-property-value-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714" - integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== +unicode-match-property-value-ecmascript@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" + integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== unicode-property-aliases-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" - integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== - -unified@9.2.0: - version "9.2.0" - resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.0.tgz#67a62c627c40589edebbf60f53edfd4d822027f8" - integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg== - dependencies: - bail "^1.0.0" - extend "^3.0.0" - is-buffer "^2.0.0" - is-plain-obj "^2.0.0" - trough "^1.0.0" - vfile "^4.0.0" + version "2.1.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" @@ -18949,61 +16816,46 @@ union@~0.5.0: dependencies: qs "^6.4.0" -unique-filename@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" - integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== +unique-filename@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-2.0.1.tgz#e785f8675a9a7589e0ac77e0b5c34d2eaeac6da2" + integrity sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A== dependencies: - unique-slug "^2.0.0" + unique-slug "^3.0.0" -unique-slug@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" - integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== +unique-filename@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-3.0.0.tgz#48ba7a5a16849f5080d26c760c86cf5cf05770ea" + integrity sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g== + dependencies: + unique-slug "^4.0.0" + +unique-slug@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-3.0.0.tgz#6d347cf57c8a7a7a6044aabd0e2d74e4d76dc7c9" + integrity sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w== dependencies: imurmurhash "^0.1.4" -unist-builder@2.0.3, unist-builder@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-2.0.3.tgz#77648711b5d86af0942f334397a33c5e91516436" - integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== +unique-slug@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-4.0.0.tgz#6bae6bb16be91351badd24cdce741f892a6532e3" + integrity sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ== + dependencies: + imurmurhash "^0.1.4" -unist-util-generated@^1.0.0: - version "1.1.6" - resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-1.1.6.tgz#5ab51f689e2992a472beb1b35f2ce7ff2f324d4b" - integrity sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg== +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + dependencies: + crypto-random-string "^2.0.0" unist-util-is@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797" integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== -unist-util-position@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-3.1.0.tgz#1c42ee6301f8d52f47d14f62bbdb796571fa2d47" - integrity sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA== - -unist-util-remove-position@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz#5d19ca79fdba712301999b2b73553ca8f3b352cc" - integrity sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA== - dependencies: - unist-util-visit "^2.0.0" - -unist-util-remove@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/unist-util-remove/-/unist-util-remove-2.1.0.tgz#b0b4738aa7ee445c402fda9328d604a02d010588" - integrity sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q== - dependencies: - unist-util-is "^4.0.0" - -unist-util-stringify-position@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" - integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== - dependencies: - "@types/unist" "^2.0.2" - unist-util-visit-parents@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6" @@ -19012,7 +16864,7 @@ unist-util-visit-parents@^3.0.0: "@types/unist" "^2.0.0" unist-util-is "^4.0.0" -unist-util-visit@2.0.3, unist-util-visit@^2.0.0: +unist-util-visit@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== @@ -19021,10 +16873,10 @@ unist-util-visit@2.0.3, unist-util-visit@^2.0.0: unist-util-is "^4.0.0" unist-util-visit-parents "^3.0.0" -universalify@^0.1.2: - 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" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== universalify@^2.0.0: version "2.0.0" @@ -19036,6 +16888,16 @@ unpipe@1.0.0, unpipe@~1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== +unplugin@^0.10.2: + version "0.10.2" + resolved "https://registry.yarnpkg.com/unplugin/-/unplugin-0.10.2.tgz#0f7089c3666f592cc448d746e39e7f41e9afb01a" + integrity sha512-6rk7GUa4ICYjae5PrAllvcDeuT8pA9+j5J5EkxbMFaV+SalHhxZ7X2dohMzu6C3XzsMT+6jwR/+pwPNR3uK9MA== + dependencies: + acorn "^8.8.0" + chokidar "^3.5.3" + webpack-sources "^3.2.3" + webpack-virtual-modules "^0.4.5" + unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" @@ -19044,35 +16906,15 @@ unset-value@^1.0.0: has-value "^0.3.1" isobject "^3.0.0" -untildify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/untildify/-/untildify-2.1.0.tgz#17eb2807987f76952e9c0485fc311d06a826a2e0" - integrity sha512-sJjbDp2GodvkB0FZZcn7k6afVisqX5BZD7Yq3xp4nN2O15BBK0cLm3Vwn2vQaF7UDS0UUsrQMkkplmDI5fskig== - dependencies: - os-homedir "^1.0.0" - untildify@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== -upath@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" - integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== - -update-browserslist-db@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz#be06a5eedd62f107b7c19eb5bcefb194411abf38" - integrity sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - -update-browserslist-db@^1.0.9: - version "1.0.10" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" - integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== +update-browserslist-db@^1.0.10: + version "1.0.11" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" + integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== dependencies: escalade "^3.1.1" picocolors "^1.0.0" @@ -19094,14 +16936,13 @@ url-join@^4.0.1: resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.1.tgz#b642e21a2646808ffa178c4c5fda39844e12cde7" integrity sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA== -url-loader@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2" - integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== dependencies: - loader-utils "^2.0.0" - mime-types "^2.1.27" - schema-utils "^3.0.0" + querystringify "^2.1.1" + requires-port "^1.0.0" url@^0.11.0: version "0.11.0" @@ -19111,6 +16952,13 @@ url@^0.11.0: punycode "1.3.2" querystring "0.2.0" +use-resize-observer@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/use-resize-observer/-/use-resize-observer-9.1.0.tgz#14735235cf3268569c1ea468f8a90c5789fc5c6c" + integrity sha512-R25VqO9Wb3asSD4eqtcxk8sJalvIOYBqS8MNZlpDSQ4l4xMQxC/J7Id9HoTqPq8FwULIn0PVW+OAqF2dyYbjow== + dependencies: + "@juggle/resize-observer" "^3.3.1" + use@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" @@ -19121,27 +16969,16 @@ util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -util.promisify@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" - integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== - dependencies: - define-properties "^1.1.2" - object.getownpropertydescriptors "^2.0.3" - -util@0.10.3: - version "0.10.3" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - integrity sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ== +util@^0.12.0, util@^0.12.4: + version "0.12.5" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" + integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== dependencies: - inherits "2.0.1" - -util@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" - integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== - dependencies: - inherits "2.0.3" + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + which-typed-array "^1.1.2" utila@~0.4: version "0.4.0" @@ -19153,40 +16990,30 @@ utils-merge@1.0.1, utils-merge@1.x.x, utils-merge@^1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== -uuid-browser@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/uuid-browser/-/uuid-browser-3.1.0.tgz#0f05a40aef74f9e5951e20efbf44b11871e56410" - integrity sha512-dsNgbLaTrd6l3MMxTtouOCFw4CBFc/3a+GgYA2YyrJvyQ1u6q4pcu3ktLoUZ/VN/Aw9WsauazbgsgdfVWgAKQg== - uuid@8.3.2, uuid@^8.3.0, uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -uuid@9.0.0: +uuid@9.0.0, uuid@^9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== -uuid@^3.3.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - v8-compile-cache-lib@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== -v8-compile-cache@2.3.0, v8-compile-cache@^2.0.3: +v8-compile-cache@2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== -v8-to-istanbul@^9.0.0, v8-to-istanbul@^9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz#b6f994b0b5d4ef255e17a0d17dc444a9f5132fa4" - integrity sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w== +v8-to-istanbul@^9.0.1: + version "9.1.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz#1b83ed4e397f58c85c266a570fc2558b5feb9265" + integrity sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA== dependencies: "@jridgewell/trace-mapping" "^0.3.12" "@types/istanbul-lib-coverage" "^2.0.1" @@ -19200,17 +17027,17 @@ validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" -validate-npm-package-name@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz#fe8f1c50ac20afdb86f177da85b3600f0ac0d747" - integrity sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q== +validate-npm-package-name@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz#f16afd48318e6f90a1ec101377fa0384cfc8c713" + integrity sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ== dependencies: builtins "^5.0.0" -validator@^13.5.2: - version "13.7.0" - resolved "https://registry.yarnpkg.com/validator/-/validator-13.7.0.tgz#4f9658ba13ba8f3d82ee881d3516489ea85c0857" - integrity sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw== +validator@^13.7.0: + version "13.9.0" + resolved "https://registry.yarnpkg.com/validator/-/validator-13.9.0.tgz#33e7b85b604f3bbce9bb1a05d5c3e22e1c2ff855" + integrity sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA== vary@^1, vary@~1.1.2: version "1.1.2" @@ -19226,74 +17053,21 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" -vfile-location@^3.0.0, vfile-location@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.2.0.tgz#d8e41fbcbd406063669ebf6c33d56ae8721d0f3c" - integrity sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA== - -vfile-message@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" - integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== - dependencies: - "@types/unist" "^2.0.0" - unist-util-stringify-position "^2.0.0" - -vfile@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" - integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== - dependencies: - "@types/unist" "^2.0.0" - is-buffer "^2.0.0" - unist-util-stringify-position "^2.0.0" - vfile-message "^2.0.0" - -vm-browserify@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" - integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== - -w3c-hr-time@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" - integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== - dependencies: - browser-process-hrtime "^1.0.0" - -w3c-xmlserializer@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz#06cdc3eefb7e4d0b20a560a5a3aeb0d2d9a65923" - integrity sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg== +w3c-xmlserializer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073" + integrity sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw== dependencies: xml-name-validator "^4.0.0" -walker@^1.0.7, walker@^1.0.8, walker@~1.0.5: +walker@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== dependencies: makeerror "1.0.12" -watchpack-chokidar2@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957" - integrity sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww== - dependencies: - chokidar "^2.1.8" - -watchpack@^1.7.4: - version "1.7.5" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.5.tgz#1267e6c55e0b9b5be44c2023aed5437a2c26c453" - integrity sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ== - dependencies: - graceful-fs "^4.1.2" - neo-async "^2.5.0" - optionalDependencies: - chokidar "^3.4.1" - watchpack-chokidar2 "^2.0.1" - -watchpack@^2.2.0, watchpack@^2.3.1, 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== @@ -19315,10 +17089,10 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" -web-namespaces@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.4.tgz#bc98a3de60dadd7faefc403d1076d529f5e030ec" - integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== +web-worker@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/web-worker/-/web-worker-1.2.0.tgz#5d85a04a7fbc1e7db58f66595d7a3ac7c9c180da" + integrity sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA== webidl-conversions@^3.0.0: version "3.0.1" @@ -19330,7 +17104,18 @@ webidl-conversions@^7.0.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== -webpack-dev-middleware@5.3.3, webpack-dev-middleware@^5.3.1: +webpack-dev-middleware@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-6.0.1.tgz#fd585127ed44dab3f253daf0d98f4d58a5088cc2" + integrity sha512-PZPZ6jFinmqVPJZbisfggDiC+2EeGZ1ZByyMP5sOFJcPPWSexalISz+cvm+j+oYPT7FIJyxT76esjnw9DhE5sw== + dependencies: + colorette "^2.0.10" + memfs "^3.4.12" + mime-types "^2.1.31" + range-parser "^1.2.1" + schema-utils "^4.0.0" + +webpack-dev-middleware@^5.3.1: version "5.3.3" resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz#efae67c2793908e7311f1d9b06f2a08dcc97e51f" integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== @@ -19341,33 +17126,10 @@ webpack-dev-middleware@5.3.3, webpack-dev-middleware@^5.3.1: range-parser "^1.2.1" schema-utils "^4.0.0" -webpack-dev-middleware@^3.7.3: - version "3.7.3" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz#0639372b143262e2b84ab95d3b91a7597061c2c5" - integrity sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ== - dependencies: - memory-fs "^0.4.1" - mime "^2.4.4" - mkdirp "^0.5.1" - range-parser "^1.2.1" - webpack-log "^2.0.0" - -webpack-dev-middleware@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-4.3.0.tgz#179cc40795882cae510b1aa7f3710cbe93c9333e" - integrity sha512-PjwyVY95/bhBh6VUqt6z4THplYcsvQ8YNNBTBM873xLVmw8FLeALn0qurHbs9EmcfhzQis/eoqypSnZeuUz26w== - dependencies: - colorette "^1.2.2" - mem "^8.1.1" - memfs "^3.2.2" - mime-types "^2.1.30" - range-parser "^1.2.1" - schema-utils "^3.0.0" - -webpack-dev-server@4.10.0: - version "4.10.0" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.10.0.tgz#de270d0009eba050546912be90116e7fd740a9ca" - integrity sha512-7dezwAs+k6yXVFZ+MaL8VnE+APobiO3zvpp3rBHe/HmWQ+avwh0Q3d0xxacOiBybZZ3syTZw9HXzpa3YNbAZDQ== +webpack-dev-server@4.11.1: + version "4.11.1" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz#ae07f0d71ca0438cf88446f09029b92ce81380b5" + integrity sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw== dependencies: "@types/bonjour" "^3.5.9" "@types/connect-history-api-fallback" "^1.3.5" @@ -19392,7 +17154,7 @@ webpack-dev-server@4.10.0: p-retry "^4.5.0" rimraf "^3.0.2" schema-utils "^4.0.0" - selfsigned "^2.0.1" + selfsigned "^2.1.1" serve-index "^1.9.1" sockjs "^0.3.24" spdy "^4.0.2" @@ -19400,9 +17162,9 @@ webpack-dev-server@4.10.0: ws "^8.4.2" webpack-dev-server@^4.9.3: - version "4.9.3" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.9.3.tgz#2360a5d6d532acb5410a668417ad549ee3b8a3c9" - integrity sha512-3qp/eoboZG5/6QgiZ3llN8TUzkSpYg1Ko9khWX1h40MIEUNS2mDoIa8aXsPfskER+GbTvs/IJZ1QTBBhhuetSw== + version "4.15.0" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.0.tgz#87ba9006eca53c551607ea0d663f4ae88be7af21" + integrity sha512-HmNB5QeSl1KpulTBQ8UT4FPrByYyaLxpJoQ0+s7EvUrMc16m0ZS1sgb1XGqzmgCPk0c9y+aaXxn11tbLzuM7NQ== dependencies: "@types/bonjour" "^3.5.9" "@types/connect-history-api-fallback" "^1.3.5" @@ -19423,40 +17185,27 @@ webpack-dev-server@^4.9.3: html-entities "^2.3.2" http-proxy-middleware "^2.0.3" ipaddr.js "^2.0.1" + launch-editor "^2.6.0" open "^8.0.9" p-retry "^4.5.0" rimraf "^3.0.2" schema-utils "^4.0.0" - selfsigned "^2.0.1" + selfsigned "^2.1.1" serve-index "^1.9.1" sockjs "^0.3.24" spdy "^4.0.2" webpack-dev-middleware "^5.3.1" - ws "^8.4.2" - -webpack-filter-warnings-plugin@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/webpack-filter-warnings-plugin/-/webpack-filter-warnings-plugin-1.2.1.tgz#dc61521cf4f9b4a336fbc89108a75ae1da951cdb" - integrity sha512-Ez6ytc9IseDMLPo0qCuNNYzgtUl8NovOqjIq4uAU8LTD4uoa1w1KpZyyzFtLTEMZpkkOkLfL9eN+KGYdk1Qtwg== + ws "^8.13.0" webpack-hot-middleware@^2.25.1: - version "2.25.1" - resolved "https://registry.yarnpkg.com/webpack-hot-middleware/-/webpack-hot-middleware-2.25.1.tgz#581f59edf0781743f4ca4c200fd32c9266c6cf7c" - integrity sha512-Koh0KyU/RPYwel/khxbsDz9ibDivmUbrRuKSSQvW42KSDdO4w23WI3SkHpSUKHE76LrFnnM/L7JCrpBwu8AXYw== + version "2.25.3" + resolved "https://registry.yarnpkg.com/webpack-hot-middleware/-/webpack-hot-middleware-2.25.3.tgz#be343ce2848022cfd854dd82820cd730998c6794" + integrity sha512-IK/0WAHs7MTu1tzLTjio73LjS3Ov+VvBKQmE8WPlJutgG5zT6Urgq/BbAdRrHTRpyzK0dvAvFh1Qg98akxgZpA== dependencies: ansi-html-community "0.0.8" html-entities "^2.1.0" - querystring "^0.2.0" strip-ansi "^6.0.0" -webpack-log@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" - integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg== - dependencies: - ansi-colors "^3.0.0" - uuid "^3.3.2" - webpack-merge@5.7.3: version "5.7.3" resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.7.3.tgz#2a0754e1877a25a8bbab3d2475ca70a052708213" @@ -19465,7 +17214,7 @@ webpack-merge@5.7.3: clone-deep "^4.0.1" wildcard "^2.0.0" -webpack-merge@5.8.0, webpack-merge@^5.8.0: +webpack-merge@5.8.0: version "5.8.0" resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== @@ -19478,14 +17227,6 @@ webpack-node-externals@^3.0.0: resolved "https://registry.yarnpkg.com/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz#1a3407c158d547a9feb4229a9e3385b7b60c9917" integrity sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ== -webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" - integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== - dependencies: - source-list-map "^2.0.0" - source-map "~0.6.1" - webpack-sources@^3.0.0, webpack-sources@^3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" @@ -19498,63 +17239,27 @@ webpack-subresource-integrity@5.1.0, webpack-subresource-integrity@^5.1.0: dependencies: typed-assert "^1.0.8" -webpack-virtual-modules@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/webpack-virtual-modules/-/webpack-virtual-modules-0.2.2.tgz#20863dc3cb6bb2104729fff951fbe14b18bd0299" - integrity sha512-kDUmfm3BZrei0y+1NTHJInejzxfhtU8eDj2M7OKb2IWrPFAeO1SOH2KuQ68MSZu9IGEHcxbkKKR1v18FrUSOmA== - dependencies: - debug "^3.0.0" - -webpack-virtual-modules@^0.4.1: - version "0.4.3" - resolved "https://registry.yarnpkg.com/webpack-virtual-modules/-/webpack-virtual-modules-0.4.3.tgz#cd597c6d51d5a5ecb473eea1983a58fa8a17ded9" - integrity sha512-5NUqC2JquIL2pBAAo/VfBP6KuGkHIZQXW/lNKupLPfhViwh8wNsu0BObtl09yuKZszeEUfbXz8xhrHvSG16Nqw== - -webpack@4: - version "4.46.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.46.0.tgz#bf9b4404ea20a073605e0a011d188d77cb6ad542" - integrity sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-module-context" "1.9.0" - "@webassemblyjs/wasm-edit" "1.9.0" - "@webassemblyjs/wasm-parser" "1.9.0" - acorn "^6.4.1" - ajv "^6.10.2" - ajv-keywords "^3.4.1" - chrome-trace-event "^1.0.2" - enhanced-resolve "^4.5.0" - eslint-scope "^4.0.3" - json-parse-better-errors "^1.0.2" - loader-runner "^2.4.0" - loader-utils "^1.2.3" - memory-fs "^0.4.1" - micromatch "^3.1.10" - mkdirp "^0.5.3" - neo-async "^2.6.1" - node-libs-browser "^2.2.1" - schema-utils "^1.0.0" - tapable "^1.1.3" - terser-webpack-plugin "^1.4.3" - watchpack "^1.7.4" - webpack-sources "^1.4.1" - -webpack@5.74.0: - version "5.74.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.74.0.tgz#02a5dac19a17e0bb47093f2be67c695102a55980" - integrity sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA== +webpack-virtual-modules@^0.4.3, webpack-virtual-modules@^0.4.5: + version "0.4.6" + resolved "https://registry.yarnpkg.com/webpack-virtual-modules/-/webpack-virtual-modules-0.4.6.tgz#3e4008230731f1db078d9cb6f68baf8571182b45" + integrity sha512-5tyDlKLqPfMqjT3Q9TAqf2YqjwmnUleZwzJi1A5qXnlBCdj2AtOJ6wAWdglTIDOPgOiOrXeBeFcsQ8+aGQ6QbA== + +webpack@5, webpack@^5.75.0: + version "5.82.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.82.0.tgz#3c0d074dec79401db026b4ba0fb23d6333f88e7d" + integrity sha512-iGNA2fHhnDcV1bONdUu554eZx+XeldsaeQ8T67H6KKHl2nUSwX8Zm7cmzOA46ox/X1ARxf7Bjv8wQ/HsB5fxBg== dependencies: "@types/eslint-scope" "^3.7.3" - "@types/estree" "^0.0.51" - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/wasm-edit" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" + "@types/estree" "^1.0.0" + "@webassemblyjs/ast" "^1.11.5" + "@webassemblyjs/wasm-edit" "^1.11.5" + "@webassemblyjs/wasm-parser" "^1.11.5" acorn "^8.7.1" acorn-import-assertions "^1.7.6" browserslist "^4.14.5" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.10.0" - es-module-lexer "^0.9.0" + enhanced-resolve "^5.13.0" + es-module-lexer "^1.2.1" eslint-scope "5.1.1" events "^3.2.0" glob-to-regexp "^0.4.1" @@ -19563,27 +17268,27 @@ webpack@5.74.0: loader-runner "^4.2.0" mime-types "^2.1.27" neo-async "^2.6.2" - schema-utils "^3.1.0" + schema-utils "^3.1.2" tapable "^2.1.1" - terser-webpack-plugin "^5.1.3" + terser-webpack-plugin "^5.3.7" watchpack "^2.4.0" webpack-sources "^3.2.3" -"webpack@>=4.0.0 <6.0.0", "webpack@^4 || ^5", webpack@^5.58.1, webpack@^5.9.0: - version "5.73.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.73.0.tgz#bbd17738f8a53ee5760ea2f59dce7f3431d35d38" - integrity sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA== +webpack@5.76.1: + version "5.76.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.76.1.tgz#7773de017e988bccb0f13c7d75ec245f377d295c" + integrity sha512-4+YIK4Abzv8172/SGqObnUjaIHjLEuUasz9EwQj/9xmPPkYJy2Mh03Q/lJfSD3YLzbxy5FeTq5Uw0323Oh6SJQ== dependencies: "@types/eslint-scope" "^3.7.3" "@types/estree" "^0.0.51" "@webassemblyjs/ast" "1.11.1" "@webassemblyjs/wasm-edit" "1.11.1" "@webassemblyjs/wasm-parser" "1.11.1" - acorn "^8.4.1" + acorn "^8.7.1" acorn-import-assertions "^1.7.6" browserslist "^4.14.5" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.9.3" + enhanced-resolve "^5.10.0" es-module-lexer "^0.9.0" eslint-scope "5.1.1" events "^3.2.0" @@ -19596,7 +17301,7 @@ webpack@5.74.0: schema-utils "^3.1.0" tapable "^2.1.1" terser-webpack-plugin "^5.1.3" - watchpack "^2.3.1" + watchpack "^2.4.0" webpack-sources "^3.2.3" websocket-driver@>=0.5.1, websocket-driver@^0.7.4: @@ -19625,14 +17330,6 @@ whatwg-mimetype@^3.0.0: resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== -whatwg-url@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-10.0.0.tgz#37264f720b575b4a311bd4094ed8c760caaa05da" - integrity sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w== - dependencies: - tr46 "^3.0.0" - webidl-conversions "^7.0.0" - whatwg-url@^11.0.0: version "11.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018" @@ -19660,10 +17357,32 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" +which-collection@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" + integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== + dependencies: + is-map "^2.0.1" + is-set "^2.0.1" + is-weakmap "^2.0.1" + is-weakset "^2.0.1" + which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== + 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.2, which-typed-array@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" + integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.10" which@^1.2.9: version "1.3.1" @@ -19679,6 +17398,13 @@ which@^2.0.1, which@^2.0.2: dependencies: isexe "^2.0.0" +which@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/which/-/which-3.0.1.tgz#89f1cd0c23f629a8105ffe69b8172791c87b4be1" + integrity sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg== + dependencies: + isexe "^2.0.0" + wide-align@^1.1.2, wide-align@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" @@ -19694,9 +17420,9 @@ widest-line@^3.1.0: string-width "^4.0.0" wildcard@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" - integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== + version "2.0.1" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" + integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== word-wrap@^1.2.3, word-wrap@~1.2.3: version "1.2.3" @@ -19708,19 +17434,14 @@ wordwrap@^1.0.0: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== -worker-farm@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" - integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== - dependencies: - errno "~0.1.7" - -worker-rpc@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/worker-rpc/-/worker-rpc-0.1.1.tgz#cb565bd6d7071a8f16660686051e969ad32f54d5" - integrity sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg== +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: - microevent.ts "~0.1.1" + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" wrap-ansi@^2.0.0: version "2.1.0" @@ -19738,31 +17459,30 @@ wrap-ansi@^3.0.1: string-width "^2.1.1" strip-ansi "^4.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -write-file-atomic@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" - integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== +write-file-atomic@^2.3.0: + version "2.4.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" + integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== dependencies: + graceful-fs "^4.1.11" imurmurhash "^0.1.4" - is-typedarray "^1.0.0" signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" -write-file-atomic@^4.0.1: +write-file-atomic@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== @@ -19777,22 +17497,22 @@ write@1.0.3: dependencies: mkdirp "^0.5.1" -ws@^8.2.3, ws@^8.4.2: - version "8.8.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.8.0.tgz#8e71c75e2f6348dbf8d78005107297056cb77769" - integrity sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ== +ws@^6.1.0: + version "6.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" + integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw== + dependencies: + async-limiter "~1.0.0" -x-default-browser@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/x-default-browser/-/x-default-browser-0.4.0.tgz#70cf0da85da7c0ab5cb0f15a897f2322a6bdd481" - integrity sha512-7LKo7RtWfoFN/rHx1UELv/2zHGMx8MkZKDq1xENmOCTkfIqZJ0zZ26NEJX8czhnPXVcqS0ARjjfJB+eJ0/5Cvw== - optionalDependencies: - default-browser-id "^1.0.4" +ws@^8.11.0, ws@^8.13.0, ws@^8.2.3, ws@^8.4.2: + version "8.13.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" + integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== -xliff-simple-merge@~0.12.4: - version "0.12.4" - resolved "https://registry.yarnpkg.com/xliff-simple-merge/-/xliff-simple-merge-0.12.4.tgz#d3e712c71bec4344558b11a5e2578915cee943ec" - integrity sha512-Rk88D62XUoMgyBLEILpgOx3ARnxONLwH/xz+/c1HsRHYPHDnuZhYORkwrBCXsE942esG+J+OUCCOiydXJxY4Ug== +xliff-simple-merge@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/xliff-simple-merge/-/xliff-simple-merge-1.0.2.tgz#55f88a84630de625db2b3ddfc3d0d741ac940bfd" + integrity sha512-9Dtw/l91o0DeLkNFJrlh5nxJSS8OD+IHeq5rjA6hkVtv6SWf7rJyr4YNSQc/6opDssRI8JgAWcQlj2ZfcvW11Q== dependencies: commander "~8.3.0" js-levenshtein "~1.1.6" @@ -19803,10 +17523,10 @@ xml-name-validator@^4.0.0: resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== -xml_normalize@~0.8.4: - version "0.8.4" - resolved "https://registry.yarnpkg.com/xml_normalize/-/xml_normalize-0.8.4.tgz#589c88a0c3f0fe7e89c94ae14b82de02ebfc1f2c" - integrity sha512-I+PiD+W/fS7YOWb4THhQfvkzd1mCuTT3KoRt4PTxiWYbH1RY74w5ewcIas8ja9APC8Ho2izg8VcNnTTN35qM9A== +xml_normalize@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/xml_normalize/-/xml_normalize-1.0.0.tgz#e844d8abae27b64fcb4eb0d567ecff278e0b166c" + integrity sha512-VzDbw9DW849WoLor6CP1eIPiVWwbq8CV3dlSrfVfsMqBqvp3VVkmLxA8J55WyLf6CnAf2sV29TQO77BKM/cxBw== dependencies: commander "~7.1.0" xmldoc "~1.1.2" @@ -19823,12 +17543,12 @@ xmldoc@~1.1.2: dependencies: sax "^1.2.4" -xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: +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", y18n@^4.0.0: +"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== @@ -19838,14 +17558,16 @@ y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== -yahoo-finance2@2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/yahoo-finance2/-/yahoo-finance2-2.3.6.tgz#4ba27d33385f5520752e96da3cf4df93ad26ce7a" - integrity sha512-qE4Nu4DY4XSAL+RzYXSaWFQBIYyBbMDaND1VoMGnmekWBGS8+/3GxfajXrzEfxxwFvT4tM/1i4G64OVxKE0EMA== +yahoo-finance2@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/yahoo-finance2/-/yahoo-finance2-2.4.1.tgz#2ccd422e33228fc34d42e919b0d2fdd8d3f76bbf" + integrity sha512-jl5oHr25RC24nOmoIiDqjnc/Iiy3MZAB+dIPCyUR+o5uz72xHfTZDM9tPeheggmlAGV+KftPP6smZ6L6lNgkSQ== dependencies: + "@types/tough-cookie" "^4.0.2" ajv "8.10.0" ajv-formats "2.1.1" node-fetch "^2.6.1" + tough-cookie "^4.1.2" yallist@^3.0.2: version "3.1.1" @@ -19862,12 +17584,7 @@ yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== -yargs-parser@21.0.1, yargs-parser@^21.0.0: - version "21.0.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.1.tgz#0267f286c877a4f0f728fceb6f8a3e4cb95c6e35" - integrity sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg== - -yargs-parser@>=21.0.1, yargs-parser@^21.0.1: +yargs-parser@21.1.1, yargs-parser@>=21.1.1, yargs-parser@^21.0.1, yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== @@ -19880,23 +17597,18 @@ yargs-parser@^11.1.1: 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.5.1, yargs@^17.2.1, yargs@^17.3.1, yargs@^17.4.0: - version "17.5.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.5.1.tgz#e109900cab6fcb7fd44b1d8249166feb0b36e58e" - integrity sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA== +yargs@17.6.2: + version "17.6.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.6.2.tgz#2e23f2944e976339a1ee00f18c77fedee8332541" + integrity sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw== dependencies: - cliui "^7.0.2" + cliui "^8.0.1" escalade "^3.1.1" get-caller-file "^2.0.5" require-directory "^2.1.1" string-width "^4.2.3" y18n "^5.0.5" - yargs-parser "^21.0.0" + yargs-parser "^21.1.1" yargs@^12.0.5: version "12.0.5" @@ -19916,18 +17628,18 @@ yargs@^12.0.5: y18n "^3.2.1 || ^4.0.0" yargs-parser "^11.1.1" -yargs@^16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== +yargs@^17.2.1, yargs@^17.3.1, yargs@^17.6.2: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== dependencies: - cliui "^7.0.2" + cliui "^8.0.1" escalade "^3.1.1" get-caller-file "^2.0.5" require-directory "^2.1.1" - string-width "^4.2.0" + string-width "^4.2.3" y18n "^5.0.5" - yargs-parser "^20.2.2" + yargs-parser "^21.1.1" yauzl@^2.10.0: version "2.10.0" @@ -19947,10 +17659,10 @@ yocto-queue@^0.1.0: resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== -zone.js@0.11.8: - version "0.11.8" - resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.11.8.tgz#40dea9adc1ad007b5effb2bfed17f350f1f46a21" - integrity sha512-82bctBg2hKcEJ21humWIkXRlLBBmrc3nN7DFh5LGGhcyycO2S7FN8NmdvlcKaGFDNVL4/9kFLmwmInTavdJERA== +zone.js@0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.12.0.tgz#a4a6e5fab6d34bd37d89c77e89ac2e6f4a3d2c30" + integrity sha512-XtC+I5dXU14HrzidAKBNMqneIVUykLEAA1x+v4KVrd6AUPWlwYORF8KgsVqvgdHiKZ4BkxxjvYi/ksEixTPR0Q== dependencies: tslib "^2.3.0" @@ -19958,8 +17670,3 @@ zone.js@~0.10.3: version "0.10.3" resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.10.3.tgz#3e5e4da03c607c9dcd92e37dd35687a14a140c16" integrity sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg== - -zwitch@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" - integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==